Old lady swallowed a fly

From Rosetta Code
Revision as of 22:26, 17 September 2011 by rosettacode>NevilleDNZ (moved Old lady swalllowed a fly to Old lady swallowed a fly: Fix an odd spelling error in title.)
Old lady swallowed a fly is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Present a program which emits the lyrics to the song I Knew an Old Lady Who Swallowed a Fly, taking advantage of the repetitive structure of the song's lyrics. This song has multiple versions with slightly different lyrics, so all these programs might not emit identical output.

See also: 99 Bottles of Beer

Ada

<lang Ada>with Ada.Text_IO, Ada.Containers.Indefinite_Doubly_Linked_Lists; use Ada.Text_IO;

procedure Swallow_Fly is

  package Strings is new Ada.Containers.Indefinite_Doubly_Linked_Lists(String);
  Lines, Animals: Strings.List;
  procedure Swallow(Animal: String;
                    Second_Line: String;
                    Permanent_Second_Line: Boolean := True) is
     procedure Print(C: Strings.Cursor) is
     begin
        Put_Line(Strings.Element(C));
     end Print;
  begin
     Put_Line("There was an old lady who swallowed a " & Animal & ",");
     Put_Line(Second_Line);
     if not Animals.Is_Empty then
        Lines.Prepend("She swallowed the " & Animal & " to catch the " &

Animals.Last_Element & ",");

     end if;
     Lines.Iterate(Print'Access);
     New_Line;
     if Permanent_Second_Line then
        Lines.Prepend(Second_Line);
     end if;
     Animals.Append(Animal); -- you need "to catch the " most recent animal
  end Swallow;
  procedure Swallow_TSA(Animal: String; Part_Of_Line_2: String) is
  begin
     Swallow(Animal, Part_Of_Line_2 &", to swallow a " & Animal & ";", False);
  end Swallow_TSA;
  procedure Swallow_SSA(Animal: String; Part_Of_Line_2: String) is
  begin
     Swallow(Animal, Part_Of_Line_2 &" she swallowed a " & Animal & ";", False);
  end Swallow_SSA;

begin

  Lines.Append("Perhaps she'll die!");
  Swallow("fly", "But I don't know why she swallowed the fly,");
  Swallow("spider",  "That wriggled and jiggled and tickled inside her;");
  Swallow_TSA("bird", "Quite absurd");
  Swallow_TSA("cat", "Fancy that");
  Swallow_TSA("dog", "What a hog");
  Swallow_TSA("pig", "Her mouth was so big");
  Swallow_TSA("goat","She just opened her throat");
  Swallow_SSA("cow", "I don't know how");
  Swallow_TSA("donkey", "It was rather wonky");
  Put_Line("There was an old lady who swallowed a horse ...");
  Put_Line("She's dead, of course!");

end Swallow_Fly;</lang>

ALGOL 68

Using Logic

Works with: ALGOL 68 version Revision 1 - no extensions to language used.
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny.

<lang algol68>#!/usr/local/bin/a68g --script #

STRING sw=" swallow ",swd=sw[:UPB sw-1]+"ed ", tsa=". To"+sw+"a";

INT count prev := 0; [9]STRING prev;

PROC vs = (STRING in wot,[]STRING co)VOID: (

 STRING wot = " "+in wot;
 printf(($g$,"I know an old lady who",swd,"a",wot,".",$l$));
 IF UPB co = 1 THEN
   printf(($gl$,co))
 ELIF UPB co > 1 THEN
   printf(($g$,co,wot+".",$l$))
 FI;
 IF count prev NE UPB prev THEN
   prev[count prev+:=1]:=wot;
   FOR i FROM count prev BY -1 TO 2 DO
     printf(($gl$,"She"+swd+"the"+prev[i]+" to catch the"+prev[i-1]+"."))
   OD;
   printf(($gl$,"I don't know why she"+swd+"the fly.",
                "Perhaps she'll die.", $l$))
 FI

);

vs("fly",()); vs("spider","That wriggled and jiggled and tickled inside her."); vs("Bird",("Quite absurd",tsa)); vs("Cat",("Fancy that",tsa)); vs("Dog",("What a hog",tsa)); vs("Pig",("Her mouth was so big",tsa)); vs("Goat",("She just opened her throat",tsa)); vs("Cow",("I don't know how",tsa)); vs("Donkey",("It was rather wonky",tsa)); vs("Horse","She's dead, of course!")</lang>

Using a dictionary

Works with: ALGOL 68 version Revision 1 - no extensions to language used.
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny.

<lang algol68>#!/usr/local/bin/a68g --script #

STRING a="WBXAY",b="WCXBY",c="WDXCY",d="WEXDY",

      e="WFXEY",f="WGXFY",g="WHXGY",h="WIXHY",
      k="K",z="Z",l="";

[]STRING

 w=( # Assuming ASCII ordering #
   "fly","spider","Bird","Cat","Dog","Pig","Goat","Cow","Donkey","Horse",
   "I don't know why she swallowed the fly.",
   "That wriggled and jiggled and tickled inside her.",
   "Quite absurd","Fancy that","What a hog",
   "Her mouth was so big","She just opened her throat",
   "I don't know how","It was rather wonky",
   "She's dead, of course!",
   "I know an old lady who swallowed a ",
   ". To swallow a ",
   "She swallowed the "," to catch the ",".",
   "Perhaps she'll die."),
 v=(
   "UAY",k,z,l,
   "UBY","L",a,k,z,l,
   "UCY","MVCY",b,a,k,z,l,
   "UDY","NVDY",c,b,a,k,z,l,
   "UEY","OVEY",d,c,b,a,k,z,l,
   "UFY","PVFY",e,d,c,b,a,k,z,l,
   "UGY","QVGY",f,e,d,c,b,a,k,z,l,
   "UHY","RVHY",g,f,e,d,c,b,a,k,z,l,
   "UIY","SVIY",h,g,f,e,d,c,b,a,k,z,l,
   "UJY","T");

FOR i TO UPB v DO

 FOR j TO UPB v[i] DO
   print(w[ABS v[i][j] - ABS "A" + 1])
 OD;
 print(new line)

OD</lang>

C

Boring, ad hoc dictionary based decompression. The encoder was arguably more interesting, though. Output is different from listing in talk page in punctuations and capitalizations. <lang c>#include <stdio.h>

char *dict[] = { "_ha _c _e _p,/Quite absurd_f_p;_`cat,/Fancy that_fcat;_j`dog,/What a hog" "_fdog;_l`pig,/Her mouth_qso big_fpig;_d_r,/She just opened her throat_f_" "r;_icow,/_mhow she_ga cow;_k_o,/It_qrather wonky_f_o;_a_o_bcow,_khorse.." "./She's dead, of course!/","_a_p_b_e ","/S_t "," to catch the ","fly,/Bu" "t _mwhy s_t fly,/Perhaps she'll die!//_ha","_apig_bdog,_l`","spider,/Tha" "t wr_nj_ntickled inside her;_aspider_b_c",", to_s a ","_sed ","There_qan" " old lady who_g","_a_r_bpig,_d","_acat_b_p,_","_acow_b_r,_i","_adog_bcat" ",_j","I don't know ","iggled and ","donkey","bird"," was ","goat"," swal" "low","he_gthe" };

int print(char *c, int s) { do { if (s) s = print(dict[*c - 95], 0); else if (*c == '_') s = 1; else putchar(*c == '/' ? '\n' : *c); } while (*++c); return s; }

int main() { print(dict[0], 0); return 0; }</lang>

D

Translation of: C

<lang d>import std.stdio;

auto dict = [ "_ha _c _e _p,/Quite absurd_f_p;_`cat,/Fancy that_fcat;_j`dog,/What a hog"~ "_fdog;_l`pig,/Her mouth_qso big_fpig;_d_r,/She just opened her throat_f_"~ "r;_icow,/_mhow she_ga cow;_k_o,/It_qrather wonky_f_o;_a_o_bcow,_khorse.."~ "./She's dead, of course!/","_a_p_b_e ","/S_t "," to catch the ","fly,/Bu"~ "t _mwhy s_t fly,/Perhaps she'll die!//_ha","_apig_bdog,_l`","spider,/Tha"~ "t wr_nj_ntickled inside her;_aspider_b_c",", to_s a ","_sed ","There_qan"~ " old lady who_g","_a_r_bpig,_d","_acat_b_p,_","_acow_b_r,_i","_adog_bcat"~ ",_j","I don't know ","iggled and ","donkey","bird"," was ","goat"," swal"~ "low","he_gthe"];

bool oldLady(string part, bool s) {

   foreach (ch; part) {
       if (s)
           s = oldLady(dict[ch - 95], 0);
       else if (ch == '_')
           s = true;
       else
           putchar(ch == '/' ? '\n' : ch);
   }
   return s;

}

void main() {

   oldLady(dict[0], false);

}</lang>

Forth

swallow-addr is obviously a good candidate for an object, but Forth has many OO candidates - we won't settle that argument here.

<lang forth>: string, ( c-addr u -- ) \ store string at HERE , with a count

 dup c, here swap dup allot move ;

\ doubly linked list: (0|prev, 0|next, aside?, cstr animal; cstr aside) \ aside? is true if the aside is always displayed. variable swallowed variable first

>next ( swallow-addr -- swallow-addr' )
 cell+ @ ;
>aside? ( swallow-addr -- f )
 2 cells + @ ;
>animal ( swallow-addr -- c-addr u )
 3 cells + count ;
>aside ( swallow-addr -- c-addr u )
 >animal + count ;
swallow ( "animal" -- )
 align swallowed @ if here swallowed @ cell+ ! else here first ! then 
 here swallowed @ , swallowed !
 0 , 0 , parse-word string, ; \ data structure still needs the aside
always ( -- ) \ set aside? of last-defined swallow to true
 swallowed @ 2 cells + on ;
aside ( "aside" -- )
 0 parse string, ;

swallow fly always aside But I don't know why she swallowed the fly, swallow spider always aside That wriggled and jiggled and tickled inside her; swallow bird aside Quite absurd, she swallowed the bird; swallow cat aside Fancy that, she swallowed the cat; swallow dog aside What a hog, she swallowed the dog; swallow pig aside Her mouth was so big, she swallowed the pig; swallow goat aside She just opened her throat, she swallowed the goat; swallow cow aside I don't know how, she swallowed the cow; swallow donkey aside It was rather wonky, she swallowed the donkey;

?aside ( swallow-addr -- ) \ print aside if aside? is true
 dup >aside? if >aside cr type else drop then ;
reasons ( swallow-addr -- ) \ print reasons she swallowed something
 begin dup @ while
   dup cr ." She swallowed the " >animal type ."  to catch the "
   @ dup >animal type ." ," dup ?aside
 repeat drop ;
verse ( swallow-addr -- )
 cr ." There was an old lady who swallowed a " dup >animal type ." ,"
 dup >aside cr type
 reasons
 cr ." Perhaps she'll die!" ;
song ( -- )
 first @ begin dup verse cr >next dup 0= until drop
 cr ." There was an old lady who swallowed a horse..."
 cr ." She's dead, of course!" ;</lang>

Icon and Unicon

This version isn't as compressed as some of the others but it is very straightforward to modify. Just add a new long and terse verse entry and amend the line marked order. This uses a feature of Icon/Unicon that allows procedures to be called with a list datatype instead of an argument list, so we just pre-build argument lists for printf.

<lang Icon>procedure main() #: There Was An Old Lady Lyrics

verse := table() # arglists for printf - [1] long asides and [2] terse joiners verse["bird"]  := [["%s,\nQuite absurd, %s %s;\n",1,2,1],["%s,\n",1]] verse["cat"]  := [["%s,\nFancy that, %s %s;\n",1,2,1],["%s,\n",1]] verse["dog"]  := [["%s,\nWhat a hog, %s %s;\n",1,2,1],["%s,\n",1]] verse["pig"]  := [["%s,\nHer mouth was so big, %s %s;\n",1,2,1],["%s,\n",1]] verse["goat"]  := [["%s,\nShe just opened her throat, %s %s;\n",1,2,1],["%s,\n",1]] verse["cow"]  := [["%s,\nI don't know how, %s %s;\n",1,2,1],["%s,\n",1]] verse["donkey"] := [["%s,\nIt was rather wonky, %s %s;\n",1,2,1],["%s,\n",1]]

                  # just long versions of these 

verse["fly"]  := "%s,\nBut I don't know why %s %s,\nPerhaps she'll die!\n\n",1,2,1 verse["spider"] := "%s,\nThat wriggled and jiggled and tickled inside her;\n",1 verse["horse"]  := "%s...\nShe's dead, of course!\n",1

every (f := verse[k := key(verse)][1|2])[i := 1 to *f] do # fix every printf args

  f[i] := case f[i] of { 1 : k ; 2 : "she swallowed the"; default : f[i]}
  

zoofilo := [] "fly,spider,bird,cat,dog,pig,goat,cow,donkey,horse," ? # order

  while push(zoofilo,tab(find(","))) & move(1) do {
     printf("There was an old lady who swallowed a ")
     every critter := !zoofilo do {
        printf!verse[critter,(critter == (zoofilo[1] | "spider" | "fly"),1)|2]     
        if critter == "horse" then stop()               # dead
        printf("She swallowed the %s to catch the ","fly" ~== critter)
        }
     }

end

link printf</lang>

Sample output omitted.

printf.icn provides printf formatting

J

This defines T to be the required text.

<lang j>T=: e=:3 :'T=:T,y,LF' E=:e@,&'.' O=:'I know an old lady who swallowed a 'E@,] I=:e bind('I dont know why she swallowed the fly.',LF,'Perhaps shell die.',LF) I O 'fly' O P=:'spider' E 'That wriggled and jiggled and tickled inside her' I E A=:'She swallowed the spider to catch the fly' N=:4 :0

 O x
 E y,'. To swallow a ',x
 I E A=:'She swallowed the ',x,' to catch the ',P,'.',LF,A
 P=:x

) 'Bird'N'Quite absurd' 'Cat'N'Fancy that' 'Dog'N'What a hog' 'Pig'N'Her mouth was so big' 'Goat'N'She just opened her throat' 'Cow'N'I dont know how' 'Donkey'N'It was rather wonky' O'Horse' e'Shes dead, of course!'</lang>

