Tên Insta chỉ cần thêm bộ mã hóa!


17

Trong ngôn ngữ tiếng Anh, một cách chắc chắn để tạo ra một tổ hợp chữ vô nghĩa có thể phát âm được là làm cho nó hoàn toàn thoát khỏi các cặp nguyên âm phụ âm, ví dụ, Wu ko pa ha , hoặc, Me fa ro , phụ âm đầu tiên, tiếp theo là nguyên âm .

Thử thách:

Viết chương trình hoặc hàm sẽ, với số lượng chữ cái do người dùng chỉ định, tạo một tên ngẫu nhiên theo nguyên tắc này. Nó đơn giản mà.

Đầu vào:

Một số nguyên lớn hơn hoặc bằng 2 chỉ định số lượng chữ cái cần thiết trong đầu ra. Đầu vào có thể được lấy từ STDIN, đối số dòng lệnh hoặc đối số hàm.

Đầu ra:

Một chuỗi có độ dài cho trước chứa các cặp nguyên âm-phụ âm được chọn ngẫu nhiên. Nó có thể được in ra STDOUT hoặc thay thế gần nhất hoặc trả lại trong trường hợp hàm.

Quy tắc:

  1. Mỗi phụ âm của bảng chữ cái tiếng Anh nên có xác suất được chọn bằng nhau cho ký tự đầu tiên của mỗi cặp và mỗi nguyên âm của bảng chữ cái tiếng Anh nên có xác suất được chọn bằng nhau cho ký tự thứ hai của mỗi cặp.
  2. Các cặp chữ cái có thể được lặp lại.
  3. Vì đây là tên, chữ cái đầu tiên phải được viết hoa.
  4. Nếu đầu vào là số lẻ, một cặp chữ cái được chọn ngẫu nhiên trong tên sẽ có y hoặc h được thêm vào cuối. Sự lựa chọn của y hoặc h cũng nên ngẫu nhiên.
  5. Sơ hở tiêu chuẩn không được phép.
  6. Mã nhỏ nhất trong byte thắng.

Định nghĩa thư:

Phụ âm:

bcdfghjklmnpqrstvwxyz

Nguyên âm:

aeiou

Ví dụ I / O:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Thưởng thức!


3
Và nhân tiện, chào mừng bạn đến với Câu đố lập trình và Code Golf.SE :)
trichoplax

Tôi nghĩ định dạng mới của tôi rõ ràng hơn. Là nó? @trichoplax
jman294 7/07/2015

1
Tôi đăng tất cả các câu hỏi tiềm năng của mình trong hộp cát nơi họ có thể nhận được nhiều phản hồi trước khi đăng ở đây. Nó làm cho mọi thứ dễ dàng hơn - tôi đề nghị nó cho các câu hỏi trong tương lai.
trichoplax 7/07/2015

Cảm ơn, @alex, Vì đây là câu hỏi đầu tiên của tôi, bây giờ tôi biết một số kỹ thuật tốt về cách sử dụng trang web này. Tôi đã học được rất nhiều, và tôi hy vọng câu hỏi tiếp theo của tôi sẽ tốt hơn!
jman294

1
@ASCIIThenANSI Theo quy tắc số 4, một cặp chữ cái được chọn ngẫu nhiên sẽ nhận được ay hoặc h. Trong ví dụ này, nó đã ko mà có h, không ha . jman: Nếu đó không phải là những gì bạn có trong đầu, tốt hơn hãy sửa đổi các quy tắc một cách nhanh chóng trước khi có nhiều câu trả lời bắt đầu!
Alex A.

Câu trả lời:



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}

Chỉnh sửa: Tôi đã chuyển từ sử dụng regex thay thế sang một vòng lặp đơn giản, giúp cải thiện độ dài đáng kể. Mã xác nhận và giao diện người dùng thử nghiệm bên dưới. Nhập một số âm có nguy cơ của riêng bạn vì nó tạo ra một vòng lặp vô hạn. (Cám ơn vì đã tiết lộ điều đó.)

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
Lưu ý: Không đặt số âm vào giao diện người dùng thử ..
tiết 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).

Ví dụ: a(13).đầu ra Leqihsekeqira.

