Кожне слово від баби до зизизу


38

Ваше завдання - написати програму, яка виводить читабельний список кожні п'ять літер зі структурою:

приголосний - голосний - приголосний - голосний - приголосний

Вихід повинен бути відсортований в алфавітному порядку з одним словом на рядок і жодних слів, повторених двічі. Він може бути малим або великим, але не змішаним. Отже список може починатися і закінчуватися так:

babab  
babac  
babad  
...  
zyzyw  
zyzyx  
zyzyz 

Голосні - a - e - i - o - u - y , інші 20 букв англійського алфавіту - приголосні.
Слова не повинні бути власне словниковими словами.
Найкоротший код виграє.

Примітка. Кілька років тому я натрапив на програму на веб-сайті університету, яка саме так і зробила. Виявляється, моє ім’я та прізвище відповідають обмеженням cvcvc, і я гуглив себе.


7
Я бачу тут дві речі. По-перше, є смішна кількість подібних слів. Як ви очікуєте тестувати записи? Також існує безліч імен, які відповідають цьому обмеженням. Перше, що спадає на думку, - Яків , хоча такі, як Лукас, також підходять
TrojanByAccident

9
@TrojanByAccident Я вважаю, що виклик вимагає всіх можливих комбінацій букв, незалежно від того, чи це назви / англійські слова. "Слова не повинні бути власне словниковими словами."
трихоплакс

3
@wilks Відповідна мета-пост - Суворі формати вводу- виводу не оцінені в цій спільноті SE. Це завдання фокусується на генеруванні слів cvcvc, а не на вставці нових рядків між словами, ні?
JungHwan Min

1
@JungHwanMin Дякую за посилання, вперше тут я не знав про це. Я бачив це як читабельний і алфавітний список усіх слів cvcvc. Тож я погоджуюся, що верхній чи нижній регістр насправді не має значення, але я також вважаю, що одна дуже довга струна або, скажімо, деякі вкладені масиви, хоча технічно допустима не буде великою відповіддю.
ворушить

2
Запустивши кілька відповідей на це запитання, вони, очевидно, не відповідають "Вихід повинен бути поступовим з кожним словом у своєму рядку". Чи була ця вимога послаблена, і якщо так, чи можете ви редагувати питання, щоб це відобразити? Я вважаю, що міг би втратити досить багато байтів, якби моя відповідь не була обмежена форматом.
ElPedro

Відповіді:


28

Математика, 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 байти.


11
Читає пояснення. Отже ... в основному магія.
Tally

Я здивований і вражений вашою Tuplesхитрістю. Це повністю без документації, правда? І несподівано з огляду на те, як форма Tuples[list,n]з двома входами має справу з тим, що listне маю Listголови (мені щонайменше)!
А Сіммонс


1
@ngenisis Я вважаю, що формулювання дуже заплутане. Тому що незрозуміло, що це стосується зовнішнього списку при використанні декількох списків. Дійсно Tuples[f[{1,2}, {3,4}]]дає {f[1, 3], f[1, 4], f[2, 3], f[2, 4]}замість цього. Не документально підтверджено, що внутрішня голова повністю ігнорується.
Мартін Ендер

@ASimmons cc. ^
Мартін Ендер

16

Perl, 47 байт

#!perl -l
/((^|[aeiouy])[^aeiouy]){3}/&&print for a..1x5

Порахувавши шебанг як один.

Спробуйте в Інтернеті!


2
Це приємно, молодець! З яких-небудь причин ви не користуєтесь say?
Дада

Спасибі. Я не погоджуюся, що це -M5.01повинно бути "вільним".
прим

1
Мені подобається ваша думка щодо -M5.010. І межжала частина в гольф не замінити printз say...
Дада

Чи не -E(і згодом say) халява?
Заїд

@Zaid Дивіться перший коментар
Дада

11

Python 3 - 110 байт

