Ogni parola da Babab a Zyzyz


38

Il tuo compito è quello di scrivere un programma che produrrà un elenco leggibile di ogni parola di cinque lettere con la struttura:

consonante - vocale - consonante - vocale - consonante

L'output deve essere ordinato in ordine alfabetico con una parola per riga e nessuna parola ripetuta due volte. Può essere minuscolo o maiuscolo ma non misto. Quindi l'elenco potrebbe iniziare e terminare in questo modo:

babab  
babac  
babad  
...  
zyzyw  
zyzyx  
zyzyz 

Le vocali sono a - e - i - o - u - y , le altre 20 lettere dell'alfabeto inglese sono consonanti.
Le parole non devono essere parole reali del dizionario.
Il codice più corto vince.

Nota: qualche anno fa mi sono imbattuto in un programma su un sito web universitario che ha fatto esattamente questo. Ho scoperto che il mio nome e cognome coincidevano con il vincolo del cvcvc e che mi ero preso su Google.


7
Vedo due cose qui. Innanzitutto, ci sono una quantità ridicola di parole come questa. Come prevedete di testare le voci? Inoltre, ci sono molti nomi che si adattano a quel vincolo. Il primo che mi viene in mente è Jacob , anche se anche altri come Lucas si adattano
TrojanByAccident

9
@TrojanByAccident Credo che la sfida richieda tutte le possibili combinazioni di lettere corrispondenti, indipendentemente dal fatto che siano nomi / parole inglesi. "Le parole non devono essere parole reali del dizionario."
trichoplax,

3
@wilks Rilevanti meta post - I formati I / O rigorosi non sono apprezzati in questa comunità SE. Questa sfida si concentra sulla generazione di parole in cvcvc, non sull'inserimento di nuove righe tra le parole, no?
JungHwan Min

1
@JungHwanMin Grazie per il link, la prima volta qui e non lo sapevo. L'ho visto come un elenco leggibile e alfabetico di tutte le parole di cvcvc. Quindi sono d'accordo sul fatto che le maiuscole o minuscole non contano davvero, ma penso anche che una stringa molto lunga o, diciamo alcune matrici nidificate, mentre tecnicamente valida non sarebbe una grande risposta.
salta il

2
Avendo eseguito alcune delle risposte votate a questa domanda, ovviamente non sono conformi a "L'output dovrebbe essere incrementale con ogni parola sulla propria riga". Questo requisito è stato attenuato e, in tal caso, è possibile modificare la domanda per riflettere questo? Penso che potrei perdere parecchi byte se la mia risposta non fosse limitata dal formato.
ElPedro,

Risposte:


28

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 Tuplesper 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 Alphabetbuilt-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 Charactersl'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 ae 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 Tuplesnon 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 Listinvece di f. Quindi possiamo effettivamente passare direttamente quei prodotti Tuplese 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, #21e #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.


11
Legge la spiegazione. Quindi ... fondamentalmente magico.
Tally

Sono sorpreso e colpito dal tuo Tuplestrucco. È del tutto privo di documenti, giusto? E inaspettato visto come il modulo a due input si Tuples[list,n]occupa di listnon avere la Listtesta (almeno per me)!
A Simmons,


1
@ngenisis Trovo questa formulazione molto confusa. Perché non è chiaro che ciò si riferisce all'elenco esterno quando si utilizzano più elenchi. Anzi Tuples[f[{1,2}, {3,4}]]{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}invece. Non è documentato che la testa interna sia completamente ignorata.
Martin Ender,

@ASimmons cc. ^
Martin Ender il

16

Perl, 47 byte

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

Contando lo shebang come uno.

Provalo online!


2
Questo è carino, ben fatto! Qualche motivo che non stai usando say?
Dada,

Grazie. Non sono d' accordo sul fatto che -M5.01dovrebbe essere "libero".
primo

1
Mi piace la tua opinione su -M5.010. E la parte interessante del golf non è da sostituire printcon say...
Dada,

