72
14
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
Current rankings (06 Mar 2014):
- APL: 11
- Bash: 31
- Befunge: 26
- Burlesque: 12
- Brainfuck: 38
- C: 84
- C#: 278/149
- Cjam: 6
- Clojure: 81
- Dc: 18
- Erlang escript: 75
- F#: 96
- Factor: 264
- Fission: 21
- Forth: 46
- Golfscript: 8
- Haskell (interpreter): 12
- HTML: 50
- J: 17
- Java: 137
- Javascript: 92
- Keg: 4
K: 9
Kotlin: 112
- Lua: 57
- Marbelous: 96
- MATLAB: 11
- Perl 5 (cmd line): 23
- Perl 5.10+: 23
- Perl: 101
- PHP: 31
- Postscript: 45
- Powershell: 62
- Python shell: 48
- Python: 83
- R: 36
- Rebmu: 15
- Ruby: 20
- Ruby 1.8: 18
- Scala: 55
- Sage CLI: 42
- Tcl: 49
- T-SQL: 120
- VBA: 70
The Catalogue
The Stack Snippet at the bottom of this post generates the catalogue from the answers a) as a list of shortest solution per language and b) as an overall leaderboard.
To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:
## Language Name, N bytes
where N
is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:
## Ruby, <s>104</s> <s>101</s> 96 bytes
If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:
## Perl, 43 + 2 (-p flag) = 45 bytes
You can also make the language name a link which will then show up in the snippet:
## [><>](https://esolangs.org/wiki/Fish), 121 bytes
/* Configuration */
var QUESTION_ID = 196898; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
else console.log(body);
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();
languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body {
text-align: left !important;
display: block !important;
}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 500px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
1if one manages to make a single program that does not contain any vowel, do we need multiply the length of the program by 5? – Cristian Lupascu – 2012-04-24T10:55:38.760
@w0lf No, in that case the length of the single program would suffice. – shamp00 – 2012-04-24T11:06:48.777
4@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". – schnaader – 2012-04-24T11:09:55.030
This doesn't really add much to the existing print-the-alphabet questions.
– Peter Taylor – 2012-04-24T13:45:21.3479@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 :) – mellamokb – 2012-04-24T13:51:05.610
assembly, anyone?! – Stefan Paul Noack – 2012-04-24T14:41:50.010
2Are newlines acceptable in the output (i.e. one per character)? I can shorten some of my code if that is the case... – Gaffi – 2012-04-24T21:17:05.433
2Is uppercase output allowed? – Erik the Outgolfer – 2016-09-16T11:09:51.277
@EriktheGolfer It's not. – mbomb007 – 2016-09-16T16:56:11.560
@mbomb007 I think it's unclear whether it is allowed or not. OP has specified a string, so my Jelly answer is 7 bytes, not 6. But, if OP allows uppercase, then I will change. – Erik the Outgolfer – 2016-09-16T21:03:13.213
1@EriktheGolfer The OP hasn't been on in 2 years. So assume he's not going to get on to allow it. It may be "unclear" to you, but if you look at all the answers, they're all lowercase, so it's just you. – mbomb007 – 2016-09-16T21:05:53.417
@mbomb007 On profile page: Last seen 2 hours ago. OP is definitely still on PPCG. – Erik the Outgolfer – 2016-09-16T21:07:28.753
2I'm the OP. Uppercase not allowed. – shamp00 – 2016-09-17T05:21:46.720
1What if the shebang contain vowels?
#/usr/bin/perl -w
at least 3 vowels? – F. Hauri – 2013-12-12T13:31:26.087Couldn't I just write G in Pyth? – Stan Strum – 2017-09-06T03:21:57.893
Are functions ok in languages where the main method has to exist and be called
main
? – jrtapsell – 2017-09-11T09:52:42.8031@Shamp00 Are we still checking scores? My JavaScript solution beats the crap out of the current one and the JavaScript console one...? – WallyWest – 2014-01-29T11:49:04.607
@WallyWest I've updated the scores. (I guess I don't get notified when there's a new answer now that this question has become 'community wiki'...) – shamp00 – 2014-01-29T16:24:37.827
1damnit; java is ruled out cause even the escape sequence hack doenst work due to requiring a U inside... – masterX244 – 2014-03-04T20:15:30.567
@F.Hauri you don't usually count the shebang in code golf anyway, so that's not a problem. – nyuszika7h – 2014-07-08T16:20:11.330