Insta-Name… Sadece Kodlayıcı Ekle!


17

İngilizce dilinde, belirgin bir saçmalık harf kombinasyonu yapmanın kesin bir yolu, onu tamamen ünsüz sesli harf çiftlerinden, örneğin Wu ko pa ha veya önce Me fa ro , ünsüz , ardından sesli harf yapmaktır .

Meydan okuma:

Kullanıcı tarafından belirtilen sayıda harf verildiğinde, bu ilkeyi kullanarak rastgele bir ad oluşturacak bir program veya işlev yazın. Bu kadar basit.

Giriş:

Çıktıda gereken harf sayısını belirten 2'den büyük veya ona eşit bir tam sayı. Giriş STDIN, komut satırı bağımsız değişkenleri veya işlev bağımsız değişkenlerinden alınabilir.

Çıktı:

Rastgele seçilen ünsüz sesli harf çiftlerini içeren belirli bir uzunluktaki bir dize. STDOUT veya en yakın alternatife basılabilir veya bir işlev durumunda iade edilebilir.

Kurallar:

  1. İngiliz alfabesinin her ünsüzünün her çiftin ilk karakteri için eşit seçilme olasılığı olmalı ve İngiliz alfabesinin her sesli harfinin her bir çiftin ikinci karakteri için eşit seçilme olasılığı olmalıdır.
  2. Harf çiftleri tekrarlanabilir.
  3. Bu bir ad olduğundan, ilk harf büyük yazılmalıdır.
  4. Giriş tekse, adda rastgele seçilen bir harf çiftinin sonuna y veya h eklenmelidir . Y veya h seçimi de rastgele olmalıdır.
  5. Standart boşluklara izin verilmez.
  6. Bayt cinsinden en küçük kod kazanır.

Harf tanımları:

Sessiz harfler:

bcdfghjklmnpqrstvwxyz

Sesli harfler:

aeiou

Örnek G / Ç:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Zevk almak!


3
Ve bu arada, Programlama Bulmacaları ve Kod Golf'e hoş geldiniz.SE :)
trichoplax

Yeni formatımın daha net olduğunu düşünüyorum. Bu mu? @trichoplax
jman294

1
Tüm potansiyel sorularımı burada göndermeden önce bol miktarda geri bildirim alabilecekleri sanal alana gönderiyorum. İşleri kolaylaştırıyor - gelecekteki sorular için tavsiye ederim.
trichoplax

Teşekkürler @alex, Bu benim ilk sorum olduğu için, şimdi bu siteyi nasıl kullanacağım hakkında iyi bir teknik biliyorum. Çok şey öğrendim ve umarım bir sonraki sorum daha iyi olacak!
jman294

1
@ASCIIThenANSI Kural # 4 uyarınca, rastgele seçilmiş bir harf çifti ay veya saat alır. Bu örnekte, h'yi elde eden ko , ha değil . jman: Eğer aklınızdaki bu değilse, daha fazla cevap gelmeye başlamadan önce kuralları daha iyi değiştirin!
Alex

Yanıtlar:



6

JavaScript ES6, 187 180 168 bayt

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}

