http://qs321.pair.com?node_id=1008395

The language designer said to the programmer: “Thank you for freeing me from my prejudices. I understand now that a language must not try to force the programmers to follow any single paradigm, but should instead offer all the features the programmer may want to use. As a reward, you may wish for any three features and I will add them to the language.”

The programmer replied: “I'd like a powerful domain-specific language for blowing up binary strings to small parts.”

The language designer granted the programmer's wish, and the programmer promptly tried it, saying

#!perl use warnings; use strict; use 5.010; use Time::HiRes "sleep"; our $DELAY = 0.05; # determine size of terminal my $w = pack "S4", 24, 79; ioctl STDIN, $_, $w for 0x40087468, 0x5413; our($R, $C) = unpack "S2", $w; $R--; our $b; if (rand 3 < 1) { # glider gun pattern $b = pack "(A$C)[Lx$R]", ("")x3, split /^/, " 1 1 1 11 11 11 1 1 11 11 11 1 1 11 11 1 1 11 1 1 1 1 1 1 1 11 "; } else { # generate random bitmap as starting state $b = pack "(A)*", map { rand 3 < 1 } 0 .. 2*$R*$C; } system qw"tput clear"; while () { # display game board system qw"tput home"; say for unpack "xx$C(a$C)$R", $b; sleep $DELAY; # game of life evolution step no warnings "numeric"; $b = pack "xx$C(A)*xx$C", unpack "(x7a/(x13)X4Ax!18)[(A$R)$C]", pack "((a*)17xx!18)*x3", unpack "((AAAX3AAA\@$C AXAAAXAx$C (X3AAA)2\@)$C)$R", $b; } __END__

The programmer watched the pretty patterns appearing in his terminal.

After a while, the language designer asked “And your other wishes?”

The programmer's reply was “Why would I need other wishes?”


Remarks.

  1. The story is stolen from xkcd strip 152: Hamster Ball, reinterpreted slightly.
  2. In case you can't guess from the title, this obfuscation shows the evolution of Conway's Game of Life cellular automaton, starting from either a completely random pattern or a fixed glider gun pattern. The program runs forever, stop it with control-C if you get bored, then restart to get another random pattern or the glider gun.
  3. It may be worth to resize your terminal to larger so that you get a larger game board.
  4. The glider gun also serves as an example to show how to edit the program to start from a pattern of your choice.
  5. It is possible that the dialog is internal, the language designer and the programmer being just different aspects of the same person.
  6. The programmer has used the word “explode”, but the language designer took liberty to name the feature “unpack” instead to avert curious incidents in case programmers obliviously discuss the feature in an airport waiting room. He was thus wiser than the designers of Standard ML, as that language has a function named explode to blow a string to pieces.
  7. I have already known from my previous obfuscations that the power of unpack is easy to abuse: unpack can follow a linked list, generate the list of suffixes of a string, aid in arithmetic over a finite field, or (Update) drive a quine.
  8. The evolution step on the whole board is implemented as just two calls to unpack and two calls to pack. Is it possible to use even fewer calls?

Replies are listed 'Best First'.
Re: Game of life ran by unpack function
by Lotus1 (Vicar) on Dec 11, 2012 at 20:59 UTC

    To run on Windows I changed line 35 to:

        system qw"cls";

    Update: change line 30 the same way also. It runs great, very interesting.

Re: Game of life ran by unpack function
by dbuckhal (Chaplain) on Dec 17, 2012 at 17:34 UTC

    To run on Cygwin, the ncurses package is needed for "tput.exe". Otherwise, you get a message regarding that across the screen while it runs. It runs great and is very cool!

    Link to tput solution

    This helped me discover a new cygwin command in the process:
    cygcheck.exe --find-package /usr/bin/tput.exe ncurses-5.7-18
Re: Game of life ran by unpack function
by ambrus (Abbot) on Feb 03, 2019 at 00:16 UTC
Re: Game of life ran by unpack function
by roboticus (Chancellor) on Sep 11, 2019 at 15:08 UTC

    ambrus:

    I don't know how I missed this node the first time through, but I'm blown away by it. I'll have to study this one to see how pack and unpack are combined to do this.

    It's kind of like some of the amazing regex nodes I see from time to time: I've been aware that regexes are more capable than I've ever used them for, but haven't dug into them far enough to figure out how people use them as a programming language to solve problems.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.