Insta-Name… Basta adicionar o codificador!


17

No idioma inglês, uma maneira infalível de fazer uma combinação de letras sem sentido pronunciada é transformá-la inteiramente em pares consoantes-vogais, por exemplo, Wu ko pa ha ou, Me fa ro , consoante primeiro, seguido pela vogal .

Desafio:

Escreva um programa ou função que, com um número especificado de letras do usuário, crie um nome aleatório usando esse princípio. É simples assim.

Entrada:

Um número inteiro maior ou igual a 2 que designa o número necessário de letras na saída. A entrada pode ser obtida de STDIN, argumentos de linha de comando ou argumentos de função.

Resultado:

Uma sequência de comprimento especificado contendo pares consoante-vogal selecionados aleatoriamente. Pode ser impresso em STDOUT ou na alternativa mais próxima ou retornado no caso de uma função.

Regras:

  1. Cada consoante do alfabeto inglês deve ter a mesma probabilidade de ser selecionada para o primeiro caractere de cada par, e cada vogal do alfabeto inglês deve ter a mesma probabilidade de ser selecionada para o segundo caractere de cada par.
  2. Pares de letras podem ser repetidos.
  3. Como esse é um nome, a primeira letra deve ser maiúscula.
  4. Se a entrada for ímpar, um par de letras selecionado aleatoriamente no nome deve ter y ou h anexado ao final. A escolha de y ou h também deve ser aleatória.
  5. As brechas padrão não são permitidas.
  6. O menor código em bytes vence.

Definições das letras:

Consoantes:

bcdfghjklmnpqrstvwxyz

Vogais:

aeiou

Exemplo de E / S:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Desfrutar!


3
E, a propósito, bem-vindo à programação Puzzles e Código Golf.SE :)
Trichoplax

Eu acho que meu novo formato é mais claro. É isso? @trichoplax
jman294

11
Coloco todas as minhas perguntas em potencial na sandbox, onde elas podem obter muitos comentários antes de postar aqui. Isso facilita as coisas - eu o recomendo para perguntas futuras.
Trichoplax

Obrigado, @alex, Como esta é minha primeira pergunta, agora conheço uma boa técnica sobre como usar este site. Eu aprendi muito e espero que minha próxima pergunta seja melhor!
precisa saber é o seguinte

11
@ASCIIThenANSI De acordo com a regra 4, um par de letras selecionado aleatoriamente receberá ay ou h. Nesse exemplo, foi ko quem obteve h, não ha . jman: Se não era isso que você tinha em mente, modifique as regras rapidamente antes que mais respostas apareçam!
Alex A.

Respostas:



6

JavaScript ES6, 187 180 168 bytes

f=l=>{r=m=>Math.random()*m|0
d=l%2&&r(--l/2)*2+1
for(s='';l--;s+=s?a:a.toUpperCase())a=l%2?'bcdfghjklmnpqrstvwxyz'[r(21)]:'aeiou'[r(5)]+(l==d-1?'hy'[r(2)]:'')
return s}

Edit: Eu mudei de usar regex replace para um loop simples, o que melhorou consideravelmente o comprimento. Código não-bloqueado e interface do usuário abaixo. Insira um número negativo por sua conta e risco, porque ele faz um loop infinito. (Obrigado ao unclemeat por apontar isso.)

f=function(l){
  // Function to return a random integer between 0 and m-1 inclusive
  r=function(m){
    return Math.random()*m|0
  }
  // d is the position the h or y will be added
  // l is decremented only if l is odd so an extra consonant won't be added to the end
  d=l%2&&r(--l/2)*2+1
  
  for(s='';l--;){
    a=l%2?'bcdfghjklmnpqrstvwxyz'[r(21)]:'aeiou'[r(5)]+(l==d-1?'hy'[r(2)]:'')
    // If `s` is empty (i.e. this is the first leter), make it uppercase
    s+=s?a:a.toUpperCase()
  }
  return s
}

run=function(){ip=parseInt(document.getElementById('input').value);if(ip<2)return alert('Input must be greater than one.');document.getElementById('output').innerHTML=f(ip)};document.getElementById('run').onclick=run;run()
<input type="number" id="input" value="7" min="2" /><button id="run">Run</button><br />
<pre id="output"></pre>


