Утворіть вимовляється слово


16

Завдання проста:

генерувати слово.

Технічні умови:

  • Слово повинно бути вимовленим.
    • Це визначається як "чергування приголосного та голосного".
    • Приголосний - це одна з таких букв: bcdfghjklmnpqrstvwxz
    • Голова - це одна з таких букв: aeiouy
  • Слово повинно генеруватися випадковим чином.
  • Слова повинні вміти містити кожен приголосний і голосний. (Ви не можете просто використовувати bcdfдля приголосних і aeiдля голосних.)
  • Слово повинно містити 10 букв.
  • Найкоротший код (у кількості символів) виграє.


7
Зважаючи на цю смугу xkcd , програма echo buxitiwymuтехнічно відповідає технічним умовам. Запевняю вас, я генерував слово випадково: P
AardvarkSoup

1
@AardvarkSoup "Слова повинні вміщувати всі приголосні та голосні"
Doorknob

1
@Kartik залежить від контексту, у "так" - це приголосний, у "чому" - це голосний, але це унеможливить визначення вимовного слова як чергування голосних та приголосних, наприклад. yyyyyyy було б дійсним словом.
CJStuart

1
Я фактично зробив генератор на Scratch деякий час назад. У ньому були специфічні правила, коли можна ставитися yдо голосної, де можна вживати qта x, і коли можна використовувати ngea
двобуквені

Відповіді:



8

Ruby: 56 символів

([v=%w(a e i o u y),[*?a..?z]-v]*5).map{|a|$><<a.sample}

Приклади виходів:

  • itopytojog
  • umapujojim
  • іпагодусас
  • yfoqinifyw
  • ебіліподіз

1
'aeiouy'.charsбуло б на один чар коротше.
Говард

@Howard тоді оператор віднімання піднімаєтьсяTypeError: can't convert Enumerator into Array
Джон Дворак

@JanDvorak Вибачте, забув згадати, що для цього фокусу вам потрібен Ruby 2.0.
Говард

7

Пітона, 81

from random import*
print''.join(map(choice,["bcdfghjklmnpqrstvwxz","aeiouy"]*5))

Удачі вимовляючи їх.


Вони на насправді дуже легко вимовляють, наприклад, перше слово , яке я отримав , був «viketuziwo»:P
Дверна ручка

@Doorknob, можливо, це просто моя доля. Я продовжую отримувати "слова" типу "qijepyjyga". Спроби мого комп’ютера вимовити їх компенсують це все-таки :)
grc

3
Мені просто було весело робити python grc.py | sayна своїй машині. Дякую за ідею.
Кая

7

КОБОЛ, 255

Тому я зараз навчаюсь COBOL. Це питання використовував як деяку практику. Спробував пограти в гольф.

Це 255 без провідних пробілів, і 286 байт з.

Для чого це коштує, це працює у Microfocus COBOL для VS2012, і я не маю уявлення, чи буде він працювати деінде.

       1 l pic 99 1 s pic x(26) value'aeiouybcdfghjklmnpqrstvwxz' 1 r
       pic 99 1 v pic 9 1 q pic 99. accept q perform test after varying
       l from 1 by 1 until l>9 compute v=function mod(l,2) compute r=1+
       function random(q*l)*5+v*15+v*5 display s(r:1)end-perform exit


6

JavaScript, 74

for(a=b=[];a++-5;)b+="bcdfghjklmnpqrstvwxz"[c=new Date*a%20]+"aeiouy"[c%6]

Не генерує всіх комбінацій, але я думаю, що з’являються всі приголосні та голосні.

JavaScript, 79

for(a=b=[];a--+5;)b+="bcdfghjklmnpqrstvwxz"[c=Math.random()*20^0]+"aeiouy"[c%6]

Більш "випадкова" версія.


Для чого ^0?
Альфа

1
@Alpha Math.randomдає float, нам потрібно ціле число. ^0обрізає номер
копія

Розумна хитрість. Я раніше не бачив ^оператора в JavaScript і менше чув про його використання для обрізання плавучого елемента. Спасибі!
Альфа

@copy Мені подобається використання^
Math

4

Ruby: 70 66 символів

10.times{|i|$><<["aeiouy"*4,"bcdfghjklmnpqrstvwxz"][i%2][rand 20]}

Проба зразка:

bash-4.1$ ruby -e '10.times{|i|$><<["aeiouy"*4,"bcdfghjklmnpqrstvwxz"][i%2][rand 20]}'
izogoreroz

bash-4.1$ ruby -e '10.times{|i|$><<["aeiouy"*4,"bcdfghjklmnpqrstvwxz"][i%2][rand 20]}'
onewijolen

bash-4.1$ ruby -e '10.times{|i|$><<["aeiouy"*4,"bcdfghjklmnpqrstvwxz"][i%2][rand 20]}'
amilyfilil

Ви можете використовувати 10.timesна один char менше.
Говард

1
Також питання не вимагає, щоб кожна літера була однаковою. *10-> *4, пропустіть *3, rand 60-> rand 20і ви зберегли 3 символи.
Говард

