Skip to content

Instantly share code, notes, and snippets.

@SmetDenis
Created June 14, 2022 13:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SmetDenis/cd9459edd030403b774a29efb91ef94f to your computer and use it in GitHub Desktop.
Save SmetDenis/cd9459edd030403b774a29efb91ef94f to your computer and use it in GitHub Desktop.
<?php declare(strict_types=1);
/**
* Задача
* - Написать программу, которая выводит цифры от 1 - 50.
* - Условия: Если, цифру можно делить на 5, то программа должна вывести не цифру, а вывести слово "да".
* - Если можно цифру разделить на 7, то программа должна вывести не цифру, а вывести слово - "нет".
* - Если цифру можно делить на 5 и на 7, то программа должна вывести не цифру, а вывести слово - "данет".
*/
/**
* Заметки от кандидата:
*
* <режим-зануды>
* 1. По условиям задачи нужно написать программу, а не просто функцию.
* Поэтому мысленно представим, что это консольное приложение с возможным хардкодом внутри (числа 1 и 50).
* 2. Полагаю, что в тексте задачи правильно будет не "цифра", а "число".
* Иначе есть вероятность неправильно истолковать задачу и заниматься разбором литер.
* 3. Если нет цели менять начало и конц диапазона, то задача упрощается до ф-и fooBarFromRange,
* которая возвращает массив-константу. Т.к. нет смысла вычислять список снова и снова.
* </режим-зануды>
*
* 4. Да, задача простая и тупая. А я выпендривался везде и по чуть-чуть.
* Надеюсь вы проникнитесь явно еявным юмором в этом коде =) Но если думаете что это все перебор, то нам не по пути =)
* А я просто хотел сделать интересным фу-бар вместо скучного снипета.
*
* P.S. Это не отменает факта, что сказанное в комментариях имеет смысл.
*/
#### Code ##############################################################################################################
/**
* 1. Тело функции можно заменить на возвращение длинного массива (хардкода), если данные на входе никогда не меняются.
* - Нет смысла выполнять этот код снова и снова, чтобы получить одинаковый результат.
* Это чистая функция, со всеми вытекающими.
* - Для абстракции и места хранения содержательного комментария - функция останется, просто вернет готовый массив.
* По факту, комментарием будут условия задачи.
*
* 2. Если в будущем придется работать с длинным массивом данных, то
* range() стоит заменить на аналог с yield (генератор). Можно будет чуть-чуть оптимизировать на памяти.
*
* @param int $startRange
* @param int $endRange
* @return array
*/
function fooBarFromRange(int $startRange, int $endRange): array
{
return array_reduce(range($startRange, $endRange), static function ($acc, $number): array {
$appendValue = '';
if ($number % 5 === 0) {
$appendValue .= 'да';
}
if ($number % 7 === 0) {
$appendValue .= 'нет';
}
if (!$appendValue) {
// Приводим число к строке, чтобы на выходе получилась коллекция из одного типа переменных (строка).
$appendValue = (string)$number;
}
$acc[$number] = $appendValue; // Сохраняем целочисленный ключ для удобства "отладки".
return $acc;
}, []);
}
/**
* По сути, эта функция абстракция отвечает за вывод.
*
* @param string[] $outputList
* @return void
*/
function foobarPrinter(array $outputList): void
{
print_r($outputList); // Выводим как нам будет удобно, хоть построчно, хоть по диагонали, хоть в логи.
}
// Runtime
// 1. Если это именно программа, то лучше сделать это внешними опциями, типа `php ./foobar --start=1 --end=50` с дефолтными значениями.
// 2. С помощью комбинирования и композиции этих функций добиваемся гибкости под капотом итд. Типа фреймворк =)
foobarPrinter(fooBarFromRange(1, 50));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment