Ваша задача - написать программу, которая будет выводить читаемый список из каждых пяти буквенных слов со структурой:
согласный - гласный - согласный - гласный - согласный
Вывод должен быть отсортирован в алфавитном порядке по одному слову в строке, и слова не должны повторяться дважды. Это может быть строчная или прописная буква, но не смешанная. Таким образом, список может начинаться и заканчиваться так:
babab
babac
babad
...
zyzyw
zyzyx
zyzyz
Гласные - е - я - о - у - у , остальные 20 Английский-алфавит буквы согласные.
Слова не должны быть фактическими словарными словами.
Самый короткий код выигрывает.
Примечание: несколько лет назад я наткнулся на программу на веб-сайте университета, которая сделала именно это. Оказывается, мои имя и фамилия соответствуют ограничениям cvcvc, и я сам гуглил.
Ответы:
Mathematica,
726561 байтДля тестирования рекомендую заменить
Print@@@
на""<>#&/@
. Затем Mathematica отобразит усеченную форму, показывающую первые и последние несколько слов, вместо того, чтобы печатать 288 000 строк навсегда.объяснение
Я наконец нашел применение для разделения строк. :)
Я был заинтригован возможностью добавления или умножения строк на некоторое время, но реальные варианты использования довольно ограничены. Суть в том, что что-то вроде
"foo"+"bar"
или"foo"*"bar"
(и, следовательно, краткая форма"foo""bar"
) полностью верно в Mathematica. Тем не менее, он не знает, что делать со строками в арифметических выражениях, поэтому эти вещи остаются без оценки. Mathematica действительно применяет общеприменимые упрощения, хотя. В частности, строки будут отсортированы в каноническом порядке (который довольно запутан в Mathematica, как только вы начнете сортировать строки, содержащие буквы разных регистров, цифр и не букв), что часто является нарушителем, но здесь это не имеет значения , Кроме того,"abc""abc"
будет упрощено до"abc"^2
(что является проблемой, когда у вас есть повторяющиеся строки, но у нас их тоже нет), и что-то подобное"abc"/"abc"
фактически отменяет (что мы даже будем использовать).Так что же мы пытаемся сделать здесь? Нам нужен список гласных и список согласных, чтобы мы могли использовать их
Tuples
для генерации всех возможных комбинаций. Мой первый подход был наивным решением:Этот жестко запрограммированный список согласных немного повредит. Mathematica имеет
Alphabet
встроенную функцию, которая позволила бы мне избежать этого, если бы я мог удалить гласные по дешевке. Это где это становится сложным, хотя. Самый простой способ удалить элементыComplement
, но он получается длиннее, используя одну из следующих опций:(Обратите внимание, что нам больше не нужно применять
Characters
ко всему этому, потому чтоAlphabet[]
выдает список букв, а не строку.)Итак, давайте попробуем этот арифметический бизнес. Если мы представляем весь алфавит как произведение букв вместо списка, то мы можем удалить буквы простым делением, благодаря правилу отмены. Это экономит много байтов, потому что нам не нужно
Complement
. Кроме того,"a""e""i""o""u""y"
на самом деле байта короче, чемCharacters@"aeiouy"
. Итак, мы делаем это с:Где мы храним согласные и гласные продукты в
a
иb
, соответственно. Это работает путем написания функции, которая умножает все свои аргументы на##
и делит их на произведение гласных. Эта функция применяется к списку алфавитов, который передает каждую букву в качестве отдельного аргумента.Пока все хорошо, но теперь у нас есть
в качестве аргумента
Tuples
, и эти вещи по-прежнему продукты, а не списки. Как правило, самый короткий способ исправить это поместитьList@@@
на передний план, который снова превращает продукты в списки. К сожалению, добавление этих 7 байтов делает его длиннее, чем наивный подход.Однако оказывается, что
Tuples
наплевать на заголовки внутренних списков вообще. Если вы делаете(Да, для неопределенного
f
.) Вы получите:Так же, как если бы вы использовали
List
вместоf
. Таким образом, мы можем фактически передать эти продуктыTuples
и получить правильный результат. Это экономит 5 байтов по сравнению с наивным подходом, используя две жестко закодированные строки.Теперь
"a""e""i""o""u""y"
это все еще довольно раздражает. Но подождите, мы также можем сохранить здесь несколько байтов! Аргументами нашей функции являются отдельные буквы. Поэтому, если мы просто выберем правильные аргументы, мы сможем использовать их вместо строковых литералов, что короче для трех из них. Мы хотим , чтобы аргументы#
(сокращенно#1
)#5
,#9
,#15
,#21
и#25
. Если мы ставим#
в конце, то нам также не нужно добавлять что-либо,*
чтобы умножить их вместе, потому что (регулярное выражение)#\d+
является полным токеном, к которому не может быть добавлено ни одной цифры. Таким образом, мы получаем#5#9#15#21#25#
4 байта.источник
Tuples
уловкой. Это совершенно недокументировано, верно? И неожиданно, учитывая, как формаTuples[list,n]
с двумя входами имеет дело сlist
отсутствиемList
головы (по крайней мере для меня)!List
. Заголовок на каждом уровне в массивах, созданных с помощью,Tuples
будет таким же, как заголовок списка .Tuples[f[{1,2}, {3,4}]]
дает{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}
вместо. Не задокументировано, что внутренняя голова полностью игнорируется.Perl, 47 байт
Считая Шебанг как один.
Попробуйте онлайн!
источник
say
?-M5.01
должно быть «бесплатно».-M5.010
. И интересную роль в игре в гольф нельзя заменитьprint
наsay
...-E
(и впоследствииsay
) халявой?Python 3 - 110 байт
Простое веселье зацикливания :)
источник
Рубин,
72 7152 байтаСпасибо Value Ink за основную идею, которая снизила его до 60 байт.
источник
grep
. Если вы генерируете диапазон, в котором используются строчные буквы, вы получаете последовательность только строчных слов.puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/
для 60 байтов05AB1E ,
1816 байт05AB1E использует кодировку CP-1252 .
объяснение
В целях тестирования я рекомендую заменить
žP
несколько согласных иžO
несколько гласных.Пример использования 5 согласных и 3 гласных
источник
Python 2 ,
12010294 байтаПопробуйте онлайн!
источник
Чистый Баш, 74
Прямое расширение скобки.
Попробуйте онлайн .
Если каждый элемент должен быть в отдельной строке, то мы имеем:
Чистый Баш, 84
источник
PHP
88868480 байткрасивое приращение строки :)
6 байт, сохраненные @Christoph
перебирает все строки из
bababa
tozyzyz
и проверяет, соответствуют ли они шаблону. Беги с-nr
.источник
$a="001";$a++;
один прекрасный день. Это было очень неудобное изменение.for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";
спасает вас 1 символ К сожалению, вы должны изменить эхо для печати, чтобы использовать&&
. Замена\n
с реальным разрывом строки спасает другого."#([^$v][$v]){2}[^$v]#"
но я не проверял это.([^$v][$v]){2}[^$v]
не работает в цикле, а[^$v]([$v][^$v]){2}
работает. Оба работают автономно (даже с переменной), хотя.MATL , 21 байт
Попробуйте онлайн! (но вывод усекается).
источник
11Y2'y'h2Y2yX~yyy&Z*
( Попробуйте онлайн! )vcvcv
шаблон,cvcvc
а не так, как требуется. Спасибо хоть!Python, 92 байта
Не могу позволить
itertools
выиграть. Итеративный на 1 байт длиннее в Python 2.источник
Haskell,
5451 байтmapM func list
строит все слова, беря возможные символы для индекса i из списка, возвращаемогоfunc (list!!i)
.Изменить: @xnor нашел 2 байта для сохранения и, глядя на его решение, я нашел еще один.
источник
mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]
сохраняет байт.mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]
илиmapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]
. Было бы неплохо не жестко кодировать гласные и согласные, ноmapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]
это не совсем так.cycle
из вашего первого варианта явной рекурсией экономит дополнительный байт.Брахилог , 18 байт
Попробуйте онлайн!
объяснение
источник
g
иb
, но, тестируя ее, это потому, чтоj
кажется, что отказывается принимать список строк в качестве входных данных?:ea
действительно, демонстрирует сильные стороны Prolog / Brachylog, и это шаг, который большинство других языков находят гораздо более сложным.g
иb
были необходимы.j
Кажется, что он содержит ошибки, и это связано еще раз с трудностью отличить список аргументов от всего списка. Я мог бы это исправить, хотя это еще раз усложнит реализацию. Я мог бы просто не исправить это и потратить свое время на исправление основной проблемы в новой версии Brachylog.JavaScript (ES6),
9190 байтПравки
for
выраженииобъяснение
Это определяет 5-глубокую рекурсивную функцию, которая использует четность своей глубины вызова, чтобы определить, повторять ли гласные или согласные. На каждой итерации он проверяет, выполнять ли рекурсию или печать, проверяя количество оставшихся рекурсий, и объединяет букву текущей итерации до конца строки из 5 символов, которая в настоящее время строится на глубину.
Альтернативное 89-байтовое решение, предполагающее кодировку ISO8859-1:
Альтернативное 96-байтовое решение, которое возвращает весь вывод в виде одной строки:
Беги на свой страх и риск. Для 91-байтового решения просто используйте,
f()
а для 97-байтовой альтернативы используйтеconsole.log(f())
.источник
f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)
использование стандартной формы, к сожалению, длиннее байта:function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}
все еще жду дня, когда генератор является самым коротким вариантом ...for...of
выражении, чтобы сохранить байтC
201199186184183169163 байтаДелаем это немного иначе, чем с помощью предыдущего основного метода подсчета:
Ungolfed:
И написано немного более обычным способом:
В основном, я есть счетчики, и ˙s массив строк , содержащих все символы , над которыми мы должны повторять, для каждого счетчика. Трик является внутренним во время цикла: он используется для увеличения счетчиков, начиная с самого правого одного. Если мы видим, что следующий символ, который мы должны отобразить, это конечный нулевой символ, мы перезапускаем счетчик на ноль, и «перенос» будет распространяться на следующий счетчик.
Спасибо Кристоф!
источник
char *c
Я думаю, что пространство не нужно.f(){char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[]={0,0,0,0,0},*s[]={c,v,c,v,c},j=0;while(j>=0){for(j=0;j<5;++j)putchar(s[j][i[j]]);for(;--j>=0&&!s[j][++i[j]];)i[j]=0;puts("");}}
приводит тебя к 177. Давай ты можешь сделать еще лучше;).i[5]={0}
вместоi[]={0,0,0,0,0}
сохранения 7 байтов.Perl, 71 байт
Попробуйте онлайн!
объяснение
Я добавлю больше объяснений позже.
map{push@{1+/[aeiouy]/},$_}a..z;
создает два массива:@1
содержит согласные и@2
содержит гласные.glob
Когда call с аргументами like{a,b}{c,d}
возвращает все перестановки элементов в фигурных скобках.источник
Befunge, 95 байт
Попробуйте онлайн! , хотя учтите, что вывод будет обрезан.
Это просто цикл в диапазоне от 0 до 287999, выводящий индекс в виде смешанного числа 20-6-20-6-20 с "цифрами" числа, извлеченного из таблиц в последних двух строках.
источник
Perl 6 , 70 байт
Объяснение интересной части:
Код до этого просто генерирует список гласных (
$_
) и список согласных (c
), что, к сожалению, многословно.источник
Python 2 ,
120117 байтСпасибо @WheatWizard за подсказку вкладок.
Попробуйте онлайн!
Не уверен, что в этом можно много играть в гольф. Попробуйте онлайн-усечения на 128 КБ, но показывает достаточно, чтобы дать идею. Локальный прогон с кодом отладки для подсчета слов дал в общей сложности 288000. Запускается примерно за 45 секунд, если кто-то хочет проверить.
Несоответствующая и, следовательно, не конкурирующая версия (распечатывает вложенные массивы вместо указанного формата) для 110 байтов:
источник
Perl 6, 53 байта
Требуется немного времени, чтобы получить какой-либо вывод. Очень неэффективно. Делает работу.
источник
xeger , 49 байт
Учитывая регулярное выражение, xeger просто генерирует все совпадающие строки. Чтобы не убивать браузер, он приостанавливает каждые 1000 выходов, и вам нужно нажать, чтобы продолжить, но в конечном итоге он будет достигнут.
Вот 23-байтовая версия с исправленной ошибкой
^
:Это классы символов «все нижние регистры ASCII согласных»
[:c]
сy
исключенными^y
и «все строчные гласные ASCII»[:v:]
сy
добавленными.источник
&
.[bcdfghj-np-tvwxz]
.JavaScript (Firefox 30-57), 82 байта
Возвращает массив строк. Очень быстрая версия для
102101 (1 байт благодаря @ETHproductions) байтов:источник
CJam ,
32312928 байтСохранено 2 байта благодаря Мартину Эндеру и 1 байт благодаря Каине
Попробуйте онлайн! (Обратите внимание, что вывод обрезается на TIO)
объяснение
источник
'{,97>
чтобы получить алфавит. А затем"aeiouy"_'{,97>^
сохранить еще один байт1$
.С накоплением, неконкурентный, 51 байт
Довольно просто Попробуй это здесь!
источник
Perl,
635954 байтаПопробовать Perl Golf для разнообразия.
РЕДАКТИРОВАТЬ: Похоже, я еще многому научиться ... :)
источник
/$b[^$a]/&&say for"a"x5.."z"x5
чтобы сохранить несколько байтов. Редактировать: и вы можете оставить$b
и сделать$a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5
.aeiouy
. Кроме того, так как ваше регулярное выражение проверяет на 5 символов, вы можете сделатьa.."z"x5
.$a
и в$b
качестве имен переменных, потому что их не нужно объявлять даже в строгом режиме ... :) Я также часто использую Perl 6, в котором даже нет строгого режима.Scala,
8786 байтисточник
f"$c$d$e$f$g"
на,""+c+d+e+f+g
чтобы сохранить байт.R
143132 байтаЭто мой первый опыт в код-гольфе, так что я буду рад любым предложениям по дальнейшему его сокращению. Пока что все это довольно стандартный R; единственное, что может быть сложным, это то, что paste0 повторяет свои аргументы до длины самого длинного.
Изменить: использовать трюк с назначением из rturnbull, заменен
sapply(x,length)
наlengths
.источник
R
11198 байтy
Благодаря @Patrick B. добавлен в качестве гласного и содержит 13 байт.Мы используем
expand.grid
для генерации всех возможных комбинацийV
иC
в матрице, которую мы определяем из предустановленной переменнойletters
(алфавит). Мы инвертируем комбинации (поскольку по умолчанию первая переменная вращается быстрее всего), чтобы обеспечить алфавитный порядок. Затем мы перебираем каждую строку матрицы, печатая каждую букву в стандартный вывод. Мы используемfill
аргумент,cat
чтобы каждое слово начиналось с новой строки.источник
Clojure, 101 байт
Не так захватывающе ...
источник
Рубин,
6561 байтСовершенно другой подход:
Новое, что я узнал сегодня: функция продукта Array #
источник
C 361 байт
Безголовая версия:
Там должен быть какой-то способ, чтобы сократить это определенно.
объяснение
источник