grinyam

FizzBuzz

Sep 19th, 2018
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.78 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем,
  4.  * программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово
  5.  * «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»
  6.  */
  7. /**
  8.  * Генерирует исключения
  9.  */
  10. class FizzBuzzException extends Exception
  11. {
  12.    
  13. }
  14. /**
  15.  * Генерирует ответ для задачи
  16.  */
  17. class FizzBuzz
  18. {
  19.     private $numberCycles;
  20.     private $firstWord;
  21.     private $secondWord;
  22.     private $firstWordTrigger;
  23.     private $secondWordTrigger;
  24.     /**
  25.      * Конструктор FizzBuzz
  26.      * @param int $numberCycles количество итераций
  27.      * @param string $firstWord первое слово
  28.      * @param string $secondWord второе слово
  29.      * @param int $firstWordTrigger номер итерации для вывода первого слова
  30.      * @param int $secondWordTrigger номер итерации для вывода второго слова
  31.      */
  32.     function __construct(int $numberCycles, string $firstWord, string $secondWord, int $firstWordTrigger, int $secondWordTrigger)
  33.     {
  34.         if ($numberCycles <= 0) {
  35.             throw new FizzBuzzException("Количество итераций не может быть меньше либо равно нулю");
  36.         } else {
  37.             $this->numberCycles = $numberCycles;
  38.         }
  39.         if ($firstWordTrigger <= 0 || $secondWordTrigger <= 0) {
  40.             throw new FizzBuzzException("Кратность число не должна быть меньше нуля");
  41.         } elseif ($firstWordTrigger > $numberCycles || $secondWordTrigger > $numberCycles) {
  42.             throw new FizzBuzzException("Кратность не должна быть больше количества итераций");
  43.         } else {
  44.             $this->firstWordTrigger = $firstWordTrigger;
  45.             $this->secondWordTrigger = $secondWordTrigger;
  46.         }
  47.         $this->firstWord = $firstWord;
  48.         $this->secondWord = $secondWord;
  49.     }
  50.     /**
  51.      * Запускает цикл
  52.      * @return array - массив с результатам выполнения цикла
  53.      */
  54.     public function getCycleResult()
  55.     {
  56.         $cycleArray = array();
  57.         // к $numberCycles прибавляется единица, чтобы было ровно 100 итераций, а не 99
  58.         // $index = 1 чтобы отсчет начинался с 1, а не нуля
  59.         for ($index = 1; $index < ($this->numberCycles + 1); $index++) {
  60.             if ($index % $this->firstWordTrigger === 0 && $index % $this->secondWordTrigger === 0) {
  61.                 $cycleArray[] = $this->firstWord . $this->secondWord;
  62.             } elseif ($index % $this->firstWordTrigger === 0) {
  63.                 $cycleArray[] = $this->firstWord;
  64.             } elseif ($index % $this->secondWordTrigger === 0) {
  65.                 $cycleArray[] = $this->secondWord;
  66.             } else {
  67.                 $cycleArray[] = $index;
  68.             }
  69.         }
  70.         return $cycleArray;
  71.     }
  72. }
  73. /**
  74.  * Представление FizzBuzz
  75.  */
  76. class ViewFizzBuzz
  77. {
  78.     /**
  79.      * Выводит на экран по строкам содержимое полученного массива
  80.      * @param FizzBuzz $FizzBuzz
  81.      * @throws FizzBuzzException
  82.      */
  83.     public static function printFizzBuzz(FizzBuzz $FizzBuzz)
  84.     {
  85.         // если скрипт запущен в командной строке, то концом строки будет символ
  86.         // соответствующий платформе
  87.         if (php_sapi_name() === 'cli') {
  88.             $lineBreakHTML = PHP_EOL;
  89.         } else {
  90.             $lineBreakHTML = '<br>';
  91.         }
  92.         $cycleArray = $FizzBuzz->getCycleResult();
  93.         if (empty($cycleArray)) {
  94.             throw new FizzBuzzException("Не смог получить информацию для отображения");
  95.         }
  96.         // $count = 1 потому что отсчет начинается не с нуля
  97.         $count = 1;
  98.         foreach ($cycleArray as $cycleString) {
  99.             echo $count . ': ' . $cycleString . $lineBreakHTML;
  100.             $count++;
  101.         }
  102.     }
  103.     public static function printFizzBuzzCliHelp()
  104.     {
  105.         echo 'Скрипту необходимо передать 4 аргумента:' . PHP_EOL .
  106.         'int $numberCycles количество итераций' . PHP_EOL .
  107.         'string $firstWord первое слово' . PHP_EOL .
  108.         'string $secondWord второе слово' . PHP_EOL .
  109.         'int $firstWordTrigger номер итерации для вывода первого слова' . PHP_EOL .
  110.         'int $secondWordTrigger номер итерации для вывода второго слова' . PHP_EOL;
  111.     }
  112. }
  113. // если скрипт запускается из командной строки, то оттуда же берутся аргументы
  114. if (!empty($argv)) {
  115.     if ($argc === 1 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
  116.         ViewFizzBuzz::printFizzBuzzCliHelp();
  117.         exit();
  118.     }
  119.     if ($argc === 6) {
  120.         $fizzbuzz = new FizzBuzz($argv[1], $argv[2], $argv[3], $argv[4], $argv[5]);
  121.     } else {
  122.         throw new FizzBuzzException("Аргументов должно быть не меньше пяти");
  123.     }
  124. } else {
  125.     // если скрипт запускается откуда-то еще
  126.     $fizzbuzz = new FizzBuzz(100, 'Fizz', 'Buzz', 3, 5);
  127. }
  128. ViewFizzBuzz::printFizzBuzz($fizzbuzz);
Advertisement
Add Comment
Please, Sign In to add comment