a,b="bcdfghjklmnpqrstvwxz","aeiouy";print(*(c+d+e+f+g for c in a for d in b for e in a for f in b for g in a))

Прямо веселі петлі :)


Подумайте, наші ідеї однакові, але ви побили мене на 10 за допомогою Python 3!
ElPedro

Я збирався опублікувати еквівалент python2, використовуючи цей підхід. Занадто повільно, замість вас голосуйте.
Кріс Х

8

Рубі, 72 71 52 байт

puts (?z..?z*5).grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/

Завдяки Value Ink за основну ідею, яка знизила це до 60 байт.


1
Створити список 5-літерних слів і використовувати його коротше grep. Якщо ви генеруєте діапазон, який використовує рядки з малі регістри, ви отримуєте послідовність лише малих слів. puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/для 60 байт
чорнила значення

7

05AB1E , 18 16 байт

05AB1E використовує кодування CP-1252 .

žP3ãžO3ãâ€øJ€¨ê»

Пояснення

žP3ã                # push all combinations of 3 consonants
    žO3ã            # push all combinations of 3 vowels
        â           # cartesian product
         €ø         # zip each pair of [ccc,vvv] (c=consonant,v=vowel)
           J        # join to list of strings ['cvcvcv','cvcvcv' ...]
            ۬      # remove last vowel from each
              ê     # sort and remove duplicates
              »     # join on newlines

Для цілей тестування рекомендую замінити žPкількома приголосними та žOкількома голосними.

Приклад з використанням 5 приголосних і 3 голосних


приємне використання декартового продукту. Я б не думав про це.
Чарівний восьминога Урна


7

Чистий Баш, 74

v={a,e,i,o,u,y}
c={b,c,d,f,g,h,{j..n},{p..t},v,w,x,z}
eval echo $c$v$c$v$c

Пряме розширення брекетів.

Спробуйте в Інтернеті .


Якщо кожен елемент повинен бути у своєму рядку, ми маємо:

Чистий Баш, 84

v={a,e,i,o,u,y}
c={b,c,d,f,g,h,{j..n},{p..t},v,w,x,z}
eval printf '%s\\n' $c$v$c$v$c

7

PHP, 88 86 84 80 байт

Приріст досить рядка :)
6 байт збережено @Christoph

for($s=$v=aeiouy;++$s<zyzza;preg_match("#[^$v]([$v][^$v]){2}#",$s)&&print"$s
");

проходить цикл через усі рядки від bababaдо zyzyzта тестує, чи вони відповідають шаблону. Бігайте з -nr.


Лол, гольф із специфікою мовної баггі, мені подобається
Патрік Робертс

1
@PatrickRoberts Це не помилка. Це особливість. : DI Мені сумно, що вони вклали неявну роль у ціле число в $a="001";$a++;якийсь день. Це була дуже незручна зміна.
Тит

1
for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";економить вас 1 чар. На жаль, ви повинні змінити відлуння для друку для використання &&. Заміна \nсправжнім розривом лінії заощаджує інше.
Крістоф

1
ви можете зберегти деякі символи за допомогою, "#([^$v][$v]){2}​[^$v]#"але я не перевіряв це.
Крістоф

1
@Christoph: Idk чому, але ([^$v][$v]​){2}[^$v]не працює в циклі, поки [^$v]([$v]​[^$v]){2}робить. Обидва працюють автономно (навіть зі змінною).
Тит

6

MATL , 21 байт

11Y2'y'h2Y2X~6Myyy&Z*

Спробуйте в Інтернеті! (але результат обрізаний).

11Y2   % Push 'aeiou' (predefined literal)
'y'    % Push 'y'
h      % Concatenate: gives 'aeiouy'
2Y2    % Push 'abcdefghijklmnopqrstuvwxyz' (predefined literal)
X~     % Set symmetric difference: gives 'bcdfghjklmnpqrstvwxz'
6M     % Push 'aeiouy' again
yyy    % Duplicate the second-top element three times onto the top. The stack now
       % contains 'bcdfghjklmnpqrstvwxz', 'aeiouy', 'bcdfghjklmnpqrstvwxz',
       % 'aeiouy', 'bcdfghjklmnpqrstvwxz'
&Z*    % Cartesian product of all arrays present in the stack. Implicity display

Я думаю, що це має спрацювати, поголюючи байт: 11Y2'y'h2Y2yX~yyy&Z*( Спробуйте це в Інтернеті! )
Conor O'Brien

@ ConorO'Brien На жаль, це створює vcvcvшаблон, а не cvcvcяк потрібно. Дякую, хоча!
Луїс Мендо

6

Пітон, 92 байти

f=lambda i=-4,s='':i*[s]or sum([f(i+1,s+c)for c in i%2*'AEIOUY'or'BCDFGHJKLMNPQRSTVWXZ'],[])

Не можна дозволити itertoolsвиграти. Ітеративний на 1 байт довший у Python 2.

W='',
for s in(['AEIOUY','BCDFGHJKLMNPQRSTVWXZ']*3)[1:]:W=[w+c for w in W for c in s]
print W

Це дивовижно ^ _ ^
ABcDexter

6

Haskell, 54 51 байт

l="bcdfghjklmnpqrstvwxz":"aeiouy":l
mapM(l!!)[0..4]

mapM func listбудує всі слова, беручи можливі символи для індексу i зі списку, що повертається func (list!!i).

Редагувати: @xnor знайшов 2 байти, щоб зберегти, і переглянувши його рішення, я знайшов ще один.


mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]зберігає байт.
xnor

