Nazwa Insta… Wystarczy dodać koder!


17

W języku angielskim pewnym sposobem na stworzenie wymownej kombinacji nonsensownych liter jest całkowite wykorzystanie par spółgłoskowo-samogłoskowych, np. Wu ko pa ha , lub Me fa ro , najpierw spółgłoska , a następnie samogłoska .

Wyzwanie:

Napisz program lub funkcję, która na podstawie określonej przez użytkownika liczby liter utworzy losową nazwę, stosując tę ​​zasadę. To takie proste.

Wejście:

Liczba całkowita większa lub równa 2, która oznacza wymaganą liczbę liter na wyjściu. Dane wejściowe mogą być pobierane z STDIN, argumentów wiersza poleceń lub argumentów funkcji.

Wynik:

Ciąg o podanej długości zawierający losowo wybrane pary spółgłosek i samogłoski. Można go wydrukować do STDOUT lub najbliższej alternatywy lub zwrócić w przypadku funkcji.

Zasady:

  1. Każda spółgłoska alfabetu angielskiego powinna mieć jednakowe prawdopodobieństwo wybrania pierwszego znaku każdej pary, a każda samogłoska alfabetu angielskiego powinna mieć równe prawdopodobieństwo wybrania drugiego znaku każdej pary.
  2. Pary liter można powtarzać.
  3. Ponieważ jest to nazwa, pierwsza litera musi być wielka.
  4. Jeśli dane wejściowe są nieparzyste, losowo wybrana para liter w nazwie powinna mieć na końcu y lub h . Wybór y lub h powinien być również losowy.
  5. Standardowe luki są niedozwolone.
  6. Najmniejszy kod w bajtach wygrywa.

Definicje liter:

Spółgłoski:

bcdfghjklmnpqrstvwxyz

Samogłoski:

aeiou

Przykład I / O:

Input: 6
Output: Mefaro

Input: 9
Output: Wukohpaha

Cieszyć się!


3
A tak przy okazji, witamy w Programowanie łamigłówek i Code Golf.SE :)
trichoplax

Myślę, że mój nowy format jest bardziej przejrzysty. Czy to jest @trichoplax
jman294

1
Publikuję wszystkie moje potencjalne pytania w piaskownicy, gdzie mogą uzyskać wiele opinii przed opublikowaniem tutaj. Ułatwia to - polecam na przyszłe pytania.
trichoplax

Dzięki, @alex, ponieważ to moje pierwsze pytanie, teraz znam dobrą technikę korzystania z tej strony. Wiele się nauczyłem i mam nadzieję, że moje następne pytanie będzie lepsze!
jman294

1
@ASCIIThenANSI Zgodnie z regułą nr 4 losowo wybrana para liter otrzyma ay lub h. W tym przykładzie to ko otrzymało h, a nie ha . jman: Jeśli nie o to ci chodziło, lepiej zmodyfikuj reguły szybko, zanim pojawi się więcej odpowiedzi!
Alex A.,

Odpowiedzi:



6

JavaScript ES6, 187 180 168 bajtów

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}

Edycja: przełączyłem się z używania regex replace na prostą pętlę for, co znacznie poprawiło długość. Kod niepoddany golfowi i testowanie interfejsu użytkownika poniżej. Wprowadź liczbę ujemną na własne ryzyko, ponieważ tworzy nieskończoną pętlę. (Dzięki bezczelności za zwrócenie na to uwagi.)

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
Uwaga: Nie umieszczaj liczby ujemnej w testowym interfejsie użytkownika.
uwolnij się

4

SWI-Prolog, 286 285 bajtów

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

Przykład: a(13).wyjścia Leqihsekeqira.

