19
\$\begingroup\$

The challenge is simple:

generate a word.

Specifications:

  • Word must be pronounceable.
    • This is defined as "alternating between a consonant and a vowel."
    • A consonant is one of the following letters: bcdfghjklmnpqrstvwxz
    • A vowel is one of the following letters: aeiouy
  • Word must be randomly generated.
  • Words must be able to contain every consonant and vowel. (You can't just use bcdf for consonants and aei for vowels.)
  • Word must contain 10 letters.
  • Shortest code (in character count) wins.
\$\endgroup\$
9
  • 1
    \$\begingroup\$ codegolf.stackexchange.com/questions/11215/alien-name-generator \$\endgroup\$ Commented Jun 18, 2013 at 4:43
  • 8
    \$\begingroup\$ With this xkcd strip in mind, the program echo buxitiwymu technically conforms to the specification. I assure you, I generated the word randomly:P \$\endgroup\$ Commented Jun 23, 2013 at 22:02
  • 1
    \$\begingroup\$ @AardvarkSoup "Words must be able to contain every consonant and vowel" \$\endgroup\$
    – Doorknob
    Commented Jun 23, 2013 at 22:52
  • 1
    \$\begingroup\$ @Kartik depends on the context, in 'yes' it's a consonant, in 'why' it's a vowel, but this would make it impossible to define a pronounceable word as alternating between vowels and consonants, eg. yyyyyyyy would be a valid word. \$\endgroup\$ Commented Feb 17, 2015 at 22:30
  • 2
    \$\begingroup\$ I actually made a generator on Scratch a while back. It had specific rules for when you can treat y as a vowel, where you can use q and x, and when you can use two-letter combinations like ng or ea \$\endgroup\$ Commented Nov 6, 2016 at 21:42

36 Answers 36

9
\$\begingroup\$

COBOL, 255

So I'm learning COBOL at the moment. Used this question as some practice. Tried to golf it.

It's 255 without the leading whitespace, and 286 bytes with.

For what it's worth, this runs in Microfocus COBOL for VS2012, and I have no idea if it will run anywhere else.

       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
\$\endgroup\$
8
\$\begingroup\$

GolfScript, 32 characters

['aeiouy'.123,97>^]5*{.,rand=}%+

Run it online.

\$\endgroup\$
8
\$\begingroup\$

Python, 81

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

Good luck pronouncing them.

\$\endgroup\$
3
  • \$\begingroup\$ They're actually quite easy to pronounce, for example the first word I got was "viketuziwo" :P \$\endgroup\$
    – Doorknob
    Commented Jun 18, 2013 at 3:16
  • \$\begingroup\$ @Doorknob maybe it's just my luck. I keep getting 'words' like "qijepyjyga". My computer's attempts to pronounce them make up for it though :) \$\endgroup\$
    – grc
    Commented Jun 18, 2013 at 5:04
  • 4
    \$\begingroup\$ I just had a lot of fun doing python grc.py | say on my machine. Thanks for the idea. \$\endgroup\$
    – Kaya
    Commented Jun 21, 2013 at 3:07
8
\$\begingroup\$

Ruby: 56 characters

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

Example outputs:

  • itopytojog
  • umapujojim
  • ipagodusas
  • yfoqinifyw
  • ebylipodiz
\$\endgroup\$
3
  • 1
    \$\begingroup\$ 'aeiouy'.chars would be one char shorter. \$\endgroup\$
    – Howard
    Commented Jun 19, 2013 at 6:01
  • \$\begingroup\$ @Howard then the subtraction operator raises TypeError: can't convert Enumerator into Array \$\endgroup\$ Commented Jun 19, 2013 at 6:30
  • \$\begingroup\$ @JanDvorak Sorry, forgot to mention that you need Ruby 2.0 for this trick. \$\endgroup\$
    – Howard
    Commented Jun 19, 2013 at 6:38
6
\$\begingroup\$

