お題
FizzBuzz
PHPの場合
fizzBuzz.php
<?php
$fcontents = fopen($argv[1], 'r');
function judgeFizzBuzz($n, $fizz, $buzz)
{
if ($fizz($n) && $buzz($n)) {
return 'FB ';
} elseif ($fizz($n)) {
return 'F ';
} elseif ($buzz($n)) {
return 'B ';
} else {
return $n . ' ';
}
}
function FizzBuzz($fst_int, $sec_int, $times)
{
# conditions
$fizz = function($n) use ($fst_int) { return ($n % $fst_int === 0); };
$buzz = function($n) use ($sec_int) { return ($n % $sec_int === 0); };
$result = '';
for ($i = 1; $i <= $times; $i++) {
$result .= judgeFizzBuzz($i, $fizz, $buzz);
}
return $result;
}
while ( ($input_lines = fgets($fcontents)) ) {
list($fst_int, $sec_int, $times) = explode(' ', trim($input_lines));
echo FizzBuzz($fst_int, $sec_int, $times) . PHP_EOL;
}
もう少しスマートに書けそう…
変に\$fizz, $buzzと書いてしまってるのが冗長かも?
Rubyの場合
fizz_buzz.rb
def judge_fizzbuzz(f, b, num)
return 'FB' if (num % f).zero? && (num % b).zero?
return 'F' if (num % f).zero?
return 'B' if (num % b).zero?
num.to_s
end
ARGF.each_line do |line|
f, b, times = line.split.map {|n| n.to_i}
result = []
(1..times).each do |num|
result << judge_fizzbuzz(f, b, num)
end
puts result.join(' ')
end
手探りだけど、短く書ける!
追記
破壊的操作してる! よくない!
破壊してる
(1..times).each do |num|
result << judge_fizzbuzz(f, b, num)
end
String#<<が破壊的操作してます。
破壊的操作は良くない!
参考にさせて頂いたページ
FizzBuzzで始めるRuby
http://ore-public.github.io/2013/11/02/fizzbuzzruby/
感想
- Rubyは後置ifがよかった
- Rubyはメソッドつないで処理していくのがいい感じ
- ;が必要ないので、小指に優しかった
- キャメルケースの方が読みやすい
というわけで、いろんな言語に触って色々書いてみよう!