fizzbuzz問題をなるべく冗長に解いてみた
fizzbuzzの話が何年か前に流行した時には、1linerでかっこよくってのが中心だったような気がする。マイナーな言語で書くっていうのもあった。
ここでは、冗長な言語 PHPで、肥満コードwを書いてみた。
<?php class fizzbuzz extends ArrayObject { protected $_delimiter = "\n"; protected $_fizzbuzz = array(); public static function getInstance($start, $end, $step = 1) { $array = range((int) $start, (int) $end, (int) $step); return new self(array_combine($array, $array), ArrayObject::ARRAY_AS_PROPS); } public function output($raw = false) { array_map(array($this, 'printIt'), $raw ? $this->getArrayCopy() : $this->getFizzbuzzArray()); return $this; } public function getIterator($raw = false) { return $raw ? parent::getIterator() : new ArrayIterator($this->getFizzbuzzArray()); } public function printIt($data) { return print($this->templateIt($data)); } public function templateIt($data) { return $data . $this->_delimiter; } public function getFizzbuzzArray() { return array_combine(array_keys($this->getArrayCopy()), array_map(array($this, 'offsetGet'), array_keys($this->getArrayCopy()))); } public function apply(array $fizzbuzz, $clear = false) { $this->_fizzbuzz = $clear ? $fizzbuzz : array_merge($this->_fizzbuzz, $fizzbuzz); return $this; } public function fizzbuzzIt($fizzbuzzKey, $val) { return $val % $fizzbuzzKey == 0 ? $this->_fizzbuzz[$fizzbuzzKey]: ''; } public function offsetGet($index) { if (parent::offsetExists($index)) { $val = parent::offsetGet($index); $target = array_keys($this->_fizzbuzz); $string = implode('', array_map(array($this, 'fizzbuzzIt'), $target, array_fill(0, count($target), $val))); return empty($string) ? (string) $val : $string; } else { return null; } } public function __toString() { return implode($this->_delimiter, $this->getFizzbuzzArray()); } }
使い方
<?php fizzbuzz::getInstance(1, 100) -> apply(array(3=>'Fizz', 5 => 'Buzz'), true)->output();
<?php $ite = fizzbuzz::getInstance(1, 100) -> apply(array(3=>'Fizz', 5 => 'Buzz'), true)->getIterator(); while ($ite->valid()) { echo $ite->current() , "\n"; $ite->next(); }
<?php //特定の要素がほしいとき $fz = fizzbuzz::getInstance(1, 100) -> apply(array(3=>'Fizz', 5 => 'Buzz'), true); echo $fz[15];
<?php //配列を取得したいとき $fizzbuzzArray = fizzbuzz::getInstance(1,100) -> apply(array(3=>'Fizz', 5 => 'Buzz'), true)->getFizzbuzzArray();
<?php //オブジェクト指向っぽいアプローチ $fz = fizzbuzz::getInstance(1, 100); $fz->apply(array(3 =>'Fizz'), true); $fz->apply(array(5 => 'Buzz'), false); $fz->apply(array(2 => '偶数'), false); echo $fz[30];