Insta-Name… Füge einfach Coder hinzu!

17

In der englischen Sprache besteht ein todsicherer Weg, eine aussprechbare Unsinn-Buchstaben-Kombination zu bilden, darin, sie vollständig aus Konsonant-Vokal-Paaren zu machen, z. B. Wu ko pa ha oder Me fa ro , Konsonant zuerst , gefolgt von Vokal .

Herausforderung:

Schreiben Sie ein Programm oder eine Funktion, die bei einer benutzerdefinierten Anzahl von Buchstaben nach diesem Prinzip einen zufälligen Namen erzeugt. So einfach ist das.

Eingang:

Eine ganze Zahl größer oder gleich 2, die die erforderliche Anzahl von Buchstaben in der Ausgabe angibt. Die Eingabe kann über STDIN, Befehlszeilenargumente oder Funktionsargumente erfolgen.

Ausgabe:

Eine Zeichenfolge der angegebenen Länge, die zufällig ausgewählte Konsonant-Vokal-Paare enthält. Es kann auf STDOUT oder die nächstgelegene Alternative gedruckt oder im Falle einer Funktion zurückgegeben werden.

Regeln:

  1. Jeder Konsonant des englischen Alphabets sollte die gleiche Wahrscheinlichkeit haben, für das erste Zeichen jedes Paares ausgewählt zu werden, und jeder Vokal des englischen Alphabets sollte die gleiche Wahrscheinlichkeit haben, für das zweite Zeichen jedes Paares ausgewählt zu werden.
  2. Buchstabenpaare können wiederholt werden.
  3. Da dies ein Name ist, muss der erste Buchstabe groß geschrieben werden.
  4. Wenn die Eingabe ungerade ist, sollte an das Ende eines zufällig ausgewählten Buchstabenpaares im Namen y oder h angehängt werden. Die Auswahl von y oder h sollte ebenfalls zufällig sein.
  5. Standardlücken sind nicht zulässig.
  6. Kleinster Code in Bytes gewinnt.

Buchstabendefinitionen:

Konsonanten:

bcdfghjklmnpqrstvwxyz

Vokale:

aeiou

Beispiel I / O:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Genießen!

jman294
quelle
3
Und übrigens, willkommen bei Programming Puzzles und Code Golf.SE :)
trichoplax
Ich denke mein neues Format ist klarer. Ist es? @trichoplax
jman294
1
Ich poste alle meine potenziellen Fragen in der Sandbox, wo sie viele Rückmeldungen erhalten können, bevor sie hier veröffentlicht werden. Es macht die Sache einfacher - ich empfehle es für zukünftige Fragen.
Trichoplax
Danke, @alex, da dies meine erste Frage ist, kenne ich jetzt einige gute Techniken zur Verwendung dieser Site. Ich habe viel gelernt und hoffe, dass meine nächste Frage besser wird!
jman294
1
@ASCIIThenANSI Gemäß Regel 4 erhält ein zufällig ausgewähltes Buchstabenpaar ay oder h. In diesem Beispiel war es ko , das das h bekam, nicht ha . jman: Wenn Sie das nicht beabsichtigt haben, ändern Sie die Regeln besser schnell, bevor weitere Antworten eingehen!
Alex A.

Antworten:

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: Ich habe von der Verwendung von Regex Replace auf eine einfache For-Schleife umgestellt, was die Länge erheblich verbessert hat. Ungolfed Code und Test-UI unten. Geben Sie eine negative Zahl auf eigenes Risiko ein, da dies eine Endlosschleife ergibt. (Dank an unclemeat für den Hinweis.)

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>

NinjaBearMonkey
quelle
1
Hinweis:
Geben
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).

Beispiel: a(13). Ausgänge Leqihsekeqira.

