Insta-Name ... Просто добавьте кодер!

17

В английском языке, безошибочный способ сделать произносимое сочетание нонсенса письма , чтобы сделать его полностью из согласного гласного пара, например, Wu ко - ра га , или, Me фа ро , согласного первый, а затем гласным .

Вызов:

Напишите программу или функцию, которая при заданном пользователем количестве букв создаст случайное имя, используя этот принцип. Это так просто.

Входные данные:

Целое число, большее или равное 2, которое обозначает требуемое количество букв в выводе. Ввод может быть взят из STDIN, аргументов командной строки или аргументов функции.

Выход:

Строка заданной длины, содержащая случайно выбранные пары согласных и гласных. Он может быть распечатан в STDOUT или ближайшую альтернативу или возвращен в случае функции.

Правила:

  1. У каждого согласного английского алфавита должна быть равная вероятность быть выбранной для первого символа каждой пары, и у каждого гласного английского алфавита должна быть равная вероятность быть выбранной для второго символа каждой пары.
  2. Буквенные пары могут повторяться.
  3. Поскольку это имя, первая буква должна быть заглавной.
  4. Если ввод нечетный, пара произвольно выбранных букв в имени должна быть дополнена y или h в конце. Выбор y или h также должен быть случайным.
  5. Стандартные лазейки не допускаются.
  6. Наименьший код в байтах побеждает.

Буквенные определения:

Согласные:

bcdfghjklmnpqrstvwxyz

Гласные звуки:

aeiou

Пример ввода / вывода:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

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

jman294
источник
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}

Редактировать: я переключился с использования регулярных выражений замены на простой цикл for, который значительно улучшил длину. Разгруженный код и тестовый интерфейс ниже. Введите отрицательное число на свой страх и риск, потому что это делает бесконечный цикл. (Спасибо 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>

NinjaBearMonkey
источник
1
Примечание: не
вводите
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-Prolog.

Fatalize
источник
3

Pyth, 52 42 байта

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

Вы можете попробовать это в онлайн-компиляторе здесь.

Спасибо Jakube за дальнейшую игру в гольф, NinjaBearMonkey за прояснение проблемы и за создание команды 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буквы X. tэто то же самое , как _P_.
Якуб
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 благодаря Алексу А.
ASCIIThenANSI
источник
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

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 (Petit Computer), 197 177 байт

СОВРЕМЕННОЕ РЕДАКТИРОВАНИЕ МАЙ 2018 : Это было мое первое представление, почти 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

Я уверен, что участие с неясным языком Бейсик не даст мне ничего, кроме странных взглядов, но мне удалось сделать его довольно маленьким для Бейсика. Это использует странные причуды SB (такие как условные вычисления, оценивающие в 1 или 0, так как нет логического типа), чтобы исключить столько байтов, сколько я мог бы иметь, когда писал это в 3 часа ночи.

snail_
источник
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'
es1024
источник
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
blutorange
источник
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
MickyT
источник
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, как ОК .

Живая демоверсия. (Попробуйте установить 5в конце другое число, чтобы попробовать разные входы.)

kirbyfan64sos
источник
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, которые помогут сократить ваш код. Кроме того, это принимает вход?
Алекс А.
Да, он требует ввода, дополнительные комбо были необходимы для дополнительных очков, прежде чем вопрос был переделан, и я думал, что они все еще будут работать. 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