75
\$\begingroup\$

Inspiration: in 1939, a man named Ernest Vincent Wright wrote a novel called Gadsby without using the letter 'e'.

Your task is to write a set of (up to 5) programs in any language (which has a text-based syntax*) to output all 26 letters of the alphabet in order. However for each vowel aeiou, at least one of the programs must not include any occurrence of the vowel.

So there must be

  • a program that does not use 'a' or 'A' anywhere in the syntax of the program.
  • a program that does not use 'e' or 'E' anywhere in the syntax of the program.
  • a program that does not use 'i'  or 'I' anywhere in the syntax of the program.
  • a program that does not use 'o' or 'O' anywhere in the syntax of the program.
  • a program that does not use 'u' or 'U' anywhere in the syntax of the program.

All of them must output abcdefghijklmnopqrstuvwxyz.

The winner shall be the solution where the length of all programs is the shortest.

* since the constraint wouldn't be much of a challenge in Piet or Whitespace

\$\endgroup\$
21
  • 2
    \$\begingroup\$ if one manages to make a single program that does not contain any vowel, do we need multiply the length of the program by 5? \$\endgroup\$ Commented Apr 24, 2012 at 10:55
  • 5
    \$\begingroup\$ @w0lf: No, it says "up to 5 programs" and "length of all programs", which I read as "there can be only one program and its length counts in this case". \$\endgroup\$
    – schnaader
    Commented Apr 24, 2012 at 11:09
  • 10
    \$\begingroup\$ @PeterTaylor: You don't think having to avoid using vowels in your syntax is a unique challenge? As a JS programmer, it's especially interesting :) \$\endgroup\$
    – mellamokb
    Commented Apr 24, 2012 at 13:51
  • 2
    \$\begingroup\$ Are newlines acceptable in the output (i.e. one per character)? I can shorten some of my code if that is the case... \$\endgroup\$
    – Gaffi
    Commented Apr 24, 2012 at 21:17
  • 3
    \$\begingroup\$ I'm the OP. Uppercase not allowed. \$\endgroup\$
    – shamp00
    Commented Sep 17, 2016 at 5:21

123 Answers 123

1
\$\begingroup\$

F# (96) characters, using fsharpi

// Without u (48 chars)
sprintf "abcdefghijklmnopqrst%cvwxyz" (char 117)

// Without a, e, i, o (48 chars)
"\u0061bcd\u0065fgh\u0069jklmn\u006fpqrstuvwxyz"

This was tough since all the functions to manipulate sequences contain vowels. Also the functions for outputting to stdout are printf and printfn, therefore this only produces a string instead of writing it out.

These lines will need to be ran through the F# interpreter and ended with ;; to execute.

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

Groovy, 15 + 10 = 25 bytes

{'\u0061'..'z'}

Defines an anonymous function that returns the alphabet. Does not use a, e, i or o.

{'a'..'z'}

Defines an anonymous function that returns the alphabet. Does not use e, i, o or u.

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

Jelly, 7 chars

”Ø;97ỌV

Try it online!

Seems like this should (not (non-competing)) be accepted instead of GolfScript.

Note:

Ø and are not O, so this is valid. Here is how I built it:

My initial program (2 bytes) was:

Øa

But, since it contained an a, I had to change it.

This could have been a valid 6-char program if uppercase output was allowed:

65r90Ọ
\$\endgroup\$
5
  • \$\begingroup\$ The language is way newer than the challenge, so no, it should not be accepted instead of Golfscript. See this meta \$\endgroup\$
    – Sanchises
    Commented Sep 16, 2016 at 14:31
  • \$\begingroup\$ @sanchises Oh, if it is newer, then OK. I thought it was appropriate, since I neither knew when the first commit was made nor when the required commit for this to work was made. \$\endgroup\$ Commented Sep 16, 2016 at 14:40
  • \$\begingroup\$ I guess the purpose of that rule is also to prevent flooding of old challenges with new languages - golfing languages are now much more commonplace. \$\endgroup\$
    – Sanchises
    Commented Sep 16, 2016 at 15:38
  • \$\begingroup\$ @sanchises I don't think it's there for that reason; it's there to prevent cheating by creating languages which just do the task on encountering the empty program. \$\endgroup\$ Commented Sep 16, 2016 at 21:04
  • \$\begingroup\$ Note: "I guess (...) also (...)". I know what the main reason is for the rule, but it's strictness has some side effects that I'm sure were considered, and not seen as a deal-breaker for making the rule so strict, which generally means the side-effects were considered at least somewhat beneficent. But that's just my interpretation of ppcg politics. ;) \$\endgroup\$
    – Sanchises
    Commented Sep 16, 2016 at 21:17
