PHP的FizzBuzz集合

用PHP编写最短的代码长度。

<?while($i++<100)echo[Fizz][$i%3].[Buzz][$i%5]?:$i,"
";

我用PHP写了FizzBuzz – A Day in Serenity (Reloaded) – PHP,FuelPHP,Linux或其他东西

循环递归调用

换句话说,不使用for、foreach、while等循环语法。

<?php

function fizzbuzz($i, $max = 100)
{
    if ($i % 15 === 0) {
        echo 'FizzBuzz', PHP_EOL;
    } elseif ($i % 3 === 0) {
        echo 'Fizz', PHP_EOL;
    } elseif ($i % 5 === 0) {
        echo 'Buzz', PHP_EOL;
    } else {
        echo $i, PHP_EOL;
    }

    if ($i < $max) {
        fizzbuzz($i + 1, $max);
    }
}

fizzbuzz(1);

函数

根据条件定义函数,并按照顺序进行转发的模式。

<?php
function fizz($i)
{
    return $i % 3 ? null : 'Fizz';
}

function buzz($i)
{
    return $i % 5 ? null : 'Buzz';
}

function fizzbuzz($i)
{
    return $i % 15 ? null : 'FizzBuzz';
}

for ($i = 1; $i <= 100; $i ++) {
    echo fizzbuzz($i) ?? fizz($i) ?? buzz($i) ?? $i, PHP_EOL;
}

在FizzBuzz游戏中,不使用条件分支(如if语句)的情况下。

只使用数组操作来实现的方法。

<?php
$fizz = array_fill_keys(range(0, 100, 3), 'Fizz');
// -> [0 => "Fizz", 3 => "Fizz", 6 => "Fizz", 9 => "Fizz", ...]
$buzz = array_fill_keys(range(0, 100, 5), 'Buzz');
// -> [0 => "Buzz", 5 => "Buzz", 10 => "Buzz", 15 => "Buzz", ...]
$fizzbuzz = array_fill_keys(range(0, 100, 15), 'FizzBuzz');
// -> [0 => "FizzBuzz", 15 => "FizzBuzz", 30 => "FizzBuzz", 45 => "FizzBuzz", ...]
$numbers = range(0, 100);
// -> [0 => 0, 1 => 1, 2 => 2, 3 => 3, ...]
$result = array_replace($numbers, $fizz, $buzz, $fizzbuzz);
// -> [0 => "FizzBuzz", 1 => 1, 2 => 2, 3 => "Fizz", ...]
unset($result[0]);
echo implode("\n", $result);

发电机

可以通过使用yield来实现。

<?php

function fizzbuzz($max = 100)
{
    for ($i = 1; $i <= $max; $i ++) {
        if ($i % 15 === 0) {
            yield 'FizzBuzz';
        } elseif ($i % 3 === 0) {
            yield 'Fizz';
        } elseif ($i % 5 === 0) {
            yield 'Buzz';
        } else {
            yield $i;
        }
    }
}

foreach (fizzbuzz() as $v) {
    echo $v, PHP_EOL;
}

责任链模式

使用责任链模式(Chain of Responsibility),将责任传递给能够处理输入的对象,直到达到负责处理的对象为止。根据面向对象的原则,当增加新的游戏规则(例如当数字能被7整除时返回“Hoge”)时,可以实现扩展性而无需修改现有的类实现。

<?php

abstract class Handler
{
    private $next;

    public function __construct(Handler $next)
    {
        $this->next = $next;
    }

    final public function handle(int $i): string
    {
        return $this->canHandle($i) ? $this->respond($i) : $this->next->handle($i);
    }

    abstract protected function canHandle(int $i): bool;
    abstract protected function respond(int $i): string;
}

class FizzHandler extends Handler
{
    protected function canHandle(int $i): bool
    {
        return $i % 3 === 0;
    }

    protected function respond(int $i): string
    {
        return 'Fizz';
    }
}

class BuzzHandler extends Handler
{
    protected function canHandle(int $i): bool
    {
        return $i % 5 === 0;
    }

    protected function respond(int $i): string
    {
        return 'Buzz';
    }
}

class FizzBuzzHandler extends Handler
{
    protected function canHandle(int $i): bool
    {
        return $i % 3 === 0 && $i % 5 === 0;
    }

    protected function respond(int $i): string
    {
        return 'FizzBuzz';
    }
}

class NumberHandler extends Handler
{
    public function __construct()
    {
    }

    protected function canHandle(int $i): bool
    {
        return true;
    }

    protected function respond(int $i): string
    {
        return $i;
    }
}

$fizzbuzz = new FizzBuzzHandler(new FizzHandler(new BuzzHandler(new NumberHandler)));
foreach (range(1, 100) as $i) {
    echo $fizzbuzz->handle($i), PHP_EOL;
}

FizzBuzz 网络接口

在实际工作中,有时为了实现某个需求,可能需要借助外部系统的力量。如果在FizzBuzz问题中也允许这样做的话,可能还有一种解决方案是使用返回FizzBuzz结果的端点。

<?php
echo file_get_contents("http://riaf.jp/f");

我在 PHP 中写了一个简短的 FizzBuzz – Qiita。

广告
将在 10 秒后关闭
bannerAds