Insta-Name… Ajoutez simplement Coder!

17

Dans la langue anglaise, une façon infaillible de faire une combinaison de lettres non-sens prononçables est de la faire entièrement à partir de paires consonne-voyelle, par exemple Wu ko pa ha , ou Me fa ro , consonne d' abord, suivie de voyelle .

Défi:

Écrivez un programme ou une fonction qui, étant donné un nombre de lettres spécifié par l'utilisateur, créera un nom aléatoire en utilisant ce principe. C'est si simple.

Contribution:

Un entier supérieur ou égal à 2 qui désigne le nombre de lettres requis dans la sortie. L'entrée peut provenir de STDIN, des arguments de ligne de commande ou des arguments de fonction.

Production:

Une chaîne de la longueur donnée contenant des paires de voyelles-consonnes sélectionnées au hasard. Il peut être imprimé sur STDOUT ou l'alternative la plus proche ou retourné dans le cas d'une fonction.

Règles:

  1. Chaque consonne de l'alphabet anglais devrait avoir une probabilité égale d'être sélectionnée pour le premier caractère de chaque paire, et chaque voyelle de l'alphabet anglais devrait avoir une probabilité égale d'être sélectionnée pour le deuxième caractère de chaque paire.
  2. Les paires de lettres peuvent être répétées.
  3. Puisqu'il s'agit d'un nom, la première lettre doit être en majuscule.
  4. Si l'entrée est impaire, une paire de lettres sélectionnée au hasard dans le nom doit avoir y ou h ajouté à la fin. Le choix de y ou h doit également être aléatoire.
  5. Les échappatoires standard ne sont pas autorisées.
  6. Le plus petit code en octets gagne.

Définitions des lettres:

Les consonnes:

bcdfghjklmnpqrstvwxyz

Voyelles:

aeiou

Exemple d'E / S:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Prendre plaisir!

jman294
la source
3
Et au fait, bienvenue dans Programming Puzzles et Code Golf.SE :)
trichoplax
Je pense que mon nouveau format est plus clair. C'est ça? @trichoplax
jman294
1
Je poste toutes mes questions potentielles dans le bac à sable où elles peuvent obtenir de nombreux commentaires avant de poster ici. Cela facilite les choses - je le recommande pour les questions futures.
trichoplax
Merci, @alex, Puisque c'est ma première question, je connais maintenant une bonne technique sur la façon d'utiliser ce site. J'ai beaucoup appris et j'espère que ma prochaine question sera meilleure!
jman294
1
@ASCIIThenANSI Selon la règle n ° 4, une paire de lettres sélectionnée au hasard obtiendra ay ou h. Dans cet exemple, c'est ko qui a obtenu le h, pas le ha . jman: Si ce n'est pas ce que vous aviez en tête, mieux vaut modifier les règles rapidement avant que d'autres réponses ne commencent à arriver!
Alex A.

Réponses:

6