11
Nota: Não coloque um número negativo para a UI teste ..
unclemeat

4

SWI-Prolog, 286 285 bytes

a(I):-a(I,[]).
a(I,R):-(I=1,r(1,K),nth0(K,`hy`,V),length(R,L),random(1,L,W),nth0(W,[O:P|Q],V:0xFEFF,R);I=0,[O:P|Q]=R),N is O-32,p([N:P|Q]);r(5,A),nth0(A,`aeiou`,X),r(21,B),nth0(B,`bcdfghjklmnpqrstvwxyz`,Y),J is I-2,a(J,[Y:X|R]).
p([A:B|R]):-put(A),put(B),p(R);!.
r(I,R):-random(0,I,R).

Exemplo: a(13).saídas Leqihsekeqira.

Nota: Pode ser necessário substituí-lo `por "se você tiver uma versão antiga do SWI-Prolog.


3

Pitão, 52 42 bytes

V/Q2=k++kO-GJ"aeiou"OJ;rs.SXZck2*%Q2O"hy"4

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

Obrigado a Jakube por jogar ainda mais, o NinjaBearMonkey por esclarecer o desafio e o issacg por criar Pyth e, inadvertidamente, me ensinar sobre X.

Este programa seleciona aleatoriamente uma consoante e uma vogal para preencher a sequência, adiciona 'h' ou 'y' a um par se a entrada for ímpar e, em seguida, coloca o primeiro caractere em maiúscula. Aqui está o detalhamento:

V/Q2                                              For N in range(1, input/2):
    =k                                            Set k to:
        k                                         k (defaults to ""),
       + O G                                      plus a random letter from the alphabet... 
          - J"aeiou"                              without the vowels,
      +             OJ                            plus a random vowel
                      ;                           End the loop
                             ck2                  Chop k into strings of length 2
                           XZ                     Append to the first string:
                                    O"hy"         'h' or 'y' picked at random,
                                *%Q2              repeated input mod 2 times
                         .S                       Shuffle the strings
                        s                         Convert them back to a single string
                       r                 4        Capitalize and print the string

Parece ineficiente anexar 'h' ou 'y' ao primeiro par consoante-vogal e depois embaralhar a lista. Tentei acrescentar um par aleatório, mas o código era sempre maior que isso.


Pyth, e os codificadores que sabem disso, sempre me surpreendem.
precisa saber é

11
Apenas alguns truques: rX1capitalizar X. té a mesma coisa que _P_.
Jakube 07/07

11
Você pode remover a atribuição para J, uma vez que você usa Japenas uma vez.
Jakube 07/07

2
Eu acho que isso adiciona h ou y ao final, não um par selecionado aleatoriamente.
NinjaBearMonkey

@Jakube Mais uma vez obrigado pela sua ajuda!
Mike Bufardeci

2

Perl, 253 238 bytes

@c=split"","bcdfghjklmnpqrstvwxyz";@v=split"","aeiou";@t=();chomp($n=<>);for(1..$n/2){$l=$c[$$=rand(21)];if($_<2){$l=uc$l};push@t,$l.$v[$$=rand(5)]};$x=0;$y=int(rand(@t));for(@t){print;if($x==$y&&$n%2>0){print qw(h y)[int(rand(1))]};$x++}

Provavelmente posso jogar mais, mas isso deve acontecer por enquanto.

Alterar:

  • Salvei 10 bytes sozinho e 5 graças a Alex A.

2

Julia, 141 bytes

n->(R=rand;r=isodd(n)?R(1:n÷2):0;ucfirst(join([string("bcdfghjklmnpqrstvwxyz"[R(1:21)],"aeiou"[R(1:5)],i==r?"yh"[R(1:2)]:"")for i=1:n÷2])))

Isso cria uma função lambda sem nome que aceita um número inteiro como entrada e retorna uma string. tira vantagem do fato de que seqüências de caracteres em Julia podem ser indexadas e referenciadas como matrizes de caracteres. Para chamá-lo, dê um nome, por exemplo f=n->....

Ungolfed + explicação:

function f(n)
    # There will be n÷2 consonant-vowel pairs
    p = n ÷ 2

    # Determine which pair will get a y or h, if any
    r = isodd(n) ? rand(1:p) : 0

    # Consonants and vowels
    c = "bcdfghjklmnpqrstvwxyz"
    v = "aeiou"

    # Randomly select letters for pairs, appending y or h as needed
    s = [string(c[rand(1:21)], v[rand(1:5)], i == r ? "yh"[rand(1:2)] : "") for i in 1:p]

    # Join s into a string and convert the first letter to uppercase
    ucfirst(join(s))
end

Exemplos:

julia> f(9)
"Luyvunize"

julia> f(2)
"Fe"

julia> f(16)
"Pahonapipesafuze"

2

Python 2, 148 169 156

from random import*
I=input()
R=choice
i=I/2
S=[R('hybcdfgjklmnpqrstvwxz')+R('aeiou')for _ in[0]*i]
if I%2:S[R(range(i))]+=R('hy')
print ''.join(S).title()

Edit: Percebeu que não estava em maiúscula a primeira letra. Vou ver se consigo jogar de volta amanhã.
Editar 2: Lembrado, .titlemas acho que será isso.


Se apenas strings suportado atribuição item ...
mbomb007

2

SmileBASIC 2 (Pequeno Computador), 197 177 bytes

EDIÇÃO CONTEMPORÂNEA MAIO 2018 : Esta foi a minha primeira submissão, quase 3 anos atrás! Minhas habilidades melhoraram muito desde então; -20 apenas com pequenos ajustes.

Começa com um prompt (é deixado em branco para salvar bytes, então é apenas um?) Onde você coloca o comprimento (armazenado na variável L).

C$="bcdfgjklmnpqrstvwxzhyaeiou"INPUT L
J=0 OR L/2K=-1IF L%2THEN K=RND(J)
FOR I=0TO J-1?CHR$(ASC(MID$(C$,RND(21),1))-32*!I)+MID$(C$,RND(5)+21,1)+MID$(C$,RND(2)+19,1)*(K==I);
NEXT

Tenho certeza de que participar de uma linguagem obscura do BASIC não vai me dar nada além de looks estranhos, mas consegui torná-lo bem pequeno para o BASIC. Ele tira proveito das peculiaridades estranhas do SB (como condicionais avaliando como 1 ou 0, já que não há tipo booleano) para eliminar o máximo de bytes possível quando escrevi isso às 3 da manhã.


1

Marbelous, 203 bytes

}0}0@1
>>^0&1
--=0@1FF
??&0}0&0
&1
qqqqqq\\\\
//\\pppppp
:p
0000
?K\\?4..}2
<G++<4+5=0\/}0
<B++<3+5?111>1!!
<6++<2+3Mult-2
<3++<1+3+7}2{<
++//mm//mm--
mm..{1..{2{>
{0
:q
}2{2}0
pppppp{0{1
-W
:m
}061
{0{0

Teste aqui (intérprete online). Entrada via argumentos. Bibliotecas e placas cilíndricas devem estar ativadas.

Versão comentada / legível:

}0 }0 @1 .. .. # 1st column: generate a number from 0 to length/2-1, wait on &1
>> ^0 &1 .. .. # 2nd column: check bottom bit; if zero activate &1, otherwise &0
-- =0 @1 FF .. # FF (wait on &0): if no h/y, set counter to 255 (0xFF)
?? &0 }0 &0 .. # Send copy of full length to :q
&1 .. .. .. .. 
qq qq qq \\ \\ # Call :q with counter and length
// \\ pp pp pp # Output of :q falls into :p, which is called repeatedly until done

:p                      # prints a consonant/vowel pair, and h/y if needed
00 00 .. .. .. .. .. .. # two zeros, to be passed into ?K and ?4
?K \\ ?4 .. }2 .. .. .. # pass through ?K (0-20 = consonants) and ?4 (0-4 = vowels)
<G ++ <4 +5 =0 \/ }0 .. # 1st/2nd column: add 1-4 to skip vowels
<B ++ <3 +5 ?1 11 >1 !! # 3rd/4th column: add 3/6/11/16 to create nth vowel
<6 ++ <2 +3 Mu lt -2 .. # 5th/6th column: if counter is 0, generate either h or y 
<3 ++ <1 +3 +7 }2 {< .. # 7th/8th column: if length left to print is 0-1, terminate
++ // mm // mm -- .. .. # mm: add 'a'. 1st/2nd start at 'b' (++)
                        #              5th/6th start at 'h' (+7)
mm .. {1 .. {2 {> .. .. # output consonant, vowel, h/y to {0, {1, {2
{0 .. .. .. .. .. .. .. # left input (length left): -2 + output to left
                        # right input (counter until print h/y): -1 + output to right

:q             # calls :p, but with the first letter capitalized
}2 {2 }0 .. .. # {2 is an unused output which prevents exit when all outputs are filled
pp pp pp {0 {1 # call :p, and forward return outputs to MB to start loop
-W .. .. .. .. # subtract W (0x20) from the first letter = capitalize it

:m    # add 0x61 ('a')
}0 61
{0 {0 # input + 0x61 is returned

Isso é aproximadamente equivalente ao seguinte pseudocódigo ( random(a,b)gera números entre ae binclusive):

main(length)
    if length & 0x01 == 0 then
        counter, length_left = q(0xFF, , length)
    else
        counter, length_left = q(random(0, (length >> 1) - 1), , length)
    end
    while true do
        length_left, counter, consonant, vowel, hy = p(length_left, , counter) 
        print consonant, vowel, hy
    end
p(length_left, , counter)
    if length_left <= 1 then terminate_program end
    consonant = random(0, 20)
    switch consonant
        case >16: ++consonant
        case >11: ++consonant
        case >6:  ++consonant
        case >3:  ++consonant
    ++consonant
    consonant = m(consonant)
    vowel = random(0, 4)
    switch vowel
        case >4: vowel += 5
        case >3: vowel += 5
        case >2: vowel += 3
        case >1: vowel += 3
    vowel = m(vowel)
    if counter == 0 then
        hy = random(0, 1) * 0x11
        hy += 7
        hy = m(hy)
    return length_left - 2, counter - 1, consonant, vowel, hy
q(counter, , length_left)
    length_left, counter, consonant, vowel, hy = p(length_left, , counter)
    print consonant - 0x20, vowel, hy
    return counter, length_left
m(number)
    return number + 'a'

1

Ruby, 119 bytes

13 bytes para capitalizar ...

->n{z=(0...n/2).map{([*(?a..?z)]-v=%w[a e i o u]).sample+v.sample}
n.odd?&&z[rand n/2]+='yh'[rand 2]
(z*'').capitalize}

Uso:

f=
->n{z=(0...n/2).map{([*(?a..?z)]-v=%w[a e i o u]).sample+v.sample}
n.odd?&&z[rand n/2]+='yh'[rand 2]
(z*'').capitalize}

2.upto(20) do |i|
  puts f[i]
end

Resultado:

Qo
Gah
Gilu
Baygu
Tevaba
Rohyori
Jigupadi
Diguvareh
Bidifenaji
Xohsuyileze
Depixoyizili
Boqizurejupiy
Buhuboketedasa
Vuwuhojetayduno
Forigikedawojawe
Qacetihxiheciyaju
Zoqigafukedugusoku
Bavuhlarofetucebapi
Zusiraxoxureqimavugo

0

C, 219 caracteres

Parece funcionar, ainda sou novo nisso.

char o[]="aeiouqwrtypsdfghjklzxcvbnm";n,i=0;main(int h,char**v){n=atol(v[1]);srand(time(0));h=n%2;for(;i<n-n%2;i+=2)printf("%c%c%c",o[rand()%21+5]-(i?0:32),o[rand()%5],(rand()%(n-1)<(i+2)&h)?h=0,'h'+(rand()%2?17:0):0);}

11
Você precisa, em rand()%(n-1-i)<2vez de rand()%(n-1)<(i+2)obter uma distribuição uniforme, a menos que gere esse número aleatório apenas uma vez e salve-o em algum lugar.
21715

Cada caractere é um byte ou quantos bytes ele possui?
precisa saber é o seguinte

@ jman294 Como o alfabeto ASCII usa 8 bits por caractere, um caractere é de um byte. Você realmente só precisa usar bytes se estiver usando caracteres não ASCII, como o 🙋que usa mais de um byte.
Beta Decay

0

R, 166 bytes

Leva a entrada de STDIN e sai para STDOUT.

l=letters;s=sample;n=scan();v=c(1,5,9,15,21);o=rbind(s(l[-v],i<-n/2),s(l[v],i,T));if(n%%2)o[a]=paste0(o[a<-s(i,1)*2],s(c('h','y'),1));o[1]=toupper(o[1]);cat(o,sep='')

Explicação

# Alias letters and sample
l=letters;
s=sample;
# Get input
n=scan();
# Vowel positions
v=c(1,5,9,15,21);
# Create a matrix with a row of 
# consonants and a row of vowels 
o=rbind(s(l[-v],i<-n/2),s(l[v],i,T));
# If odd paste either h or y to a vowel
if(n%%2)o[a]=paste0(o[a<-s(i,1)*2],s(c('h','y'),1));
# Upper case first letter
o[1]=toupper(o[1]);
# Output
cat(o,sep='')

Alguns testes

> l=letters;s=sample;n=scan();v=c(1,5,9,15,21);o=rbind(s(l[-v],i<-n/2),s(l[v],i,T));if(n%%2)o[a]=paste0(o[a<-s(i,1)*2],s(c('h','y'),1));o[1]=toupper(o[1]);cat(o,sep='')
1: 13
2: 
Read 1 item
Vetigiysurale
> l=letters;s=sample;n=scan();v=c(1,5,9,15,21);o=rbind(s(l[-v],i<-n/2),s(l[v],i,T));if(n%%2)o[a]=paste0(o[a<-s(i,1)*2],s(c('h','y'),1));o[1]=toupper(o[1]);cat(o,sep='')
1: 12
2: 
Read 1 item
Mucowepideko

0

K5, 131 bytes

{r:(`c$-32+c@1?#c),{*d@1?#d:(v;(c::(`c$97+!26)^v::"aeiou"))@2!x}'1+1_!x;$[x=p:2*_x%2;r;,/(*w),("yh"@1?2),*|w:(0,2+2**1?_(#r)%2)_r]}

