Insta-Name ... Basta aggiungere il coder!


17

Nella lingua inglese, un modo sicuro per fare una combinazione lettera dialogo pronunciabile è quello di rendere interamente in coppie consonante-vocale, per esempio, Wu ko pa ah , o, Me fa ro , consonante prima, seguita da vocale .

Sfida:

Scrivi un programma o una funzione che, in base a un numero di lettere specificato dall'utente, creerà un nome casuale usando questo principio. È così semplice.

Ingresso:

Un numero intero maggiore o uguale a 2 che designa il numero richiesto di lettere nell'output. L'input può essere preso da STDIN, argomenti della riga di comando o argomenti della funzione.

Produzione:

Una stringa della lunghezza data contenente coppie consonanti-vocali selezionate casualmente. Può essere stampato su STDOUT o l'alternativa più vicina o restituito nel caso di una funzione.

Regole:

  1. Ogni consonante dell'alfabeto inglese dovrebbe avere la stessa probabilità di essere selezionata per il primo carattere di ciascuna coppia e ogni vocale dell'alfabeto inglese dovrebbe avere la stessa probabilità di essere selezionata per il secondo carattere di ciascuna coppia.
  2. Le coppie di lettere possono essere ripetute.
  3. Poiché questo è un nome, la prima lettera deve essere in maiuscolo.
  4. Se l'input è dispari, una coppia di lettere selezionata casualmente nel nome dovrebbe avere y o h aggiunto alla fine. Anche la scelta di y o h dovrebbe essere casuale.
  5. Non sono consentite scappatoie standard.
  6. Vince il codice più piccolo in byte.

Definizioni di lettere:

consonanti:

bcdfghjklmnpqrstvwxyz

vocali:

aeiou

Esempio I / O:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Godere!


3
E comunque, benvenuti a Programming Puzzles and Code Golf.SE :)
trichoplax,

Penso che il mio nuovo formato sia più chiaro. È? @trichoplax
jman294

1
Pubblico tutte le mie potenziali domande nella sandbox in cui possono ricevere molti feedback prima di pubblicare qui. Semplifica le cose - lo consiglio per domande future.
trichoplax,

Grazie, @alex, Dal momento che questa è la mia prima domanda, ora conosco una buona tecnica su come utilizzare questo sito. Ho imparato molto e spero che la mia prossima domanda sia migliore!
jman294,

1
@ASCIIThenANSI Per la regola n. 4, una coppia di lettere selezionata casualmente otterrà ay o h. In quell'esempio, è stato ko che ha ottenuto la h, non l' ha . jman: Se non è quello che avevi in ​​mente, modifica meglio le regole in fretta prima che arrivino altre risposte!
Alex A.

Risposte:



6

JavaScript ES6, 187 180 168 byte

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}

Modifica: sono passato dall'uso di regex al semplice ciclo for, che ha migliorato notevolmente la lunghezza. Codice non golfato e test dell'interfaccia utente di seguito. Inserisci un numero negativo a tuo rischio e pericolo perché crea un ciclo infinito. (Grazie a unclemeat per averlo sottolineato.)

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: non inserire un numero negativo nell'interfaccia utente del test.
ritmato l'

4

SWI-Prolog, 286 285 byte

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

Esempio: a(13).uscite Leqihsekeqira.

