force use of pandoc version >= 3.1.12.2

The `bin/pandoc-wrapper.sh` tool will verify that the ssytem
has a recent enough version of `pandoc(1)`.

We explain why we insist on `pandoc(1)`. version >= 3.1.12.2
in comments where the $PANDOC_MIN_VERSION is set.

Added `--wrap=preserve` as a default argument to `pandoc(1)`.
While this change will impact every HTML file generated,
we believe this will improve the ability of someone to look
at the generated HTML and correlate with the original markdown.

Changed `bin/pandoc-wrapper.sh` VERSION from "1.4.2 2024-03-17"
to "1.4.3 2024-03-18".

Performed `make www` to achieve all of the above and to generate
HTML using the new  `--wrap=preserve` `pandoc(1)` mode.
This commit is contained in:
Landon Curt Noll committed 2024-03-18 01:26:39 -07:00
1 parent 9eb7a54e9f
commit b0b212acb1
402 files changed
+37061 -55132

No files matched your search

+346 -526
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Michael_Birken">Michael
Birken</a><br> Location: <a href="../../location.html#US">US</a> -
<em>United States of America</em> (<em>United States</em>) <br><br></li>
<li>Name: <a href="../../authors.html#Michael_Birken">Michael Birken</a><br>
Location: <a href="../../location.html#US">US</a> - <em>United States of America</em> (<em>United States</em>)
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -141,640 +141,460 @@ Birken</a><br> Location: <a href="../../location.html#US">US</a> -
<h2 id="to-build">To build:</h2>
<div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">make</span> alt</span></code></pre></div>
<p>We recommend that you use the alt version first to see what this
entry looked like back in 2013 (with a configurable speed). If you wish
to use the original version see the <a href="#original-code">original
code</a> section below.</p>
<p>We recommend that you use the alt version first to see what this entry looked
like back in 2013 (with a configurable speed). If you wish to use the original
version see the <a href="#original-code">original code</a> section below.</p>
<h2 id="to-use">To use:</h2>
<div class="sourceCode" id="cb2"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./birken.alt</span> <span class="op">&lt;</span> 17_columns_wide_paint_by_numbers_file</span></code></pre></div>
<p>NOTE: if your terminal is messed up after running this (perhaps from
exiting before it finishes) try using <code>reset</code> to restore the
terminal. This will clear the screen.</p>
<p>NOTE: if your terminal is messed up after running this (perhaps from exiting
before it finishes) try using <code>reset</code> to restore the terminal. This will clear
the screen.</p>
<h2 id="try">Try:</h2>
<p>This alternate version, which we recommend that you use in order to
see what is happening with modern systems, and to not flash colours too
quickly, which can be problematic for some people, can be configured to
different speeds by way of the value used in <code>usleep(3)</code>. The
default is <code>13500</code> but you can reconfigure it should you wish
(see below).</p>
<p>This alternate version, which we recommend that you use in order to see what is
happening with modern systems, and to not flash colours too quickly, which can
be problematic for some people, can be configured to different speeds by way of
the value used in <code>usleep(3)</code>. The default is <code>13500</code> but you can reconfigure
it should you wish (see below).</p>
<p>To see the program run on each text file, try:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./try.alt.sh</span></span></code></pre></div>
<p>If you have perl installed it will also try a random run.</p>
<p>Finding the ‘right’ default value was a fine line; the default, 15000
microseconds (0.015 seconds), will take quite a while to finish but it
allows one to more easily see what is going on. Even easier to see would
be 25000 but these values make it quite slow and one could easily lose
interest. Like some other entries where this was made an alternate
version it is configurable at compile time. If you wish to speed it up
by 100% you can instead do:</p>
microseconds (0.015 seconds), will take quite a while to finish but it allows
one to more easily see what is going on. Even easier to see would be 25000 but
these values make it quite slow and one could easily lose interest. Like some
other entries where this was made an alternate version it is configurable at
compile time. If you wish to speed it up by 100% you can instead do:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="fu">make</span> clobber SLEEP=7500 alt</span></code></pre></div>
<p>and then try <code>birken.alt</code> as above.</p>
<p>If you wish to speed that up 200% (300% total) you can use instead
try <code>SLEEP=3750</code>. Doing this you might find the right value
to your liking; use ctrl-c to terminate the program early but note that
the terminal is likely to be messed up. In that case try:</p>
<p>If you wish to speed that up 200% (300% total) you can use instead try
<code>SLEEP=3750</code>. Doing this you might find the right value to your liking; use
ctrl-c to terminate the program early but note that the terminal is likely to be
messed up. In that case try:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="ex">reset</span></span></code></pre></div>
<p>to make it sane again (running to completion will do that for
you).</p>
<p>to make it sane again (running to completion will do that for you).</p>
<h2 id="original-code">Original code:</h2>
<p>The original code will run faster with modern systems which is likely
to make it hard to see the art of the entry but you may do so if you
wish.</p>
<p>The original code will run faster with modern systems which is likely to make it
hard to see the art of the entry but you may do so if you wish.</p>
<h3 id="original-build">Original build:</h3>
<div class="sourceCode" id="cb6"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="fu">make</span> all</span></code></pre></div>
<h3 id="original-use">Original use:</h3>
<p>Use <code>birken</code> as you would <code>birken.alt</code>
above.</p>
<p>Use <code>birken</code> as you would <code>birken.alt</code> above.</p>
<h3 id="original-try">Original try:</h3>
<p>To use the demo script with the original code, try:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./try.sh</span></span></code></pre></div>
<p>PLEASE be careful if you are sensitive to flashing colours!</p>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>This program also wins the “Most amusing abuse of the iocccsize tool”
award; although not the absolute best: it is possible to achieve 0 by
writing:</p>
<p>This program also wins the “Most amusing abuse of the iocccsize tool” award;
although not the absolute best: it is possible to achieve 0 by writing:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a> <span class="co">/* *\</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="co"> /....</span></span></code></pre></div>
<p>The game of Tetris had been used in many endeavors, from studying <a
href="http://arxiv.org/abs/cs/0210020">algorithmic complexity</a> to <a
href="http://www.livescience.com/19894-tetris-treat-ptsd-flashbacks.html">treating
PTSD</a> and it’s even been <a
href="http://hacks.mit.edu/Hacks/by_year/2012/tetris/">put on MIT’s
Green Building</a>. Using it for painting by numbers looks like a novel
idea.</p>
<p>The game of Tetris had been used in many endeavors, from studying <a href="http://arxiv.org/abs/cs/0210020">algorithmic
complexity</a> to <a href="http://www.livescience.com/19894-tetris-treat-ptsd-flashbacks.html">treating
PTSD</a> and
it’s even been <a href="http://hacks.mit.edu/Hacks/by_year/2012/tetris/">put on MIT’s Green
Building</a>.
Using it for painting by numbers looks like a novel idea.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<h3 id="about-this-document">About This Document</h3>
<p>This document is best viewed as an HTML file in a browser that
supports animated <a
href="https://en.wikipedia.org/wiki/GIF">GIF</a>s.</p>
<p>See the files: <code>*.txt</code>, <code>*.png</code> and
<code>*.gif</code>.</p>
<p>This document is best viewed as an HTML file in a browser that supports animated
<a href="https://en.wikipedia.org/wiki/GIF">GIF</a>s.</p>
<p>See the files: <code>*.txt</code>, <code>*.png</code> and <code>*.gif</code>.</p>
<h3 id="abstract">Abstract</h3>
<p>By rotating, positioning and dropping a predetermined sequence of
pieces, this program exploits the mechanics of Tetris to generate
arbitrary images.</p>
<p>By rotating, positioning and dropping a predetermined sequence of pieces, this
program exploits the mechanics of Tetris to generate arbitrary images.</p>
<h3 id="algorithm-overview">Algorithm Overview</h3>
<p>The algorithm converts pixels from a source image into squares in the
<a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> play-field,
one row at a time from the bottom up. To generate an individual square,
the algorithm assembles a structure consisting of a rectangular region
fully supported by a single square protruding from the bottom. When the
rectangular region is completed, its rows are cleared, leaving behind
the protruding square. Three examples of the process appear below.</p>
<a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> play-field, one row at a time
from the bottom up. To generate an individual square, the algorithm assembles a
structure consisting of a rectangular region fully supported by a single square
protruding from the bottom. When the rectangular region is completed, its rows
are cleared, leaving behind the protruding square. Three examples of the process
appear below.</p>
<p><img src="pen0.gif" /></p>
<p><img src="pen1.gif" /></p>
<p><img src="pen2.gif" /></p>
<p>During construction of a row, all of the squares produced by this
method must be supported. In the images above, the generated squares are
supported by the floor of the play-field. However, if an arbitrary row
contains holes, it may not provide the support necessary for the
construction of the row above it. The algorithm solves this problem by
constructing a flat platform on top of the row with holes. In the
animation below, a platform is built above a row comprising of a single
red square. The platform is a temporary structure and inserting the
<p>During construction of a row, all of the squares produced by this method must be
supported. In the images above, the generated squares are supported by the floor
of the play-field. However, if an arbitrary row contains holes, it may not
provide the support necessary for the construction of the row above it. The
algorithm solves this problem by constructing a flat platform on top of the row
with holes. In the animation below, a platform is built above a row comprising
of a single red square. The platform is a temporary structure and inserting the
final piece removes it.</p>
<p><img src="platform0.gif" /></p>
<p>Below, a row containing 5 red squares is deposited above a row
containing 3 red squares. This is accomplished by building a flat
platform on top of the lower row. The platform provides the support
necessary to generate the 5 red squares. Finally, the platform is
removed by inserting its final piece and the new row drops into place.
Note, if the algorithm needed to generate the rows in the opposite order
(a row of 3 red squares above a row of 5 red squares), a platform would
not be necessary.</p>
<p>Below, a row containing 5 red squares is deposited above a row containing 3 red
squares. This is accomplished by building a flat platform on top of the lower
row. The platform provides the support necessary to generate the 5 red squares.
Finally, the platform is removed by inserting its final piece and the new row
drops into place. Note, if the algorithm needed to generate the rows in the
opposite order (a row of 3 red squares above a row of 5 red squares), a platform
would not be necessary.</p>
<p><img src="platform1.gif" /></p>
<h3 id="single-square-emitters">Single Square Emitters</h3>
<p>For reference, the names of the 7 <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> (the game
pieces or actually a kind of geometric shape used in <a
href="https://en.wikipedia.org/wiki/Tetris">Tetris</a>) appear in the
table below.</p>
<p>For reference, the names of the 7
<a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> (the game pieces or
actually a kind of geometric shape used in
<a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a>) appear in the table below.</p>
<p><img src="names.png" /></p>
<p>This algorithm was tailored specifically to render sprites from early
video games. Those games packed graphics into 8x8 tiles where 2 bits
were dedicated to each pixel. Consequentially, sprites usually contained
only 3 colors plus transparent regions and they were typically sized
either 16x16 or 16x32 pixels.</p>
<p>The animation below depicts all the patterns used to emit single
squares. <code>J</code>, <code>T</code> and <code>L</code> <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> are used
interchangeably within each pattern to produce the protruding square at
the bottom. The algorithm assigns those tetriminos to the 3 colors
present in the sprite. The remaining tetriminos are assigned arbitrary
colors. And, all the colors remain constant during gameplay.</p>
<p>This algorithm was tailored specifically to render sprites from early video
games. Those games packed graphics into 8x8 tiles where 2 bits were dedicated to
each pixel. Consequentially, sprites usually contained only 3 colors plus
transparent regions and they were typically sized either 16x16 or 16x32 pixels.</p>
<p>The animation below depicts all the patterns used to emit single squares. <code>J</code>,
<code>T</code> and <code>L</code> <a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> are used
interchangeably within each pattern to produce the protruding square at the
bottom. The algorithm assigns those tetriminos to the 3 colors present in the
sprite. The remaining tetriminos are assigned arbitrary colors. And, all the
colors remain constant during gameplay.</p>
<p><img src="pen4.gif" /></p>
<p>It is not possible to emit a square of all 3 colors in the first 2
and the last 2 columns due to the shapes of the 3 <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>. As a
result, the minimal width of a play-field to accommodate a 16 pixel wide
sprite is <code>2 + 16 + 2 = 20</code> squares. However, it turns out
that 20 is too small.</p>
<p>As illustrated below, the region above the protruding square cannot
exclusively consist of a single row because the only pieces that could
fit, the <code>I</code> <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>, are
unsupported.</p>
<p>It is not possible to emit a square of all 3 colors in the first 2 and the last
2 columns due to the shapes of the 3
<a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>. As a result, the minimal
width of a play-field to accommodate a 16 pixel wide sprite is <code>2 + 16 + 2 = 20</code>
squares. However, it turns out that 20 is too small.</p>
<p>As illustrated below, the region above the protruding square cannot exclusively
consist of a single row because the only pieces that could fit, the <code>I</code>
<a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>, are unsupported.</p>
<p><img src="pen5.gif" /></p>
<p>With 2 rows, the only means of spanning the full play-field width in
a way that remains supported is to use <code>S</code> and <code>Z</code>
<a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>. But,
that will always leave holes in the upper row.</p>
<p>With 2 rows, the only means of spanning the full play-field width in a way that
remains supported is to use <code>S</code> and <code>Z</code>
<a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>. But, that will always
leave holes in the upper row.</p>
<p><img src="pen6.gif" /></p>
<p>The minimal number of rows required above the protruding square is 3
and as shown repeatedly above, such patterns do exist. 20 squares is the
minimal width required to fit a 16 pixel wide sprite. But,
<code>20 * 3 + 1 = 61</code>, which is not evenly divisible by 4 and
hence not constructible out of <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>. However,
a width of 21 yields <code>21 * 3 + 1 = 64</code>, which can be built
with 16 tetriminos. That width actually enables the algorithm to render
sprites up to 17 pixels wide.</p>
<p>The original <a
href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> play-field is 10
x 20 squares, a 1:2 ratio. The program maintains that ratio by using a
play-field of 21 x 42 squares.</p>
<p>Since <code>J</code>, <code>T</code> and <code>L</code> <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> are used
interchangeably to produce the emitted square and 3 squares of those
tetriminos contribute to the row above it, there are
<code>21 - 3 + 1 = 19</code> single square emitting patterns. However,
due to mirror symmetry, there are really only 10 patterns. Clearing 3
rows works for the majority of them. But, an exhaustive computer search
revealed that 2 of the patterns require more. The next possible option
is 7 rows since <code>21 * 7 + 1 = 148</code>, requiring 37 tetriminos.
As the images below show, those patterns do exist.</p>
<p>The minimal number of rows required above the protruding square is 3 and as
shown repeatedly above, such patterns do exist. 20 squares is the minimal width
required to fit a 16 pixel wide sprite. But, <code>20 * 3 + 1 = 61</code>, which is not
evenly divisible by 4 and hence not constructible out of
<a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>. However, a width of 21
yields <code>21 * 3 + 1 = 64</code>, which can be built with 16 tetriminos. That width
actually enables the algorithm to render sprites up to 17 pixels wide.</p>
<p>The original <a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> play-field is 10 x
20 squares, a 1:2 ratio. The program maintains that ratio by using a play-field
of 21 x 42 squares.</p>
<p>Since <code>J</code>, <code>T</code> and <code>L</code> <a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> are
used interchangeably to produce the emitted square and 3 squares of those
tetriminos contribute to the row above it, there are <code>21 - 3 + 1 = 19</code> single
square emitting patterns. However, due to mirror symmetry, there are really
only 10 patterns. Clearing 3 rows works for the majority of them. But, an
exhaustive computer search revealed that 2 of the patterns require more. The
next possible option is 7 rows since <code>21 * 7 + 1 = 148</code>, requiring 37
tetriminos. As the images below show, those patterns do exist.</p>
<p><img src="pen7.gif" /></p>
<p><img src="pen8.gif" /></p>
<h3 id="platforms">Platforms</h3>
<p>Before a row is constructed, the algorithm inspects the row below it.
If the row below fails to provide support for all of the squares to be
deposited above it, then a temporary platform is required. When that
platform is removed, the new row will drop, leaving some of the squares
apparently floating above empty space due to the way that gravity works
in the original <a
href="https://en.wikipedia.org/wiki/Tetris">Tetris</a>.</p>
<p>The illustration below depicts the 10 platform patterns (really only
5 considering mirror symmetry). The construction of a platform begins by
dropping a <code>T</code> <a
href="https://en.wikipedia.org/wiki/Tetromino">tetrimino</a> on top one
of the squares of the last generated row. The remaining tetriminos
support each other down to that first <code>T</code>. Meaning, as long
as the previously generated row contains at least 1 square, like the red
square below, then it is possible to construct a flat platform above it
for the generation of the next row.</p>
<p>Before a row is constructed, the algorithm inspects the row below it. If the
row below fails to provide support for all of the squares to be deposited above
it, then a temporary platform is required. When that platform is removed, the
new row will drop, leaving some of the squares apparently floating above empty
space due to the way that gravity works in the original
<a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a>.</p>
<p>The illustration below depicts the 10 platform patterns (really only 5
considering mirror symmetry). The construction of a platform begins by dropping
a <code>T</code> <a href="https://en.wikipedia.org/wiki/Tetromino">tetrimino</a> on top one of the
squares of the last generated row. The remaining tetriminos support each other
down to that first <code>T</code>. Meaning, as long as the previously generated row
contains at least 1 square, like the red square below, then it is possible to
construct a flat platform above it for the generation of the next row.</p>
<p><img src="platform2.gif" /></p>
<p>In the middle of platform construction, the bottom row gets completed
and cleared, leaving 3 rows above it. The final <code>J</code> or
<code>L</code> <a
href="https://en.wikipedia.org/wiki/Tetromino">tetrimino</a> that will
remove those rows is not inserted until the square emitters are done
generating the next row of the sprite on top of the platform. That final
piece precludes square emission in the first and last 2 columns. But, as
discussed above, the square emitters are limited to the 17 inner columns
due to the geometry of the <code>J</code>, <code>T</code> and
<code>L</code> tetriminos used in the process.</p>
<p>Also, of the 19 possible ways to start constructing a platform on top
of a <code>T</code> <a
href="https://en.wikipedia.org/wiki/Tetromino">tetrimino</a>, only the
10 patterns shown above exist.</p>
<p>In the middle of platform construction, the bottom row gets completed and
cleared, leaving 3 rows above it. The final <code>J</code> or <code>L</code>
<a href="https://en.wikipedia.org/wiki/Tetromino">tetrimino</a> that will remove those rows
is not inserted until the square emitters are done generating the next row of
the sprite on top of the platform. That final piece precludes square emission
in the first and last 2 columns. But, as discussed above, the square emitters
are limited to the 17 inner columns due to the geometry of the <code>J</code>, <code>T</code> and <code>L</code>
tetriminos used in the process.</p>
<p>Also, of the 19 possible ways to start constructing a platform on top of a <code>T</code>
<a href="https://en.wikipedia.org/wiki/Tetromino">tetrimino</a>, only the 10 patterns shown
above exist.</p>
<h3 id="program-input">Program Input</h3>
<p>The input sprite is represented textually. Digit characters
<code>0</code> to <code>7</code> correspond to pixels with colors from
the palette below.</p>
<p>The input sprite is represented textually. Digit characters <code>0</code> to <code>7</code>
correspond to pixels with colors from the palette below.</p>
<figure>
<img src="palette.png" alt="ANSI color palette" />
<figcaption aria-hidden="true">ANSI color palette</figcaption>
</figure>
<p>As discussed above, sprites are limited to a maximum of 3 colors from
this palette.</p>
<p>As discussed above, sprites are limited to a maximum of 3 colors from this
palette.</p>
<p>All other characters are interpreted as transparent pixels.</p>
<p>The maximum permissible size of the input text is 32 rows by 17
columns. Row length can vary as long as no single row exceeds 17
characters.</p>
<p>The maximum permissible size of the input text is 32 rows by 17 columns. Row
length can vary as long as no single row exceeds 17 characters.</p>
<p>Every row must contain at least one palette digit character.</p>
<p>The <code>*.txt</code> files contain different sprites in this
textual format that can be fed into standard input. Several examples
take advantage of the <a
href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> play-field
background color. Instead of using character <code>0</code>, internal
regions marked as transparent are effectively rendered as black.</p>
<p>The <code>*.txt</code> files contain different sprites in this textual format that can be
fed into standard input. Several examples take advantage of the
<a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> play-field background color.
Instead of using character <code>0</code>, internal regions marked as transparent are
effectively rendered as black.</p>
<h3 id="program-output">Program Output</h3>
<p>The program conceptually uses <a
href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> as an output
device similar to a <a
href="https://en.wikipedia.org/wiki/Line_printer">line printer</a>. It
restricts itself to those operations that can be performed on the Tetris
play-field: spawning, rotating, positioning and dropping <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>. This
process is visually represented using ANSI escape sequences.</p>
<p>The program conceptually uses <a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> as
an output device similar to a <a href="https://en.wikipedia.org/wiki/Line_printer">line
printer</a>. It restricts itself to
those operations that can be performed on the Tetris play-field: spawning,
rotating, positioning and dropping
<a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a>. This process is visually
represented using ANSI escape sequences.</p>
<h3 id="ansimation">ANSImation</h3>
<p>The rate at which the program plays <a
href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> is completely
determined by the rate in which the terminal application receives and
displays the <a
href="https://en.wikipedia.org/wiki/ANSI_escape_code">ANSI escape</a>
sequences.</p>
<p>To slow down the output programmatically, introduce a delay
immediately after the call to <code>fflush(3)</code> (N.B: see <a
href="birken.alt.c">birken.alt.c</a>).</p>
<p>The rate at which the program plays
<a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> is completely determined by the
rate in which the terminal application receives and displays the <a href="https://en.wikipedia.org/wiki/ANSI_escape_code">ANSI
escape</a> sequences.</p>
<p>To slow down the output programmatically, introduce a delay immediately after the
call to <code>fflush(3)</code> (N.B: see <a href="birken.alt.c">birken.alt.c</a>).</p>
<h3 id="ioccc-size-tool-bug">IOCCC Size Tool Bug</h3>
<p>This program demonstrates how to exploit a bug in IOCCC size tool
version <code>2013-07-30-v17</code>. The first line of the program is
reproduced below.</p>
<p>This program demonstrates how to exploit a bug in IOCCC size tool version
<code>2013-07-30-v17</code>. The first line of the program is reproduced below.</p>
<pre><code>char*_ = &quot;&#39;&quot;&quot;/*&quot;;</code></pre>
<p>If that line is added to the top of any program, the tool will report
a size of 8.</p>
<div class="sourceCode" id="cb10"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="ex">$</span> ./iocccsize <span class="at">-i</span> <span class="op">&lt;</span> prog.c</span>
<p>If that line is added to the top of any program, the tool will report a size of 8.</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="ex">$</span> ./iocccsize <span class="at">-i</span> <span class="op">&lt;</span> prog.c</span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a><span class="ex">8</span></span></code></pre></div>
<p>When that line is deleted from this program, the tool properly
reports the secondary size limit of the program as 2048.</p>
<div class="sourceCode" id="cb11"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="ex">$</span> ./iocccsize <span class="at">-i</span> <span class="op">&lt;</span> birken.c</span>
<p>When that line is deleted from this program, the tool properly reports the
secondary size limit of the program as 2048.</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="ex">$</span> ./iocccsize <span class="at">-i</span> <span class="op">&lt;</span> birken.c</span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="ex">2048</span></span></code></pre></div>
<p>Although this bug provides an easy means of circumventing contest
rule 2, as demonstrated from the size value, this entry is not
necessarily striving for a ‘worst abuse of the rules’ award.</p>
<p>Although this bug provides an easy means of circumventing contest rule 2, as
demonstrated from the size value, this entry is not necessarily striving for a
‘worst abuse of the rules’ award.</p>
<h3 id="obfuscations">Obfuscations</h3>
<p>This program is almost, but not quite, entirely unlike a
demonstration of good programming practices. Contrary to other programs,
an inspection of this one will certainly reveal that it possesses tea,
not to mention an affinity for the constant 42.</p>
<p>Variables are named and ordered to spell out, <code>"Tetris"</code>,
<code>"ELORG"</code>, <code>"DVK"</code> and the aforementioned
<code>"Tea"</code>. <a
href="https://en.wikipedia.org/wiki/Elektronorgtechnica">ELORG</a> is
the abbreviation for <code>Elektronorgtechnica</code>, the former Soviet
state owned computer organization that handled the worldwide Tetris
intellectual property rights. DVK is the line of Soviet
PDP-11-compatible personal computers capable of running <a
href="https://en.wikipedia.org/wiki/Alexey_Pajitnov">Alexey
Pajitnov</a>’s original 1984 <a
href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> prototype.</p>
<p>Carefully selected variable names also yielded wonderful expressions
like <code>l=0</code>, <code>O=0</code>, <code>O=1</code> and
<code>while(O)</code>. <code>"Tetris"</code> also makes a second
appearance of sorts:</p>
<p>This program is almost, but not quite, entirely unlike a demonstration of good
programming practices. Contrary to other programs, an inspection of this one
will certainly reveal that it possesses tea, not to mention an affinity for the
constant 42.</p>
<p>Variables are named and ordered to spell out, <code>"Tetris"</code>, <code>"ELORG"</code>, <code>"DVK"</code> and
the aforementioned <code>"Tea"</code>.
<a href="https://en.wikipedia.org/wiki/Elektronorgtechnica">ELORG</a> is the abbreviation
for <code>Elektronorgtechnica</code>, the former Soviet state owned computer organization
that handled the worldwide Tetris intellectual property rights. DVK is the line
of Soviet PDP-11-compatible personal computers capable of running <a href="https://en.wikipedia.org/wiki/Alexey_Pajitnov">Alexey
Pajitnov</a>’s original 1984
<a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> prototype.</p>
<p>Carefully selected variable names also yielded wonderful expressions like <code>l=0</code>,
<code>O=0</code>, <code>O=1</code> and <code>while(O)</code>. <code>"Tetris"</code> also makes a second appearance of
sorts:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>T<span class="op">][</span>e<span class="op">][</span>t<span class="op">]--;</span> <span class="cf">while</span><span class="op">(</span>R<span class="op">+</span>i<span class="op">)</span> <span class="op">{</span> s</span></code></pre></div>
<p>The source is formatted to resemble the <a
href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> play-field
mid-game. It is also an homage to all the <a
href="../../years.html">past IOCCC entries</a> formatted as a compact
block of text; the <code>T</code>, orientated appropriately to reflect
its name and the first letter in the title of the game, is just a moment
away from producing such a text block.</p>
<p>The source is formatted to resemble the
<a href="https://en.wikipedia.org/wiki/Tetris">Tetris</a> play-field mid-game. It is also
an homage to all the <a href="../../years.html">past IOCCC entries</a> formatted as a compact
block of text; the <code>T</code>, orientated appropriately to reflect its name and the
first letter in the title of the game, is just a moment away from producing such
a text block.</p>
<p>Three tables are encoded as separate strings within the program:</p>
<p>The first string stores the coordinates of the squares of the 19
distinct rotations of <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> (see
below). Since a tetrimino is a chain of 4 squares, all tetriminos fit
within a 4x4 matrix. To determine the coordinates of the squares, the
tetrimino is pushed to the upper-left of the matrix. Each coordinate
value requires 2 bits of storage. Consequentially, the four
x-coordinates and the four y-coordinates were packed into separate
octets. To convert the octets into valid ASCII characters, the squares
were sorted such that the least significant bits stored the largest
coordinate values. The results were offset by 35, the <code>#</code>
character, which is 1 beyond the ASCII value of <code>"</code>, making
it easier to pack into a string. None of the resultant values are beyond
ASCII 127. The coordinates for all 19 rotations fit in a string of
length 38.</p>
<p>The first string stores the coordinates of the squares of the 19 distinct
rotations of <a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> (see below).
Since a tetrimino is a chain of 4 squares, all tetriminos fit within a 4x4
matrix. To determine the coordinates of the squares, the tetrimino is pushed to
the upper-left of the matrix. Each coordinate value requires 2 bits of storage.
Consequentially, the four x-coordinates and the four y-coordinates were packed
into separate octets. To convert the octets into valid ASCII characters, the
squares were sorted such that the least significant bits stored the largest
coordinate values. The results were offset by 35, the <code>#</code> character, which is 1
beyond the ASCII value of <code>"</code>, making it easier to pack into a string. None of
the resultant values are beyond ASCII 127. The coordinates for all 19 rotations
fit in a string of length 38.</p>
<p><img src="rotations.png" /></p>
<p>The second string stores the single square emitter patterns and the
platform patterns. Each pattern is a sequence of pairs,
<code>{ tetrimino index, drop x-coordinate }</code>. As mentioned, there
are 19 distinct rotations, requiring 5 bits of storage for the <a
href="https://en.wikipedia.org/wiki/Tetromino">tetrimino</a> index.
Another 5 bits is required for the drop x-coordinate since there are 21
<p>The second string stores the single square emitter patterns and the platform
patterns. Each pattern is a sequence of pairs, <code>{ tetrimino index, drop x-coordinate }</code>. As mentioned, there are 19 distinct rotations, requiring 5
bits of storage for the <a href="https://en.wikipedia.org/wiki/Tetromino">tetrimino</a>
index. Another 5 bits is required for the drop x-coordinate since there are 21
columns in the play-field. Necessarily, the pair is stored as 2 separate
characters. By offsetting them by 40, the <code>(</code> character, the
resultant string almost resembles a long and complex mathematical
expression. The program takes advantage of mirror symmetry by only
storing 10 single square emitter patterns and 5 platform patterns. The
pattern lengths are not encoded within the string. Rather, they are
embedded within the string decoding logic.</p>
<p>The third string conceptually stores the default colors of the 19
rotations. A 3-bit value is assigned to each, covering the 7 possible
colors. In addition, when a mirrored pattern is executed, <code>J</code>
exchanges with <code>L</code> and <code>S</code> exchanges with
<code>Z</code>, necessitating a second list of 3-bit color values. Pairs
of color values (6 bits) fit comfortably into a character that is offset
by <code>#</code>. The result is a string of length 19.</p>
characters. By offsetting them by 40, the <code>(</code> character, the resultant string
almost resembles a long and complex mathematical expression. The program takes
advantage of mirror symmetry by only storing 10 single square emitter patterns
and 5 platform patterns. The pattern lengths are not encoded within the string.
Rather, they are embedded within the string decoding logic.</p>
<p>The third string conceptually stores the default colors of the 19 rotations. A
3-bit value is assigned to each, covering the 7 possible colors. In addition,
when a mirrored pattern is executed, <code>J</code> exchanges with <code>L</code> and <code>S</code> exchanges
with <code>Z</code>, necessitating a second list of 3-bit color values. Pairs of color
values (6 bits) fit comfortably into a character that is offset by <code>#</code>. The
result is a string of length 19.</p>
<h3 id="obfuscations-1">Obfuscations</h3>
<p>The program is full of subtle obfuscations:</p>
<ul>
<li><p>The unary decrement operator is used in conjunction with global
variable automatic zero initialization to set variables to
<code>-1</code>.</p></li>
<li><p>The boolean expression of the form, <code>x + 1</code>, is used
multiple times to determine if a value is not <code>-1</code>.
Similarly, expressions of the form <code>x - y</code> are used to
determine if <code>x != y</code>.</p></li>
<li><p>Several arrays store unrelated data in segments throughout the
array to reduce named variables..</p></li>
<li><p>The unary decrement operator is used in conjunction with global variable
automatic zero initialization to set variables to <code>-1</code>.</p></li>
<li><p>The boolean expression of the form, <code>x + 1</code>, is used multiple times to
determine if a value is not <code>-1</code>. Similarly, expressions of the form <code>x - y</code>
are used to determine if <code>x != y</code>.</p></li>
<li><p>Several arrays store unrelated data in segments throughout the array to reduce
named variables..</p></li>
<li><p>The <code>x["..."]</code> trick appears once.</p></li>
<li><p>Variable <code>i</code> is less than necessary.</p></li>
<li><p>A cursorily glance at the expressions <code>4&amp;&amp;L</code>
and <code>m&amp;&amp;e==m</code> suggests that they always evaluate to
true.</p></li>
<li><p>The varying single square emitter pattern lengths are resolved
during string decoding using the clever expression,
<code>(i &amp; 3) - 3</code>, which identifies pattern 3 and 7 as
longer.</p></li>
<li><p>The file size of <a href="birken.c">birken.c</a> is a prime
number. Deleting the first line also produces a prime-sized program.
These properties do not qualify the program as a prime number
generator.</p></li>
<li><p>A cursorily glance at the expressions <code>4&amp;&amp;L</code> and <code>m&amp;&amp;e==m</code> suggests that they
always evaluate to true.</p></li>
<li><p>The varying single square emitter pattern lengths are resolved during string
decoding using the clever expression, <code>(i &amp; 3) - 3</code>, which identifies pattern 3
and 7 as longer.</p></li>
<li><p>The file size of <a href="birken.c">birken.c</a> is a prime number. Deleting the first
line also produces a prime-sized program. These properties do not qualify the
program as a prime number generator.</p></li>
</ul>
<h3 id="beyond-obfuscation">Beyond Obfuscation</h3>
<p>Due to the contest code size constraint, some optimizations
reluctantly had to be omitted. For example, multi-square emitters are
possible:</p>
<p>Due to the contest code size constraint, some optimizations reluctantly had to
be omitted. For example, multi-square emitters are possible:</p>
<p><img src="multi2.gif" /></p>
<p><img src="multi3.gif" /></p>
<p><img src="multi4.gif" /></p>
<p><img src="multi5.gif" /></p>
<p>In fact, using dynamic programming and creative heuristics, real-time
search is possible, enabling patterns like this:</p>
<p>In fact, using dynamic programming and creative heuristics, real-time search is
possible, enabling patterns like this:</p>
<p><img src="triple0.gif" /></p>
<p>And, even this:</p>
<p><img src="triple1.gif" /></p>
<p>In addition, it is possible to extend the algorithm to 6 colors
instead of just 3. This is achieved using <code>I</code>, <code>S</code>
and <code>Z</code> to produce the protruding square. A series of
rectangular regions are constructed above those <a
href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> to erode
them down to a single emitted square.</p>
<p>The details of these enhancements are left as an exercise to the
reader.</p>
<p>In addition, it is possible to extend the algorithm to 6 colors instead of just 3.
This is achieved using <code>I</code>, <code>S</code> and <code>Z</code> to produce the protruding square. A
series of rectangular regions are constructed above those
<a href="https://en.wikipedia.org/wiki/Tetromino">tetriminos</a> to erode them down to a
single emitted square.</p>
<p>The details of these enhancements are left as an exercise to the reader.</p>
<h3 id="example-files">Example Files</h3>
<p>The following example files were created by the program author. They
can be freely used and distributed.</p>
<p>The following example files were created by the program author. They can be
freely used and distributed.</p>
<ul>
<li><a href="format.txt">format.txt</a> - The layout of the
program.</li>
<li><a href="helloworld.txt">helloworld.txt</a> - Hello World,
Tetris-style.</li>
<li><a href="hilbert.txt">hilbert.txt</a> - A graphic based on the
Hilbert curve.</li>
<li><a href="format.txt">format.txt</a> - The layout of the program.</li>
<li><a href="helloworld.txt">helloworld.txt</a> - Hello World, Tetris-style.</li>
<li><a href="hilbert.txt">hilbert.txt</a> - A graphic based on the Hilbert curve.</li>
<li><a href="ioccc.txt">ioccc.txt</a> - IOCCC.</li>
<li><a href="landon.txt">landon.txt</a> - Portrait of a man with
glasses.</li>
<li><a href="leo.txt">leo.txt</a> - Portrait of a man without
glasses.</li>
<li><a href="landon.txt">landon.txt</a> - Portrait of a man with glasses.</li>
<li><a href="leo.txt">leo.txt</a> - Portrait of a man without glasses.</li>
<li><a href="rhino.txt">rhino.txt</a> - A purple rhinoceros.</li>
<li><a href="simon.txt">simon.txt</a> - Portrait of a man without
hair.</li>
<li><a href="simon.txt">simon.txt</a> - Portrait of a man without hair.</li>
</ul>
<p>The following files are based on graphics from non-free, copyrighted
video games. The use of a limited number of textual representations of
the graphics for the demonstration of this program qualifies as fair use
as such files do not significantly impede the right of the copyright
holder to sell the copyrighted material and it is not being used to
generate profit in this context. The origin of each file is detailed
below (character, game, company, year).</p>
<p>The following files are based on graphics from non-free, copyrighted video
games. The use of a limited number of textual representations of the graphics
for the demonstration of this program qualifies as fair use as such files do not
significantly impede the right of the copyright holder to sell the copyrighted
material and it is not being used to generate profit in this context. The
origin of each file is detailed below (character, game, company, year).</p>
<ul>
<li><p><a href="belmont.txt">belmont.txt</a> - <a
href="https://en.wikipedia.org/wiki/Simon_Belmont">Simon Belmont</a>, <a
href="https://en.wikipedia.org/wiki/Castlevania_(1986_video_game)">Castlevania</a>,
<a href="https://en.wikipedia.org/wiki/Konami">Konami</a>,
1986.</p></li>
<li><p><a href="bloober.txt">bloober.txt</a> - Bloober, <a
href="https://www.mariowiki.com/Super_Mario_Bros.">Super Mario
Brothers</a>, <a
href="https://en.wikipedia.org/wiki/Nintendo">Nintendo</a>,
1985.</p></li>
<li><p><a href="bomberman.txt">bomberman.txt</a> - <a
href="https://en.wikipedia.org/wiki/Bomberman">Bomberman</a>, Bomberman,
<a href="https://en.wikipedia.org/wiki/Hudson_Soft">Hudson</a>,
1983.</p></li>
<li><p><a href="boo.txt">boo.txt</a> - <a
href="https://www.mariowiki.com/Boo">Boo</a>, <a
href="https://www.mariowiki.com/Super_Mario_Bros._3">Super Mario
<li><p><a href="belmont.txt">belmont.txt</a> - <a href="https://en.wikipedia.org/wiki/Simon_Belmont">Simon
Belmont</a>,
<a href="https://en.wikipedia.org/wiki/Castlevania_(1986_video_game)">Castlevania</a>,
<a href="https://en.wikipedia.org/wiki/Konami">Konami</a>, 1986.</p></li>
<li><p><a href="bloober.txt">bloober.txt</a> - Bloober, <a href="https://www.mariowiki.com/Super_Mario_Bros.">Super Mario
Brothers</a>,
<a href="https://en.wikipedia.org/wiki/Nintendo">Nintendo</a>, 1985.</p></li>
<li><p><a href="bomberman.txt">bomberman.txt</a> -
<a href="https://en.wikipedia.org/wiki/Bomberman">Bomberman</a>, Bomberman,
<a href="https://en.wikipedia.org/wiki/Hudson_Soft">Hudson</a>, 1983.</p></li>
<li><p><a href="boo.txt">boo.txt</a> - <a href="https://www.mariowiki.com/Boo">Boo</a>, <a href="https://www.mariowiki.com/Super_Mario_Bros._3">Super Mario
Brothers 3</a>, Nintendo, 1988.</p></li>
<li><p><a href="bub.txt">bub.txt</a> - <a
href="https://bubblebobble.fandom.com/wiki/Bub">Bub</a>, <a
href="https://en.wikipedia.org/wiki/Bubble_Bobble">Bubble Bobble</a>,
Taito, 1986.</p></li>
<li><p><a href="cheepcheep.txt">cheepcheep.txt</a> - <a
href="https://www.mariowiki.com/Cheep_Cheep">Cheep Cheep</a>, Super
Mario Brothers, Nintendo,</p></li>
<li><p><a href="bub.txt">bub.txt</a> - <a href="https://bubblebobble.fandom.com/wiki/Bub">Bub</a>, <a href="https://en.wikipedia.org/wiki/Bubble_Bobble">Bubble
Bobble</a>, Taito, 1986.</p></li>
<li><p><a href="cheepcheep.txt">cheepcheep.txt</a> - <a href="https://www.mariowiki.com/Cheep_Cheep">Cheep
Cheep</a>, Super Mario Brothers, Nintendo,</p></li>
</ul>
<ol start="1985" type="1">
<li></li>
</ol>
<ul>
<li><p><a href="gurin.txt">gurin.txt</a> - Gurin, <a
href="https://en.wikipedia.org/wiki/Binary_Land">Binary Land</a>,
Hudson, 1983.</p></li>
<li><p><a href="koopaparatroopa.txt">koopaparatroopa.txt</a> - <a
href="https://www.mariowiki.com/Koopa_Paratroopa">Koopa Paratroopa</a>,
<li><p><a href="gurin.txt">gurin.txt</a> - Gurin, <a href="https://en.wikipedia.org/wiki/Binary_Land">Binary
Land</a>, Hudson, 1983.</p></li>
<li><p><a href="koopaparatroopa.txt">koopaparatroopa.txt</a> - <a href="https://www.mariowiki.com/Koopa_Paratroopa">Koopa
Paratroopa</a>, Super Mario Brothers,
Nintendo, 1985.</p></li>
<li><p><a href="lakitu.txt">lakitu.txt</a> - <a href="https://www.mariowiki.com/Lakitu">Lakitu</a>, Super
Mario Brothers, Nintendo, 1985.</p></li>
<li><p><a href="mario.txt">mario.txt</a> - <a href="https://www.mariowiki.com/Fire_Mario">Fire Mario</a>,
Super Mario Brothers, Nintendo, 1985.</p></li>
<li><p><a href="lakitu.txt">lakitu.txt</a> - <a
href="https://www.mariowiki.com/Lakitu">Lakitu</a>, Super Mario
Brothers, Nintendo, 1985.</p></li>
<li><p><a href="mario.txt">mario.txt</a> - <a
href="https://www.mariowiki.com/Fire_Mario">Fire Mario</a>, Super Mario
Brothers, Nintendo, 1985.</p></li>
<li><p><a href="mspacman.txt">mspacman.txt</a> - <a
href="https://pacman.fandom.com/wiki/Ms._Pac-Man">Ms. Pac-Man</a> and
Ghost, Ms. Pac-Man, <a
href="https://en.wikipedia.org/wiki/Midway_Games">Midway</a>,
1982.</p></li>
<li><p><a href="paranaplant.txt">paranaplant.txt</a> - <a
href="https://www.mariowiki.com/Piranha_Plant">Piranha Plant</a>, Super
Mario Brothers, Nintendo,</p></li>
<li><p><a href="mspacman.txt">mspacman.txt</a> - <a href="https://pacman.fandom.com/wiki/Ms._Pac-Man">Ms.
Pac-Man</a> and Ghost, Ms. Pac-Man,
<a href="https://en.wikipedia.org/wiki/Midway_Games">Midway</a>, 1982.</p></li>
<li><p><a href="paranaplant.txt">paranaplant.txt</a> - <a href="https://www.mariowiki.com/Piranha_Plant">Piranha
Plant</a>, Super Mario Brothers, Nintendo,</p></li>
</ul>
<ol start="1985" type="1">
<li></li>
</ol>
<ul>
<li><p><a href="samus.txt">samus.txt</a> - <a
href="https://metroid.fandom.com/wiki/Samus_Aran">Samus Aran</a>, <a
href="https://metroid.fandom.com/wiki/Metroid_(game)">Metroid</a>,
Nintendo/<a
href="https://en.wikipedia.org/wiki/Intelligent_Systems">Intelligent
<li><p><a href="samus.txt">samus.txt</a> - <a href="https://metroid.fandom.com/wiki/Samus_Aran">Samus
Aran</a>,
<a href="https://metroid.fandom.com/wiki/Metroid_(game)">Metroid</a>, Nintendo/<a href="https://en.wikipedia.org/wiki/Intelligent_Systems">Intelligent
Systems</a>, 1986.</p></li>
<li><p><a href="toad.txt">toad.txt</a> - <a
href="https://www.mariowiki.com/Toad">Toad</a>, Super Mario Brothers 2,
Nintendo, 1987.</p></li>
<li><p><a href="toad.txt">toad.txt</a> - <a href="https://www.mariowiki.com/Toad">Toad</a>, Super Mario
Brothers 2, Nintendo, 1987.</p></li>
</ul>
<p>The origin of the remaining files are described below:</p>
<ul>
<li><p><a href="happyface.txt">happyface.txt</a> - Based on a <a
href="https://en.wikipedia.org/wiki/Smiley">smiley</a>; original
trademark of smiley <a
href="https://en.wikipedia.org/wiki/The_Smiley_Company">Smiley
Company</a>.</p></li>
<li><p><a href="snoo.txt">snoo.txt</a> - 8-bit version of <a
href="https://www.reddit.com/r/Snoo/">Snoo</a>, <a
href="https://www.reddit.com">Reddit</a>’s alien mascot.</p></li>
<li><p><a href="happyface.txt">happyface.txt</a> - Based on a
<a href="https://en.wikipedia.org/wiki/Smiley">smiley</a>; original trademark of smiley
<a href="https://en.wikipedia.org/wiki/The_Smiley_Company">Smiley Company</a>.</p></li>
<li><p><a href="snoo.txt">snoo.txt</a> - 8-bit version of <a href="https://www.reddit.com/r/Snoo/">Snoo</a>,
<a href="https://www.reddit.com">Reddit</a>’s alien mascot.</p></li>
</ul>
<h2 id="copyright-and-cc-by-sa-4.0-license">Copyright and CC BY-SA 4.0
License:</h2>
<p>This file is Copyright (c) 2023 by Landon Curt Noll. All Rights
Reserved. You are free to share and adapt this file under the terms of
this license:</p>
<h2 id="copyright-and-cc-by-sa-4.0-license">Copyright and CC BY-SA 4.0 License:</h2>
<p>This file is Copyright (c) 2023 by Landon Curt Noll. All Rights Reserved.
You are free to share and adapt this file under the terms of this license:</p>
<pre><code>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</code></pre>
<p>For more information, see:
https://creativecommons.org/licenses/by-sa/4.0/</p>
<p>For more information, see: https://creativecommons.org/licenses/by-sa/4.0/</p>
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<!-- START: this line starts content for HTML phase 22 by: bin/output-index-inventory.sh via bin/md2html.sh -->
<!-- START: this line starts content generated by: bin/output-index-inventory.sh -->
<h1 id="inventory-for-2013birken"><a name="inventory"></a>Inventory for
2013/birken</h1>
<h1 id="inventory-for-2013birken"><a name="inventory"></a>Inventory for 2013/birken</h1>
<p><a href="#top">Jump to top</a></p>
<h2 id="primary-files">Primary files</h2>
<ul>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/birken.c">birken.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/birken.alt.c">birken.alt.c</a>
- alternative source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/birken.orig.c">birken.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/belmont.txt">belmont.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/bloober.txt">bloober.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/bomberman.txt">bomberman.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/boo.txt">boo.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/bub.txt">bub.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/cheepcheep.txt">cheepcheep.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/format.txt">format.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/gurin.txt">gurin.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/happyface.txt">happyface.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/helloworld.txt">helloworld.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/hilbert.txt">hilbert.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/ioccc.txt">ioccc.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/koopaparatroopa.txt">koopaparatroopa.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/lakitu.txt">lakitu.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/landon.txt">landon.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/leo.txt">leo.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/mario.txt">mario.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/mspacman.txt">mspacman.txt</a>
- sprites in this textual format</li>
<li><a href="names.png">names.png</a> - sprites in this textual
format</li>
<li><a href="palette.png">palette.png</a> - sprites in this textual
format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/paranaplant.txt">paranaplant.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/rhino.txt">rhino.txt</a>
- sprites in this textual format</li>
<li><a href="rotations.png">rotations.png</a> - sprites in this textual
format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/samus.txt">samus.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/simon.txt">simon.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/snoo.txt">snoo.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/toad.txt">toad.txt</a>
- sprites in this textual format</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/try.alt.sh">try.alt.sh</a>
- how to run alternative code</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/try.sh">try.sh</a>
- how to run</li>
<li><a href="2013_birken.tar.bz2">2013_birken.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/birken.c">birken.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/birken.alt.c">birken.alt.c</a> - alternative source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/birken.orig.c">birken.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/belmont.txt">belmont.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/bloober.txt">bloober.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/bomberman.txt">bomberman.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/boo.txt">boo.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/bub.txt">bub.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/cheepcheep.txt">cheepcheep.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/format.txt">format.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/gurin.txt">gurin.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/happyface.txt">happyface.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/helloworld.txt">helloworld.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/hilbert.txt">hilbert.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/ioccc.txt">ioccc.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/koopaparatroopa.txt">koopaparatroopa.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/lakitu.txt">lakitu.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/landon.txt">landon.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/leo.txt">leo.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/mario.txt">mario.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/mspacman.txt">mspacman.txt</a> - sprites in this textual format</li>
<li><a href="names.png">names.png</a> - sprites in this textual format</li>
<li><a href="palette.png">palette.png</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/paranaplant.txt">paranaplant.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/rhino.txt">rhino.txt</a> - sprites in this textual format</li>
<li><a href="rotations.png">rotations.png</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/samus.txt">samus.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/simon.txt">simon.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/snoo.txt">snoo.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/toad.txt">toad.txt</a> - sprites in this textual format</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/try.alt.sh">try.alt.sh</a> - how to run alternative code</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/try.sh">try.sh</a> - how to run</li>
<li><a href="2013_birken.tar.bz2">2013_birken.tar.bz2</a> - download entry source</li>
</ul>
<h2 id="secondary-files">Secondary files</h2>
<ul>
<li><a href="index.html">index.html</a> - entry home page</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/.gitignore">.gitignore</a>
- list of files that should not be committed under git</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/.gitignore">.gitignore</a> - list of files that should not be committed under git</li>
<li><a href=".path">.path</a> - directory path from top directory</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="multi2.gif">multi2.gif</a> - stages of multi-square
emitters</li>
<li><a href="multi3.gif">multi3.gif</a> - stages showing multi-square
emitters</li>
<li><a href="multi4.gif">multi4.gif</a> - stages showing multi-square
emitters</li>
<li><a href="multi5.gif">multi5.gif</a> - stages of multi-square
emitters</li>
<li><a href="pen0.gif">pen0.gif</a> - stages of single square rotruding
from the bottom</li>
<li><a href="pen1.gif">pen1.gif</a> - stages of single square rotruding
from the bottom</li>
<li><a href="pen2.gif">pen2.gif</a> - stages of single square rotruding
from the bottom</li>
<li><a href="pen4.gif">pen4.gif</a> - stages of single square rotruding
from the bottom</li>
<li><a href="pen5.gif">pen5.gif</a> - stages of single square rotruding
from the bottom</li>
<li><a href="pen6.gif">pen6.gif</a> - stages of single square rotruding
from the bottom</li>
<li><a href="pen7.gif">pen7.gif</a> - stages of single square rotruding
from the bottom</li>
<li><a href="pen8.gif">pen8.gif</a> - stages of single square rotruding
from the bottom</li>
<li><a href="platform0.gif">platform0.gif</a> - stages of 5 red squares
above a row of 3 red squares</li>
<li><a href="platform1.gif">platform1.gif</a> - stages of 5 red squares
above a row of 3 red squares</li>
<li><a href="platform2.gif">platform2.gif</a> - stages of 5 red squares
above a row of 3 red squares</li>
<li><a href="triple0.gif">triple0.gif</a> - stages of constructed of
rectangular regions</li>
<li><a href="triple1.gif">triple1.gif</a> - stages of constructed of
rectangular regions</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/birken/README.md">README.md</a> - markdown source for index.html</li>
<li><a href="multi2.gif">multi2.gif</a> - stages of multi-square emitters</li>
<li><a href="multi3.gif">multi3.gif</a> - stages showing multi-square emitters</li>
<li><a href="multi4.gif">multi4.gif</a> - stages showing multi-square emitters</li>
<li><a href="multi5.gif">multi5.gif</a> - stages of multi-square emitters</li>
<li><a href="pen0.gif">pen0.gif</a> - stages of single square rotruding from the bottom</li>
<li><a href="pen1.gif">pen1.gif</a> - stages of single square rotruding from the bottom</li>
<li><a href="pen2.gif">pen2.gif</a> - stages of single square rotruding from the bottom</li>
<li><a href="pen4.gif">pen4.gif</a> - stages of single square rotruding from the bottom</li>
<li><a href="pen5.gif">pen5.gif</a> - stages of single square rotruding from the bottom</li>
<li><a href="pen6.gif">pen6.gif</a> - stages of single square rotruding from the bottom</li>
<li><a href="pen7.gif">pen7.gif</a> - stages of single square rotruding from the bottom</li>
<li><a href="pen8.gif">pen8.gif</a> - stages of single square rotruding from the bottom</li>
<li><a href="platform0.gif">platform0.gif</a> - stages of 5 red squares above a row of 3 red squares</li>
<li><a href="platform1.gif">platform1.gif</a> - stages of 5 red squares above a row of 3 red squares</li>
<li><a href="platform2.gif">platform2.gif</a> - stages of 5 red squares above a row of 3 red squares</li>
<li><a href="triple0.gif">triple0.gif</a> - stages of constructed of rectangular regions</li>
<li><a href="triple1.gif">triple1.gif</a> - stages of constructed of rectangular regions</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->