0

職場の誰かが、PHP を使用して FizzBu​​zz ゲームをできるだけ少ないいいね数で出力するスクリプトを作成するという課題に取り組みました。

チャレンジ

1 から 100 までの数字を出力するプログラムを作成します。ただし、3 の倍数の場合は数字の代わりに「Fizz」と出力し、5 の倍数の場合は「Buzz」と出力します。3 と 5 の両方の倍数の場合は、「FizzBu​​zz」と出力します。

私の試み:

foreach(range(1,100) as $i) {
  $val = ($i % 3 == 0 ? "Fizz" : "").($i % 5 == 0 ? "Buzz" : "");
  echo (empty($val) ? $i : $val) .  '<br />';
}

誰かのパイソンの試み

[ ("Fizz" if not i % 3 else "") + ("Buzz" if not i % 5 else "") + ("Baz" if not i % 7 else "") if _ else "" for i in range(0, 100) ]

これを改善/改善する方法がわかりますか? それとももっとうまくやりますか?

御時間ありがとうございます

4

3 に答える 3

20

最も最適化されたバージョン:

echo "1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz\n";
于 2012-10-05T15:35:37.380 に答える
5

ワンサイズの最適化:

$val = ($i % 3 ? "" : "Fizz").($i % 5 ? "" : "Buzz");
              ^--- remove == 0       ^--- remove  == 0

PHP は、等値テストなしで、モジュロの結果を簡単にブール値に変換します。

そして同様に

echo (!$val ? $i : $val);

empty() テストは必要ありません。空の文字列はブール値の false として評価されます。

また、PHP 5.3 以降を使用している場合は、ショートカット 3 項も使用できます。

echo ($val ?: $i)
于 2012-10-05T15:25:50.530 に答える
2

foreach(range(1,100)as$i)echo(''==($x=($i%3==0?"Fizz":"").($i%5==0?"Buzz":""))?$i:$x).'<br />';

于 2012-10-05T15:29:28.717 に答える