APL (34)

,⍉↑(V[5?6])((⎕A~V←'AEIOUY')[5?20])
\$\endgroup\$
6
\$\begingroup\$

JavaScript, 74

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

Does not generate all combinations, but I think that all consonants and vowel appear.

JavaScript, 79

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

More "random" version.

\$\endgroup\$
4
  • \$\begingroup\$ What's the ^0 for? \$\endgroup\$
    – Alpha
    Commented Jun 25, 2013 at 3:01
  • 1
    \$\begingroup\$ @Alpha Math.random gives a float, we need an integer. ^0 truncates the number \$\endgroup\$
    – copy
    Commented Jun 25, 2013 at 11:52
  • \$\begingroup\$ Clever trick. I haven't seen the ^ operator in JavaScript before and less heard about using it to truncate a float. Thanks! \$\endgroup\$
    – Alpha
    Commented Jun 25, 2013 at 17:06
  • \$\begingroup\$ @copy i like the use of ^ \$\endgroup\$ Commented Oct 2, 2013 at 3:16
4
\$\begingroup\$

Ruby: 70 66 characters

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

Sample run:

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
\$\endgroup\$
3
  • \$\begingroup\$ You can use 10.times for one char less. \$\endgroup\$
    – Howard
    Commented Jun 19, 2013 at 4:06
  • 1
    \$\begingroup\$ Also the question doesn't require that each letter must have same probability. *10->*4, skip *3, rand 60->rand 20 and you have saved 3 chars. \$\endgroup\$
    – Howard
    Commented Jun 19, 2013 at 4:10
  • \$\begingroup\$ Good catch on the rule, @Howard. Thank you. \$\endgroup\$
    – manatwork
    Commented Jun 19, 2013 at 7:18
4
\$\begingroup\$

R: 105 characters

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="")
\$\endgroup\$
4
\$\begingroup\$

J (51)

,|:>(<"1[5?6 20){&.>'aeiouy';'bcdfghjklmnpqrstvwxz'
\$\endgroup\$
4
\$\begingroup\$

Processing, 100 99 93 87

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

Upon closer inspection of the question, I see it doesn't require any output. I've adjusted this accordingly.

\$\endgroup\$
0
4
\$\begingroup\$

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)

\$\endgroup\$
8
  • \$\begingroup\$ Something could be fine tuned around the grep parameters. I got “of e� ap ag ak”. \$\endgroup\$
    – manatwork
    Commented Feb 4, 2015 at 13:56
  • \$\begingroup\$ Hmm... strange. I got nothing like that. I thought -a would be enough. \$\endgroup\$
    – pgy
    Commented Feb 4, 2015 at 13:58
  • 1
    \$\begingroup\$ 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. \$\endgroup\$
    – manatwork
    Commented Feb 4, 2015 at 14:01
  • \$\begingroup\$ 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. \$\endgroup\$
    – pgy
    Commented Feb 4, 2015 at 14:03
  • 1
    \$\begingroup\$ By the way, tr -d \\n is shorter for joining the lines. \$\endgroup\$
    – manatwork
    Commented Feb 4, 2015 at 14:04
3
\$\begingroup\$

PHP 79 bytes

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

Fairly concise.

\$\endgroup\$
3
\$\begingroup\$

Objective-C, 129

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

With the help of Daniero

(I love to use the tends to operator (-->)

\$\endgroup\$
3
\$\begingroup\$

Java AKA the most verbose language ever created, 176 with help of Doorknob, Daniero and Peter Taylor (thanks guys!)

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

Ungolfed:

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

}

