Gere uma palavra pronunciável

16

O desafio é simples:

gerar uma palavra.

Especificações:

  • A palavra deve ser pronunciável.
    • Isso é definido como "alternando entre uma consoante e uma vogal".
    • Uma consoante é uma das seguintes letras: bcdfghjklmnpqrstvwxz
    • Uma vogal é uma das seguintes letras: aeiouy
  • O Word deve ser gerado aleatoriamente.
  • As palavras devem poder conter todas as consoantes e vogais. (Você não pode usar apenas bcdfconsoantes e aeivogais.)
  • O Word deve conter 10 letras.
  • O código mais curto (na contagem de caracteres) vence.
Maçaneta da porta
fonte
7
Com esta faixa xkcd em mente, o programa echo buxitiwymuestá em conformidade tecnicamente com a especificação. Garanto-lhe que gerei a palavra aleatoriamente: P
AardvarkSoup
11
@AardvarkSoup "As palavras devem poder conter todas as consoantes e vogais"
Maçaneta da porta
11
O @Kartik depende do contexto, em 'sim' é uma consoante, em 'por que' é uma vogal, mas isso tornaria impossível definir uma palavra pronunciável como alternando entre vogais e consoantes, por exemplo. aaaaaaaa seria uma palavra válida.
CJStuart
11
Na verdade, eu criei um gerador no Scratch há um tempo. Ele tinha regras específicas para quando você pode tratar ycomo uma vogal, onde você pode usar qe x, e quando você pode usar combinações de duas letras como ngouea
Esolanging Fruit

Respostas:

7

GolfScript, 32 caracteres

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

Execute-o online .

Howard
fonte
8

Ruby: 56 caracteres

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

Exemplo de saídas:

  • itopytojog
  • umapujojim
  • ipagodusas
  • yfoqinifyw
  • ebylipodiz
Paul Prestidge
fonte
11
'aeiouy'.charsseria um caractere mais curto.
19613 Howard
@Howard então o operador de subtração levantaTypeError: can't convert Enumerator into Array
John Dvorak
@ JanDvorak Desculpe, esqueci de mencionar que você precisa do Ruby 2.0 para esse truque.
21913 Howard Howard
7

Python, 81

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

Boa sorte em pronunciá-los.

grc
fonte
Eles são realmente muito fácil de pronunciar, por exemplo, a primeira palavra que recebi foi "viketuziwo":P
Doorknob
@ Doorknob talvez seja apenas a minha sorte. Eu continuo recebendo 'palavras' como "qijepyjyga". Tentativas do meu computador pronunciar-los compensar isso embora :)
grc
3
Eu me diverti muito fazendo python grc.py | sayna minha máquina. Obrigado pela ideia.
Kaya
7

COBOL, 255

Então, eu estou aprendendo COBOL no momento. Usou essa pergunta como alguma prática. Tentei jogar golfe.

É 255 sem o espaço em branco à esquerda e 286 bytes com.

Pelo que vale a pena, isso é executado no Microfocus COBOL para VS2012, e não tenho idéia se será executado em outro lugar.

       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
Cereal
fonte
6

APL (34)

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

JavaScript, 74

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

Não gera todas as combinações, mas acho que todas as consoantes e vogais aparecem.

JavaScript, 79

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

Versão mais "aleatória".

cópia de
fonte
Para que serve ^0?
Alpha
11
@ Alpha Math.randomdá um float, precisamos de um número inteiro. ^0trunca o número
copie
Truque inteligente. Eu nunca vi o ^operador em JavaScript antes e menos ouvi falar em usá-lo para truncar um float. Obrigado!
Alpha
@copy i como o uso de^
Math chiller
4

Ruby: 70 66 caracteres

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

Exemplo de execução:

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
homem a trabalhar
fonte
Você pode usar 10.timespor um char a menos.
Howard
11
Além disso, a pergunta não exige que cada letra tenha a mesma probabilidade. *10-> *4, pule *3, rand 60-> rand 20e você salvou 3 caracteres.
19413 Howard
Boa captura da regra, @Howard. Obrigado.
manatwork
4

R: 105 caracteres

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="")
plannapus
fonte
4

J (51)

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

Processamento, 100 99 93 87

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

Após uma inspeção mais minuciosa da questão, vejo que ela não requer nenhuma saída. Eu ajustei isso de acordo.

Cereal
fonte
3

Objetivo-C, 129

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

Com a ajuda de Daniero

(Adoro usar o operador tende a (->)

jsedano
fonte
3

Java AKA, a linguagem mais detalhada já criada, 176 com a ajuda da maçaneta da porta, Daniero e Peter Taylor (obrigado pessoal!)

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

}

jsedano
fonte
11
Melhorias sugeridas: Altere String a[]para String[]a(-1 caracteres), altere w W = new w();para w W=new w();(-2 caracteres)
Maçaneta da porta
Sugestões: que a palavra sempre comece com uma consoante (ou wovel); não há necessidade de randomizar isso quando a pergunta não a mencionar! Portanto, pule o booleano fe use i%2. Além disso, o forloop pode ser encurtado, e você pode colocar as duas strings dentro do operador condicional (também, não há necessidade de parênteses aqui) e usá-las charAtexternamente. Aqui está a coisa toda, 195 PERSONAGENS, 38 SALVO :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, a linguagem mais detalhada já criada” - Já experimentou Shakespeare ? ;-)
manatwork
11
@manatwork, não se esqueça de remover a importação depois de usá-la em apenas um lugar.
Peter Taylor
11
@manatwork talvez gostemos de lisp ?? ok, desculpe, vou levar os parêntesis para fora quando eu chegar em casa do trabalho
jsedano
3