Ще краще, 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]це не зовсім вдається.
xnor

@xnor: Дякую! Заміна cycleпершого варіанту на явну рекурсію економить додатковий байт.
nimi

5

Брахілог , 18 байт

@W:@Dg:2jcb:eac@w\

Спробуйте в Інтернеті!

Пояснення

@W:@D                 The list ["aeiouy", "bcdfghjklmnpqrstvwxz"]
     g:2jcb           The list ["bcdfghjklmnpqrstvwxz", "aeiouy", "bcdfghjklmnpqrstvwxz", "aeiouy", "bcdfghjklmnpqrstvwxz"]
           :ea        Take one character of each string
              c       Concatenate into a single string
               @w     Write to STDOUT followed by a newline
                 \    Backtrack: try other characters of the string

Я був здивований необхідністю gі b, але протестуючи це, це тому, що, jздається, відмовляється приймати список рядків як вхідний? :eaдійсно показує сильні сторони Prolog / Brachylog, і це є кроком, який більшість інших мов знаходить набагато складніше.

@ ais523 Так, я також здивувався, що gі bпотрібні. jздається, помилка, і це в черговий раз пов’язано з труднощами відрізнити список аргументів від просто списку. Я можу це виправити, хоча це ще раз ускладнить реалізацію. Можливо, я б просто не вирішив це і вклав свій час на вирішення основної проблеми в новій версії Brachylog.
Фаталізувати

5

JavaScript (ES6), 91 90 байт

f=(s='',i=4)=>{for(c of i%2?'aeiouy':'bcdfghjklmnpqrstvwxz')i?f(s+c,i-1):console.log(s+c)}

Правки

  • ETHproductions: -1 байти, видаляючи сторонні групи навколо потрійного оператора в forзаяві

Пояснення

Це визначає 5-глибоку рекурсивну функцію, яка використовує паритет глибини дзвінка, щоб визначити, чи слід повторювати голосні чи приголосні. На кожній ітерації він перевіряє, чи слід повторювати чи надрукувати, перевіряючи кількість рекурсій, що залишилися, і з'єднує букву його поточної ітерації до кінця рядка з 5 символів, який наразі будується першою глибиною.

Альтернативно 89-байтне рішення, припускаючи кодування ISO8859-1:

f=(s='',i=4)=>{for(c of i%2?'aeiouy':btoa`mÇ_äi骻-¿s`)i?f(s+c,i-1):console.log(s+c)}

Альтернативне 96-байтне рішення, яке повертає весь результат у вигляді однієї рядки:

f=(s='',i=4,o='')=>eval("for(c of i%2?'aeiouy':'bcdfghjklmnpqrstvwxz')o+=i?f(s+c,i-1):s+c+`\n`")

Бігайте на свій страх і ризик. Для рішення, що має 91 байт, просто використовуйте, f()а для альтернативи - 97 байт console.log(f()).


Я спробував перетворити рішення на генератор двома різними способами. Використання форми скорочення, підтримуваної лише Firefox, має однакову довжину: 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]}Ще чекає день, коли генератор - найкоротший варіант ...
ETHproductions

1
btw, ви можете видалити внутрішні паролі у for...ofвиписці, щоб зберегти байт
ETHproductions

5

C, 201 199 186 184 183 169 163 байт

Робити це трохи інакше, ніж попередній основний метод підрахунку:

f(){for(char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[5]={0},*s[]={c,v,c,v,c},j=0;j<5;puts("")){for(j=5;j--;putchar(s[j][i[j]]));for(;j++<5&&!s[j][++i[j]];i[j]=0);}}

Безголовки:

f() {
    for(char *c="bcdfghjklmnpqrstvwxz", *v="aeiouy", i[5]={0}, *s[]={c,v,c,v,c}, j=0; j<5; puts("")) {
        for (j=5; j--; putchar(s[j][i[j]])) ;
        for (; j++ < 5 && !s[j][++i[j]]; i[j]=0) ;
    }
}

І написано трохи більш звичайним чином:

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]]); // output the word
        while (--j>=0 && !s[j][++i[j]]) i[j]=0; // increment the counters
        puts("");
    }
}

В основному, я - лічильники, і s масив рядків, що містить усі символи, над якими ми повинні повторити, для кожного лічильника. Хитрість - внутрішній час циклу: він використовується для збільшення лічильників, починаючи з самого правого одного. Якщо ми бачимо, що наступним символом, який ми повинні відобразити, є закінчується нульовий знак, ми перезапускаємо лічильник до нуля, а "переносити" буде передано на наступний лічильник.

Дякую Крістофе!


Ласкаво просимо до PPCG!
Мартін Ендер

1
char *cЯ думаю, що простір зайвий.
Крістоф

1
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. Давай ти можеш зробити ще краще;).
Крістоф

2
Використання i[5]={0}замість i[]={0,0,0,0,0}економії 7 байт.
Фолкен

1
@Christoph Aha, спасибі Хороша робота. Але вам, здавалося, сподобалось, ось чому я підштовхував виклик (ні, жартую: я це зробив лише тому, що болю в дупі). Серйозно, дякую за освіту.
дим

4

Perl, 71 байт

map{push@{1+/[aeiouy]/},$_}a..z;$"=",";say for glob"{@1}{@2}"x2 ."{@1}"

Спробуйте в Інтернеті!

Пояснення

Пізніше пояснення додам.

map{push@{1+/[aeiouy]/},$_}a..z;створює два масиви: @1містить приголосні та @2містить голосні.
globпри виклику з аргументами типу {a,b}{c,d}повертає всі перестановки елементів в дужках.


4

Befunge, 95 байт

::45*%\45*/:6%\6/:45*%\45*/:6%\6/1g,2g,1g,2g,1g,55+,1+:"}0":**-!#@_
bcdfghjklmnpqrstvwxz
aeiouy

Спробуйте в Інтернеті! , хоча зауважте, що вихід буде усічений.

Це лише цикл у діапазоні від 0 до 287999, виводить індекс у вигляді змішаного на основі числа 20-6-20-6-20 із "цифрами" числа, отриманого з таблиць у двох останніх рядках.