OCaml

Using a dictionary

Only one minimalist line of code (the last line):

<lang ocaml>let d = [|

 "I know an old lady who swallowed a "; "fly"; ".\n";
 "I don't know why she swallowed the fly.\nPerhaps she'll die.\n\n";
 "spider"; "That wriggled and jiggled and tickled inside her";
 "She swallowed the "; " to catch the "; "Bird"; "Quite absurd";
 ". To swallow a "; "Cat"; "Fancy that"; "Dog"; "What a hog"; "Pig";
 "Her mouth was so big"; "Goat"; "She just opened her throat"; "Cow";
 "I don't know how"; "Donkey"; "It was rather wonky";
 "I know an old lady who swallowed a Horse.\nShe's dead, of course!\n";

|]

let s0 = [6;4;7;1;2;3] let s1 = [6;8;7;4;2] @ s0 let s2 = [6;11;7;8;2] @ s1 let s3 = [6;13;7;11;2] @ s2 let s4 = [6;15;7;13;2] @ s3 let s5 = [6;17;7;15;2] @ s4 let s6 = [6;19;7;17;2] @ s5 let s7 = [6;21;7;19;2] @ s6

let s =

 [0;1;2;3;0;4;2;5;2] @ s0 @
 [0;8;2;9;10;8;2]    @ s1 @
 [0;11;2;12;10;11;2] @ s2 @
 [0;13;2;14;10;13;2] @ s3 @
 [0;15;2;16;10;15;2] @ s4 @
 [0;17;2;18;10;17;2] @ s5 @
 [0;19;2;20;10;19;2] @ s6 @
 [0;21;2;22;10;21;2] @ s7 @
 [23] ;;

