This question already has an answer here:

Your task is to print the following:

I have a pen
I have an apple
Uh! Apple pen!

I have a pen
I have pineapple
Uh! Pineapple pen!

Apple pen...
Pineapple pen...
Uh! Pen Pineapple Apple Pen!

Remember, this is , so the code with the smallest number of bytes wins.


Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.

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 leaderboard snippet:

# [><>](, 121 bytes

var QUESTION_ID=95124,OVERRIDE_USER=12537;function answersUrl(e){return""+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return""+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",,t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",,i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=""></script> <link rel="stylesheet" type="text/css" href="//"> <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><div id="language-list"> <h2>Winners 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><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>

marked as duplicate by Picard, acrolith, LegionMammal978, ASCII-only, El'endia Starman Oct 2 '16 at 2:57

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • Are trailing newlines allowed? – acrolith Oct 1 '16 at 22:54
  • @daHugLenny Only one. – Oliver Ni Oct 1 '16 at 22:54
  • 3
    Aargh! That earworm! Not again! – Andreï Kostyrka Oct 1 '16 at 22:55
  • 1
    I suppose you expect the program to take no input? There is not much in the way of rules here. Unless it is supposed to be assumed for this type of challenge – Matt Oct 1 '16 at 23:17
  • 6
    Why did you bring that god-awful song to PPCG ;_; – Beta Decay Oct 2 '16 at 10:29

Bubblegum, 72 bytes

00000000: f354 c848 2c4b 5548 5428 48cd e3f2 8472  .T.H,KUHT(H....r
00000010: f214 120b 0a72 52b9 4233 1415 1c41 2c90  .....rR.B3...A,.
00000020: ac22 175c 1e59 7141 665e 2a42 7500 8c07  .".\.YqAf^*Bu...
00000030: d501 d7ad a7a7 c785 2209 1200 eb48 cd43  ........"....H.C
00000040: d205 510f 1453 0400                      ..Q..S..

Try it online!

The above is the xxd hexdump of the actual code.

JavaScript (ES6), 145 143 bytes

_=>`P325|I have |pple|inea|
Uh! | pen`.split`|`.reduce((s,r,i)=>s.split(i).join(r),`1a5
1an a24A25!


0...4Pen P32 A2 Pen!`)

let f =
_=>`P325|I have |pple|inea|
Uh! | pen`.split`|`.reduce((s,r,i)=>s.split(i).join(r),`1a5
1an a24A25!


0...4Pen P32 A2 Pen!`)


///, 117 bytes

/@/I have //#/apple//$/Apple //&/Uh! //%/pen//*/Pine/@a %
@an #

@a %
&*# %!

*# %...
&Pen *# $Pen!

Try it online!

Jelly, 94 bytes




Manual compression:

I looked for strings that repeated and made a list, there were 15.
I ordered these like so:
so as to make the smallest base-16 number from the text (with no leading 0)
here: separates; represents a line feed; and the last entry (index 0) is a space.

I then converted the number to base-250 and wrote it out in the first 250 of the 256 characters in the Jelly code-page:

The code the inverses the same process: “(base-250-encoded-number)’
b⁴ị - base 16, index into

Note: base-15 would have the same byte-count, one less in the encoded number but one more to decode as literal 15 is 15 whereas literal 16 is . Maybe a substring list of 16 items could cost less in total.

  • 1
    You should be rewarded, but I dunno how... (comments have been deleted, by the way) – Erik the Outgolfer Oct 3 '16 at 11:59

Batch, 203 bytes

@echo off
set e=echo(
call:l "an a" A
call:l pinea Pinea
%e%Apple pen...
%e%Pineapple pen...
%e%Uh! Pen Pineapple Apple Pen!
%e%I have a pen
%e%I have %~1pple
%e%Uh! %2pple pen!

Batch is so verbose that the set e=echo( saves a whole byte. (Worth it of course for code golf purposes.)

Perl, 139 bytes

With UNIX line terminators (LF = one byte) :

s//0an a1


A123P4235Pen P4A1Pen!/;s/4/inea1/g;s/0/I have a pen
I have /g;s/1/pple /g;s/2/pen/g;s/3/...
/g;s/5/Uh! /g;print

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