FizzBuzz
twitterで話題になってたので、各言語でジェネレータで実装。
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()とか書いてた。
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
剰余演算子が「\」なのを忘れてて嵌った。エラーメッセージが分かりづらい。