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:
1 parent
9eb7a54e9f
commit
b0b212acb1
402 files changed
+37061
-55132
No files matched your search
+58
-91
@@ -130,8 +130,8 @@
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Don_Yang">Don Yang</a><br>
|
||||
Location: <a href="../../location.html#US">US</a> - <em>United States of
|
||||
America</em> (<em>United States</em>) <br><br></li>
|
||||
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 -->
|
||||
@@ -146,38 +146,29 @@ America</em> (<em>United States</em>) <br><br></li>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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.sh</span></span></code></pre></div>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p><code>Akari</code> is an image downsampling utility that accepts 3
|
||||
input formats:</p>
|
||||
<p><code>Akari</code> is an image downsampling utility that accepts 3 input formats:</p>
|
||||
<ul>
|
||||
<li><p><a href="https://netpbm.sourceforge.net/doc/pgm.html">PGM</a> (<a
|
||||
href="https://netpbm.sourceforge.net/doc/">netpbm</a> <a
|
||||
href="https://en.wikipedia.org/wiki/Grayscale">greyscale image</a>.
|
||||
<code>Akari</code> only accepts <code>PGM</code> files with the header:
|
||||
<code>P5 <width> <height> 255</code>. Images with extra
|
||||
comments <em>such as the ones produced by <a
|
||||
href="https://www.gimp.org">GIMP</a> will <strong>not be parsed
|
||||
<li><p><a href="https://netpbm.sourceforge.net/doc/pgm.html">PGM</a>
|
||||
(<a href="https://netpbm.sourceforge.net/doc/">netpbm</a> <a href="https://en.wikipedia.org/wiki/Grayscale">greyscale
|
||||
image</a>. <code>Akari</code> only accepts <code>PGM</code>
|
||||
files with the header: <code>P5 <width> <height> 255</code>. Images with extra comments
|
||||
<em>such as the ones produced by <a href="https://www.gimp.org">GIMP</a> will <strong>not be parsed
|
||||
properly</strong></em>.</p></li>
|
||||
<li><p><a href="https://netpbm.sourceforge.net/doc/ppm.html">PPM</a>
|
||||
(netpbm RGB image). Only <code>PPM</code> files with the header
|
||||
<code>P6 <width> <height> 255</code> are accepted.</p></li>
|
||||
<li><p><a href="https://en.wikipedia.org/wiki/ASCII_art">ASCII art</a>
|
||||
(with <a href="https://en.wikipedia.org/wiki/Newline">end of lines</a>
|
||||
in LF bytes only, <em><strong>not</strong> CR-LF</em>!)</p></li>
|
||||
<li><p><a href="https://netpbm.sourceforge.net/doc/ppm.html">PPM</a> (netpbm RGB image). Only
|
||||
<code>PPM</code> files with the header <code>P6 <width> <height> 255</code> are accepted.</p></li>
|
||||
<li><p><a href="https://en.wikipedia.org/wiki/ASCII_art">ASCII art</a> (with <a href="https://en.wikipedia.org/wiki/Newline">end of
|
||||
lines</a> in LF bytes only, <em><strong>not</strong> CR-LF</em>!)</p></li>
|
||||
</ul>
|
||||
<p>Anything that is not parsable as <code>PGM</code> or <code>PPM</code>
|
||||
will be downsampled as ASCII art.</p>
|
||||
<p>Anything that is not parsable as <code>PGM</code> or <code>PPM</code> will be downsampled as ASCII art.</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p><code>Akari</code> is an image downsampling utility. She accepts up
|
||||
to 3 arguments:</p>
|
||||
<p>The first argument is the input image. If it’s <code>-</code> or
|
||||
unspecified, <code>Akari</code> will read from <code>stdin</code>.</p>
|
||||
<p>The second argument is the output image. If it’s <code>-</code> or
|
||||
unspecified, <code>Akari</code> will write to <code>stdout</code>.</p>
|
||||
<p>The third argument, if specified, causes <code>Akari</code> to keep
|
||||
even pixels on even <a
|
||||
href="https://en.wikipedia.org/wiki/Scan_line">scanlines</a>. By default
|
||||
<code>Akari</code> will keep odd pixels on odd <a
|
||||
href="https://en.wikipedia.org/wiki/Scan_line">scanlines</a>.</p>
|
||||
<p><code>Akari</code> is an image downsampling utility. She accepts up to 3 arguments:</p>
|
||||
<p>The first argument is the input image. If it’s <code>-</code> or unspecified, <code>Akari</code>
|
||||
will read from <code>stdin</code>.</p>
|
||||
<p>The second argument is the output image. If it’s <code>-</code> or unspecified,
|
||||
<code>Akari</code> will write to <code>stdout</code>.</p>
|
||||
<p>The third argument, if specified, causes <code>Akari</code> to keep even pixels on even
|
||||
<a href="https://en.wikipedia.org/wiki/Scan_line">scanlines</a>. By default <code>Akari</code> will
|
||||
keep odd pixels on odd <a href="https://en.wikipedia.org/wiki/Scan_line">scanlines</a>.</p>
|
||||
<h3 id="examples">Examples:</h3>
|
||||
<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">gcc</span> akari.c <span class="at">-o</span> akari</span>
|
||||
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="ex">./akari</span> <span class="op"><</span> example.ppm <span class="op">></span> odd_output.ppm</span>
|
||||
@@ -185,97 +176,73 @@ href="https://en.wikipedia.org/wiki/Scan_line">scanlines</a>.</p>
|
||||
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="ex">./akari</span> example.ppm odd_output.ppm</span></code></pre></div>
|
||||
<p><code>Akari</code> accepts 3 input formats:</p>
|
||||
<ul>
|
||||
<li><a href="https://netpbm.sourceforge.net/doc/pgm.html">PGM</a> (<a
|
||||
href="https://netpbm.sourceforge.net/doc/">netpbm</a> <a
|
||||
href="https://en.wikipedia.org/wiki/Grayscale">greyscale image</a>.
|
||||
<code>Akari</code> only accepts <code>PGM</code> files with the header:
|
||||
<code>P5 <width> <height> 255</code>. Images with extra
|
||||
comments such as the ones produced by <a
|
||||
href="https://www.gimp.org">GIMP</a> will not be parsed properly. <a
|
||||
href="https://netpbm.sourceforge.net/doc/ppm.html">PPM</a> (netpbm RGB
|
||||
image). Only <code>PPM</code> files with the header
|
||||
<code>P6 <width> <height> 255</code> are accepted.</li>
|
||||
<li><a href="https://netpbm.sourceforge.net/doc/pgm.html">PGM</a>
|
||||
(<a href="https://netpbm.sourceforge.net/doc/">netpbm</a> <a href="https://en.wikipedia.org/wiki/Grayscale">greyscale
|
||||
image</a>. <code>Akari</code> only accepts <code>PGM</code>
|
||||
files with the header: <code>P5 <width> <height> 255</code>. Images with extra comments
|
||||
such as the ones produced by <a href="https://www.gimp.org">GIMP</a> will not be parsed
|
||||
properly.
|
||||
<a href="https://netpbm.sourceforge.net/doc/ppm.html">PPM</a> (netpbm RGB image). Only
|
||||
<code>PPM</code> files with the header <code>P6 <width> <height> 255</code> are accepted.</li>
|
||||
<li>ASCII art (with end of lines in LF bytes only, not CR-LF)</li>
|
||||
</ul>
|
||||
<p>This is useful for decoding some curiously interlaced images, such as
|
||||
the included <a href="example.ppm">example.ppm</a>.</p>
|
||||
<p>Anything that is not parsable as <code>PGM</code> or <code>PPM</code>
|
||||
will be downsampled as ASCII art. Since the source code is formatted as
|
||||
ASCII art, it’s only natural to try:</p>
|
||||
<p>Anything that is not parsable as <code>PGM</code> or <code>PPM</code> will be downsampled as
|
||||
ASCII art. Since the source code is formatted as ASCII art, it’s only
|
||||
natural to 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">./akari</span> akari.c akari2.c</span></code></pre></div>
|
||||
<p><code>akari2.c</code> is also a valid C program, and accepts up to 1
|
||||
argument. By default, this second program reads text from
|
||||
<code>stdin</code> and writes expanded output to <code>stdout</code>. If
|
||||
the extra argument is specified, the output text will also pass through
|
||||
a rot13 filter.</p>
|
||||
<p><code>akari2.c</code> is also a valid C program, and accepts up to 1 argument.
|
||||
By default, this second program reads text from <code>stdin</code> and writes
|
||||
expanded output to <code>stdout</code>. If the extra argument is specified, the
|
||||
output text will also pass through a rot13 filter.</p>
|
||||
<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">gcc</span> akari2.c <span class="at">-o</span> akari2</span>
|
||||
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a><span class="ex">./akari2</span> <span class="op"><</span> input.txt <span class="op">></span> expanded_output.txt</span>
|
||||
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a><span class="ex">./akari2</span> rot13 <span class="op"><</span> input.txt <span class="op">></span> expanded_and_rot13_output.txt</span></code></pre></div>
|
||||
<p>You can combine the two programs together to have just a regular
|
||||
rot13 filter:</p>
|
||||
<p>You can combine the two programs together to have just a regular rot13
|
||||
filter:</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">./akari2</span> rot13 <span class="op"><</span> input.txt <span class="kw">|</span> <span class="ex">./akari</span> <span class="op">></span> rot13.txt</span></code></pre></div>
|
||||
<p>Of course, we wouldn’t stop with just 2 programs, you can downsample
|
||||
the source <em>again</em> and get yet another C program:</p>
|
||||
<div class="sourceCode" id="cb8"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./akari</span> <span class="op"><</span> akari.c <span class="kw">|</span> <span class="ex">./akari</span> <span class="op">></span> akari3.c</span></code></pre></div>
|
||||
<p>We must go deeper:</p>
|
||||
<div class="sourceCode" id="cb9"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./akari</span> <span class="op"><</span> akari.c <span class="kw">|</span> <span class="ex">./akari</span> <span class="kw">|</span> <span class="ex">./akari</span> <span class="op">></span> akari4.c</span></code></pre></div>
|
||||
<p><code>akari3.c</code> and <code>akari4.c</code> are still (mostly
|
||||
valid) C programs. <code>gcc -Wall</code> will output a few warnings,
|
||||
but still produce output executables. The output executables each print
|
||||
a message to <code>stdout</code>.</p>
|
||||
<p>It takes quite a bit of skill and obfuscation to interleave a C
|
||||
program 4 levels deep, it’s much easier to interleave something like a
|
||||
<code>brainf#$%</code> program in a C program, for example. For
|
||||
comparison, a <code>brainf#$%</code> program is embedded inside <a
|
||||
href="akari.c">akari.c</a>.</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>
|
||||
<p><code>akari3.c</code> and <code>akari4.c</code> are still (mostly valid) C programs.
|
||||
<code>gcc -Wall</code> will output a few warnings, but still produce output
|
||||
executables. The output executables each print a message to <code>stdout</code>.</p>
|
||||
<p>It takes quite a bit of skill and obfuscation to interleave a
|
||||
C program 4 levels deep, it’s much easier to interleave something like
|
||||
a <code>brainf#$%</code> program in a C program, for example. For comparison, a
|
||||
<code>brainf#$%</code> program is embedded inside <a href="akari.c">akari.c</a>.</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-2011akari"><a name="inventory"></a>Inventory for
|
||||
2011/akari</h1>
|
||||
<h1 id="inventory-for-2011akari"><a name="inventory"></a>Inventory for 2011/akari</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/2011/akari/akari.c">akari.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/akari.orig.c">akari.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/akari.c">akari.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/akari.orig.c">akari.orig.c</a> - original source</li>
|
||||
<li><a href="example.ppm">example.ppm</a> - input image</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_akari.tar.bz2">2011_akari.tar.bz2</a> - download entry
|
||||
source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_akari.tar.bz2">2011_akari.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/2011/akari/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/.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/2011/akari/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/.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/2011/akari/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/akari/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+127
-168
@@ -129,10 +129,9 @@
|
||||
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Philip_Blakely">Philip
|
||||
Blakely</a><br> Location: <a href="../../location.html#GB">GB</a> -
|
||||
<em>United Kingdom of Great Britain and Northern Ireland</em>
|
||||
(<em>United Kingdom</em>) <br><br></li>
|
||||
<li>Name: <a href="../../authors.html#Philip_Blakely">Philip Blakely</a><br>
|
||||
Location: <a href="../../location.html#GB">GB</a> - <em>United Kingdom of Great Britain and Northern Ireland</em> (<em>United Kingdom</em>)
|
||||
<br><br></li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
|
||||
@@ -149,112 +148,100 @@ Blakely</a><br> Location: <a href="../../location.html#GB">GB</a> -
|
||||
<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.sh</span></span></code></pre></div>
|
||||
<p>For those who have a lot of time, try:</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="ex">./blakely</span> <span class="op"><</span> t0_3.dat</span></code></pre></div>
|
||||
<p>though one might or might not need to kill it, depending on your
|
||||
boredom threshold.</p>
|
||||
<p>though one might or might not need to kill it, depending on your boredom
|
||||
threshold.</p>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This program plays <a
|
||||
href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Life</a>
|
||||
(see also <a href="https://conwaylife.com">here</a>), computes Pi to 16
|
||||
digits if given its own source as input, and allows to check if your
|
||||
garden is a <a
|
||||
href="http://en.wikipedia.org/wiki/Garden_of_Eden_%28cellular_automaton%29">Garden
|
||||
of Eden</a>, all in one source.</p>
|
||||
<p>If you have enough time to spare, put the plan of your garden in a
|
||||
text file, and run:</p>
|
||||
<p>This program plays <a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Life</a>
|
||||
(see also <a href="https://conwaylife.com">here</a>), computes Pi to 16 digits
|
||||
if given its own source as input, and allows to check if your garden
|
||||
is a <a href="http://en.wikipedia.org/wiki/Garden_of_Eden_%28cellular_automaton%29">Garden of Eden</a>, all in one source.</p>
|
||||
<p>If you have enough time to spare, put the plan of your garden in a text file,
|
||||
and run:</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">./blakely</span> <span class="at">-</span> <span class="op"><</span> garden.txt</span></code></pre></div>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p>This program uses a well-known algorithm in order to display pi to
|
||||
fifteen decimal places. The source-layout itself demonstrates the
|
||||
importance of using the correct amount of whitespace in code and the
|
||||
clear superiority of spaces over tabs.</p>
|
||||
<p>This program uses a well-known algorithm in order to display pi to fifteen
|
||||
decimal places. The source-layout itself demonstrates the importance of using
|
||||
the correct amount of whitespace in code and the clear superiority of spaces
|
||||
over tabs.</p>
|
||||
<p>In order to see the main feature of the code, type:</p>
|
||||
<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="ex">./blakely</span> <span class="op"><</span> blakely.c</span></code></pre></div>
|
||||
<p>and wait for about four seconds before using Ctrl-C (or whatever) to
|
||||
end the program. The results are best viewed in a terminal window at
|
||||
least 60 characters high and wide. Alternatively, redirect the output to
|
||||
a separate file (killing when necessary).</p>
|
||||
<p>and wait for about four seconds before using Ctrl-C (or whatever) to end the program. The
|
||||
results are best viewed in a terminal window at least 60 characters
|
||||
high and wide. Alternatively, redirect the output to a separate file
|
||||
(killing when necessary).</p>
|
||||
<h3 id="overview">Overview</h3>
|
||||
<p>The program emulates John Conway’s cellular automaton known as “<a
|
||||
href="https://conwaylife.com">The Game of Life</a>”, using standard
|
||||
input as a starting grid. The layout of the source-code is such that it
|
||||
evolves to a digital representation of the first 15 decimal places of pi
|
||||
after 4 time steps. This was setup using the other feature of the
|
||||
program which can be demonstrated as follows:</p>
|
||||
<p>The program emulates John Conway’s cellular automaton known as “<a href="https://conwaylife.com">The Game of
|
||||
Life</a>”, using standard input as a starting grid. The
|
||||
layout of the source-code is such that it evolves to a digital representation of
|
||||
the first 15 decimal places of pi after 4 time steps. This was setup using the
|
||||
other feature of the program which can be demonstrated as follows:</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">./blakely</span> <span class="at">-</span> <span class="op"><</span> 3.dat</span></code></pre></div>
|
||||
<p>The program will first display the grid given in <a
|
||||
href="3.dat">3.dat</a>, and then three more grids (taking a few minutes
|
||||
to display the last). Waiting for any more grids will take a substantial
|
||||
amount of time. The final grid has been put into <a
|
||||
href="evolve_to_3.dat">evolve_to_3.dat</a>, and if you type</p>
|
||||
<p>The program will first display the grid given in <a href="3.dat">3.dat</a>, and then three
|
||||
more grids (taking a few minutes to display the last). Waiting for any more
|
||||
grids will take a substantial amount of time. The final grid has been put into
|
||||
<a href="evolve_to_3.dat">evolve_to_3.dat</a>, and if you type</p>
|
||||
<div class="sourceCode" id="cb8"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./blakely</span> <span class="op"><</span> evolve_to_3.dat</span></code></pre></div>
|
||||
<p>then the 3 will reappear after three time steps.</p>
|
||||
<p>As should now be clear, this use of the program will attempt to
|
||||
evolve a given setup backwards in time according to the Life rules. The
|
||||
resulting grid is clearly not necessarily unique. The program will
|
||||
evolve backwards given <em>any</em> single command line option.</p>
|
||||
<p>As should now be clear, this use of the program will attempt to evolve a given setup
|
||||
backwards in time according to the Life rules. The resulting grid is clearly not
|
||||
necessarily unique. The program will evolve backwards given <em>any</em> single command
|
||||
line option.</p>
|
||||
<p>When evolving forwards, the code can only be stopped by killing the
|
||||
program. In the reverse direction, the code can either be killed, or
|
||||
will stop if it is unable to find a grid that will evolve to the current
|
||||
layout correctly. This can be seen with the sample grid <a
|
||||
href="t0_3.dat">t0_3.dat</a>, which evolves backwards by only two
|
||||
time-steps.</p>
|
||||
will stop if it is unable to find a grid that will evolve to the
|
||||
current layout correctly. This can be seen with the sample grid
|
||||
<a href="t0_3.dat">t0_3.dat</a>, which evolves backwards by only two time-steps.</p>
|
||||
<h3 id="input-file-format">Input file format</h3>
|
||||
<p>The input files must encode a square grid, where a space is a dead
|
||||
cell, and any other character (except a newline) is a living cell. Each
|
||||
line must be the same length, and end with a single newline character
|
||||
<code>\n</code> (ASCII 10), including the last line. When designing
|
||||
grids, it may help to type full-stops (dots) in place of spaces, and do
|
||||
a global replace afterwards. Any deviation from this format will cause
|
||||
errors in the output.</p>
|
||||
<p>The input files must encode a square grid, where a space is a dead cell, and any
|
||||
other character (except a newline) is a living cell. Each line must be the same
|
||||
length, and end with a single newline character <code>\n</code> (ASCII 10), including the
|
||||
last line. When designing grids, it may help to type full-stops (dots) in place
|
||||
of spaces, and do a global replace afterwards. Any deviation from this format
|
||||
will cause errors in the output.</p>
|
||||
<h3 id="limitations">Limitations</h3>
|
||||
<p>This is only an approximation to the original Life, as it takes place
|
||||
on a finite grid, with borders that are automatically killed off before
|
||||
each time step. However, when evolving backwards, the resulting grids
|
||||
will not cause any cells on the boundaries to come alive. As the display
|
||||
is performed before killing off the borders, some boundary cells may
|
||||
sometimes appear to be alive, but not be treated as such for the
|
||||
following time-step, although any living cells on the right border will
|
||||
never be displayed.</p>
|
||||
<p>The maximum grid size is currently 99 by 99 (exceeding this will
|
||||
cause a segfault), but changing the two <code>9802</code>s to
|
||||
<code>MAX_SIZE*MAX_SIZE+1</code> will solve this, although some
|
||||
reformatting of the code might have to be done to allow larger
|
||||
numbers.</p>
|
||||
on a finite grid, with borders that are automatically killed off
|
||||
before each time step. However, when evolving backwards, the resulting
|
||||
grids will not cause any cells on the boundaries to come alive.
|
||||
As the display is performed before killing off the borders, some
|
||||
boundary cells may sometimes appear to be alive, but not be treated as
|
||||
such for the following time-step, although any living cells on the
|
||||
right border will never be displayed.</p>
|
||||
<p>The maximum grid size is currently 99 by 99 (exceeding this will cause a
|
||||
segfault), but changing the two <code>9802</code>s to <code>MAX_SIZE*MAX_SIZE+1</code> will
|
||||
solve this, although some reformatting of the code might have to be done to allow
|
||||
larger numbers.</p>
|
||||
<h3 id="compiler-warningsassumptions">Compiler warnings/assumptions</h3>
|
||||
<p>When compiled with the <code>-Wall -pedantic -ansi</code> options of
|
||||
gcc, some warnings suggesting extra parentheses occur (not necessary for
|
||||
anyone fully conversant with operator precedence). There is one unused
|
||||
variable, <code>v</code>, but unnamed function parameters are not
|
||||
permitted in ANSI C, so naming it is necessary, and gcc no longer warns
|
||||
about its existence, although earlier versions do.</p>
|
||||
<p>Since the program calculates ASCII character values for display, an
|
||||
ASCII based system is required to run it. Also, as mentioned above, any
|
||||
system that uses anything other than a plain <code>\n</code> to end a
|
||||
line will cause problems when reading in files.</p>
|
||||
<p>When compiled with the <code>-Wall -pedantic -ansi</code> options of gcc, some warnings
|
||||
suggesting extra parentheses occur (not necessary for anyone fully conversant
|
||||
with operator precedence). There is one unused variable, <code>v</code>, but unnamed
|
||||
function parameters are not permitted in ANSI C, so naming it is necessary, and
|
||||
gcc no longer warns about its existence, although earlier versions do.</p>
|
||||
<p>Since the program calculates ASCII character values for display, an ASCII based
|
||||
system is required to run it. Also, as mentioned above, any system that uses
|
||||
anything other than a plain <code>\n</code> to end a line will cause problems when reading
|
||||
in files.</p>
|
||||
<h3 id="obfuscation">Obfuscation</h3>
|
||||
<p>Given the finely-tuned layout required to evolve into pi, this is one
|
||||
of the main obfuscations used in the code. However, running the code
|
||||
through the preprocessor, expanding the <code>#define</code>s, and
|
||||
applying GNU’s indent, although making the location of functions and
|
||||
statements clear, by no means makes the code entirely clear. Note that
|
||||
expanding out the <code>#define</code>s does not take the program over
|
||||
the character limit. The main reason for these is to do with the layout,
|
||||
since there are few places that keywords or tokens of over 2 characters
|
||||
can be fitted, and requiring the first few lines to be
|
||||
<code>#include</code>s would cause similar problems.</p>
|
||||
<p>Given the finely-tuned layout required to evolve into pi, this is one of the
|
||||
main obfuscations used in the code. However, running the code through the
|
||||
preprocessor, expanding the <code>#define</code>s, and applying GNU’s indent, although
|
||||
making the location of functions and statements clear, by no means makes the
|
||||
code entirely clear. Note that expanding out the <code>#define</code>s does not take the
|
||||
program over the character limit. The main reason for these is to do with the
|
||||
layout, since there are few places that keywords or tokens of over 2
|
||||
characters can be fitted, and requiring the first few lines to be <code>#include</code>s
|
||||
would cause similar problems.</p>
|
||||
<p>Other obfuscations used are:</p>
|
||||
<ul>
|
||||
<li>Use of the classic <code>2[a]</code> syntax to access the third
|
||||
element of the array <code>a</code>.</li>
|
||||
<li>Use of the classic <code>2[a]</code> syntax to access the third element of the
|
||||
array <code>a</code>.</li>
|
||||
<li>Nested ternary operators, combined with shortcut evaluation being
|
||||
required for correct operation.</li>
|
||||
<li>Use of the comma operator to embed operations inside one
|
||||
another.</li>
|
||||
<li>Use of the comma operator to embed operations inside one another.</li>
|
||||
<li>Calculation of ASCII codes.</li>
|
||||
<li>Needlessly recursive functions.</li>
|
||||
<li>Use of bitwise-operations.</li>
|
||||
<li>Storing a variable whose value could easily be found from
|
||||
another.</li>
|
||||
<li>Storing a variable whose value could easily be found from another.</li>
|
||||
<li>Use of <code>goto</code>s to emulate a <code>for</code> loop.</li>
|
||||
</ul>
|
||||
<h3 id="algorithm">Algorithm</h3>
|
||||
@@ -264,112 +251,84 @@ know, a brute-force method is the only viable automatic approach for
|
||||
general grids, although more intelligent algorithms would be possible
|
||||
given more space.</p>
|
||||
<p>The program starts with an empty “trial” grid and, starting from the
|
||||
top-left, tries all possibilities for the neighbours of the current cell
|
||||
that will cause the cell to evolve to the required state. It then
|
||||
proceeds to the right and down. Thus, it only ever needs to look at the
|
||||
cells below and to the right when testing. However, the already defined
|
||||
cells above and/or to the left of the cell may mean that there are no
|
||||
possibilities that will give the correct state, in which case the code
|
||||
backtracks and tries other possibilities on previous cells. The program
|
||||
knows it has a valid grid if it gets to the last cell. If it cannot find
|
||||
a valid grid, the program exits.</p>
|
||||
top-left, tries all possibilities for the neighbours of the current
|
||||
cell that will cause the cell to evolve to the required state. It then
|
||||
proceeds to the right and down. Thus, it only ever needs to look at
|
||||
the cells below and to the right when testing. However, the already
|
||||
defined cells above and/or to the left of the cell may mean that there
|
||||
are no possibilities that will give the correct state, in which case
|
||||
the code backtracks and tries other possibilities on previous
|
||||
cells. The program knows it has a valid grid if it gets to the last
|
||||
cell. If it cannot find a valid grid, the program exits.</p>
|
||||
<p>Since this uses brute-force, it can be very slow. (In fact, the
|
||||
various obfuscations have, at least for the gcc compiler, caused a
|
||||
substantial slowdown.)</p>
|
||||
various obfuscations have, at least for the gcc compiler,
|
||||
caused a substantial slowdown.)</p>
|
||||
<h3 id="program-layout">Program layout</h3>
|
||||
<p>The “calculation” of pi was chosen purely because algorithms to find
|
||||
pi are numerous, but the <a
|
||||
href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Game of
|
||||
Life</a> is rarely (if ever?) used for this purpose. Also, separate
|
||||
digits made determining the layout somewhat easier.</p>
|
||||
<p>Deriving the layout was the most complicated part of the program. As
|
||||
is clear from the final layout featuring pi, the grid was divided into
|
||||
sixteen squares, and layouts that would evolve to each of the nine
|
||||
digits required were found. (This used the three-by-five digit-layout
|
||||
embedded in, at first, a nine-by-nine grid, then in larger grids, until
|
||||
fifteen-by-fifteen was reached.) The fifteen-by-fifteen grids give
|
||||
enough blank cells around them that the digits will not collide when
|
||||
evolving.</p>
|
||||
<p>The “calculation” of pi was chosen purely because algorithms to find pi are
|
||||
numerous, but the <a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Game of
|
||||
Life</a> is rarely (if
|
||||
ever?) used for this purpose. Also, separate digits made determining the layout
|
||||
somewhat easier.</p>
|
||||
<p>Deriving the layout was the most complicated part of the program. As is clear
|
||||
from the final layout featuring pi, the grid was divided into sixteen squares,
|
||||
and layouts that would evolve to each of the nine digits required were found.
|
||||
(This used the three-by-five digit-layout embedded in, at first, a nine-by-nine
|
||||
grid, then in larger grids, until fifteen-by-fifteen was reached.) The
|
||||
fifteen-by-fifteen grids give enough blank cells around them that the digits
|
||||
will not collide when evolving.</p>
|
||||
<p>However, this did not allow for sufficient characters to fit the code
|
||||
into. Therefore it was necessary to add some regions that would quickly
|
||||
die off without expanding to collide with the digits’ evolution. Groups
|
||||
of cells such as singletons, pairs, and larger groups like</p>
|
||||
into. Therefore it was necessary to add some regions that would quickly die off
|
||||
without expanding to collide with the digits’ evolution.
|
||||
Groups of cells such as singletons, pairs, and larger groups like</p>
|
||||
<pre><code>* * * * * * * * * *
|
||||
*****************
|
||||
* * * * * * * * * *</code></pre>
|
||||
<p>were useful in this regard.</p>
|
||||
<p>Other problems were keywords which need to be all in one string,
|
||||
keywords requiring space after them, and multi-character tokens. Some of
|
||||
these problems were dealt with by using the <code>#define</code>s and
|
||||
<code>#include</code>s given in the build-script, as there was no way to
|
||||
have sufficient separate lines in the code to do this without causing
|
||||
many difficulties. Some rejigging of the grid’s layout as the code was
|
||||
fitted into its format was also done, resorting to trial-and-improvement
|
||||
in some cases. Occasional use of constructs such as <code>f -= -3</code>
|
||||
was made as <code>f += 3</code> could not be fitted into the required
|
||||
format. The fact that the borders would be killed off immediately was
|
||||
also helpful.</p>
|
||||
<p>Other problems were keywords which need to be all in one
|
||||
string, keywords requiring space after them, and
|
||||
multi-character tokens. Some of these problems were dealt with by
|
||||
using the <code>#define</code>s and <code>#include</code>s given in the build-script, as there
|
||||
was no way to have sufficient separate lines in the code to do this
|
||||
without causing many difficulties. Some rejigging of the grid’s layout
|
||||
as the code was fitted into its format was also done, resorting to
|
||||
trial-and-improvement in some cases. Occasional use of constructs such
|
||||
as <code>f -= -3</code> was made as <code>f += 3</code> could not be fitted into the required format.
|
||||
The fact that the borders would be killed off immediately was also helpful.</p>
|
||||
<p>It should be noted that evolving a full 60-by-60 grid backwards using
|
||||
this code would probably take us at least up to the heat-death of the
|
||||
universe.</p>
|
||||
<p>The command <code>./blakely - < blakely.c</code> is therefore
|
||||
<em>not</em> recommended.</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>
|
||||
<p>The command <code>./blakely - < blakely.c</code> is therefore <em>not</em> recommended.</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-2011blakely"><a name="inventory"></a>Inventory for
|
||||
2011/blakely</h1>
|
||||
<h1 id="inventory-for-2011blakely"><a name="inventory"></a>Inventory for 2011/blakely</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/2011/blakely/blakely.c">blakely.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/blakely.orig.c">blakely.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/3.dat">3.dat</a>
|
||||
- input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/evolve_to_3.dat">evolve_to_3.dat</a>
|
||||
- input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/t0_3.dat">t0_3.dat</a>
|
||||
- input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_blakely.tar.bz2">2011_blakely.tar.bz2</a> - download
|
||||
entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/blakely.c">blakely.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/blakely.orig.c">blakely.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/3.dat">3.dat</a> - input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/evolve_to_3.dat">evolve_to_3.dat</a> - input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/t0_3.dat">t0_3.dat</a> - input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_blakely.tar.bz2">2011_blakely.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/2011/blakely/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/.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/2011/blakely/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/.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/2011/blakely/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/blakely/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+45
-77
@@ -129,9 +129,9 @@
|
||||
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Szabolcs_Borsanyi">Szabolcs
|
||||
Borsanyi</a><br> Location: <a href="../../location.html#DE">DE</a> -
|
||||
<em>Federal Republic of Germany</em> (<em>Germany</em>) <br><br></li>
|
||||
<li>Name: <a href="../../authors.html#Szabolcs_Borsanyi">Szabolcs Borsanyi</a><br>
|
||||
Location: <a href="../../location.html#DE">DE</a> - <em>Federal Republic of Germany</em> (<em>Germany</em>)
|
||||
<br><br></li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
|
||||
@@ -144,117 +144,85 @@ Borsanyi</a><br> Location: <a href="../../location.html#DE">DE</a> -
|
||||
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
|
||||
<p>The current status of this entry is:</p>
|
||||
<pre><code>STATUS: INABIAF - please **DO NOT** fix</code></pre>
|
||||
<p>For more detailed information see <a
|
||||
href="../../bugs.html#2011_borsanyi">2011 borsanyi bugs</a>.</p>
|
||||
<p>For more detailed information see <a href="../../bugs.html#2011_borsanyi">2011 borsanyi bugs</a>.</p>
|
||||
<h2 id="to-use">To use:</h2>
|
||||
<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">./borsanyi</span> <span class="op"><</span> some_data_file</span></code></pre></div>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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="ex">./try.sh</span></span></code></pre></div>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This is a nice quick <a
|
||||
href="https://en.wikipedia.org/wiki/Histogram">histogram</a> plotter. A
|
||||
useful utility when you need to look at the distribution of some
|
||||
<p>This is a nice quick <a href="https://en.wikipedia.org/wiki/Histogram">histogram</a>
|
||||
plotter. A useful utility when you need to look at the distribution of some
|
||||
data.</p>
|
||||
<h3 id="challenges">Challenges:</h3>
|
||||
<p>You can modify the number of histogram <a
|
||||
href="https://en.wikipedia.org/wiki/Data_binning">bins</a> and the
|
||||
scaling of the histogram by editing the source. Try to find them!</p>
|
||||
<p>You can modify the number of histogram
|
||||
<a href="https://en.wikipedia.org/wiki/Data_binning">bins</a> and the scaling of the
|
||||
histogram by editing the source. Try to find them!</p>
|
||||
<p>If you look at the source you will notice that the usual array of
|
||||
histogram bins is missing. The source contains no arrays and it does not
|
||||
use <code>malloc(3)</code> or <code>alloca(3)</code>. How does it build
|
||||
the histogram?</p>
|
||||
<p>While the input does not need to be sorted, the histogram output is
|
||||
sorted. How does it put the data into buckets? Why does it
|
||||
<code>fork(2)</code> 22 times?</p>
|
||||
use <code>malloc(3)</code> or <code>alloca(3)</code>. How does it build the histogram?</p>
|
||||
<p>While the input does not need to be sorted, the histogram output is sorted.
|
||||
How does it put the data into buckets? Why does it <code>fork(2)</code> 22 times?</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p>This small piece of program is meant to be a useful tool, when there
|
||||
are some data around and you need a quick glance at the histogram. I am
|
||||
all too often logged in to a remote machine with slow X connection, and
|
||||
a terminal-based program would be of great help.</p>
|
||||
<p>This small piece of program is meant to be a useful tool, when
|
||||
there are some data around and you need a quick glance at the
|
||||
histogram. I am all too often logged in to a remote machine with
|
||||
slow X connection, and a terminal-based program would be of
|
||||
great help.</p>
|
||||
<h3 id="limitations">Limitations</h3>
|
||||
<ul>
|
||||
<li>I optimized the output for the data I had around, you might want to
|
||||
adjust for your needs. For a great excess of data points the program
|
||||
will crash (depending on the available stack).</li>
|
||||
<li>Giving too few (distinct) points can also cause crash (or division
|
||||
by zero).</li>
|
||||
<li>I optimized the output for the data I had around, you might want to adjust
|
||||
for your needs. For a great excess of data points the program will crash
|
||||
(depending on the available stack).</li>
|
||||
<li>Giving too few (distinct) points can also cause crash (or division by zero).</li>
|
||||
<li>The program expects plain numbers separated by white spaces.</li>
|
||||
<li>ASCII is assumed.</li>
|
||||
<li>Some POSIX-like system is assumed (<code>fork()</code> and
|
||||
<code>wait(NULL)</code> are used).</li>
|
||||
<li>Some POSIX-like system is assumed (<code>fork()</code> and <code>wait(NULL)</code> are used).</li>
|
||||
<li>Do not give any arguments to the program.</li>
|
||||
<li>Could rounding errors cause the omission of the highest bin? There
|
||||
might be empty bins at the edges.</li>
|
||||
<li>Could rounding errors cause the omission of the highest bin? There might be
|
||||
empty bins at the edges.</li>
|
||||
</ul>
|
||||
<h3 id="obfuscation">Obfuscation</h3>
|
||||
<ul>
|
||||
<li>The program follows a rather unconventional approach to the task of
|
||||
histogram building. The usual array of integers (for the histogram bins)
|
||||
is missing entirely. The data are read once, the range is determined,
|
||||
<li>The program follows a rather unconventional approach to the task
|
||||
of histogram building. The usual array of integers (for the histogram
|
||||
bins) is missing entirely. The data are read once, the range is determined,
|
||||
but the data points are not put in any array. Yet they are remembered,
|
||||
and each of them is put into its own bin afterwards. But where are the
|
||||
bins?</li>
|
||||
<li>I tried to use as few keywords as possible, hence there are no
|
||||
loops.</li>
|
||||
and each of them is put into its own bin afterwards. But where are the bins?</li>
|
||||
<li>I tried to use as few keywords as possible, hence there are no loops.</li>
|
||||
<li>Multi-process approach for optimal use of resources.</li>
|
||||
<li>Some bin size obfuscation.</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-2011borsanyi"><a name="inventory"></a>Inventory
|
||||
for 2011/borsanyi</h1>
|
||||
<h1 id="inventory-for-2011borsanyi"><a name="inventory"></a>Inventory for 2011/borsanyi</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/2011/borsanyi/borsanyi.c">borsanyi.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/borsanyi.orig.c">borsanyi.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/data.1">data.1</a>
|
||||
- sample input</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/data.2">data.2</a>
|
||||
- sample input</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/data.3">data.3</a>
|
||||
- sample input</li>
|
||||
<li><a href="2011_borsanyi.tar.bz2">2011_borsanyi.tar.bz2</a> - download
|
||||
entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/borsanyi.c">borsanyi.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/borsanyi.orig.c">borsanyi.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/data.1">data.1</a> - sample input</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/data.2">data.2</a> - sample input</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/data.3">data.3</a> - sample input</li>
|
||||
<li><a href="2011_borsanyi.tar.bz2">2011_borsanyi.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/2011/borsanyi/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/.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/2011/borsanyi/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/.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/2011/borsanyi/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/borsanyi/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+199
-362
@@ -129,9 +129,9 @@
|
||||
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#J_David_Lowe">J. David
|
||||
Lowe</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#J_David_Lowe">J. David Lowe</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 -->
|
||||
@@ -145,444 +145,281 @@ Lowe</a><br> Location: <a href="../../location.html#US">US</a> -
|
||||
<p>The current status of this entry is:</p>
|
||||
<pre><code>STATUS: missing or dead link - please provide them
|
||||
STATUS: INABIAF - please **DO NOT** fix</code></pre>
|
||||
<p>For more detailed information see <a
|
||||
href="../../bugs.html#2011_dlowe">2011 dlowe bugs</a>.</p>
|
||||
<p>For more detailed information see <a href="../../bugs.html#2011_dlowe">2011 dlowe bugs</a>.</p>
|
||||
<h2 id="to-use">To use:</h2>
|
||||
<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">./dlowe</span> <span class="at">-</span><span class="op"><</span>n_iterations<span class="op">></span> corpus1/ <span class="pp">[</span><span class="ss">...</span><span class="pp">]</span> corpus0/ <span class="op"><</span> start.net <span class="op">></span> trained.net</span></code></pre></div>
|
||||
<p>NOTE: In the above command, the directory args MUST end in a
|
||||
<code>/</code>.</p>
|
||||
<p>NOTE: In the above command, the directory args MUST end in a <code>/</code>.</p>
|
||||
<p>Then to use <code>trained.net</code>:</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="ex">./dlowe</span> file [file ...] <span class="op"><</span> trained.net</span></code></pre></div>
|
||||
<h2 id="try">Try:</h2>
|
||||
<p>Try these pre-trained networks:</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">./try.sh</span></span></code></pre></div>
|
||||
<p>NOTE: The <code>dlowe-aux-data/</code> directory, which <a
|
||||
href="try.sh">try.sh</a> refers to, was created by:</p>
|
||||
<p>NOTE: The <code>dlowe-aux-data/</code> directory, which <a href="try.sh">try.sh</a> refers to, was
|
||||
created by:</p>
|
||||
<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">tar</span> <span class="at">-jxf</span> dlowe-aux-data.tar.bz2</span></code></pre></div>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This entry is a ghoulish example of a brain (dead?) neural network
|
||||
classifier. It comes with a set of corpora for you to try.</p>
|
||||
<h3
|
||||
id="ioccc-winlose-trained.net"><code>ioccc-winlose-trained.net</code></h3>
|
||||
<p>You can create your own trained networks. For example, we trained a
|
||||
network on the C code of entries that were supplied to the 20Th
|
||||
IOCCC.</p>
|
||||
<p>The <code>ioccc-winlose-trained.net</code> was trained using the <a
|
||||
href="earlystop.pl">earlystop.pl</a> tool:</p>
|
||||
<p>This entry is a ghoulish example of a brain (dead?) neural network classifier.
|
||||
It comes with a set of corpora for you to try.</p>
|
||||
<h3 id="ioccc-winlose-trained.net"><code>ioccc-winlose-trained.net</code></h3>
|
||||
<p>You can create your own trained networks. For example, we trained a network
|
||||
on the C code of entries that were supplied to the 20Th IOCCC.</p>
|
||||
<p>The <code>ioccc-winlose-trained.net</code> was trained using the
|
||||
<a href="earlystop.pl">earlystop.pl</a> tool:</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="fu">rm</span> <span class="at">-f</span> ioccc-winlose-trained.net</span>
|
||||
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a><span class="ex">./earlystop.pl</span> ioccc-winlose-trained.net ioccc_won_training/ ioccc_lost_training/ ioccc_won_test/ ioccc_lost_test/</span></code></pre></div>
|
||||
<p>where:</p>
|
||||
<ul>
|
||||
<li><p><code>ioccc_won_training/</code> 1/2 of C code of the 20th IOCCC
|
||||
entries (except for <a href="dlowe.c">dlowe.c</a> from 2011) plus 1/2 of
|
||||
the C code winning entries from prior IOCCC contests</p></li>
|
||||
<li><p><code>ioccc_won_test/</code> 1/2 of C code of the 20th IOCCC
|
||||
entries (except for <a href="dlowe.c">dlowe.c</a> from 2011) plus 1/2 of
|
||||
the C code winning entries from prior IOCCC contests</p></li>
|
||||
<li><p><code>ioccc_lost_training/</code> 1/2 of C code from entries that
|
||||
that did not win</p></li>
|
||||
<li><p><code>ioccc_lost_test/</code> 1/2 of C code from entries that
|
||||
that did not win</p></li>
|
||||
<li><p><code>ioccc_won_training/</code>
|
||||
1/2 of C code of the 20th IOCCC entries (except for <a href="dlowe.c">dlowe.c</a> from 2011)
|
||||
plus 1/2 of the C code winning entries from prior IOCCC contests</p></li>
|
||||
<li><p><code>ioccc_won_test/</code>
|
||||
1/2 of C code of the 20th IOCCC entries (except for <a href="dlowe.c">dlowe.c</a> from 2011)
|
||||
plus 1/2 of the C code winning entries from prior IOCCC contests</p></li>
|
||||
<li><p><code>ioccc_lost_training/</code>
|
||||
1/2 of C code from entries that that did not win</p></li>
|
||||
<li><p><code>ioccc_lost_test/</code>
|
||||
1/2 of C code from entries that that did not win</p></li>
|
||||
</ul>
|
||||
<p>NOTE: The above directories were not shipped and everything from the
|
||||
entries that did not win were flushed to <code>/dev/null</code>.</p>
|
||||
<p>NOTE: The above directories were not shipped and everything from the entries
|
||||
that did not win were flushed to <code>/dev/null</code>.</p>
|
||||
<p>The <a href="earlystop.pl">earlystop.pl</a> tool wrote:</p>
|
||||
<pre><code>training 1 to 1001...
|
||||
training 1001 to 2001...
|
||||
prior error = 56.746974766043; current error = 58.095691135305</code></pre>
|
||||
<p>The resulting <code>ioccc-winlose-trained.net</code> file was
|
||||
included in the <a
|
||||
href="dlowe-aux-data.tar.bz2">dlowe-aux-data.tar.bz2</a> tarball.</p>
|
||||
<p>The <a href="dlowe.c">dlowe.c</a> was explicitly excluded from this
|
||||
trailing set, so this test is interesting:</p>
|
||||
<p>The resulting <code>ioccc-winlose-trained.net</code> file was included in the
|
||||
<a href="dlowe-aux-data.tar.bz2">dlowe-aux-data.tar.bz2</a> tarball.</p>
|
||||
<p>The <a href="dlowe.c">dlowe.c</a> was explicitly excluded from this trailing set, so this
|
||||
test is interesting:</p>
|
||||
<div class="sourceCode" id="cb9"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> dlowe.c <span class="op"><</span> dlowe-aux-data/ioccc-winlose-trained.net</span></code></pre></div>
|
||||
<p>NOTE: this is done in <a href="try.sh">try.sh</a>.</p>
|
||||
<p>The match of <a href="dlowe.c">dlowe.c</a> to the lose/win trailed
|
||||
network was:</p>
|
||||
<p>The match of <a href="dlowe.c">dlowe.c</a> to the lose/win trailed network was:</p>
|
||||
<pre><code>dlowe.c 0.125108</code></pre>
|
||||
<p>NOTE: The non-artificially intelligent decisions of the IOCCC judges
|
||||
include random quirks and their non-linear judgment calls not found in
|
||||
the ioccc trained network. Just because C code is or isn’t scored highly
|
||||
by this network does not mean it will win or lose a future IOCCC. On the
|
||||
other hand … it just might!</p>
|
||||
<p>NOTE: The non-artificially intelligent decisions of the IOCCC judges include random
|
||||
quirks and their non-linear judgment calls not found in the ioccc trained network.
|
||||
Just because C code is or isn’t scored highly by this network does not
|
||||
mean it will win or lose a future IOCCC. On the other hand … it just might!</p>
|
||||
<h4 id="other-data-sets-to-try">other data sets to try</h4>
|
||||
<p>While we cannot supply you with the losing IOCCC source code, the
|
||||
author did supply a number data sets on which to test:</p>
|
||||
<p>We created the <a
|
||||
href="dlowe-aux-data/english-trained.net">english-trained.net</a> as
|
||||
follows:</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">./dlowe</span> <span class="at">-8000</span> dlowe-aux-data/english-1/ dlowe-aux-data/english-0/ <span class="op"><</span> /dev/null <span class="op">></span> dlowe-aux-data/english-trained.net</span></code></pre></div>
|
||||
<p>While we cannot supply you with the losing IOCCC source code, the author did supply a number
|
||||
data sets on which to test:</p>
|
||||
<p>We created the <a href="dlowe-aux-data/english-trained.net">english-trained.net</a> as follows:</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">./dlowe</span> <span class="at">-8000</span> dlowe-aux-data/english-1/ dlowe-aux-data/english-0/ <span class="op"><</span> /dev/null <span class="op">></span> dlowe-aux-data/english-trained.net</span></code></pre></div>
|
||||
<ul>
|
||||
<li><p><a href="dlowe-aux-data/english-0/">dlowe-aux-data/english-0/</a>
|
||||
Non-English (French) text</p></li>
|
||||
<li><p><a href="dlowe-aux-data/english-1">dlowe-aux-data/english-1/</a>
|
||||
English (non-French) text</p></li>
|
||||
</ul>
|
||||
<p>We created the <a
|
||||
href="dlowe-aux-data/png-trained.net">png-trained.net</a> as
|
||||
follows:</p>
|
||||
<div class="sourceCode" id="cb12"><pre
|
||||
class="sourceCode sh"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> <span class="at">-8000</span> png-1/ png-0/ <span class="op"><</span> /dev/null <span class="op">></span> dlowe-aux-data/png-trained.net</span></code></pre></div>
|
||||
<p>We created the <a href="dlowe-aux-data/png-trained.net">png-trained.net</a> as follows:</p>
|
||||
<div class="sourceCode" id="cb12"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> <span class="at">-8000</span> png-1/ png-0/ <span class="op"><</span> /dev/null <span class="op">></span> dlowe-aux-data/png-trained.net</span></code></pre></div>
|
||||
<ul>
|
||||
<li><p><a href="dlowe-aux-data/png-0/">dlowe-aux-data/png-0/</a> Non-png
|
||||
(gif) images</p></li>
|
||||
<li><p><a href="dlowe-aux-data/png-1/">dlowe-aux-data/png-1/</a> png
|
||||
(non-gif) images</p></li>
|
||||
<li><p><a href="dlowe-aux-data/png-0/">dlowe-aux-data/png-0/</a>
|
||||
Non-png (gif) images</p></li>
|
||||
<li><p><a href="dlowe-aux-data/png-1/">dlowe-aux-data/png-1/</a>
|
||||
png (non-gif) images</p></li>
|
||||
</ul>
|
||||
<p>We created the <a
|
||||
href="dlowe-aux-data/xor-trained.net">xor-trained.net</a> as
|
||||
follows:</p>
|
||||
<div class="sourceCode" id="cb13"><pre
|
||||
class="sourceCode sh"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> <span class="at">-8000</span> dlowe-aux-data/xor-1/ dlowe-aux-data/xor-0/ <span class="op"><</span> /dev/null <span class="op">></span> dlowe-aux-data/xor-trained.net</span></code></pre></div>
|
||||
<p>We created the <a href="dlowe-aux-data/xor-trained.net">xor-trained.net</a> as follows:</p>
|
||||
<div class="sourceCode" id="cb13"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> <span class="at">-8000</span> dlowe-aux-data/xor-1/ dlowe-aux-data/xor-0/ <span class="op"><</span> /dev/null <span class="op">></span> dlowe-aux-data/xor-trained.net</span></code></pre></div>
|
||||
<ul>
|
||||
<li><p><a href="dlowe-aux-data/xor-0/">dlowe-aux-data/xor-0</a> Data
|
||||
that XORs to 0</p></li>
|
||||
<li><p><a href="dlowe-aux-data/xor-1/">dlowe-aux-data/xor-1/</a> Data
|
||||
that XORs to 1</p></li>
|
||||
<li><p><a href="dlowe-aux-data/xor-0/">dlowe-aux-data/xor-0</a>
|
||||
Data that XORs to 0</p></li>
|
||||
<li><p><a href="dlowe-aux-data/xor-1/">dlowe-aux-data/xor-1/</a>
|
||||
Data that XORs to 1</p></li>
|
||||
</ul>
|
||||
<p><strong>NOTE</strong>: The directory args <strong>must end in
|
||||
a</strong> <code>/</code> for them to work.</p>
|
||||
<p><strong>NOTE</strong>: The directory args <strong>must end in a</strong> <code>/</code> for them to work.</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<h3 id="synopsis">Synopsis</h3>
|
||||
<p>This is an <a
|
||||
href="https://en.wikipedia.org/wiki/Artificial_intelligence">artificially
|
||||
intelligent</a> judging tool to help the IOCCC judges. Here’s to
|
||||
shorter, more frequent contests!</p>
|
||||
<p>This is an <a href="https://en.wikipedia.org/wiki/Artificial_intelligence">artificially
|
||||
intelligent</a> judging tool
|
||||
to help the IOCCC judges. Here’s to shorter, more frequent contests!</p>
|
||||
<h3 id="description">Description</h3>
|
||||
<p>This is a multilayer <a
|
||||
href="https://en.wikipedia.org/wiki/Perceptron">perceptron</a> (a <a
|
||||
href="https://en.wikipedia.org/wiki/Feedforward_neural_network">feedforward
|
||||
artificial neural network</a>) which can be trained, using on-line <a
|
||||
href="https://en.wikipedia.org/wiki/Backpropagation">backpropagation</a>,
|
||||
to classify input files.</p>
|
||||
<p>It has a fixed topology of <code>2^16</code> input neurons, 6 hidden
|
||||
neurons and 1 output neuron.</p>
|
||||
<p>The neurons’ activation function is the logistic function
|
||||
<code>1 / (1 + e ^ -x)</code>.</p>
|
||||
<p>This is a multilayer <a href="https://en.wikipedia.org/wiki/Perceptron">perceptron</a> (a
|
||||
<a href="https://en.wikipedia.org/wiki/Feedforward_neural_network">feedforward artificial neural
|
||||
network</a>)
|
||||
which can be trained, using on-line
|
||||
<a href="https://en.wikipedia.org/wiki/Backpropagation">backpropagation</a>, to classify input files.</p>
|
||||
<p>It has a fixed topology of <code>2^16</code> input neurons, 6 hidden neurons and 1 output
|
||||
neuron.</p>
|
||||
<p>The neurons’ activation function is the logistic function <code>1 / (1 + e ^ -x)</code>.</p>
|
||||
<h3 id="classifying">Classifying</h3>
|
||||
<div class="sourceCode" id="cb14"><pre
|
||||
class="sourceCode sh"><code class="sourceCode bash"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> file [file ...] <span class="op"><</span> trained.net</span></code></pre></div>
|
||||
<p>To classify files, one specifies a trained network (on
|
||||
<code>stdin</code>) and one or more files to classify. The program will
|
||||
output one line per successfully-classified file to <code>stderr</code>,
|
||||
with the filename and the classification: a number between 0 and 1.</p>
|
||||
<p>The interpretation of the classification number depends on how the
|
||||
network was trained, but it’s geared toward interpretation as a
|
||||
<em>probability</em> or a <em>confidence</em>.</p>
|
||||
<div class="sourceCode" id="cb14"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> file [file ...] <span class="op"><</span> trained.net</span></code></pre></div>
|
||||
<p>To classify files, one specifies a trained network (on <code>stdin</code>) and one or more
|
||||
files to classify. The program will output one line per successfully-classified
|
||||
file to <code>stderr</code>, with the filename and the classification: a number between 0
|
||||
and 1.</p>
|
||||
<p>The interpretation of the classification number depends on how the network was
|
||||
trained, but it’s geared toward interpretation as a <em>probability</em> or a
|
||||
<em>confidence</em>.</p>
|
||||
<h3 id="training">Training</h3>
|
||||
<div class="sourceCode" id="cb15"><pre
|
||||
class="sourceCode sh"><code class="sourceCode bash"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> <span class="at">-</span><span class="op"><</span>n_iterations<span class="op">></span> corpus1/ <span class="pp">[</span><span class="ss">...</span><span class="pp">]</span> corpus0/ <span class="op"><</span> start.net <span class="op">></span> end.net</span></code></pre></div>
|
||||
<p><strong>NOTE</strong>: The directory args <strong>must end in
|
||||
a</strong> <code>/</code> for them to work.</p>
|
||||
<p>To train a network, one specifies a starting network (on
|
||||
<code>stdin</code>), two or more corpora (directories containing
|
||||
training data), and the number of training iterations to run. The
|
||||
program will write some progress data to <code>stderr</code> and, when
|
||||
it’s done, will serialize the updated network to
|
||||
<code>stdout</code>.</p>
|
||||
<p>If no input network is given, a random new network will be generated
|
||||
as a starting point (i.e. provide an empty <code>stdin</code>).</p>
|
||||
<p>The first corpus will be assigned a target value of <code>1</code>.
|
||||
The last will be assigned a target value of <code>0</code>. Intervening
|
||||
directories (if any) will be assigned intermediate target values.</p>
|
||||
<p>The learning rate is hard-coded as <code>0.3</code>. No momentum
|
||||
factor is used.</p>
|
||||
<div class="sourceCode" id="cb15"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./dlowe</span> <span class="at">-</span><span class="op"><</span>n_iterations<span class="op">></span> corpus1/ <span class="pp">[</span><span class="ss">...</span><span class="pp">]</span> corpus0/ <span class="op"><</span> start.net <span class="op">></span> end.net</span></code></pre></div>
|
||||
<p><strong>NOTE</strong>: The directory args <strong>must end in a</strong> <code>/</code> for them to work.</p>
|
||||
<p>To train a network, one specifies a starting network (on <code>stdin</code>), two or more
|
||||
corpora (directories containing training data), and the number of training
|
||||
iterations to run. The program will write some progress data to <code>stderr</code> and,
|
||||
when it’s done, will serialize the updated network to <code>stdout</code>.</p>
|
||||
<p>If no input network is given, a random new network will be generated as a
|
||||
starting point (i.e. provide an empty <code>stdin</code>).</p>
|
||||
<p>The first corpus will be assigned a target value of <code>1</code>. The last will be
|
||||
assigned a target value of <code>0</code>. Intervening directories (if any) will be assigned
|
||||
intermediate target values.</p>
|
||||
<p>The learning rate is hard-coded as <code>0.3</code>. No momentum factor is used.</p>
|
||||
<h4 id="png-corpora">png corpora</h4>
|
||||
<p>The <a href="dlowe-aux-data/png-1">png-1</a> corpus was obtained by
|
||||
manually scraping the first results from an <a
|
||||
href="https://images.google.com"
|
||||
class="uri">https://images.google.com</a> search for “<a
|
||||
href="https://www.google.com/search?tbm=isch&sxsrf=APwXEddqIU34dxhpFdjEa8emNJKHOkYXIw:1683049158657&source=hp&biw=1727&bih=952&ei=xkpRZLapJtLKkPIP8bGKkAk&iflsig=AOEireoAAAAAZFFY1nbmEUHC74Cmg3Y5rEY1fV7ocASZ&ved=0ahUKEwi2pPXZltf-AhVSJUQIHfGYApIQ4dUDCAY&uact=5&oq=obfuscate+filetype:png&gs_lcp=CgNpbWcQA1AAWABg9QNoAHAAeACAATuIATuSAQExmAEAoAECoAEBqgELZ3dzLXdpei1pbWc&sclient=img&q=obfuscate&tbs=ift:png">obfuscate
|
||||
<p>The <a href="dlowe-aux-data/png-1">png-1</a> corpus was obtained by manually scraping the first results from an
|
||||
<a href="https://images.google.com" class="uri">https://images.google.com</a> search for “<a href="https://www.google.com/search?tbm=isch&sxsrf=APwXEddqIU34dxhpFdjEa8emNJKHOkYXIw:1683049158657&source=hp&biw=1727&bih=952&ei=xkpRZLapJtLKkPIP8bGKkAk&iflsig=AOEireoAAAAAZFFY1nbmEUHC74Cmg3Y5rEY1fV7ocASZ&ved=0ahUKEwi2pPXZltf-AhVSJUQIHfGYApIQ4dUDCAY&uact=5&oq=obfuscate+filetype:png&gs_lcp=CgNpbWcQA1AAWABg9QNoAHAAeACAATuIATuSAQExmAEAoAECoAEBqgELZ3dzLXdpei1pbWc&sclient=img&q=obfuscate&tbs=ift:png">obfuscate
|
||||
filetype:png</a>”.</p>
|
||||
<p>The <a href="dlowe-aux-data/png-0">png-0</a> corpus was obtained by
|
||||
manually scraping the first results from an <a
|
||||
href="https://images.google.com"
|
||||
class="uri">https://images.google.com</a> search for “<a
|
||||
href="https://www.google.com/search?tbm=isch&ved=2ahUKEwiowo7fltf-AhXSOUQIHbJBDp8Q2-cCegQIABAA&oq=obfuscate+filetype:gif&gs_lcp=CgNpbWcQAzoECCMQJzoHCAAQigUQQzoFCAAQgARQ6AxY6AxgpBJoAHAAeACAAUeIAcsBkgEBM5gBAKABAaoBC2d3cy13aXotaW1nwAEB&sclient=img&ei=0UpRZOiVINLzkPIPsoO5-Ak&bih=952&biw=1727&q=obfuscate&tbs=ift:gif">obfuscate
|
||||
<p>The <a href="dlowe-aux-data/png-0">png-0</a> corpus was obtained by manually scraping the first results from an
|
||||
<a href="https://images.google.com" class="uri">https://images.google.com</a> search for “<a href="https://www.google.com/search?tbm=isch&ved=2ahUKEwiowo7fltf-AhXSOUQIHbJBDp8Q2-cCegQIABAA&oq=obfuscate+filetype:gif&gs_lcp=CgNpbWcQAzoECCMQJzoHCAAQigUQQzoFCAAQgARQ6AxY6AxgpBJoAHAAeACAAUeIAcsBkgEBM5gBAKABAaoBC2d3cy13aXotaW1nwAEB&sclient=img&ei=0UpRZOiVINLzkPIPsoO5-Ak&bih=952&biw=1727&q=obfuscate&tbs=ift:gif">obfuscate
|
||||
filetype:gif</a>”.</p>
|
||||
<h5 id="results">Results:</h5>
|
||||
<ul>
|
||||
<li>Using these corpora as a training set;</li>
|
||||
<li>Using several hundred random <code>*.gif</code> and
|
||||
<code>*.png</code> files from my home computer as a test set;</li>
|
||||
<li>Using the included <a href="earlystop.pl">earlystop.pl</a> script,
|
||||
which stopped after 67000 iterations.</li>
|
||||
<li>Interpreting output of <code>> 0.5</code> as “probably a
|
||||
<code>.png</code>” and <code>< 0.5</code> as “probably a
|
||||
<code>.gif</code>”</li>
|
||||
<li>Using several hundred random <code>*.gif</code> and <code>*.png</code> files from my home computer as
|
||||
a test set;</li>
|
||||
<li>Using the included <a href="earlystop.pl">earlystop.pl</a> script, which stopped after 67000 iterations.</li>
|
||||
<li>Interpreting output of <code>> 0.5</code> as “probably a <code>.png</code>” and <code>< 0.5</code> as “probably
|
||||
a <code>.gif</code>”</li>
|
||||
</ul>
|
||||
<p>produced a network with about 87% accuracy</p>
|
||||
<h4 id="english-corpora">English corpora</h4>
|
||||
<p>The <a href="dlowe-aux-data/english-1">english-1</a> corpus was
|
||||
obtained by manually scraping the first results from a <a
|
||||
href="https://www.google.com/webhp?lr=lang_en"
|
||||
class="uri">https://www.google.com/webhp?lr=lang_en</a> search for “<a
|
||||
href="https://www.google.com/search?q=paris+filetype%3Atxt&lr=lang_en&tbs=lr%3Alang_1en&sxsrf=APwXEdeHXyUYdUxCYQQDHmJhbHzX9aARSA%3A1683049834430&source=hp&ei=ak1RZJHUGN_DkPIP26OtkA8&iflsig=AOEireoAAAAAZFFbejA0Xfqoq__FXx--Ok0S6GQjnGnA&ved=0ahUKEwiRsZOcmdf-AhXfIUQIHdtRC_IQ4dUDCAo&uact=5&oq=paris+filetype%3Atxt&gs_lcp=Cgdnd3Mtd2l6EANQAFgAYN4DaABwAHgAgAE-iAE-kgEBMZgBAKABAqABAQ&sclient=gws-wiz">paris
|
||||
<p>The <a href="dlowe-aux-data/english-1">english-1</a> corpus was obtained by manually scraping the first results from
|
||||
a <a href="https://www.google.com/webhp?lr=lang_en" class="uri">https://www.google.com/webhp?lr=lang_en</a> search for “<a href="https://www.google.com/search?q=paris+filetype%3Atxt&lr=lang_en&tbs=lr%3Alang_1en&sxsrf=APwXEdeHXyUYdUxCYQQDHmJhbHzX9aARSA%3A1683049834430&source=hp&ei=ak1RZJHUGN_DkPIP26OtkA8&iflsig=AOEireoAAAAAZFFbejA0Xfqoq__FXx--Ok0S6GQjnGnA&ved=0ahUKEwiRsZOcmdf-AhXfIUQIHdtRC_IQ4dUDCAo&uact=5&oq=paris+filetype%3Atxt&gs_lcp=Cgdnd3Mtd2l6EANQAFgAYN4DaABwAHgAgAE-iAE-kgEBMZgBAKABAqABAQ&sclient=gws-wiz">paris
|
||||
filetype:txt</a>”.</p>
|
||||
<p>The <a href="dlowe-aux-data/english-0">english-0</a> corpus was
|
||||
obtained by manually scraping the first results from a <a
|
||||
href="https://www.google.com/webhp?lr=lang_fr"
|
||||
class="uri">https://www.google.com/webhp?lr=lang_fr</a> search for “<a
|
||||
href="https://www.google.com/search?q=paris+filetype%3Atxt&lr=lang_fr&tbs=lr%3Alang_1fr&sxsrf=APwXEddcsQ-gMhrqSUJo6omWFUl7jQMASg%3A1683049870736&source=hp&ei=jk1RZLevK_fKkPIPjbWN-AU&iflsig=AOEireoAAAAAZFFbnvExHGkcavB5H8F0xsLAWN2KfYFK&ved=0ahUKEwi3rrutmdf-AhV3JUQIHY1aA18Q4dUDCAo&uact=5&oq=paris+filetype%3Atxt&gs_lcp=Cgdnd3Mtd2l6EANQAFgAYLMDaABwAHgAgAE-iAE-kgEBMZgBAKABAqABAQ&sclient=gws-wiz">paris
|
||||
<p>The <a href="dlowe-aux-data/english-0">english-0</a> corpus was obtained by manually scraping the first results from
|
||||
a <a href="https://www.google.com/webhp?lr=lang_fr" class="uri">https://www.google.com/webhp?lr=lang_fr</a> search for “<a href="https://www.google.com/search?q=paris+filetype%3Atxt&lr=lang_fr&tbs=lr%3Alang_1fr&sxsrf=APwXEddcsQ-gMhrqSUJo6omWFUl7jQMASg%3A1683049870736&source=hp&ei=jk1RZLevK_fKkPIPjbWN-AU&iflsig=AOEireoAAAAAZFFbnvExHGkcavB5H8F0xsLAWN2KfYFK&ved=0ahUKEwi3rrutmdf-AhV3JUQIHY1aA18Q4dUDCAo&uact=5&oq=paris+filetype%3Atxt&gs_lcp=Cgdnd3Mtd2l6EANQAFgAYLMDaABwAHgAgAE-iAE-kgEBMZgBAKABAqABAQ&sclient=gws-wiz">paris
|
||||
filetype:txt</a>”.</p>
|
||||
<h5 id="results-1">Results:</h5>
|
||||
<ul>
|
||||
<li>Using these corpora as a training set;</li>
|
||||
<li>Using several dozen additional text files (obtained by the same
|
||||
methods) as a test set;</li>
|
||||
<li>Using the included <a href="earlystop.pl">earlystop.pl</a> script,
|
||||
which stopped after 10000 iterations;</li>
|
||||
<li>Interpreting output of <code>> 0.5</code> as “probably English”
|
||||
and <code>< 0.5</code> as “probably French”</li>
|
||||
<li>Using several dozen additional text files (obtained by the same methods) as a
|
||||
test set;</li>
|
||||
<li>Using the included <a href="earlystop.pl">earlystop.pl</a> script, which stopped after
|
||||
10000 iterations;</li>
|
||||
<li>Interpreting output of <code>> 0.5</code> as “probably English” and <code>< 0.5</code> as “probably
|
||||
French”</li>
|
||||
</ul>
|
||||
<p>produced a network with 100% accuracy.</p>
|
||||
<h3 id="xor-corpora">xor corpora</h3>
|
||||
<p>The <a href="dlowe-aux-data/xor-1">xor-1</a> corpus consists of two
|
||||
files containing <code>01</code> and <code>10</code> respectively.</p>
|
||||
<p>The <a href="dlowe-aux-data/xor-0">xor-0</a> corpus consists of two
|
||||
files containing <code>00</code> and <code>11</code> respectively.</p>
|
||||
<p>The <a href="dlowe-aux-data/xor-1">xor-1</a> corpus consists of two files containing <code>01</code>
|
||||
and <code>10</code> respectively.</p>
|
||||
<p>The <a href="dlowe-aux-data/xor-0">xor-0</a> corpus consists of two files containing <code>00</code>
|
||||
and <code>11</code> respectively.</p>
|
||||
<h5 id="results-2">Results:</h5>
|
||||
<p>Using these corpora as a training set takes about 8000 iterations to
|
||||
learn xor to within a tolerance of <code><0.01</code>.</p>
|
||||
<p>Using these corpora as a training set takes about 8000 iterations to learn xor
|
||||
to within a tolerance of <code><0.01</code>.</p>
|
||||
<h3 id="limitations">Limitations</h3>
|
||||
<p>The program can’t tell you anything meaningful about files with less
|
||||
than two bytes in them (I’m looking at you, <a
|
||||
href="../../1994/smr/smr.c">smr.c</a>!)</p>
|
||||
<p>You must include the trailing directory separator on training
|
||||
directories (this allows the program to be portable without wasting
|
||||
precious bytes on figuring out how to concatenate directory and file
|
||||
names…).</p>
|
||||
<p>Serialized network files are only portable between systems with the
|
||||
same <a
|
||||
href="https://en.wikipedia.org/wiki/Floating-point_arithmetic">floating-point</a>
|
||||
representation and <a
|
||||
href="https://en.wikipedia.org/wiki/Endianness">endianness</a>.</p>
|
||||
<p>Making sure not to <a
|
||||
href="https://en.wikipedia.org/wiki/Overfitting#Machine_learning">overfit</a>
|
||||
the network to the training data is a bit of a black art. I have
|
||||
enclosed <a href="earlystop.pl">earlystop.pl</a>, a wrapper script that
|
||||
implements a simple ‘early stopping’ algorithm; other techniques are
|
||||
possible.</p>
|
||||
<p>Bad input (e.g. nonexistent files, non-numeric number of iterations,
|
||||
etc.) tends to result in empty output.</p>
|
||||
<p>Given exactly one corpus, the program will crash or produce
|
||||
garbage.</p>
|
||||
<p>The program can’t tell you anything meaningful about files with less than two
|
||||
bytes in them (I’m looking at you, <a href="../../1994/smr/smr.c">smr.c</a>!)</p>
|
||||
<p>You must include the trailing directory separator on training directories
|
||||
(this allows the program to be portable without wasting precious bytes on
|
||||
figuring out how to concatenate directory and file names…).</p>
|
||||
<p>Serialized network files are only portable between systems with the same
|
||||
<a href="https://en.wikipedia.org/wiki/Floating-point_arithmetic">floating-point</a>
|
||||
representation and <a href="https://en.wikipedia.org/wiki/Endianness">endianness</a>.</p>
|
||||
<p>Making sure not to
|
||||
<a href="https://en.wikipedia.org/wiki/Overfitting#Machine_learning">overfit</a> the network to the training data is a bit of a
|
||||
black art. I have enclosed <a href="earlystop.pl">earlystop.pl</a>, a wrapper script that implements
|
||||
a simple ‘early stopping’ algorithm; other techniques are possible.</p>
|
||||
<p>Bad input (e.g. nonexistent files, non-numeric number of iterations, etc.)
|
||||
tends to result in empty output.</p>
|
||||
<p>Given exactly one corpus, the program will crash or produce garbage.</p>
|
||||
<p>Leaks memory and file descriptors while processing files.</p>
|
||||
<p>Will crash and die horribly if it runs out of memory.</p>
|
||||
<p>The Microsoft C compiler doesn’t provide a <code>dirent</code> API,
|
||||
so to get this working on a Windows system you’ll need cygwin+gcc
|
||||
(tested) or a <code>dirent</code> compatibility library (untested, but
|
||||
they do exist).</p>
|
||||
<p>Backpropagation doesn’t always converge: if you play with this long
|
||||
enough, you’ll eventually have a training session that completely fails
|
||||
to converge.</p>
|
||||
<p>The Microsoft C compiler doesn’t provide a <code>dirent</code> API, so to get this working
|
||||
on a Windows system you’ll need cygwin+gcc (tested) or a <code>dirent</code> compatibility
|
||||
library (untested, but they do exist).</p>
|
||||
<p>Backpropagation doesn’t always converge: if you play with this long enough,
|
||||
you’ll eventually have a training session that completely fails to converge.</p>
|
||||
<h3 id="obfuscation">Obfuscation</h3>
|
||||
<ul>
|
||||
<li><a href="https://en.wikipedia.org/wiki/Zombie">Zombies</a>! (Since
|
||||
neural networks are modeled after <a
|
||||
href="https://en.wikipedia.org/wiki/Brain">BRAINS</a>, ya know? And
|
||||
corpus sounds a lot like corpse. And I have 4- and 7-year-old kids ;)
|
||||
)</li>
|
||||
<li>Neural networks are interesting, and while the math isn’t terribly
|
||||
difficult, their behavior is difficult to fully understand.</li>
|
||||
<li>Had some extra space in one of the major data structures, and it
|
||||
seemed a shame to waste it.</li>
|
||||
<li>Similarly, I think three file pointers ought to be enough for
|
||||
anyone.</li>
|
||||
<li><a href="https://en.wikipedia.org/wiki/Zombie">Zombies</a>! (Since neural networks are
|
||||
modeled after <a href="https://en.wikipedia.org/wiki/Brain">BRAINS</a>, ya know? And
|
||||
corpus sounds a lot like corpse. And I have 4- and 7-year-old kids ;) )</li>
|
||||
<li>Neural networks are interesting, and while the math isn’t terribly difficult,
|
||||
their behavior is difficult to fully understand.</li>
|
||||
<li>Had some extra space in one of the major data structures, and it seemed a
|
||||
shame to waste it.</li>
|
||||
<li>Similarly, I think three file pointers ought to be enough for anyone.</li>
|
||||
<li>Lots of magic numbers expressed in various ways.</li>
|
||||
<li>Random abuse of random C trivia.</li>
|
||||
<li>Some textual changes were made to maximize the classification of
|
||||
this program by a network trained to recognize <a
|
||||
href="../../authors.html">IOCCC entries</a> ;)</li>
|
||||
<li>Some textual changes were made to maximize the classification of this program
|
||||
by a network trained to recognize <a href="../../authors.html">IOCCC entries</a> ;)</li>
|
||||
</ul>
|
||||
<p>… but mostly zombies!</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>
|
||||
<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-2011dlowe"><a name="inventory"></a>Inventory for
|
||||
2011/dlowe</h1>
|
||||
<h1 id="inventory-for-2011dlowe"><a name="inventory"></a>Inventory for 2011/dlowe</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/2011/dlowe/dlowe.c">dlowe.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe.orig.c">dlowe.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/earlystop.pl">earlystop.pl</a>
|
||||
- wrapper script to stop training early</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/5756029-DMZ-overview-B.gif">dlowe-aux-data/png-0/5756029-DMZ-overview-B.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/M2.gif">dlowe-aux-data/png-0/M2.gif</a> -
|
||||
Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/Obfuscate.gif">dlowe-aux-data/png-0/Obfuscate.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/figure_49.gif">dlowe-aux-data/png-0/figure_49.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/klockhuset.gif">dlowe-aux-data/png-0/klockhuset.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/obfuscate_1.gif">dlowe-aux-data/png-0/obfuscate_1.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/podcastimage_150215.gif">dlowe-aux-data/png-0/podcastimage_150215.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/prjman1.gif">dlowe-aux-data/png-0/prjman1.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/proguard_obfuscate.gif">dlowe-aux-data/png-0/proguard_obfuscate.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/scripts_encryptor__screnc_-31918.gif">dlowe-aux-data/png-0/scripts_encryptor_<em>screnc</em>-31918.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-0/visual_panel.gif">dlowe-aux-data/png-0/visual_panel.gif</a>
|
||||
- Non-png gif images</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/040604.txt">dlowe-aux-data/english-0/040604.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/2001-2002.txt">dlowe-aux-data/english-0/2001-2002.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/CFP_TSI_Graphes_appel.txt">dlowe-aux-data/english-0/CFP_TSI_Graphes_appel.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/CIR_APE_08_doc%5B1%5D.txt">dlowe-aux-data/english-0/CIR_APE_08_doc%5B1%5D.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/admin_fr.txt">dlowe-aux-data/english-0/admin_fr.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/agenda.txt">dlowe-aux-data/english-0/agenda.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/paris.txt">dlowe-aux-data/english-0/paris.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/paris2.txt">dlowe-aux-data/english-0/paris2.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/structures3D-Paris.txt">dlowe-aux-data/english-0/structures3D-Paris.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/02-chronology.txt">dlowe-aux-data/english-1/02-chronology.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/36C215.txt">dlowe-aux-data/english-1/36C215.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/Wireless_Days_2011_CFP.txt">dlowe-aux-data/english-1/Wireless_Days_2011_CFP.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/cpb.txt">dlowe-aux-data/english-1/cpb.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/get-there.txt">dlowe-aux-data/english-1/get-there.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/pa_fv010.txt">dlowe-aux-data/english-1/pa_fv010.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/the_poor_people_of_paris.txt">dlowe-aux-data/english-1/the_poor_people_of_paris.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/utmost.txt">dlowe-aux-data/english-1/utmost.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/walljpar.txt">dlowe-aux-data/english-1/walljpar.txt</a>
|
||||
- training text for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/xor-0/00">dlowe-aux-data/xor-0/00</a> -
|
||||
training digits for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/xor-0/11">dlowe-aux-data/xor-0/11</a> -
|
||||
training digits for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/xor-1/01">dlowe-aux-data/xor-1/01</a> -
|
||||
training digits for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/xor-1/10">dlowe-aux-data/xor-1/10</a> -
|
||||
training digits for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/JavaScript-obfuscation-code.png">dlowe-aux-data/png-1/JavaScript-obfuscation-code.png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/control_flow_obfuscation_before.png">dlowe-aux-data/png-1/control_flow_obfuscation_before.png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/deceive-inveigle-obfuscate-t-shirts.png">dlowe-aux-data/png-1/deceive-inveigle-obfuscate-t-shirts.png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/help_obfuscation1.png">dlowe-aux-data/png-1/help_obfuscation1.png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/image_thumb%5B40%5D.png">dlowe-aux-data/png-1/image_thumb[40].png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/jquery_after_deobfuscation.png">dlowe-aux-data/png-1/jquery_after_deobfuscation.png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/obfuscate4e.png">dlowe-aux-data/png-1/obfuscate4e.png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/obfuscation-decoder.png">dlowe-aux-data/png-1/obfuscation-decoder.png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-1/obfuscation_methods.png">dlowe-aux-data/png-1/obfuscation_methods.png</a>
|
||||
- training image for neural networks</li>
|
||||
<li><a href="2011_dlowe.tar.bz2">2011_dlowe.tar.bz2</a> - download entry
|
||||
source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe.c">dlowe.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe.orig.c">dlowe.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/earlystop.pl">earlystop.pl</a> - wrapper script to stop training early</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="dlowe-aux-data/png-0/5756029-DMZ-overview-B.gif">dlowe-aux-data/png-0/5756029-DMZ-overview-B.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/M2.gif">dlowe-aux-data/png-0/M2.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/Obfuscate.gif">dlowe-aux-data/png-0/Obfuscate.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/figure_49.gif">dlowe-aux-data/png-0/figure_49.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/klockhuset.gif">dlowe-aux-data/png-0/klockhuset.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/obfuscate_1.gif">dlowe-aux-data/png-0/obfuscate_1.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/podcastimage_150215.gif">dlowe-aux-data/png-0/podcastimage_150215.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/prjman1.gif">dlowe-aux-data/png-0/prjman1.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/proguard_obfuscate.gif">dlowe-aux-data/png-0/proguard_obfuscate.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/scripts_encryptor__screnc_-31918.gif">dlowe-aux-data/png-0/scripts_encryptor_<em>screnc</em>-31918.gif</a> - Non-png gif images</li>
|
||||
<li><a href="dlowe-aux-data/png-0/visual_panel.gif">dlowe-aux-data/png-0/visual_panel.gif</a> - Non-png gif images</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/040604.txt">dlowe-aux-data/english-0/040604.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/2001-2002.txt">dlowe-aux-data/english-0/2001-2002.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/CFP_TSI_Graphes_appel.txt">dlowe-aux-data/english-0/CFP_TSI_Graphes_appel.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/CIR_APE_08_doc%5B1%5D.txt">dlowe-aux-data/english-0/CIR_APE_08_doc%5B1%5D.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/admin_fr.txt">dlowe-aux-data/english-0/admin_fr.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/agenda.txt">dlowe-aux-data/english-0/agenda.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/paris.txt">dlowe-aux-data/english-0/paris.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/paris2.txt">dlowe-aux-data/english-0/paris2.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-0/structures3D-Paris.txt">dlowe-aux-data/english-0/structures3D-Paris.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/02-chronology.txt">dlowe-aux-data/english-1/02-chronology.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/36C215.txt">dlowe-aux-data/english-1/36C215.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/Wireless_Days_2011_CFP.txt">dlowe-aux-data/english-1/Wireless_Days_2011_CFP.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/cpb.txt">dlowe-aux-data/english-1/cpb.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/get-there.txt">dlowe-aux-data/english-1/get-there.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/pa_fv010.txt">dlowe-aux-data/english-1/pa_fv010.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/the_poor_people_of_paris.txt">dlowe-aux-data/english-1/the_poor_people_of_paris.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/utmost.txt">dlowe-aux-data/english-1/utmost.txt</a> - training text for neural networks</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/dlowe-aux-data/english-1/walljpar.txt">dlowe-aux-data/english-1/walljpar.txt</a> - training text for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/xor-0/00">dlowe-aux-data/xor-0/00</a> - training digits for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/xor-0/11">dlowe-aux-data/xor-0/11</a> - training digits for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/xor-1/01">dlowe-aux-data/xor-1/01</a> - training digits for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/xor-1/10">dlowe-aux-data/xor-1/10</a> - training digits for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/JavaScript-obfuscation-code.png">dlowe-aux-data/png-1/JavaScript-obfuscation-code.png</a> - training image for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/control_flow_obfuscation_before.png">dlowe-aux-data/png-1/control_flow_obfuscation_before.png</a> - training image for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/deceive-inveigle-obfuscate-t-shirts.png">dlowe-aux-data/png-1/deceive-inveigle-obfuscate-t-shirts.png</a> - training image for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/help_obfuscation1.png">dlowe-aux-data/png-1/help_obfuscation1.png</a> - training image for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/image_thumb%5B40%5D.png">dlowe-aux-data/png-1/image_thumb[40].png</a> - training image for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/jquery_after_deobfuscation.png">dlowe-aux-data/png-1/jquery_after_deobfuscation.png</a> - training image for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/obfuscate4e.png">dlowe-aux-data/png-1/obfuscate4e.png</a> - training image for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/obfuscation-decoder.png">dlowe-aux-data/png-1/obfuscation-decoder.png</a> - training image for neural networks</li>
|
||||
<li><a href="dlowe-aux-data/png-1/obfuscation_methods.png">dlowe-aux-data/png-1/obfuscation_methods.png</a> - training image for neural networks</li>
|
||||
<li><a href="2011_dlowe.tar.bz2">2011_dlowe.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/2011/dlowe/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/.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/2011/dlowe/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/.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/2011/dlowe/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="dlowe-aux-data.tar.bz2">dlowe-aux-data.tar.bz2</a> - IOCCC
|
||||
win lose trained network</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/english-trained.net">dlowe-aux-data/english-trained.net</a>
|
||||
- trained neural network for English text</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/ioccc-winlose-trained.net">dlowe-aux-data/ioccc-winlose-trained.net</a>
|
||||
- trained neural network for C code from 20Th IOCCC</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/png-trained.net">dlowe-aux-data/png-trained.net</a>
|
||||
- trained neural network for png-0 and png-1 images</li>
|
||||
<li><a
|
||||
href="dlowe-aux-data/xor-trained.net">dlowe-aux-data/xor-trained.net</a>
|
||||
- trained neural network for xor-0 and xor-1 data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/dlowe/README.md">README.md</a> - markdown source for index.html</li>
|
||||
<li><a href="dlowe-aux-data.tar.bz2">dlowe-aux-data.tar.bz2</a> - IOCCC win lose trained network</li>
|
||||
<li><a href="dlowe-aux-data/english-trained.net">dlowe-aux-data/english-trained.net</a> - trained neural network for English text</li>
|
||||
<li><a href="dlowe-aux-data/ioccc-winlose-trained.net">dlowe-aux-data/ioccc-winlose-trained.net</a> - trained neural network for C code from 20Th IOCCC</li>
|
||||
<li><a href="dlowe-aux-data/png-trained.net">dlowe-aux-data/png-trained.net</a> - trained neural network for png-0 and png-1 images</li>
|
||||
<li><a href="dlowe-aux-data/xor-trained.net">dlowe-aux-data/xor-trained.net</a> - trained neural network for xor-0 and xor-1 data</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+56
-89
@@ -129,9 +129,9 @@
|
||||
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Peter_Eastman">Peter
|
||||
Eastman</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#Peter_Eastman">Peter Eastman</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 -->
|
||||
@@ -143,120 +143,87 @@ Eastman</a><br> Location: <a href="../../location.html#US">US</a> -
|
||||
<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></span></code></pre></div>
|
||||
<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">./eastman</span></span></code></pre></div>
|
||||
<p>NOTE: to restore your cursor in your shell, try
|
||||
<code>reset</code>.</p>
|
||||
<p>NOTE: to restore your cursor in your shell, try <code>reset</code>.</p>
|
||||
<h2 id="try">Try:</h2>
|
||||
<p>Run the program. Quit it (ctrl-c/intr). Resize your terminal window.
|
||||
Run it again. Try doing this a number of times with different sizes each
|
||||
time.</p>
|
||||
<p>Run the program. Quit it (ctrl-c/intr). Resize your terminal window. Run it
|
||||
again. Try doing this a number of times with different sizes each time.</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">./eastman</span></span></code></pre></div>
|
||||
<p>NOTE: to restore your cursor in your shell, try
|
||||
<code>reset</code>.</p>
|
||||
<p>NOTE: to restore your cursor in your shell, try <code>reset</code>.</p>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This round program will generate a classic spherical result!</p>
|
||||
<p>You will need a terminal capable of displaying coloured ANSI
|
||||
characters (for example an xterm or a Terminal.app window in macOS).</p>
|
||||
<p>You might also want to turn off any scrollback history. The program
|
||||
will size itself to the initial geometry of your terminal.</p>
|
||||
<p>If you are ambitious, make the font really small and the window
|
||||
really large for hi-res graphics!</p>
|
||||
<p>You might also want to turn off any scrollback history. The program will
|
||||
size itself to the initial geometry of your terminal.</p>
|
||||
<p>If you are ambitious, make the font really small and the window really
|
||||
large for hi-res graphics!</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p>This program uses ANSI graphics to recreate the classic Boing Ball
|
||||
demo from the Commodore Amiga. See <a
|
||||
href="https://www.youtube.com/watch?v=-ga41edXw3A"
|
||||
class="uri">https://www.youtube.com/watch?v=-ga41edXw3A</a> if you
|
||||
aren’t familiar with it. Back in its day, this demo inspired lust and
|
||||
awe in geeks around the world.</p>
|
||||
<p>This program uses ANSI graphics to recreate the classic Boing Ball demo from
|
||||
the Commodore Amiga. See <a href="https://www.youtube.com/watch?v=-ga41edXw3A" class="uri">https://www.youtube.com/watch?v=-ga41edXw3A</a> if you
|
||||
aren’t familiar with it. Back in its day, this demo inspired lust and awe in
|
||||
geeks around the world.</p>
|
||||
<p>The graphics are
|
||||
[raytraced](https://en.wikipedia.org/wiki/Ray_tracing_(graphics), with
|
||||
procedural textures on the ball and the back wall. I did cheat a little
|
||||
to simplify the calculations: it uses a parallel projection, but
|
||||
textures the back wall to look as if there were a floor being viewed in
|
||||
perspective. The shadow is also just part of the texture, not an actual
|
||||
raytraced shadow.</p>
|
||||
<p>This program automatically adapts to the size of the terminal it is
|
||||
running in, so try enlarging the window to get higher resolution. Don’t
|
||||
resize while the program is running, though. It only checks the size
|
||||
once, when it starts up.</p>
|
||||
procedural textures on the ball and the back wall. I did cheat a little to
|
||||
simplify the calculations: it uses a parallel projection, but textures the back
|
||||
wall to look as if there were a floor being viewed in perspective. The shadow
|
||||
is also just part of the texture, not an actual raytraced shadow.</p>
|
||||
<p>This program automatically adapts to the size of the terminal it is running in,
|
||||
so try enlarging the window to get higher resolution. Don’t resize while the
|
||||
program is running, though. It only checks the size once, when it starts up.</p>
|
||||
<p>To compile:</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">cc</span> <span class="at">-lm</span> eastman.c</span></code></pre></div>
|
||||
<h3 id="portability">Portability</h3>
|
||||
<p>It should be completely portable. I’ve tested with gcc on Mac OS X
|
||||
10.7 (Lion) and Fedora 10. I would expect it to work in any Unix-like
|
||||
environment.</p>
|
||||
<p>It should be completely portable. I’ve tested with gcc on Mac OS X 10.7 (Lion)
|
||||
and Fedora 10. I would expect it to work in any Unix-like environment.</p>
|
||||
<h3 id="obfuscation">Obfuscation</h3>
|
||||
<p>I have merged expressions wherever possible, making extensive use of
|
||||
ternary operators, commas, return values of assignment operators, etc.
|
||||
The entire raytracing computation, include ray intersection tests and
|
||||
procedural texture evaluations, is a single expression involving 41
|
||||
operators.</p>
|
||||
<p>Variables are named alphabetically in the order they are
|
||||
declared.</p>
|
||||
<p>The third argument to <code>ioctl(2)</code> should really be a
|
||||
<code>struct winsize</code>, and I should then look up the
|
||||
<code>ws_row</code> and <code>ws_col</code> fields, but that makes it
|
||||
way too obvious what I’m doing there. Since a
|
||||
<code>struct winsize</code> just contains four
|
||||
<code>unsigned short</code>s, I replaced it with an array. And since all
|
||||
the values will be much less than <code>32767</code>, I further
|
||||
simplified the type to just <code>short[]</code>.</p>
|
||||
<p>A wonderful thing about ANSI graphics is that it produces nearly
|
||||
unintelligible code. Consider the <code>printf(3)</code> spec to print a
|
||||
single space in a desired color: <code>"\x1B[%dm</code>. I could have
|
||||
done something to further obfuscate it, but it’s already
|
||||
indistinguishable from line noise, so why bother?</p>
|
||||
<p>There are lots of other minor obfuscations to make the code less
|
||||
obvious. For example, I could have written the outer loop as
|
||||
<code>while(1)</code>, but why write a 1 when I can calculate it from
|
||||
the return value of <code>usleep(3)</code> instead? And I could have
|
||||
written <code>usleep(80000)</code>, but <code>usleep(79383)</code> just
|
||||
looks so much better. And so on.</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>
|
||||
<p>I have merged expressions wherever possible, making extensive use of ternary
|
||||
operators, commas, return values of assignment operators, etc. The entire
|
||||
raytracing computation, include ray intersection tests and procedural texture
|
||||
evaluations, is a single expression involving 41 operators.</p>
|
||||
<p>Variables are named alphabetically in the order they are declared.</p>
|
||||
<p>The third argument to <code>ioctl(2)</code> should really be a <code>struct winsize</code>, and I
|
||||
should then look up the <code>ws_row</code> and <code>ws_col</code> fields, but that makes it way too
|
||||
obvious what I’m doing there. Since a <code>struct winsize</code> just contains four
|
||||
<code>unsigned short</code>s, I replaced it with an array. And since all the values will
|
||||
be much less than <code>32767</code>, I further simplified the type to just <code>short[]</code>.</p>
|
||||
<p>A wonderful thing about ANSI graphics is that it produces nearly unintelligible
|
||||
code. Consider the <code>printf(3)</code> spec to print a single space in a desired color:
|
||||
<code>"\x1B[%dm</code>. I could have done something to further obfuscate it, but it’s
|
||||
already indistinguishable from line noise, so why bother?</p>
|
||||
<p>There are lots of other minor obfuscations to make the code less obvious. For
|
||||
example, I could have written the outer loop as <code>while(1)</code>, but why write a 1
|
||||
when I can calculate it from the return value of <code>usleep(3)</code> instead? And I
|
||||
could have written <code>usleep(80000)</code>, but <code>usleep(79383)</code> just looks so much
|
||||
better. And so on.</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-2011eastman"><a name="inventory"></a>Inventory for
|
||||
2011/eastman</h1>
|
||||
<h1 id="inventory-for-2011eastman"><a name="inventory"></a>Inventory for 2011/eastman</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/2011/eastman/eastman.c">eastman.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/eastman/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/eastman/eastman.orig.c">eastman.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a href="boing-ball.mp4">boing-ball.mp4</a> - original Amiga
|
||||
bouncing ball demo</li>
|
||||
<li><a href="2011_eastman.tar.bz2">2011_eastman.tar.bz2</a> - download
|
||||
entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/eastman/eastman.c">eastman.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/eastman/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/eastman/eastman.orig.c">eastman.orig.c</a> - original source</li>
|
||||
<li><a href="boing-ball.mp4">boing-ball.mp4</a> - original Amiga bouncing ball demo</li>
|
||||
<li><a href="2011_eastman.tar.bz2">2011_eastman.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/2011/eastman/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/eastman/.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/2011/eastman/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/eastman/.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/2011/eastman/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/eastman/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+152
-208
@@ -129,9 +129,9 @@
|
||||
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Kimmo_Fredriksson">Kimmo
|
||||
Fredriksson</a><br> Location: <a href="../../location.html#FI">FI</a> -
|
||||
<em>Republic of Finland </em> (<em>Finland</em>) <br><br></li>
|
||||
<li>Name: <a href="../../authors.html#Kimmo_Fredriksson">Kimmo Fredriksson</a><br>
|
||||
Location: <a href="../../location.html#FI">FI</a> - <em>Republic of Finland </em> (<em>Finland</em>)
|
||||
<br><br></li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
|
||||
@@ -144,91 +144,80 @@ Fredriksson</a><br> Location: <a href="../../location.html#FI">FI</a> -
|
||||
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
|
||||
<p>The current status of this entry is:</p>
|
||||
<pre><code>STATUS: INABIAF - please **DO NOT** fix</code></pre>
|
||||
<p>For more detailed information see <a
|
||||
href="../../bugs.html#2011_fredriksson">2011 fredriksson bugs</a>.</p>
|
||||
<p>For more detailed information see <a href="../../bugs.html#2011_fredriksson">2011 fredriksson bugs</a>.</p>
|
||||
<h2 id="to-use">To use:</h2>
|
||||
<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">./fredriksson</span> <span class="pp">[-</span><span class="ss">icvtnk#</span><span class="pp">]</span> regexp <span class="op"><</span> file</span></code></pre></div>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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="ex">./try.sh</span></span></code></pre></div>
|
||||
<p>NOTE: you need to be allowed to change your stack size or else the
|
||||
last command in the script would likely cause the program to dump core,
|
||||
which is why the script checks the exit code of <code>ulimit</code>
|
||||
first.</p>
|
||||
<p>NOTE: you need to be allowed to change your stack size or else the last command
|
||||
in the script would likely cause the program to dump core, which is why the
|
||||
script checks the exit code of <code>ulimit</code> first.</p>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>The author of this entry was making sure that it does not win the
|
||||
“Best Short Program” award. On the outside, the program behaves as an
|
||||
approximate <code>grep</code>. On the inside, it is a <a
|
||||
href="https://en.wikipedia.org/wiki/Burrows-Wheeler_transform">Burrows-Wheeler
|
||||
transform</a> decompressor that produces the source code of the actual
|
||||
obfuscated approximate <code>grep</code> program and calls it. As an
|
||||
exercise, try writing the compressor.</p>
|
||||
<p>The author of this entry was making sure that it does not win the “Best Short
|
||||
Program” award. On the outside, the program behaves as an approximate <code>grep</code>.
|
||||
On the inside, it is a <a href="https://en.wikipedia.org/wiki/Burrows-Wheeler_transform">Burrows-Wheeler
|
||||
transform</a> decompressor
|
||||
that produces the source code of the actual obfuscated approximate <code>grep</code>
|
||||
program and calls it. As an exercise, try writing the compressor.</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<h3 id="approximate-grep">Approximate grep</h3>
|
||||
<p>Implements a variant of <code>grep</code>.</p>
|
||||
<h3 id="usage">Usage</h3>
|
||||
<p>To search regexp from file, do:</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">./fredriksson</span> <span class="pp">[-</span><span class="ss">icvtnk#</span><span class="pp">]</span> regexp <span class="op"><</span> file</span></code></pre></div>
|
||||
<p>Pipes might not work, see the section Limitations. The options
|
||||
<code>-i</code>, <code>-c</code>, <code>-v</code> and <code>-n</code>
|
||||
are the classic ones:</p>
|
||||
<p>Pipes might not work, see the section Limitations.
|
||||
The options <code>-i</code>, <code>-c</code>, <code>-v</code> and <code>-n</code> are the classic ones:</p>
|
||||
<ul>
|
||||
<li><p><code>-i</code> Ignore case.</p></li>
|
||||
<li><p><code>-c</code> Count only, prints the number of matches, but not
|
||||
the matching lines.</p></li>
|
||||
<li><p><code>-c</code> Count only, prints the number of matches, but not the matching lines.</p></li>
|
||||
<li><p><code>-v</code> Invert match.</p></li>
|
||||
<li><p><code>-n</code> Prefixes each printed line by its line number
|
||||
(only if <code>-c</code> was not given).</p></li>
|
||||
<li><p><code>-n</code> Prefixes each printed line by its line number (only if
|
||||
<code>-c</code> was not given).</p></li>
|
||||
</ul>
|
||||
<p>This version of <code>grep</code> recognizes two more options, not
|
||||
present in normal <code>grep</code> implementations:</p>
|
||||
<p>This version of <code>grep</code> recognizes two more options, not present in normal
|
||||
<code>grep</code> implementations:</p>
|
||||
<ul>
|
||||
<li><p><code>-kN</code> Permit <code>N</code> insertions, deletions or
|
||||
mismatches of characters in the matches (aka <a
|
||||
href="https://en.wikipedia.org/wiki/Edit_distance">edit-distance</a>).
|
||||
E.g. “<code>obfuscated</code>” matches “<code>obfuscation</code>” with
|
||||
one deletion and two mismatches. Likewise, “<code>obfuscate</code>” and
|
||||
“<code>oversimplify</code>” match with 7 <a
|
||||
href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit
|
||||
operations</a>. The default is <code>-k0</code> (i.e. exact
|
||||
match).</p></li>
|
||||
<li><p><code>-t</code> Add local transpositions to the set of allowed <a
|
||||
href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit-operations</a>.
|
||||
That is, “<code>ab</code>” matches “<code>ba</code>” with one
|
||||
transposition (swap), and “<code>obfuscated</code>” matches
|
||||
“<code>bofsuact</code>” with three swaps and two insertions, i.e. use
|
||||
<code>-tk5</code> to find this.</p></li>
|
||||
<li><p><code>-kN</code> Permit <code>N</code> insertions, deletions or mismatches of characters in the
|
||||
matches (aka
|
||||
<a href="https://en.wikipedia.org/wiki/Edit_distance">edit-distance</a>). E.g.
|
||||
“<code>obfuscated</code>” matches “<code>obfuscation</code>”
|
||||
with one deletion and two mismatches. Likewise, “<code>obfuscate</code>” and
|
||||
“<code>oversimplify</code>” match with 7 <a href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit
|
||||
operations</a>.
|
||||
The default is <code>-k0</code> (i.e. exact match).</p></li>
|
||||
<li><p><code>-t</code> Add local transpositions to the set of allowed
|
||||
<a href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit-operations</a>.
|
||||
That is, “<code>ab</code>” matches “<code>ba</code>” with one transposition (swap), and
|
||||
“<code>obfuscated</code>” matches “<code>bofsuact</code>” with three swaps and two insertions,
|
||||
i.e. use <code>-tk5</code> to find this.</p></li>
|
||||
</ul>
|
||||
<p>Of course, one could construct a standard <a
|
||||
href="https://www.regular-expressions.info">regexp</a> that matches the
|
||||
same patterns, but the problem is that such a regexp grows exponentially
|
||||
in size when the number of allowed <a
|
||||
href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit
|
||||
operations</a> is increased.</p>
|
||||
<p>Of course, one could construct a standard
|
||||
<a href="https://www.regular-expressions.info">regexp</a> that matches the same
|
||||
patterns, but the problem is that such a regexp grows exponentially in
|
||||
size when the number of allowed <a href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit
|
||||
operations</a>
|
||||
is increased.</p>
|
||||
<p>This version does not recognize all regular expressions, but the
|
||||
following are allowed:</p>
|
||||
<ul>
|
||||
<li><p>Wildcard: <code>.</code> (dot) matches any character.</p></li>
|
||||
<li><p>Bracket expression: list of characters enclosed by <code>[</code>
|
||||
and <code>]</code>, matches any single character in the list.</p></li>
|
||||
<li><p>Range expression: two characters separated by hyphen and enclosed
|
||||
in brackets, matches any character that is lexicographically between the
|
||||
two characters (inclusive). E.g. <code>[a-d]</code> is the same as
|
||||
<code>[abcd]</code>.</p></li>
|
||||
<li><p>Bracket expression: list of characters enclosed by <code>[</code> and <code>]</code>,
|
||||
matches any single character in the list.</p></li>
|
||||
<li><p>Range expression: two characters separated by hyphen and enclosed in
|
||||
brackets, matches any character that is lexicographically between the
|
||||
two characters (inclusive). E.g. <code>[a-d]</code> is the same as <code>[abcd]</code>.</p></li>
|
||||
</ul>
|
||||
<p>The special characters must be escaped, if they are to be taken
|
||||
literally (e.g. <code>\.</code> to match period). You might want to
|
||||
protect these with <code>'</code>, i.e. use <code>'foo\[bar'</code>
|
||||
instead of <code>foo\[bar</code>. If you want to use the literal
|
||||
<code>-</code> in bracket expression, protect that too
|
||||
(<code>\-</code>), otherwise this is not needed. Note that the syntax
|
||||
differs from standard (?) grep a bit, i.e. in plain grep you can use
|
||||
<code>]</code> and <code>-</code> in bracket expressions by putting
|
||||
<code>]</code> as the first character, and putting <code>-</code>
|
||||
last.</p>
|
||||
literally (e.g. <code>\.</code> to match period). You might want to protect
|
||||
these with <code>'</code>, i.e. use <code>'foo\[bar'</code> instead of <code>foo\[bar</code>. If you want to
|
||||
use the literal <code>-</code> in bracket expression, protect that too (<code>\-</code>),
|
||||
otherwise this is not needed. Note that the syntax differs from standard
|
||||
(?) grep a bit, i.e. in plain grep you can use <code>]</code> and <code>-</code> in bracket
|
||||
expressions by putting <code>]</code> as the first character, and putting <code>-</code> last.</p>
|
||||
<h3 id="other-uses">Other uses</h3>
|
||||
<ul>
|
||||
<li>You can use this in place of <a
|
||||
href="https://en.wikipedia.org/wiki/Cat_(Unix)">cat</a>. Just say</li>
|
||||
<li>You can use this in place of <a href="https://en.wikipedia.org/wiki/Cat_(Unix)">cat</a>.
|
||||
Just say</li>
|
||||
</ul>
|
||||
<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="ex">./fredriksson</span> <span class="at">-k3</span> cat <span class="op"><</span> file</span></code></pre></div>
|
||||
<ul>
|
||||
@@ -237,52 +226,42 @@ href="https://en.wikipedia.org/wiki/Cat_(Unix)">cat</a>. Just say</li>
|
||||
<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">./fredriksson</span> <span class="at">-nk3</span> cat <span class="op"><</span> file</span></code></pre></div>
|
||||
<h3 id="other-features">Other features</h3>
|
||||
<ul>
|
||||
<li><p>It is assumed that the user knows how to feed correct input to
|
||||
the program. If undefined options are given, the result is also
|
||||
undefined. This is a feature.</p></li>
|
||||
<li><p>It may consume huge amounts of memory, and a stack overflow may
|
||||
occur. This results in Segmentation fault (or the equivalent of your
|
||||
favorite system, such as Bus error). This is a feature, that can be used
|
||||
to detect overly long lines in the input file, such as checking the
|
||||
length of one liners in IOCCC entries, just adjust your stack size to a
|
||||
suitable threshold, and search for “<code>ioccc</code>”, with option
|
||||
<code>-vk5</code>.</p></li>
|
||||
<li><p>It is assumed that the user knows how to feed correct input to the
|
||||
program. If undefined options are given, the result is also undefined.
|
||||
This is a feature.</p></li>
|
||||
<li><p>It may consume huge amounts of memory, and a stack overflow may occur.
|
||||
This results in Segmentation fault (or the equivalent of your favorite
|
||||
system, such as Bus error). This is a feature, that can be used to detect
|
||||
overly long lines in the input file, such as checking the length of one
|
||||
liners in IOCCC entries, just adjust your stack size to a suitable
|
||||
threshold, and search for “<code>ioccc</code>”, with option <code>-vk5</code>.</p></li>
|
||||
</ul>
|
||||
<h3 id="limitations-and-remarks">Limitations and remarks</h3>
|
||||
<ul>
|
||||
<li><p>Using warning options (such as <code>-Wall</code>) when building
|
||||
gives a lot of warning, such as
|
||||
<code>suggest parentheses around '&&' within '||'</code>,
|
||||
<code>value computed is not used</code>,
|
||||
<code>implicit declaration of function 'putchar'</code>,
|
||||
<code>implicit declaration of function 'getchar'</code>,
|
||||
<code>control reaches end of non-void function</code> and
|
||||
<code>format not a string literal and no format arguments</code>. Please
|
||||
ignore them all, since they just try to tell you that the source is
|
||||
obfuscated.</p></li>
|
||||
<li><p>Only standard input is handled. And <em>only</em> if
|
||||
<code>stdin</code> comes from a file, i.e. pipes may or may not work. If
|
||||
you want to count only (<code>-c</code> option), then this shouldn’t be
|
||||
an issue.</p></li>
|
||||
<li><p>Using warning options (such as <code>-Wall</code>) when building gives a lot of warning,
|
||||
such as <code>suggest parentheses around '&&' within '||'</code>, <code>value computed is not used</code>, <code>implicit declaration of function 'putchar'</code>, <code>implicit declaration of function 'getchar'</code>, <code>control reaches end of non-void function</code> and <code>format not a string literal and no format arguments</code>.
|
||||
Please ignore them all, since they just try to tell you that the source
|
||||
is obfuscated.</p></li>
|
||||
<li><p>Only standard input is handled. And <em>only</em> if <code>stdin</code> comes from a file,
|
||||
i.e. pipes may or may not work. If you want to count only (<code>-c</code> option),
|
||||
then this shouldn’t be an issue.</p></li>
|
||||
<li><p>The total length of the (preprocessed) pattern is at most
|
||||
<code>sizeof(long)*CHAR_BIT</code>. That does not count things like
|
||||
bracket expressions or escape chars, that is, the pattern
|
||||
<code>'a[bcd]e\.f'</code> is 5 chars long, not 10 chars. That does not
|
||||
mean that the matched substring in the standard input has this limit, as
|
||||
using the edit operations can make the string longer. However, no
|
||||
assumptions are made for <code>sizeof(long)</code>. In fact, you can
|
||||
easily use <code>long long</code> instead,</p></li>
|
||||
<li><p>Depending on the file, it might require a lot of stack space. If
|
||||
the program segfaults (because of this), say</p>
|
||||
<code>sizeof(long)*CHAR_BIT</code>. That does not count things like bracket expressions
|
||||
or escape chars, that is, the pattern <code>'a[bcd]e\.f'</code> is 5 chars long, not
|
||||
10 chars. That does not mean that the matched substring in the standard
|
||||
input has this limit, as using the edit operations can make the string
|
||||
longer. However, no assumptions are made for <code>sizeof(long)</code>. In fact,
|
||||
you can easily use <code>long long</code> instead,</p></li>
|
||||
<li><p>Depending on the file, it might require a lot of stack space. If the
|
||||
program segfaults (because of this), say</p>
|
||||
<p>ulimit -s unlimited</p>
|
||||
<p>cross your fingers, hope it is enough, and try again.</p></li>
|
||||
<li><p>Assumes C99 standard, because of the one very long line. Most C
|
||||
compilers handle this just fine even in C89 mode, though.</p></li>
|
||||
<li><p>The code should be reasonably portable, it assumes standard ASCII
|
||||
codes for each char, and that a C compiler is on <code>$PATH</code>; the
|
||||
latter is hard coded to be ‘gcc’, but any compiler would work, provided
|
||||
that it supports C99, or long lines as an extension. This code has been
|
||||
tested on:</p>
|
||||
<li><p>Assumes C99 standard, because of the one very long line. Most C compilers
|
||||
handle this just fine even in C89 mode, though.</p></li>
|
||||
<li><p>The code should be reasonably portable, it assumes standard ASCII codes
|
||||
for each char, and that a C compiler is on <code>$PATH</code>; the latter is hard coded
|
||||
to be ‘gcc’, but any compiler would work, provided that it supports
|
||||
C99, or long lines as an extension. This code has been tested on:</p>
|
||||
<ul>
|
||||
<li>GNU/Linux FC4, i386, gcc</li>
|
||||
<li>GNU/Linux FC7, x86_64, gcc 4.1.2, tcc 0.9.24 and icc 10.0</li>
|
||||
@@ -295,154 +274,119 @@ tested on:</p>
|
||||
</ul>
|
||||
<p>(Btw, tcc has its roots in IOCCC…)</p></li>
|
||||
</ul>
|
||||
<h3 id="obfuscations-a.k.a.-spoilers">Obfuscations (a.k.a.
|
||||
spoilers…)</h3>
|
||||
<h3 id="obfuscations-a.k.a.-spoilers">Obfuscations (a.k.a. spoilers…)</h3>
|
||||
<ul>
|
||||
<li><p>The initialized char array includes the source code of the real
|
||||
program, as well as its name and commands to build and run it, all <a
|
||||
href="https://en.wikipedia.org/wiki/Burrows-Wheeler_transform">Burrows-Wheeler</a>
|
||||
-transformed, then run-length-encoded with unary coding. The main
|
||||
program extracts and builds that, and then calls it. More precisely, the
|
||||
command to build is</p>
|
||||
<li><p>The initialized char array includes the source code of the real program,
|
||||
as well as its name and commands to build and run it, all
|
||||
<a href="https://en.wikipedia.org/wiki/Burrows-Wheeler_transform">Burrows-Wheeler</a>
|
||||
-transformed, then run-length-encoded with unary coding. The main program
|
||||
extracts and builds that, and then calls it. More precisely, the command
|
||||
to build is</p>
|
||||
<pre><code> gcc -O3 ag.c -o ag</code></pre>
|
||||
<p>To change that you need to edit the char array <code>p[]</code> and
|
||||
(possibly) two specially encoded constants, <code>-~('('*'(')</code> and
|
||||
<code>'C'*' '-'-'</code>. The extracted source (<code>ag.c</code>) is
|
||||
obfuscated as well.</p>
|
||||
<p>To change that you need to edit the char array <code>p[]</code> and (possibly) two
|
||||
specially encoded constants, <code>-~('('*'(')</code> and <code>'C'*' '-'-'</code>.
|
||||
The extracted source (<code>ag.c</code>) is obfuscated as well.</p>
|
||||
<p>(The original version also deleted the generated source and the
|
||||
corresponding binary after running it, but this feature was removed from
|
||||
the submitted entry.)</p></li>
|
||||
<li><p>The code demonstrates several useful programming paradigms, such
|
||||
as:</p>
|
||||
corresponding binary after running it, but this feature was removed
|
||||
from the submitted entry.)</p></li>
|
||||
<li><p>The code demonstrates several useful programming paradigms, such as:</p>
|
||||
<ul>
|
||||
<li>recursion to remove all loops</li>
|
||||
<li>subroutines (<code>main()</code> contains several logical
|
||||
subroutines, selected by the first argument)</li>
|
||||
<li>subroutines (<code>main()</code> contains several logical subroutines,
|
||||
selected by the first argument)</li>
|
||||
<li>function pointers</li>
|
||||
</ul></li>
|
||||
<li><p>Algorithmically, it incorporates the following:</p>
|
||||
<ul>
|
||||
<li>(inverse) Burrows-Wheeler transform (used also e.g. in
|
||||
<code>bzip2(1)</code>)</li>
|
||||
<li>data compression (really expansion :-), run-length-encoding, unary
|
||||
coding (this is why it is expansion rather than compression)</li>
|
||||
<li>(inverse) Burrows-Wheeler transform (used also e.g. in <code>bzip2(1)</code>)</li>
|
||||
<li>data compression (really expansion :-), run-length-encoding,
|
||||
unary coding (this is why it is expansion rather than compression)</li>
|
||||
<li>approximate string matching</li>
|
||||
<li>dynamic programming to compute the edit distance</li>
|
||||
<li>parallel computation in sequential computers (by packing several
|
||||
objects into a single <code>long</code>, to speed up the dynamic
|
||||
<li>parallel computation in sequential computers (by packing
|
||||
several objects into a single <code>long</code>, to speed up the dynamic
|
||||
programming)</li>
|
||||
<li>self extracting, compiling and running code</li>
|
||||
</ul></li>
|
||||
<li><p>As a C program, it demonstrates that</p>
|
||||
<ul>
|
||||
<li>a C subset without reserved words is complete enough, excluding data
|
||||
type specific things (<code>int</code>, <code>char</code>,
|
||||
<code>void</code> …)</li>
|
||||
<li>only letters are needed (i.e. the digits <code>0-9</code> are
|
||||
not)</li>
|
||||
<li>only one statement is enough to code any program (plus variable
|
||||
definitions)</li>
|
||||
<li>a C subset without reserved words is complete enough,
|
||||
excluding data type specific things (<code>int</code>, <code>char</code>, <code>void</code> …)</li>
|
||||
<li>only letters are needed (i.e. the digits <code>0-9</code> are not)</li>
|
||||
<li>only one statement is enough to code any program (plus
|
||||
variable definitions)</li>
|
||||
<li>white space has other uses than just indenting the code</li>
|
||||
</ul></li>
|
||||
<li><p>It also shows the power of boolean logic and bitwise
|
||||
arithmetic.</p></li>
|
||||
<li><p>This is the first (?) entry in the history of IOCCC, that cannot
|
||||
be totally de-obfuscated by the author. This is due to the clever choice
|
||||
of the actual algorithm, that is obfuscated by nature, and it is an open
|
||||
<li><p>It also shows the power of boolean logic and bitwise arithmetic.</p></li>
|
||||
<li><p>This is the first (?) entry in the history of IOCCC, that cannot be
|
||||
totally de-obfuscated by the author. This is due to the clever choice of
|
||||
the actual algorithm, that is obfuscated by nature, and it is an open
|
||||
research problem whether a simpler algorithm exists, with the same time
|
||||
complexity.</p></li>
|
||||
<li><p>The main obfuscation comes from using only arithmetic and boolean
|
||||
(short-circuit) logic combined with recursion to remove all loops and
|
||||
if-then-else constructs (also, no ternary <code>?:</code> constructs are
|
||||
present). Two’s complement representation of integers is also abused.
|
||||
E.g. instead of writing <code>x++</code> or <code>x-1</code>, it is much
|
||||
better to write <code>x=-~x</code> and <code>~-x</code>.</p></li>
|
||||
<li><p>No numerical values, other than in the initialized char array,
|
||||
try</p>
|
||||
if-then-else constructs (also, no ternary <code>?:</code> constructs are present).
|
||||
Two’s complement representation of integers is also abused. E.g. instead
|
||||
of writing <code>x++</code> or <code>x-1</code>, it is much better to write <code>x=-~x</code> and <code>~-x</code>.</p></li>
|
||||
<li><p>No numerical values, other than in the initialized char array, try</p>
|
||||
<pre><code> ./fredriksson -ck0 [0-9] < fredriksson.c</code></pre>
|
||||
<p>This should print 1, as there is a number <code>3</code> in the char
|
||||
array (only). You can also try</p>
|
||||
<p>This should print 1, as there is a number <code>3</code> in the char array (only).
|
||||
You can also try</p>
|
||||
<pre><code> ./fredriksson -ck0 [0-9] < ag.c</code></pre>
|
||||
<p>after running <code>fredriksson</code> at least once (since this
|
||||
generates that <code>ag.c</code> file), and this should print
|
||||
0.</p></li>
|
||||
<li><p>The source code is best viewed with cat (or using the program
|
||||
itself), instead of some editor. (This is a somewhat system dependent
|
||||
thing.)</p>
|
||||
<p>after running <code>fredriksson</code> at least once (since this generates that
|
||||
<code>ag.c</code> file), and this should print 0.</p></li>
|
||||
<li><p>The source code is best viewed with cat (or using the program itself),
|
||||
instead of some editor. (This is a somewhat system dependent thing.)</p>
|
||||
<p>One reason for this is that the code builds (some of the) constant
|
||||
values from string literal <code>"\b"</code>, except that the backspace
|
||||
<code>\b</code> is not escaped like that; the source uses the raw ASCII
|
||||
value (<code>010</code> octal) instead. Thus when viewing with cat or
|
||||
something, that backspace erases the leading quotation mark. Makes it
|
||||
appear uncompilable, and it is: if you copy-paste the cat output from
|
||||
terminal to some editor, save it, the result would not compile.</p>
|
||||
<p>Some other constants are built from ASCII values of
|
||||
<code>char</code>s.</p>
|
||||
<p>Besides of making the code hard to read, all this makes it also quite
|
||||
large.</p></li>
|
||||
<li><p>Running it through GNU <code>indent(1)</code> or
|
||||
<code>bcpp(1)</code> (C beautifiers) does not beautify it a bit. In
|
||||
fact, <code>indent</code> makes it only worse (at least with the default
|
||||
values from string literal <code>"\b"</code>, except that the backspace <code>\b</code> is not
|
||||
escaped like that; the source uses the raw ASCII value (<code>010</code> octal) instead.
|
||||
Thus when viewing with cat or something, that backspace erases the leading
|
||||
quotation mark. Makes it appear uncompilable, and it is: if you copy-paste
|
||||
the cat output from terminal to some editor, save it, the result would not
|
||||
compile.</p>
|
||||
<p>Some other constants are built from ASCII values of <code>char</code>s.</p>
|
||||
<p>Besides of making the code hard to read, all this makes it also quite large.</p></li>
|
||||
<li><p>Running it through GNU <code>indent(1)</code> or <code>bcpp(1)</code> (C beautifiers) does not beautify
|
||||
it a bit. In fact, <code>indent</code> makes it only worse (at least with the default
|
||||
options). Running it through the preprocessor does basically nothing,
|
||||
since no <code>#define</code>s are used.</p></li>
|
||||
<li><p>Some <em>abuse of the rules</em>. The number of non-whitespace
|
||||
and <code>;</code>, <code>{</code> and <code>}</code> chars is below the
|
||||
limit, but most of the whitespace chars are in an <em>initialized
|
||||
character array</em>. That is, the number of chars in the program
|
||||
exceeds the 2048 limit. However, whitespace is whitespace and the rules
|
||||
did not specify that these must be in between the statements. A
|
||||
character is a whitespace if <code>isspace()</code> returns non-zero
|
||||
value. Even if deleting even one of those chars it breaks the program!
|
||||
(This does not apply to the generated source
|
||||
<code>ag.c</code>.)</p></li>
|
||||
<li><p>Some <em>abuse of the rules</em>. The number of non-whitespace and <code>;</code>, <code>{</code>
|
||||
and <code>}</code> chars is below the limit, but most of the whitespace chars are
|
||||
in an <em>initialized character array</em>. That is, the number of chars in the
|
||||
program exceeds the 2048 limit. However, whitespace is whitespace and
|
||||
the rules did not specify that these must be in between the statements.
|
||||
A character is a whitespace if <code>isspace()</code> returns non-zero value. Even
|
||||
if deleting even one of those chars it breaks the program! (This does not
|
||||
apply to the generated source <code>ag.c</code>.)</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-2011fredriksson"><a name="inventory"></a>Inventory
|
||||
for 2011/fredriksson</h1>
|
||||
<h1 id="inventory-for-2011fredriksson"><a name="inventory"></a>Inventory for 2011/fredriksson</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/2011/fredriksson/fredriksson.c">fredriksson.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/fredriksson.orig.c">fredriksson.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_fredriksson.tar.bz2">2011_fredriksson.tar.bz2</a> -
|
||||
download entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/fredriksson.c">fredriksson.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/fredriksson.orig.c">fredriksson.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_fredriksson.tar.bz2">2011_fredriksson.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/2011/fredriksson/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/.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/2011/fredriksson/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/.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/2011/fredriksson/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+44
-74
@@ -130,8 +130,8 @@
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Uri_Goren">Uri Goren</a><br>
|
||||
Location: <a href="../../location.html#IL">IL</a> - <em>State of
|
||||
Israel</em> (<em>Israel</em>) <br><br></li>
|
||||
Location: <a href="../../location.html#IL">IL</a> - <em>State of Israel</em> (<em>Israel</em>)
|
||||
<br><br></li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
|
||||
@@ -146,12 +146,9 @@ Israel</em> (<em>Israel</em>) <br><br></li>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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.sh</span></span></code></pre></div>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>In the words of <a
|
||||
href="http://en.wikipedia.org/wiki/Rene_Magritte">René François Ghislain
|
||||
Magritte Magritte</a>:</p>
|
||||
<p>In the words of <a href="http://en.wikipedia.org/wiki/Rene_Magritte">René François Ghislain Magritte Magritte</a>:</p>
|
||||
<figure>
|
||||
<img src="MagrittePipe.jpg" title="Ceci n'est pas une pipe"
|
||||
alt="This is not a pipe" />
|
||||
<img src="MagrittePipe.jpg" title="Ceci n'est pas une pipe" alt="This is not a pipe" />
|
||||
<figcaption aria-hidden="true">This is not a pipe</figcaption>
|
||||
</figure>
|
||||
<p>One may ask the surrealist question:</p>
|
||||
@@ -160,96 +157,69 @@ alt="This is not a pipe" />
|
||||
<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="bu">echo</span> <span class="st">'| is just a representation of a pipe because I say so! So stuff it!'</span> <span class="kw">|</span> <span class="ex">./goren</span></span></code></pre></div>
|
||||
<p>something happens! Why?</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p>This program was written in homage to <a
|
||||
href="http://en.wikipedia.org/wiki/Rene_Magritte">Rene Magritte</a>’s
|
||||
picture <a
|
||||
href="https://en.wikipedia.org/wiki/The_Treachery_of_Images">“La
|
||||
trahison des images” (The Treachery of Images)</a>.</p>
|
||||
<p>This program was written in homage to <a href="http://en.wikipedia.org/wiki/Rene_Magritte">Rene
|
||||
Magritte</a>’s picture <a href="https://en.wikipedia.org/wiki/The_Treachery_of_Images">“La
|
||||
trahison des images” (The Treachery of
|
||||
Images)</a>.</p>
|
||||
<p>In order to show my unconditional admiration of this work, I avoided
|
||||
using conditions.</p>
|
||||
<p>In this work, Magritte points out that a picture of a pipe is not a
|
||||
pipe. But what IS a pipe? This program tries to provide an answer.</p>
|
||||
<p>Magritte’s <a
|
||||
href="http://en.wikipedia.org/wiki/The_Treachery_of_Images">test for
|
||||
pipes</a> is:</p>
|
||||
<p>In this work, Magritte points out that a picture of a pipe is not
|
||||
a pipe. But what IS a pipe? This program tries to provide an answer.</p>
|
||||
<p>Magritte’s <a href="http://en.wikipedia.org/wiki/The_Treachery_of_Images">test for pipes</a> is:</p>
|
||||
<pre><code>The famous pipe. How people reproached me for it! And yet, could
|
||||
you stuff my pipe? No, it's just a representation, is it not?</code></pre>
|
||||
<p>Accordingly, this program only approves pipes which can be used for
|
||||
stuffing data.</p>
|
||||
<p>One thing I tried to achieve is condition free programming. Many have
|
||||
noted that conditions make the code harder to read and understand. A
|
||||
good example would be: <a href="../../authors.html#Brent_Burley">Brent
|
||||
Burley</a>’s winning <a
|
||||
href="../../2004/burley/index.html">2004/burley</a> entry.</p>
|
||||
<p>That entry omits conditional statements such as <code>if</code> and
|
||||
<code>while</code>. His achievement in improving clarity by omitting
|
||||
conditions is impressive, but I think it can be taken further, in two
|
||||
ways.</p>
|
||||
<p>First, conditional operators, such as <code>?:</code>,
|
||||
<code>&&</code> and <code>||</code>, can be thrown away. Second,
|
||||
using <code>setjmp(3)</code> and <code>longjmp(3)</code>, which are
|
||||
unfortunately not in common use, might make it difficult for a novice
|
||||
programmer to understand the code without referring to the man page.</p>
|
||||
<p>One thing I tried to achieve is condition free programming. Many
|
||||
have noted that conditions make the code harder to read and understand.
|
||||
A good example would be: <a href="../../authors.html#Brent_Burley">Brent Burley</a>’s
|
||||
winning <a href="../../2004/burley/index.html">2004/burley</a> entry.</p>
|
||||
<p>That entry omits conditional statements such as <code>if</code> and <code>while</code>.
|
||||
His achievement in improving clarity by omitting conditions is
|
||||
impressive, but I think it can be taken further, in two ways.</p>
|
||||
<p>First, conditional operators, such as <code>?:</code>, <code>&&</code> and <code>||</code>, can be thrown away.
|
||||
Second, using <code>setjmp(3)</code> and <code>longjmp(3)</code>, which are unfortunately not in
|
||||
common use, might make it difficult for a novice programmer to understand the
|
||||
code without referring to the man page.</p>
|
||||
<p>By removing these, the code is 100% condition free, and every
|
||||
function runs its instructions in perfect order. Naturally, this makes
|
||||
the program flow trivial to understand. This can be verified by
|
||||
disassembling the compiled code and looking for conditional jumps (when
|
||||
compiled with gcc on x86, there are none).</p>
|
||||
function runs its instructions in perfect order. Naturally, this
|
||||
makes the program flow trivial to understand. This can be verified
|
||||
by disassembling the compiled code and looking for conditional jumps
|
||||
(when compiled with gcc on x86, there are none).</p>
|
||||
<h3 id="compatibility">Compatibility:</h3>
|
||||
<p>The program should compile with any C compiler, but was tested mostly
|
||||
with gcc on Linux.</p>
|
||||
<p>It doesn’t support 64 bits (due to integer-pointer casts, and
|
||||
<code>a >>31</code>). It does work on 64-bit Linux, because all
|
||||
functions are below 4GB.</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>
|
||||
<p>The program should compile with any C compiler, but was tested
|
||||
mostly with gcc on Linux.</p>
|
||||
<p>It doesn’t support 64 bits (due to integer-pointer casts, and <code>a >>31</code>).
|
||||
It does work on 64-bit Linux, because all functions are below 4GB.</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-2011goren"><a name="inventory"></a>Inventory for
|
||||
2011/goren</h1>
|
||||
<h1 id="inventory-for-2011goren"><a name="inventory"></a>Inventory for 2011/goren</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/2011/goren/goren.c">goren.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/goren.orig.c">goren.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a href="MagrittePipe.jpg">MagrittePipe.jpg</a> - this is not a
|
||||
pipe</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_goren.tar.bz2">2011_goren.tar.bz2</a> - download entry
|
||||
source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/goren.c">goren.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/goren.orig.c">goren.orig.c</a> - original source</li>
|
||||
<li><a href="MagrittePipe.jpg">MagrittePipe.jpg</a> - this is not a pipe</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_goren.tar.bz2">2011_goren.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/2011/goren/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/.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/2011/goren/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/.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/2011/goren/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/goren/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+110
-175
@@ -129,11 +129,12 @@
|
||||
|
||||
<h2 id="authors"><a name="author"></a>Authors:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Bsoup">bsoup</a><br> Location: <a
|
||||
href="../../location.html#JP">JP</a> - <em>Japan</em> <br><br></li>
|
||||
<li>Name: <a href="../../authors.html#Shinichiro_Hamaji">Shinichiro
|
||||
Hamaji</a><br> Location: <a href="../../location.html#JP">JP</a> -
|
||||
<em>Japan</em> <br><br></li>
|
||||
<li>Name: <a href="../../authors.html#Bsoup">bsoup</a><br>
|
||||
Location: <a href="../../location.html#JP">JP</a> - <em>Japan</em>
|
||||
<br><br></li>
|
||||
<li>Name: <a href="../../authors.html#Shinichiro_Hamaji">Shinichiro Hamaji</a><br>
|
||||
Location: <a href="../../location.html#JP">JP</a> - <em>Japan</em>
|
||||
<br><br></li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
|
||||
@@ -147,29 +148,24 @@ Hamaji</a><br> Location: <a href="../../location.html#JP">JP</a> -
|
||||
<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">./hamaji</span> <span class="op"><</span> a_nonogram_file</span></code></pre></div>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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.sh</span></span></code></pre></div>
|
||||
<p>If you have perl installed you should be able to reproduce <a
|
||||
href="dragon.nono">dragon.nono</a> like:</p>
|
||||
<p>If you have perl installed you should be able to reproduce
|
||||
<a href="dragon.nono">dragon.nono</a> like:</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">perl</span> c2nono.pl hamaji.c <span class="kw">|</span> <span class="ex">./hamaji</span></span></code></pre></div>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This program solves <a
|
||||
href="http://en.wikipedia.org/wiki/Nonogram">Nonograms</a> which is also
|
||||
known as “Paint by Numbers”.</p>
|
||||
<p>This entry roars as the Year of the Dragon: A year considered some to
|
||||
be good luck. Well it was certainly true that the IOCCC was lucky to get
|
||||
such a fine submission!</p>
|
||||
<p>This program solves <a href="http://en.wikipedia.org/wiki/Nonogram">Nonograms</a> which is
|
||||
also known as “Paint by Numbers”.</p>
|
||||
<p>This entry roars as the Year of the Dragon: A year considered
|
||||
some to be good luck. Well it was certainly true that the
|
||||
IOCCC was lucky to get such a fine submission!</p>
|
||||
<p>The source code is a solution to a Paint by Numbers puzzle when you
|
||||
paint by C. Try your hand at solving a few of the other
|
||||
<code>.nono</code> files and then compare your solution with this
|
||||
program!</p>
|
||||
<p>NOTE: NONOGRAM (r) is a registered Trademark and is used with
|
||||
permission. See <a href="https://nonogram.com"
|
||||
class="uri">https://nonogram.com</a> for more information.</p>
|
||||
paint by C. Try your hand at solving a few of the other <code>.nono</code>
|
||||
files and then compare your solution with this program!</p>
|
||||
<p>NOTE: NONOGRAM (r) is a registered Trademark and is used with permission. See
|
||||
<a href="https://nonogram.com" class="uri">https://nonogram.com</a> for more information.</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p>The format of the input files are as same as this site: <a
|
||||
href="https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers"
|
||||
class="uri">https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers</a>.</p>
|
||||
<p>For example, for a simple problem which shows a glider of <a
|
||||
href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Conway’s
|
||||
<p>The format of the input files are as same as this site:
|
||||
<a href="https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers" class="uri">https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers</a>.</p>
|
||||
<p>For example, for a simple problem which shows a glider of <a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Conway’s
|
||||
Game of Life</a>:</p>
|
||||
<pre><code> 1
|
||||
.
|
||||
@@ -189,16 +185,16 @@ Game of Life</a>:</p>
|
||||
2</code></pre>
|
||||
<p>The width and the height of an input puzzle should be less than or
|
||||
equal to 60.</p>
|
||||
<p>When this solver finds the problem has no solution, it prints
|
||||
“<code>invalid</code>”. This means the problem is indeed broken. For
|
||||
example, this happens for an input like</p>
|
||||
<p>When this solver finds the problem has no solution, it prints “<code>invalid</code>”.
|
||||
This means the problem is indeed broken. For example, this happens for
|
||||
an input like</p>
|
||||
<pre><code>2
|
||||
-
|
||||
2</code></pre>
|
||||
<p>When this solver cannot find a solution, it prints
|
||||
“<code>failed</code>”. This failure can happen when the problem has more
|
||||
than one solution or the solver cannot solve the input problem. Here is
|
||||
an example input of the former:</p>
|
||||
<p>When this solver cannot find a solution, it prints “<code>failed</code>”. This
|
||||
failure can happen when the problem has more than one solution or the
|
||||
solver cannot solve the input problem. Here is an example input of the
|
||||
former:</p>
|
||||
<pre><code>1
|
||||
1
|
||||
-
|
||||
@@ -215,185 +211,124 @@ an example input of the former:</p>
|
||||
1 X
|
||||
1 X</code></pre>
|
||||
<h3 id="detail">Detail</h3>
|
||||
<p>Solving Nonogram is <a
|
||||
href="https://en.wikipedia.org/wiki/NP-completeness">NP-complete</a>, so
|
||||
we cannot make a solver which solves all puzzles. However, we can write
|
||||
a solver which solves most problems solvable by humans. There are a
|
||||
bunch of ways to write such programs. The two most obvious approaches
|
||||
are:</p>
|
||||
<p>Solving Nonogram is
|
||||
<a href="https://en.wikipedia.org/wiki/NP-completeness">NP-complete</a>, so we cannot make
|
||||
a solver which solves all puzzles. However, we can write a solver which solves
|
||||
most problems solvable by humans. There are a bunch of ways to write such
|
||||
programs. The two most obvious approaches are:</p>
|
||||
<ol type="1">
|
||||
<li>Check all possible solutions with backtracking.</li>
|
||||
<li>Implement all techniques which humans use.</li>
|
||||
</ol>
|
||||
<p>The former, brute-force approach is easy to implement. However, it
|
||||
works only for smaller problems (width and height should be at most 30
|
||||
or so). Similarly, using generic probabilistic <a
|
||||
href="https://en.wikipedia.org/wiki/Metaheuristic">metaheuristics</a>
|
||||
such as <a
|
||||
href="https://en.wikipedia.org/wiki/Simulated_annealing">simulated
|
||||
annealing</a> doesn’t work for big problems.</p>
|
||||
<p>See: <a
|
||||
href="http://ccl.northwestern.edu/netlogo/models/community/Nonogram"
|
||||
class="uri">http://ccl.northwestern.edu/netlogo/models/community/Nonogram</a>.</p>
|
||||
or so). Similarly, using generic probabilistic
|
||||
<a href="https://en.wikipedia.org/wiki/Metaheuristic">metaheuristics</a> such as
|
||||
<a href="https://en.wikipedia.org/wiki/Simulated_annealing">simulated annealing</a> doesn’t
|
||||
work for big problems.</p>
|
||||
<p>See: <a href="http://ccl.northwestern.edu/netlogo/models/community/Nonogram" class="uri">http://ccl.northwestern.edu/netlogo/models/community/Nonogram</a>.</p>
|
||||
<p>By its definition, the latter method works for all human-solvable
|
||||
problems. The issue of the latter approach is this kind of program tends
|
||||
to be lengthy. This approach still requires some <a
|
||||
href="https://en.wikipedia.org/wiki/Recursion">recursions</a>. The most
|
||||
difficult problems which are considered human-solvable may require some
|
||||
“guesses”. For these kinds of problems, we need to assume a cell is a
|
||||
space or a box, go ahead some steps with simple methods and mark the
|
||||
tried cell as a box (or a space if we assumed the tried cell is a box)
|
||||
if a contradiction is found.</p>
|
||||
<p>My program uses an approach like “Set based solver” introduced in <a
|
||||
href="https://wiki.haskell.org/Nonogram#Set_based_solver"
|
||||
class="uri">https://wiki.haskell.org/Nonogram#Set_based_solver</a>. This
|
||||
should be equivalent to the combinations of simple methods (no advanced
|
||||
reasoning with guess). My solver also runs a non-recursive guess for
|
||||
each undetermined cells. So, my program should be able to solve most
|
||||
human-solvable problems (assuming humans cannot execute deeper
|
||||
recursions).</p>
|
||||
problems. The issue of the latter approach is this kind of program
|
||||
tends to be lengthy. This approach still requires some
|
||||
<a href="https://en.wikipedia.org/wiki/Recursion">recursions</a>. The
|
||||
most difficult problems which are considered human-solvable may
|
||||
require some “guesses”. For these kinds of problems, we need to assume a
|
||||
cell is a space or a box, go ahead some steps with simple methods and
|
||||
mark the tried cell as a box (or a space if we assumed the tried cell
|
||||
is a box) if a contradiction is found.</p>
|
||||
<p>My program uses an approach like “Set based solver” introduced in
|
||||
<a href="https://wiki.haskell.org/Nonogram#Set_based_solver" class="uri">https://wiki.haskell.org/Nonogram#Set_based_solver</a>. This should be equivalent
|
||||
to the combinations of simple methods (no advanced reasoning with guess). My
|
||||
solver also runs a non-recursive guess for each undetermined cells. So, my
|
||||
program should be able to solve most human-solvable problems (assuming humans
|
||||
cannot execute deeper recursions).</p>
|
||||
<h3 id="obfuscation">Obfuscation</h3>
|
||||
<p>First of all, as you see, my program looks like a nonogram puzzle
|
||||
which results in a <a href="https://www.draconika.com/what">dragon</a>.
|
||||
This puzzle is <a href="dragon.nono">dragon.nono</a> in this directory.
|
||||
Note that whitespaces in character literals, a string literal, and
|
||||
around the last comment are considered as a boxed cell.</p>
|
||||
<p>First of all, as you see, my program looks like a nonogram puzzle which results
|
||||
in a <a href="https://www.draconika.com/what">dragon</a>. This puzzle is
|
||||
<a href="dragon.nono">dragon.nono</a> in this directory. Note that whitespaces in character
|
||||
literals, a string literal, and around the last comment are considered as a
|
||||
boxed cell.</p>
|
||||
<p>My program is based on bit operations for speed. Many values are
|
||||
stored using negative logic (0 means on and 1 means off) to utilize the
|
||||
initial value of global variables. Thus, it might be difficult to figure
|
||||
out how it works.</p>
|
||||
stored using negative logic (0 means on and 1 means off) to utilize
|
||||
the initial value of global variables. Thus, it might be difficult to
|
||||
figure out how it works.</p>
|
||||
<p>My program is decently shortened, because the size of source code is
|
||||
limited by IOCCC’s rule (2048 non-whitespace characters) and a lot of
|
||||
characters are just wasted for numbers around the picture.</p>
|
||||
<p>The three requirements (dragon, speed, and size) naturally ended up
|
||||
with the well obfuscated code.</p>
|
||||
<h3 id="portability">Portability</h3>
|
||||
<p>This program uses two C99 features. One line comments and
|
||||
<code>long long</code>. GCC’s <code>-ansi -pedantic</code> check should
|
||||
pass:</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="fu">cc</span> <span class="at">-ansi</span> <span class="at">-pedantic</span> <span class="at">-std</span><span class="op">=</span>c99 hamaji.c</span></code></pre></div>
|
||||
<p>I checked my program with gcc-4.6.2 on linux, llvm-gcc-4.2 on Mac,
|
||||
and clang-3.0 on Mac.</p>
|
||||
<p>Note that the behavior of <code>scanf(3)</code> differs on linux and
|
||||
mac, but this program supports both semantics.</p>
|
||||
<p>This program should not depend on <code>sizeof(int)</code>,
|
||||
<code>sizeof(void*)</code>, ASCII, memory layout, undefined evaluation
|
||||
order (e.g., <code>a[i++]=i</code>), etc. This program won’t work if the
|
||||
size of <code>long long</code> literal is less than 8. By grepping the
|
||||
source code of gcc</p>
|
||||
<div class="sourceCode" id="cb12"><pre
|
||||
class="sourceCode sh"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="fu">grep</span> LONG_LONG_TYPE_SIZE gcc/config/<span class="pp">*</span>/<span class="pp">*</span></span></code></pre></div>
|
||||
<p>This program uses two C99 features. One line comments and <code>long long</code>.
|
||||
GCC’s <code>-ansi -pedantic</code> check should pass:</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="fu">cc</span> <span class="at">-ansi</span> <span class="at">-pedantic</span> <span class="at">-std</span><span class="op">=</span>c99 hamaji.c</span></code></pre></div>
|
||||
<p>I checked my program with gcc-4.6.2 on linux, llvm-gcc-4.2 on Mac, and
|
||||
clang-3.0 on Mac.</p>
|
||||
<p>Note that the behavior of <code>scanf(3)</code> differs on linux and mac, but this
|
||||
program supports both semantics.</p>
|
||||
<p>This program should not depend on <code>sizeof(int)</code>, <code>sizeof(void*)</code>, ASCII,
|
||||
memory layout, undefined evaluation order (e.g., <code>a[i++]=i</code>), etc.
|
||||
This program won’t work if the size of <code>long long</code> literal is less than 8.
|
||||
By grepping the source code of gcc</p>
|
||||
<div class="sourceCode" id="cb12"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="fu">grep</span> LONG_LONG_TYPE_SIZE gcc/config/<span class="pp">*</span>/<span class="pp">*</span></span></code></pre></div>
|
||||
<p>I found long long may be 32bit integers only on AVR.</p>
|
||||
<h3 id="a-few-more-things">A few more things</h3>
|
||||
<p>This code is considered as a <a
|
||||
href="http://en.wikipedia.org/wiki/Japanese_New_Year#Postcards">new
|
||||
year’s postcard in Japan</a>. We chose the dragon because 2012 is the <a
|
||||
href="https://japanesezodiac.com/japanese-year-of-the-dragon">year of
|
||||
<p>This code is considered as a <a href="http://en.wikipedia.org/wiki/Japanese_New_Year#Postcards">new year’s postcard in
|
||||
Japan</a>. We chose
|
||||
the dragon because 2012 is the <a href="https://japanesezodiac.com/japanese-year-of-the-dragon">year of
|
||||
dragon</a>.</p>
|
||||
<p>The second author wrote the picture, and the first author did
|
||||
everything else.</p>
|
||||
<p>The <a href="dragon.nono">dragon.nono</a>, <a
|
||||
href="samurai.nono">samurai.nono</a>, and <a
|
||||
href="penguin.nono">penguin.nono</a> were written by the second author.
|
||||
The <a href="soccer.nono">soccer.nono</a> was from a wikipedia entry.
|
||||
This file is important because it requires some guesses. The <a
|
||||
href="random.nono">random.nono</a> file was randomly generated. The <a
|
||||
href="codegolf.nono">codegolf.nono</a> and <a
|
||||
href="face.nono">face.nono</a> were taken from <a
|
||||
href="https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers"
|
||||
class="uri">https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers</a>.</p>
|
||||
<p>You can reproduce <a href="dragon.nono">dragon.nono</a> from <a
|
||||
href="hamaji.c">hamaji.c</a> using <a
|
||||
href="c2nono.pl">c2nono.pl</a>:</p>
|
||||
<div class="sourceCode" id="cb13"><pre
|
||||
class="sourceCode sh"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="fu">perl</span> c2nono.pl hamaji.c <span class="kw">|</span> <span class="ex">./hamaji</span></span></code></pre></div>
|
||||
<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>
|
||||
<p>The <a href="dragon.nono">dragon.nono</a>, <a href="samurai.nono">samurai.nono</a>, and
|
||||
<a href="penguin.nono">penguin.nono</a> were written by the
|
||||
second author. The <a href="soccer.nono">soccer.nono</a> was from a wikipedia entry. This file
|
||||
is important because it requires some guesses. The <a href="random.nono">random.nono</a> file
|
||||
was randomly generated. The <a href="codegolf.nono">codegolf.nono</a> and
|
||||
<a href="face.nono">face.nono</a> were taken from
|
||||
<a href="https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers" class="uri">https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers</a>.</p>
|
||||
<p>You can reproduce <a href="dragon.nono">dragon.nono</a> from <a href="hamaji.c">hamaji.c</a> using
|
||||
<a href="c2nono.pl">c2nono.pl</a>:</p>
|
||||
<div class="sourceCode" id="cb13"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="fu">perl</span> c2nono.pl hamaji.c <span class="kw">|</span> <span class="ex">./hamaji</span></span></code></pre></div>
|
||||
<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-2011hamaji"><a name="inventory"></a>Inventory for
|
||||
2011/hamaji</h1>
|
||||
<h1 id="inventory-for-2011hamaji"><a name="inventory"></a>Inventory for 2011/hamaji</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/2011/hamaji/hamaji.c">hamaji.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/hamaji.orig.c">hamaji.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/c2nono.pl">c2nono.pl</a>
|
||||
- reproduce dragon.nono</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/codegolf.nono">codegolf.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/conway-game-of-life.nono">conway-game-of-life.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/dragon.nono">dragon.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/face.nono">face.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/multi-solutions.nono">multi-solutions.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/no-solution.nono">no-solution.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/penguin.nono">penguin.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/plus.nono">plus.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/random.nono">random.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/samurai.nono">samurai.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/smiley.nono">smiley.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/soccer.nono">soccer.nono</a>
|
||||
- nonogram input data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_hamaji.tar.bz2">2011_hamaji.tar.bz2</a> - download
|
||||
entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/hamaji.c">hamaji.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/hamaji.orig.c">hamaji.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/c2nono.pl">c2nono.pl</a> - reproduce dragon.nono</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/codegolf.nono">codegolf.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/conway-game-of-life.nono">conway-game-of-life.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/dragon.nono">dragon.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/face.nono">face.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/multi-solutions.nono">multi-solutions.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/no-solution.nono">no-solution.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/penguin.nono">penguin.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/plus.nono">plus.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/random.nono">random.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/samurai.nono">samurai.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/smiley.nono">smiley.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/soccer.nono">soccer.nono</a> - nonogram input data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_hamaji.tar.bz2">2011_hamaji.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/2011/hamaji/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/.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/2011/hamaji/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/.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/2011/hamaji/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+51
-81
@@ -130,8 +130,8 @@
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Qiming_HOU">Qiming HOU</a><br>
|
||||
Location: <a href="../../location.html#CN">CN</a> - <em>People’s
|
||||
Republic of China</em> (<em>China</em>) <br><br></li>
|
||||
Location: <a href="../../location.html#CN">CN</a> - <em>People’s Republic of China</em> (<em>China</em>)
|
||||
<br><br></li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
|
||||
@@ -145,8 +145,8 @@ Republic of China</em> (<em>China</em>) <br><br></li>
|
||||
<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">./hou</span> <span class="st">'expression'</span></span></code></pre></div>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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.sh</span></span></code></pre></div>
|
||||
<p>As the script asks you, what does the last one mean? Can you get it
|
||||
to report a different value? Hint: it’s in this file, kind of.</p>
|
||||
<p>As the script asks you, what does the last one mean? Can you get it to report a
|
||||
different value? Hint: it’s in this file, kind of.</p>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This self-documenting scientific calculator compiles clean with no
|
||||
warnings under the most strict pedantic mode of gcc and clang.</p>
|
||||
@@ -160,112 +160,82 @@ source code. What does it mean?</p>
|
||||
<div class="sourceCode" id="cb5"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="op">+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+</span></span></code></pre></div>
|
||||
<h3 id="self-documenting-source">Self documenting source</h3>
|
||||
<p>Comments would almost be redundant. :-}</p>
|
||||
<h3 id="the-ascii-art-is-valid-c-code">The ASCII art is valid C
|
||||
code</h3>
|
||||
<p>… and not just fancy formatted comment removed by the C
|
||||
Pre-processor.</p>
|
||||
<h3 id="the-only-multi-byte-strings-are-format-strings">The only
|
||||
multi-byte strings are format strings</h3>
|
||||
<p>The code does not contain some simple string-encoded lookup table for
|
||||
calculator operations.</p>
|
||||
<h3 id="example-input-and-output-in-the-source">Example input and output
|
||||
in the source</h3>
|
||||
<p>The example input and output in the C code is significant. Can you
|
||||
find out why?</p>
|
||||
<h3 id="the-ascii-art-is-valid-c-code">The ASCII art is valid C code</h3>
|
||||
<p>… and not just fancy formatted comment removed by the C Pre-processor.</p>
|
||||
<h3 id="the-only-multi-byte-strings-are-format-strings">The only multi-byte strings are format strings</h3>
|
||||
<p>The code does not contain some simple string-encoded lookup table for calculator
|
||||
operations.</p>
|
||||
<h3 id="example-input-and-output-in-the-source">Example input and output in the source</h3>
|
||||
<p>The example input and output in the C code is significant. Can you find out
|
||||
why?</p>
|
||||
<h3 id="the-button-layout">The button layout</h3>
|
||||
<p>The button layout in the C code is significant … not just a nice
|
||||
looking layout.</p>
|
||||
<p>The button layout in the C code is significant … not just a nice looking
|
||||
layout.</p>
|
||||
<h3 id="input-parsing">Input parsing</h3>
|
||||
<p>The parser is functionally equivalent to a normal arithmetic parser
|
||||
for all valid inputs. For another fun challenge: try to determine how it
|
||||
parses the command line argument.</p>
|
||||
<p>The parser is functionally equivalent to a normal arithmetic parser for all
|
||||
valid inputs. For another fun challenge: try to determine how it parses the
|
||||
command line argument.</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<h3 id="obfuscations">Obfuscations</h3>
|
||||
<p>This program is designed to be self-documenting. It doesn’t just
|
||||
provide an example command line. It also provides the expected output
|
||||
and illustrates all supported functionality using embedded ASCII
|
||||
art.</p>
|
||||
<p>This program is designed to be self-documenting. It doesn’t just provide an
|
||||
example command line. It also provides the expected output and illustrates all
|
||||
supported functionality using embedded ASCII art.</p>
|
||||
<ul>
|
||||
<li>A few line numbers are significant and careless beautification will
|
||||
break the program.</li>
|
||||
<li>The entire ASCII art is valid code. The preprocessor won’t remove
|
||||
any part of it.</li>
|
||||
<li>The only strings longer than 1 byte are
|
||||
<code>printf(3)</code>/<code>sscanf(3)</code> format strings, even after
|
||||
preprocessing. No string-encoded lookup table is used.</li>
|
||||
<li>A few line numbers are significant and careless beautification will break the
|
||||
program.</li>
|
||||
<li>The entire ASCII art is valid code. The preprocessor won’t remove any part of it.</li>
|
||||
<li>The only strings longer than 1 byte are <code>printf(3)</code>/<code>sscanf(3)</code> format strings, even
|
||||
after preprocessing. No string-encoded lookup table is used.</li>
|
||||
<li>The example input and its expected output are both algorithmically
|
||||
significant.</li>
|
||||
<li>The button layout is also significant.</li>
|
||||
<li>The actual syntax being parsed is not that obvious, despite being
|
||||
functionally equivalent for all correct inputs.</li>
|
||||
<li>The actual syntax being parsed is not that obvious, despite being functionally
|
||||
equivalent for all correct inputs.</li>
|
||||
</ul>
|
||||
<h3 id="portability">Portability</h3>
|
||||
<ul>
|
||||
<li>This program requires <code>argv</code> to point to writable memory.
|
||||
It doesn’t require the actual <code>argv</code> strings to be writable,
|
||||
though.</li>
|
||||
<li>This program requires <code>argv</code> to point to writable memory. It doesn’t require
|
||||
the actual <code>argv</code> strings to be writable, though.</li>
|
||||
<li>This program requires ASCII.</li>
|
||||
<li>This program doesn’t work with <code>%e</code> style numbers like
|
||||
<code>1e-4</code>.</li>
|
||||
<li>Some seemingly redundant code works to eliminate warnings and evade
|
||||
a gcc bug.</li>
|
||||
<li>This program doesn’t work with <code>%e</code> style numbers like <code>1e-4</code>.</li>
|
||||
<li>Some seemingly redundant code works to eliminate warnings and evade a gcc bug.</li>
|
||||
</ul>
|
||||
<h3 id="spoilers">Spoilers</h3>
|
||||
<p>The parser parses function names, subtraction, and division as
|
||||
single-letter unary operators. A bitmask encoded hash table is used to
|
||||
check no-ops/digits and another hash function maps the ASCII to a
|
||||
function ordinal, which is then executed by the button panel.</p>
|
||||
<p>Both hash functions were found using a separate search program.
|
||||
Another program was used to find a way to format one hash function as
|
||||
example input such that it produces something resembling the bitmask
|
||||
hash table as part of its output.</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>
|
||||
<p>The parser parses function names, subtraction, and division as single-letter
|
||||
unary operators. A bitmask encoded hash table is used to check no-ops/digits
|
||||
and another hash function maps the ASCII to a function ordinal, which is then
|
||||
executed by the button panel.</p>
|
||||
<p>Both hash functions were found using a separate search program. Another program
|
||||
was used to find a way to format one hash function as example input such that
|
||||
it produces something resembling the bitmask hash table as part of its output.</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-2011hou"><a name="inventory"></a>Inventory for
|
||||
2011/hou</h1>
|
||||
<h1 id="inventory-for-2011hou"><a name="inventory"></a>Inventory for 2011/hou</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/2011/hou/hou.c">hou.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/hou.orig.c">hou.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_hou.tar.bz2">2011_hou.tar.bz2</a> - download entry
|
||||
source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/hou.c">hou.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/hou.orig.c">hou.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_hou.tar.bz2">2011_hou.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/2011/hou/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/.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/2011/hou/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/.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/2011/hou/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hou/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+41
-64
@@ -123,95 +123,72 @@
|
||||
<!-- END: this line ends content from: inc/before-content.default.html -->
|
||||
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||||
|
||||
<h1 id="twentieth-international-obfuscated-c-code-contest">Twentieth
|
||||
International Obfuscated C Code Contest</h1>
|
||||
<h1 id="twentieth-international-obfuscated-c-code-contest">Twentieth International Obfuscated C Code Contest</h1>
|
||||
<h2 id="standard-ioccc-stuff">Standard IOCCC stuff</h2>
|
||||
<p>View the <code>index.html</code> web page for the given winning entry
|
||||
for information on how on how to compile it and how to run the winning
|
||||
program. Look at the winning source and try to figure how it does what
|
||||
it does! You may then wish to look at the Author’s remarks for even more
|
||||
details.</p>
|
||||
<p>The IOCCC has a web site and now has a number of international
|
||||
mirrors. The primary site can be found at <a
|
||||
href="https://www.ioccc.org">www.ioccc.org</a>.</p>
|
||||
<p>Use <code>make</code> to compile entries. It is possible that on
|
||||
non-Unix / non-Linux systems the Makefile needs to be changed. See the
|
||||
Makefile for details.</p>
|
||||
<p>This year we included most of the information included by the
|
||||
submitters in the <code>README.md</code> files (that were used to build
|
||||
the <code>index.html</code> web pages).</p>
|
||||
<p>Read over the Makefile for compile/build issues. Your system may
|
||||
require certain changes (add or remove a library, add or remove a
|
||||
<code>#define</code>).</p>
|
||||
<p>View the <code>index.html</code> web page for the given winning entry for information on how
|
||||
on how to compile it and how to run the winning program.
|
||||
Look at the winning source and try to figure how it does what it does!
|
||||
You may then wish to look at the Author’s remarks for even more details.</p>
|
||||
<p>The IOCCC has a web site and now has a number of international mirrors.
|
||||
The primary site can be found at <a href="https://www.ioccc.org">www.ioccc.org</a>.</p>
|
||||
<p>Use <code>make</code> to compile entries. It is possible that on non-Unix / non-Linux
|
||||
systems the Makefile needs to be changed. See the Makefile for details.</p>
|
||||
<p>This year we included most of the information included by the submitters
|
||||
in the <code>README.md</code> files (that were used to build the <code>index.html</code> web pages).</p>
|
||||
<p>Read over the Makefile for compile/build issues. Your system may require
|
||||
certain changes (add or remove a library, add or remove a <code>#define</code>).</p>
|
||||
<p>Some ANSI C compilers are not quite as good as they should be. If
|
||||
yours is lacking, you may need to compile using gcc instead of your
|
||||
local compiler.</p>
|
||||
<h2 id="remarks-on-some-of-the-entries">Remarks on some of the
|
||||
entries</h2>
|
||||
<h2 id="remarks-on-some-of-the-entries">Remarks on some of the entries</h2>
|
||||
<p>There were some outstanding entries that did not win. Unfortunately
|
||||
some very good entries lost because they:</p>
|
||||
<ul>
|
||||
<li><p>did not follow the “one program - one file” rule;</p></li>
|
||||
<li><p>depended too much on 32 bit architectures;</p></li>
|
||||
<li><p>were more of the “obfuscated math” kind rather than the
|
||||
“obfuscated C” kind.</p></li>
|
||||
<li><p>were more of the “obfuscated math” kind rather than the “obfuscated C” kind.</p></li>
|
||||
</ul>
|
||||
<p>We hope the authors of some of those entries will fix and re-submit
|
||||
them for the next IOCCC.</p>
|
||||
<p>We believe you will be impressed with this year’s winning entries.
|
||||
The Best of Show is a fine example of character stitching. But don’t
|
||||
ignore the other entries! There are games, puzzle solvers, utilities,
|
||||
eye candy, calculators and graphical and audio tools.</p>
|
||||
<p>This year all authors are different, and there is a authors from a
|
||||
new country - China! Many authors won for the first time. (Please note
|
||||
that judging is done completely anonymously. Be warned that we may
|
||||
disqualify entries that reveal the identity of the submitter).</p>
|
||||
<p>We believe you will be impressed with this year’s winning entries. The Best
|
||||
of Show is a fine example of character stitching. But don’t ignore the other
|
||||
entries! There are games, puzzle solvers, utilities, eye candy, calculators and
|
||||
graphical and audio tools.</p>
|
||||
<p>This year all authors are different, and there is a authors from a new country -
|
||||
China! Many authors won for the first time. (Please note that judging is done
|
||||
completely anonymously. Be warned that we may disqualify entries that reveal
|
||||
the identity of the submitter).</p>
|
||||
<h2 id="final-comments">Final Comments</h2>
|
||||
<p><strong>IMPORTANT NOTE</strong>: See <a
|
||||
href="../contact.html">contact.html</a> for up to date contact details
|
||||
as well as details on how to provide fixes to any of the entries. See
|
||||
also <a href="../faq.html">the IOCCC FAQ</a> for addition information on
|
||||
the IOCCC.</p>
|
||||
<p><strong>IMPORTANT NOTE</strong>: See <a href="../contact.html">contact.html</a> for up to date contact details
|
||||
as well as details on how to provide fixes to any of the entries.
|
||||
See also <a href="../faq.html">the IOCCC FAQ</a> for addition information on the IOCCC.</p>
|
||||
<h1 id="copyright-and-license">Copyright and License</h1>
|
||||
<p>Copyright (c) 2012,2023, Landon Curt Noll and Leonid A. Broukhis. All
|
||||
Rights Reserved. This work is licensed under a <a
|
||||
href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons
|
||||
CC BY-SA 4.0 DEED Attribution-ShareAlike 4.0 International</a> license.
|
||||
If you do use this work in some form, the <a href="../judges.html">IOCCC
|
||||
judges</a> would appreciate (but does not require) if you were to <a
|
||||
href="../contact.html">send us a note about your use</a>.</p>
|
||||
<p>Copyright (c) 2012,2023, Landon Curt Noll and Leonid A. Broukhis. All Rights Reserved.
|
||||
This work is licensed under a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons CC BY-SA 4.0 DEED Attribution-ShareAlike
|
||||
4.0 International</a> license.
|
||||
If you do use this work in some form, the <a href="../judges.html">IOCCC judges</a> would appreciate
|
||||
(but does not require) if you were to <a href="../contact.html">send us a note about your use</a>.</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-year-index.sh via bin/md2html.sh -->
|
||||
|
||||
<!-- START: this line starts content generated by: bin/output-year-index.sh -->
|
||||
|
||||
<h1
|
||||
id="winning-entries-of-2011---the-20th-ioccc"><a name=inventory></a><a name=2011></a>Winning
|
||||
Entries of 2011 - The 20th IOCCC</h1>
|
||||
<p><strong>Download IOCCC</strong> <a
|
||||
href="2011/ioccc.2011.tar.bz2">2011 entry source</a></p>
|
||||
<h1 id="winning-entries-of-2011---the-20th-ioccc"><a name=inventory></a><a name=2011></a>Winning Entries of 2011 - The 20th IOCCC</h1>
|
||||
<p><strong>Download IOCCC</strong> <a href="2011/ioccc.2011.tar.bz2">2011 entry source</a></p>
|
||||
<ul>
|
||||
<li><a href="akari/index.html">2011/akari</a> - Best of Show - Most
|
||||
Shrinkable</li>
|
||||
<li><a href="akari/index.html">2011/akari</a> - Best of Show - Most Shrinkable</li>
|
||||
<li><a href="blakely/index.html">2011/blakely</a> - Most devolving</li>
|
||||
<li><a href="borsanyi/index.html">2011/borsanyi</a> - Best data
|
||||
utility</li>
|
||||
<li><a href="dlowe/index.html">2011/dlowe</a> - Most self
|
||||
deprecating</li>
|
||||
<li><a href="borsanyi/index.html">2011/borsanyi</a> - Best data utility</li>
|
||||
<li><a href="dlowe/index.html">2011/dlowe</a> - Most self deprecating</li>
|
||||
<li><a href="eastman/index.html">2011/eastman</a> - Best ball</li>
|
||||
<li><a href="fredriksson/index.html">2011/fredriksson</a> - Most
|
||||
useful</li>
|
||||
<li><a href="fredriksson/index.html">2011/fredriksson</a> - Most useful</li>
|
||||
<li><a href="goren/index.html">2011/goren</a> - Most artistic</li>
|
||||
<li><a href="hamaji/index.html">2011/hamaji</a> - Best solved
|
||||
puzzle</li>
|
||||
<li><a href="hou/index.html">2011/hou</a> - Best self documenting
|
||||
program</li>
|
||||
<li><a href="hamaji/index.html">2011/hamaji</a> - Best solved puzzle</li>
|
||||
<li><a href="hou/index.html">2011/hou</a> - Best self documenting program</li>
|
||||
<li><a href="konno/index.html">2011/konno</a> - Best one liner</li>
|
||||
<li><a href="richards/index.html">2011/richards</a> - Most surprisingly
|
||||
portable</li>
|
||||
<li><a href="toledo/index.html">2011/toledo</a> - Best non-chess
|
||||
game</li>
|
||||
<li><a href="richards/index.html">2011/richards</a> - Most surprisingly portable</li>
|
||||
<li><a href="toledo/index.html">2011/toledo</a> - Best non-chess game</li>
|
||||
<li><a href="vik/index.html">2011/vik</a> - Most sound</li>
|
||||
<li><a href="zucker/index.html">2011/zucker</a> - Most shiny</li>
|
||||
</ul>
|
||||
|
||||
+23
-42
@@ -146,16 +146,16 @@ Location: <a href="../../location.html#JP">JP</a> - <em>Japan</em>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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.sh</span></span></code></pre></div>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This tiny program outputs what looks like a tiny keyboard. OK, so the
|
||||
letters are missing. But that is no problem because this program
|
||||
identifies the lower case letters that were pressed!</p>
|
||||
<p>It is one of those minimal keyboards without all of those confusing
|
||||
symbols keys. No shift for SHOUTING CAPS but at least it does not have
|
||||
that useless CAPS LOCK key!</p>
|
||||
<p>We recommend that you completely deconstruct / figure out how this
|
||||
program works and does what it does. Can you extend this program to deal
|
||||
with a full QWERTY keyboard? Can you then minimize the size of that
|
||||
code?</p>
|
||||
<p>This tiny program outputs what looks like a tiny keyboard.
|
||||
OK, so the letters are missing. But that is no problem because
|
||||
this program identifies the lower case letters that were pressed!</p>
|
||||
<p>It is one of those minimal keyboards without all of those
|
||||
confusing symbols keys. No shift for SHOUTING CAPS
|
||||
but at least it does not have that useless CAPS LOCK key!</p>
|
||||
<p>We recommend that you completely deconstruct / figure out
|
||||
how this program works and does what it does. Can you
|
||||
extend this program to deal with a full QWERTY keyboard?
|
||||
Can you then minimize the size of that code?</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<h3 id="limitation">Limitation</h3>
|
||||
<p>This program ignores non-lower case letters.</p>
|
||||
@@ -164,53 +164,34 @@ code?</p>
|
||||
<li><code>for</code> is not used.</li>
|
||||
<li>A part of the program is encrypted.</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-2011konno"><a name="inventory"></a>Inventory for
|
||||
2011/konno</h1>
|
||||
<h1 id="inventory-for-2011konno"><a name="inventory"></a>Inventory for 2011/konno</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/2011/konno/konno.c">konno.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/konno.orig.c">konno.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_konno.tar.bz2">2011_konno.tar.bz2</a> - download entry
|
||||
source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/konno.c">konno.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/konno.orig.c">konno.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_konno.tar.bz2">2011_konno.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/2011/konno/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/.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/2011/konno/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/.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/2011/konno/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/konno/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+56
-96
@@ -129,9 +129,9 @@
|
||||
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Gregor_Richards">Gregor
|
||||
Richards</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#Gregor_Richards">Gregor Richards</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 -->
|
||||
@@ -144,133 +144,93 @@ Richards</a><br> Location: <a href="../../location.html#US">US</a> -
|
||||
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
|
||||
<p>The current status of this entry is:</p>
|
||||
<pre><code>STATUS: doesn't work with some platforms - please help us fix</code></pre>
|
||||
<p>For more detailed information see <a
|
||||
href="../../bugs.html#2011_richards">2011 richards bugs</a>.</p>
|
||||
<p>For more detailed information see <a href="../../bugs.html#2011_richards">2011 richards bugs</a>.</p>
|
||||
<h2 id="to-use">To use:</h2>
|
||||
<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="bu">echo</span> expression <span class="kw">|</span> <span class="ex">./richards</span></span></code></pre></div>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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="ex">./try.sh</span></span></code></pre></div>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>Oh no, yet another <a
|
||||
href="https://en.wikipedia.org/wiki/Dc_(computer_program)">dc</a>-style
|
||||
calculator? (see <a href="../../2000/dlowe/index.html">2000/dlowe</a>
|
||||
using an embedded Perl interpreter and deemed
|
||||
<code>Worst Abuse of the Rules</code>). Well, this one does it
|
||||
(expression calculation, that is, not the rule abuse) in a different
|
||||
way. The author claims that his calculator does just-in-time
|
||||
compilation. What would you do to prove or disprove his claim without
|
||||
attempting to unravel the source?</p>
|
||||
<p>Oh no, yet another
|
||||
<a href="https://en.wikipedia.org/wiki/Dc_(computer_program)">dc</a>-style calculator? (see
|
||||
<a href="../../2000/dlowe/index.html">2000/dlowe</a> using an embedded Perl interpreter and deemed <code>Worst Abuse of the Rules</code>). Well, this one does it (expression calculation, that is,
|
||||
not the rule abuse) in a different way. The author claims that his calculator
|
||||
does just-in-time compilation. What would you do to prove or disprove his claim
|
||||
without attempting to unravel the source?</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p>This is an implementation of the classic UNIX <a
|
||||
href="https://en.wikipedia.org/wiki/Dc_(computer_program)">dc</a>
|
||||
command, the <a
|
||||
href="https://en.wikipedia.org/wiki/Reverse_Polish_notation">reverse
|
||||
Polish</a> calculator. Actually it’s a pretty bad implementation, since
|
||||
it only implements 32-bit integers (well, <code>sizeof(int)</code>-sized
|
||||
integers). It only implements the commands <code>+</code>,
|
||||
<code>-</code>, <code>*</code>, <code>/</code>, <code>p</code> (only for
|
||||
numbers), register stacks, macros and comparisons. Wow, you’d think I
|
||||
could’ve done better in 2K of code.</p>
|
||||
<p>OH! I forgot to mention! It’s a <a
|
||||
href="https://en.wikipedia.org/wiki/Just-in-time_compilation">JIT</a>.</p>
|
||||
<p>Wait, don’t stop reading! I know what you’re thinking,
|
||||
platform-specific code is discouraged in IOCCC. But do you see any
|
||||
platform-specific code? There’s no assembler here! This <a
|
||||
href="https://en.wikipedia.org/wiki/Just-in-time_compilation">JIT</a>
|
||||
works on a dozen platforms, and the only platform-specific assumptions
|
||||
it makes are that the stack grows down and integers are at least
|
||||
32-bit.</p>
|
||||
<p>You will probably get warnings while compiling the code. In
|
||||
particular:</p>
|
||||
<p>This is an implementation of the classic UNIX
|
||||
<a href="https://en.wikipedia.org/wiki/Dc_(computer_program)">dc</a> command, the
|
||||
<a href="https://en.wikipedia.org/wiki/Reverse_Polish_notation">reverse Polish</a>
|
||||
calculator. Actually it’s a pretty bad implementation, since it only implements
|
||||
32-bit integers (well, <code>sizeof(int)</code>-sized integers). It only implements the
|
||||
commands <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, <code>p</code> (only for numbers), register stacks, macros and
|
||||
comparisons. Wow, you’d think I could’ve done better in 2K of code.</p>
|
||||
<p>OH! I forgot to mention! It’s a
|
||||
<a href="https://en.wikipedia.org/wiki/Just-in-time_compilation">JIT</a>.</p>
|
||||
<p>Wait, don’t stop reading! I know what you’re thinking, platform-specific code is
|
||||
discouraged in IOCCC. But do you see any platform-specific code? There’s no
|
||||
assembler here! This
|
||||
<a href="https://en.wikipedia.org/wiki/Just-in-time_compilation">JIT</a> works on a dozen
|
||||
platforms, and the only platform-specific assumptions it makes are that the
|
||||
stack grows down and integers are at least 32-bit.</p>
|
||||
<p>You will probably get warnings while compiling the code. In particular:</p>
|
||||
<ul>
|
||||
<li><p>If your system requires the inclusion of <code>alloca.h</code> to
|
||||
use alloca, use the compile flag <code>-DAH</code>.</p></li>
|
||||
<li><p>If your system cannot use <code>mmap()</code>, use the compile
|
||||
flag <code>-DNM</code>.</p></li>
|
||||
<li><p>I don’t include any headers I don’t strictly need to, so you’ll
|
||||
get warnings about (at least) <code>memcpy()</code>,
|
||||
<code>isdigit()</code>, <code>atoi()</code>, <code>calloc()</code>,
|
||||
<code>malloc()</code> and <code>alloca()</code> if you didn’t use
|
||||
<code>-DAH</code>.</p>
|
||||
<li><p>If your system requires the inclusion of <code>alloca.h</code> to use alloca, use the
|
||||
compile flag <code>-DAH</code>.</p></li>
|
||||
<li><p>If your system cannot use <code>mmap()</code>, use the compile flag <code>-DNM</code>.</p></li>
|
||||
<li><p>I don’t include any headers I don’t strictly need to, so you’ll get warnings
|
||||
about (at least) <code>memcpy()</code>, <code>isdigit()</code>, <code>atoi()</code>, <code>calloc()</code>, <code>malloc()</code>
|
||||
and <code>alloca()</code> if you didn’t use <code>-DAH</code>.</p>
|
||||
<ul>
|
||||
<li>NOTE from judges: we added these includes in 2023.</li>
|
||||
</ul></li>
|
||||
<li><p>GCC likes to complain about <code>while (a = b)</code>
|
||||
(assignments as a condition).</p></li>
|
||||
<li><p>I don’t return from <code>main()</code>, even though it’s
|
||||
declared to return <code>int</code>.</p></li>
|
||||
<li><p>GCC likes to complain about <code>while (a = b)</code> (assignments as a condition).</p></li>
|
||||
<li><p>I don’t return from <code>main()</code>, even though it’s declared to return <code>int</code>.</p></li>
|
||||
</ul>
|
||||
<p>Platforms on which all known/tested optimization levels work with no
|
||||
additional flags:</p>
|
||||
<p>Platforms on which all known/tested optimization levels work with no additional
|
||||
flags:</p>
|
||||
<ul>
|
||||
<li>gcc 4.6.2 + x86[_64] + GNU/Linux, Mac OS X or Windows</li>
|
||||
<li>clang 2.9-16 + x86[_64] + GNU/Linux or Mac OS X</li>
|
||||
<li>tcc 0.9.25</li>
|
||||
<li>gcc 4.4.5 + alpha, arm, mips[el], powerpc[64], s390x (IBM
|
||||
zSeries)</li>
|
||||
<li>gcc 4.4.5 + alpha, arm, mips[el], powerpc[64], s390x (IBM zSeries)</li>
|
||||
<li>gcc 4.1.3 + vax + NetBSD</li>
|
||||
</ul>
|
||||
<p>Platforms which work but not at all optimization levels or needing
|
||||
special flags:</p>
|
||||
<p>Platforms which work but not at all optimization levels or needing special
|
||||
flags:</p>
|
||||
<ul>
|
||||
<li>owcc 1.9 + x86 + Windows: Needs
|
||||
<code>-DNM -DAH -fno-stack-check</code></li>
|
||||
<li>gcc 4.4.5 + sh4: -O0 works, higher optimization levels don’t work
|
||||
for unknown reasons.</li>
|
||||
<li>owcc 1.9 + x86 + Windows: Needs <code>-DNM -DAH -fno-stack-check</code></li>
|
||||
<li>gcc 4.4.5 + sh4: -O0 works, higher optimization levels don’t work for unknown reasons.</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-2011richards"><a name="inventory"></a>Inventory
|
||||
for 2011/richards</h1>
|
||||
<h1 id="inventory-for-2011richards"><a name="inventory"></a>Inventory for 2011/richards</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/2011/richards/richards.c">richards.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/richards.alt.c">richards.alt.c</a>
|
||||
- alternative source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/richards.orig.c">richards.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/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/2011/richards/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_richards.tar.bz2">2011_richards.tar.bz2</a> - download
|
||||
entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/richards.c">richards.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/richards.alt.c">richards.alt.c</a> - alternative source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/richards.orig.c">richards.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/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/2011/richards/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_richards.tar.bz2">2011_richards.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/2011/richards/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/.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/2011/richards/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/.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/2011/richards/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/richards/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+100
-136
@@ -129,9 +129,9 @@
|
||||
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Oscar_Toledo">Oscar Toledo
|
||||
G.</a><br> Location: <a href="../../location.html#MX">MX</a> -
|
||||
<em>United Mexican States</em> (<em>Mexico</em>) <br><br></li>
|
||||
<li>Name: <a href="../../authors.html#Oscar_Toledo">Oscar Toledo G.</a><br>
|
||||
Location: <a href="../../location.html#MX">MX</a> - <em>United Mexican States</em> (<em>Mexico</em>)
|
||||
<br><br></li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
|
||||
@@ -142,26 +142,22 @@ G.</a><br> Location: <a href="../../location.html#MX">MX</a> -
|
||||
<h2 id="to-build">To build:</h2>
|
||||
<p>If you have X11 installed:</p>
|
||||
<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></span></code></pre></div>
|
||||
<p>There are two alternate versions, <a href="toledo.alt.c">one that
|
||||
lets you reconfigure the controls and size</a> and <a
|
||||
href="toledo.alt2.c">another that should work for Windows</a>. See <a
|
||||
href="#alternate-code">Alternate code</a> below.</p>
|
||||
<p>There are two alternate versions, <a href="toledo.alt.c">one that lets you reconfigure the
|
||||
controls and size</a> and <a href="toledo.alt2.c">another that should work for
|
||||
Windows</a>. See <a href="#alternate-code">Alternate code</a> 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">./toledo</span></span></code></pre></div>
|
||||
<h2 id="alternate-code">Alternate code:</h2>
|
||||
<p>The first alt version, <a href="toledo.alt.c">toledo.alt.c</a>,
|
||||
allows you to reconfigure the controls and the dimensions more
|
||||
easily.</p>
|
||||
<p>The second version, <a href="toledo.alt2.c">toledo.alt2.c</a>, should
|
||||
work for Windows but does not allow you to reconfigure the keys or
|
||||
dimensions. This is because it cannot be tested by us.</p>
|
||||
<p>The first alt version, <a href="toledo.alt.c">toledo.alt.c</a>, allows you to reconfigure
|
||||
the controls and the dimensions more easily.</p>
|
||||
<p>The second version, <a href="toledo.alt2.c">toledo.alt2.c</a>, should work for Windows but
|
||||
does not allow you to reconfigure the keys or dimensions. This is because it
|
||||
cannot be tested by us.</p>
|
||||
<h3 id="alternate-build">Alternate build:</h3>
|
||||
<p>For the one that lets you reconfigure the keys you will want to look
|
||||
at the included header file, <a href="keysym.h">keysym.h</a>, to find
|
||||
the correct macros. Once you have the right names you can define the
|
||||
macros <code>FIRE</code>, <code>FORWARD</code>, <code>BACKWARD</code>,
|
||||
<code>LEFT</code>, <code>RIGHT</code>, <code>WIDTH</code> and
|
||||
<code>HEIGHT</code>. Here are the defaults:</p>
|
||||
<p>For the one that lets you reconfigure the keys you will want to look at the
|
||||
included header file, <a href="keysym.h">keysym.h</a>, to find the correct macros. Once you
|
||||
have the right names you can define the macros <code>FIRE</code>, <code>FORWARD</code>, <code>BACKWARD</code>,
|
||||
<code>LEFT</code>, <code>RIGHT</code>, <code>WIDTH</code> and <code>HEIGHT</code>. Here are the defaults:</p>
|
||||
<pre><code>FIRE= XK_BackSpace:XK_Tab
|
||||
FORWARD= XK_Up:XK_w
|
||||
BACKWARD= XK_Down:XK_s
|
||||
@@ -169,26 +165,24 @@ LEFT= XK_Left:XK_a
|
||||
RIGHT= XK_Right:XK_d
|
||||
WIDTH= 512
|
||||
HEIGHT= 288</code></pre>
|
||||
<p>but you can change them about however you like, even with other keys.
|
||||
For instance to swap <code>LEFT</code> and <code>RIGHT</code>:</p>
|
||||
<p>but you can change them about however you like, even with other keys. For
|
||||
instance to swap <code>LEFT</code> and <code>RIGHT</code>:</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 LEFT=XK_Right:XK_d RIGHT=XK_Left:XK_a alt</span></code></pre></div>
|
||||
<p>but you can specify something completely else and you can pick and
|
||||
choose which controls you wish to redefine. You might also wish to
|
||||
change the dimensions of the game, <code>WIDTH</code> and
|
||||
<code>HEIGHT</code> which have an arbitrarily selected lower limit as
|
||||
<p>but you can specify something completely else and you can pick and choose which
|
||||
controls you wish to redefine. You might also wish to change the dimensions of
|
||||
the game, <code>WIDTH</code> and <code>HEIGHT</code> which have an arbitrarily selected lower limit as
|
||||
well as the default values.</p>
|
||||
<p>Observe that each of the controls are a pair in the form of
|
||||
<code>player2:player1</code> (yes, player 2 comes first!).</p>
|
||||
<p>Observe that each of the controls are a pair in the form of <code>player2:player1</code>
|
||||
(yes, player 2 comes first!).</p>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This two player game uses X11. The control keys can be configured by
|
||||
modifying the <code>A</code>, <code>B</code>, <code>C</code>,
|
||||
<code>D</code> and <code>E</code> macros at compilation.</p>
|
||||
<p>After a quick splash screen the objective should be clear. There are
|
||||
Red, Green and Cyan tanks. A larger window can be made by altering the
|
||||
source early on, right before the code gets hard to follow, or using the
|
||||
modifying the <code>A</code>, <code>B</code>, <code>C</code>, <code>D</code> and <code>E</code> macros at compilation.</p>
|
||||
<p>After a quick splash screen the objective should be clear. There
|
||||
are Red, Green and Cyan tanks. A larger window can be made by altering
|
||||
the source early on, right before the code gets hard to follow, or using the
|
||||
<a href="#alternate-code">alternate version</a>.</p>
|
||||
<p>Like Oscar’s previous winning X11 program for the 19th IOCCC, if you
|
||||
remove both the X11 include files and replace them with</p>
|
||||
<p>Like Oscar’s previous winning X11 program for the 19th IOCCC, if
|
||||
you remove both the X11 include files and replace them with</p>
|
||||
<div class="sourceCode" id="cb5"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">"layer.c"</span></span></code></pre></div>
|
||||
<p>you ought to be able to compile and run this program on Windows.
|
||||
NOTE: this is what <a href="toledo.alt2.c">toledo.alt2.c</a> is for.</p>
|
||||
@@ -200,24 +194,25 @@ NOTE: this is what <a href="toledo.alt2.c">toledo.alt2.c</a> is for.</p>
|
||||
|| || //===| || || ||=// \\=\\ ==/ |=/
|
||||
|| || || || || || || \\ || User's
|
||||
\===/ \\==// || || || \\ \==// Manual</code></pre>
|
||||
<p>This is a color X11 3D tank-game for two players, just compile and
|
||||
run it without arguments.</p>
|
||||
<p>This is a color X11 3D tank-game for two players, just compile
|
||||
and run it without arguments.</p>
|
||||
<p>You will see briefly a tank spinning before each level.</p>
|
||||
<p>The Left half of the window shows the red player view and the right
|
||||
half shows the green player view; the background will change to blue
|
||||
when the view goes inactive.</p>
|
||||
<p>The objective is to chase and destroy the other player’s tank. There
|
||||
is also an aqua tank for testing your aim and getting extra points.</p>
|
||||
half shows the green player view; the background will change to
|
||||
blue when the view goes inactive.</p>
|
||||
<p>The objective is to chase and destroy the other player’s tank.
|
||||
There is also an aqua tank for testing your aim and getting
|
||||
extra points.</p>
|
||||
<p>Caveat: You can shoot only 3 bullets at a time.<br />
|
||||
Trick: You can fire faster if they explode on anything.<br />
|
||||
Believe it or not, it has strategy!</p>
|
||||
<p>When only one tank remains on the field, the level will advance.
|
||||
Don’t forget to destroy the aqua tank.</p>
|
||||
<p>The <strike>battle</strike>playground is surrounded by mountains and
|
||||
each level is filled with random obstacles (pyramids and cubes).</p>
|
||||
<p>The bars show players energy and score; each bar shows energy and
|
||||
indicates the current player view (wider on the left). The right part
|
||||
grows with every point.</p>
|
||||
<p>The <strike>battle</strike>playground is surrounded by mountains and each level is
|
||||
filled with random obstacles (pyramids and cubes).</p>
|
||||
<p>The bars show players energy and score; each bar shows energy
|
||||
and indicates the current player view (wider on the left). The right
|
||||
part grows with every point.</p>
|
||||
<p>Keys for player 1 (lowercase):</p>
|
||||
<ul>
|
||||
<li>Tab - Fire</li>
|
||||
@@ -238,8 +233,8 @@ grows with every point.</p>
|
||||
<p>If you don’t like the keys assignment, you can change it in the
|
||||
Makefile or use the <a href="#alternate-code">alternate version</a>.</p>
|
||||
<h3 id="parental-advisory-warning">PARENTAL ADVISORY WARNING:</h3>
|
||||
<p>This game is highly violent: when the tank explodes you can see the
|
||||
little stick man blowing in parts.</p>
|
||||
<p>This game is highly violent: when the tank explodes you can
|
||||
see the little stick man blowing in parts.</p>
|
||||
<p>Not really, just kidding :D</p>
|
||||
<h3 id="platforms-tested">PLATFORMS TESTED:</h3>
|
||||
<ul>
|
||||
@@ -262,30 +257,26 @@ little stick man blowing in parts.</p>
|
||||
<li>Animated intro.</li>
|
||||
<li>It has color!</li>
|
||||
</ul>
|
||||
<h3 id="features-that-programmers-will-find-appealing">FEATURES THAT
|
||||
PROGRAMMERS WILL FIND APPEALING:</h3>
|
||||
<h3 id="features-that-programmers-will-find-appealing">FEATURES THAT PROGRAMMERS WILL FIND APPEALING:</h3>
|
||||
<ul>
|
||||
<li>Works both with 32 and 64-bit CPUs.</li>
|
||||
<li>Double buffered, portable to any X11 with 24/32-bit color.</li>
|
||||
<li>Memory-hungry as must be any 3D program; uses a 256 MB array.</li>
|
||||
<li>Total and absolute irreverent coding style, so it generates a lot of
|
||||
warnings when compiled.</li>
|
||||
<li>It can take several minutes to compile (known culprits: Fedora Core
|
||||
11-14 on x86-64 512 MB).</li>
|
||||
<li>Total and absolute irreverent coding style, so it generates a lot of warnings
|
||||
when compiled.</li>
|
||||
<li>It can take several minutes to compile (known culprits: Fedora Core 11-14 on
|
||||
x86-64 512 MB).</li>
|
||||
<li>It is written in the only true C: K&R, and no, that doesn’t mean
|
||||
Katherine & Rose.</li>
|
||||
<li>Vectorial scalable graphics: do you want a bigger viewport? Change
|
||||
variables <code>M</code> and <code>N</code> (see the <a
|
||||
href="#alternate-code">alternate code</a>).</li>
|
||||
<li>Half of the program is formatted as 3D cube. View with tabs at 8
|
||||
columns and a square font.</li>
|
||||
<li>The other half of the program is unprintable source code, so no
|
||||
typing from paper, you have to write a converter of tabs and form-feeds
|
||||
to its C escaped forms.</li>
|
||||
<li>No text, so this program can be used and understood easily in any
|
||||
country.</li>
|
||||
<li>This program is highly ecological, it sleeps when it is not doing
|
||||
anything.</li>
|
||||
<li>Vectorial scalable graphics: do you want a bigger viewport? Change variables
|
||||
<code>M</code> and <code>N</code> (see the <a href="#alternate-code">alternate code</a>).</li>
|
||||
<li>Half of the program is formatted as 3D cube. View with tabs at 8 columns and a
|
||||
square font.</li>
|
||||
<li>The other half of the program is unprintable source code, so no typing from
|
||||
paper, you have to write a converter of tabs and form-feeds to its C escaped
|
||||
forms.</li>
|
||||
<li>No text, so this program can be used and understood easily in any country.</li>
|
||||
<li>This program is highly ecological, it sleeps when it is not doing anything.</li>
|
||||
<li>Virtual world with its own physics laws.</li>
|
||||
<li>When closing the window it will show an X11 error :P</li>
|
||||
</ul>
|
||||
@@ -295,8 +286,7 @@ anything.</li>
|
||||
<li>Function arguments used as variables.</li>
|
||||
<li>Operators used freely.</li>
|
||||
<li>Pre-calculated values to save bytes.</li>
|
||||
<li>Uses the <code>+++</code>, <code>+-</code> and <code>*+</code>
|
||||
undocumented C operators :P</li>
|
||||
<li>Uses the <code>+++</code>, <code>+-</code> and <code>*+</code> undocumented C operators :P</li>
|
||||
</ul>
|
||||
<pre><code>
|
||||
....,,,,---++++++--,,..\
|
||||
@@ -321,27 +311,26 @@ undocumented C operators :P</li>
|
||||
.,-+++++,@@==
|
||||
</code></pre>
|
||||
<h3 id="the-history-of-this-program">THE HISTORY OF THIS PROGRAM:</h3>
|
||||
<p>When I started working on this program, I figured that it would be
|
||||
easy to fit on the character limit, but I missed three things: the
|
||||
enormous X11 names, the non-portable key codes and my 2 KB of
|
||||
artwork.</p>
|
||||
<p>Very hard coding did the first thing. In fact I worked out
|
||||
twenty-nine different versions and at one step I had four parallel
|
||||
versions with different characteristics removed (mountains, horizon
|
||||
lines, score/status bars and explosions) but I’ve managed to fit it all
|
||||
together!</p>
|
||||
<p>The second thing was solved using the Makefile: it is under 160 bytes
|
||||
and you get adjustable controls. The greatest mystery on the Earth is
|
||||
why X11 gives non-portable key codes to the user.</p>
|
||||
<p>And finally, the third “Thing” was growing and growing, and growing,
|
||||
eating bytes for lunch… after endless rounds of crunching I obtained
|
||||
three-hundred seventy-eight bytes of artwork and guess what? It doesn’t
|
||||
fit.</p>
|
||||
<p>So I had to integrate a decompressor based on the space, tabulators
|
||||
and other non-counted characters.</p>
|
||||
<p>The final program is composed of eight micro-functions: one is the
|
||||
core and does most of the hard work and the other functions help do the
|
||||
X11 things, explosion effects, 3D calculations and viewing.</p>
|
||||
<p>When I started working on this program, I figured that it would
|
||||
be easy to fit on the character limit, but I missed three things: the enormous
|
||||
X11 names, the non-portable key codes and my 2 KB of artwork.</p>
|
||||
<p>Very hard coding did the first thing. In fact I worked out twenty-nine different
|
||||
versions and at one step I had four parallel versions with different
|
||||
characteristics removed (mountains, horizon lines, score/status bars and
|
||||
explosions) but I’ve managed to fit it all together!</p>
|
||||
<p>The second thing was solved using the Makefile: it is under
|
||||
160 bytes and you get adjustable controls. The greatest
|
||||
mystery on the Earth is why X11 gives non-portable key codes to
|
||||
the user.</p>
|
||||
<p>And finally, the third “Thing” was growing and growing, and
|
||||
growing, eating bytes for lunch… after endless rounds of
|
||||
crunching I obtained three-hundred seventy-eight bytes of
|
||||
artwork and guess what? It doesn’t fit.</p>
|
||||
<p>So I had to integrate a decompressor based on the space, tabulators and other
|
||||
non-counted characters.</p>
|
||||
<p>The final program is composed of eight micro-functions: one is the core and does
|
||||
most of the hard work and the other functions help do the X11 things, explosion
|
||||
effects, 3D calculations and viewing.</p>
|
||||
<ul>
|
||||
<li><code>K()</code> - 3D transformation</li>
|
||||
<li><code>s()</code> - Rendering</li>
|
||||
@@ -350,71 +339,46 @@ X11 things, explosion effects, 3D calculations and viewing.</p>
|
||||
<li><code>g()</code> - Moves 3D object backward and forward</li>
|
||||
<li><code>F()</code> - Collision detection</li>
|
||||
<li><code>T()</code> - Core (also known as main loop :D)</li>
|
||||
<li><code>main()</code> - Initialization and ‘uncruncher’, what a common
|
||||
name!; C programs should start in the cool() function :).</li>
|
||||
<li><code>main()</code> - Initialization and ‘uncruncher’, what a common name!;
|
||||
C programs should start in the cool() function :).</li>
|
||||
</ul>
|
||||
<p>The source code was formatted as a cube using a specially written
|
||||
program. This program is smaller and obfuscated what is needed so the
|
||||
reformatting doesn’t exceeded the character limits. The crunched vectors
|
||||
were generated by another special program and the tank that surrounds
|
||||
this text was generated by yet another program.</p>
|
||||
<p>The source code was formatted as a cube using a specially written program. This
|
||||
program is smaller and obfuscated what is needed so the reformatting doesn’t
|
||||
exceeded the character limits. The crunched vectors were generated by another
|
||||
special program and the tank that surrounds this text was generated by yet
|
||||
another program.</p>
|
||||
<p><em>Have fun!</em></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>
|
||||
<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-2011toledo"><a name="inventory"></a>Inventory for
|
||||
2011/toledo</h1>
|
||||
<h1 id="inventory-for-2011toledo"><a name="inventory"></a>Inventory for 2011/toledo</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/2011/toledo/toledo.c">toledo.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/toledo.alt.c">toledo.alt.c</a>
|
||||
- alternative source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/toledo.alt2.c">toledo.alt2.c</a>
|
||||
- alternate alternative source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/toledo.orig.c">toledo.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/keysym.h">keysym.h</a>
|
||||
- included header file</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/layer.c">layer.c</a>
|
||||
- translation layer to make 3D Tanks game</li>
|
||||
<li><a href="2011_toledo.tar.bz2">2011_toledo.tar.bz2</a> - download
|
||||
entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/toledo.c">toledo.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/toledo.alt.c">toledo.alt.c</a> - alternative source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/toledo.alt2.c">toledo.alt2.c</a> - alternate alternative source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/toledo.orig.c">toledo.orig.c</a> - original source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/keysym.h">keysym.h</a> - included header file</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/layer.c">layer.c</a> - translation layer to make 3D Tanks game</li>
|
||||
<li><a href="2011_toledo.tar.bz2">2011_toledo.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/2011/toledo/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/.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/2011/toledo/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/.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/2011/toledo/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/toledo/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+85
-132
@@ -130,8 +130,8 @@
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Daniel_Vik">Daniel Vik</a><br>
|
||||
Location: <a href="../../location.html#US">US</a> - <em>United States of
|
||||
America</em> (<em>United States</em>) <br><br></li>
|
||||
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,72 +141,63 @@ America</em> (<em>United States</em>) <br><br></li>
|
||||
|
||||
<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></span></code></pre></div>
|
||||
<p>There is an alternate version that should work for Windows. See <a
|
||||
href="#alternate-code">alternate code</a> below.</p>
|
||||
<p>There is an alternate version that should work for Windows. See <a href="#alternate-code">alternate
|
||||
code</a> below.</p>
|
||||
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
|
||||
<p>The current status of this entry is:</p>
|
||||
<pre><code>STATUS: INABIAF - please **DO NOT** fix</code></pre>
|
||||
<p>For more detailed information see <a
|
||||
href="../../bugs.html#2011_vik">2011 vik bugs</a>.</p>
|
||||
<p>For more detailed information see <a href="../../bugs.html#2011_vik">2011 vik bugs</a>.</p>
|
||||
<h2 id="to-use">To use:</h2>
|
||||
<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">./vik</span> file.mod <span class="op">></span> audio_file.raw</span></code></pre></div>
|
||||
<p>If you have <code>mplayer(1)</code>:</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="ex">./vik</span> file.mod <span class="kw">|</span> <span class="ex">mplayer</span> <span class="at">-demuxer</span> rawaudio <span class="at">-</span></span></code></pre></div>
|
||||
<p>Alternatively, you can convert the file to a WAV:</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">./vik</span> file.mod <span class="op">></span> file.raw<span class="kw">;</span> <span class="ex">./raw2wav</span> file.raw <span class="op">></span> file.wav</span></code></pre></div>
|
||||
<p>and then play <code>file.wav</code> with a program that can play WAV
|
||||
files.</p>
|
||||
<p>and then play <code>file.wav</code> with a program that can play WAV files.</p>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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="ex">./try.sh</span></span></code></pre></div>
|
||||
<p>The script checks that you have <code>mplayer(1)</code> installed and
|
||||
if it is it will pipe <code>vik</code> to <code>mplayer</code>. In this
|
||||
case it will also use <code>raw2wav</code> to convert the file to a WAV
|
||||
file. If <code>mplayer(1)</code> cannot be found it will just use
|
||||
<code>raw2wav</code>. This way even if one has an
|
||||
<code>mplayer(1)</code> that fails or is for some reason not what is
|
||||
<p>The script checks that you have <code>mplayer(1)</code> installed and if it is it will pipe
|
||||
<code>vik</code> to <code>mplayer</code>. In this case it will also use <code>raw2wav</code> to convert the file
|
||||
to a WAV file. If <code>mplayer(1)</code> cannot be found it will just use <code>raw2wav</code>. This
|
||||
way even if one has an <code>mplayer(1)</code> that fails or is for some reason not what is
|
||||
expected they can at least play the WAV file manually.</p>
|
||||
<p>It is also possible to download a number of music module files from
|
||||
<a href="http://modarchive.org">The Mod Archive</a>.</p>
|
||||
<p>It is also possible to download a number of music module files from <a href="http://modarchive.org">The Mod
|
||||
Archive</a>.</p>
|
||||
<h2 id="alternate-code">Alternate code:</h2>
|
||||
<p>This version is based on the author’s remarks and it should work for
|
||||
Windows.</p>
|
||||
<p>This version is based on the author’s remarks and it should work for Windows.</p>
|
||||
<h3 id="alternate-build">Alternate build:</h3>
|
||||
<p>Assuming that <code>make</code> is similar enough 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="fu">make</span> alt</span></code></pre></div>
|
||||
<h3 id="alternate-use">Alternate use:</h3>
|
||||
<p>Use <code>vik.alt</code> as you would <code>vik</code> above.</p>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>This entry converts .MOD audio files to a playable stream in a most
|
||||
pleasing manner if you don’t like tremolo or vibrato.</p>
|
||||
<p>This entry converts .MOD audio files to a playable stream
|
||||
in a most pleasing manner if you don’t like tremolo or vibrato.</p>
|
||||
<p>Also it abuses the C compiler and/or assembler with a partially
|
||||
initialized 32MB array. Can you tell what that partial initialization
|
||||
for?</p>
|
||||
<p>Does it take your system a long time to compile? You may want to
|
||||
do:</p>
|
||||
initialized 32MB array. Can you tell what that partial
|
||||
initialization for?</p>
|
||||
<p>Does it take your system a long time to compile? You may want to do:</p>
|
||||
<div class="sourceCode" id="cb8"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="fu">cc</span> <span class="at">-S</span> vik.c</span></code></pre></div>
|
||||
<p>and examine the resulting assembly file <code>vik.s</code>. On some
|
||||
platforms the assembly file is about 128MB in size!</p>
|
||||
<p>NOTE: The <a href="randowan.mod">randowan.mod</a> and <a
|
||||
href="mad_world.mod">mad_world.mod</a> files were created by <a
|
||||
href="http://www.translucentboy.com">Henrik Bertilsson</a> and are
|
||||
included with his permission.</p>
|
||||
<p>and examine the resulting assembly file <code>vik.s</code>. On some platforms
|
||||
the assembly file is about 128MB in size!</p>
|
||||
<p>NOTE: The <a href="randowan.mod">randowan.mod</a> and <a href="mad_world.mod">mad_world.mod</a> files were
|
||||
created by <a href="http://www.translucentboy.com">Henrik Bertilsson</a> and are included
|
||||
with his permission.</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<h3 id="introduction">Introduction</h3>
|
||||
<p>In 1987, <a
|
||||
href="http://www.vgmpf.com/Wiki/index.php?title=Karsten_Obarski">Karsten
|
||||
Obarski</a> <a
|
||||
href="https://en.wikipedia.org/wiki/Ultimate_Soundtracker">changed the
|
||||
way</a> music was handled in games and demos with the introduction of
|
||||
the MOD file format on <a
|
||||
href="https://en.wikipedia.org/wiki/Amiga">Commodore Amiga</a></p>
|
||||
<p>A MOD file contains a set of samples, a number of patterns indicating
|
||||
how and when the samples are to be played, a list of what patterns to
|
||||
play in what order, and a number of effects.</p>
|
||||
<p>In 1987, <a href="http://www.vgmpf.com/Wiki/index.php?title=Karsten_Obarski">Karsten
|
||||
Obarski</a> <a href="https://en.wikipedia.org/wiki/Ultimate_Soundtracker">changed the
|
||||
way</a> music was handled in games and
|
||||
demos with the introduction of the MOD file format on <a href="https://en.wikipedia.org/wiki/Amiga">Commodore
|
||||
Amiga</a></p>
|
||||
<p>A MOD file contains a set of samples, a number of patterns indicating how and
|
||||
when the samples are to be played, a list of what patterns to play in what
|
||||
order, and a number of effects.</p>
|
||||
<h3 id="features">Features</h3>
|
||||
<p>This program converts MOD files created with the standard trackers
|
||||
for Amiga, e.g. Pro Tracker, Noise Tracker and Sound Tracker to raw 16
|
||||
bit 44.1kHz stereo audio. The program supports MOD music with 4, 6, and
|
||||
8 channels MOD files with up to 31 samples.</p>
|
||||
<p>This program converts MOD files created with the standard trackers for
|
||||
Amiga, e.g. Pro Tracker, Noise Tracker and Sound Tracker to raw 16 bit
|
||||
44.1kHz stereo audio. The program supports MOD music with 4, 6, and 8
|
||||
channels MOD files with up to 31 samples.</p>
|
||||
<p>The MOD format includes many effects for each audio channel and this
|
||||
program supports most of them, including:</p>
|
||||
<ul>
|
||||
@@ -222,123 +213,85 @@ program supports most of them, including:</p>
|
||||
<li>Delay pattern</li>
|
||||
<li>Set speed</li>
|
||||
</ul>
|
||||
<p>Due to size constraints tremolo and vibrato is not supported. Also,
|
||||
to avoid infinite long songs, the position jump feature is ignored.</p>
|
||||
<p>Due to size constraints tremolo and vibrato is not supported. Also, to
|
||||
avoid infinite long songs, the position jump feature is ignored.</p>
|
||||
<h3 id="songs">Songs</h3>
|
||||
<p>With his permission, the package includes two songs composed by
|
||||
Henrik Bertilsson, also known as Deelite:</p>
|
||||
<p>With his permission, the package includes two songs composed by Henrik
|
||||
Bertilsson, also known as Deelite:</p>
|
||||
<ol type="1">
|
||||
<li>Mad World</li>
|
||||
<li>Randowan</li>
|
||||
</ol>
|
||||
<h3 id="build">Build</h3>
|
||||
<p>Compiling for Unix systems (including cygwin) is straight
|
||||
forward:</p>
|
||||
<p>Compiling for Unix systems (including cygwin) is straight forward:</p>
|
||||
<div class="sourceCode" id="cb9"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="fu">gcc</span> <span class="at">-o</span> vik vik.c</span></code></pre></div>
|
||||
<h3 id="usage">Usage</h3>
|
||||
<h4 id="convert-mod-file-to-raw-44.1khz-stereo-audio-file">Convert MOD
|
||||
file to raw 44.1kHz stereo audio file</h4>
|
||||
<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">./vik</span> mad_world.mod <span class="op">></span> audio_file.raw</span></code></pre></div>
|
||||
<h4 id="listen-to-the-mod-file-streaming-to-mplayer">Listen to the MOD
|
||||
file (streaming to mplayer)</h4>
|
||||
<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">./vik</span> randowan.mod <span class="kw">|</span> <span class="ex">mplayer</span> <span class="at">-demuxer</span> rawaudio <span class="at">-</span></span></code></pre></div>
|
||||
<p>(Don’t forget the last <code>-</code> as it makes mplayer read from
|
||||
<code>stdin</code>.)</p>
|
||||
<h4 id="convert-mod-file-to-raw-44.1khz-stereo-audio-file">Convert MOD file to raw 44.1kHz stereo audio file</h4>
|
||||
<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">./vik</span> mad_world.mod <span class="op">></span> audio_file.raw</span></code></pre></div>
|
||||
<h4 id="listen-to-the-mod-file-streaming-to-mplayer">Listen to the MOD file (streaming to mplayer)</h4>
|
||||
<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">./vik</span> randowan.mod <span class="kw">|</span> <span class="ex">mplayer</span> <span class="at">-demuxer</span> rawaudio <span class="at">-</span></span></code></pre></div>
|
||||
<p>(Don’t forget the last <code>-</code> as it makes mplayer read from <code>stdin</code>.)</p>
|
||||
<h3 id="obfuscation">Obfuscation</h3>
|
||||
<p>The IOCCC rules did not put a limit on the entropy of the source
|
||||
code, and it appears that the general entropy rules don’t apply. An
|
||||
estimate is that the code density entropy of this entry is
|
||||
<code>~1.2</code> which means that there are around 2500 characters of
|
||||
code carrying information, yet there are only 2037 IOCCC characters of
|
||||
actual code. Most of the additional characters are encoded with
|
||||
non-counting characters in the frequency table. But there are also
|
||||
<code>~50</code> or so white space characters spread out through the
|
||||
source code that carry information.</p>
|
||||
<p>The use of macros certainly adds to the obfuscation but the reason
|
||||
for using them is mainly to fit as many features as possible within the
|
||||
size limits. So please excuse the use of them.</p>
|
||||
<p>Once the preprocessor is run, the code gets more interesting. The MOD
|
||||
player is basically a register based <a
|
||||
href="https://en.wikipedia.org/wiki/Finite-state_machine">state
|
||||
machine</a> and all the <a
|
||||
href="https://en.wikipedia.org/wiki/Magic_(programming)#Variants">magic</a>
|
||||
is hidden in a fog of short statements. Many of the register updates are
|
||||
conditional and the program uses the <code>?:</code> operator (sigh)
|
||||
mainly to save space, but also to leverage the comma operator and
|
||||
precedence more efficiently.</p>
|
||||
<p>The IOCCC rules did not put a limit on the entropy of the source code,
|
||||
and it appears that the general entropy rules don’t apply. An estimate
|
||||
is that the code density entropy of this entry is <code>~1.2</code> which means that
|
||||
there are around 2500 characters of code carrying information, yet there
|
||||
are only 2037 IOCCC characters of actual code. Most of the additional
|
||||
characters are encoded with non-counting characters in the frequency
|
||||
table. But there are also <code>~50</code> or so white space characters spread out
|
||||
through the source code that carry information.</p>
|
||||
<p>The use of macros certainly adds to the obfuscation but the reason for
|
||||
using them is mainly to fit as many features as possible within the size
|
||||
limits. So please excuse the use of them.</p>
|
||||
<p>Once the preprocessor is run, the code gets more interesting. The MOD player is
|
||||
basically a register based <a href="https://en.wikipedia.org/wiki/Finite-state_machine">state
|
||||
machine</a> and all the
|
||||
<a href="https://en.wikipedia.org/wiki/Magic_(programming)#Variants">magic</a> is hidden in a fog of short statements. Many of the register updates
|
||||
are conditional and the program uses the <code>?:</code> operator (sigh) mainly to save
|
||||
space, but also to leverage the comma operator and precedence more efficiently.</p>
|
||||
<h3 id="portability">Portability</h3>
|
||||
<p>The program is portable to most platforms. The only system dependency
|
||||
is that the program relies on writing binary data to
|
||||
<code>stdout</code>.</p>
|
||||
<p>Microsoft compilers adds a carriage return to newlines, and to
|
||||
compile the program with this platform, the following line can be added
|
||||
after the main declaration in order for the program to run
|
||||
correctly:</p>
|
||||
<p>The program is portable to most platforms. The only system dependency is
|
||||
that the program relies on writing binary data to <code>stdout</code>.</p>
|
||||
<p>Microsoft compilers adds a carriage return to newlines, and to compile
|
||||
the program with this platform, the following line can be added after
|
||||
the main declaration in order for the program to run correctly:</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>_setmode<span class="op">(</span>_fileno<span class="op">(</span>stdout<span class="op">),</span> <span class="bn">0x8000</span><span class="op">);</span></span></code></pre></div>
|
||||
<p>NOTE: this is what the <a href="#alternate-code">alternate
|
||||
version</a> is for.</p>
|
||||
<p>NOTE: this is what the <a href="#alternate-code">alternate version</a> is for.</p>
|
||||
<h3 id="limitations">Limitations</h3>
|
||||
<p>The program only runs when a valid MOD file is passed as argument. If
|
||||
no argument is passed, the program crashes.</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>
|
||||
<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-2011vik"><a name="inventory"></a>Inventory for
|
||||
2011/vik</h1>
|
||||
<h1 id="inventory-for-2011vik"><a name="inventory"></a>Inventory for 2011/vik</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/2011/vik/vik.c">vik.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/vik.alt.c">vik.alt.c</a>
|
||||
- alternative source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/vik.orig.c">vik.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a href="mad_world.mod">mad_world.mod</a> - 4-channel Protracker
|
||||
module sound data</li>
|
||||
<li><a href="randowan.mod">randowan.mod</a> - 4-channel Protracker
|
||||
module sound data</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/raw2wav">raw2wav</a>
|
||||
- convert raw format to wav format</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_vik.tar.bz2">2011_vik.tar.bz2</a> - download entry
|
||||
source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/vik.c">vik.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/vik.alt.c">vik.alt.c</a> - alternative source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/vik.orig.c">vik.orig.c</a> - original source</li>
|
||||
<li><a href="mad_world.mod">mad_world.mod</a> - 4-channel Protracker module sound data</li>
|
||||
<li><a href="randowan.mod">randowan.mod</a> - 4-channel Protracker module sound data</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/raw2wav">raw2wav</a> - convert raw format to wav format</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_vik.tar.bz2">2011_vik.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/2011/vik/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/.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/2011/vik/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/.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/2011/vik/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/vik/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
+101
-147
@@ -130,8 +130,8 @@
|
||||
<h2 id="author"><a name="author"></a>Author:</h2>
|
||||
<ul>
|
||||
<li>Name: <a href="../../authors.html#Matt_Zucker">Matt Zucker</a><br>
|
||||
Location: <a href="../../location.html#US">US</a> - <em>United States of
|
||||
America</em> (<em>United States</em>) <br><br></li>
|
||||
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,32 +141,28 @@ America</em> (<em>United States</em>) <br><br></li>
|
||||
|
||||
<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></span></code></pre></div>
|
||||
<p>There is an alternate version which should work for Windows which
|
||||
distinguishes binary mode from text mode. See <a
|
||||
href="#alternate-code">alternate code</a> below.</p>
|
||||
<p>There is an alternate version which should work for Windows which distinguishes
|
||||
binary mode from text mode. See <a href="#alternate-code">alternate code</a> 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">./zucker</span> <span class="op">></span> image.ppm</span></code></pre></div>
|
||||
<p>Now open <code>image.ppm</code> with your image viewer of choice.</p>
|
||||
<h2 id="try">Try:</h2>
|
||||
<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.sh</span></span></code></pre></div>
|
||||
<p>After running <code>try.sh</code>, open the PPM images
|
||||
<code>ioccc.ppm</code>, <code>hello.ppm</code> and
|
||||
<p>After running <code>try.sh</code>, open the PPM images <code>ioccc.ppm</code>, <code>hello.ppm</code> and
|
||||
<code>image2.ppm</code> with your image viewer of choice.</p>
|
||||
<h2 id="alternate-code">Alternate code:</h2>
|
||||
<p>This version uses the Windows functions <code>_setmode()</code> and
|
||||
<code>_fileno()</code> to set binary mode on <code>stdout</code> which
|
||||
the author noted would be necessary for systems that distinguish binary
|
||||
and text.</p>
|
||||
<p>This version uses the Windows functions <code>_setmode()</code> and <code>_fileno()</code> to set
|
||||
binary mode on <code>stdout</code> which the author noted would be necessary for systems
|
||||
that distinguish binary and text.</p>
|
||||
<h3 id="alternate-build">Alternate build:</h3>
|
||||
<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> alt</span></code></pre></div>
|
||||
<h3 id="alternate-use">Alternate use:</h3>
|
||||
<p>Use <code>zucker.alt</code> as you would <code>zucker</code>
|
||||
above.</p>
|
||||
<p>Use <code>zucker.alt</code> as you would <code>zucker</code> above.</p>
|
||||
<h3 id="alternate-try">Alternate try:</h3>
|
||||
<p>Try <code>zucker.alt</code> instead of <code>zucker</code> above.</p>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>The rendered image is centered and is output as a 600 by 220 pixel
|
||||
PPM. The vector font is proportional.</p>
|
||||
<p>The rendered image is centered and is output as a 600 by 220 pixel PPM.
|
||||
The vector font is proportional.</p>
|
||||
<p>This entry uses no local variables. None! At! All!</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<h3 id="an-image-generator">An image generator</h3>
|
||||
@@ -174,40 +170,32 @@ PPM. The vector font is proportional.</p>
|
||||
<p>This program makes pretty pictures. To see the default output, try
|
||||
running</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">./zucker</span> <span class="op">></span> ioccc2011.ppm</span></code></pre></div>
|
||||
<p>On the author’s 2.5 GHz MacBook Pro, this command takes approximately
|
||||
1 minute and 18 seconds to run – your runtime may vary. You will need an
|
||||
image viewer capable of displaying <a
|
||||
href="https://en.wikipedia.org/wiki/Netpbm">Netpbm images</a> in order
|
||||
to display the output. On the Mac, the system supplied
|
||||
<code>Preview.app</code> works well; otherwise <a
|
||||
href="http://www.imagemagick.org/">ImageMagick</a> and/or <a
|
||||
href="http://www.graphicsmagick.org/">GraphicsMagick</a> are both
|
||||
capable of displaying Netpbm files, and are available on multiple
|
||||
platforms.</p>
|
||||
<p>On the author’s 2.5 GHz MacBook Pro, this command takes approximately 1 minute
|
||||
and 18 seconds to run – your runtime may vary. You will need an image viewer
|
||||
capable of displaying <a href="https://en.wikipedia.org/wiki/Netpbm">Netpbm images</a> in
|
||||
order to display the output. On the Mac, the system supplied <code>Preview.app</code> works
|
||||
well; otherwise <a href="http://www.imagemagick.org/">ImageMagick</a> and/or
|
||||
<a href="http://www.graphicsmagick.org/">GraphicsMagick</a> are both capable of displaying
|
||||
Netpbm files, and are available on multiple platforms.</p>
|
||||
<p>With macOS you can type at the command line:</p>
|
||||
<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="ex">open</span> ioccc2021.ppm</span></code></pre></div>
|
||||
<p>and it will open image in the default application Preview.app.</p>
|
||||
<p>To use ImageMagick you might do something like:</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">convert</span> ioccc2011.ppm ioccc2011.png</span></code></pre></div>
|
||||
<p>and then open <code>ioccc2011.png</code> in your viewer of
|
||||
choice.</p>
|
||||
<p>and then open <code>ioccc2011.png</code> in your viewer of choice.</p>
|
||||
<p>To use GraphicsMagick you might do something like:</p>
|
||||
<div class="sourceCode" id="cb8"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="ex">gm</span> convert ioccc2011.ppm ioccc2011.png</span></code></pre></div>
|
||||
<p>and then open <code>ioccc2011.png</code> in your viewer of
|
||||
choice.</p>
|
||||
<p>and then open <code>ioccc2011.png</code> in your viewer of choice.</p>
|
||||
<p>Aside from the default image, you may create your own by running the
|
||||
program as follows:</p>
|
||||
<div class="sourceCode" id="cb9"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./zucker</span> <span class="st">"your text"</span> <span class="op">></span> image.ppm</span></code></pre></div>
|
||||
<p>To mitigate long runtime, the program can be invoked in a “preview”
|
||||
mode by appending <code>-preview</code> to the command line arguments,
|
||||
like so:</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">./zucker</span> faster<span class="dt">\!</span> <span class="at">-preview</span> <span class="op">></span> image.ppm</span></code></pre></div>
|
||||
<p>If your platform distinguishes between binary and text streams, you
|
||||
may need to insert some code to reopen standard output in binary mode at
|
||||
the start of <code>main()</code> (the provided <a
|
||||
href="#alternate-code">alternate version</a> will set binary mode on
|
||||
<code>stdout</code> in Windows). An ASCII platform is assumed.</p>
|
||||
mode by appending <code>-preview</code> to the command line arguments, like so:</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">./zucker</span> faster<span class="dt">\!</span> <span class="at">-preview</span> <span class="op">></span> image.ppm</span></code></pre></div>
|
||||
<p>If your platform distinguishes between binary and text streams, you may need to
|
||||
insert some code to reopen standard output in binary mode at the start of
|
||||
<code>main()</code> (the provided <a href="#alternate-code">alternate version</a> will set binary mode
|
||||
on <code>stdout</code> in Windows). An ASCII platform is assumed.</p>
|
||||
<h4 id="pedagogical-value">Pedagogical value:</h4>
|
||||
<p>This program is quite suitable for the inexperienced programmer, due
|
||||
to a number of considerations:</p>
|
||||
@@ -216,142 +204,108 @@ to a number of considerations:</p>
|
||||
lines of source.</p></li>
|
||||
<li><p>It compiles cleanly as ANSI C under gcc 4.2.1 with very strict
|
||||
compilation flags.</p></li>
|
||||
<li><p>It uses a very small subset of the keywords available in C,
|
||||
namely <code>char</code>, <code>float</code>, <code>int</code>,
|
||||
<code>typedef</code>, <code>struct</code>, <code>for</code>, and
|
||||
<code>return</code>. More difficult concepts such as <code>void</code>,
|
||||
<code>if</code>, <code>switch</code>, and <code>while</code> are
|
||||
eschewed for simplicity’s sake.</p></li>
|
||||
<li><p>It also uses a very small number of library functions: just
|
||||
<code>putchar(3)</code>, <code>cos(3)</code>, <code>sin(3)</code>,
|
||||
<code>atan2(3)</code>, <code>sqrt(3)</code>, and
|
||||
<code>pow(3)</code>.</p></li>
|
||||
<li><p>It uses a very small subset of the keywords available in C, namely
|
||||
<code>char</code>, <code>float</code>, <code>int</code>, <code>typedef</code>, <code>struct</code>, <code>for</code>, and <code>return</code>.
|
||||
More difficult concepts such as <code>void</code>, <code>if</code>, <code>switch</code>, and
|
||||
<code>while</code> are eschewed for simplicity’s sake.</p></li>
|
||||
<li><p>It also uses a very small number of library functions: just <code>putchar(3)</code>,
|
||||
<code>cos(3)</code>, <code>sin(3)</code>, <code>atan2(3)</code>, <code>sqrt(3)</code>, and <code>pow(3)</code>.</p></li>
|
||||
<li><p>New programmers often prefer to use global variables when
|
||||
possible. Hence, <em>all</em> variables in this program (aside from
|
||||
function parameters) have global scope.</p></li>
|
||||
<li><p>An important aspect of the computation is graphically illustrated
|
||||
by the source code itself: the geometric construction of a reflection
|
||||
ray at an object’s surface, given the incoming direction and surface
|
||||
normal.</p></li>
|
||||
by the source code itself: the geometric construction of a
|
||||
reflection ray at an object’s surface, given the incoming
|
||||
direction and surface normal.</p></li>
|
||||
</ul>
|
||||
<h4 id="further-details-contains-spoilers">Further details (contains
|
||||
spoilers):</h4>
|
||||
<p>The program is not quite a traditional <a
|
||||
href="https://en.wikipedia.org/wiki/Ray_tracing_(graphics)">ray
|
||||
tracer</a>, but a “<a href="sphere-tracing.pdf">sphere tracer</a>” which
|
||||
uses distance fields to encode proximity to objects in the scene. Using
|
||||
sphere tracing to compute visibility instead of analytic ray tracing
|
||||
provides two advantages: first, it greatly eases the computation of <a
|
||||
href="https://en.wikipedia.org/wiki/Toric_lens#Torus">ray-torus</a>
|
||||
intersection (which would otherwise require solving a quartic
|
||||
polynomial), and second, it makes it possible to compute <a
|
||||
href="https://en.wikipedia.org/wiki/Ambient_occlusion">ambient
|
||||
occlusion</a> (which is used to generate soft shadows). Unlike many
|
||||
traditional ray tracers and sphere tracers, this one uses iteration
|
||||
instead of recursion to compute the effect of reflections. This,
|
||||
unfortunately, resulted in the programmer going insane; however, program
|
||||
size was reduced and readability hindered. Neither the plaintext for the
|
||||
program’s default output nor for the Netpbm header appears in the
|
||||
program source, which hinders readability as well. Also, unlike some
|
||||
previous IOCCC entries which render ASCII text, this one uses a vector
|
||||
(as opposed to raster) font. Although the program does not generate
|
||||
uppercase letters, it handles them in a reasonable manner when they
|
||||
appear in the input.</p>
|
||||
<h4 id="further-details-contains-spoilers">Further details (contains spoilers):</h4>
|
||||
<p>The program is not quite a traditional <a href="https://en.wikipedia.org/wiki/Ray_tracing_(graphics)">ray
|
||||
tracer</a>, but a “<a href="sphere-tracing.pdf">sphere
|
||||
tracer</a>” which uses distance fields to encode proximity to
|
||||
objects in the scene. Using sphere tracing to compute visibility instead of
|
||||
analytic ray tracing provides two advantages: first, it greatly eases the
|
||||
computation of <a href="https://en.wikipedia.org/wiki/Toric_lens#Torus">ray-torus</a>
|
||||
intersection (which would otherwise require solving a quartic polynomial), and
|
||||
second, it makes it possible to compute <a href="https://en.wikipedia.org/wiki/Ambient_occlusion">ambient
|
||||
occlusion</a> (which is used to
|
||||
generate soft shadows). Unlike many traditional ray tracers and sphere tracers,
|
||||
this one uses iteration instead of recursion to compute the effect of
|
||||
reflections. This, unfortunately, resulted in the programmer going insane;
|
||||
however, program size was reduced and readability hindered. Neither the
|
||||
plaintext for the program’s default output nor for the Netpbm header appears in
|
||||
the program source, which hinders readability as well. Also, unlike some
|
||||
previous IOCCC entries which render ASCII text, this one uses a vector (as
|
||||
opposed to raster) font. Although the program does not generate uppercase
|
||||
letters, it handles them in a reasonable manner when they appear in the input.</p>
|
||||
<p>Even when the program is pretty-printed and preprocessor macros are
|
||||
translated, it should be fairly resistant to analysis due to reckless
|
||||
reuse of global variables, the inherently opaque nature of the math, and
|
||||
its overall density. Global variables are used to store the results of
|
||||
intermediate computation. As a result, seemingly simple functions have
|
||||
important side effects. Although some of the global variables are simply
|
||||
constants, their use is overloaded. For instance, the variable
|
||||
<code>X</code> is used both as the number <code>40</code> and as the
|
||||
ASCII character <code>'('</code>. Maintainability is hindered due to
|
||||
hardcoding several aspects of the program in multiple locations. As an
|
||||
example, it is impossible to modify either the image width or height
|
||||
without changing the source in at least three different places,
|
||||
including inside the large string literal <code>J</code>.</p>
|
||||
reuse of global variables, the inherently opaque nature of the
|
||||
math, and its overall density. Global variables are used to store
|
||||
the results of intermediate computation. As a result, seemingly simple
|
||||
functions have important side effects. Although some of the global
|
||||
variables are simply constants, their use is overloaded. For instance,
|
||||
the variable <code>X</code> is used both as the number <code>40</code> and as the ASCII
|
||||
character <code>'('</code>. Maintainability is hindered due to hardcoding
|
||||
several aspects of the program in multiple locations. As an example,
|
||||
it is impossible to modify either the image width or height without
|
||||
changing the source in at least three different places, including
|
||||
inside the large string literal <code>J</code>.</p>
|
||||
<p>Some of the functions are simple vector algebraic operations such as
|
||||
vector construction, dot product, and normalization. However, it was
|
||||
found to be much more compact to define a single operation for
|
||||
multiply-and-add rather than to have separate functions for addition,
|
||||
subtraction, and scaling. Again, compactness led to obfuscation.</p>
|
||||
<p>This program heavily abuses <code>for</code> loops. The comma
|
||||
operator is used to get as much mileage as possible out of statements
|
||||
inside of loop declarations. Between <code>for</code> loops, the comma
|
||||
operator, and the ternary operator, it was possible to avoid
|
||||
<code>if</code> and <code>while</code> altogether.</p>
|
||||
<p>Bitwise and arithmetic operators are used instead of logical
|
||||
operators whenever gcc doesn’t warn about it. Conversely, integer
|
||||
multiplication, division, and modulus are sometimes used in place of
|
||||
traditional bitwise operators just to keep the reader on his or her
|
||||
toes. Automatic casting between characters, integers, and floats is
|
||||
performed just about everywhere. Fascinatingly, this doesn’t seem to
|
||||
affect performance too badly. Sometimes when an explicit cast (i.e. from
|
||||
<code>float</code> to <code>int</code>) is needed, the program instead
|
||||
simply assigns to a free variable of the desired type instead. Both the
|
||||
<code>array[index]</code> and <code>index[array]</code> notations are
|
||||
used interchangeably throughout the program.</p>
|
||||
<p>Two other programs were written to support development of this
|
||||
program. The first used a randomized search algorithm to deduce the most
|
||||
compact encoding of the vector font instructions into ASCII; the second
|
||||
used a modified form of the <a
|
||||
href="https://en.wikipedia.org/wiki/Line_wrap_and_word_wrap">Knuth-Plass</a>
|
||||
algorithm to layout the final text on top of a hand-generated ASCII
|
||||
“stencil”. The programs were not submitted as entries for this year’s
|
||||
IOCCC, not because they lack obfuscation, but because neither is written
|
||||
in C (they are in C++ and Python, respectively).</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>
|
||||
<p>This program heavily abuses <code>for</code> loops. The comma operator is used to
|
||||
get as much mileage as possible out of statements inside of loop
|
||||
declarations. Between <code>for</code> loops, the comma operator, and the ternary
|
||||
operator, it was possible to avoid <code>if</code> and <code>while</code> altogether.</p>
|
||||
<p>Bitwise and arithmetic operators are used instead of logical operators whenever
|
||||
gcc doesn’t warn about it. Conversely, integer multiplication, division, and
|
||||
modulus are sometimes used in place of traditional bitwise operators just to
|
||||
keep the reader on his or her toes. Automatic casting between characters,
|
||||
integers, and floats is performed just about everywhere. Fascinatingly, this
|
||||
doesn’t seem to affect performance too badly. Sometimes when an explicit cast
|
||||
(i.e. from <code>float</code> to <code>int</code>) is needed, the program instead simply assigns to a
|
||||
free variable of the desired type instead. Both the <code>array[index]</code> and
|
||||
<code>index[array]</code> notations are used interchangeably throughout the program.</p>
|
||||
<p>Two other programs were written to support development of this program. The
|
||||
first used a randomized search algorithm to deduce the most compact encoding of
|
||||
the vector font instructions into ASCII; the second used a modified form of the
|
||||
<a href="https://en.wikipedia.org/wiki/Line_wrap_and_word_wrap">Knuth-Plass</a> algorithm
|
||||
to layout the final text on top of a hand-generated ASCII “stencil”. The
|
||||
programs were not submitted as entries for this year’s IOCCC, not because they
|
||||
lack obfuscation, but because neither is written in C (they are in C++ and
|
||||
Python, respectively).</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-2011zucker"><a name="inventory"></a>Inventory for
|
||||
2011/zucker</h1>
|
||||
<h1 id="inventory-for-2011zucker"><a name="inventory"></a>Inventory for 2011/zucker</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/2011/zucker/zucker.c">zucker.c</a>
|
||||
- entry source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/Makefile">Makefile</a>
|
||||
- entry Makefile</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/zucker.alt.c">zucker.alt.c</a>
|
||||
- alternative source</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/zucker.orig.c">zucker.orig.c</a>
|
||||
- original source</li>
|
||||
<li><a href="sphere-tracing.pdf">sphere-tracing.pdf</a> - research paper
|
||||
on antialiased ray tracing</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/try.sh">try.sh</a>
|
||||
- how to run</li>
|
||||
<li><a href="2011_zucker.tar.bz2">2011_zucker.tar.bz2</a> - download
|
||||
entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/zucker.c">zucker.c</a> - entry source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/Makefile">Makefile</a> - entry Makefile</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/zucker.alt.c">zucker.alt.c</a> - alternative source</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/zucker.orig.c">zucker.orig.c</a> - original source</li>
|
||||
<li><a href="sphere-tracing.pdf">sphere-tracing.pdf</a> - research paper on antialiased ray tracing</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/try.sh">try.sh</a> - how to run</li>
|
||||
<li><a href="2011_zucker.tar.bz2">2011_zucker.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/2011/zucker/.entry.json">.entry.json</a>
|
||||
- description of entry in JSON</li>
|
||||
<li><a
|
||||
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/.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/2011/zucker/.entry.json">.entry.json</a> - description of entry in JSON</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/.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/2011/zucker/README.md">README.md</a>
|
||||
- markdown source for index.html</li>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/zucker/README.md">README.md</a> - markdown source for index.html</li>
|
||||
</ul>
|
||||
|
||||
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
|
||||
|
||||
Reference in new issue
Block a user