4

Perl 6 , 70 байт

$_=<a e i o u y>;my \c=[grep .none,"a".."z"];.say for [X~] c,$_,c,$_,c

Пояснення цікавої частини:

.say for [X~] c, $_, c, $_, c

              c, $_, c, $_, c  # list of five lists
         [X ]                  # lazily generate their Cartesian product
           ~                   # and string-concatenate each result
.say for                       # iterate to print each result

Код до цього просто генерує список голосних ( $_) та список приголосних ( c), який, на жаль, є багатослівним.


4

Python 2 , 120 117 байт

Дякуємо @WheatWizard за підказку вкладок.

x,y='aeiouy','bcdfghjklmnpqrstvwxz'
for a in x:
 for e in x:
	for b in y:
		for c in y:
			for d in y:print b+a+c+e+d

Спробуйте в Інтернеті!

Не впевнений, що в цьому можна багато пограти в гольф. Спробуйте це онлайн-скорочення на 128 КБ, але показує достатньо, щоб дати ідею. Місцевий пробіг з кодом налагодження для підрахунку слів дав загальну суму 288000. Запускається приблизно за 45 секунд, якщо хтось хоче перевірити.

zyzyv
zyzyw
zyzyx
zyzyz
Total word count: 288000

Невідповідна і тому неконкурентна версія (виводить вкладені масиви замість заданого формату) на 110 байт:

x,y='aeiouy','bcdfghjklmnpqrstvwxz'
print[[[[c+a+d+b+e for e in y]for d in y]for c in y]for b in x]for a in x]

1
Це було моє перше втілення :)
Carra

Замість використання пробілів для всіх відступів можна використовувати пробіли для одного відступу та вкладки для подвійного.
Пшеничний майстер


4

xeger , 49 байт

([bcdfghj-np-tvwxz][aeiouy]){2}[bcdfghj-np-tvwxz]

Даючи регулярний вираз, xeger просто генерує всі відповідні рядки. Щоб не вбити браузер, він робить паузу на кожні 1000 виходів і вам потрібно натиснути, щоб продовжити, але він з часом з’явиться.


Ось 23-байтна версія з виправленою помилкою ^:

([:c^y][:v:y]){2}[:c^y]

Це класи символів "усі малі регістри ASCII приголосних" [:c]з yвиключеними ^y, і "всі голосні звуки ASCII [:v:]з малі регістри" з yдоданими.


На чому ґрунтується аромат регексу? (Або якщо ви скачували свої власні, які функції вони підтримують? Чи є на це документація?)
Мартін Ендер

@MartinEnder Це відокремлений власний перехід від DFA (вирощений із візуалізатора DFA / NFA, який я створив для студентів , який має обмежену документацію) - ніяких зворотних посилань, нічого нерегулярного. Це дуже повільно для довших струн. Єдина цікава особливість самих виразів - поєднання з &.
Майкл Гомер

Я додав документацію решти на сторінку та деякі зразки.
Майкл Гомер

1
Схоже, ви реалізували діапазони в класах символів. Тоді ви могли б зробити [bcdfghj-np-tvwxz].
Мартін Ендер

4

JavaScript (Firefox 30-57), 82 байти

f=(i=5)=>i?[for(s of f(i-1))for(c of i%2?'bcdfghjklmnpqrstvwxz':'aeiouy')s+c]:['']

Повертає масив рядків. Дуже швидка версія для 102 101 (1 байт завдяки @ETHproductions) байтам:

_=>[for(i of c='bcdfghjklmnpqrstvwxz')for(j of v='aeiouy')for(k of c)for(l of v)for(m of c)i+j+k+l+m]

Приємно. У швидкій версії є сторонній простір, який можна видалити на 101 байт
ETHproductions

3

CJam , 32 31 29 28 байт

Збережено 2 байти завдяки Мартіну Ендеру та 1 байт завдяки каїну