1
\$\begingroup\$

Python 2, 91 bytes

Vowels are escaped with octal where necessary.

No ae

print"\141bcd\145fghijklmnopqrstuvwxyz"

No iou

exec"pr\151nt''.j\157\151n(map(chr,range(97,123)))"
\$\endgroup\$
1
\$\begingroup\$

05AB1E, 4 bytes

žpRl

Try it online!

Explanation:

žp     Push 'ZYXWVUTSRQPONMLKJIHGFEDCBA'
  R    Reverse string - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
   l   Lowercase - 'abcdefghijklmnopqrstuvwxyz'
       Implicitly print
\$\endgroup\$
1
\$\begingroup\$

Perl 6, 49 bytes

("a".."z").map(*.print) # 23 bytes, no E, O, or U
$*OUT.put((97..122)>>.chr) # 26 bytes, no A, E, or I
\$\endgroup\$
1
\$\begingroup\$

Befunge-98, 19

'`1+>:#;,1+:'{-#;_@

Explanation:

'`1+                   Initialize stack with ascii value for 'a'
     :  ,              Duplicate top of stack, print it
         1+:'{-        Increment top of stack, push zero if ascii value after 'z'
    > #;       #;_@    Loop until top of stack is zero, then end
\$\endgroup\$
1
\$\begingroup\$

Befunge, 16 bytes

1+:"`"+,:55*`#@_

Try it online!

Explanation

1+                  Increment the loop index which start with an implicit zero.
  :"`"+             Make a duplicate and add 96 to convert that into a lowercase letter.
       ,            Write the letter to stdout.
        :55*`       Check if the index is greater than 25 (i.e. it's the last letter).
             #@_    If so, branch left and exit, otherwise branch right and loop.   
   
\$\endgroup\$
1
\$\begingroup\$

DUP, 16 bytes

97[$123<][$,1+]#

Explanation:

97                  {push ASCII for “a” on stack}
  [     ][    ]#    {while [this is not 0][do this]}
   $                {duplicate top stack element}
    123             {push 123 on stack (ASCII value of “z”+1}
       <            {2nd element < top element? if true then push -1, if false then push 0}
          $         {duplicate top stack element}
           ,        {print character of top stack element to STDOUT}
            1+      {add 1 to top stack element}

Online DUP interpreter is available here.

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

Recursiva, 1 byte

)

Try it online!

\$\endgroup\$
3
  • 1
    \$\begingroup\$ Why would this be non-competing? \$\endgroup\$
    – LyricLy
    Commented Sep 11, 2017 at 5:07
  • \$\begingroup\$ @LyricLy Because The feature(in fact the whole language) was made later to the problem? :D I am unsure though! \$\endgroup\$
    – 0xffcourse
    Commented Sep 11, 2017 at 6:10
  • 1
    \$\begingroup\$ We have consensus that newer languages are no longer non-competing. \$\endgroup\$
    – LyricLy
    Commented Sep 11, 2017 at 6:48
1
\$\begingroup\$

VBA, 70 Bytes

Unfortunately having one brute force solution was better than having multiple looping solutions :(

Anonymous VBE immediate window function that takes no input and outputs the capitalized alphabet to the VBE immediate window

?Chr(97)"bcd"Chr(101)"fgh"Chr(105)"jklmn"Chr(111)"pqrst"Chr(117)"vwxyz
\$\endgroup\$
1
\$\begingroup\$

Braingolf, 12 bytes

62g[59gl+]&@

Try it online!

As I have just learned this language, its probably golfable.

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

Sinclair ZX80 BASIC, ~26 [tonkenized] BASIC bytes

 1 FOR O=38 TO 63
 2 PRINT CHR$(O);
 3 NEXT O

No A or U in this answer. Sinclair ZX80 and ZX81 character codes begin at 38, which is non-ASCII compliant.

Sinclair ZX80 BASIC (only using I), 237 ~73 [tonkenized] BASIC bytes

 1 PRINT CHR$(38);"BCD";CHR$(42);"FGHIJKLMN";CHR$(52);"PQRST";CHR$(58);"VWXYZ"
\$\endgroup\$
2
  • \$\begingroup\$ Nice. You need to add the bytes from programs with no I and no O. \$\endgroup\$
    – shamp00
    Commented Dec 20, 2017 at 23:02
  • \$\begingroup\$ For other solutions, I'll have to use assembly, so I'm thinking about that one, I'll update shortly. \$\endgroup\$ Commented Dec 21, 2017 at 10:33
1
\$\begingroup\$

Pyt, 1 byte

ɫ

Implicitly prints "abcdefghijklmnopqrstuvwxyz"

Try it online!

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

Pushy, 4 bytes

Only requires a single program:

26XQ

Try it online!

26X   \ Push range(0, 26), E(X)clusive.
   Q  \ Convert to relative uppercase alphabet letters and print.
\$\endgroup\$
1
\$\begingroup\$

Jelly, 7 bytes

”Ø;“b»V

Try it online!

Uses Jelly string compression to get A, prepends Ø to get alphabet from alphabet constant (ØA), and evals.

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

Java 8, 517 262 characters

-255 bytes thanks to @OlivierGrégoire.

No aeio (165):

\u0069nt\u0065rf\u0061c\u0065 M{st\u0061t\u0069c v\u006F\u0069d m\u0061\u0069n(Str\u0069ng[]b){f\u006Fr(ch\u0061r c=97;c<123;)Syst\u0065m.\u006Fut.pr\u0069nt(c++);}}

Try it online.

No u (97):

interface A{static void main(String[]a){for(char c=97;c<123;)System.console().printf("%c",c++);}}

Note that the program for u makes use of System.console(), which will return null (and thus cause the code to throw a NullPointerException) if you call it from anything other than your OS' native terminal (cmd on Windows, bash on Linux/OSX, etc.)

\$\endgroup\$
2
  • \$\begingroup\$ You can use System.err.printf("%c",c++); for u source code in place ofSystem.console().printf("%c",c++); \$\endgroup\$
    – Numberknot
    Commented Oct 26, 2016 at 16:52
  • 1
    \$\begingroup\$ You should mash them all in 2 programs: one without a, e, i, o and another without u. \$\endgroup\$ Commented Sep 11, 2017 at 5:53
1
\$\begingroup\$

Gol><>, 9 bytes

`z9sF:M|H

Try it online!

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

Ahead, 12 bytes

"bz"69M:1-W@

"bz"          push b (98) then z (122)
    69M       push 69 (charcode for E) then evaluate (E = expand range)
       :1-    dup stack top then sub 1 to get a
          W@  print all chars then exit

Try it online!

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

Vim, 11 bytes

:h<_
jjYZZp

Try it online!

Note: This answer was taken from this tip.

\$\endgroup\$
1
  • \$\begingroup\$ This answer was not mine, but I thought that it should be here since it's basically the shortest way to do it and there's no other Vim answer. Should it be marked as "Community Wiki"? \$\endgroup\$ Commented Apr 13, 2021 at 17:36
1
\$\begingroup\$

Simplex v.0.7, 3 bytes

^lg
^l  ~~ sets current byte to the alphabet [a-z]
  g ~~ output as string
\$\endgroup\$
0
1
\$\begingroup\$

V, 5 bytes

¬`{Ó×

Try it online!

Explanation

¬`{                         " inserts characters in range `to {

This outputs

`abcdefghijklmnopqrstuvwxyz{

To remove the extraneous output, we can use a replacement

Ó×                          " remove every non-alphanumeric character in this line

                            " synonym of vim's :s/\W//g

Alternatives

¬`z|x                       " prints every character from ` to z and
                            " removes the first character
\$\endgroup\$
1
\$\begingroup\$

Bean, 38 bytes

Hexdump:

00000000 37 cd a0 5e 80 25 81 00 cc a0 5e 84 25 81 01 80  7Í ^.%..Ì ^.%...
00000010 26 4d a0 5d 81 53 d0 80 a0 0e 20 80 24 4b 80 20  &M ].SÐ. . .$K. 
00000020 5e b9 37 b1 b2 33                                ^¹7±²3
00000026

The equivalent JavaScript is:

for(b=97;b<123;)a+=String.fromCharCode(b++);

Alternatively, another 38 byte solution is:

00000000 bc 81 3d a0 5e 25 81 00 35 cc a0 5e 84 25 81 01  ¼.= ^%..5Ì ^.%..
00000010 26 4d a0 5d 81 53 d0 80 a0 0e 20 80 24 4b 80 20  &M ].SÐ. . .$K. 
00000020 5e b9 37 b1 b2 33                                ^¹7±²3
00000026