Non è -E(e successivamente say) un omaggio?
Zaid,

@Zaid Vedi il primo commento di
Dada,

11

Python 3 - 110 byte

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))

Divertimento in loop semplice :)


Pensa che le nostre idee siano le stesse ma mi hai battuto per 10 con Python 3!
ElPedro,

Stavo per pubblicare un equivalente di Python2 usando questo approccio. Troppo lento, invece un voto per te.
Chris H,

8

Rubino, 72 71 52 byte

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

Grazie a Value Ink per l'idea di base, che lo ha portato a 60 byte.


1
È più breve generare un elenco di parole di 5 lettere e usando grep. Se si genera un intervallo che utilizza stringhe minuscole, si ottiene solo una sequenza di parole minuscole. puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/per 60 byte
Valore inchiostro

7

05AB1E , 18 16 byte

05AB1E utilizza la codifica CP-1252 .

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

Spiegazione

ž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

A scopo di test, consiglio di sostituirlo žPcon alcune consonanti e žOcon alcune vocali.

Esempio usando 5 consonanti e 3 vocali


buon uso del prodotto cartesiano. Non ci avrei pensato.
Magic Octopus Urn


7

Pure Bash, 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

Espansione di parentesi graffe semplice.

Provalo online .


Se ogni articolo deve essere sulla sua riga, allora abbiamo:

Pure Bash, 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 byte

grazioso incremento di stringa :)
6 byte salvati da @Christoph

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

scorre attraverso tutte le stringhe da bababaa zyzyze verifica se corrispondono al modello. Corri con -nr.


Lol, giocando a golf con una lingua buggy, mi piace
Patrick Roberts,

1
@PatrickRoberts Non è un bug. È una caratteristica. : DI, sono triste, hanno incorporato un cast implicito in numero intero in $a="001";$a++;un giorno. È stato un cambiamento molto poco pratico.
Tito

1
for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";ti fa risparmiare 1 carattere. Purtroppo devi usare l'eco per stampare &&. La sostituzione \ncon un'interruzione di riga reale ne salva un'altra.
Christoph,

1
potresti salvare alcuni caratteri usando "#([^$v][$v]){2}​[^$v]#"ma non l'ho provato.
Christoph,

1
@Christoph: Idk perché, ma ([^$v][$v]​){2}[^$v]non funziona nel ciclo, mentre [^$v]([$v]​[^$v]){2}funziona. Entrambi funzionano autonomamente (anche con la variabile) però.
Tito

6

MATL , 21 byte

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

Provalo online! (ma l'output viene troncato).

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

Penso che dovrebbe funzionare, radendo un byte: 11Y2'y'h2Y2yX~yyy&Z*( Provalo online! )
Conor O'Brien,

@ ConorO'Brien Sfortunatamente, questo crea lo vcvcvschema, non cvcvccome richiesto. Grazie comunque!
Luis Mendo,

6

Python, 92 byte

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

Non posso lasciare itertoolsvincere. Iterativo è più lungo di 1 byte in Python 2.

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

Questo è fantastico ^ _ ^
ABcDexter

6

Haskell, 54 51 byte

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

mapM func listcostruisce tutte le parole prendendo i possibili caratteri per l'indice i dall'elenco restituito da func (list!!i).

Modifica: @xnor ha trovato 2 byte da salvare e guardando la sua soluzione, ne ho trovata un'altra.


mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]salva un byte.
xnor

Meglio ancora, mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]oppure mapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]. Sarebbe bello non codificare le vocali e le consonanti, ma mapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]non ce la fa.
xnor

@xnor: grazie! Sostituendo cycledalla prima variante con ricorsione esplicita si salva un byte aggiuntivo.
nimi

5

Brachylog , 18 byte

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

Provalo online!

Spiegazione

@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

