Mathematica, 72 65 61 byte
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
Per i test, consiglio di sostituirlo Print@@@
con ""<>#&/@
. Mathematica mostrerà quindi un modulo troncato che mostra le prime e le ultime parole, invece di impiegare un'eternità a stampare 288.000 righe.
Spiegazione
Alla fine ho trovato un uso per dividere le stringhe. :)
Sono stato incuriosito dalla possibilità di aggiungere o moltiplicare le stringhe per un po ', ma i casi d'uso effettivi sono piuttosto limitati. Il punto principale è che qualcosa di simile "foo"+"bar"
o "foo"*"bar"
(e di conseguenza, la forma abbreviata "foo""bar"
) è completamente valido in Mathematica. Tuttavia, non sa davvero cosa fare con le stringhe nelle espressioni aritmetiche, quindi queste cose rimangono non valutate. Mathematica non applicare semplificazioni di applicazione generale però. In particolare, le stringhe saranno ordinate in ordine canonico (che è abbastanza incasinato in Mathematica, una volta che inizi a ordinare le stringhe contenenti lettere di vari casi, cifre e non lettere), che è spesso un rompicapo, ma non importa qui . Inoltre, "abc""abc"
sarà semplificato"abc"^2
(il che è un problema quando hai ripetuto le stringhe, ma non ne abbiamo nemmeno una), e qualcosa del genere "abc"/"abc"
in realtà annullerà (che useremo persino).
Quindi cosa stiamo cercando di giocare a golf qui. Abbiamo bisogno di un elenco di vocali e di un elenco di consonanti, quindi possiamo dar loro da mangiare Tuples
per generare tutte le possibili combinazioni. Il mio primo approccio è stata la soluzione ingenua:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
Quella lista codificata di consonanti fa un po 'male. Mathematica ha un Alphabet
built-in che mi permetterebbe di evitarlo, se fossi in grado di rimuovere le vocali in modo economico. Questo è dove diventa difficile però. Il modo più semplice per rimuovere gli elementi è Complement
, ma finisce per essere più lungo, usando una delle seguenti opzioni:
{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}
(Nota che non è più necessario applicare Characters
l'intera cosa, perché Alphabet[]
fornisce un elenco di lettere, non una stringa.)
Quindi proviamo quell'affare aritmetico. Se rappresentiamo l'intero alfabeto come prodotto di lettere anziché come elenco, possiamo rimuovere le lettere mediante una semplice divisione, a causa della regola di cancellazione. Ciò consente di risparmiare molti byte perché non ne avremo bisogno Complement
. Inoltre, in "a""e""i""o""u""y"
realtà è un byte più corto di Characters@"aeiouy"
. Quindi lo facciamo con:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
Dove stiamo conservando i prodotti di consonanti e vocali in a
e b
, rispettivamente. Questo funziona scrivendo una funzione che moltiplica tutti i suoi argomenti ##
e li divide per il prodotto delle vocali. Questa funzione viene applicata all'elenco alfabetico, che passa ogni lettera come argomento separato.
Fin qui tutto bene, ma ora abbiamo
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
come argomento Tuples
, e quelle cose sono ancora prodotti, non elenchi. Normalmente, il modo più breve per risolvere è mettere a List@@@
in primo piano, che trasforma nuovamente i prodotti in elenchi. Sfortunatamente, l'aggiunta di quei 7 byte lo rende più lungo dell'approccio ingenuo.
Tuttavia, si scopre che Tuples
non importa affatto i capi delle liste interne. Se fate
Tuples[{f[1, 2], f[3, 4]}]
(Sì, per un indefinito f
.) Otterrai:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
Proprio come se avessi usato un List
invece di f
. Quindi possiamo effettivamente passare direttamente quei prodotti Tuples
e ottenere comunque il risultato giusto. Ciò consente di risparmiare 5 byte sull'approccio ingenuo utilizzando due stringhe codificate.
Ora "a""e""i""o""u""y"
è ancora abbastanza fastidioso. Ma aspetta, possiamo salvare anche pochi byte qui! Gli argomenti della nostra funzione sono le singole lettere. Quindi, se selezioniamo semplicemente gli argomenti giusti, possiamo riutilizzarli al posto dei letterali stringa, che è più breve per tre di essi. Vogliamo argomenti #
(abbreviazione di #1
), #5
, #9
, #15
, #21
e #25
. Se lo mettiamo #
alla fine, allora non abbiamo nemmeno bisogno di aggiungerne nessuno *
per moltiplicarli insieme, perché (regex) #\d+
è un token completo che non può essere aggiunto a nessuna cifra. Quindi finiamo per #5#9#15#21#25#
salvare altri 4 byte.