hiiragi's ブログ

主にコンピュータ関係の備忘録を書いてます

FizzBuzz

twitterで話題になってたので、各言語でジェネレータで実装。


JavaScript

function fizzbuzz_generator(n) {
 var i = 0;
 return function() {
  return ++i>n ? null : (i%3?'':'Fizz')+(i%5?'':'Buzz')||i;
 }
}

var f = fizzbuzz_generator(15);

for (var i = 0; i < 16; ++i)
 console.log( f() );


C#

using System;
using System.Collections.Generic;
 
public class Test
{
 public static IEnumerable<string> FizzBuzz(int n)
 {
  for (int i = 1; i <= n; ++i)
   yield return i%3==0 ? (i%5==0 ? "FizzBuzz" : "Fizz") : (i%5==0 ? "Buzz" : i.ToString());
  yield break;
 }
 
 public static void Main()
 {
  foreach (var i in FizzBuzz(15))
   Console.WriteLine( i );
 }
}

メソッドは全て大文字で始まるんだった。i.toString()とか書いてた。


Python

class FizzBuzz:
 def __init__(self, n):
  self.i = 1
  self.n = n
 
 def __iter__(self):
  return self
 
 def next(self):
  i = self.i
  n = self.n
  if i > n:
   raise StopIteration
  
  self.i += 1
  if i%3 == 0:
   if i%5 == 0:
    return 'FizzBuzz'
   else:
    return 'Fizz'
  elif i%5 == 0:
   return 'Buzz'
  else:
   return i

for i in FizzBuzz(15):
 print i

一発で実行できた。


PHP

<?php
class FizzBuzz implements Iterator {
 private $i_ = 1;
 private $n_ = 0;
 
 public function __construct($n) {
  $this->n_ = $n;
 }
 
 function rewind() { $this->i_ = 1; }
 
 function current()
 {
  $i = $this->i_;
  $x = ($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz');
  return $x ? $x : "${i}";
 }
 
 function key() { return $this->i_-1; }
 
 function next() { ++$this->i_; }
 
 function valid() {
  return $this->i_ <= $this->n_;
 }
}

$fb = new FizzBuzz(15);
foreach ($fb as $i) {
 echo "${i}\n";
}
?>

文字列の結合が「.」なのを忘れてて嵌った。文字列中の変数は${i}でも{$i}でも大丈夫(式は書けない)。
若干エラーメッセージが分かりづらい気が。
foreachは他の言語と違って、コレクションを先に書く。


HSP

 #module FizzBuzz n_, i_
  #modinit int n
   n_ = n
   i_ = 0
   return
  
  #modcfunc fb_moveNext
   if i_ >= n_ : return false
   i_++
   return true
  
  #modcfunc fb_current
   if i_ == 0 or i_ > n_ : return -1
   
   if i_ \ 3 == 0 {
    if i_ \ 5 == 0 {
     return "FizzBuzz"
    } else {
     return "Fizz"
    }
   } else:if i_ \ 5 == 0 {
    return "Buzz"
   }
   return i_
 #global
 
 newmod fb2, FizzBuzz, 15
 while fb_moveNext(fb2)
  mes fb_current(fb2)
 wend

剰余演算子が「\」なのを忘れてて嵌った。エラーメッセージが分かりづらい。