Вы когда-нибудь хотели спросить компилятор "Почему?" Большинство из нас были разочарованы, когда код не работает должным образом. Поэтому Mathworks реализовал небольшую функцию why
, которая отвечает на вопрос. Чтобы привести несколько примеров из MATLAB:
why
The programmer suggested it.
why
To fool the tall good and smart system manager.
why(2)
You insisted on it.
why(46)
Bill insisted on it.
Ваша задача - реализовать why
функцию на вашем языке. Функция должна работать как с входным аргументом, так и без него (в качестве альтернативы используйте ввод 0
или -1
). Функция должна быть названа why
(или запись why(n)
в STDIN должна привести к печати соответствующей строки).
Если аргумент не указан или аргумент нулевой или отрицательный, выходная строка должна быть случайной, допустимой фразой. Таким образом, должна быть функция why
, why()
, why(0)
или why(-1)
что возвращает случайное предложение.
Если n
задан входной аргумент (аргумент функции, а не STDIN), вывод должен быть n-й строкой (определенной ниже). Поэтому why(1)
всегда следует выводить (распечатывать / отображать) один и тот же результат.
Предложения построены следующим образом (Тип 1, Тип 2 и Специальный). Все предложения заканчиваются на !
.
"Person" "ending" !
"Verb" "adjective" "Person" !
A list of special cases
Список лиц:
Stewie
Peter
Homer
The programmer
The system manager
You
Список окончаний:
suggested it
insisted on it
did it
Список глаголов:
To fool
To satisfy
To please
Список прилагательных:
the smart
the bald
the tall
the rich
the stupid
Список особых случаев:
How should I know?
Stop asking!
Don't ask!
Способ выбрать пронумерованный:
Тип предложений:
Odd number => Type 1
Even number => Type 2
n % 7 = 0 => Type 3 (% is the modulus operator)
Имена: n-е имя определяется с помощью модуля (%).
n = 1: 1 % 7 => Stewie
n = 2: 2 % 7 => Peter
...
n = 6: 6 % 7 => You
n = 7: 7 % 7 => How should I know?
n = 11: 11 % 7 => The programmer
n = 14: 14 % 7 => Stop asking!
n = 21: 21 % 7 => Don't ask!
Окончания: n-е окончание также определяется с помощью модуля. Предположим, что окончания (1, 2 и 3) перечислены как (1 2 2 3)
. Поскольку числа всегда нечетные, используйте((n+1)/2 % 4)
n = 1: ((1+1)/2 % 4) => suggested it
n = 3: ((3+1)/2 % 4) => insisted on it
n = 13: ((13+1)/2 % 4) => did it
Прилагательные: n-е прилагательное определяется с помощью модуля. Поскольку числа всегда четные, используйте:(n % 10)/2
n = 2: (2 % 10)/2 => Smart
n = 6: (6 % 10)/2 => The tall
...
Глаголы: n-й глагол также определяется с помощью модуля. Предположим, что глаголы (1, 2 и 3) перечислены так: (1 2 2 3)
числа всегда четные для глаголов, используйте(n % 8) / 2
n = 2: (2 % 8)/2 => To fool
n = 4: (4 % 8)/2 => To satisfy
n = 6: (6 % 8)/2 => To satisfy
n = 8: (8 % 8)/2 => To please
Теперь способ создания случайного должен быть довольно простым, просто выберите случайный n
.
Некоторые примеры:
why
You suggested it!
why
To fool the tall Homer!
why
Don't ask!
why(1)
Stewie suggested it!
why(14)
Stop asking!
why(8)
To please the rich Stewie!
Применяются стандартные правила игры в гольф. Победитель будет выбран через неделю со дня объявления конкурса.
why
или будетWHY
приемлемым?/2
работать Окончания . Это дает дробные значения.13
также должно бытьinsisted
(14/2 = 7% 4 = 3 = 2-й из настоящих).the rich The programmer
связи с указаннымthe
?The
иTo
ваши списки, вероятно, должны быть строчными, чтобы соответствовать вашим примерам ...Ответы:
JavaScript (ES6) 345
Не уверен насчет чисел, но вот моя попытка.
Попробуйте запустить приведенный ниже фрагмент в браузере, совместимом с EcmaScript.
источник
0
вместо разделителя строки,
!split(0)
такой же длиныsplit','
(представьте, что это кавычки)C #, 502 байта
В этом проекте необходимо, чтобы для AssemblyName было задано значение Why, в результате чего будет создан исполняемый файл с правильным именем.
Полностью в гольф:
Отступы и новые строки для ясности:
Пример ввода / вывода:
источник
Powershell
437461453 байтИзменить: пропущены дублированные глаголы
Расщепление между корпусом и вычислениями для подсчета байтов
to
,the
,it
и ,!
так как они имеют фиксированные места).Устанавливает аргумент по умолчанию 0, если не указан. Если аргумент равен,
<1
тогда он получает случайное число<99
fn:1
и перезапускается. Технически это средство-50
будет работать, как случайный случай.Объяснение:
fn:1
99 Выбран для сохранения байта. Если выше 99 возможных предложений (не рассчитано), увеличьте до 999 или 9999, в зависимости от обстоятельств (+1/2 байта)источник
MUMPS, 379 байт
Когда не вводится никаких данных, генерируется случайное число в 0..839.
Использование:
Стратегия оценки MUMPS слева направо экономит здесь несколько скобок.
Примечание: увидеть те строки, которые похожи
"foo^bar^baz^qux"
? Это так называемые «строки с разделителями», и они являются стандартным способом хранения списков, которые вписываются в ограничение максимального размера строки, поскольку MUMPS фактически не имеет списков / массивов (или, действительно, любых структур данных, кроме деревьев). Для списков, слишком больших для размещения в одной строке, мы вместо этого используем деревья глубиной 1 и помещаем значения в листья дерева. Весело!источник
why
функции. ;)Emacs Lisp 473 байта
Самыми большими «отходами», вероятно
format
, являются%s
... разделы. Если бы переменные могли быть встроены в строки без спецификации, это позволило бы сэкономить 10 байт%s
и еще 12 наformat
источник
Рубин
396378372 байтаЯ уверен, что это не игра в гольф по максимуму.
Изменить: я только что понял, что я не знаю приоритет оператора. Ну что ж..
источник
CJam, 281 байт
Постоянная ссылка
Раньше не использовал CJam, поэтому я возьму любые советы. Я уверен, что есть много хитростей, которые я не знаю!
(Я не мог понять, как назвать это как функцию, называемую «почему» - кажется, что функции не существуют в CJam - поэтому я не уверен, является ли ответ CJam нормальным или нет ...)
источник
Lua 5.3.0,
452460446 байтЭто моя первая попытка игры в гольф, поэтому, пожалуйста, поправьте меня, если я сделал что-то не так!
Ungolfed:
источник
Python (2), 692 байта
Я все еще учусь, поэтому, пожалуйста, будьте нежны! :)
Работает с или без int в качестве аргумента командной строки.
Я старался как можно больше подчеркнуть правильность кода, генерируя случайные числа из
-sys.maxint - 1
tosys.maxint
и отображая предложения в правильном случае.Код очень сильно зависит от операторов if, которые, я уверен, могут быть заменены чем-то более эффективным.
Обратная связь очень приветствуется!
Ungolfed (1341 байт)
источник
argument%8/2-1
и удалите второй. Вы также можете заменить==0
на<1
.