Insta-Name ... ¡Solo agregue el codificador!


17

En el idioma inglés, una forma segura de hacer una combinación de letras sin sentido pronunciable es hacerlo completamente de pares de consonantes-vocales, por ejemplo, Wu ko pa ha , o, Me fa ro , consonante primero, seguido de vocal .

Desafío:

Escriba un programa o función que, dado un número de letras especificado por el usuario, cree un nombre aleatorio utilizando este principio. Es así de simple.

Entrada:

Un entero mayor o igual a 2 que designa el número requerido de letras en la salida. La entrada puede tomarse de STDIN, argumentos de línea de comando o argumentos de función.

Salida:

Una cadena de la longitud dada que contiene pares de consonantes-vocales seleccionados al azar. Puede imprimirse en STDOUT o en la alternativa más cercana o devolverse en el caso de una función.

Reglas:

  1. Cada consonante del alfabeto inglés debe tener la misma probabilidad de ser seleccionada para el primer carácter de cada par, y cada vocal del alfabeto inglés debe tener la misma probabilidad de ser seleccionada para el segundo carácter de cada par.
  2. Los pares de letras pueden repetirse.
  3. Como se trata de un nombre, la primera letra debe estar en mayúscula.
  4. Si la entrada es impar, un par letra seleccionada aleatoriamente en el nombre debería tener y o h adjunta al final. La elección de y o h también debe ser aleatoria.
  5. Las lagunas estándar no están permitidas.
  6. El código más pequeño en bytes gana.

Definiciones de letras:

Consonantes

bcdfghjklmnpqrstvwxyz

Vocales:

aeiou

Ejemplo de E / S:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

¡Disfrutar!


3
Y, por cierto, bienvenidos a Programming Puzzles y Code Golf.SE :)
trichoplax

Creo que mi nuevo formato es más claro. ¿Lo es? @trichoplax
jman294

1
Publico todas mis preguntas potenciales en el sandbox donde pueden obtener muchos comentarios antes de publicar aquí. Facilita las cosas. Lo recomiendo para futuras preguntas.
trichoplax

Gracias, @alex, dado que esta es mi primera pregunta, ahora conozco algunas buenas técnicas sobre cómo usar este sitio. ¡Aprendí mucho y espero que mi próxima pregunta sea mejor!
jman294

1
@ASCIIThenANSI Según la regla # 4, un par de letras seleccionado al azar obtendrá ay o h. En ese ejemplo, fue ko el que obtuvo la h, no la ha . jman: Si eso no es lo que tenía en mente, ¡mejor modifique las reglas rápidamente antes de que comiencen a llegar más respuestas!
Alex A.

Respuestas:



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}

Editar: Cambié de usar regex replace a un simple for loop, lo que mejoró considerablemente la longitud. Código sin golf y prueba de interfaz de usuario a continuación. Ingrese un número negativo bajo su propio riesgo porque hace un bucle infinito. (Gracias a Unclemeat por señalar eso).

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>


1
Nota: No se ponga un número negativo en la prueba de interfaz de usuario ..
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).

Ejemplo: a(13).salidas Leqihsekeqira.