List.iter (fun i -> print_string d.(i)) s</lang>

Using dictionary based decompression

Translation of: D

Here we use the function String.fold_left 1 which is not available in the standard library but in the extlib:

<lang ocaml>let dict = [|

 "_ha _c _e _p,\nQuite absurd_f_p;_`cat,\nFancy that_fcat;_j`dog,\nWhat a hog_\
 fdog;_l`pig,\nHer mouth_qso big_fpig;_d_r,\nShe just opened her throat_f_r;_i\
 cow,\n_mhow she_ga cow;_k_o,\nIt_qrather wonky_f_o;_a_o_bcow,_khorse...\nShe'\
 s dead, of course!\n";"_a_p_b_e ";"\nS_t ";" to catch the ";"fly,\nBut _mwhy \
 s_t fly,\nPerhaps she'll die!\n\n_ha";"_apig_bdog,_l`";"spider,\nThat wr_nj_n\
 tickled inside her;_aspider_b_c";", to_s a ";"_sed ";"There_qan old lady who_\
 g";"_a_r_bpig,_d";"_acat_b_p,_";"_acow_b_r,_i";"_adog_bcat,_j";"I don't know \
 ";"iggled and ";"donkey";"bird";" was ";"goat";" swallow";"he_gthe" |]

let rec old_lady part s =

 ExtString.String.fold_left (fun s c ->
   if s then old_lady dict.(Char.code c - 95) false
   else if c = '_' then true
   else (print_char c; s)
 ) s part