"aeiouy"_'{,97>^\1$1$1$N]:m*

Спробуйте в Інтернеті! (Зверніть увагу, що вихід вимикається на TIO)

Пояснення

"aeiouy"_ e# Push the six vowels and duplicate
'{,97>    e# Push the whole alphabet
^         e# Symmetric set difference of the alphabet with the vowels, yields the consonants only
\         e# Swap top two elements
1$1$1$    e# Copy the second-from-the-top string to the top three times
          e# This results in the array being consonants-vowels-consonants-vowels-consonants
N         e# Add a newline character to the end of the list
]         e# End an array. Puts everything done so far in an array
          e# since there was no explicit start of the array.
:m*       e# Reduce the array using Cartesian products

'{,97>щоб отримати алфавіт. А потім "aeiouy"_'{,97>^зберегти ще один байт 1$.
Мартін Ендер

вам не потрібен перший персонаж. Передбачається, якщо він отримає початок стека.
kaine

@kaine Цікаво, не знав цього. Спасибі.
Ділова кішка

$ "aeiouy" _ '{, 97> ^] 3 * (;: m * N * $ ігноруйте знаки $. Idk, як поставити код у коментарях.
kaine

@kaine Використовуйте зворотні посилання, як-от "" ".
Conor O'Brien


3

Perl, 63 59 54 байт

$a="aeiouy";$b="[^$a][$a]"x2;for("a"x5.."z"x5){say if/$b[^$a]/}
$a="aeiouy";$b="[^$a][$a]"x2;/$b[^$a]/&&say for"a"x5.."z"x5

$a=aeiouy;$b="[^$a][$a]"x2;/$b[^$a]/&&say for a.."z"x5

Спробуйте Perl golf для зміни.
EDIT: Схоже, у мене ще багато чому навчитися ... :)


Хороший (навіть якщо відповідь Примо коротший). Ви можете написати кінець, /$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.
Дада

@Dada: Дякую Як хтось, хто використовує Perl для звичайного програмування, але до цього часу не для гольфу, я навіть не думав використовувати не строгий режим. Ось чому я вибрав $aі $bв якості змінних імен, тому що їх не потрібно декларувати навіть у суворому режимі ... :) Я також дуже часто використовую Perl 6 в ці дні, у яких навіть немає строгого режиму.
smls

3

Scala, 87 86 байт

val a="aeiouy"
val b='a'to'z'diff a
for(c<-b;d<-a;e<-b;f<-a;g<-b)println(""+c+d+e+f+g)

Ви можете замінити f"$c$d$e$f$g"на""+c+d+e+f+g , щоб зберегти байти.
corvus_192

3

R, 143 132 байт

q=letters;v=c(1,5,9,15,21,25);x=list(q[-v],q[v],q[-v],q[v],q[-v]);Reduce(paste0,mapply(function(a,b)rep(a,e=b/20),x,cumprod(sapply(x,length))))

q=letters;v=c(1,5,9,15,21,25);x=list(a<-q[-v],b<-q[v],a,b,a);Reduce(paste0,mapply(function(a,b)rep(a,e=b/20),x,cumprod(lengths(x))))

Це моя перша поїздка в гольф з кодом, тому я вітаю будь-які пропозиції, щоб подальше її рубати. Поки це все досить стандартне R; Єдине, можливо, хитрість тут полягає в тому, що paste0 переробляє свої аргументи на довжину найдовшого.

Редагувати: використаний трюк призначення від rturnbull, замінений sapply(x,length)на lengths.


Ласкаво просимо на сайт! Це виглядає досить добре (я лише програмував трохи на R), я б просто рекомендував не включати старий код у свою відповідь. Історія редагування завжди доступна, тому кожен, хто бажає, завжди може її переглянути. Це більше особиста стилістична річ, тому сміливо ігноруйте мою думку.
Пшеничний майстер

Ви можете жорстоко змусити це використовувати функції призначення на 114 байт !
Пунтоване