Nota: es posible que deba reemplazarlo `por "si tiene una versión anterior de SWI-Prolog.


3

Pyth, 52 42 bytes

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

Puedes probarlo en el compilador en línea aquí.

Gracias a Jakube por jugarlo aún más, a NinjaBearMonkey por aclarar el desafío, y por la creación de Pyth y sin querer enseñándome sobre X .

Este programa selecciona aleatoriamente una consonante y una vocal para llenar la cadena, agrega 'h' o 'y' a un par si la entrada es impar, luego capitaliza el primer carácter. Aquí está el desglose:

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 agregar 'h' o 'y' al primer par consonante-vocal y luego mezclar la lista. Intenté agregar un par aleatorio, pero el código siempre fue más largo que esto.


Pyth, y los programadores que lo saben, siempre me sorprenden.
jman294

1
Solo algunos trucos: rX1capitaliza X. tes lo mismo que _P_.
Jakube

1
Puede eliminar la asignación a J, ya que la usa Jsolo una vez.
Jakube

2
Creo que esto agrega h o y al final, no un par seleccionado al azar.
NinjaBearMonkey

@Jakube Gracias una vez más por tu ayuda!
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++}

Probablemente pueda seguir jugando al golf, pero esto debería hacerlo por ahora.

Cambios:

  • Ahorré 10 bytes por mí mismo, y 5 gracias 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])))

Esto crea una función lambda sin nombre que acepta un entero como entrada y devuelve una cadena. aprovecha el hecho de que las cadenas en Julia pueden indexarse ​​y referenciarse como matrices de caracteres. Para llamarlo, dale un nombre, por ejemplo f=n->....

Ungolfed + explicación:

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

Ejemplos:

julia> f(9)
"Luyvunize"

julia> f(2)
"Fe"

julia> f(16)
"Pahonapipesafuze"

2

Pitón 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()

Editar: me di cuenta de que no capitalizaba la primera letra. Veré si puedo volver a jugar golf mañana.
Edición 2: recordado .titlepero creo que será todo.


Si solo las cadenas admiten la asignación de elementos ...
mbomb007

2

SmileBASIC 2 (Petit Computer), 197 177 bytes

EDICIÓN CONTEMPORÁNEA MAYO 2018 : ¡Esta fue mi primera presentación, hace casi 3 años! Mis habilidades han mejorado mucho desde entonces; -20 solo por ajustes menores.

Comienza con un mensaje (se deja en blanco para guardar bytes, por lo que es solo un?) Donde se coloca la longitud (almacenada en la variable 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

Estoy seguro de que participar con un lenguaje BASIC oscuro no me dará más que un aspecto extraño, pero logré hacerlo bastante pequeño para BASIC. Aprovecha las peculiaridades extrañas de SB (como los condicionales que evalúan a 1 o 0 ya que no hay un tipo booleano) para eliminar tantos bytes como podría tener cuando escribí esto a las 3AM.


1

Maravilloso, 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

Pruébelo aquí (intérprete en línea). Entrada a través de argumentos. Las bibliotecas y tableros cilíndricos deben estar habilitados.

Versión comentada / legible:

}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

Esto es más o menos equivalente al siguiente pseudocódigo ( random(a,b)genera 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

Salida:

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, todavía soy nuevo en esto.

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

1
Necesita en rand()%(n-1-i)<2lugar de rand()%(n-1)<(i+2)obtener una distribución uniforme, a menos que genere este número aleatorio solo una vez y lo guarde en algún lugar.
jimmy23013

¿Cada carácter es un byte o cuántos bytes tiene?
jman294

@ jman294 Debido a que el alfabeto ASCII usa 8 bits por carácter, un carácter es un byte. Realmente solo necesita usar bytes si está usando caracteres no ASCII como el 🙋que usa más de un byte.
Beta Decay

0

R, 166 bytes

Toma entradas de STDIN y salidas a 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='')

Explicación

# 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='')

Algunas pruebas

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

Esto NO funcionará en Kona o kdb +; necesitas usar un intérprete K5 como oK .

Demo en vivo. (Intente configurar 5al final un número diferente para probar diferentes entradas).


0

Rubí, 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;

Los combos de números impares terminan en ho y.

Gracias a @blutorange por un diccionario completo de consejos de golf rubí.

Whoa, acorté mi código en 100 caracteres.


Los combos adicionales son innecesarios. Creo que parte del espacio en blanco allí también es innecesario. Quizás eche un vistazo a algunos consejos para jugar al golf en Ruby para ayudar a acortar su código. Además, ¿esto toma entrada?
Alex A.

Sí, se necesita información, los combos adicionales eran necesarios para obtener puntos adicionales antes de que la pregunta se volviera a hacer, y pensé que aún funcionarían. jfue un error tipográfico.
aplaude el

Solo algunos trucos con ruby: for i in ?a..?z;...;endse pueden reemplazar con (?a..?z).map{...}; El thenafter ifes opcional. v.include?(i)||c.push(i)es la abreviatura de unless v.include?(i);c.push(i). Usar c<<ipara c.push(i). c.map{}es más corto que c.each{}. i%2==1?1:2es la abreviatura de if i%2==1;1;else;2;end. El print "Enter..."no es necesario en codegolf; )
blutorange

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.