Javascript, 85

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

Se executado a partir do console, a saída é mostrada. A exibição explícita seria adicionada alert(s)em 8 caracteres, ainda mais curta que as outras soluções JS.

Obrigado C5H8NNaO4 e Howard!

tomsmeding
fonte
Legal, salve um personagem removendo o último ';'
C5H8NNaO4
11
Em vez de ~~(###)você pode escrever o ###|0que economiza 4 caracteres.
Howard
3

Javascript, 135 122 96 86 caracteres

s='';c=5;r=Math.random;while(c--)s+='bcdfghjklmnpqrstvwxz'[r()*20|0]+'aeiouy'[r()*6|0]
Maçaneta da porta
fonte
3

PHP, 100 caracteres

<?while($i<6){echo substr('bcdfghjklmnpqrstvwxz',rand(0,20),1).substr('aeiouy',rand(0,5),1);$i++;}?>
Juan José Sedano
fonte
acually Eu acho que é 100 caracteres longo
Cristian Lupascu
3

Ferramentas Unix: 73 bytes

E não garantido tempo de execução :)

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

O único problema é que a string gerada começará com uma "vogal" toda vez.

(edit: alterado ' 'para ''no args of paste) (outra edição: -P removido das opções grep, graças ao manatwork )

pgy
fonte
Algo pode ser ajustado com precisão nos grepparâmetros. Eu recebi "do e ap ag ak".
Manatwork
Hmm ... estranho. Eu não tenho nada disso. Eu pensei -aque seria o suficiente.
PgY
11
Meu teste indica que -Pé esse. Parece que o homem adverte sobre seu status altamente experimental por um motivo. ( grep2.16) Mas de qualquer maneira, funciona bem sem -P.
Manatwork
Você está certo, obrigado, eu não considerei isso. Eu nem sei por que usei -Pem primeiro lugar. Vou editar minha resposta.
pgy 4/02/15
11
A propósito, tr -d \\né mais curto para juntar as linhas.
manatwork
3

Pitão, 26 caracteres

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

Você pode experimentá-lo no compilador online aqui.

Alguém postou um desafio muito semelhante, mas foi fechado depois que eu fiz uma solução. Eu não percebi, mas essa questão é anterior à criação de Pyth. Enfim, aqui está o detalhamento:

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

Toda vez que o loop é executado, J passa de uma lista de consoantes para uma lista de vogais. Dessa forma, podemos escolher uma letra aleatória de J de cada vez.
Pode haver uma maneira de inicializar J no loop ou remover as atribuições explícitas do loop, mas ainda não tive sucesso.

Mike Bufardeci
fonte
11
Colocar perguntas antigas é geralmente considerado bom. No entanto, quando você usa um idioma mais recente que a pergunta (criei Pyth em 2014), observe isso em sua resposta.
Isaacg
Obrigado por esclarecer isso para mim. Não percebi que Pyth foi criado após esta pergunta e adicionei isso à resposta.
Mike Bufardeci
3

APL 30 26

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

A explicação é muito semelhante à versão anterior abaixo, apenas reordenada um pouco para resolver a solução.

Nota: ⎕IO está definido como 0


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

Explicação:

'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

Moris Zucca
fonte
11
('AEIOUY'∪⎕A) ≡ (∪'AEIOUY',⎕A)mas é um byte mais curto.
Lstfano
11
Adiar 'A' para ⎕Asalvar outro byte:,('EIOUY'∪⎕A)[6(|,+)⍪5?20]
Adám
Agradável! até 26. Obrigado
Moris Zucca
2

PHP 79 bytes

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

Bastante conciso.

primo
fonte
2

C: 101

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

Javascript, 104 87

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

jogava um monte de coisas desnecessárias e simples, ainda não tão legais quanto as de copys

Ah, e esse acabou de aparecer durante o golfe: "dydudelidu"

Agora eu tentei um usando os 2 caracteres de uma só vez. Acontece que é quase o mesmo que o segundo dos copys, então não posso contar, também aos 79. a="";for(e=5;e--;)a+="bcdfghjklmnpqrstvwxz"[m=0|20*Math.random()]+"aeiouy"[m%6]

C5H8NNaO4
fonte
2

Braquilog , 9 bytes

Ḍ;Ẉṣᵐzh₅c

Experimente online!

Dá saída como uma lista de letras através da variável de saída.

   ṣ         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.
String não relacionada
fonte
1

F # , 166 caracteres

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)])))
Shredderroy
fonte
1

K, 40 bytes

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

5?"abc" irá gerar 5 letras aleatórias a partir da string especificada.

5?/: irá gerar 5 letras aleatórias de cada uma das strings à direita, produzindo duas listas.

+ transpõe essas duas listas, fornecendo uma lista de tuplas com um caractere aleatório da primeira lista e, em seguida, uma da segunda lista.

,/ é "arrasar" - fundir todas essas tuplas em sequência.

O K5 pode fazer isso em 33 bytes, construindo o alfabeto de maneira mais inteligente e usando "exceto" ( ^) para remover as vogais, mas o K5 é novo demais para ser legal nesta questão:

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

R, 83 bytes

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

Gere todas as sequências consoantes de vogal possíveis em uma matriz e, em seguida, faça uma amostra aleatória de 5 delas, produzindo uma palavra de 10 letras.

rturnbull
fonte
0

Gelatina , 13 bytes

Øy,ØYẊ€Zs5ḢŒl

Explicação:

Ø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.

Experimente online!

Camarada SparklePony
fonte