Хороший лов за правило, @Howard. Дякую.
манатура

4

R: 105 символів

a=c(1,5,9,15,21,25)
l=letters
s=sample
cat(apply(cbind(s(l[-a],5),s(l[a],5)),1,paste,collapse=""),sep="")


4

Обробка, 100 99 93 87

int i=10;while(i-->0)"aeiouybcdfghjklmnpqrstvwxz".charAt((int)random(i%2*6,6+i%2*i*2));

При більш детальному вивченні питання я бачу, що він не потребує результатів. Я відповідно скоригував це.


3

Завдання-С, 129

main(){int i=10;while(i-->0)printf("%c",[(i%2==0)?@"aeiouy":@"bcdfghjklmnpqrstvwxz"characterAtIndex:arc4random()%(6+(i%2)*14)]);}

За допомогою Данієро

(Я люблю використовувати тенденції до оператора (->)


3

Java AKA - найголовніша мова, створена коли-небудь, 176 за допомогою Doorknob, Daniero та Peter Taylor (спасибі хлопці!)

class w{public static void main(String[]a){int i=11;while(--i>0)System.out.print((i%2==0?"aeiouy":"bcdfghjklmnpqrstvwxz").charAt(new java.util.Random().nextInt(6+(i%2)*14)));}}

Безголівки:

    class w {

        public static void main(String[] a) {
            int i = 11;
            while (--i > 0) {
                System.out.print((i % 2 == 0 ? "aeiouy" : "bcdfghjklmnpqrstvwxz").charAt(new java.util.Random().nextInt(6 + (i % 2) * 14)));
            }
     }

}


1
Пропоновані вдосконалення: Змініть String a[]на String[]a(-1 символ), змініть w W = new w();на w W=new w();(-2 символи)
Дверну ручку

Пропозиції: нехай слово завжди починається на приголосний (або на ткані); не потрібно рандомізувати це, коли питання не згадує про це! Отже, пропустіть булевий fі використовуйте i%2замість цього. Також forцикл можна скоротити, і ви можете помістити обидва рядки всередині умовного оператора (також тут немає необхідності в паронах), а також використовувати charAtзовнішню сторону. Ось і вся справа, 195 ЧАРВ, 38 ЗБЕРЕЖЕНО :import java.util.*;class w{public static void main(String[]a){Random r=new Random();for(int i=0;++i<11;)System.out.print((i%2>0?"bcdfghjklmnpqrstvwxz":"aeiouy").charAt(r.nextInt(6+(i%2)*14)));}}
ЗБЕРЕЖЕНО

2
"Java AKA - це найголовніша мова, яку коли-небудь створювали" - коли-небудь пробував Шекспіра ? ;-)
манатура

1
@manatwork, не забудьте видалити імпорт, коли ви перестанете використовувати його лише в одному місці.
Пітер Тейлор

1
@manatwork можливо нам подобається lisp ?? ок, вибачте, я вийму ці дужки, коли я
повернуся

3

Javascript, 85

for(r=Math.random,s="",i=5;i--;)s+="bcdfghjklmnpqrstvwxz"[20*r()|0]+"aeiouy"[6*r()|0]

Якщо працювати з консолі, відображається вихід. Явний дисплей додав би alert(s)на 8 символів, ще коротший, ніж інші рішення JS.

Дякую C5H8NNaO4 та Howard!


Хороший, збережіть персонаж, видаливши останній ';'
C5H8NNaO4

1
Замість цього ~~(###)ви можете написати, ###|0що економить 4 символи.
Говард



3

Unix tools: 73 bytes

And not guaranteed running time :)

</dev/urandom grep -ao '[aeiouy][bcdfghjklmnpqrstvwxz]'|head -5|paste -sd ''

Only problem is that the generated string will start with a "vowel" every time.

(edit: changed ' ' to '' in the args of paste) (another edit: removed -P from grep options, thanks to manatwork)


Something could be fine tuned around the grep parameters. I got “of e� ap ag ak”.
manatwork

Hmm... strange. I got nothing like that. I thought -a would be enough.
pgy

1
My test indicates that -P is the one. Seems the man warns about its highly experimental status with a reason. (grep 2.16) But anyway, it works fine without -P.
manatwork

You are right thank you, I didn't consider that. I don't even know why I used -P in the first place. I'll edit my answer.
pgy

1
By the way, tr -d \\n is shorter for joining the lines.
manatwork

3

Pyth, 26 characters

J-G"aeiouy"VT=k+kOJ=J-GJ;k

You can try it in the online compiler here.

Someone posted a very similar challenge but it was closed after I had made a solution. I didn't realize it, but this question actually predates the creation of Pyth. Anyway, here is the breakdown:

J                             Set string J equal to:
  G                            the entire alphabet (lowercase, in order)
 - "aeiouy"                    minus the vowels
           VT                 For n in range(1, 10):
             =k                   Set string k to:
                k                  k (defaults to empty string)
               + OJ                plus a random character from J
                   =J             Set J to:
                      G            the entire alphabet
                     - J           minus J
                        ;     End of loop
                         k    print k

