This is an Ook interpreter (see http://www.dangermouse.net/esoteric/ook.html). If you are an orangutan in an other worldly library you may find this useful for writing cataloging applications. Enjoy.
For debugging include maximum number of instructions to interpret on the command line: Ook 2000
use warnings; use strict; my %xlate = ( '.?' => \&DoRight, '?.' => \&DoLeft, '..' => \&DoInc, '!!' => \&DoDec, '!.' => \&DoOut, '.!' => \&DoIn, '!?' => \&DoWhile, '?!' => \&DoElihw ); my @tape = 0; # Storage "Tape" my $head = 0; # Read / Write head my $pc = 0; # Program counter my @stack; # Optimise loop handling my $inBuffer; my $debug = shift || 0; my $steps = 0; my $program = join " ", <DATA>; $program =~ s/Ook([.?!])\s*Ook([?.!])\s*/$1$2 /gi; my @code = map {$xlate{$_}} split " ", $program; $code[$pc]->() while ($pc < @code); sub debugPrint { return if ! $debug; print $_[0] . ": PC $pc, Stack depth " . @stack . "\n"; die "Instruction count exceeded\n" if ++$steps > $debug; } sub DoRight { debugPrint ("DoRight"); $tape [++$head] ||= undef; ++$pc; } sub DoLeft { debugPrint ("DoLeft"); unshift @tape, 0 unless $head; --$head if $head; ++$pc; } sub DoInc { debugPrint ("DoInc"); if (++$tape [$head] > 255) {$tape [$head] = -255;} ++$pc; } sub DoDec { debugPrint ("DoDec"); if (--$tape [$head] < -255) {$tape [$head] = 255;} ++$pc; } sub DoOut { debugPrint ("DoOut"); print chr ($tape [$head]); ++$pc; } sub DoIn { debugPrint ("DoIn"); if (! $inBuffer) {$inBuffer = <STDIN>;} $tape [$head] = ord substr $inBuffer, 0, 1, ""; ++$pc; } sub DoWhile { debugPrint ("DoWhile"); if ($tape [$head]) {# Enter the loop push @stack, $pc; ++$pc; return; } # Skip the loop my $nested = 1; # Keeps track of nested loops my $startPc = $pc; do { --$nested if $code [++$pc] == \&DoElihw; ++$nested if $code [$pc] == \&DoWhile; die "Unmatched Ook! Ook? found at instruction $startPc\n" if $pc > @ +code; } while ($nested); ++$pc; } sub DoElihw { debugPrint ("DoElihw"); die "Unmatched Ook? Ook! found at instruction $pc\n" if ! @stack; $pc = $stack [-1]; pop @stack; }
__DATA__ Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
use warnings; use strict; my $line = "Just another Ook! hacker"; my $OokCode; my @chars = split "", $line; my $curVal = 0; for my $curChr (@chars) { my $delta = ord ($curChr) - $curVal; $curVal = ord ($curChr); if ($delta > 0) {$OokCode .= "+" while $delta--;} elsif ($delta < 0) {$OokCode .= "-" while $delta++;} $OokCode .= "o"; } my @subs = ( ['+' x 96, ">++++[->++++[-<<++++++>>]<]<"], ['+' x 72, ">++++++[->+++[-<<++++>>]<]<"], ['+' x 64, ">++++[->++++[-<<++++>>]<]<"], ['+' x 60, ">++++[->+++++[-<<+++>>]<]<"], ['+' x 48, ">+++[->++++[-<<++++>>]<]<"], ['+' x 36, ">+++[->+++[-<<++++>>]<]<"], ['+' x 32, ">++++[->++++[-<<++>>]<]<"], ['+' x 30, ">++[->+++++[-<<+++>>]<]<"], ['+' x 27, ">+++[->+++[-<<+++>>]<]<"], ); $OokCode =~ s/\Q${$_}[0]\E/${$_}[1]/g for (@subs); ${$_}[0] =~ s/\+/-/g for @subs; ${$_}[1] =~ s/<(\++)/'-' x length ($1)/eg for @subs; #$OokCode =~ s/\Q${$_}[0]\E/${$_}[1]/g for (@subs); $OokCode =~ s/\+/Ook. Ook. /g; $OokCode =~ s/\-/Ook! Ook! /g; $OokCode =~ s/\</Ook? Ook. /g; $OokCode =~ s/\>/Ook. Ook? /g; $OokCode =~ s/\[/Ook! Ook? /g; $OokCode =~ s/\]/Ook? Ook! /g; $OokCode =~ s/i/Ook. Ook! /g; $OokCode =~ s/(?<!O)o/Ook! Ook. /g; print ((substr $OokCode, 0, 70, "") . "\n") while length $OokCode;
Update: add missing WikiPedia link
Update: include debugger and possibly fix Holli's problem
Update: A more interesting Ook! program
Update:Add code for Ook! generator per merlyn's suggestion
Perl is Huffman encoded by design.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Ook interpreter
by cog (Parson) on Aug 02, 2005 at 13:34 UTC | |
Re: Ook interpreter
by Your Mother (Archbishop) on Aug 02, 2005 at 22:59 UTC | |
by GrandFather (Saint) on Aug 03, 2005 at 00:21 UTC | |
by GrandFather (Saint) on Aug 04, 2005 at 20:35 UTC | |
by merlyn (Sage) on Aug 04, 2005 at 23:43 UTC | |
Re: Ook interpreter
by holli (Abbot) on Aug 02, 2005 at 12:54 UTC | |
by GrandFather (Saint) on Aug 02, 2005 at 21:56 UTC | |
by GrandFather (Saint) on Aug 02, 2005 at 18:44 UTC | |
by esskar (Deacon) on Aug 02, 2005 at 13:36 UTC | |
Re: Ook interpreter
by girarde (Hermit) on Jun 07, 2006 at 20:41 UTC | |
by Anonymous Monk on Jun 14, 2006 at 04:04 UTC | |
by GrandFather (Saint) on Jun 14, 2006 at 04:14 UTC | |
by Anonymous Monk on Jun 14, 2006 at 04:25 UTC | |
by GrandFather (Saint) on Jun 14, 2006 at 04:27 UTC | |
| |
Re: Ook interpreter
by jkva (Chaplain) on Aug 16, 2005 at 07:19 UTC |
Back to
Cool Uses for Perl