Mathematica, 72 65 61 байт
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
Для тестирования рекомендую заменить Print@@@
на ""<>#&/@
. Затем Mathematica отобразит усеченную форму, показывающую первые и последние несколько слов, вместо того, чтобы печатать 288 000 строк навсегда.
объяснение
Я наконец нашел применение для разделения строк. :)
Я был заинтригован возможностью добавления или умножения строк на некоторое время, но реальные варианты использования довольно ограничены. Суть в том, что что-то вроде "foo"+"bar"
или "foo"*"bar"
(и, следовательно, краткая форма "foo""bar"
) полностью верно в Mathematica. Тем не менее, он не знает, что делать со строками в арифметических выражениях, поэтому эти вещи остаются без оценки. Mathematica действительно применяет общеприменимые упрощения, хотя. В частности, строки будут отсортированы в каноническом порядке (который довольно запутан в Mathematica, как только вы начнете сортировать строки, содержащие буквы разных регистров, цифр и не букв), что часто является нарушителем, но здесь это не имеет значения , Кроме того, "abc""abc"
будет упрощено до"abc"^2
(что является проблемой, когда у вас есть повторяющиеся строки, но у нас их тоже нет), и что-то подобное "abc"/"abc"
фактически отменяет (что мы даже будем использовать).
Так что же мы пытаемся сделать здесь? Нам нужен список гласных и список согласных, чтобы мы могли использовать их Tuples
для генерации всех возможных комбинаций. Мой первый подход был наивным решением:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
Этот жестко запрограммированный список согласных немного повредит. Mathematica имеет Alphabet
встроенную функцию, которая позволила бы мне избежать этого, если бы я мог удалить гласные по дешевке. Это где это становится сложным, хотя. Самый простой способ удалить элементы Complement
, но он получается длиннее, используя одну из следующих опций:
{a=Complement[Alphabet[],b=Characters@"aeiouy"],b,a,b,a}
{a=Complement[x=Alphabet[],b=x[[{1,5,9,15,21,25}]]],b,a,b,a}
(Обратите внимание, что нам больше не нужно применять Characters
ко всему этому, потому что Alphabet[]
выдает список букв, а не строку.)
Итак, давайте попробуем этот арифметический бизнес. Если мы представляем весь алфавит как произведение букв вместо списка, то мы можем удалить буквы простым делением, благодаря правилу отмены. Это экономит много байтов, потому что нам не нужно Complement
. Кроме того, "a""e""i""o""u""y"
на самом деле байта короче, чем Characters@"aeiouy"
. Итак, мы делаем это с:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
Где мы храним согласные и гласные продукты в a
и b
, соответственно. Это работает путем написания функции, которая умножает все свои аргументы на ##
и делит их на произведение гласных. Эта функция применяется к списку алфавитов, который передает каждую букву в качестве отдельного аргумента.
Пока все хорошо, но теперь у нас есть
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
в качестве аргумента Tuples
, и эти вещи по-прежнему продукты, а не списки. Как правило, самый короткий способ исправить это поместить List@@@
на передний план, который снова превращает продукты в списки. К сожалению, добавление этих 7 байтов делает его длиннее, чем наивный подход.
Однако оказывается, что Tuples
наплевать на заголовки внутренних списков вообще. Если вы делаете
Tuples[{f[1, 2], f[3, 4]}]
(Да, для неопределенного f
.) Вы получите:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
Так же, как если бы вы использовали List
вместо f
. Таким образом, мы можем фактически передать эти продукты Tuples
и получить правильный результат. Это экономит 5 байтов по сравнению с наивным подходом, используя две жестко закодированные строки.
Теперь "a""e""i""o""u""y"
это все еще довольно раздражает. Но подождите, мы также можем сохранить здесь несколько байтов! Аргументами нашей функции являются отдельные буквы. Поэтому, если мы просто выберем правильные аргументы, мы сможем использовать их вместо строковых литералов, что короче для трех из них. Мы хотим , чтобы аргументы #
(сокращенно #1
) #5
, #9
, #15
, #21
и #25
. Если мы ставим #
в конце, то нам также не нужно добавлять что-либо, *
чтобы умножить их вместе, потому что (регулярное выражение) #\d+
является полным токеном, к которому не может быть добавлено ни одной цифры. Таким образом, мы получаем #5#9#15#21#25#
4 байта.