\$\endgroup\$
10
  • 1
    \$\begingroup\$ Suggested improvements: Change String a[] to String[]a (-1 characters), change w W = new w(); to w W=new w(); (-2 characters) \$\endgroup\$
    – Doorknob
    Commented Jun 18, 2013 at 22:14
  • \$\begingroup\$ Suggestions: Let the word always start on a consonant (or wovel); no need to randomize this when the question doesn't mention it! So, skip the boolean f and use i%2 instead. Also, the for loop can be shortened, and you can put both the strings inside the conditional operator (also,no need for parens here), and use the charAt on the outside. Here's the whole thing, 195 CHARS, 38 SAVED: 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)));}} \$\endgroup\$
    – daniero
    Commented Jun 19, 2013 at 1:40
  • 2
    \$\begingroup\$ “Java AKA the most verbose language ever created” – Ever tried Shakespeare? ;-) \$\endgroup\$
    – manatwork
    Commented Jun 19, 2013 at 7:13
  • 1
    \$\begingroup\$ @manatwork, don't forget to remove the import once you've got it down to being used only in one place. \$\endgroup\$ Commented Jun 19, 2013 at 11:52
  • 1
    \$\begingroup\$ @manatwork maybe we like lisp ?? ok, sorry, gonna take those parenthesis out when I get home from work \$\endgroup\$
    – jsedano
    Commented Jun 20, 2013 at 15:18
3
\$\begingroup\$

Javascript, 85

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

If run from the console, output is shown. Explicit display would add alert(s) at 8 chars, still shorter than the other JS solutions.

Thanks C5H8NNaO4 and Howard!

\$\endgroup\$
2
  • \$\begingroup\$ Nice one, save a character by removing the last ';' \$\endgroup\$
    – C5H8NNaO4
    Commented Jun 18, 2013 at 11:20
  • 1
    \$\begingroup\$ Instead of ~~(###) you can write ###|0 which saves 4 chars. \$\endgroup\$
    – Howard
    Commented Jun 19, 2013 at 12:44
3
\$\begingroup\$

PHP, 100 Characters

<?while($i<6){echo substr('bcdfghjklmnpqrstvwxz',rand(0,20),1).substr('aeiouy',rand(0,5),1);$i++;}?>
\$\endgroup\$
1
  • \$\begingroup\$ acually I think that's 100 chars long \$\endgroup\$ Commented Jul 24, 2013 at 11:27
3
\$\begingroup\$

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")
\$\endgroup\$
3
\$\begingroup\$

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.

\$\endgroup\$
2
  • 1
    \$\begingroup\$ 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. \$\endgroup\$
    – isaacg
    Commented Jul 7, 2015 at 3:42
  • \$\begingroup\$ 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. \$\endgroup\$ Commented Jul 7, 2015 at 4:11
3
\$\begingroup\$

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

\$\endgroup\$
3
  • 1
    \$\begingroup\$ ('AEIOUY'∪⎕A) ≡ (∪'AEIOUY',⎕A) but it's one byte shorter. \$\endgroup\$
    – lstefano
    Commented Jun 30, 2016 at 12:42
  • 1
    \$\begingroup\$ Deferring 'A' to ⎕A saves another byte: ,('EIOUY'∪⎕A)[6(|,+)⍪5?20] \$\endgroup\$
    – Adám
    Commented Jul 3, 2016 at 4:03
  • \$\begingroup\$ Nice! down to 26. Thanks \$\endgroup\$ Commented Jul 4, 2016 at 7:54
3
\$\begingroup\$

JavaScript (V8), 83 bytes

for(;a=Math.random().toString(36).match(/([^aeiouy\d.][aeiouy]){5}/g),!a;);print(a)

Try it online!

/g makes the result without an extra appearance of pair

-5B emanresu A

\$\endgroup\$
1
  • \$\begingroup\$ Can't you just use [^aeiouy0-9.] instead of [bcdfghj-np-tvwxz]? \$\endgroup\$
    – emanresu A
    Commented Oct 15 at 10:33
2
\$\begingroup\$

C: 101

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

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]

\$\endgroup\$
2
\$\begingroup\$

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.
\$\endgroup\$
2
\$\begingroup\$

