Insta-Name…コーダーを追加するだけです!


17

英語では、発音可能ナンセンス文字の組み合わせを作るための確実な方法は、例えば、完全にアウト子音・母音のペアのそれを作るためにある KO PA ヘクタール、または、 FA RO子音が続く、最初の母音

チャレンジ:

ユーザーが指定した文字数を指定すると、この原則を使用してランダムな名前を作成するプログラムまたは関数を作成します。とても簡単です。

入力:

出力で必要な文字数を指定する2以上の整数。入力は、STDIN、コマンドライン引数、または関数引数から取得できます。

出力:

ランダムに選択された子音と母音のペアを含む、指定された長さの文字列。STDOUTまたは最も近い代替に出力するか、関数の場合に返すことができます。

ルール:

  1. 英語のアルファベットの各子音は、各ペアの最初の文字に対して選択される確率が等しくなければならず、英語のアルファベットの各母音は、各ペアの2番目の文字に対して選択される確率が等しくなければなりません。
  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
ここに投稿する前に、潜在的な質問をすべてサンドボックスに投稿し、そこから多くのフィードバックを得ることができます。物事が簡単になります-今後の質問のためにそれをお勧めします。
センモウヒラムシ

ありがとう、@ alex、これが私の最初の質問なので、このサイトの使い方に関するいくつかの良いテクニックを知っています。私は多くのことを学びました。次の質問が良くなることを願っています!
jman294

1
@ASCIIThenANSIルール#4に従って、ランダムに選択された文字ペアはayまたはhを取得します。その例では、haではなくhを取得したのはkoでした。jman:それがあなたが思っていたものではない場合、より多くの答えが入る前にルールを素早く修正する方が良いです!
アレックスA.

回答:



6

JavaScriptの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ループに切り替え、長さが大幅に改善されました。以下のゴルフのないコードとテストUI。無限ループになるため、負の数を自己の責任で入力してください。(それを指摘してくれた無責任者に感謝します。)

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に負の数を入力しないでください。
15

4

SWI-Prolog、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-Prologの古いバージョンを持っている場合。


3

Pyth、52 42バイト

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

こちらのオンラインコンパイラで試すことができます。

さらに詳しく調べてくれたJakube、課題を明確にしたNinjaBearMonkey、Pythを作成して不注意でについて教えてくれたissacgに感謝しXます。

このプログラムは、子音と母音をランダムに選択して文字列を埋め、入力が奇数の場合は1つのペアに「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_です。
ジャクベ

1
一度しかJ使用しJないため、への割り当てを削除できます。
寂部

2
これにより、ランダムに選択されたペアではなく、hまたはyが末尾に追加されると思います。
NinjaBearMonkey

@ジャクベご協力ありがとうございます!
マイクブファルデシ

2

Perl、253 238バイト

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

私はおそらくさらにそれをゴルフすることができますが、これは今のところ行う必要があります。

変更点:

  • 自分で10バイト、Alex Aのおかげで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->...ます。

Ungolfed +説明:

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(プチコンピュータ)、197 177バイト

CONTEMPORARY EDIT 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)間番号を生成aし、b含みます):

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

ルビー、316の238 216文字

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文字短縮しました。


追加のコンボは不要です。そこにある空白の一部も不必要だと思います。たぶんいくつかを見て取るRubyでのゴルフのためのヒントを、あなたのコードを短縮するのに役立ちます。また、これは入力を受け取りますか?
アレックス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<<ic.push(i)ます。c.map{}はより短いですc.each{}i%2==1?1:2はの略ですif i%2==1;1;else;2;endprint "Enter..."codegolfでは必要ありません。)
blutorange

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.