Every time the loop is run, J switches from being a list of consonants to a list of vowels. That way we can just pick a random letter from J each time.
There may be a way to initialize J in the loop or remove the explicit assignments from the loop, but I have not had success with either yet.


1
Bumping old questions is generally considered fine. However, when you use a language newer than the question (I created Pyth in 2014) you should note this in your answer.
isaacg

Thanks for clearing that up for me. I didn't realize that Pyth was created after this question and I've added that to the answer.
Mike Bufardeci

3

APL 30 26

,('EIOUY'∪⎕A)[6(|,+)⍪5?20]

Explanation is very similar to the past version below, just reordered a bit to golf the solution.

Note: ⎕IO is set to 0


('EIOUY'∪⎕A)[,6(|,(⍪+))5?20]

Explanation:

'EIOUY'∪⎕A    puts vowels in front of all letters.
5?20            for the indexes we start choosing 5 random numbers between 0 and 19
6(|,(⍪+))        then we sum 6 and the random numbers, convert to 5x1 matrix (⍪), add a column before this one containing 6 modulo the random numbers. 
                [[[ this one can be rewritten as: (6|n) , ⍪(6+n)  for easier understanding]]]
,6(|,(⍪+))5?20  the leading comma just converts the matrix to a vector, mixing the vowel and consonants indexes.

Tryapl.org


1
('AEIOUY'∪⎕A) ≡ (∪'AEIOUY',⎕A) but it's one byte shorter.
lstefano

1
Deferring 'A' to ⎕A saves another byte: ,('EIOUY'∪⎕A)[6(|,+)⍪5?20]
Adám

Nice! down to 26. Thanks
Moris Zucca

2

PHP 79 bytes

<?for($c=bcdfghjklmnpqrstvwxz,$v=aeiouy;5>$i++;)echo$c[rand()%20],$v[rand()%6];

Fairly concise.


2

C: 101

main(){int x=5;while(x-->0){putchar("bcdfghjklmnpqrstvwxyz"[rand()%21]);putchar("aeiou"[rand()%5]);}}

2

Javascript, 104 87

a="";for(e=10;e--;)a+=(b=e&1?"bcdfghjklmnpqrstvwxz":"aeiouy")[0|Math.random()*b.length]

golfed a whole lot of simple unnecessary stuff, still not nearly as nice as copys' one

Oh, and that one just opped up during golfing: "dydudelidu"

Now I tried one using the 2 characters at once approach. Turns out it's almost the same as copys' second one, so I can't count it, also at 79. a="";for(e=5;e--;)a+="bcdfghjklmnpqrstvwxz"[m=0|20*Math.random()]+"aeiouy"[m%6]


2

Brachylog, 9 bytes

Ḍ;Ẉṣᵐzh₅c

Try it online!

Gives output as a list of letters through the output variable.

   ṣ         Randomly shuffle
 ;  ᵐ        both
Ḍ            the consonants without y
  Ẉ          and the vowels with y,
     z       zip them into pairs,
      h₅     take the first five pairs,
             and output
        c    their concatenation.

1

F#, 166 characters

open System;String.Join("",(Random(),"aeiouybcdfghjklmnpqrstvwxz")|>(fun(r,s)->[0..5]|>List.collect(fun t->[s.Substring(6+r.Next()%20,1);s.Substring(r.Next()%6,1)])))

1

K, 40 bytes

,/+5?/:("bcdfghjklmnpqrstvwxz";"aeiouy")

5?"abc" will generate 5 random letters from the given string.

5?/: will generate 5 random letters from each of the strings on the right, producing two lists.

+ transposes those two lists, giving us a list of tuples with one random character from the first list and then one from the second list.

,/ is "raze"- fuse together all those tuples in sequence.

K5 can do this in 33 bytes by building the alphabet more cleverly and then using "except" (^) to remove the vowels, but K5 is much too new to be legal in this question:

,/+5?/:((`c$97+!26)^v;v:"aeiouy")

1

R, 83 bytes

cat(outer((l<-letters)[a<-c(1,5,9,15,21,25)],l[-a],paste0)[sample(1:120,5)],sep="")

Generate all possible vowel-consonant sequences in a matrix, then randomly sample 5 of them, yielding a 10-letter word.



0

Jelly, 13 bytes

Øy,ØYẊ€Zs5ḢŒl

Explanation:

Øy,ØYẊ€Zs5ḢŒl
Øy,ØY         Makes a list of two lists of characters: [[list-of-vowels-with-y], [list-of-consonants-without-y]]
     Ẋ€       Shuffle €ach.
       Z      Zip those two lists together. [[random-vowel, random-consonant],...]
        s5    Split them into chunks of five (because each pair contains two letters, this splits them into chunks of 10 letters)
          Ḣ   Take the list of 5 pairs.
           Œl Make each of the characters in it lowercase
              Implicit concatenation and print.

Try it online!

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