Insta-Name… Cukup Tambahkan Coder!

17

Dalam bahasa Inggris, cara yang pasti untuk membuat kombinasi huruf omong kosong yang dapat diucapkan adalah dengan membuatnya sepenuhnya dari pasangan konsonan-vokal, misalnya, Wu ko pa ha , atau, Me fa ro , konsonan pertama, diikuti oleh vokal .

Tantangan:

Tulis program atau fungsi yang akan, diberi jumlah huruf yang ditentukan pengguna, membuat nama acak menggunakan prinsip ini. Sesederhana itu.

Memasukkan:

Bilangan bulat lebih besar dari atau sama dengan 2 yang menunjukkan jumlah huruf yang diperlukan dalam output. Input dapat diambil dari STDIN, argumen baris perintah, atau argumen fungsi.

Keluaran:

String dengan panjang tertentu yang mengandung pasangan konsonan-vokal yang dipilih secara acak. Ini dapat dicetak ke STDOUT atau alternatif terdekat atau dikembalikan dalam kasus fungsi.

Aturan:

  1. Setiap konsonan dari alfabet Inggris harus memiliki probabilitas yang sama untuk dipilih untuk karakter pertama dari setiap pasangan, dan setiap vokal dari alfabet Inggris harus memiliki probabilitas yang sama untuk dipilih untuk karakter kedua dari setiap pasangan.
  2. Pasangan surat dapat diulang.
  3. Karena ini adalah nama, huruf pertama harus ditulis dengan huruf besar.
  4. Jika inputnya ganjil, pasangan huruf yang dipilih secara acak dalam nama harus memiliki y atau h ditambahkan hingga akhir. Pilihan y atau h harus acak juga.
  5. Celah standar tidak diizinkan.
  6. Kode terkecil dalam byte menang.

Definisi surat:

Konsonan:

bcdfghjklmnpqrstvwxyz

Vokal:

aeiou

Contoh I / O:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Nikmati!

jman294
sumber
3
Dan omong-omong, selamat datang di Programming Puzzles and Code Golf.SE :)
trichoplax
Saya pikir format baru saya lebih jelas. Apakah itu? @trichoplax
jman294
1
Saya memposting semua pertanyaan potensial saya di kotak pasir di mana mereka bisa mendapatkan banyak umpan balik sebelum memposting di sini. Itu membuat segalanya lebih mudah - saya merekomendasikannya untuk pertanyaan di masa depan.
trichoplax
Terima kasih, @alex, Karena ini adalah pertanyaan pertama saya, saya sekarang tahu beberapa teknik yang baik tentang cara menggunakan situs ini. Saya telah belajar banyak, dan saya berharap pertanyaan saya berikutnya akan lebih baik!
jman294
1
@ ASCIIThenANSI Per aturan # 4, pasangan surat yang dipilih secara acak akan mendapatkan ay atau h. Dalam contoh itu, ko yang mendapat h, bukan ha . jman: Jika bukan itu yang ada dalam pikiranmu, lebih baik ubah aturan dengan cepat sebelum lebih banyak jawaban masuk!
Alex A.

Jawaban:

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}

Sunting: Saya beralih dari menggunakan ganti regex ke sederhana untuk loop, yang meningkatkan panjang. Kode tidak tes dan UI uji di bawah. Masukkan angka negatif dengan risiko Anda sendiri karena membuat loop tak terbatas. (Terima kasih telah menghapusnya karena menunjukkan hal itu.)

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
sumber
1
Catatan: Jangan masukkan angka negatif ke UI tes ..
hapus tanda
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).

Contoh: a(13).keluaran Leqihsekeqira.

