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.


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 .


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

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.


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

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]

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


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

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

4

J (51)

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

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.


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


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

}


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!


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]

3

PHP, 100 caracteres

<?while($i<6){echo substr('bcdfghjklmnpqrstvwxz',rand(0,20),1).substr('aeiouy',rand(0,5),1);$i++;}?>

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 )


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.


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


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.


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]

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]


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.

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

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

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.



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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.