Sono stato sorpreso dalla necessità di ge b, ma testandolo, questo è perché jsembra rifiutare di prendere un elenco di stringhe come input? :eamostra davvero i punti di forza di Prolog / Brachylog, tuttavia, ed è un passo che la maggior parte delle altre lingue trova molto più difficile.

@ ais523 Sì, mi è stato anche sorpreso che l' ge bfosse bisogno. jsembra essere infastidito e questo è dovuto ancora una volta alla difficoltà di distinguere un elenco di argomenti da un solo elenco. Potrei risolvere questo problema, anche se questo complicherà ancora una volta l'implementazione. Potrei anche non risolverlo e investire il mio tempo a risolvere il problema principale in una nuova versione di Brachylog.
Fatalizza il

5

JavaScript (ES6), 91 90 byte

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

Le modifiche

  • ETHproductions: -1 byte rimuovendo gruppo estraneo intorno operatore ternario in fordichiarazione

Spiegazione

Questo definisce una funzione ricorsiva a 5 profondità che utilizza la parità della sua profondità di chiamata per determinare se iterare vocali o consonanti. Ad ogni iterazione, verifica se è necessario ricorrere o stampare verificando la quantità di ricorsioni rimaste e concatena la lettera della sua iterazione corrente alla fine della stringa di 5 caratteri attualmente in fase di creazione in profondità.

Soluzione alternativa a 89 byte che assume la codifica 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)}

Soluzione alternativa a 96 byte che restituisce l'intero output come singola stringa:

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

Corri a tuo rischio. Per la soluzione a 91 byte, basta usare f()e per l'alternativa a 97 byte, usare console.log(f()).


Ho provato a trasformare la soluzione in un generatore in due modi diversi. L'utilizzo del modulo abbreviato supportato solo da Firefox ha la stessa lunghezza: L' f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)uso del modulo standard è purtroppo un byte più lungo: function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}
sto

1
tra l'altro, è possibile rimuovere le parentesi interne nell'istruzione for...ofper salvare un byte
ETHproductions

5

C, 201 199 186 184 183 169 163 byte

Farlo in modo leggermente diverso rispetto al precedente metodo di conteggio di base:

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);}}

Ungolfed:

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) ;
    }
}

E scritto in un modo un po 'più convenzionale:

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("");
    }
}

Fondamentalmente, io sono i contatori, ed è l'array di stringhe che contiene tutti i caratteri su cui dovremmo iterare, per ogni contatore. Il trucco è quello interno , mentre ciclo : viene utilizzato per incrementare i contatori, iniziando da quello più a destra. Se vediamo che il prossimo carattere che dovremmo visualizzare è il carattere null finale, riavviamo il contatore a zero e il "carry" verrà propagato al contatore successivo.

Grazie Cristoph!


Benvenuti in PPCG!
Martin Ender,

1
char *cPenso che lo spazio non sia necessario.
Christoph,

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("");}}ti porta a 177. Dai, puoi fare ancora meglio;).
Christoph,

2
Usando i[5]={0}invece di i[]={0,0,0,0,0}salva 7 byte.
Falken,

1
@Christoph Aha, grazie. Buon lavoro. Ma sembra che ti piaccia, è per questo che stavo spingendo la sfida (no, sto scherzando: l'ho fatto solo perché sono un dolore nel culo). Seriamente, grazie per le illuminazioni.
dim

4

Perl, 71 byte

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

Provalo online!

Spiegazione

Aggiungerò ulteriori spiegazioni in seguito.

map{push@{1+/[aeiouy]/},$_}a..z;crea due matrici: @1contiene le consonanti e @2contiene le vocali.
globquando chiama con argomenti come {a,b}{c,d}restituisce tutte le permutazioni degli elementi tra parentesi graffe.


4

Befunge, 95 byte

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

Provalo online! , sebbene si noti che l'output verrà troncato.

Questo è solo un ciclo nell'intervallo da 0 a 287999, che mostra l'indice come un numero basato misto 20-6-20-6-20, con le "cifre" del numero recuperate dalle tabelle nelle ultime due righe.


4

Perl 6 , 70 byte

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

Spiegazione della parte interessante:

.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

Il codice precedente genera solo l'elenco delle vocali ( $_) e l'elenco delle consonanti ( c), che è purtroppo dettagliato.


4

Python 2 , 120 117 byte

Grazie a @WheatWizard per il suggerimento sulle schede.

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

Provalo online!

Non sono sicuro che questo possa essere giocato molto. Provalo online tronca a 128 KB, ma mostra abbastanza per dare un'idea. Un'esecuzione locale con codice di debug per contare le parole ha fornito un totale di 288000. Viene eseguita in circa 45 secondi se qualcuno vuole testare.

zyzyv
zyzyw
zyzyx
zyzyz
Total word count: 288000

Versione non conforme e quindi non competitiva (stampa array nidificati invece del formato specificato) per 110 byte:

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
È stata la mia prima implementazione :)
Carra, il