Catatan: Anda mungkin perlu mengganti `dengan "jika Anda memiliki versi lama dari SWI-Prolog.

Fatalisasi
sumber
3

Pyth, 52 42 byte

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

Anda dapat mencobanya di kompiler online di sini.

Terima kasih kepada Jakube untuk bermain golf lebih jauh, NinjaBearMonkey untuk mengklarifikasi tantangan, dan menerbitkan untuk membuat Pyth dan secara tidak sengaja mengajari saya tentang X .

Program ini secara acak memilih konsonan dan vokal untuk mengisi string, menambahkan 'h' atau 'y' ke satu pasangan jika inputnya ganjil, kemudian kapitalkan karakter pertama. Berikut ini rinciannya:

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

Tampaknya tidak efisien untuk menambahkan 'h' atau 'y' ke pasangan konsonan-vokal pertama dan kemudian berebut daftar. Saya mencoba menambahkan ke pasangan acak tetapi kode selalu lebih lama dari ini.

Mike Bufardeci
sumber
Pyth, dan para coders yang mengetahuinya, selalu membuatku takjub.
jman294
1
Hanya beberapa trik: rX1mengkapitalisasi X. tadalah hal yang sama dengan _P_.
Jakube
1
Anda dapat menghapus tugas J, karena Anda Jhanya menggunakan sekali.
Jakube
2
Saya pikir ini menambahkan h atau y sampai akhir, bukan pasangan yang dipilih secara acak.
NinjaBearMonkey
@ Jakube Sekali lagi terima kasih atas bantuan Anda!
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++}

Saya mungkin bisa bermain golf lebih jauh, tetapi ini harus dilakukan untuk saat ini.

Perubahan:

  • Disimpan 10 byte sendiri, dan 5 berkat Alex A.
ASCIIThenANSI
sumber
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])))

Ini menciptakan fungsi lambda tanpa nama yang menerima integer sebagai input dan mengembalikan string. itu mengambil keuntungan dari fakta bahwa string dalam Julia dapat diindeks dan dirujuk seperti array karakter. Untuk menyebutnya, berikan nama, mis f=n->....

Penjelasan + tidak dikumpulkan:

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

Contoh:

julia> f(9)
"Luyvunize"

julia> f(2)
"Fe"

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

Sunting: Menyadari bahwa huruf kapital bukan huruf kapital pertama. Saya akan melihat apakah saya bisa golf kembali besok.
Sunting 2: Diingat .titletapi saya rasa hanya itu.

Daniel Wakefield
sumber
Jika hanya string yang mendukung penugasan item ...
mbomb007
2

SmileBASIC 2 (Petit Computer), 197 177 byte

EDIT KONTEMPORER MEI 2018 : Ini adalah pengiriman pertama saya, hampir 3 tahun yang lalu! Keterampilan saya telah meningkat banyak sejak itu; -20 hanya dari penyesuaian kecil.

Ini dimulai dengan prompt (dibiarkan kosong untuk menyimpan byte, jadi itu hanya?) Di mana Anda memasukkan panjang (disimpan dalam variabel 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

Saya yakin berpartisipasi dengan bahasa BASIC yang tidak jelas hanya akan membuat saya terlihat aneh, tetapi saya berhasil membuatnya menjadi sangat kecil untuk BASIC. Dibutuhkan keuntungan dari kebiasaan aneh SB (seperti persyaratan mengevaluasi ke 1 atau 0 karena tidak ada tipe boolean) untuk menghilangkan sebanyak byte yang mungkin saya miliki ketika saya menulis ini di 3:00.

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

Uji di sini (juru bahasa online). Masukan melalui argumen. Perpustakaan dan papan silindris harus diaktifkan.

Versi yang dikomentari / dibaca:

}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

Ini kira-kira setara dengan pseudocode berikut ( random(a,b)menghasilkan angka antara adan binklusif):

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

Ruby, 119 byte

13 byte untuk memanfaatkan ...

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

Pemakaian:

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

Keluaran:

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

C, 219 karakter

Tampaknya bekerja, saya masih baru dalam hal ini.

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
sumber
1
Anda perlu rand()%(n-1-i)<2bukannya rand()%(n-1)<(i+2)mendapatkan distribusi yang seragam, kecuali jika Anda menghasilkan angka acak ini hanya sekali dan menyimpannya di suatu tempat.
jimmy23013
Apakah setiap karakter byte, atau berapa byte itu?
jman294
@ jman294 Karena alfabet ASCII menggunakan 8 bit per karakter, satu karakter adalah satu byte. Anda hanya perlu menggunakan byte jika Anda menggunakan karakter non-ASCII seperti 🙋yang menggunakan lebih dari satu byte.
Beta Decay
0

R, 166 byte

Mengambil input dari STDIN dan output ke 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='')

Penjelasan

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

Beberapa tes

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

Ini TIDAK akan bekerja pada Kona atau kdb +; Anda perlu menggunakan juru bahasa K5 seperti oK .

Demo langsung. (Coba atur 5di akhir ke nomor yang berbeda untuk mencoba input yang berbeda.)

kirbyfan64sos
sumber
0

Ruby, 316 238 216 karakter

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;

Kombinasi angka ganjil berakhir pada hatau y.

Terima kasih kepada @blutorange untuk kamus lengkap tips golf ruby.

Wah, saya mempersingkat kode saya dengan 100 karakter.

tepuk
sumber
Combo ekstra tidak diperlukan. Saya pikir beberapa spasi putih di sana juga tidak perlu. Mungkin lihat beberapa tips untuk bermain golf di Ruby untuk membantu mempersingkat kode Anda. Juga, apakah ini menerima input?
Alex A.
Ya, dibutuhkan masukan, combo tambahan yang neccessary untuk poin ekstra sebelum pertanyaan mendapat redone, dan saya pikir mereka akan tetap bekerja. jadalah salah ketik.
bertepuk tangan
Hanya beberapa trik dengan ruby: for i in ?a..?z;...;enddapat diganti dengan (?a..?z).map{...}; The thensetelah ifopsional. v.include?(i)||c.push(i)kependekan dari unless v.include?(i);c.push(i). Gunakan c<<iuntuk c.push(i). c.map{}lebih pendek dari c.each{}. i%2==1?1:2kependekan dari if i%2==1;1;else;2;end. Itu print "Enter..."tidak diperlukan dalam codegolf; )
blutorange
0

Perl 5 , 112 byte

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

Cobalah online!

Dom Hastings
sumber