채소 이름… 그냥 코더를 추가하십시오!


17

영어에서 확실한 방법은 만들기 위해 발음 할 말도 안되는 문자 조합이 완전히 밖으로 예를 들어, 자음 - 모음 쌍의 그것을 확인하는 것입니다 펜실바니아 , 나, FA RO , 자음 다음에 먼저 모음 .

도전:

사용자가 지정한 수의 문자가 주어지면이 원리를 사용하여 임의의 이름을 만드는 프로그램이나 함수를 작성하십시오. 그렇게 간단합니다.

입력:

출력에서 필요한 문자 수를 지정하는 2 이상의 정수입니다. STDIN, 명령 행 인수 또는 함수 인수에서 입력을 가져올 수 있습니다.

산출:

무작위로 선택된 자음 모음 모음을 포함하는 주어진 길이의 문자열. STDOUT 또는 가장 가까운 대안으로 인쇄되거나 함수의 경우 리턴 될 수 있습니다.

규칙 :

  1. 영어 알파벳의 각 자음은 각 쌍의 첫 번째 문자에 대해 동일한 확률을 선택해야하며 영어 알파벳의 각 모음은 각 쌍의 두 번째 문자에 대해 동일한 확률을 선택해야합니다.
  2. 문자 쌍이 반복 될 수 있습니다.
  3. 이것은 이름이므로 첫 글자는 대문자 여야합니다.
  4. 입력이 홀수이면 이름에서 임의로 선택된 문자 쌍에 끝에 y 또는 h가 추가되어야합니다. y 또는 h의 선택은 임의적이어야합니다.
  5. 표준 허점은 허용되지 않습니다.
  6. 바이트 단위의 가장 작은 코드가 이깁니다.

문자 정의 :

자음 :

bcdfghjklmnpqrstvwxyz

모음 :

aeiou

예제 I / O :

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

즐겨!


3
그건 그렇고, : 퍼즐 및 코드 Golf.SE 프로그래밍에 오신 것을 환영합니다
trichoplax

새로운 형식이 더 명확하다고 생각합니다. 그렇습니까? @trichoplax
jman294

1
샌드 박스에 잠재적 인 모든 질문을 게시하면 여기에 게시하기 전에 많은 피드백을받을 수 있습니다. 더 쉽게 만들 수 있습니다. 나중에 질문 할 때 권장합니다.
trichoplax

감사합니다, @alex, 이것이 첫 번째 질문이므로이 사이트를 사용하는 방법에 대한 좋은 기술을 알고 있습니다. 나는 많은 것을 배웠으며 다음 질문이 더 좋기를 바랍니다.
jman294

1
@ASCIIThenANSI 규칙 # 4에 따라 무작위로 선택된 문자 쌍 은 ay 또는 h가됩니다. 이 예에서는이었다 가 아니라 시간, 도착 . jman : 이것이 마음에 들지 않으면 더 많은 답변이 나오기 전에 규칙을 빠르게 수정하는 것이 좋습니다!
Alex A.

답변:



6

자바 스크립트 ES6, 187 (180) 168 바이트

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}

편집 : 정규식 바꾸기 사용에서 간단한 for 루프로 전환하여 길이가 크게 향상되었습니다. 아래에 ungolfed 코드 및 테스트 UI가 있습니다. 무한 루프를 만들기 때문에 자신의 위험에 따라 음수를 입력하십시오. (이 점을 지적 해 주신 unclemeat에게 감사드립니다.)

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
참고 : 테스트 UI에 음수를 입력하지 마십시오.
unclemeat

4

SWI- 프롤로그, 286 285 바이트

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

예 : a(13).출력한다 Leqihsekeqira.