3

R, 111 98 байт

Додано y як голосну і зіграє 13 байт, завдяки @Patrick B.

l=letters
v=c(1,5,9,15,21,25)
apply(expand.grid(C<-l[-v],V<-l[v],C,V,C)[,5:1],1,cat,fill=T,sep="")

Ми використовуємо expand.gridдля генерації всіх можливих комбінацій матриці Vта Cв матриці, яку ми визначаємо із заданої змінної letters(алфавіту). Ми повертаємо комбінації (оскільки за замовчуванням перша швидка обертається для першої змінної), щоб забезпечити алфавітний порядок. Потім ми повторюємо кожен рядок матриці, друкуючи кожну букву в stdout. Ми використовуємо fillаргумент для того, catщоб кожне слово починалося з нового рядка.


Приємно! Ви можете порубати це далі до 98 символів (додавши "y" як голосну, або 95, якщо ні), використовуючи деякі параметри в cat і перейменуючи "літери": l = літери; v = c (1,5,9, 15,21,25); застосувати (розширити.grid (C <-l [-v], V <- l [v], C, V, C) [, 5: 1], 1, ‌ кіт , fill = T, sep = "")
Патрік Б.

@PatrickB. Спасибі! Я включив ваші пропозиції.
rturnbull


2

Clojure, 101 байт

(print(apply str(for[V["aeiouy"]C["bcdfghjklmnpqrstvwxz"]a C b V c C d V e C](str a b c d e "\n")))))

Не так захоплююче ...


2

Рубі, 65 61 байт

Зовсім інший підхід:

(b=[*?a..?z]-a="aeiouy".chars).product(a,b,a,b){|x|puts x*""}

Нові речі, про які я сьогодні дізнався: функція продукту Array #


2

C 361 байт

f(){i,j,k,l,m;v[6]={97,101,105,111,117,121};c[25];s=26;for(i=0;i<26;i++)c[i]=97+i;for(i=0;i<26;i++){for(j=0;j<6;j++)if(c[i]==v[j])c[i]+=1;}for(i=0;i<s;i++)for(j=i+1;j<s;){ if(c[i]==c[j]){for(k=j;k<s-1;++k)c[k]=c[k+1];--s;}else ++j;}for(i=0;i<s;i++)for(j=0;j<6;j++)for(k=0;k<s;k++)for(l=0;l<6;l++)for(m=0;m<s;m++)printf("%c%c%c%c%c\n",c[i],v[j],c[k],v[l],c[m]);}

Негольована версія:

void f()
{   
int i,j, k,l,m;
int s=26;
int v[6]={97,101,105,111,117,121};
int c[s];

for(i=0;i<s;i++)
 c[i]=97+i;
for(i=0;i<s;i++)
{     
  for(j=0;j<6;j++)
    if(c[i]==v[j])
      c[i]+=1;
     }
for(i=0;i<s;i++)
 for(j=i+1;j<s;)
 { if(c[i]==c[j])
  {
    for(k=j;k<s-1;++k)
      c[k]=c[k+1];
      --s;  
  }else
   ++j;  
  }
for(i=0;i<s;i++)
  for(j=0;j<6;j++)
       for(k=0;k<s;k++)
        for(l=0;l<6;l++)
         for(m=0;m<s;m++)       
      printf("%c%c%c%c%c\n",c[i],v[j],c[k],v[l],c[m]);
}

Має бути якийсь спосіб, щоб це однозначно скоротити.

Пояснення

  • Збережено цілі значення a, e, i, o, u, y у числовому масиві,
  • Зберігав усі алфавіти в масиві, якщо це був голосний, заміняв його на приголосний, тому в масиві були дублюючі приголосні значення,
  • Вилучені повторювані значення приголосних,
  • Надруковано всі комбінації cvcvc.

Якби ви могли поставити версію без вогків, яка б дуже допомогла.
SIGSTACKFAULT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.