Lưu ý: Bạn có thể cần phải thay thế `bằng "nếu bạn có phiên bản cũ của SWI-Prolog.


3

Pyth, 52 42 byte

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

Bạn có thể thử nó trong trình biên dịch trực tuyến ở đây.

Cảm ơn Jakube vì đã chơi golf xa hơn, NinjaBearMonkey đã làm rõ thách thức và hiện tại đã tạo ra Pyth và vô tình dạy tôi về X.

Chương trình này chọn ngẫu nhiên một phụ âm và nguyên âm để điền vào chuỗi, thêm 'h' hoặc 'y' vào một cặp nếu đầu vào là số lẻ, sau đó viết hoa ký tự đầu tiên. Đây là sự cố:

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

Có vẻ không hiệu quả khi nối 'h' hoặc 'y' vào cặp nguyên âm phụ âm đầu tiên và sau đó xáo trộn danh sách. Tôi đã thử nối vào một cặp ngẫu nhiên nhưng mã luôn dài hơn thế này.


Pyth, và các lập trình viên biết điều đó, luôn làm tôi ngạc nhiên.
jman294 7/07/2015

1
Chỉ cần một vài thủ thuật: rX1viết hoa X. tlà điều tương tự như _P_.
Jakube 7/07/2015

1
Bạn có thể xóa bài tập J, vì bạn Jchỉ sử dụng một lần.
Jakube 7/07/2015

2
Tôi nghĩ rằng điều này thêm h hoặc y vào cuối, không phải là một cặp được chọn ngẫu nhiên.
NinjaBearMonkey 7/07/2015

@Jakube Cảm ơn một lần nữa vì sự giúp đỡ của bạn!
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++}

Tôi có thể chơi golf xa hơn, nhưng điều này nên làm ngay bây giờ.

Thay đổi:

  • Tôi đã lưu 10 byte và 5 nhờ 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])))

Điều này tạo ra một hàm lambda không tên, chấp nhận một số nguyên làm đầu vào và trả về một chuỗi. nó lợi dụng thực tế là các chuỗi trong Julia có thể được lập chỉ mục và được tham chiếu như các mảng ký tự. Để gọi nó, đặt tên cho nó, vd f=n->....

Ungolfed + giải thích:

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

Ví dụ:

julia> f(9)
"Luyvunize"

julia> f(2)
"Fe"

julia> f(16)
"Pahonapipesafuze"

2

Con tră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()

Chỉnh sửa: Nhận ra nó không viết hoa chữ cái đầu tiên. Tôi sẽ thấy nếu tôi có thể đánh gôn trở lại vào ngày mai.
Chỉnh sửa 2: Nhớ .titlenhưng tôi nghĩ đó sẽ là nó.


Nếu chỉ các chuỗi được hỗ trợ gán vật phẩm ...
mbomb007

2

SmileBASIC 2 (Máy tính Petit), 197 177 byte

EDIT NỘI DUNG THÁNG 5 NĂM 2018 : Đây là lần gửi đầu tiên của tôi từ gần 3 năm trước! Kỹ năng của tôi đã được cải thiện rất nhiều kể từ đó; -20 chỉ từ những điều chỉnh nhỏ.

Nó bắt đầu bằng một dấu nhắc (nó để trống để lưu byte, vì vậy nó chỉ là một?) Trong đó bạn đặt chiều dài (được lưu trữ trong biến 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

Tôi chắc chắn rằng việc tham gia với một ngôn ngữ BASIC tối nghĩa sẽ không mang lại cho tôi điều gì ngoài vẻ ngoài kỳ lạ, nhưng tôi đã xoay sở để làm cho nó trở nên khá nhỏ đối với BASIC. Nó lợi dụng các quirks kỳ lạ của SB (như các điều kiện đánh giá là 1 hoặc 0 vì không có kiểu boolean) để loại bỏ nhiều byte nhất có thể khi tôi viết điều này vào lúc 3 giờ sáng.


1

Tuyệt vời, 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

Kiểm tra nó ở đây (thông dịch viên trực tuyến). Nhập thông qua đối số. Thư viện và bảng hình trụ phải được kích hoạt.

Phiên bản đã bình luận / có thể đọc được:

}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

Điều này gần tương đương với mã giả sau đây ( random(a,b)tạo số giữa abbao gồm):

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 byte

13 byte để viết hoa ...

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

Sử dụng:

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

Đầu ra:

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

0

C, 219 ký tự

Có vẻ như để làm việc, tôi vẫn còn mới với điều này.

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
Bạn cần rand()%(n-1-i)<2thay vì rand()%(n-1)<(i+2)để có được một phân phối thống nhất, trừ khi bạn chỉ tạo số ngẫu nhiên này một lần và lưu nó ở đâu đó.
jimmy23013 7/07/2015

Là mỗi ký tự một byte, hoặc nó có bao nhiêu byte?
jman294 7/07/2015

@ jman294 Vì bảng chữ cái ASCII sử dụng 8 bit cho mỗi ký tự, một ký tự là một byte. Bạn chỉ thực sự cần sử dụng byte nếu bạn đang sử dụng các ký tự không phải ASCII như 🙋sử dụng nhiều hơn một byte.
Beta Decay

0

R, 166 byte

Lấy đầu vào từ STDIN và đầu ra thành 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='')

Giải trình

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

Một số bài kiểm tra

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

Điều này sẽ KHÔNG hoạt động trên Kona hoặc kdb +; bạn cần sử dụng trình thông dịch K5 như oK .

Bản thử trực tiếp. (Thử đặt 5cuối ở một số khác để thử các đầu vào khác nhau.)


0

Ruby, 316 238 216 ký tự

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;

Combo số lẻ kết thúc bằng hhoặc y.

Cảm ơn @blutorange cho một từ điển đầy đủ các mẹo chơi golf ruby.

Whoa, tôi rút ngắn mã của tôi bằng 100 ký tự.


Các combo phụ là không cần thiết. Tôi nghĩ rằng một số khoảng trắng trong đó là không cần thiết là tốt. Có thể xem một số mẹo chơi golf trong Ruby để giúp rút ngắn mã của bạn. Ngoài ra, điều này có đầu vào?
Alex A.

Vâng, phải mất đầu vào, các combo bổ sung không cần thiết cho điểm thêm trước khi câu hỏi được làm lại, và tôi nghĩ rằng chúng vẫn sẽ hoạt động. jlà một lỗi đánh máy.
vỗ tay

Chỉ cần một vài thủ thuật với ruby: for i in ?a..?z;...;endcó thể được thay thế bằng (?a..?z).map{...}; Các thensau iflà tùy chọn. v.include?(i)||c.push(i)là chữ viết tắt unless v.include?(i);c.push(i). Sử dụng c<<icho c.push(i). c.map{}ngắn hơn c.each{}. i%2==1?1:2là chữ viết tắt if i%2==1;1;else;2;end. Điều print "Enter..."không cần thiết trong codegolf; )
blutorange

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.