주 : 교체해야 할 수도 `"는 SWI - 프롤로그의 이전 버전이있는 경우.


3

Pyth, 52 42 바이트

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

온라인 컴파일러에서 시도해 볼 수 있습니다.

Jakube에게 골프를 더 해준 것에 대해, NinjaBearMonkey는 도전을 분명히 해주 었으며, Pyth를 만들고 부주의하게 저를 가르쳐 준 issacg에게 감사드립니다. X 입니다.

이 프로그램은 문자열을 채울 자음과 모음을 임의로 선택하고 입력이 홀수 인 경우 한 쌍에 'h'또는 'y'를 추가 한 다음 첫 문자를 대문자로 표시합니다. 고장은 다음과 같습니다.

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

첫 번째 자음 모음 쌍에 'h'또는 'y'를 추가 한 다음 목록을 스크램블하는 것은 비효율적입니다. 임의의 쌍을 추가하려고 시도했지만 코드는 항상 이보다 길었습니다.


Pyth와 그것을 알고있는 코더들은 항상 나를 놀라게합니다.
jman294

1
몇 가지 트릭 : rX1대문자를 사용하십시오 X. t와 같은 것 _P_입니다.
Jakube

1
한 번만 J사용하므로에 대한 할당을 제거 할 수 있습니다 J.
Jakube

2
나는 이것이 무작위로 선택된 쌍이 아니라 끝에 h 또는 y를 추가한다고 생각합니다.
NinjaBearMonkey

@Jakube 여러분의 도움에 다시 한번 감사드립니다!
마이크 Bufardeci

2

펄, 253238 바이트

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

아마 골프를 더 할 수는 있지만 지금은 그렇게해야합니다.

변경 사항 :

  • Alex A 덕분에 혼자서 10 바이트를 절약하고 5 개를 절약했습니다.

2

줄리아, 141 바이트

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

이것은 정수를 입력으로 받아들이고 문자열을 반환하는 명명되지 않은 람다 함수를 만듭니다. Julia의 문자열을 문자 배열처럼 색인화하고 참조 할 수 있다는 사실을 이용합니다. 호출하려면 이름을 지정하십시오 (예 :) f=n->....

언 골프 + 설명 :

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

예 :

julia> f(9)
"Luyvunize"

julia> f(2)
"Fe"

julia> f(16)
"Pahonapipesafuze"

2

파이썬 (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()

편집 : 첫 글자를 대문자로하지 않았다는 것을 깨달았습니다. 내일 다시 골프를 칠 수 있는지 보자.
편집 2 : 기억 .title했지만 그럴 것이라고 생각합니다.


문자열 만 아이템 할당을 지원한다면 ...
mbomb007

2

SmileBASIC 2 (Petit Computer), 197 177 바이트

현대 편집 2018 년 5 월 : 이것은 거의 3 년 전의 첫 번째 제출물이었습니다! 그 이후로 내 기술이 많이 향상되었습니다. -20 약간만 조정하면됩니다.

길이 (변수에 저장)를 넣는 프롬프트 (바이트를 저장하기 위해 비워 두었으므로 그냥?)로 시작합니다 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

나는 모호한 BASIC 언어에 참여하면 이상한 모습을 얻지 못할 것이라고 확신하지만 BASIC에게는 꽤 작게 만들었습니다. SB의 이상한 단점 (부울 유형이 없기 때문에 1 또는 0으로 평가되는 조건부와 같은)을 이용하여 3AM에 이것을 쓸 때 가능한 많은 바이트를 제거합니다.


1

놀라운, 203 바이트

}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

여기에서 테스트하십시오 (온라인 통역사). 인수를 통한 입력 라이브러리 및 원통형 보드를 활성화해야합니다.

주석 처리 / 판독 가능한 버전 :

}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

이것은 (다음의 의사 코드와 거의 동일합니다 random(a,b)사이의 숫자를 생성 ab포함) :

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

루비, 119 바이트

대문자로 13 바이트 ...

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

용법:

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

산출:

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

0

C, 219 자

작동하는 것 같습니다. 나는 여전히 이것에 익숙하지 않습니다.

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
이 난수를 한 번만 생성하여 어딘가에 저장하지 않는 한 균일 한 분포를 얻는 rand()%(n-1-i)<2대신에 필요 합니다 rand()%(n-1)<(i+2).
jimmy23013

각 문자는 바이트입니까, 아니면 몇 바이트입니까?
jman294

@ jman294 ASCII 알파벳은 문자 당 8 비트를 사용하므로 문자는 1 바이트입니다. 비 ASCII 문자 🙋를 사용하는 경우 둘 이상의 바이트를 사용하는 경우 실제로 바이트 만 사용해야합니다 .
베타 붕괴

0

R, 166 바이트

STDIN에서 입력을 가져 와서 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='')

설명

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

일부 테스트

> 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 바이트

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

Kona 또는 kdb +에서는 작동하지 않습니다. oK 와 같은 K5 인터프리터를 사용해야 합니다 .

라이브 데모. ( 5다른 입력을 시도하려면 끝에 다른 번호를 설정하십시오 .)


0

루비, 316238216

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;

홀수 콤보가 끝남 h 또는로y .

루비 골프 팁의 완전한 사전을위한 @blutorange에 감사합니다.

우와, 코드를 100 자로 줄였습니다.


여분의 콤보는 불필요합니다. 나는 거기에있는 공백 중 일부도 필요하지 않다고 생각합니다. 코드를 짧게하는 데 도움이 되는 루비 에서의 골프 팁을 살펴보십시오 . 또한 입력이 필요합니까?
Alex A.

예, 입력 필요하고 질문이 다시 작성되기 전에 추가 콤보 추가 포인트에 필요했으며 여전히 작동한다고 생각했습니다. j오타였습니다.
박수

루비 불과 몇 트릭이 : for i in ?a..?z;...;end로 대체 할 수있다 (?a..?z).map{...}; then후에는 if선택 사항입니다. v.include?(i)||c.push(i)의 약자입니다 unless v.include?(i);c.push(i). 사용 c<<i을 위해 c.push(i). c.map{}보다 짧습니다 c.each{}. i%2==1?1:2의 약자입니다 if i%2==1;1;else;2;end. 는 print "Enter..."codegolf에 필요하지 않습니다; )
blutorange

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.