Isso NÃO funcionará no Kona ou no kdb +; você precisa usar um intérprete K5 como oK .

Demonstração ao vivo. (Tente definir 5no final um número diferente para tentar entradas diferentes.)


0

Rubi, 316 238 216 caracteres

v=%w{a e i o u};c=[];(?a..?z).map{|i|v.include?(i)||c.push i};combos=[];c.map{|i| v.map{|j| combos.push i+j}};i=gets.to_i;o="";(i/2).times{o+=combos.sample};if i%2==1;(rand(4)==1?o+=?y:o+=?h); end; puts o.capitalize;

Combinações de números ímpares terminam em hou y.

Obrigado a @blutorange por um dicionário completo de dicas de golfe em rubi.

Uau, reduzi meu código em 100 caracteres.


Os combos extras são desnecessários. Eu acho que alguns espaços em branco também são desnecessários. Talvez dê uma olhada em algumas dicas para jogar golfe no Ruby para ajudar a diminuir o seu código. Além disso, isso requer entrada?
Alex A.

Sim, é preciso entrada, os combos extras eram necessários para ganhar pontos extras antes que a pergunta fosse refeita, e eu pensei que eles ainda funcionariam. jfoi um erro de digitação.
clap

Apenas alguns truques com ruby: for i in ?a..?z;...;endpodem ser substituídos por (?a..?z).map{...}; O thendepois ifé opcional. v.include?(i)||c.push(i)é a abreviação de unless v.include?(i);c.push(i). Use c<<ipara c.push(i). c.map{}é mais curto que c.each{}. i%2==1?1:2é a abreviação de if i%2==1;1;else;2;end. O print "Enter..."não é necessário no codegolf; )
blutorange

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.