0

工作中的某个人准备挑战创建一个脚本,使用 PHP 以尽可能少的点赞数打印 FizzBu​​zz 游戏

挑战

编写一个程序,打印从 1 到 100 的数字。但是对于三的倍数打印“Fizz”而不是数字,对于五的倍数打印“Buzz”。对于同时是三和五的倍数的数字,打印“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+,您也可以使用快捷方式三元:

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 回答