let _ =

 old_lady dict.(0) false</lang>

Using Logic

<lang ocaml>let an =

 [| "fly"; "spider"; "bird"; "cat"; "dog"; "pig"; "goat"; "cow"; "donkey" |]

let cm =

 [| "Quite absurd";
    "Fancy that";
    "What a hog";
    "Her mouth was so big";
    "She just opened her throat";
    "I don't know how";
    "It was rather wonky"; |]

let p = Printf.printf

let h n =

 for i = n downto 1 do
   if i = 1 then
     p "That wriggled and jiggled and tickled inside her;\n";
   p "She swallowed the %s to catch the %s,\n" an.(i) an.(i-1)
 done

let g n =

 if n >= 2 then p "%s, to swallow a %s;\n" cm.(n-2) an.(n)

let f n =

 p "There was an old lady who swallowed a %s,\n" an.(n); g n; h n;
 p "But I don't know why she swallowed the fly,\nPerhaps she'll die!\n\n"

let () =

 for i = 0 to 8 do f i done;
 p "There was an old lady who swallowed a horse...\n\
    She's dead, of course!"</lang>

Perl

Using string subst:<lang perl>my @animals = ( "fly", "spider/That wriggled and jiggled and tickled inside her.\n", "bird//Quite absurd!", "cat//Fancy that!", "dog//What a hog!", "pig//Her mouth was so big!", "goat//She just opened her throat!", "cow//I don't know how;", "donkey//It was rather wonkey!", "horse:", );