JavaScript ES6, 187 180 168 octets

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: je suis passé de l'utilisation de regex replace à une simple boucle for, ce qui a considérablement amélioré la longueur. Code non golfé et testez l'interface utilisateur ci-dessous. Entrez un nombre négatif à vos risques et périls car cela fait une boucle infinie. (Merci à unclemeat pour l'avoir signalé.)

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
la source
1
Remarque: Ne mettez pas de nombre négatif dans l'interface utilisateur de test.
annulez la mise à jour le
4

SWI-Prolog, 286 285 octets

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

Exemple: a(13).sorties Leqihsekeqira.

Remarque: vous devrez peut-être remplacer le `par "si vous disposez d'une ancienne version de SWI-Prolog.

Fatalize
la source
3

Pyth, 52 42 octets

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

Vous pouvez l'essayer dans le compilateur en ligne ici.

Merci à Jakube pour l'avoir approfondi, NinjaBearMonkey pour avoir clarifié le défi et issacg pour avoir créé Pyth et m'avoir appris par inadvertance X.

Ce programme sélectionne au hasard une consonne et une voyelle pour remplir la chaîne, ajoute «h» ou «y» à une paire si l'entrée est impaire, puis met en majuscule le premier caractère. Voici la répartition:

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

Il semble inefficace d'ajouter «h» ou «y» à la première paire consonne-voyelle, puis de brouiller la liste. J'ai essayé d'ajouter à une paire aléatoire, mais le code était toujours plus long que cela.

Mike Bufardeci
la source
Pyth et les codeurs qui le connaissent m'étonnent toujours.
jman294
1
Quelques astuces: rX1capitalise X. test la même chose que _P_.
Jakube
1
Vous pouvez supprimer l'affectation à J, car vous Jne l' utilisez qu'une seule fois.
Jakube
2
Je pense que cela ajoute h ou y à la fin, pas une paire sélectionnée au hasard.
NinjaBearMonkey
@Jakube Merci encore pour votre aide!
Mike Bufardeci
2

Perl, 253 238 octets

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

Je peux probablement jouer au golf plus loin, mais cela devrait faire pour l'instant.

Changements:

  • J'ai enregistré 10 octets par moi-même et 5 grâce à Alex A.
ASCIIThenANSI
la source
2

Julia, 141 octets

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

Cela crée une fonction lambda sans nom qui accepte un entier en entrée et renvoie une chaîne. il profite du fait que les chaînes de Julia peuvent être indexées et référencées comme des tableaux de caractères. Pour l'appeler, donnez-lui un nom, par exemple f=n->....

Non golfé + explication:

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

Exemples:

julia> f(9)
"Luyvunize"

julia> f(2)
"Fe"

julia> f(16)
"Pahonapipesafuze"
Alex A.
la source
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: réalisé qu'il n'a pas mis en majuscule la première lettre. Je vais voir si je peux jouer au golf demain.
Edit 2: Remembered .titlemais je pense que ce sera tout.

Daniel Wakefield
la source
Si seules les chaînes
prenaient en
2

SmileBASIC 2 (Petit ordinateur), 197 177 octets

MODIFICATION CONTEMPORAINE MAI 2018 : C'était ma première soumission, il y a près de 3 ans! Mes compétences se sont beaucoup améliorées depuis lors; -20 juste à partir d'ajustements mineurs.

Il commence par une invite (elle est laissée en blanc pour enregistrer les octets, donc c'est juste un?) Où vous mettez la longueur (stockée dans une 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

Je suis sûr que participer avec un langage BASIC obscur ne m'apportera que des regards étranges, mais j'ai réussi à le rendre assez petit pour BASIC. Il profite des bizarreries étranges de SB (comme les conditions évaluant à 1 ou 0 car il n'y a pas de type booléen) pour éliminer autant d'octets que je pourrais avoir quand j'ai écrit cela à 3 heures du matin.

escargot_
la source
1

Marbelous, 203 octets

}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

Testez-le ici (interprète en ligne).Entrée via des arguments. Les bibliothèques et les tableaux cylindriques doivent être activés.

Version commentée / lisible:

}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

Ceci est à peu près équivalent au pseudocode suivant ( random(a,b)génère des nombres entre aet binclus):

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
la source
1

Rubis, 119 octets

13 octets pour la capitalisation ...

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

Usage:

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

Production:

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

C, 219 caractères

Semble fonctionner, je suis encore nouveau dans ce domaine.

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
la source
1
Vous devez rand()%(n-1-i)<2au lieu d' rand()%(n-1)<(i+2)obtenir une distribution uniforme, sauf si vous ne générez ce nombre aléatoire qu'une seule fois et l'enregistrez quelque part.
jimmy23013
Chaque caractère est-il un octet, ou combien d'octets le contient-il?
jman294
@ jman294 Parce que l'alphabet ASCII utilise 8 bits par caractère, un caractère est un octet. Vous n'avez vraiment besoin d'utiliser des octets que si vous utilisez des caractères non ASCII comme celui 🙋qui utilise plus d'un octet.
Beta Decay
0

R, 166 octets

Prend les entrées de STDIN et les sorties vers 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='')

Explication

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

Quelques 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
la source
0

K5, 131 octets

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

Cela ne fonctionnera PAS sur Kona ou kdb +; vous devez utiliser un interpréteur K5 comme oK .

Démo en direct. (Essayez de définir le 5à la fin sur un nombre différent pour essayer différentes entrées.)

kirbyfan64sos
la source
0

Rubis, 316 238 216 caractères

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;

Les combinaisons de nombres impairs se terminent par hou y.

Merci à @blutorange pour un dictionnaire complet d'astuces de golf rubis.

Whoa, j'ai raccourci mon code de 100 caractères.

taper
la source
Les combos supplémentaires ne sont pas nécessaires. Je pense que certains espaces sont là aussi inutiles. Jetez un coup d'œil à quelques conseils pour jouer au golf à Ruby afin de raccourcir votre code. Est-ce que cela prend également des informations?
Alex A.
Oui, il faut une entrée, les combos supplémentaires étaient nécessaires pour obtenir des points supplémentaires avant que la question ne soit refaite, et je pensais qu'ils fonctionneraient toujours. jétait une faute de frappe.
clap
Quelques astuces avec rubis: for i in ?a..?z;...;endpeut être remplacé par (?a..?z).map{...}; L' thenaprès ifest facultatif. v.include?(i)||c.push(i)est l'abréviation de unless v.include?(i);c.push(i). Utiliser c<<ipour c.push(i). c.map{}est plus court quec.each{} . i%2==1?1:2est l'abréviation de if i%2==1;1;else;2;end. Le print "Enter..."n'est pas nécessaire dans codegolf; )
blutorange
0

Perl 5 , 112 octets

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

Essayez-le en ligne!

Dom Hastings
la source