which is equivalent to the JavaScript:

var b=97;while(b<123)a+=String.fromCharCode(b++);

This takes advantage of the fact that a is defined as "" when there is no input, and that the last executed a+=... is implicitly printed, and contains the full string of the alphabet.

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

Stax, 3 bytes

ïΣK

Run and debug it

Little bit cheaty. Unpacks to the following:

Stax, 3 bytes

VAv

Run and debug it

VA  # "ABCD...XYZ"
  v # lowercase
\$\endgroup\$
1
\$\begingroup\$

Python 3, 45 bytes

prⁱnt(*mªp(chr,rªngᵉ(97,123)),sᵉp="")

Attempt This Online!

Contains none of the prohibited vowels (proof).

Uses this tip: Python 3 treats certain Unicode characters in identifiers as letters, even though they're not actually the same character. Superscript letters work (3 bytes each), as do the Romance-language ordinal indicators º and ª (2 bytes each).

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

dc, 24 18 bytes

97[dP1+d123>c]dscx

Try it online!

Output

dc -e "97[dP1+d123>c]dscx"
abcdefghijklmnopqrstuvwxyz

How it works

The program sets up a recursive macro c. On each iteration of c, the top of stack is duped (d), printed as a character (P), incremented (1+), and compared with 123, calling itself again if 123 is greater (d123>c).

