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

运行效果图如下:

aaarticlea/png;base64,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" alt="" />

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

上一篇:【eclipse插件开发实战】Eclipse插件开发7——插件发布jar包


下一篇:CGI,FastCGI,PHP-CGI与PHP-FPM(转)