Hinweis: Sie können das ersetzen müssen `mit , "wenn Sie eine alte Version von SWI-Prolog haben.

Tödlich
quelle
3

Pyth, 52 42 Bytes

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

Sie können es hier im Online-Compiler ausprobieren.

Dank an Jakube für das weitere Golfspielen, NinjaBearMonkey für die Klärung der Herausforderung und issacg für das Erstellen von Pyth und das versehentliche Unterrichten von mir X.

Dieses Programm wählt nach dem Zufallsprinzip einen Konsonanten und einen Vokal aus, um die Zeichenfolge zu füllen, fügt einem Paar 'h' oder 'y' hinzu, wenn die Eingabe ungerade ist, und schreibt dann das erste Zeichen in Großbuchstaben. Hier ist die Aufteilung:

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

Es scheint ineffizient, 'h' oder 'y' an das erste Konsonant-Vokal-Paar anzuhängen und dann die Liste zu verschlüsseln. Ich habe versucht, an ein zufälliges Paar anzuhängen, aber der Code war immer länger als dieser.

Mike Bufardeci
quelle
Pyth und die Programmierer, die es wissen, überraschen mich immer wieder.
jman294
1
Nur ein paar Tricks: rX1Großbuchstaben X. tist dasselbe wie _P_.
Jakube
1
Sie können die Zuordnung zu entfernen J, da Sie Jnur einmal verwenden.
Jakube,
2
Ich denke, dies fügt h oder y zum Ende hinzu, nicht ein zufällig ausgewähltes Paar.
NinjaBearMonkey
@ Jakube Nochmals vielen Dank für Ihre Hilfe!
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++}

Ich kann wahrscheinlich weiter Golf spielen, aber das sollte vorerst reichen.

Änderungen:

  • Ich habe 10 Bytes gespart und 5 dank Alex A.
ASCIIThenANSI
quelle
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])))

Dadurch wird eine unbenannte Lambda-Funktion erstellt, die eine Ganzzahl als Eingabe akzeptiert und eine Zeichenfolge zurückgibt. Es nutzt die Tatsache aus, dass Zeichenfolgen in Julia wie Zeichenfelder indiziert und referenziert werden können. Um es zu nennen, geben Sie ihm einen Namen, z f=n->....

Ungolfed + Erklärung:

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

Beispiele:

julia> f(9)
"Luyvunize"

julia> f(2)
"Fe"

julia> f(16)
"Pahonapipesafuze"
Alex A.
quelle
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()

Bearbeiten: Es wurde festgestellt, dass der erste Buchstabe nicht groß geschrieben wurde. Ich werde sehen, ob ich morgen wieder Golf spielen kann.
Edit 2: Erinnert .titleaber ich denke das wird es sein.

Daniel Wakefield
quelle
Wenn nur Zeichenfolgen
Artikelzuordnung
2

SmileBASIC 2 (Petit Computer), 197 177 Bytes

ZEITGENÖSSISCHE ÄNDERUNG MAI 2018 : Dies war meine allererste Einreichung vor fast drei Jahren! Meine Fähigkeiten haben sich seitdem sehr verbessert; -20 nur von geringfügigen Anpassungen.

Es beginnt mit einer Eingabeaufforderung (es ist leer, um Bytes zu speichern, also ist es nur ein?), In der Sie die Länge eingeben (in Variable gespeichert 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

Ich bin mir sicher, dass die Teilnahme an einer obskuren BASIC-Sprache mir nur ein komisches Aussehen verleiht, aber ich habe es geschafft, es für BASIC ziemlich klein zu machen. Es nutzt die seltsamen Macken von SB (wie Bedingungen, die mit 1 oder 0 bewertet werden, da es keinen Booleschen Typ gibt), um so viele Bytes wie möglich zu eliminieren, als ich dies um 3 Uhr morgens schrieb.

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

Testen Sie es hier (Online-Dolmetscher).Eingabe über Argumente. Bibliotheken und zylindrische Tafeln müssen aktiviert sein.

Kommentierte / lesbare Version:

}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

Dies entspricht ungefähr dem folgenden Pseudocode ( random(a,b)generiert Zahlen zwischen aund beinschließlich):

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'
es1024
quelle
1

Ruby, 119 Bytes

13 Bytes für die Großschreibung ...

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

Verwendung:

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

Ausgabe:

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

C 219 Zeichen

Scheint zu funktionieren, ich bin noch neu darin.

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);}
Cole Cameron
quelle
1
Sie müssen rand()%(n-1-i)<2stattdessen rand()%(n-1)<(i+2)eine einheitliche Verteilung erhalten, es sei denn, Sie generieren diese Zufallszahl nur einmal und speichern sie irgendwo.
Jimmy23013
Ist jedes Zeichen ein Byte oder wie viele Bytes hat es?
jman294
@ jman294 Da das ASCII-Alphabet 8 Bits pro Zeichen verwendet, besteht ein Zeichen aus einem Byte. Sie müssen wirklich nur Bytes verwenden, wenn Sie Nicht-ASCII-Zeichen 🙋verwenden, die mehr als ein Byte verwenden.
Beta Decay
0

R, 166 Bytes

Übernimmt die Eingabe von STDIN und gibt sie an STDOUT aus.

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

Erläuterung

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

Einige Tests

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

Dies funktioniert NICHT mit Kona oder kdb +. Sie müssen einen K5-Interpreter wie OK verwenden .

Live-Demo. (Stellen Sie 5am Ende eine andere Zahl ein, um andere Eingaben zu versuchen.)

kirbyfan64sos
quelle
0

Ruby, 316 238 216 Zeichen

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;

Combos mit ungeraden Zahlen enden mit hoder y.

Vielen Dank an @blutorange für ein vollständiges Wörterbuch mit Ruby-Golftipps.

Ich habe meinen Code um 100 Zeichen gekürzt.

klatschen
quelle
Die zusätzlichen Combos sind unnötig. Ich denke, dass ein Teil des Leerzeichens dort auch unnötig ist. Vielleicht werfen Sie einen Blick auf einige Tipps zum Golfen in Ruby , um Ihren Code zu verkürzen. Nimmt dies auch Eingaben auf?
Alex A.
Ja, es sind Eingaben erforderlich, die zusätzlichen Combos waren für zusätzliche Punkte erforderlich, bevor die Frage erneut beantwortet wurde, und ich dachte, sie würden immer noch funktionieren. jwar ein Tippfehler.
klatschen
Nur ein paar Tricks mit Rubin: for i in ?a..?z;...;endErsetzbar durch (?a..?z).map{...}; Das thenNachher ifist optional. v.include?(i)||c.push(i)ist eine Abkürzung für unless v.include?(i);c.push(i). Verwenden Sie c<<ifür c.push(i). c.map{}ist kürzer als c.each{}. i%2==1?1:2ist eine Abkürzung für if i%2==1;1;else;2;end. Dasprint "Enter..." wird beim Codegolf nicht benötigt; )
Blutorange
0

Perl 5 , 112 Bytes

@;=map{(grep aeiou!~$_,a..z)[rand 21].(a,e,i,o,u)[rand 5]}1..$_/2;$_%2?$;[rand@;].=time%2?h:'y':0;$_=$"^join"",@

Probieren Sie es online!

Dom Hastings
quelle