LoginSignup
2
2

More than 5 years have passed since last update.

PHPerがFizzBuzzをRubyっぽく書く

Last updated at Posted at 2015-03-01

お題

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はメソッドつないで処理していくのがいい感じ
  • ;が必要ないので、小指に優しかった
  • キャメルケースの方が読みやすい

というわけで、いろんな言語に触って色々書いてみよう!

2
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2