ThoughtWorks FizzBuzzWhizz 代码实现

当时拉钩网ThoughtWorks出了一道面试题(https://www.jinshuju.net/f/EGQL3D),本人用PHP实现了一下,当时忘记了把代码分享出来,今天特来补上。

FizzBuzzWhizz 这到算法题的规则如下:

1,语言不限,Java, C#, Ruby, C++, Js, Python, Scala, objective-C统统可以,小语种也没问题,只要你擅长;

2,强烈建议写单元测试;

3,请展示出你超赞的面向对象/函数式编程功底;

4,建议尽量减少圈复杂度;

5,请提交可运行的代码,及相关构建脚本/说明文档(代码运行平台和环境);

 

FizzBuzzWhizz

你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:


1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3、5、7。
2. 让所有学生拍成一队,然后按顺序报数。

3. 学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz;如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz;如果所报数字是第三个特殊数(7)的倍数,那么要说Whizz。
4. 学生报数时,如果所报数字同时是两个特殊数的倍数情况下,也要特殊处理,比如第一个特殊数和第二个特殊数的倍数,那么不能说该数字,而是要说FizzBuzz, 以此类推。如果同时是三个特殊数的倍数,那么要说FizzBuzzWhizz。
5. 学 生报数时,如果所报数字包含了第一个特殊数,那么也不能说该数字,而是要说相应的单词,比如本例中第一个特殊数是3,那么要报13的同学应该说Fizz。 如果数字中包含了第一个特殊数,那么忽略规则3和规则4,比如要报35的同学只报Fizz,不报BuzzWhizz。
 
我实现这个这个需求用到了一下几个文件:
GameCfg.php 是这个算法用到的配置文件,在这里主要是定义一些常量之类的
Game.php 是这个算法实现的主体
TestGame.php 主要是测试这个算法的文件
README.txt 运行这个脚本的说明
 
GameCfg.php 代码如下:
<?php

/**
 *
 * atuhor cherry.chen
 * desc Gamm initial configuration parameters
 * date 2014/4/29
 *
 */
class GameCfg {
    const FIZZ = "Fizz";
    const BUZZ = "Buzz";
    const WHIZZ = "Whizz";
    const ZERO = 0;
    const ONE = 1;
    const TWO = 2;
    const NEWLINE="\n"; //<br/> running with console ,please modified "\n"
}

?>

Game.php 代码如下:

<?php

require_once (dirname(__FILE__) . "/../cfg/GameCfg.php");

/**
 * author cherry
 * desc Game Main Class
 * date 2014/4/29
 */
class Game {

    private $numbers = array();
    private $init_array_range = array();

    public function __construct($number_arrs, $init_array_range) {
        if (count($number_arrs) == 3) {
            $this->numbers = $number_arrs;
        }
        $this->init_array_range = $init_array_range;
    }

    /**
     * init data and call the doGame
     * @param <type> $init_array_range
     */
    public function startGame() {
        $init_array_range = $this->init_array_range;
        $numbers = $this->numbers;
        if (!empty($numbers)) {
            $count = count($init_array_range);
            for ($i = 0; $i < $count; $i++) {
                $this->doGame($numbers, $init_array_range[$i]);
            }
        }
    }

    /**
     * do Game form the pre-rules
     * @param <type> $i 
     */
    private function doGame($numbers, $i) {
        $str_contains = $this->numberContains($numbers, $i);
        if ($str_contains != null && $str_contains != "") {
            echo $str_contains . GameCfg::NEWLINE;
        } else {
            $msts = $this->numberMod($numbers, $i);
            if ($msts != "" && $msts != null) {
                echo $msts . GameCfg::NEWLINE;
            } else {
                echo $i . GameCfg::NEWLINE;
            }
        }
    }

    /**
     * Judge this number satisfy the rule 5 yes or not
     * @param <type> $numbers
     * @param <type> $i
     * @return <type>
     */
    private function numberContains($numbers, $i) {
        $ars = array();
        $intoarrays = $this->intToArray($i);
        $number_flag = $this->findFirstNumFlag($numbers, $intoarrays);
        if (in_array($numbers[GameCfg::ZERO], $intoarrays) && $number_flag) {
            array_push($ars, GameCfg::FIZZ);
        } else if (in_array($numbers[GameCfg::ONE], $intoarrays) && $number_flag) {
            if (count($ars) == 0) {
                array_push($ars, GameCfg::BUZZ);
            }
        } else if (in_array($numbers[GameCfg::TWO], $intoarrays) && $number_flag) {
            if (count($ars) == 0) {
                array_push($ars, GameCfg::WHIZZ);
            }
        }
        return implode("", $ars);
    }

    /**
     * Judge this number satisfy the rule 3,4 yes or not
     * @param <type> $numbers
     * @param <type> $i
     * @return <type>
     */
    private function numberMod($numbers, $i) {
        $ars = array();
        if ($i % $numbers[GameCfg::ZERO] == 0) {
            array_push($ars, GameCfg::FIZZ);
        }

        if ($i % $numbers[GameCfg::ONE] == 0) {
            array_push($ars, GameCfg::BUZZ);
        }

        if ($i % $numbers[GameCfg::TWO] == 0) {
            array_push($ars, GameCfg::WHIZZ);
        }
        return implode("", $ars);
    }

    private function intToArray($val) {
        $input_arrs = array();
        $val = $val . "";
        $len = strlen($val);

        for ($i = 0; $i < $len; $i++) {
            array_push($input_arrs, $val{$i});
        }
        return $input_arrs;
    }

    private function findFirstNumFlag($numbers, $intoarrays) {
        return in_array($numbers[GameCfg::ZERO], $intoarrays);
    }

}

?>

TestGame.php 代码如下:

<?php

require_once (dirname(__FILE__) . "/../code/Game.php");

$number_arrs = array(3, 5, 7);
$init_array_range = array();

for ($i = 0; $i < 100; $i++) {
    $init_array_range[$i] = $i + 1;
}

$game = new Game($number_arrs, $init_array_range);
$game->startGame();
?>

README.txt 说明如下:

1.Before runing this script ,please make sure you have installed PHP enviroment.
2.usage
    In Linux: if you decompress the package in the /var/www/html directory
              PHP installed path: /usr/local/php
              /usr/loca/php/bin/php /var/www/html/game/test/TestGame.php

    In Windows: if you decompress the package in the D:\demo directory
              PHP installed path: D:\programs\php
              D:\programs\php\bin\php D:\demo\game/test/TestGame.php

运行效果图如下:

完整代码可以到这里下载:http://url.cn/Nq9aJg

 

posted @ 2014-08-17 21:44  大胡子码农  阅读(476)  评论(1编辑  收藏  举报