Invece di usare gli spazi per tutto il rientro, puoi usare gli spazi per il singolo rientro e le schede per il doppio.
Wheat Wizard

4

Perl 6, 53 byte

/<-[aeiouy]>**3%<[aeiouy]>/&&.say for [...] <a z>Xx 5

Ci vuole un po 'di tempo per avere qualsiasi output. Molto inefficiente. Fa il lavoro.


Benvenuti in PPCG!
Martin Ender,

4

xeger , 49 byte

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

Data un'espressione regolare, xeger genera semplicemente tutte le stringhe corrispondenti. Per non uccidere il browser, fa una pausa ogni 1000 uscite e devi fare clic per continuare, ma alla fine ci arriverà.


Ecco una versione a 23 byte con un bug ^risolto:

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

Queste sono le classi di caratteri "tutte le consonanti ASCII minuscole" [:c]con l' yesclusione ^ye "tutte le vocali ASCII minuscole" [:v:]con l' yaggiunta.


Su quale sapore regex si basa? (O se hai creato il tuo, quali funzionalità supporta? C'è della documentazione al riguardo?)
Martin Ender

@MartinEnder È un roll-your-own di DFA traversal (sviluppato da un visualizzatore DFA / NFA che ho creato per gli studenti , che ha una documentazione limitata) - nessun ritorno indietro, niente di non regolare. È molto lento per stringhe più lunghe. L'unica caratteristica interessante delle espressioni stesse è la congiunzione con &.
Michael Homer,

Ho aggiunto la documentazione del resto alla pagina e alcuni esempi.
Michael Homer,

1
Sembra che tu abbia implementato intervalli in classi di caratteri. Allora potresti fare [bcdfghj-np-tvwxz].
Martin Ender,

4

JavaScript (Firefox 30-57), 82 byte

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

Restituisce una matrice di stringhe. Versione molto veloce per 102 101 (1 byte grazie a @ETHproductions) byte:

_=>[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]

Bello. C'è uno spazio estraneo nella versione veloce che può essere rimosso per 101 byte
ETHproductions

3

CJam , 32 31 29 28 byte

Salvato 2 byte grazie a Martin Ender e 1 byte grazie a kaine

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

Provalo online! (Notare che l'uscita viene interrotta su TIO)

Spiegazione

"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>per ottenere l'alfabeto. E poi "aeiouy"_'{,97>^per salvare un altro byte 1$.
Martin Ender,

non hai bisogno del primissimo personaggio. Si presume se arriva lo stack.
Kaine,

@kaine Interessante, non lo sapevo. Grazie.
Business Cat

$ "aeiouy" _ '{, 97> ^] 3 * (;: m * N * $ ignora i segni $. Idk come inserire il codice nei commenti.
Kaine

@kaine Usa i backtick, come "` ".
Conor O'Brien,


3

Perl, 63 59 54 byte

$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

Cercando Perl golf per un cambiamento.
EDIT: Sembra che ho ancora molto da imparare ... :)


Bello (anche se la risposta di Primo è più breve). È possibile scrivere la fine /$b[^$a]/&&say for"a"x5.."z"x5per salvare alcuni byte. Modifica: e puoi rilasciare $be fare $a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5.
Dada,

Inoltre, non hai bisogno delle virgolette in giro aeiouy. Inoltre, poiché il tuo regex controlla 5 caratteri, puoi farlo a.."z"x5.
Dada,

@Dada: grazie. Come qualcuno che usa Perl per la normale programmazione ma fino ad ora non per il golf, non ho nemmeno pensato di sfruttare la modalità non rigorosa. È per questo che ho scelto $ae $bcome nomi di variabili, perché quelli non hanno bisogno di essere dichiarato anche in modalità rigorosa ... :) Io uso anche Perl 6 molto in questi giorni, che non ha nemmeno hanno una modalità non rigorosa.
smls

