Genera una parola pronunciabile


16

La sfida è semplice:

genera una parola.

specifiche tecniche:

  • La parola deve essere pronunciabile.
    • Questo è definito come "alternanza tra una consonante e una vocale".
    • Una consonante è una delle seguenti lettere: bcdfghjklmnpqrstvwxz
    • Una vocale è una delle seguenti lettere: aeiouy
  • La parola deve essere generata casualmente.
  • Le parole devono essere in grado di contenere ogni consonante e vocale. (Non puoi usare solo bcdfper consonanti e aeivocali.)
  • Word deve contenere 10 lettere.
  • Vince il codice più breve (nel conteggio dei caratteri).


7
Con questa striscia xkcd in mente, il programma echo buxitiwymuè conforme alle specifiche tecnicamente. Ti assicuro, ho generato la parola in modo casuale: P
AardvarkSoup

1
@AardvarkSoup "Le parole devono essere in grado di contenere ogni consonante e vocale"
Maniglia della porta

1
@Kartik dipende dal contesto, in "sì" è una consonante, in "perché" è una vocale, ma ciò renderebbe impossibile definire una parola pronunciabile come alternata di vocali e consonanti, ad es. yyyyyyyy sarebbe una parola valida.
CJStuart,

1
In realtà ho creato un generatore su Scratch qualche tempo fa. Aveva regole specifiche per quando puoi trattare ycome una vocale, dove puoi usare qe x, e quando puoi usare combinazioni di due lettere come ngoea
Esolanging Fruit

Risposte:


7

GolfScript, 32 caratteri

['aeiouy'.123,97>^]5*{.,rand=}%+

Eseguilo online .


8

Rubino: 56 caratteri

([v=%w(a e i o u y),[*?a..?z]-v]*5).map{|a|$><<a.sample}

Esempi di output:

  • itopytojog
  • umapujojim
  • ipagodusas
  • yfoqinifyw
  • ebylipodiz

1
'aeiouy'.charssarebbe un carattere più corto.
Howard,

@Howard poi l'operatore di sottrazione sollevaTypeError: can't convert Enumerator into Array
John Dvorak il

@JanDvorak Siamo spiacenti, ho dimenticato di dire che hai bisogno di Ruby 2.0 per questo trucco.
Howard,

7

Python, 81

from random import*
print''.join(map(choice,["bcdfghjklmnpqrstvwxz","aeiouy"]*5))

Buona fortuna pronunciandoli.


In realtà sono abbastanza facili da pronunciare, ad esempio la prima parola che ho ricevuto è "viketuziwo":P
Maniglia della porta

@Doorknob forse è solo la mia fortuna. Continuo a ricevere "parole" come "qijepyjyga". I tentativi del mio computer di pronunciarli compensano però :)
GRC

3
Mi sono appena divertito molto a fare python grc.py | saysulla mia macchina. Grazie per l'idea
Kaya,

7

COBOL, 255

Quindi sto imparando COBOL al momento. Ho usato questa domanda come pratica. Ho provato a golf.

È 255 senza lo spazio bianco iniziale e 286 byte con.

Per quello che vale, questo funziona con Microfocus COBOL per VS2012 e non ho idea se funzionerà altrove.

       1 l pic 99 1 s pic x(26) value'aeiouybcdfghjklmnpqrstvwxz' 1 r
       pic 99 1 v pic 9 1 q pic 99. accept q perform test after varying
       l from 1 by 1 until l>9 compute v=function mod(l,2) compute r=1+
       function random(q*l)*5+v*15+v*5 display s(r:1)end-perform exit

6

APL (34)

,⍉↑(V[5?6])((⎕A~V←'AEIOUY')[5?20])

6

JavaScript, 74

for(a=b=[];a++-5;)b+="bcdfghjklmnpqrstvwxz"[c=new Date*a%20]+"aeiouy"[c%6]

Non genera tutte le combinazioni, ma penso che appaiano tutte le consonanti e la vocale.

JavaScript, 79

for(a=b=[];a--+5;)b+="bcdfghjklmnpqrstvwxz"[c=Math.random()*20^0]+"aeiouy"[c%6]

Versione più "casuale".


A cosa serve ^0?
Alpha,