Düzenleme: Ben regex yerine kullanarak uzunluğunu önemli ölçüde geliştirdi döngü için basit geçiş yaptı. Kod çözülmemiş kod ve test kullanıcı arayüzü aşağıda. Sonsuz bir döngü oluşturduğu için kendi sorumluluğunuzda negatif bir sayı girin. (Bunu belirttiğiniz için unclemeat'a teşekkürler.)

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
Not: Test kullanıcı arayüzüne negatif bir sayı koymayın ..
unclemeat

4

SWI-Prolog, 286 bayt

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

Misal: a(13). çıktılar Leqihsekeqira.

Not: SWI-Prolog'un eski bir sürümüne sahipseniz , `ile değiştirmeniz gerekebilir ".


3

Pyth, 52 42 bayt

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

Buradaki çevrimiçi derleyicide deneyebilirsiniz.

Daha fazla golf oynadığı için Jakube'e teşekkürler, NinjaBearMonkey meydan okumayı açıkladığı için ve Pyth oluşturma ve yanlışlıkla bana X .

Bu program, dizeyi doldurmak için rastgele bir ünsüz ve sesli harf seçer, giriş tekse bir çifte 'h' veya 'y' ekler, ardından ilk karakteri büyük yapar. İşte arıza:

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

İlk ünsüz sesli harf çiftine 'h' veya 'y' eklemek ve ardından listeyi karıştırmak yetersiz görünüyor. Rastgele bir çifti eklemeyi denedim ama kod her zaman bundan daha uzundu.


Pyth ve bunu bilen kodlayıcılar beni hep şaşırtıyor.
jman294

1
Sadece birkaç püf noktası: rX1büyük harf kullanımı X. tile aynı şeydir _P_.
Jakube

1
Yalnızca bir kez Jkullandığınız Jiçin adresine atamayı kaldırabilirsiniz .
Jakube

2
Bence bu rastgele seçilmiş bir çifti değil, sonuna h veya y ekler.
NinjaBearMonkey

@Jakube Yardımınız için bir kez daha teşekkürler!
Mike Bufardeci

2

Perl, 253 238 bayt

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

Muhtemelen daha fazla golf olabilir, ama bu şimdilik yapmalı.

değişiklikler:

  • Kendim tarafından 10 bayt ve Alex A. sayesinde 5 kurtardı.

2

Julia, 141 bayt

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

Bu, bir tamsayıyı girdi olarak kabul eden ve bir dize döndüren adsız bir lambda işlevi oluşturur. Julia'daki dizelerin karakter dizileri gibi dizine eklenmesi ve kaynak gösterilmesi gerçeğinden yararlanır. Bunu aramak için bir ad verin, örn f=n->....

Ungolfed + açıklaması:

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

Örnekler:

julia> f(9)
"Luyvunize"

julia> f(2)
"Fe"

julia> f(16)
"Pahonapipesafuze"

2

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

Düzenleme: İlk harfi büyük yazılmadığını fark etti. Yarın tekrar golf oynayabileceğimi göreceğim.
Edit 2: Hatırladım .titleama bence bu olacak.


Yalnızca dizeleri öğe atamasını destekliyorsa ...
mbomb007

2

SmileBASIC 2 (Petit Bilgisayar), 197 177 bayt

ÇAĞDAŞ DÜZENLEME MAYIS 2018 : Bu, yaklaşık 3 yıl önce ilk sunumumdu! O zamandan beri becerilerim çok gelişti; -20 sadece küçük ayarlardan.

Bir istem ile başlar (baytları kaydetmek için boş bırakılır, bu yüzden uzunluğa koyduğunuz (değişkende depolanan) sadece bir? 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

Eminim, belirsiz bir BASIC diline katılmak bana garip bakışlardan başka bir şey getirmeyecek, ancak BASIC için oldukça küçük yapmayı başardım. SB'nin garip tuhaflıklarından (boolean türü olmadığı için 1 veya 0 olarak değerlendirilen şartlar gibi) yararlanır, bunu 03:00 'da yazarken alabileceğim kadar bayt ortadan kaldırır.


1

Marbelous, 203 bayt

}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

Burada test edin (çevrimiçi tercüman). Bağımsız değişkenler aracılığıyla girdi. Kütüphaneler ve silindirik kartlar etkinleştirilmelidir.

Yorum yapılmış / okunabilir versiyon:

}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

Bu kabaca aşağıdaki sahte kodla eşdeğerdir ( random(a,b)arasında ave bdahil sayıları üretir ):

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 bayt

Büyük harf kullanımı için 13 bayt ...

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

Kullanımı:

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

Çıktı:

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

0

C, 219 karakter

Çalışıyor gibi görünüyor, hala bu konuda yeniyim.

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
Bu rastgele sayıyı yalnızca bir kez oluşturup bir yere kaydetmedikçe, tekdüze bir dağıtım almak rand()%(n-1-i)<2yerine gerekir rand()%(n-1)<(i+2).
jimmy23013

Her karakter bir bayt mı yoksa kaç bayt var?
jman294

@ jman294 ASCII alfabesi karakter başına 8 bit kullandığından, karakter bir bayttır. Baytları yalnızca ASCII olmayan karakterler 🙋kullanıyorsanız, örneğin birden fazla bayt kullanıyorsanız gerçekten kullanmanız gerekir .
Beta Çürümesi

0

R, 166 bayt

STDIN'den girdi alır ve STDOUT'a çıktılar.

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

açıklama

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

Bazı testler

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

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

Bu Kona veya kdb + 'da ÇALIŞMAZ; OK gibi bir K5 yorumlayıcı kullanmanız gerekir .

Canlı demo. ( 5Farklı girişleri denemek için sonunda farklı bir sayıya ayarlamayı deneyin.)


0

Yakut, 316238166 karakter

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;

Tek sayı kombinasyonları hveya ile biter y.

Ruby Golf'ün tam bir sözlüğü için @bebektorange'a teşekkürler.

Vay, kodumu 100 karakter kısalttım.


Ekstra kombinasyonlar gereksizdir. Bence içerideki boşlukların bir kısmı da gereksiz. Kodunuzu kısaltmaya yardımcı olmak için Ruby'de golf oynamak için bazı ipuçlarına göz atın . Ayrıca, bu girdi alır mı?
Alex

Evet, ekstra tarak, girdi alır edildi soru yeniden yapıl var ve onlar iş hala düşündüm önce fazladan puan için gerekli. jbir yazım hatasıydı.
alkış

Yakut ile sadece birkaç hile: for i in ?a..?z;...;endile değiştirilebilir (?a..?z).map{...}; thenSonra ifisteğe bağlıdır. v.include?(i)||c.push(i)için kısadır unless v.include?(i);c.push(i). Kullanım c<<iiçin c.push(i). c.map{}daha kısadır c.each{}. i%2==1?1:2için kısadır if i%2==1;1;else;2;end. print "Enter..."Codegolf gerekli değildir; )
blutorange

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.