3

Scala, 87 86 byte

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)

È possibile sostituire f"$c$d$e$f$g"con ""+c+d+e+f+gper salvare un byte.
corvus_192,

3

R, 143 132 byte

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))))

Questo è il mio primo tentativo di giocare a code golf, quindi gradirei qualsiasi suggerimento per ridurlo ulteriormente. Finora è tutto abbastanza standard R; l'unica cosa forse complicata qui è che paste0 ricicla i suoi argomenti per la lunghezza della più lunga.

Modifica: usato il trucco di assegnazione da rturnbull, sostituito sapply(x,length)con lengths.


Benvenuti nel sito! Questo sembra abbastanza buono (ho programmato solo un po 'in R me stesso) Vorrei solo raccomandare di non includere il vecchio codice nella tua risposta. La cronologia delle modifiche è sempre disponibile, quindi chiunque lo desideri può sempre visualizzarla. Questa è più una cosa stilistica personale, quindi sentiti libero di ignorare la mia opinione.
Wheat Wizard

Puoi forzare la forza con assegnazioni di funzioni per 114 byte !
Punito il

3

R, 111 98 byte

Aggiunto ycome vocale e rigettato da 13 byte, grazie a @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="")

Usiamo expand.gridper generare tutte le possibili combinazioni di Ve Cin una matrice, che definiamo dalla variabile preimpostata letters(l'alfabeto). Invertire le combinazioni (in quanto l'impostazione predefinita prevede che la prima variabile ruoti più rapidamente) per garantire l'ordine alfabetico. Quindi passiamo attraverso ciascuna riga della matrice, stampando ogni lettera su stdout. Usiamo l' fillargomento per catgarantire che ogni parola inizi su una nuova riga.


Bello! Puoi ridurlo ulteriormente a 98 caratteri (aggiungendo 'y' come vocale, o 95 in caso contrario) usando alcune opzioni in cat e rinominando "lettere": l = lettere; v = c (1,5,9, 15,21,25), applicare (expand.grid (C <-l [-v], v <- l [v], C, v, C) [, 5: 1], 1, cat , fill = T, sep = "")
Patrick B.

@PatrickB. Grazie! Ho incorporato i tuoi suggerimenti.
rturnbull,


2

Clojure, 101 byte

(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")))))

Non così eccitante ...


2

Rubino, 65 61 byte

Approccio completamente diverso:

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

Nuove cose che ho imparato oggi: la funzione del prodotto Array #


2

C 361 byte

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]);}

Versione non golfata:

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]);
}

Deve esserci un modo per abbreviarlo definitivamente.

Spiegazione

  • Memorizzato i valori interi di a, e, i, o, u, y in una matrice numerica,
  • Tutti gli alfabeti memorizzati nell'array, se era una vocale, lo hanno sostituito con una consonante, quindi nell'array c'erano valori consonanti duplicati,
  • Rimossi valori consonanti duplicati,
  • Stampato tutte le combinazioni in pvcvc.

Se potessi mettere una versione non golfata che sarebbe di grande aiuto.
SIGSTACKFAULT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.