The P instruction is one of the lesser-known dc instructions. It pops the top of stack, interprets its bytes as ASCII characters, and prints it out as a stream of characters. Yes, the number can have multiple characters in it. For example, this challenge could be golfed in a much longer 64 bytes with the following program:

dc -e "156490583352162063278528710879425690470022892627113539022649722P"
abcdefghijklmnopqrstuvwxyz
\$\endgroup\$
2
  • \$\begingroup\$ Note: I had written an answer in C in 2014 which completely misunderstood the prompt and was deleted recently. I figured it was simpler to just write a whole new answer rather than edit and flag an already deleted answer. \$\endgroup\$ Commented Jul 24 at 3:15
  • \$\begingroup\$ Note: the answer could be one character shorter (17 bytes) if A-Z output is allowed. However, I see other answers doing a-z even when they include 122/123 in their source code (example: DLosc's python answer), so I assume it's not allowed. \$\endgroup\$ Commented Jul 24 at 5:18
1
\$\begingroup\$

JCram, 5 bytes.

θνh³⌊

Encodes the boring program _=>'abcdefghijklmnopqrstuvwxyz'.

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

AWK,35 (using o,i)

END{for(_=0;_++<26;)printf"%c",96+_}

neglected E from the count considering 'E'!='e'

;)

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

Julia, 12

['b'-1:'z']

Though the output doesn't look all that nice.

26-element Array{Char,1}:
'a'
'b'
'c'
.
.
.
'z'
\$\endgroup\$
0
\$\begingroup\$

JS, 43

Run this in the browser's console or nodeJS. Uses no vowels.

Outputs happens in the console.

To output it in the browser, add alert or document.write around it, but it's longer.

"\141bcd\145fgh\151jklmn\157pqrst\165vwxyz"

or

"\x61bcd\x65fgh\x69jklmn\x6fpqrst\x75vwxyz"
\$\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.