1
@Alpha Math.randomdà un float, abbiamo bisogno di un numero intero. ^0tronca il numero
copia il

Trucco intelligente. Non ho mai visto l' ^operatore in JavaScript prima e meno sentito parlare di usarlo per troncare un float. Grazie!
Alpha,

@copy mi piace l'uso di^
Math chiller

4

Rubino: 70 66 caratteri

10.times{|i|$><<["aeiouy"*4,"bcdfghjklmnpqrstvwxz"][i%2][rand 20]}

Esecuzione di esempio:

bash-4.1$ ruby -e '10.times{|i|$><<["aeiouy"*4,"bcdfghjklmnpqrstvwxz"][i%2][rand 20]}'
izogoreroz

bash-4.1$ ruby -e '10.times{|i|$><<["aeiouy"*4,"bcdfghjklmnpqrstvwxz"][i%2][rand 20]}'
onewijolen

bash-4.1$ ruby -e '10.times{|i|$><<["aeiouy"*4,"bcdfghjklmnpqrstvwxz"][i%2][rand 20]}'
amilyfilil

È possibile utilizzare 10.timesper un carattere in meno.
Howard,

1
Inoltre, la domanda non richiede che ogni lettera abbia la stessa probabilità. *10-> *4, salta *3, rand 60-> rand 20e hai salvato 3 caratteri.
Howard,

Buona cattura della regola, @Howard. Grazie.
arte

4

R: 105 caratteri

a=c(1,5,9,15,21,25)
l=letters
s=sample
cat(apply(cbind(s(l[-a],5),s(l[a],5)),1,paste,collapse=""),sep="")

4

J (51)

