Insta名称...只需添加编码器即可!


17

在英语中,一种确保发音无意义的字母组合的保证方法是完全使它脱离辅音元音对,例如,Wu ko pa haMe fa ro,首先是辅音,然后是元音

挑战:

编写一个程序或函数,给定用户指定的字母数,将使用此原理创建一个随机名称。就这么简单。

输入:

大于或等于2的整数,表示输出中所需的字母数。输入可以来自STDIN,命令行参数或函数参数。

输出:

给定长度的字符串,包含随机选择的辅音元音对。可以将其打印到STDOUT或最接近的替代版本,或者在使用函数的情况下返回。

规则:

  1. 英文字母的每个辅音应该为每对第一个字符选择的概率相等,英文字母的每个元音应该为每对第二个字符选择相等的概率。
  2. 字母对可以重复。
  3. 由于这是一个名称,因此首字母必须大写。
  4. 如果输入为奇数,则名称中随机选择的字母对应在末尾附加yh。y或h的选择也应该是随机的。
  5. 不允许有标准漏洞。
  6. 以字节为单位的最小代码获胜。

字母定义:

辅音:

bcdfghjklmnpqrstvwxyz

元音:

aeiou

I / O示例:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

请享用!


3
顺便说一下,欢迎来到Programming Puzzles和Code Golf.SE :)
trichoplax

我认为我的新格式更加清晰。是吗?@trichoplax
jman294

1
我将所有可能出现的问题发布到沙盒中,在这里发表之前,他们会获得大量反馈。它使事情变得容易-我建议以后再问。
trichoplax

谢谢,@ alex,由于这是我的第一个问题,所以我现在知道一些有关如何使用此站点的好的技巧。我学到了很多东西,希望我的下一个问题会更好!
jman294

1
@ASCIIThenANSI根据规则#4,随机选择的字母对将为y或h。在该示例中,是ko获得h,而不是ha。jman:如果您不是这样想的,那么最好在开始更多答案之前迅速修改规则!
Alex A.

Answers:



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循环,从而大大提高了长度。下面的非代码和测试用户界面。输入负数需要您自担风险,因为它会造成无限循环。(感谢您指出这一点。)

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-Prolog,286285字节

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阐明了挑战,感谢issacg创造了Pyth并无意间向我介绍了有关内容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大写Xt和一样_P_
2015年

1
您只能删除一次J,因此可以删除对的分配J
2015年

2
我认为这会在末尾加上h或y,而不是随机选择的一对。
NinjaBearMonkey 2015年

@Jakube再次感谢您的帮助!
Mike Bufardeci 2015年

2

Perl,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++}

我可能可以进一步打高尔夫球,但是现在应该这样做。

变化:

  • 我自己节省了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])))

这将创建一个未命名的lambda函数,该函数接受一个整数作为输入并返回一个字符串。它利用了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

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

编辑:意识到它没有大写第一个字母。我看明天我能不能打高尔夫球。
编辑2:记住了,.title但我认为就是那样。


如果仅字符串支持项目分配...
mbomb007

2

SmileBASIC 2(佩蒂特计算机),197个 177字节

2018年5月的当代编辑:这是我将近3年前提交的第一篇论文!从那时起,我的技能有了很大的提高。-20只需少量调整即可。

它以提示开头(为节省字节而留空,因此只是一个?),在其中输入长度(存储在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

我敢肯定,使用晦涩的BASIC语言会给我带来什么好处,但看起来却很奇怪,但是我设法使它对BASIC来说很小。它利用SB的怪异功能(例如由于没有布尔类型,所以条件条件评估为1或0)消除了我在3AM编写此字节时可能获得的尽可能多的字节。


1

Marbelous,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

Ruby,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位,所以一个字符是一个字节。仅当使用非ASCII字符(例如🙋,使用多个字节)时,才真正需要使用字节。
Beta Decay

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

Ruby,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提供了有关ruby高尔夫技巧的完整词典。

哇,我的代码缩短了100个字符。


多余的连击是不必要的。我认为其中的一些空白也是不必要的。也许看看Ruby中打高尔夫球的一些技巧,以帮助缩短您的代码。另外,这需要输入吗?
Alex A.

是的,需要输入,在重做问题之前,额外的连击对于加分必要的,我认为它们仍然可以使用。j是一个错字。
2015年

红宝石的一些技巧:for i in ?a..?z;...;end可以替换为(?a..?z).map{...}; 在thenif是可选的。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;end。的print "Enter..."不需要在codegolf; )
blutorange

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.