Old lady swallowed a fly: Difference between revisions

From Rosetta Code
Content added Content deleted
(added ocaml)
(Talk page believes that this song has multiple versions. Therefore, PHP must not become incorrect only because it emits different lyrics.)
Line 1: Line 1:
{{draft task}}
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.{{draft task}}
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]]
See also: [[99 Bottles of Beer]]

=={{header|Ada}}==
=={{header|Ada}}==


Line 499: Line 501:


=={{header|PHP}}==
=={{header|PHP}}==
{{incorrect|PHP|The program does not produce the correct lyrics. (See talk page)}}
<lang php><?php
<lang php><?php



Revision as of 15:08, 3 September 2011

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>