Mathematica, 72 65 61 bytes
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
Para testar, recomendo substituir Print@@@
por ""<>#&/@
. O Mathematica exibirá um formulário truncado mostrando as primeiras e as últimas palavras, em vez de levar uma eternidade para imprimir 288.000 linhas.
Explicação
Finalmente encontrei um uso para dividir strings. :)
Fiquei intrigado com a possibilidade de adicionar ou multiplicar seqüências por um tempo, mas os casos de uso reais são bastante limitados. O ponto principal é que algo como "foo"+"bar"
ou "foo"*"bar"
(e, consequentemente, a forma abreviada "foo""bar"
) é completamente válido no Mathematica. No entanto, ele realmente não sabe o que fazer com as seqüências de caracteres em expressões aritméticas, portanto, essas coisas permanecem sem avaliação. Mathematica não aplicar simplificações geralmente aplicáveis embora. Em particular, as strings serão classificadas em ordem canônica (que é bastante bagunçada no Mathematica, quando você começar a classificar strings contendo letras de vários casos, dígitos e não letras), que geralmente é um desrespeitador, mas não importa aqui. . Além disso, "abc""abc"
será simplificado para"abc"^2
(que é um problema quando você repetiu seqüências de caracteres, mas também não o temos), e algo como "abc"/"abc"
será cancelado (do qual usaremos até).
Então, o que estamos tentando jogar aqui? Precisamos de uma lista de vogais e uma lista de consoantes, para que possamos alimentá-las Tuples
para gerar todas as combinações possíveis. Minha primeira abordagem foi a solução ingênua:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
Essa lista codificada de consoantes doeu um pouco. O Mathematica tem um Alphabet
built-in que me permitiria evitá-lo, se eu fosse capaz de remover as vogais de uma maneira barata. É aqui que fica complicado, porém. A maneira mais simples de remover elementos é Complement
, mas ela acaba sendo mais longa, usando uma das seguintes opções:
{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}
(Observe que não precisamos mais aplicar Characters
a coisa toda, porque Alphabet[]
fornece uma lista de letras, não uma string.)
Então, vamos tentar esse negócio aritmético. Se representarmos o alfabeto inteiro como um produto de letras em vez de uma lista, podemos remover as letras por divisão simples, devido à regra de cancelamento. Isso economiza muitos bytes porque não precisamos Complement
. Além disso, "a""e""i""o""u""y"
é realmente um byte menor que Characters@"aeiouy"
. Então, fazemos isso com:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
Onde estamos armazenando os produtos consoantes e vogais em a
e b
, respectivamente. Isso funciona escrevendo uma função que multiplica todos os seus argumentos ##
e os divide pelo produto das vogais. Esta função é aplicada à lista de alfabeto, que passa cada letra como um argumento separado.
Até aí tudo bem, mas agora temos
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
como argumento Tuples
, e essas coisas ainda são produtos, não listas. Normalmente, a maneira mais curta de corrigir isso é colocar um List@@@
na frente, que transforma os produtos em listas novamente. Infelizmente, adicionar esses 7 bytes o torna mais longo que a abordagem ingênua.
No entanto, acontece que Tuples
isso não se importa com os chefes das listas internas. Se você fizer
Tuples[{f[1, 2], f[3, 4]}]
(Sim, para um indefinido f
.) Você receberá:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
Como se você tivesse usado um em List
vez de f
. Para que possamos repassar esses produtos diretamente Tuples
e ainda obter o resultado certo. Isso economiza 5 bytes em relação à abordagem ingênua, usando duas seqüências codificadas.
Agora o "a""e""i""o""u""y"
ainda é bastante irritante. Mas espere, também podemos salvar alguns bytes aqui! Os argumentos de nossa função são as letras individuais. Portanto, se escolhermos os argumentos certos, podemos reutilizá-los, em vez dos literais de string, que é mais curto para três deles. Queremos argumentos #
(abreviação de #1
), #5
, #9
, #15
, #21
e #25
. Se colocarmos #
no final, também não precisamos adicionar nenhum *
para multiplicá-los, porque (regex) #\d+
é um token completo que não pode ter nenhum dígito anexado a ele. Portanto, acabamos #5#9#15#21#25#
economizando outros 4 bytes.