"Random Word Generator", 70 +2 = 72 bytes

C=b c d f g h j k l m n p q r s t v w x z
V=a e i o u y
syllable:$C$V

Set minimum and maximum number of syllables settings to 5 (which I'm counting as flags, so 1 byte each).

This is written in a (WIP) tool I wrote for generating words from a sound inventory for conlanging (making constructed languages). I made the tool due to the other word generators (that I know of) having flaws (in my opinionated opinion).

The above code sets two categories C and V, and defines a syllable as a C followed by a V. The flags (minimum and maximum syllables) define how many syllables will be generated for a given word.

No changed settings, 86 bytes

C=b c d f g h j k l m n p q r s t v w x z
V=a e i o u y
syllable:$C$V$C$V$C$V$C$V$C$V

Due to a bug in my implementation, this solution is extremely slow due to the large syllable size.

\$\endgroup\$
1
\$\begingroup\$

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)])))
\$\endgroup\$
1
\$\begingroup\$

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.

\$\endgroup\$
1
\$\begingroup\$

05AB1E, 10 bytes

5FžPΩ?žOΩ?

Try it online or output \$n\$ amount of random words.

Explanation:

Pretty straight-forward:

5F      # Loop 5 times:
  žP    #  Push string "bcdfghjklmnpqrstvwxz"
    Ω   #  Pop and push a random character from this string
     ?  #  Output it without newline
  žOΩ?  #  Do the same with string "aeiouy"
\$\endgroup\$
1
\$\begingroup\$

K (ngn/k), 57 47 46 54 bytes

{`prng@0;,/{(1?"bcdfghjklmnpqrstvwxz"),1?"aeiouy"}'!5}

Try it online!

Down 1 byte thanks to ngn

Takes inspiration from the PHP answer. This one now outputs random words at each call, with the cost of 8 extra bytes.

Explanation:

{`prng@0;,/{(1?"bcdfghjklmnpqrstvwxz"),1?"aeiouy"}'!5} Main function. Takes no input
                                                   !5  Generate a array with range from 0 to 4 ([0..4])
                                                  '    For each number...
           {                                     }     Execute a function that...
            (1?"bcdfghjklmnpqrstvwxz"),1?"aeiouy"      Chooses one random consonant, followed by one random vowel
         ,/                                            Joined each of these strings together
 `prng@0;                                              Use current time to set state of randomness (Thus allow random words)
\$\endgroup\$
1
  • \$\begingroup\$ ""/ -> ,/  ⁣󠀠⁣󠀠 \$\endgroup\$
    – ngn
    Commented Oct 4, 2022 at 15:37
1
\$\begingroup\$

Japt -P, 20 17 bytes

;`Á<`
5Æö iCkU ö

Test it

Note that there is an unprintable character in front of the Á

;          # C = "abcdefghijklmnopqrstuvwxyz"
 `ŒÁ<`     # U = "oueayi"

5Æ         # Do this 5 times:
  ö        #  Pick a random letter from U
    i      #  Prepend: 
     CkU   #   Remove the letters in U from C
         ö #   Get a random letter from the result

-P         # Print all the pairs with no separator
\$\endgroup\$
1
  • \$\begingroup\$ 19 bytes. And you can save another 2 bytes with the -P flag. \$\endgroup\$
    – Shaggy
    Commented Oct 6, 2022 at 14:06
1
\$\begingroup\$

Japt -P, 14 bytes

;Cü_èyi%îö5ÃÕ

Test it

;Cü_èyi%îö5ÃÕ
;C                 :Lowercase alphabet
  ü                :Group by
   _               :Passing each character through the following function
    è              :  Count
     yi%           :    "y" prepended with "%", giving the Japt RegEx "%y"=/[aeiouy]/i
        Ã          :End grouping
         ®         :Map
          ö5       :  5 random characters
            Ã      :End map
             Õ     :Transpose
                   :Implicitly join & output
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.