my $s = "swallow"; my $e = $s."ed"; my $t = "There was an old lady who $e a "; my $_ = $t."But I don't know why she $e the fly;\nPerhaps she'll die!\n\n";

my ($a, $b, $c, $d); while (my $x = shift @animals) { s/$c//; ($a, $b, $c) = split('/', $x); $d = " the $a";

$c =~ s/;/ she $e$d;\n/; $c =~ s/!/, to $s$d;\n/;

s/$t/"$t$a,\n$c".(($b||$c) && "${b}She $e$d to catch the ")/e;

s/:.*/--\nShe's dead, of course!\n/s; print; }</lang> Using compression:<lang perl>use IO::Uncompress::Bunzip2 'bunzip2'; use MIME::Base64;

undef $/; if (open F, '|-') { binmode F, ":raw"; print F decode_base64(); close F; } else { bunzip2(qw/- -/); }

__DATA__ QlpoOTFBWSZTWUSbX/0AAZRfgAAQYIUACBFgbIA//96gQAK9oAAAxhMTQYIx DIwmDEoAAAAAAxhMTQYIxDIwmBSkiNIaJtCCAzJPU1G4ueVmGZMsMzBz0N5v hr4j29SRSSCZgyv8BDAAdOE3oFIFIhMAQMtm2Zy/MbRs9U1pgzCzGcaGnTYN u5NJ+/D4TfkcZZ39PmNJuN8rxjMrJTfvr8rFkxmTDMGFjDLBleGh3L8zlhuO 9vcq6rom3TonOONxyJ1TlG3dz2Tu3xZNtzTLgZu21y1r0dOW/HLntrgdi9ow hlHTsnRVbJ98DxjYs/K87Q1rJjWazCO7kHbIXUj9DS7dSMHVNSmhwrjHMc8D INk476V5jJDmnOPXZM38aeAd+DUp/39ccxmDEf3H7u30Rk6zDLGZkPYNq9CP Pzj39xsVe+KeupMjKsjONsG6dk1bajByHYPOMHxneP2Og3q+dR9ryGk19o0n onYPUfEfhVc1V+kcbJwmQ/nRwn3Hp6pP4TqvTO/2TfNJkvrrbt8+a9N92oy2 FeXUOI8486Wvor1zajqPDfpwnrn2jOzvo8hkOPrpVajlwnjqPfIry5c0TbKL 559fx8xqpsquRaFYV9I9fT6p7RrI/Gv/F3JFOFCQRJtf/Q==</lang>

PHP

<lang php><?php

$swallowed = array(

 array('swallowed' => 'fly.',
       'reason' => "I don't know why she swallowed the fly."),
 array('swallowed' => 'spider,',
       'aside' => "which wiggled and jiggled and tickled inside her.",
       'reason' => "She swallowed the spider to catch the fly"),
 array('swallowed' => 'bird.',
       'aside' => "How absurd! To swallow a bird!",
       'reason' => "She swallowed the bird to catch the spider,"),
 array('swallowed' => 'cat.',
       'aside' => "Imagine that! To swallow a cat!",
       'reason' => "She swallowed the cat to catch the bird."),
 array('swallowed' => 'dog.',
       'aside' => "What a hog! To swallow a dog!",
       'reason' => "She swallowed the dog to catch the cat."),
 array('swallowed' => 'horse',
       'aside' => "She's dead, of course. She swallowed a horse!",
       'reason' => "She swallowed the horse to catch the dog."));

foreach($swallowed as $creature) {

 print "I knew an old lady who swallowed a " . $creature['swallowed'] . "\n";
 if(array_key_exists('aside', $creature))
   print $creature['aside'] . "\n";
 $reversed = array_reverse($swallowed);
 $history = array_slice($reversed, array_search($creature, $reversed));
 foreach($history as $note)
 {
   print $note['reason'] . "\n";
 }
 if($swallowed[count($swallowed) - 1] == $creature)
   print "But she sure died!\n";
 else
   print "Perhaps she'll die." . "\n\n";

}</lang>

PicoLisp

Translation of: C

<lang PicoLisp>(de *Dict

  `(chop
     "_ha _c _e _p,/Quite absurd_f_p;_`cat,/Fancy that_fcat;_j`dog,\
        /What a hog_fdog;_l`pig,/Her mouth_qso big_fpig;_d_r,/She just \
        opened her throat_f_r;_icow,/_mhow she_ga cow;_k_o,/It_qrather \
        wonky_f_o;_a_o_bcow,_khorse.../She's dead, of course!/" )
  `(chop "_a_p_b_e ")
  `(chop "/S_t ")
  `(chop " to catch the ")
  `(chop "fly,/But _mwhy s_t fly,/Perhaps she'll die!//_ha")
  `(chop "_apig_bdog,_l`")
  `(chop "spider,/That wr_nj_ntickled inside her;_aspider_b_c")
  `(chop ", to_s a ")
  `(chop "_sed ")
  `(chop "There_qan old lady who_g")
  `(chop "_a_r_bpig,_d")
  `(chop "_acat_b_p,_")
  `(chop "_acow_b_r,_i")
  `(chop "_adog_bcat,_j")
  `(chop "I don't know ")
  `(chop "iggled and ")
  `(chop "donkey")
  `(chop "bird")
  `(chop " was ")
  `(chop "goat")
  `(chop " swallow")
  `(chop "he_gthe") )

(de oldLady (Lst Flg)

  (loop
     (let C (pop 'Lst)
        (cond
           (Flg
              (setq Flg
                 (oldLady (get *Dict (- (char C) 94))) ) )
           ((= "_" C) (on Flg))
           ((= "/" C) (prinl))
           (T (prin C)) ) )
     (NIL Lst) )
  Flg )

(oldLady (car *Dict))</lang>

Python

<lang python>import zlib, base64

b64 = b eNrtVE1rwzAMvedXaKdeRn7ENrb21rHCzmrs1m49K9gOJv9+cko/HBcGg0LHcpOfnq2np0QL 2FuKgBbICDAoeoiKwEc0hqIUgLAxfV0tQJCdhQM7qh68kheswKeBt5ROYetTemYMCC3rii// WMS3WkhXVyuFAaLT261JuBWwu4iDbvYp1tYzHVS68VEIObwFgaDB0KizuFs38aSdqKv3TgcJ uPYdn2B1opwIpeKE53qPftxRd88Y6uoVbdPzWxznrQ3ZUi3DudQ/bcELbevqM32iCIrj3IIh W6plOJf6L6xaajZjzqW/qAsKIvITBGs9Nm3glboZzkVP5l6Y+0bHLnedD0CttIyrpEU5Kv7N Mz3XkPBc/TSN3yxGiqMiipHRekycK0ZwMhM8jerGC9zuZaoTho3kMKSfJjLaF8v8wLzmXMqM zJvGew/jnZPzclA08yAkikegDTTUMfzwDXBcwoE= print(zlib.decompress(base64.b64decode(b64)).decode("utf-8", "strict"))</lang>

Tcl

Because the song is highly repetitive, it compresses wonderfully. <lang tcl>package require Tcl 8.6

puts [zlib inflate [binary decode base64 "

   7VRNa8MwDL3nV2inXkZ+xDa29taxws5q7NZuPSvYDib/fnJKPxwXBoNCx3KTn56t
   p6dEC9hbioAWyAgwKHqIisBHNIaiFICwMX1dLUCQnYUDO6oevJIXrMCngbeUTmHr
   U3pmDAgt64ov/1jEt1pIV1crhQGi09utSbgVsLuIg272KdbWMx1UuvFRCDm8BYGg
   wdCos7hbN/Gknair904HCbj2HZ9gdaKcCKXihOd6j37cUXfPGOrqFW3T81sc560N
   2VItw7nUP23BC23r6jN9ogiK49yCIVuqZTiX+i+sWmo2Y86lv6gLCiLyEwRrPTZt
   4JW6Gc5FT+ZemPtGxy53nQ9ArbSMq6RFOSr+zTM915DwXP00jd8sRoqjIoqR0XpM
   nCtGcDITPI3qxgvc7mWqE4aN5DCknyYy2hfL/MC85lzKjMybxnsP452T83JQNPMg
   JIpHoA001DH88A0=

"]]</lang>