Nota: potrebbe essere necessario sostituire il `con "se si dispone di una versione precedente di SWI-Prolog.


3

Pyth, 52 42 byte

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

Puoi provarlo nel compilatore online qui.

Grazie a Jakube per averlo ulteriormente approfondito, NinjaBearMonkey per aver chiarito la sfida, e issacg per aver creato Pyth e avermi insegnato inavvertitamente X.

Questo programma seleziona casualmente una consonante e una vocale per riempire la stringa, aggiunge "h" o "y" a una coppia se l'input è dispari, quindi capitalizza il primo carattere. Ecco la ripartizione:

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

Sembra inefficace aggiungere 'h' o 'y' alla prima coppia consonante-vocale e quindi rimescolare l'elenco. Ho provato ad aggiungere una coppia casuale ma il codice era sempre più lungo di questo.


Pyth e i programmatori che lo sanno mi stupiscono sempre.
jman294,

1
Solo alcuni trucchi: rX1capitalizza X. tè la stessa cosa di _P_.
Jakube,

1
Puoi rimuovere il compito in J, poiché lo usi Jsolo una volta.
Jakube,

2
Penso che questo aggiunge h o y alla fine, non una coppia selezionata casualmente.
NinjaBearMonkey

@Jakube Grazie ancora per l'aiuto!
Mike Bufardeci,

2

Perl, 253 238 byte

@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++}

Probabilmente posso continuare a giocare a golf, ma per ora dovrebbe andare così.

I cambiamenti:

  • Ho salvato 10 byte da solo e 5 grazie ad Alex A.

2

Julia, 141 byte

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

Ciò crea una funzione lambda senza nome che accetta un numero intero come input e restituisce una stringa. sfrutta il fatto che le stringhe in Julia possono essere indicizzate e referenziate come matrici di caratteri. Per chiamarlo, dagli un nome, ad es f=n->....

Ungolfed + spiegazione:

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

Esempi:

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

Modifica: realizzato che non ha mai usato la prima lettera maiuscola. Vedrò se riesco a giocare a golf domani.
Modifica 2: Ricordato, .titlema penso che sarà.


Se solo le stringhe supportassero l'assegnazione degli elementi ...
mbomb007

2

SmileBASIC 2 (Petit Computer), 197 177 byte

MODIFICA CONTEMPORANEA MAGGIO 2018 : questa è stata la mia prima presentazione in assoluto, quasi 3 anni fa! Le mie capacità sono migliorate molto da allora; -20 solo da piccoli aggiustamenti.

Si inizia con un prompt (viene lasciato in bianco per salvare i byte, quindi è solo un?) Dove si inserisce la lunghezza (memorizzata nella variabile 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

Sono sicuro che partecipare con un oscuro linguaggio BASIC non mi procurerà altro che un aspetto strano, ma sono riuscito a renderlo piuttosto piccolo per BASIC. Sfrutta le strane stranezze di SB (come i condizionali che valutano 1 o 0 poiché non esiste un tipo booleano) per eliminare quanti byte potrei avere quando ho scritto questo alle 3 del mattino.


1

Marbelous, 203 byte

}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

Provalo qui (interprete online). Input tramite argomenti. Le librerie e le schede cilindriche devono essere abilitate.

Versione commentata / leggibile:

}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

Questo è approssimativamente equivalente al seguente pseudocodice ( random(a,b)genera numeri tra ae bcompreso):

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

Rubino, 119 byte

13 byte per capitalizzare ...

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

Produzione:

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

0

C, 219 caratteri

Sembra funzionare, sono ancora nuovo a questo.

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
È necessario rand()%(n-1-i)<2invece rand()%(n-1)<(i+2)ottenere una distribuzione uniforme, a meno che non si generi questo numero casuale una sola volta e lo si salvi da qualche parte.
jimmy23013,

Ogni carattere è un byte o quanti byte lo è?
jman294,

@ jman294 Poiché l'alfabeto ASCII utilizza 8 bit per carattere, un carattere è un byte. Hai davvero bisogno di usare byte solo se stai usando caratteri non ASCII come quelli 🙋che usano più di un byte.
Decadimento beta

0

R, 166 byte

Riceve input da STDIN e output su 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='')

Spiegazione

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

Alcuni test

> 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 byte

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

Questo NON funzionerà su Kona o kdb +; devi usare un interprete K5 come oK .

Dimostrazione dal vivo. (Prova a impostare 5alla fine un numero diverso per provare input diversi.)


0

Rubino, 316 238 216 caratteri

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;

Le combinazioni di numeri dispari terminano con ho y.

Grazie a @blutorange per un dizionario completo di consigli sul golf ruby.

Whoa, ho abbreviato il mio codice di 100 caratteri.


Le combo extra non sono necessarie. Penso che anche alcuni degli spazi bianchi siano superflui. Forse dai un'occhiata ad alcuni suggerimenti per giocare a golf in Ruby per abbreviare il tuo codice. Inoltre, questo richiede input?
Alex A.

Sì, ci vuole un contributo, le combo extra erano necessarie per ottenere punti extra prima che la domanda venisse rifatta, e pensavo che avrebbero funzionato ancora. jera un errore di battitura.
applaude il

Solo un paio di trucchi con Ruby: for i in ?a..?z;...;endpossono essere sostituiti con (?a..?z).map{...}; Il thendopo ifè facoltativo. v.include?(i)||c.push(i)è l'abbreviazione di unless v.include?(i);c.push(i). Utilizzare c<<iper c.push(i). c.map{}è più corto di c.each{}. i%2==1?1:2è l'abbreviazione di if i%2==1;1;else;2;end. Non print "Enter..."è necessario in codegolf; )
blutorange l'

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.