Uwaga: Być może trzeba wymienić `ze "jeśli masz starą wersję SWI-Prologu.


3

Pyth, 52 42 bajty

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

Możesz spróbować w kompilatorze online tutaj.

Dzięki Jakube za dalszą grę w golfa, NinjaBearMonkey za wyjaśnienie wyzwania i issacg za stworzenie Pytha i nieumyślne nauczenie mnie o X .

Ten program losowo wybiera spółgłoskę i samogłoskę, aby wypełnić ciąg, dodaje „h” lub „y” do jednej pary, jeśli dane wejściowe są nieparzyste, a następnie dodaje pierwszy znak do dużej litery. Oto podział:

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

Dołączenie „h” lub „y” do pierwszej pary spółgłosek i samogłosek wydaje się nieskuteczne, a następnie zaszyfrowanie listy. Próbowałem dołączyć do losowej pary, ale kod był zawsze dłuższy.


Pyth i znający go koderzy zawsze mnie zadziwiają.
jman294

1
Kilka sztuczek: wielkie rX1litery X. tto to samo co _P_.
Jakube,

1
Możesz usunąć przypisanie do J, ponieważ używasz Jtylko raz.
Jakube,

2
Myślę, że to dodaje h lub y do końca, a nie losowo wybraną parę.
NinjaBearMonkey

@Jakube Jeszcze raz dziękuję za pomoc!
Mike Bufardeci,

2

Perl, 253 238 bajtów

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

Prawdopodobnie mogę grać w golfa dalej, ale na razie powinno to wystarczyć.

Zmiany:

  • Zaoszczędziłem 10 bajtów i 5 dzięki Alexowi A.

2

Julia, 141 bajtów

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

Tworzy to nienazwaną funkcję lambda, która przyjmuje liczbę całkowitą jako dane wejściowe i zwraca ciąg znaków. wykorzystuje fakt, że ciągi w Julii można indeksować i odwoływać do nich jak tablice znaków. Aby to nazwać, nadaj mu nazwę, np f=n->....

Niegolfowane + wyjaśnienie:

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

Przykłady:

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

Edycja: Zdałem sobie sprawę, że pierwsza litera nie jest pisana wielką literą. Zobaczę, czy jutro mogę zagrać w golfa.
Edycja 2: Pamiętam, .titleale myślę, że to będzie to.


Gdyby tylko łańcuchy obsługiwały przypisywanie przedmiotów ...
mbomb007

2

SmileBASIC 2 (komputer Petit), 197 177 bajtów

EDYCJA WSPÓŁCZESNA MAJ 2018 : To była moja pierwsza praca w historii, prawie 3 lata temu! Od tego czasu moje umiejętności znacznie się poprawiły; -20 tylko z niewielkich korekt.

Zaczyna się od monitu (pozostawia się puste, aby zapisać bajty, więc jest to tylko?), W którym podajesz długość (przechowywaną w zmiennej 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

Jestem pewien, że uczestnictwo w niejasnym języku BASIC nie przyniesie mi nic poza dziwnym wyglądem, ale udało mi się uczynić go dość małym dla BASIC. Wykorzystuje dziwne dziwactwa SB (takie jak warunek oceniający na 1 lub 0, ponieważ nie ma typu boolowskiego), aby wyeliminować tyle bajtów, ile mogłem, gdy napisałem to o 3 nad ranem.


1

Cudowny, 203 bajty

}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

Sprawdź to tutaj (tłumacz online).Wejście za pomocą argumentów. Biblioteki i płytki cylindryczne muszą być włączone.

Skomentowana / czytelna wersja:

}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

Jest to mniej więcej odpowiednik następującego pseudokodu ( random(a,b)generuje liczby między ai bwłącznie):

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 bajtów

13 bajtów na wielkie litery ...

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

Stosowanie:

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

Wynik:

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

0

C, 219 znaków

Wydaje się, że działa, wciąż jestem w tym nowy.

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
Musisz rand()%(n-1-i)<2zamiast tego rand()%(n-1)<(i+2)uzyskać jednolity rozkład, chyba że wygenerujesz tę liczbę losową tylko raz i zapiszesz ją gdzieś.
jimmy23013

Czy każdy znak jest bajtem lub ile bajtów?
jman294

@ jman294 Ponieważ alfabet ASCII używa 8 bitów na znak, znak ma jeden bajt. Naprawdę musisz używać bajtów tylko wtedy, gdy używasz znaków spoza ASCII, np. 🙋Który używa więcej niż jednego bajtu.
Rozpad beta

0

R 166 bajtów

Pobiera dane wejściowe ze STDIN i dane wyjściowe do 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='')

Wyjaśnienie

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

Niektóre testy

> 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 bajtów

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

To NIE będzie działać na Kona lub kdb +; trzeba używać tłumacza K5 jak oK .

Demo na żywo. (Spróbuj ustawić 5na końcu inną liczbę, aby wypróbować różne dane wejściowe.)


0

Rubin, 316 238 216 znaków

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;

Kombinacje liczb nieparzystych kończą się na hlub y.

Dzięki @blutorange za pełny słownik rubinowych wskazówek golfowych.

Whoa, skróciłem mój kod o 100 znaków.


Dodatkowe kombinacje są niepotrzebne. Myślę, że niektóre białe znaki są niepotrzebne. Może rzucisz okiem na kilka wskazówek dotyczących gry w Ruby, aby skrócić swój kod. Czy to również wymaga wkładu?
Alex A.,

Tak, wymaga wkładu, dodatkowe kombinacje były potrzebne do uzyskania dodatkowych punktów, zanim pytanie zostało ponownie wykonane, i pomyślałem, że nadal będą działać. jbyła literówka.
klaskać

Kilka sztuczek z rubinem: for i in ?a..?z;...;endmożna je zastąpić (?a..?z).map{...}; thenPo ifto opcjonalne. v.include?(i)||c.push(i)jest skrótem od unless v.include?(i);c.push(i). Użyj c<<idla c.push(i). c.map{}jest krótszy niż c.each{}. i%2==1?1:2jest skrótem od if i%2==1;1;else;2;end. W print "Enter..."codegolf nie jest potrzebny; )
blutorange

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.