Insta-Name… Просто додайте кодер!


17

В англійській мові вірним способом складати словосполучення, яке вимовляє нісенітниця, є це зробити повністю з приголосно-голосних пар, наприклад, Wu ko pa ha , або, Me fa ro , спочатку приголосний , а потім голосний .

Виклик:

Напишіть програму або функцію, яка з урахуванням визначеної користувачем кількості літер створить випадкове ім'я за цим принципом. Це так просто.

Вхід:

Ціле число більше або дорівнює 2, яке позначає необхідну кількість літер у висновку. Введення можна взяти з STDIN, аргументів командного рядка або аргументів функції.

Вихід:

Рядок заданої довжини, що містить випадково вибрані приголосно-голосні пари. Він може бути надрукований в STDOUT або найближчої альтернативи або повернутий у випадку функції.

Правила:

  1. Кожен приголосний англійський алфавіт повинен мати однакову ймовірність бути вибраним для першого символу кожної пари, а кожен голосний англійського алфавіту повинен мати однакову ймовірність бути вибраним для другого символу кожної пари.
  2. Листи пар можуть повторюватися.
  3. Оскільки це ім'я, перша літера має бути написана з великої літери.
  4. Якщо вхід непарний, довільно обрана літера літери в імені повинна бути додана y або h до кінця. Вибір y або h повинен бути випадковим.
  5. Стандартні лазівки заборонені.
  6. Найменший код у байтах виграє.

Визначення букви:

Приголосні:

bcdfghjklmnpqrstvwxyz

Голосні звуки:

aeiou

Приклад вводу / виводу:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Насолоджуйтесь!


3
І, до речі, ласкаво просимо до програмування головоломки і код Golf.SE :)
Trichoplax

Я думаю, що мій новий формат є більш зрозумілим. Є це? @trichoplax
jman294

1
Я розміщую всі свої потенційні запитання в пісочниці, де вони можуть отримати багато відгуків, перш ніж розміщувати тут. Це полегшує справи - я рекомендую його для майбутніх питань.
трихоплакс

Дякую, @alex, Оскільки це моє перше запитання, я тепер знаю добру техніку щодо використання цього сайту. Я багато чого навчився, і сподіваюсь, що моє наступне питання стане кращим!
jman294

1
@ASCIIThenANSI За правилом №4 випадково вибрана пара букв отримає ay або h. У цьому прикладі було ко, що отримало ч, а не га . jman: Якщо це не те, що ви мали на увазі, краще швидко модифікуйте правила, перш ніж почати надходити більше відповідей!
Алекс А.

Відповіді:



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}

Редагувати: я перейшов з заміни регулярного виразу на простий для циклу, що значно покращив довжину. Невикольований код і тестуйте інтерфейс користувача нижче. Введіть негативне число на свій страх і ризик, оскільки воно робить нескінченний цикл. (Дякую нечистим м'ясам, що вказали на це.)

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
Примітка: Не додайте від'ємне число в тестовий інтерфейс ..
нечисте

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

Ви можете спробувати його в онлайн-компіляторі тут.

Дякую Якубе, що продовжував займатися його майстерністю, 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" до першої пари приголосних-голосних, а потім скремтувати список. Я спробував приєднатися до випадкової пари, але код завжди був довший за це.


Піт, і кодери, які це знають, завжди мене дивують.
jman294

1
Всього кілька хитрощів: rX1великі літери X. tте саме, що і _P_.
Jakube

1
Ви можете видалити завдання J, оскільки ви використовуєте Jлише один раз.
Якубе

2
Я думаю, що це додає h або y до кінця, а не випадково вибраної пари.
NinjaBearMonkey

@Jakube Ще раз дякую за вашу допомогу!
Майк Буфардечі

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 байт і 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])))

Це створює неназвану лямбда-функцію, яка приймає ціле число як вхід і повертає рядок. слід скористатися тим, що рядки в Джулії можна індексувати та посилатись на зразок масивів символів. Щоб зателефонувати, дайте ім’я, наприклад 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 : Це моє перше подання коли-небудь, майже 3 роки тому! Мої навички значно покращилися відтоді; -20 лише від незначних коригувань.

Він починається з підказки (він залишається порожнім для збереження байтів, тому це просто a?), Де ви ставите в довжину (зберігається в змінній 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. Скористайтеся дивними химерностями SB (як умовні умови, що оцінюють до 1 або 0, оскільки немає булевого типу), щоб усунути стільки байтів, скільки я, можливо, міг би мати, коли я писав це в 3:00.


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

Рубін, 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, у 🙋яких використовується більше одного байта.
Бета-розпад

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

К5, 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 +; вам потрібно використовувати інтерпретатор K5, як oK .

Демонстраційна демонстрація. (Спробуйте встановити 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 знаків.


Зайві комбо зайві. Я думаю, що дещо з пробілів там також непотрібне. Можливо, ознайомтеся з деякими порадами щодо гольфу в Рубі, щоб допомогти скоротити код. Також це потребує вкладу?
Олексій А.

Так, потрібен вклад, додаткові комбінації були необхідні для отримання додаткових балів, перш ніж питання було перероблене, і я подумав, що вони все ще працюватимуть. 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. The print "Enter..."не потрібен у codegolf; )
blutorange

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.