,|:>(<"1[5?6 20){&.>'aeiouy';'bcdfghjklmnpqrstvwxz'

4

Elaborazione, 100 99 93 87

int i=10;while(i-->0)"aeiouybcdfghjklmnpqrstvwxz".charAt((int)random(i%2*6,6+i%2*i*2));

A un esame più attento della domanda, vedo che non richiede alcun output. L'ho adattato di conseguenza.


3

Obiettivo-C, 129

main(){int i=10;while(i-->0)printf("%c",[(i%2==0)?@"aeiouy":@"bcdfghjklmnpqrstvwxz"characterAtIndex:arc4random()%(6+(i%2)*14)]);}

Con l'aiuto di Daniero

(Adoro usare le tende per l' operatore (->)


3

Java AKA è il linguaggio più prolisso mai creato, 176 con l'aiuto di Doorknob, Daniero e Peter Taylor (grazie ragazzi!)

class w{public static void main(String[]a){int i=11;while(--i>0)System.out.print((i%2==0?"aeiouy":"bcdfghjklmnpqrstvwxz").charAt(new java.util.Random().nextInt(6+(i%2)*14)));}}

Ungolfed:

    class w {

        public static void main(String[] a) {
            int i = 11;
            while (--i > 0) {
                System.out.print((i % 2 == 0 ? "aeiouy" : "bcdfghjklmnpqrstvwxz").charAt(new java.util.Random().nextInt(6 + (i % 2) * 14)));
            }
     }

}


1
Miglioramenti suggeriti: modifica String a[]in String[]a(-1 caratteri), modifica w W = new w();in w W=new w();(-2 caratteri)
Maniglia della porta

Suggerimenti: lascia che la parola inizi sempre su una consonante (o su una pala); non c'è bisogno di randomizzare questo quando la domanda non lo menziona! Quindi, salta il booleano fe usa i%2invece. Inoltre, il forloop può essere abbreviato e puoi inserire entrambe le stringhe all'interno dell'operatore condizionale (anche qui non sono necessarie parentesi) e utilizzare charAtl'esterno. Ecco il tutto, 195 CHARS, 38 SALVATI :import java.util.*;class w{public static void main(String[]a){Random r=new Random();for(int i=0;++i<11;)System.out.print((i%2>0?"bcdfghjklmnpqrstvwxz":"aeiouy").charAt(r.nextInt(6+(i%2)*14)));}}
daniero,

2
"Java AKA è il linguaggio più prolisso mai creato" - Hai mai provato Shakespeare ? ;-)
arte

1
@manatwork, non dimenticare di rimuovere l'importazione dopo averla utilizzata per essere utilizzata in un solo posto.
Peter Taylor,

1
@manatwork forse ci piace lisp ?? ok, scusa,
porterò

3

Javascript, 85

for(r=Math.random,s="",i=5;i--;)s+="bcdfghjklmnpqrstvwxz"[20*r()|0]+"aeiouy"[6*r()|0]

Se eseguito dalla console, viene mostrato l'output. La visualizzazione esplicita aggiungerebbe alert(s)8 caratteri, ancora più breve rispetto alle altre soluzioni JS.

Grazie C5H8NNaO4 e Howard!


Bello, salva un personaggio rimuovendo l'ultimo ';'
C5H8NNaO4,

1
Invece di ~~(###)te puoi scrivere ###|0che salva 4 caratteri.
Howard,

3

Javascript, 135 122 96 86 caratteri

s='';c=5;r=Math.random;while(c--)s+='bcdfghjklmnpqrstvwxz'[r()*20|0]+'aeiouy'[r()*6|0]


3

Strumenti Unix: 73 byte

E tempo di esecuzione non garantito :)

</dev/urandom grep -ao '[aeiouy][bcdfghjklmnpqrstvwxz]'|head -5|paste -sd ''

L'unico problema è che la stringa generata inizierà ogni volta con una "vocale".

(modifica: cambiato ' 'in ''in args of paste) (un'altra modifica: rimosso -P dalle opzioni grep, grazie a manatwork )


Qualcosa potrebbe essere messo a punto intorno ai grepparametri. Ho ricevuto "of a ap ap ak".
arte

Hmm ... strano. Non ho niente del genere. Ho pensato che -asarebbe bastato.
Pgy

1
Il mio test indica che -Pè quello. Sembra che l'uomo metta in guardia sul suo stato altamente sperimentale con una ragione. ( grep2.16) Ma funziona bene anche senza -P.
arte

Hai ragione, grazie, non l'ho considerato. Non so nemmeno perché l'ho usato -Pin primo luogo. Modificherò la mia risposta.
Pgy

1
A proposito, tr -d \\nè più breve per unire le linee.
arte

3

Pyth, 26 caratteri

J-G"aeiouy"VT=k+kOJ=J-GJ;k

Puoi provarlo nel compilatore online qui.

Qualcuno ha pubblicato una sfida molto simile ma è stata chiusa dopo che avevo fatto una soluzione. Non me ne sono reso conto, ma questa domanda precede la creazione di Pyth. Comunque, ecco la ripartizione:

J                             Set string J equal to:
  G                            the entire alphabet (lowercase, in order)
 - "aeiouy"                    minus the vowels
           VT                 For n in range(1, 10):
             =k                   Set string k to:
                k                  k (defaults to empty string)
               + OJ                plus a random character from J
                   =J             Set J to:
                      G            the entire alphabet
                     - J           minus J
                        ;     End of loop
                         k    print k

Ogni volta che viene eseguito il ciclo, J passa dall'essere un elenco di consonanti a un elenco di vocali. In questo modo possiamo semplicemente scegliere una lettera casuale da J ogni volta.
Potrebbe esserci un modo per inizializzare J nel loop o rimuovere le assegnazioni esplicite dal loop, ma non ho ancora avuto successo con nessuno dei due.


1
Generalmente le vecchie domande vengono considerate valide. Tuttavia, quando usi un linguaggio più recente della domanda (ho creato Pyth nel 2014) dovresti notare questo nella tua risposta.
Isaacg

Grazie per avermi chiarito. Non mi ero reso conto che Pyth fosse stato creato dopo questa domanda e l'ho aggiunto alla risposta.
Mike Bufardeci,

3

APL 30 26

,('EIOUY'∪⎕A)[6(|,+)⍪5?20]

La spiegazione è molto simile alla versione precedente, appena riordinata un po 'per golfare la soluzione.

Nota: ⎕IO è impostato su 0


('EIOUY'∪⎕A)[,6(|,(⍪+))5?20]

Spiegazione:

'EIOUY'∪⎕A    puts vowels in front of all letters.
5?20            for the indexes we start choosing 5 random numbers between 0 and 19
6(|,(⍪+))        then we sum 6 and the random numbers, convert to 5x1 matrix (⍪), add a column before this one containing 6 modulo the random numbers. 
                [[[ this one can be rewritten as: (6|n) , ⍪(6+n)  for easier understanding]]]
,6(|,(⍪+))5?20  the leading comma just converts the matrix to a vector, mixing the vowel and consonants indexes.

Tryapl.org


1
('AEIOUY'∪⎕A) ≡ (∪'AEIOUY',⎕A)ma è più corto di un byte.
lstefano,

1
Rimandare "A" per ⎕Asalvare un altro byte:,('EIOUY'∪⎕A)[6(|,+)⍪5?20]
Adám,

Bello! fino al 26. Grazie
Moris Zucca il

2

PHP 79 byte

<?for($c=bcdfghjklmnpqrstvwxz,$v=aeiouy;5>$i++;)echo$c[rand()%20],$v[rand()%6];

Abbastanza conciso.


2

C: 101

main(){int x=5;while(x-->0){putchar("bcdfghjklmnpqrstvwxyz"[rand()%21]);putchar("aeiou"[rand()%5]);}}

2

Javascript, 104 87

a="";for(e=10;e--;)a+=(b=e&1?"bcdfghjklmnpqrstvwxz":"aeiouy")[0|Math.random()*b.length]

ho giocato a golf un sacco di cose semplici e superflue, non ancora belle come quelle di Copys

Oh, e quello appena opposto durante il golf: "dydudelidu"

Ora ne ho provato uno usando l'approccio dei 2 personaggi contemporaneamente. Si scopre che è quasi lo stesso del secondo di Copys, quindi non posso contarlo, anche a 79. a="";for(e=5;e--;)a+="bcdfghjklmnpqrstvwxz"[m=0|20*Math.random()]+"aeiouy"[m%6]


2

Brachylog , 9 byte

Ḍ;Ẉṣᵐzh₅c

Provalo online!

Fornisce l'output come un elenco di lettere attraverso la variabile di output.

   ṣ         Randomly shuffle
 ;  ᵐ        both
Ḍ            the consonants without y
  Ẉ          and the vowels with y,
     z       zip them into pairs,
      h₅     take the first five pairs,
             and output
        c    their concatenation.

1

F # , 166 caratteri

open System;String.Join("",(Random(),"aeiouybcdfghjklmnpqrstvwxz")|>(fun(r,s)->[0..5]|>List.collect(fun t->[s.Substring(6+r.Next()%20,1);s.Substring(r.Next()%6,1)])))

1

K, 40 byte

,/+5?/:("bcdfghjklmnpqrstvwxz";"aeiouy")

5?"abc" genererà 5 lettere casuali dalla stringa specificata.

5?/: genererà 5 lettere casuali da ciascuna delle stringhe a destra, producendo due elenchi.

+ traspone quelle due liste, dandoci una lista di tuple con un carattere casuale dal primo elenco e poi uno dal secondo elenco.

,/ è "raze" - fonde insieme tutte quelle tuple in sequenza.

K5 può farlo in 33 byte costruendo l'alfabeto in modo più intelligente e quindi usando "tranne" ( ^) per rimuovere le vocali, ma K5 è troppo nuovo per essere legale in questa domanda:

,/+5?/:((`c$97+!26)^v;v:"aeiouy")

1

R, 83 byte

cat(outer((l<-letters)[a<-c(1,5,9,15,21,25)],l[-a],paste0)[sample(1:120,5)],sep="")

Genera tutte le possibili sequenze consonanti vocaliche in una matrice, quindi campionane a caso 5, producendo una parola di 10 lettere.



0

Gelatina , 13 byte

Øy,ØYẊ€Zs5ḢŒl

Spiegazione:

Øy,ØYẊ€Zs5ḢŒl
Øy,ØY         Makes a list of two lists of characters: [[list-of-vowels-with-y], [list-of-consonants-without-y]]
     Ẋ€       Shuffle €ach.
       Z      Zip those two lists together. [[random-vowel, random-consonant],...]
        s5    Split them into chunks of five (because each pair contains two letters, this splits them into chunks of 10 letters)
          Ḣ   Take the list of 5 pairs.
           Œl Make each of the characters in it lowercase
              Implicit concatenation and print.

Provalo online!

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.