force use of pandoc version >= 3.1.12.2

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

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

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

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

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

No files matched your search

+133 -183
View File
@@ -129,10 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Anonymous_2001">Anonymous
2001</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#Anonymous_2001">Anonymous 2001</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 -->
@@ -142,113 +141,97 @@
<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>The programs that this program is supposed to act on, <a
href="anonymous.ten.c">anonymous.ten.c</a> and <a
href="anonymous.bed.c">anonymous.bed.c</a>, compiled with
<code>make</code>, MUST be compiled as 32-bit ELF binaries. In the case
that this fails these programs will be compiled as 64-bit binaries as
alternate code, <code>anonymous.ten.alt</code> and
<code>anonymous.bed.alt</code>, ELF or otherwise. However trying to use
the entry on these files will fail. See <a
href="#alternate-code">Alternate code</a> below for information on how
to compile these programs as 64-bit binaries (or whatever your system
will compile them as).</p>
<p>The programs that this program is supposed to act on,
<a href="anonymous.ten.c">anonymous.ten.c</a> and <a href="anonymous.bed.c">anonymous.bed.c</a>,
compiled with <code>make</code>, MUST be compiled as 32-bit ELF binaries. In the case that
this fails these programs will be compiled as 64-bit binaries as alternate code,
<code>anonymous.ten.alt</code> and <code>anonymous.bed.alt</code>, ELF or otherwise. However trying to
use the entry on these files will fail. See <a href="#alternate-code">Alternate code</a>
below for information on how to compile these programs as 64-bit binaries (or
whatever your system will compile them as).</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#2001_anonymous">2001 anonymous bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_anonymous">2001 anonymous 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">./anonymous</span> x86_program</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>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="ex">./anonymous</span> anonymous.bed <span class="co"># if able to compile as a 32-bit (-m32) ELF binary</span></span></code></pre></div>
<p>NOTE: if the 32-bit version cannot be compiled the script will at
least compile <a href="anonymous.ten.c">anonymous.ten</a> as a 64-bit
program (or whatever your system is set to) and run it directly.</p>
<p>What happens if the x86 program has already been modified by this
program? The judges’ remarks below might give you a hint!</p>
<p>What happens if you try it on another file like <a
href="anonymous.c">anonymous.c</a>? Can you recompile it okay? What if
you run it on <code>anonymous</code> itself? Can you run the program
successfully after it without recompiling?</p>
<p>NOTE: if the 32-bit version cannot be compiled the script will at least compile
<a href="anonymous.ten.c">anonymous.ten</a> as a 64-bit program (or whatever your system is
set to) and run it directly.</p>
<p>What happens if the x86 program has already been modified by this program? The
judges’ remarks below might give you a hint!</p>
<p>What happens if you try it on another file like <a href="anonymous.c">anonymous.c</a>? Can
you recompile it okay? What if you run it on <code>anonymous</code> itself? Can you run the
program successfully after it without recompiling?</p>
<h2 id="alternate-code">Alternate code:</h2>
<p>In the case you you wish to manually compile the extra programs as
64-bit code you may do so. Using the entry on these binaries will very
likely crash the program or do something terribly wrong like
slaughtering all the <a
href="https://www.glyphweb.com/arda/e/elves.html">elves</a> of <a
href="https://www.glyphweb.com/arda/i/imladris.php">Imladris</a>! :-) so
please don’t do that :-(</p>
<p>In the case you you wish to manually compile the extra programs as 64-bit code
you may do so. Using the entry on these binaries will very likely crash the
program or do something terribly wrong like slaughtering all the
<a href="https://www.glyphweb.com/arda/e/elves.html">elves</a> of
<a href="https://www.glyphweb.com/arda/i/imladris.php">Imladris</a>! :-) so please don’t do
that :-(</p>
<h3 id="alternate-build">Alternate build:</h3>
<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="fu">make</span> alt</span></code></pre></div>
<h3 id="alternate-use">Alternate use:</h3>
<div class="sourceCode" id="cb6"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./anonymous.ten.alt</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a><span class="ex">./anonymous.bed.alt</span></span></code></pre></div>
<h3 id="a-2023-note-about-the-warning-from-the-author">A 2023 note about
the warning from the author:</h3>
<p>The author suggested that this <em>might</em> somewhat destroy the
binaries this touches but after the fix of 2023 this was not observed
(yet?). It does indeed modify the files (though not all files are
modified: can you figure out why that is?) but using them after did not
result in any problems. It could be that it’s no longer known exactly
what is supposed to happen and possibly that the modification might not
be entirely correct for that reason though it does appear to be
correct.</p>
<p>It appears that the corruption happens only if the modification fails
in the middle of doing so so that might be why it hasn’t been
observed.</p>
<h3 id="a-2023-note-about-the-warning-from-the-author">A 2023 note about the warning from the author:</h3>
<p>The author suggested that this <em>might</em> somewhat destroy the binaries this
touches but after the fix of 2023 this was not observed (yet?). It does indeed
modify the files (though not all files are modified: can you figure out why that
is?) but using them after did not result in any problems. It could be that it’s
no longer known exactly what is supposed to happen and possibly that the
modification might not be entirely correct for that reason though it does appear
to be correct.</p>
<p>It appears that the corruption happens only if the modification fails in the
middle of doing so so that might be why it hasn’t been observed.</p>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>Is emulation the sincerest form of flattery? This small program does
quite a lot of bit twiddling.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>This program is an optimizing dynamic binary translator, allowing you
to run x86 programs on any machine (x86 or otherwise).</p>
<p>I have included a simple <a
href="https://www.bbc.co.uk/teach/school-radio/nursery-rhymes-ten-green-bottles/zncyt39">10
Green Bottles</a> <a href="anonymous.ten.c">program</a> (try
<code>make anonymous.ten</code>), meant to be compiled as a 32-bit ELF
binary.</p>
<p>The program <code>anonymous.ten</code>, and its source (dull) are
included as data files.</p>
<p>This program is an optimizing dynamic binary translator, allowing you to
run x86 programs on any machine (x86 or otherwise).</p>
<p>I have included a simple <a href="https://www.bbc.co.uk/teach/school-radio/nursery-rhymes-ten-green-bottles/zncyt39">10 Green
Bottles</a>
<a href="anonymous.ten.c">program</a> (try <code>make anonymous.ten</code>), meant to be compiled as a
32-bit ELF binary.</p>
<p>The program <code>anonymous.ten</code>, and its source (dull) are included as data
files.</p>
<h3 id="warning">Warning</h3>
<p>Note that the translator screws around with the binary you run on it
and <em>might</em> corrupt the binary to some extent and in so doing
might leave any program you run on it unusable.</p>
<p>The build script should give an example command to compile the
program.</p>
<p>Note that the translator screws around with the binary you run on it and <em>might</em>
corrupt the binary to some extent and in so doing might leave any program you
run on it unusable.</p>
<p>The build script should give an example command to compile the program.</p>
<h3 id="features">Features</h3>
<p><a href="https://en.wikipedia.org/wiki/Basic_block">Basic Block</a>
<a href="https://en.wikipedia.org/wiki/Cache_(computing)">Cache</a>:
Rather than translating each instruction individually the dynamic binary
translator generates a translation for an entire basic block of subject
code. Having translated a block once, the target code generated will be
stored for the duration that the program is running, so as a program
runs its performance will improve, as it hits cached blocks. This can be
clearly observed in the example program, <a
href="anonymous.ten.c">anonymous.ten</a> which must be compiled as a
32-bit ELF binary.</p>
<a href="https://en.wikipedia.org/wiki/Cache_(computing)">Cache</a>: Rather than
translating each instruction individually the dynamic binary translator
generates a translation for an entire basic block of subject code. Having
translated a block once, the target code generated will be stored for the
duration that the program is running, so as a program runs its performance will
improve, as it hits cached blocks. This can be clearly observed in the example
program, <a href="anonymous.ten.c">anonymous.ten</a> which must be compiled as a 32-bit ELF
binary.</p>
<h3 id="target-library-linking">Target Library Linking:</h3>
<p>The program runs <a
href="https://en.wikipedia.org/wiki/Dynamic_linker">dynamically
linked</a> <a
href="https://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF
binaries</a>, and when the subject program attempts to make a call to a
standard <a
href="https://en.wikipedia.org/wiki/Library_(computing)">library</a>,
the translator attempts to make an appropriate call to the native system
libraries on the target machine. This involves mangling between
different calling conventions, etc.</p>
<h3 id="automatic-endian-detectionreversal">Automatic Endian
Detection/Reversal:</h3>
<p>There are various problems raised when attempting to run little <a
href="https://en.wikipedia.org/wiki/Endianness">endian</a> <a
href="https://en.wikipedia.org/wiki/X86">x86</a> code on a big endian
chip, such as a <a href="https://en.wikipedia.org/wiki/PowerPC">PPC</a>.
These problems are dealt with in a manner that is entirely transparent
to the user.</p>
<p>The program runs <a href="https://en.wikipedia.org/wiki/Dynamic_linker">dynamically
linked</a> <a href="https://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF
binaries</a>, and
when the subject program attempts to make a call to a standard
<a href="https://en.wikipedia.org/wiki/Library_(computing)">library</a>, the translator
attempts to make an appropriate call to the native system libraries on the
target machine. This involves mangling between different calling conventions,
etc.</p>
<h3 id="automatic-endian-detectionreversal">Automatic Endian Detection/Reversal:</h3>
<p>There are various problems raised when attempting to run little
<a href="https://en.wikipedia.org/wiki/Endianness">endian</a>
<a href="https://en.wikipedia.org/wiki/X86">x86</a> code on a big endian chip, such as a
<a href="https://en.wikipedia.org/wiki/PowerPC">PPC</a>. These problems are dealt
with in a manner that is entirely transparent to the user.</p>
<h3 id="configuration">Configuration:</h3>
<h4 id="warnings">Warnings:</h4>
<p>By default the build script should compile the program with a set of
@@ -257,126 +240,93 @@ switches such that while compiling the program it generates one error
compiler errors while it is running (yes, the program can generate
compiler errors while it is running). If you do not wish to see this
error, or if the program generates any further error when compiled using
your C compiler please remove the <code>-Dwarning='-Dprocessor'</code>
line and the <code>$$warning</code> from the compiler invocation.</p>
your C compiler please remove the <code>-Dwarning='-Dprocessor'</code> line and the
<code>$$warning</code> from the compiler invocation.</p>
<h3 id="optimization">Optimization</h3>
<p>The build script contains a <code>-O1</code> switch for the compiler.
Increasing the optimization level will make the program run
<em>slower</em>, while compiling the program without any optimization
will allow it to run <em>faster</em>.</p>
<p>The build script contains a <code>-O1</code> switch for the compiler. Increasing
the optimization level will make the program run <em>slower</em>, while
compiling the program without any optimization will allow it to run
<em>faster</em>.</p>
<h3 id="obfuscation">Obfuscation</h3>
<p>The most obvious part of the obfuscation is probably the mess of
<code>#define</code>s at the top. This may seem a somewhat tired old
obfuscation - however since many of these macros are (sometimes only)
used by the program once it has dynamically recompiled itself, they are
only referenced within the source code from within strings - and
therefore the macros cannot be expanded. Furthermore, some of these
strings of code are not given as strings, but instead are wrapped up in
macros that use the <code>#</code> preprocessor operator to turn them
into strings. In the hope of throwing off a few C beautifiers the macro
to generate the strings is not contained within the source code but
instead is passed in on the command line.</p>
<p>The most obvious part of the obfuscation is probably the mess of <code>#define</code>s at the
top. This may seem a somewhat tired old obfuscation - however since many of
these macros are (sometimes only) used by the program once it has dynamically
recompiled itself, they are only referenced within the source code from within
strings - and therefore the macros cannot be expanded. Furthermore, some of
these strings of code are not given as strings, but instead are wrapped up in
macros that use the <code>#</code> preprocessor operator to turn them into strings. In the
hope of throwing off a few C beautifiers the macro to generate the strings is
not contained within the source code but instead is passed in on the command
line.</p>
<p>Buried under all this, and the fact that the entire program is just a
call to <code>exit(3)</code>, there are some nice subtle little
obfuscations. For example, you may notice that there are a couple of
macros that use the <code>##</code> preprocessor operator to build pairs
of functions. One of these macros is used to build pairs of functions of
which only one has local variables which shadow global variables: so one
modifies the global state, and the other doesn’t.</p>
<p>There is also quite a nice trick where I wave a magic wand, and a
chunk of code which should only be run when the program is run for the
first time (setting the <a
href="https://en.wikipedia.org/wiki/Program_counter">PC / IP</a> to
point at <code>main()</code> etc.) gets turned into a
<strike>frog</strike>string. The C compiler sees a string by itself in
the code, thinks “yup, that’s a valid C expression”, and quietly moves
call to <code>exit(3)</code>, there are some nice subtle little obfuscations. For
example, you may notice that there are a couple of macros that use the
<code>##</code> preprocessor operator to build pairs of functions. One of these
macros is used to build pairs of functions of which only one has
local variables which shadow global variables: so one modifies the
global state, and the other doesn’t.</p>
<p>There is also quite a nice trick where I wave a magic wand, and a chunk of code
which should only be run when the program is run for the first time (setting the
<a href="https://en.wikipedia.org/wiki/Program_counter">PC / IP</a> to point at <code>main()</code>
etc.) gets turned into a <strike>frog</strike>string. The C compiler sees a string by
itself in the code, thinks “yup, that’s a valid C expression”, and quietly moves
on to the next line of code.</p>
<h3 id="limitations">Limitations</h3>
<p>Due to space limitations only a handful of instructions are
supported; these instructions which are supported are supported in
somewhat non-conventional ways: chunks of the architecture (e.g. flags)
are just ignored, the ELF <a
href="https://en.wikipedia.org/wiki/Loader_(computing)">loader</a> does
not really load the <a
href="https://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF
binary</a>, the target <a
href="https://en.wikipedia.org/wiki/Linker_(computing)">library
linking</a> can only pass up to 3 parameters to the target library
function, etc.</p>
<p>Due to space limitations only a handful of instructions are supported; these
instructions which are supported are supported in somewhat non-conventional
ways: chunks of the architecture (e.g. flags) are just ignored, the ELF
<a href="https://en.wikipedia.org/wiki/Loader_(computing)">loader</a> does not really load
the <a href="https://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF binary</a>,
the target <a href="https://en.wikipedia.org/wiki/Linker_(computing)">library linking</a>
can only pass up to 3 parameters to the target library function, etc.</p>
<p>In short, please consider this a full disclaimer for any bug that may
turn up - yes the program is unsafe, but it’s pretty cool anyway.</p>
<p>Despite all this, the translator is not exclusively limited to
running the <a href="anonymous.ten.c">anonymous.ten</a> program. Other
trivial <strong><em>x86</em></strong> programs may run on the translator
- and I have successfully run a wide range of “Hello World” programs,
including one of last year’s IOCCC entries, <a
href="../../2000/tomx/tomx.c">tomx</a>.</p>
<p>Despite all this, the translator is not exclusively limited to running the
<a href="anonymous.ten.c">anonymous.ten</a> program. Other trivial <strong><em>x86</em></strong> programs may
run on the translator - and I have successfully run a wide range of “Hello
World” programs, including one of last year’s IOCCC entries,
<a href="../../2000/tomx/tomx.c">tomx</a>.</p>
<h3 id="complete-program">Complete Program</h3>
<p>The fact that the program makes calls to <code>system(3)</code> and
<code>execv(3)</code> may imply that it is not a complete program in its
own right, as it relies on other programs. The call to
<code>system(3)</code> is a call to ask gcc to recompile the translator
with a new set of switches, and the call to <code>execv(3)</code> asks
for the newly compiled program to be executed. I would point out that
almost every other entry to this competition also require a C compiler
(well, the published winning entries at any rate, and I recognize that a
few don’t). There is little real difference between this program and one
like last year’s entry <a href="../../2000/dhyang/dhyang.c">dhyang</a>;
both are just C programs that generate C code as their output.</p>
<p>The fact that the program makes calls to <code>system(3)</code> and <code>execv(3)</code> may imply that
it is not a complete program in its own right, as it relies on other programs.
The call to <code>system(3)</code> is a call to ask gcc to recompile the translator with a
new set of switches, and the call to <code>execv(3)</code> asks for the newly compiled
program to be executed. I would point out that almost every other entry to this
competition also require a C compiler (well, the published winning entries at any rate,
and I recognize that a few don’t). There is little real difference between this
program and one like last year’s entry <a href="../../2000/dhyang/dhyang.c">dhyang</a>; both are
just C programs that generate C code as their output.</p>
<p>Enjoy and thanks!</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-2001anonymous"><a name="inventory"></a>Inventory
for 2001/anonymous</h1>
<h1 id="inventory-for-2001anonymous"><a name="inventory"></a>Inventory for 2001/anonymous</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/2001/anonymous/anonymous.c">anonymous.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/anonymous.orig.c">anonymous.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/anonymous.bed.c">anonymous.bed.c</a>
- roll over song C source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/anonymous.ten.c">anonymous.ten.c</a>
- green bottles song C source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/try.sh">try.sh</a>
- how to run</li>
<li><a href="2001_anonymous.tar.bz2">2001_anonymous.tar.bz2</a> -
download entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/anonymous.c">anonymous.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/anonymous.orig.c">anonymous.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/anonymous.bed.c">anonymous.bed.c</a> - roll over song C source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/anonymous.ten.c">anonymous.ten.c</a> - green bottles song C source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/try.sh">try.sh</a> - how to run</li>
<li><a href="2001_anonymous.tar.bz2">2001_anonymous.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/2001/anonymous/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/.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/2001/anonymous/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/.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/2001/anonymous/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/anonymous/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+73 -111
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Fabrice_Bellard">Fabrice
Bellard</a><br> Location: <a href="../../location.html#FR">FR</a> -
<em>French Republic</em> (<em>France</em>) <br><br></li>
<li>Name: <a href="../../authors.html#Fabrice_Bellard">Fabrice Bellard</a><br>
Location: <a href="../../location.html#FR">FR</a> - <em>French Republic</em> (<em>France</em>)
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -145,8 +145,7 @@ Bellard</a><br> Location: <a href="../../location.html#FR">FR</a> -
<p>The current status of this entry is:</p>
<pre><code>STATUS: INABIAF - please **DO NOT** fix
STATUS: doesn&#39;t work with some platforms - please help us fix</code></pre>
<p>For more detailed information see <a
href="../../bugs.html#2001_bellard">2001 bellard bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_bellard">2001 bellard 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">./bellard</span> file</span></code></pre></div>
<h2 id="try">Try:</h2>
@@ -154,18 +153,17 @@ href="../../bugs.html#2001_bellard">2001 bellard bugs</a>.</p>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p><code>&lt;JUDGES_COMMENTS&gt;</code> :-)</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p><code>OTCC</code> is an Obfuscated Tiny C Compiler for i386-linux. It
generates FAST! i386 32 bit code (no bytecode) and it is powerful enough
to compile itself. <code>OTCC</code> supports a strict subset of C. This
subset is compilable by a standard ANSI C compiler. <code>OTCC</code>
compiles, assembles, links and runs C code without the need of any other
<p><code>OTCC</code> is an Obfuscated Tiny C Compiler for i386-linux. It generates
FAST! i386 32 bit code (no bytecode) and it is powerful enough to
compile itself. <code>OTCC</code> supports a strict subset of C. This subset is
compilable by a standard ANSI C compiler. <code>OTCC</code> compiles,
assembles, links and runs C code without the need of any other
program.</p>
<p>You can use it by typing:</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">./bellard</span> bellard.c <span class="pp">[</span><span class="ss">args</span><span class="pp">]</span>...</span></code></pre></div>
<p>or by giving the C source to its standard input.</p>
<p><code>args</code> are given to the <code>main()</code> function of
<code>bellard.c</code> (<code>argv[0]</code> is <a
href="bellard.c">bellard.c</a>).</p>
<p><code>args</code> are given to the <code>main()</code> function of <code>bellard.c</code> (<code>argv[0]</code> is
<a href="bellard.c">bellard.c</a>).</p>
<h3 id="examples">Examples:</h3>
<ul>
<li>Sample compilation and execution:</li>
@@ -179,67 +177,53 @@ href="bellard.c">bellard.c</a>).</p>
<li>Self compilation iterated…</li>
</ul>
<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">./bellard</span> bellard.c bellard.c bellard.otccex.c 10</span></code></pre></div>
<p>An alternate syntax is to use it as a script interpreter: you can put
<code>#!/usr/local/bin/otcc</code> at the beginning of your C source if
<p>An alternate syntax is to use it as a script interpreter: you can
put <code>#!/usr/local/bin/otcc</code> at the beginning of your C source if
you installed <code>otcc</code> at this place.</p>
<h3
id="supported-c-language-subset-read-joint-example-bellard.otccex.c-to-have-an-introduction-to-otcc-dialect">Supported
C language subset (read joint example <a
href="bellard.otccex.c">bellard.otccex.c</a> to have an introduction to
<code>OTCC</code> dialect)</h3>
<h3 id="supported-c-language-subset-read-joint-example-bellard.otccex.c-to-have-an-introduction-to-otcc-dialect">Supported C language subset (read joint example <a href="bellard.otccex.c">bellard.otccex.c</a> to have an introduction to <code>OTCC</code> dialect)</h3>
<h4 id="expressions">Expressions:</h4>
<ul>
<li><p>binary operators, in decreasing precedence order: <code>*</code>
<code>/</code> <code>%</code>, <code>+</code> <code>-</code>,
<code>&gt;&gt;</code> <code>&lt;&lt;</code>, <code>&lt;</code>
<code>&lt;=</code> <code>&gt;</code> <code>&gt;=</code>, <code>==</code>
<code>!=</code>, <code>&amp;</code>, <code>^</code>, <code>|</code>,
<code>=</code>, <code>&amp;&amp;</code>, <code>||</code>.</p></li>
<li><p><code>&amp;&amp;</code> and <code>||</code> have the same
semantics as in C: left to right evaluation and early exit
(short-circuited).</p></li>
<li><p>binary operators, in decreasing precedence order: <code>*</code> <code>/</code> <code>%</code>,
<code>+</code> <code>-</code>, <code>&gt;&gt;</code> <code>&lt;&lt;</code>, <code>&lt;</code> <code>&lt;=</code> <code>&gt;</code> <code>&gt;=</code>, <code>==</code> <code>!=</code>, <code>&amp;</code>,
<code>^</code>, <code>|</code>, <code>=</code>, <code>&amp;&amp;</code>, <code>||</code>.</p></li>
<li><p><code>&amp;&amp;</code> and <code>||</code> have the same semantics as in C: left to right
evaluation and early exit (short-circuited).</p></li>
<li><p>Parenthesis are supported.</p></li>
<li><p>Unary operators: <code>&amp;</code>, <code>*</code> (pointer
indirection), <code>-</code> (negation), <code>+</code>, <code>!</code>,
<code>~</code>, postfix <code>++</code> and <code>--</code>.</p></li>
<li><p>Pointer indirection (<code>*</code>) only works with explicit
cast to <code>char *</code>, <code>int *</code> or
<code>int (*)()</code> (function pointer).</p></li>
<li><p><code>++</code>, <code>--</code>, and unary <code>&amp;</code>
can only be used with variable lvalue (left value).</p></li>
<li><p><code>=</code> can only be used with variable or <code>*</code>
(pointer indirection) lvalue.</p></li>
<li><p>Function calls are supported <em>with standard
<strong>i386</strong> calling convention</em>. Function pointers are
supported <em>with explicit cast</em>. Functions can be used before
being declared.</p></li>
<li><p>Types: only signed integer (<code>int</code>) variables and
functions can be declared. Variables cannot be initialized in
<li><p>Unary operators: <code>&amp;</code>, <code>*</code> (pointer indirection), <code>-</code>
(negation), <code>+</code>, <code>!</code>, <code>~</code>, postfix <code>++</code> and <code>--</code>.</p></li>
<li><p>Pointer indirection (<code>*</code>) only works with explicit cast to
<code>char *</code>, <code>int *</code> or <code>int (*)()</code> (function pointer).</p></li>
<li><p><code>++</code>, <code>--</code>, and unary <code>&amp;</code> can only be used with variable
lvalue (left value).</p></li>
<li><p><code>=</code> can only be used with variable or <code>*</code> (pointer
indirection) lvalue.</p></li>
<li><p>Function calls are supported <em>with standard <strong>i386</strong> calling
convention</em>. Function pointers are supported <em>with explicit
cast</em>. Functions can be used before being declared.</p></li>
<li><p>Types: only signed integer (<code>int</code>) variables and functions can
be declared. Variables cannot be initialized in
declarations. <em>Only old K&amp;R function declarations are parsed
(implicit integer return value and no types on arguments)</em>.</p></li>
<li><p>Any function or variable from the libc can be used because
<code>OTCC</code> uses the libc dynamic linker to resolve undefined
symbols.</p></li>
<li><p>Instructions: blocks (<code>{</code> <code>}</code>) are
supported as in C. <code>if</code> and <code>else</code> can be used for
tests. The <code>while</code> and <code>for</code> C loops are
supported. <code>break</code> can be used to exit loops.
<code>return</code> is used for the return value of a function.</p></li>
<li><p>Any function or variable from the libc can be used because <code>OTCC</code>
uses the libc dynamic linker to resolve undefined symbols.</p></li>
<li><p>Instructions: blocks (<code>{</code> <code>}</code>) are supported as in C. <code>if</code> and
<code>else</code> can be used for tests. The <code>while</code> and <code>for</code> C loops are supported.
<code>break</code> can be used to exit loops. <code>return</code> is used for the return value of a
function.</p></li>
<li><p>Identifiers are parsed the same way as C. Local variables are
handled, but there is no local name space (not a problem if different
names are used for local and global variables).</p></li>
<li><p>Numbers can be entered in decimal, hexadecimal (<code>0x</code>
or <code>0X</code> prefix), or octal (<code>0</code> prefix).</p></li>
<li><p><code>#define</code> is supported without function like
arguments. <em>No macro recursion is tolerated</em>; <em>other
preprocessor directives are ignored</em>.</p></li>
<li><p>C Strings and C character constants are supported. Only
<code>\n</code>, <code>\"</code>, <code>\'</code> and <code>\\</code>
escapes are recognized.</p></li>
handled, but there is no local name space (not a problem if
different names are used for local and global variables).</p></li>
<li><p>Numbers can be entered in decimal, hexadecimal (<code>0x</code> or <code>0X</code>
prefix), or octal (<code>0</code> prefix).</p></li>
<li><p><code>#define</code> is supported without function like arguments. <em>No macro
recursion is tolerated</em>; <em>other preprocessor directives are
ignored</em>.</p></li>
<li><p>C Strings and C character constants are supported. Only <code>\n</code>,
<code>\"</code>, <code>\'</code> and <code>\\</code> escapes are recognized.</p></li>
<li><p>C Comments can be used (but no C++ comments).</p></li>
<li><p>No error is displayed if an incorrect program is given.</p></li>
<li><p>Memory: the code, data, and symbol sizes are limited to 100KB (it
can be changed in the source code).</p></li>
<li><p>Memory: the code, data, and symbol sizes are limited to 100KB
(it can be changed in the source code).</p></li>
</ul>
<h3 id="obfuscation">Obfuscation:</h3>
<p>No special effort was needed because obfuscation is almost
@@ -247,68 +231,46 @@ unavoidable for such a program :-) <code>#define</code>s must be used to
compress the code, and integrated i386 code generator leads to non
obvious code.</p>
<h3 id="portability">Portability:</h3>
<p><code>OTCC</code> only works on i386 linux because it generates i386
code. <code>OTCC</code> also relies on little endianness, unaligned
memory accesses and ASCII representation of characters. It also supposes
that no valid pointers are less than 512. If all those constraints are
met, then <code>OTCC</code> could be theoretically used to “cross
compile”, although no such support is currently integrated.</p>
<p><code>OTCC</code> only works on i386 linux because it generates i386 code. <code>OTCC</code>
also relies on little endianness, unaligned memory accesses and
ASCII representation of characters. It also supposes that no valid
pointers are less than 512. If all those constraints are met, then
<code>OTCC</code> could be theoretically used to “cross compile”, although no
such support is currently integrated.</p>
<p>It was successfully compiled with gcc version 2.95.2. You get some
warnings because old K&amp;R prototypes are used, some casts are
implicit and some functions are used before being defined.
<code>OTCC</code> uses the dynamic linker to resolve symbols with
<code>dlsym(3)</code>, so <code>-ldl</code> must be used when you
compile and link it.</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>
warnings because old K&amp;R prototypes are used, some casts are implicit
and some functions are used before being defined. <code>OTCC</code> uses the
dynamic linker to resolve symbols with <code>dlsym(3)</code>, so <code>-ldl</code> must
be used when you compile and link it.</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-2001bellard"><a name="inventory"></a>Inventory for
2001/bellard</h1>
<h1 id="inventory-for-2001bellard"><a name="inventory"></a>Inventory for 2001/bellard</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/2001/bellard/bellard.c">bellard.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/bellard.orig.c">bellard.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/bellard.otccex.c">bellard.otccex.c</a>
- example otcc source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/otccelf.c">otccelf.c</a>
- another example otcc source</li>
<li><a href="2001_bellard.tar.bz2">2001_bellard.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/bellard.c">bellard.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/bellard.orig.c">bellard.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/bellard.otccex.c">bellard.otccex.c</a> - example otcc source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/otccelf.c">otccelf.c</a> - another example otcc source</li>
<li><a href="2001_bellard.tar.bz2">2001_bellard.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/2001/bellard/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/.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/2001/bellard/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/.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/2001/bellard/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/bellard/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+35 -63
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Raymond_Cheong">Raymond
Cheong</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#Raymond_Cheong">Raymond Cheong</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 -->
@@ -148,23 +148,21 @@ Cheong</a><br> Location: <a href="../../location.html#US">US</a> -
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>Be sure to give an even number of digits in the argument. Add a
leading 0 if needed.</p>
<p>The source code is nice, compact, and self documenting as all good
programs should be! :-)</p>
<p>The source code is nice, compact, and self documenting
as all good programs should be! :-)</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<h3 id="operation">Operation</h3>
<p>Compile normally and run with one argument, an integer with 2n
digits. Program will return the integer part of its square root
(n-digits). For example,</p>
<p>Compile normally and run with one argument, an integer with 2n digits.
Program will return the integer part of its square root (n-digits).
For example,</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">$</span> cc <span class="at">-o</span> cheong cheong.c</span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="ex">$</span> ./cheong 1234567890</span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="ex">35136</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="ex">$</span> ./cheong 0200000000000000000000000000</span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="ex">14142135623730</span></span></code></pre></div>
<p>Deviation from these instructions will cause undefined results.
:-)</p>
<p>Deviation from these instructions will cause undefined results. :-)</p>
<h3 id="portability">Portability</h3>
<p>This program runs normally on any ANSI C compiler and is ASCII
dependent.</p>
<p>This program runs normally on any ANSI C compiler and is ASCII dependent.</p>
<p>Strict compiling gives just one unavoidable warning:</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="fu">gcc</span> <span class="at">-ansi</span> <span class="at">-Wall</span> cheong.c</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="ex">cheong.c:3:</span> warning: third argument of <span class="kw">`</span><span class="ex">main</span><span class="st">&#39; should probably be `char **&#39;</span></span></code></pre></div>
@@ -173,86 +171,60 @@ dependent.</p>
sometimes known as the longhand method. The basic algorithm is itself
obfuscated in that it only uses subtraction to calculate square roots.
For a detailed explanation, check Google or see Jack Crenshaw’s article
at <a
href="https://web.archive.org/web/20011215124349/http://www.embedded.com/98/9802fe2.htm"
class="uri">https://web.archive.org/web/20011215124349/http://www.embedded.com/98/9802fe2.htm</a>.</p>
<p>This program uses an even more obscured version which includes the
following:</p>
at
<a href="https://web.archive.org/web/20011215124349/http://www.embedded.com/98/9802fe2.htm" class="uri">https://web.archive.org/web/20011215124349/http://www.embedded.com/98/9802fe2.htm</a>.</p>
<p>This program uses an even more obscured version which includes the following:</p>
<ul>
<li>A single string is used to store two numbers of different
lengths</li>
<li>A single string is used to store two numbers of different lengths</li>
<li>Operations are done in a weird hybrid of base 10 and base 20</li>
<li>Subtraction is done addition style, i.e. <code>4 - 8</code> equals
<code>6</code> carry a <code>-1</code></li>
<li>Subtraction is done addition style, i.e. <code>4 - 8</code> equals <code>6</code> carry a <code>-1</code></li>
<li>Recursive calls to <code>main()</code></li>
</ul>
<h4 id="minor-obfuscations">Minor obfuscations:</h4>
<ul>
<li>Self documenting whitespace in rectangular code block, for fun and
glory (view with fixed-width font)</li>
<li>Integer constants adjusted to less meaningful values, just for added
confusion</li>
<li>Self documenting whitespace in rectangular code block, for fun and glory (view
with fixed-width font)</li>
<li>Integer constants adjusted to less meaningful values, just for added confusion</li>
<li>Hard-to-read, meaningless variable names to spite the reader</li>
</ul>
<h4 id="challenges-for-the-masses">Challenges for the masses:</h4>
<ul>
<li>What are the meanings [sic, plural] of the variable
<code>o</code>?</li>
<li>Why is <code>(c+999)%10-(D[I]+92)%10</code> not equivalent to
<code>(c-D[I]+7)%10</code>?</li>
<li>What are the meanings [sic, plural] of the variable <code>o</code>?</li>
<li>Why is <code>(c+999)%10-(D[I]+92)%10</code> not equivalent to <code>(c-D[I]+7)%10</code>?</li>
<li>How does the program terminate?</li>
<li>Is the programmer sane? ;-)</li>
</ul>
<h3 id="appreciation">Appreciation</h3>
<p>Thanks goes out to Bobby Rohde for numerous suggestions on how to
shorten the program.</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>Thanks goes out to Bobby Rohde for numerous suggestions on how to shorten
the program.</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-2001cheong"><a name="inventory"></a>Inventory for
2001/cheong</h1>
<h1 id="inventory-for-2001cheong"><a name="inventory"></a>Inventory for 2001/cheong</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/2001/cheong/cheong.c">cheong.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/cheong.orig.c">cheong.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/try.sh">try.sh</a>
- how to run</li>
<li><a href="2001_cheong.tar.bz2">2001_cheong.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/cheong.c">cheong.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/cheong.orig.c">cheong.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/try.sh">try.sh</a> - how to run</li>
<li><a href="2001_cheong.tar.bz2">2001_cheong.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/2001/cheong/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/.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/2001/cheong/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/.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/2001/cheong/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/cheong/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+72 -99
View File
@@ -129,10 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a
href="../../authors.html#Pierre-Philippe_Coupard">Pierre-Philippe
Coupard</a><br> Location: <a href="../../location.html#ZZ">ZZ</a> -
<em>Unknown location</em> <br><br></li>
<li>Name: <a href="../../authors.html#Pierre-Philippe_Coupard">Pierre-Philippe Coupard</a><br>
Location: <a href="../../location.html#ZZ">ZZ</a> - <em>Unknown location</em>
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -148,27 +147,26 @@ Coupard</a><br> Location: <a href="../../location.html#ZZ">ZZ</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>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>You may need to run this a few times to understand exactly what is
being said. You might even need to look somewhere on your desktop, your
arm or the wall for confirmation.</p>
being said. You might even need to look somewhere on your desktop,
your arm or the wall for confirmation.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>Past years’ IOCCC entries do many marvellous things in small
packages, such as console utilities, games, math, languages or even X
<p>Past years’ IOCCC entries do many marvellous things in small packages,
such as console utilities, games, math, languages or even X
applications. But they all have one thing in common (despite being hard
to read obviously): when they interact with the user, they only
<em>display</em> things, i.e. they display either text or drawings.</p>
<p>So, for a change, this program titillates the sense of hearing
instead of sight: this program is a self-contained speech synthesizer
that tells the current time through the computer’s sound card - in just
under 2 Kb of source code !</p>
<p>In the 2001 IOCCC <a href="../../2001/rules.txt">rules</a> and <a
href="../../2001/guidelines.txt">guidelines</a> documents, there is no
mention of what is or isn’t acceptable regarding audio I/O, but it is
mentioned that hardware-specific and/or non-portable programs are not
welcome. So, in order to do audio and satisfy those requirements, the
format required by <code>/dev/audio</code> has been chosen:
<code>/dev/audio</code> is a rather ancient fixed-format audio interface
that is supported by the majority of Unices that can do sound, as a
lowest-denominator sound I/O interface.</p>
<p>So, for a change, this program titillates the sense of hearing instead
of sight: this program is a self-contained speech synthesizer that
tells the current time through the computer’s sound card - in just under
2 Kb of source code !</p>
<p>In the 2001 IOCCC <a href="../../2001/rules.txt">rules</a> and
<a href="../../2001/guidelines.txt">guidelines</a> documents, there is no mention of
what is or isn’t acceptable regarding audio I/O, but it is mentioned
that hardware-specific and/or non-portable programs are not welcome. So,
in order to do audio and satisfy those requirements, the format required
by <code>/dev/audio</code> has been chosen: <code>/dev/audio</code> is a rather ancient
fixed-format audio interface that is supported by the majority of Unices
that can do sound, as a lowest-denominator sound I/O interface.</p>
<h3 id="program-usage">Program usage</h3>
<p>To listen to what the program says directly, invoke</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">./coupard</span> <span class="op">&gt;</span> /dev/audio</span></code></pre></div>
@@ -177,40 +175,36 @@ lowest-denominator sound I/O interface.</p>
<p>The time is HH hours MM minutes SS seconds</p>
</blockquote>
<p>in military time (24 hours). Of course, you need to have permissions
to write to <code>/dev/audio</code>, have your sound card enabled, the
volume up, the speakers connected … :-)</p>
<p>If you want to convert the audio output of the program into another
audio format, you can pipe it to <a
href="https://en.wikipedia.org/wiki/SoX">SoX</a> for example
(<code>sox</code> is the Swiss army knife of Unix audio tools). The
command:</p>
to write to <code>/dev/audio</code>, have your sound card enabled, the volume up,
the speakers connected … :-)</p>
<p>If you want to convert the audio output of the program into another audio
format, you can pipe it to <a href="https://en.wikipedia.org/wiki/SoX">SoX</a> for example
(<code>sox</code> is the Swiss army knife of Unix audio tools). The command:</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">./coupard</span> <span class="kw">|</span> <span class="fu">sox</span> <span class="at">-c1</span> <span class="at">-r8000</span> <span class="at">-tub</span> <span class="at">-</span> <span class="at">-c2</span> <span class="at">-r44100</span> <span class="at">-twav</span> test.wav</span></code></pre></div>
<p>converts the output of the program into a 44.1KHz stereo .WAV file
and saves it into <code>test.wav</code>.</p>
<p>converts the output of the program into a 44.1KHz stereo .WAV
file and saves it into <code>test.wav</code>.</p>
<p>The output format of the program is 8KHz, unsigned 8-bit samples.</p>
<p>NOTE: the program’s return code is meaningless.</p>
<h3 id="audio-quality">Audio quality</h3>
<p>The quality of the sound produced by the program is cross between a
<a
href="https://en.wikipedia.org/wiki/Tin_can_telephone">yogurt-pot-and-string
telephone</a> and a bad <a
href="https://en.wikipedia.org/wiki/Phonograph">gramophone</a>, i.e. the
S/N ratio is very low and the signal’s top frequency is very low as
well. This is because the audio is stored internally at a sampling rate
of 4KHz (the <a
href="https://en.wikipedia.org/wiki/Nyquist_frequency">Nyquist
frequency</a> is only 2KHz) with only 4-bit samples (adding 24db of
quantization noise to an already poor signal).</p>
<a href="https://en.wikipedia.org/wiki/Tin_can_telephone">yogurt-pot-and-string
telephone</a> and a bad
<a href="https://en.wikipedia.org/wiki/Phonograph">gramophone</a>, i.e. the S/N ratio is
very low and the signal’s top frequency is very low as well. This is because
the audio is stored internally at a sampling rate of 4KHz (the <a href="https://en.wikipedia.org/wiki/Nyquist_frequency">Nyquist
frequency</a> is only 2KHz) with
only 4-bit samples (adding 24db of quantization noise to an already poor
signal).</p>
<p>In short, you might have to listen twice to understand what the
program is saying. 2048 bytes including the sound generation program
doesn’t leave much room for audio quality ;-)</p>
<h3 id="speech-generation">Speech generation</h3>
<p>Only 9 phonemes are used to generate the speech. Beside the limited
number of words the program has to generate (66 words), the low sound
quality is actually exploited to take liberties with certain consonants
(for example, <code>s</code> and <code>f</code> sound very much the same
at 4KHz, so they can be merged into one phoneme). Because the <a
href="https://en.wikipedia.org/wiki/Psychoacoustics">psychoacoustic</a>
quality is actually exploited to take liberties with certain
consonants (for example, <code>s</code> and <code>f</code> sound very much the same at 4KHz,
so they can be merged into one phoneme). Because the
<a href="https://en.wikipedia.org/wiki/Psychoacoustics">psychoacoustic</a>
context around those phonemes is just sufficient, the words can be
interpreted correctly most of the time despite the fact that they are
pronounced quite wrongly.</p>
@@ -220,78 +214,57 @@ externally.</p>
<h3 id="data-compression">Data compression</h3>
<p>Even at 4KHz / 4 bits, the weight of all the phoneme samples and the
word-to-phonemes table put together is over 1600 bytes, which is well
over 2048 bytes when encoded in a C string made of printable characters.
Therefore, a compression method was needed that’s both efficient and
with a decompressor that is implementable in the shortest amount of code
possible. GSM compression is very good, but needs large psychoacoustic
tables to regenerate the original signal. Raw FFT spectral compression
is efficient too, but the decompression code can’t be made small
enough.</p>
over 2048 bytes when encoded in a C string made of printable
characters. Therefore, a compression method was needed that’s both
efficient and with a decompressor that is implementable in the
shortest amount of code possible. GSM compression is very good, but
needs large psychoacoustic tables to regenerate the original
signal. Raw FFT spectral compression is efficient too, but the
decompression code can’t be made small enough.</p>
<p>The best compression compromise was found using a simple Huffman
compressor, and encoding the compressed data by blocks of 13 bits in
pairs of printable ASCII characters: the raw data is compressed to 8465
bits, and the resulting C string is therefore about 1300 characters,
which leaves just enough room for the decompressor with a hard-coded
Huffman tree, and the code that plays the phonemes in the right
order.</p>
<h3 id="note-on-compiler-warnings-and-lint">Note on compiler warnings
and lint</h3>
<p>The program should build with <code>gcc -Wall -Werror -ansi</code>.
If the <code>-pedantic</code> flag is used, gcc will complain about the
length of the data string and the sign of its type, and also the fact
that <code>main()</code> returns with no value. The confusion with the
sign of the char type doesn’t matter with the data string because it’s
composed only of printable characters under 127.</p>
<p>When linting the program with <code>lclint</code>, it complains about
a huge list of things that, if corrected to make lint happy, would
probably double the size of the source code.</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>
pairs of printable ASCII characters: the raw data is compressed to
8465 bits, and the resulting C string is therefore about 1300
characters, which leaves just enough room for the decompressor with a
hard-coded Huffman tree, and the code that plays the phonemes in the
right order.</p>
<h3 id="note-on-compiler-warnings-and-lint">Note on compiler warnings and lint</h3>
<p>The program should build with <code>gcc -Wall -Werror -ansi</code>. If the <code>-pedantic</code>
flag is used, gcc will complain about the length of the data string and the sign
of its type, and also the fact that <code>main()</code> returns with no value. The
confusion with the sign of the char type doesn’t matter with the data string
because it’s composed only of printable characters under 127.</p>
<p>When linting the program with <code>lclint</code>, it complains about a huge list
of things that, if corrected to make lint happy, would probably double
the size of the source code.</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-2001coupard"><a name="inventory"></a>Inventory for
2001/coupard</h1>
<h1 id="inventory-for-2001coupard"><a name="inventory"></a>Inventory for 2001/coupard</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/2001/coupard/coupard.c">coupard.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/coupard.orig.c">coupard.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/try.sh">try.sh</a>
- how to run</li>
<li><a href="2001_coupard.tar.bz2">2001_coupard.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/coupard.c">coupard.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/coupard.orig.c">coupard.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/try.sh">try.sh</a> - how to run</li>
<li><a href="2001_coupard.tar.bz2">2001_coupard.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/2001/coupard/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/.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/2001/coupard/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/.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/2001/coupard/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/coupard/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+34 -57
View File
@@ -130,8 +130,8 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Chris_King">Chris King</a><br>
Location: <a href="../../location.html#ZZ">ZZ</a> - <em>Unknown
location</em> <br><br></li>
Location: <a href="../../location.html#ZZ">ZZ</a> - <em>Unknown location</em>
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -141,86 +141,63 @@ location</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 with vi(m) key movements. See <a
href="#alternate%20code">alternate code</a> below.</p>
<p>There is an alternate version with vi(m) key movements. See <a href="#alternate%20code">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">./ctk</span></span></code></pre></div>
<h2 id="alternate-code">Alternate code:</h2>
<p>This alternate version adds to the movement keys <code>l</code> for
right, <code>h</code> for left and <code>k</code> for straight.</p>
<p>This alternate version adds to the movement keys <code>l</code> for right, <code>h</code> for left and
<code>k</code> for straight.</p>
<h3 id="alternate-build">Alternate build:</h3>
<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="fu">make</span> alt</span></code></pre></div>
<h3 id="alternate-use">Alternate use:</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="ex">./ctk.alt</span></span></code></pre></div>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>No matter how careful you are, this guy eventually crashes. Most
people can make at least one successful road trip without crashing.</p>
<p>No matter how careful you are, this guy eventually crashes. Most people
can make at least one successful road trip without crashing.</p>
<p>This is, of course, another of the retro games.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>This is a game based on an <a
href="https://en.wikipedia.org/wiki/Apple_II_series">Apple II</a> <a
href="https://en.wikipedia.org/wiki/The_Print_Shop">Print Shop
Companion</a> <a
href="https://en.wikipedia.org/wiki/Easter_egg_(media)#In_computing">Easter
egg</a> named ‘DRIVER’, in which the goal is to drive as fast as you can
down a long twisty highway without running off the road. Use
<code>,./</code>, <code>[ ]</code>, or <code>bnm</code> to go left,
straight, and right respectively. Use <code>1234</code> to switch gears.
<code>q</code> quits. The faster you go and the thinner the road is, the
more points you get. Most of the obfuscation is in the nonsensical if
statements among other things. It works best on the Linux console: you
get engine sound (!) and the * Lock keyboard lights tell you what gear
you’re in (none lit=4th). The <code>q</code> argument (no leading
<code>-</code>) will silence the sound. It won’t work on a terminal
smaller than 80x24, but it works fine with more (try it in an XTerm with
the “Unreadable” font and the window maximized vertically!).</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 is a game based on an <a href="https://en.wikipedia.org/wiki/Apple_II_series">Apple
II</a> <a href="https://en.wikipedia.org/wiki/The_Print_Shop">Print Shop
Companion</a> <a href="https://en.wikipedia.org/wiki/Easter_egg_(media)#In_computing">Easter egg</a> named
‘DRIVER’, in which the goal is to drive as fast as you can down a long twisty
highway without running off the road. Use <code>,./</code>, <code>[ ]</code>, or <code>bnm</code> to go left,
straight, and right respectively. Use <code>1234</code> to switch gears. <code>q</code> quits. The
faster you go and the thinner the road is, the more points you get. Most of the
obfuscation is in the nonsensical if statements among other things. It works
best on the Linux console: you get engine sound (!) and the * Lock keyboard
lights tell you what gear you’re in (none lit=4th). The <code>q</code> argument (no
leading <code>-</code>) will silence the sound. It won’t work on a terminal smaller than
80x24, but it works fine with more (try it in an XTerm with the “Unreadable”
font and the window maximized vertically!).</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-2001ctk"><a name="inventory"></a>Inventory for
2001/ctk</h1>
<h1 id="inventory-for-2001ctk"><a name="inventory"></a>Inventory for 2001/ctk</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/2001/ctk/ctk.c">ctk.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/ctk.alt.c">ctk.alt.c</a>
- alternative source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/ctk.orig.c">ctk.orig.c</a>
- original source</li>
<li><a href="2001_ctk.tar.bz2">2001_ctk.tar.bz2</a> - download entry
source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/ctk.c">ctk.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/ctk.alt.c">ctk.alt.c</a> - alternative source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/ctk.orig.c">ctk.orig.c</a> - original source</li>
<li><a href="2001_ctk.tar.bz2">2001_ctk.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/2001/ctk/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/.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/2001/ctk/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/.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/2001/ctk/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ctk/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+122 -163
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Doug_Beardsley">Doug
Beardsley</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#Doug_Beardsley">Doug Beardsley</a><br>
Location: <a href="../../location.html#US">US</a> - <em>United States of America</em> (<em>United States</em>)
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -141,50 +141,46 @@ Beardsley</a><br> Location: <a href="../../location.html#US">US</a> -
<h2 id="to-build">To build:</h2>
<div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">make</span></span></code></pre></div>
<p>There is an alternate version based on the author’s remarks. See <a
href="#alternate-code">alternate code</a> below for more details.</p>
<p>There is an alternate version based on the author’s remarks. See <a href="#alternate-code">alternate
code</a> below for more details.</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#2001_dgbeards">2001 dgbeards bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_dgbeards">2001 dgbeards 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">./dgbeards</span></span></code></pre></div>
<h2 id="alternate-code">Alternate code:</h2>
<p>The author provided a way to speed it up a bit and also how to make
it so it doesn’t crash on losing. The idea that it crashes on losing was
too good to lose but this alternate version has the former change. If
you wish to remove this you can look at the author’s remarks and make
the change.</p>
<p>The author provided a way to speed it up a bit and also how to make it so it
doesn’t crash on losing. The idea that it crashes on losing was too good to
lose but this alternate version has the former change. If you wish to remove
this you can look at the author’s remarks and make the change.</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>
<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">./dgbeards.alt</span></span></code></pre></div>
<h2 id="try">Try:</h2>
<p>See if you can figure out how to make the computer always lose (‘win’
:-) ). It’s a very simple thing to do. Read the author’s remarks for
clues.</p>
<p>See if you can figure out how to make the computer always lose (‘win’ :-) ).
It’s a very simple thing to do. Read the author’s remarks for clues.</p>
<p>This game crashes if it loses.</p>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>This is probably the worst AI we’ve ever seen. So, then, why did the
entry win? Because it’s <em>trying</em> to lose.</p>
<p>This is probably the worst AI we’ve ever seen. So, then, why did
the entry win? Because it’s <em>trying</em> to lose.</p>
<p>This is also one of the first chess games we’ve seen.</p>
<p>Of particular interest is the author’s decision that the program
should crash if it loses. I’ve played chess with a lot of people like
that, and I appreciate the realism.</p>
<p>BTW: if your goal is to lose and you do does that mean you win? :-)
What does winning mean in a game you’re supposed to lose at?</p>
<p>Of particular interest is the author’s decision that the program should
crash if it loses. I’ve played chess with a lot of people like that, and
I appreciate the realism.</p>
<p>BTW: if your goal is to lose and you do does that mean you win? :-) What does
winning mean in a game you’re supposed to lose at?</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<h3 id="faq">FAQ</h3>
<h4 id="q-what-does-this-program-do">Q: What does this program do?</h4>
<p>A: It lets the user play two player or single player games of <a
href="https://en.wikipedia.org/wiki/Losing_chess">suicide chess</a>.
Suicide Chess (also known as Losing Chess) is a variant of normal chess.
It is played on the same board and uses the same pieces. Here is a list
of the differences:</p>
<p>A: It lets the user play two player or single player games of <a href="https://en.wikipedia.org/wiki/Losing_chess">suicide
chess</a>. Suicide Chess (also known as
Losing Chess) is a variant of normal chess. It is played on the same board and
uses the same pieces. Here is a list of the differences:</p>
<ol type="1">
<li><p>The object of the game is to get to a position where you have no
legal moves. This is usually accomplished by losing all of your pieces.
<li><p>The object of the game is to get to a position where you have no legal
moves. This is usually accomplished by losing all of your pieces.
Sometimes, the game can end when you still have some pawns on the board,
but they are blocked and cannot move. The general rule is if a player
has no legal moves, the game is over. The entry is the player with fewer
@@ -192,17 +188,14 @@ pieces on the board. This is almost always the same player that had no
moves, but not always.</p></li>
<li><p>In suicide chess, piece captures are compulsory. If a player can
capture an opponent’s piece, he is required to do so. If he can capture
more than one of the opponent’s pieces or can capture one piece with
more than one of his own pieces, he can choose which capture to
play.</p></li>
<li><p>The king is not significant. There is no concept of check and the
king can be captured.</p></li>
<li><p>Because of rule 3, pawns are allowed to promote to a
king.</p></li>
more than one of the opponent’s pieces or can capture one piece with more
than one of his own pieces, he can choose which capture to play.</p></li>
<li><p>The king is not significant. There is no concept of check and the king
can be captured.</p></li>
<li><p>Because of rule 3, pawns are allowed to promote to a king.</p></li>
<li><p>Castling is not allowed.</p></li>
</ol>
<h4 id="q-how-do-you-use-this-program">Q: How do you use this
program?</h4>
<h4 id="q-how-do-you-use-this-program">Q: How do you use this program?</h4>
<p>A: The program is fairly straightforward. When you start the program,
it displays the opening position for a game of suicide chess and waits
for user input. Commands are as follows:</p>
@@ -210,30 +203,24 @@ for user input. Commands are as follows:</p>
<li><code>quit</code> quits the program</li>
<li><code>g</code> causes the computer to make a move</li>
</ul>
<p>Moves are represented by the long algebraic notation for the move.
For those not familiar with long algebraic notation, a move consists of
a square to move from followed by a square to move to. Squares are
denoted by a letter and a number. The letter specifies the column or
file of the square and the number specifies the row rank. Files are
named from left to right by the letters <code>A</code> - <code>H</code>.
Rows are numbered from bottom to top with the numbers <code>1</code> -
<code>8</code>. A sample move from the opening position is
<code>E2E3</code>. This means to move a piece from square
<code>E2</code> to <code>E3</code>. From the opening position, this
corresponds to moving the king pawn forward one square. This is
generally to be considered one of the best opening moves in suicide
chess. All moves, captures and otherwise, are represented with this
notation. A special case is pawn promotion moves. They use the same
notation followed by an <code>=</code> and a letter representing the
piece to promote to. The letters are <code>R</code>, <code>N</code> ,
<code>B</code>, <code>Q</code>, <code>K</code> representing rook,
knight, bishop, queen, and king respectively. The letters must be upper
case.</p>
<p>You can also specify a command line argument of a single digit to
change the search depth of the program. If no argument is specified, it
<p>Moves are represented by the long algebraic notation for the move. For those
not familiar with long algebraic notation, a move consists of a square to move
from followed by a square to move to. Squares are denoted by a letter and a
number. The letter specifies the column or file of the square and the number
specifies the row rank. Files are named from left to right by the letters <code>A</code> -
<code>H</code>. Rows are numbered from bottom to top with the numbers <code>1</code> - <code>8</code>. A sample
move from the opening position is <code>E2E3</code>. This means to move a piece from
square <code>E2</code> to <code>E3</code>. From the opening position, this corresponds to moving the
king pawn forward one square. This is generally to be considered one of the
best opening moves in suicide chess. All moves, captures and otherwise, are
represented with this notation. A special case is pawn promotion moves. They
use the same notation followed by an <code>=</code> and a letter representing the piece to
promote to. The letters are <code>R</code>, <code>N</code> , <code>B</code>, <code>Q</code>, <code>K</code> representing rook, knight,
bishop, queen, and king respectively. The letters must be upper case.</p>
<p>You can also specify a command line argument of a single digit to change
the search depth of the program. If no argument is specified, it
defaults to a depth of 3.</p>
<h4 id="q-are-there-any-limitations-in-your-program">Q: Are there any
limitations in your program?</h4>
<h4 id="q-are-there-any-limitations-in-your-program">Q: Are there any limitations in your program?</h4>
<p>A: Yes. The first of the limitations is that you can only play legal
moves according to the rules of suicide chess. En passant captures are
not recognized. They are rarely encountered in suicide chess and when
@@ -243,150 +230,122 @@ mentioned above, castling is not allowed either.</p>
losses several moves ahead, but does not announce the end of a game nor
the winner. Given the existing code it is easy to do this, but it was
deemed unnecessary fluff.</p>
<h4 id="q-what-is-the-playing-strength-of-this-program">Q: What is the
playing strength of this program?</h4>
<h4 id="q-what-is-the-playing-strength-of-this-program">Q: What is the playing strength of this program?</h4>
<p>A: Playing strength is a relative term. Relative to other computer
programs that play suicide chess, it is about the bottom. There is one
freeware program in existence called <code>kenny</code> that this
program can beat, but that is about it.</p>
<p>Suicide chess is a very tactical game. Most humans who do not have
any experience in suicide chess will lose to this program. The <a
href="http://www.freechess.org">Free Internet Chess Server</a> is a free
online chess server that supports suicide chess. This server keeps track
of ratings. The human ratings for suicide chess range from 1000 to about
2400. This program would probably be rated somewhere around 1700-1900.
It is better than most players, but will get destroyed by experienced
human opponents.</p>
<p>This program searches to a fixed depth of 3 <a
href="https://en.wikipedia.org/wiki/Ply_(game_theory)">ply</a>. Because
it does not search very deep, it performs very poorly in quiet strategic
positions. In such positions, it will often just shuffle pieces around
aimlessly until a tactical exchange presents itself.</p>
<p>A small amount of randomness has been added to make the program a
more interesting opponent. To avoid a call to <code>srand(3)</code>,
<code>rand(3)</code> and the extra code for the required include files,
the <code>time(3)</code> function is used as the source of random data.
It is a slow function, and since it is executed inside the search loop,
there is a significant performance decrease. To make it faster, replace
the <code>time(3)</code> call with <code>rand(3)</code> and add the line
<code>srand(time(0));</code> to the beginning of <code>main()</code>. I
used the more inefficient <code>time(3)</code> function to illustrate a
different (and somewhat obfuscated?) way of generating random
numbers.</p>
<h4 id="q-why-is-this-program-obfuscated">Q: Why is this program
obfuscated?</h4>
freeware program in existence called <code>kenny</code> that this program can beat,
but that is about it.</p>
<p>Suicide chess is a very tactical game. Most humans who do not have any
experience in suicide chess will lose to this program. The <a href="http://www.freechess.org">Free Internet
Chess Server</a> is a free online chess server
that supports suicide chess. This server keeps track of ratings. The
human ratings for suicide chess range from 1000 to about 2400. This
program would probably be rated somewhere around 1700-1900. It is better
than most players, but will get destroyed by experienced human opponents.</p>
<p>This program searches to a fixed depth of 3
<a href="https://en.wikipedia.org/wiki/Ply_(game_theory)">ply</a>. Because it does not
search very deep, it performs very poorly in quiet strategic positions.
In such positions, it will often just shuffle pieces around aimlessly
until a tactical exchange presents itself.</p>
<p>A small amount of randomness has been added to make the program a more
interesting opponent. To avoid a call to <code>srand(3)</code>, <code>rand(3)</code> and the
extra code for the required include files, the <code>time(3)</code> function is used as
the source of random data. It is a slow function, and since it is
executed inside the search loop, there is a significant performance
decrease. To make it faster, replace the <code>time(3)</code> call with <code>rand(3)</code> and add
the line <code>srand(time(0));</code> to the beginning of <code>main()</code>. I used the more
inefficient <code>time(3)</code> function to illustrate a different (and somewhat
obfuscated?) way of generating random numbers.</p>
<h4 id="q-why-is-this-program-obfuscated">Q: Why is this program obfuscated?</h4>
<p>A: Here are several reasons:</p>
<p>First, without preprocessing, the code is not easy to read. The
preprocessor is used to compress the code and obfuscate it. The main
obstacle to entering this program is the source code size limit. This is
the reason that the preprocessor was used so liberally. It is one of the
best ways to compress C source code.</p>
<p>Second, when possible, variables in the program were made global.
Their names are not descriptive and they are used for a variety of
purposes throughout the program. Because of this, it is difficult to
determine exactly what the code does even after preprocessing and
beautifying the code.</p>
<p>Third, all function names are a single character and are obviously
not descriptive of they’re actual purpose. Again this serves the dual
<p>Second, when possible, variables in the program were made global. Their
names are not descriptive and they are used for a variety of purposes
throughout the program. Because of this, it is difficult to determine
exactly what the code does even after preprocessing and beautifying the
code.</p>
<p>Third, all function names are a single character and are obviously not
descriptive of they’re actual purpose. Again this serves the dual
purpose of compression and obfuscation.</p>
<p>Fourth, most string variables have been encoded. This encoding serves
to obfuscate the program as well as reduce the number of countable
characters and get the program under the size limit of this year’s
IOCCC. There are some places where other simple encoding methods are
used to hide the real purpose of strings. These layers of obscurity
cannot be penetrated by just preprocessing and beautifying the
program.</p>
<p>Fifth, various small obfuscations have been used in places all over
the program. Short circuit evaluation is used as a substitute for
<code>if()</code> statements in some places. The ternary operator is
used. In the author’s opinion, use of the ternary operator is almost
always a strong argument for employee turnover.</p>
characters and get the program under the size limit of this year’s IOCCC.
There are some places where other simple encoding methods are used to
hide the real purpose of strings. These layers of obscurity cannot be
penetrated by just preprocessing and beautifying the program.</p>
<p>Fifth, various small obfuscations have been used in places all over the
program. Short circuit evaluation is used as a substitute for <code>if()</code>
statements in some places. The ternary operator is used. In the
author’s opinion, use of the ternary operator is almost always a strong
argument for employee turnover.</p>
<p>Last, if you have succeeded in wading through the previous layers of
obfuscation, you are confronted by the fact that the game that it
implements is an obscure game. Casual inspection of the program might
lead one to believe that it is an implementation of classic chess, but
this is not so.</p>
<h4 id="q-what-about-the-compiler-warnings">Q: What about the compiler
warnings?</h4>
<p>A: When compiled with <code>gcc -Wall</code>, the compiler generated
the following warnings:</p>
<h4 id="q-what-about-the-compiler-warnings">Q: What about the compiler warnings?</h4>
<p>A: When compiled with <code>gcc -Wall</code>, the compiler generated the following
warnings:</p>
<pre><code>suggest parentheses around + or - in operand of &amp;
array subscript has type &#39;char&#39;
return type defaults to &#39;int&#39;
control reaches end of non-void function
value computed is not used</code></pre>
<p>The <code>value computed is not used</code> warning happens because I
use the <code>&amp;&amp;</code> operator and take advantage of short
circuit evaluation instead of using an <code>if()</code> statement.</p>
<p>The <code>suggest parentheses...</code> warnings are given because of
expressions that depend on operator precedence details in the C
language. Eliminating these warnings would reduce obfuscation.</p>
<p>The <code>value computed is not used</code> warning happens because I use the <code>&amp;&amp;</code>
operator and take advantage of short circuit evaluation instead of using
an <code>if()</code> statement.</p>
<p>The <code>suggest parentheses...</code> warnings are given because of expressions
that depend on operator precedence details in the C language.
Eliminating these warnings would reduce obfuscation.</p>
<p>The other warnings are there because it would require more code to
eliminate them and that can’t be done given the size limit.</p>
<h4 id="q-why-does-this-program-crash-when-it-loses">Q: Why does this
program crash when it loses?</h4>
<h4 id="q-why-does-this-program-crash-when-it-loses">Q: Why does this program crash when it loses?</h4>
<p>A: What better way to admit defeat? The author thought this was
appropriate sportsmanship for a program of this genre and can think of
no worse job than trying to find an elusive bug in an intentionally
obfuscated program.</p>
<p>[Judge’s note: This was followed by a description of the bug, and the
comment:]</p>
<p>Note, if this program wins, the author thinks it would be good to
leave this information out of the remarks and encourage others to try
and figure it out for themselves.</p>
<p>[Should you be too lazy (or time-efficient or affected by ‘real life’
:-) ) to figure it out yourself, here’s the author’s fix.]</p>
<p>This bug can be fixed in a number of ways, but there is a way that
adds only one byte to the source code. In the statement
<code>s=(e=-V(n-1,o))&gt;s?Y=G,e:s;</code> change the <code>&gt;</code>
to a <code>&gt;=</code> and the bug will be gone.</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>[Judge’s note: This was followed by a description of the bug, and
the comment:]</p>
<p>Note, if this program wins, the author thinks it would be good to leave
this information out of the remarks and encourage others to try and
figure it out for themselves.</p>
<p>[Should you be too lazy (or time-efficient or affected by ‘real life’ :-) ) to
figure it out yourself, here’s the author’s fix.]</p>
<p>This bug can be fixed in a number of ways, but there is a way that adds only one
byte to the source code. In the statement <code>s=(e=-V(n-1,o))&gt;s?Y=G,e:s;</code> change
the <code>&gt;</code> to a <code>&gt;=</code> and the bug will be gone.</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-2001dgbeards"><a name="inventory"></a>Inventory
for 2001/dgbeards</h1>
<h1 id="inventory-for-2001dgbeards"><a name="inventory"></a>Inventory for 2001/dgbeards</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/2001/dgbeards/dgbeards.c">dgbeards.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/dgbeards.alt.c">dgbeards.alt.c</a>
- alternative source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/dgbeards.orig.c">dgbeards.orig.c</a>
- original source</li>
<li><a href="2001_dgbeards.tar.bz2">2001_dgbeards.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/dgbeards.c">dgbeards.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/dgbeards.alt.c">dgbeards.alt.c</a> - alternative source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/dgbeards.orig.c">dgbeards.orig.c</a> - original source</li>
<li><a href="2001_dgbeards.tar.bz2">2001_dgbeards.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/2001/dgbeards/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/.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/2001/dgbeards/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/.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/2001/dgbeards/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/dgbeards/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+170 -199
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Immanuel_Herrmann">Immanuel
Herrmann</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#Immanuel_Herrmann">Immanuel Herrmann</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 -->
@@ -145,56 +145,55 @@ Herrmann</a><br> Location: <a href="../../location.html#DE">DE</a> -
<p>The current status of this entry is:</p>
<pre><code>STATUS: missing files - please provide them
STATUS: known bug - please help us fix</code></pre>
<p>For more detailed information see <a
href="../../bugs.html#2001_herrmann1">2001 herrmann1 bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_herrmann1">2001 herrmann1 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">./herrmann1.sh</span> <span class="st">&#39;prg=file&#39;</span></span></code></pre></div>
<p>NOTE: this entry seems to rely on older versions of gcc for the
compilation stage and as such if you wish to see that part like it was
designed you will need an older compiler perhaps gcc 2.95.</p>
<p>NOTE: this entry seems to rely on older versions of gcc for the compilation
stage and as such if you wish to see that part like it was designed you will
need an older compiler perhaps gcc 2.95.</p>
<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>There are some clear hints in the source code as to the purpose of
this program. Perhaps the only way to figure out what is going on is to
look at the differences between the runs of the C preprocessor! Computer
Science students should recognize what is going on.</p>
<p>There are some clear hints in the source code as to the
purpose of this program. Perhaps the only way to figure out what is
going on is to look at the differences between the runs of the C
preprocessor! Computer Science students should recognize what is going
on.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>Many cool things have been done with the preprocessor,
e.g. calculation of prime numbers or the Tower of Hanoi. However, up to
now, no one proved that the preprocessor is Turing complete, and I
wondered why. Well, the answer is simply that the preprocessor is
<em>not</em> Turing complete, at least not if the program is
preprocessed only once. This is true even if the program is allowed to
include itself. (The reason being that for a given program, the
preprocessor has only a finite number of states, plus a stack consisting
of the places which the file has been included from. This is only a
push-down automaton.)</p>
e.g. calculation of prime numbers or the Tower of Hanoi. However,
up to now, no one proved that the preprocessor is Turing complete,
and I wondered why. Well, the answer is simply that the
preprocessor is <em>not</em> Turing complete, at least not if the program
is preprocessed only once. This is true even if the program is
allowed to include itself. (The reason being that for a given
program, the preprocessor has only a finite number of states, plus
a stack consisting of the places which the file has been included
from. This is only a push-down automaton.)</p>
<p>Well, this entry <em>is</em> a Turing machine implemented in the
preprocessor; so of course, it has to be preprocessed several times.
Here are the main features:</p>
preprocessor; so of course, it has to be preprocessed several
times. Here are the main features:</p>
<ul>
<li><p>Easy to program: Write your own Turing programs in a nice
syntax.</p></li>
<li><p>Easy to debug: (some) errors in the Turing machine program will
be reported nicely. (That’s something which is not often seen in IOCCC
programs.)</p></li>
<li><p>Ultra-fast: The resulting C program will print the output in time
<code>O(n)</code>, where <code>n</code> is the length of the output.
This means for example that you can solve NP hard problems in polynomial
time! ;-)</p></li>
be reported nicely. (That’s something which is not often seen in
IOCCC programs.)</p></li>
<li><p>Ultra-fast: The resulting C program will print the output in
time <code>O(n)</code>, where <code>n</code> is the length of the output. This means for
example that you can solve NP hard problems in polynomial time!
;-)</p></li>
<li><p>And best of all: During the preprocessing, watch the animated
Turing machine running over the tape and doing its work in your
terminal!</p></li>
</ul>
<h3 id="how-to-use-it">How to use it</h3>
<h4 id="for-the-impatient">For the impatient</h4>
<p>The info files <code>herrmann1.turing</code> and <a
href="herrmann1.gcd">herrmann1.gcd</a> are sample programs for the
Turing machine. For example, type</p>
<p>The info files <code>herrmann1.turing</code> and <a href="herrmann1.gcd">herrmann1.gcd</a> are sample
programs for the Turing machine. For example, type</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">./herrmann1.sh</span> <span class="st">&#39;prg=herrmann1.times2&#39;</span></span></code></pre></div>
<p>and watch the animated Turing machine multiply 8 by two (in unary
representation). Here’s a screen shot during compilation:</p>
<p>and watch the animated Turing machine multiply 8 by two (in
unary representation). Here’s a screen shot during compilation:</p>
<pre><code>/*
*
* State: st2.
@@ -206,8 +205,8 @@ representation). Here’s a screen shot during compilation:</p>
*
*/</code></pre>
<p>(As on real videos, you’ll see a bit of “white noise” at the
beginning and at the end.;-) After compilation has terminated, type
<code>./herrmann1</code> to see the final result. The output will be</p>
beginning and at the end.;-) After compilation has terminated,
type <code>./herrmann1</code> to see the final result. The output will be</p>
<p>Final tape:</p>
<pre><code> *
..OOIIIIIIIIIIIIIIIIOOOO..
@@ -215,25 +214,24 @@ beginning and at the end.;-) After compilation has terminated, type
<p>(Note that the last frame of the animation is <em>not</em> the final
result.)</p>
<p>In the previous example, the Turing machine started on the default
tape of the program <code>times2.turing</code>. To provide your own
tape, type (for example)</p>
tape of the program <code>times2.turing</code>. To provide your own tape, type
(for example)</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">./herrmann1</span> prg=times2.turing tape=<span class="st">&quot;O O O I I I O O O&quot;</span></span></code></pre></div>
<p>(The <code>O</code>s and <code>I</code>s are letters, not digits.)
You might prefer to provide only a finite portion of the tape, like I
did above. In this case, the remainder of the tape is filled with
<code>O</code>s. ;-)</p>
<p>(The <code>O</code>s and <code>I</code>s are letters, not digits.) You might prefer to
provide only a finite portion of the tape, like I did above. In
this case, the remainder of the tape is filled with <code>O</code>s. ;-)</p>
<p>If you just type:</p>
<pre><code>./herrmann1</code></pre>
<p>and run the program, you’ll get a usage message (and the return code
will be 2).</p>
<p>Note: To get a really nice animation, you’ll need a terminal which is
able to scroll fast enough. <code>xterm</code> is not very good. The KDE
terminal <code>konsole</code> or the text console under linux are much
<p>and run the program, you’ll get a usage message (and the return
code will be 2).</p>
<p>Note: To get a really nice animation, you’ll need a terminal which
is able to scroll fast enough. <code>xterm</code> is not very good. The
KDE terminal <code>konsole</code> or the text console under linux are much
better. Simply try some out.</p>
<h3 id="writing-your-own-programs">Writing your own programs</h3>
<p>Now, let’s assume you want to write a program which adds 1 to a
number in unary representation. (That is, a row of I’s is expected, and
one more I is appended to the row.) Let’s call it
number in unary representation. (That is, a row of I’s is
expected, and one more I is appended to the row.) Let’s call it
<code>plus1.turing</code>. Here’s what it could look like:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="co">/* Search beginning of number. */</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a><span class="pp">#define start_O O</span><span class="op">,</span><span class="pp"> right</span><span class="op">,</span><span class="pp"> start</span></span>
@@ -241,17 +239,18 @@ one more I is appended to the row.) Let’s call it
<span id="cb10-4"><a href="#cb10-4" aria-hidden="true" tabindex="-1"></a><span class="pp">#define start_I I</span><span class="op">,</span><span class="pp"> left</span><span class="op">,</span><span class="pp"> st2</span></span>
<span id="cb10-5"><a href="#cb10-5" aria-hidden="true" tabindex="-1"></a><span class="co">/* Write a I and stop */</span></span>
<span id="cb10-6"><a href="#cb10-6" aria-hidden="true" tabindex="-1"></a><span class="pp">#define st2_O I</span><span class="op">,</span><span class="pp"> left</span><span class="op">,</span><span class="pp"> stop</span></span></code></pre></div>
<p>Some explanations: - The tape alphabet is always O and I. - The
states can be anything starting with “st”. “start” and “stop” are the
start and stop states, respectively. - To define a state, use two lines:
one for each letter on the tape. You may omit one of the lines if the
Turing machine will never enter the state reading that letter. (In the
example, the line defining <code>st2_I</code> has been left out.) - The
order of the lines is irrelevant. - You may use C-style comments. (Would
you have guessed it?)</p>
<p>Some explanations:
- The tape alphabet is always O and I.
- The states can be anything starting with “st”. “start” and
“stop” are the start and stop states, respectively.
- To define a state, use two lines: one for each letter on the
tape. You may omit one of the lines if the Turing machine will
never enter the state reading that letter. (In the example, the
line defining <code>st2_I</code> has been left out.)
- The order of the lines is irrelevant.
- You may use C-style comments. (Would you have guessed it?)</p>
<p>Now, the program can be used with</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">./herrmann1.sh</span> <span class="st">&#39;prg=plus1.turing&#39;</span> <span class="st">&#39;tape=&quot;I I I&quot;&#39;</span></span></code></pre></div>
<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">./herrmann1.sh</span> <span class="st">&#39;prg=plus1.turing&#39;</span> <span class="st">&#39;tape=&quot;I I I&quot;&#39;</span></span></code></pre></div>
<p>But what happens if no tape is provided? Up to now, the Turing
machine would start on an empty tape (that is, a tape filled with
<code>O</code>s). For many programs, this doesn’t make much sense (as is
@@ -260,12 +259,12 @@ default tape by adding a line like</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#define tape O O O O O I I I I</span></span></code></pre></div>
<p>to your program.</p>
<h3 id="debugging">Debugging</h3>
<p>When writing long programs, the most common errors are to forget to
define a state or to misspell one. Let’s assume you forgot the line</p>
<p>When writing long programs, the most common errors are to forget
to define a state or to misspell one. Let’s assume you forgot the
line</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#define start_I I</span><span class="op">,</span><span class="pp"> left</span><span class="op">,</span><span class="pp"> st2</span></span></code></pre></div>
<p>Remove it and type</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">./herrmann1</span> <span class="st">&#39;prg=plus1.turing&#39;</span></span></code></pre></div>
<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">./herrmann1</span> <span class="st">&#39;prg=plus1.turing&#39;</span></span></code></pre></div>
<p>The output will be</p>
<p>Undefined state start.</p>
<p>Tape:</p>
@@ -273,194 +272,166 @@ class="sourceCode sh"><code class="sourceCode bash"><span id="cb14-1"><a href="#
..OOOOOOOOIIIIOO..
*</code></pre>
<p>and the return code will be 1. As you can see, the Turing machine
moved over the <code>O</code>s, but when it arrived at the
<code>I</code> (still in state start), the error occurred.</p>
<p>Note that other kinds of errors can cause compilation to fail. If
this happens, the build script will write the error message of gcc into
a file called <code>error</code> and then exit.</p>
moved over the <code>O</code>s, but when it arrived at the <code>I</code> (still in state
start), the error occurred.</p>
<p>Note that other kinds of errors can cause compilation to fail.
If this happens, the build script will write the error message of
gcc into a file called <code>error</code> and then exit.</p>
<h3 id="what-the-build-script-does">What the build script does</h3>
<p>In principle, the build script simply runs the preprocessor over and
over again, until nothing changes anymore; then, the program is
compiled. After each preprocessing step, the script outputs the
<p>In principle, the build script simply runs the preprocessor over
and over again, until nothing changes anymore; then, the program
is compiled. After each preprocessing step, the script outputs the
beginning of the program; this is where the animation takes place
(except in the first and last few steps).</p>
<p>However, there’s a technical problem to overcome: Some compilers
(including gcc) insert a lot of white space during the preprocessing.
This is bad for two reasons. First, the animated picture won’t look
right. And second, after some time, the file will grow too big for your
hard disk. (The amount of white space grows exponentially.) So after
each preprocessing, the first thing the build script does is remove all
the unnecessary white space using <code>sed</code>.</p>
<p>(gcc would even insert <code>#line</code> directives if I didn’t
suppress them with the <code>-P</code> option.)</p>
(including gcc) insert a lot of white space during the
preprocessing. This is bad for two reasons. First, the animated
picture won’t look right. And second, after some time, the file
will grow too big for your hard disk. (The amount of white space
grows exponentially.) So after each preprocessing, the first thing
the build script does is remove all the unnecessary white space
using <code>sed</code>.</p>
<p>(gcc would even insert <code>#line</code> directives if I didn’t suppress
them with the <code>-P</code> option.)</p>
<h3 id="some-more-details">Some more details</h3>
<ul>
<li><p>The arguments passed to the build script are passed on to gcc
with a <code>-D</code> before. I had a slight technical problem doing
this (especially with the spaces that can appear within the tape
with a <code>-D</code> before. I had a slight technical problem doing this
(especially with the spaces that can appear within the tape
argument). That made the build script a bit longer.</p></li>
<li><p>It would be enough to pass the <code>#define</code>s in the first
preprocessing. The program then “remembers” them. However, it doesn’t
matter if they are passed in all pre-processes. (This doesn’t sound very
impressive, but it has required some extra lines of code.)</p></li>
<li><p>During the preprocessing, intermediate files
<code>herrmann1-1.c</code> and <code>herrmann1-2.c</code> are
generated.</p></li>
<li><p>Also, a file <code>error</code> is generated. This file is
removed after the compilation, except if gcc produced an error; then it
contains the error message. (I can’t let gcc output all its messages
directly, because the warnings would clobber the animation. I could have
made the compile script output the error file in case of an error, but I
didn’t want to make it yet longer.)</p></li>
preprocessing. The program then “remembers” them. However, it
doesn’t matter if they are passed in all pre-processes. (This
doesn’t sound very impressive, but it has required some extra
lines of code.)</p></li>
<li><p>During the preprocessing, intermediate files <code>herrmann1-1.c</code> and
<code>herrmann1-2.c</code> are generated.</p></li>
<li><p>Also, a file <code>error</code> is generated. This file is removed after
the compilation, except if gcc produced an error; then it contains
the error message. (I can’t let gcc output all its messages
directly, because the warnings would clobber the animation. I
could have made the compile script output the error file in case
of an error, but I didn’t want to make it yet longer.)</p></li>
</ul>
<h3 id="some-technical-details-obfuscations">Some technical details /
obfuscations</h3>
<h3 id="some-technical-details-obfuscations">Some technical details / obfuscations</h3>
<ul>
<li><p>The program is compressed. In the first three preprocessing
passes, it uncompresses itself and initializes the “variables”. So if
you want to understand how it works, the best thing is to pre-process it
three times and then look at it again. (However, I wouldn’t have wasted
three passes if they weren’t needed anyway to initialize the tape in
certain cases. Find out why.)</p></li>
<li><p>The first problem I had to solve when writing this program was to
write a preprocessor program which outputs itself. Of course, each
program which doesn’t contain any preprocessor directives is such a
program, but that’s not what I needed. In fact, to do this, the program
has to include itself, but even then, it’s not easy.</p></li>
passes, it uncompresses itself and initializes the
“variables”. So if you want to understand how it works, the best
thing is to pre-process it three times and then look at it
again. (However, I wouldn’t have wasted three passes if they
weren’t needed anyway to initialize the tape in certain
cases. Find out why.)</p></li>
<li><p>The first problem I had to solve when writing this program was
to write a preprocessor program which outputs itself. Of course,
each program which doesn’t contain any preprocessor directives
is such a program, but that’s not what I needed. In fact, to do
this, the program has to include itself, but even then, it’s not
easy.</p></li>
<li><p>The next problem to solve was how to pass results of a
calculation of one preprocessing to the next one. This is done by
outputting <code>#define</code>s with the result. But there’s a problem
calculation of one preprocessing to the next one. This is done
by outputting <code>#define</code>s with the result. But there’s a problem
with this: it is impossible to output a <code>#define result xxx</code>,
where <code>xxx</code> depends on the previous value of result. Try it
if you don’t believe it. And find out what I did instead.</p></li>
where <code>xxx</code> depends on the previous value of result. Try it if you
don’t believe it. And find out what I did instead.</p></li>
<li><p>What’s a useful way to store information, especially the content
of the tape? Of course, a <code>#define tape OOIOOIOIIIIO</code>
contains the information, but then, how do you access the information?
of the tape? Of course, a <code>#define tape OOIOOIOIIIIO</code> contains
the information, but then, how do you access the information?
(For example, you won’t be able to write preprocessor code which
replaces the first <code>O</code> by <code>I</code>.) My answer looks
very much like the way a stack would have been implemented in lambda
calculus. (The tape is implemented as two stacks, to be exact.) And
still, there were some technical problems to solve. Look at the program
replaces the first <code>O</code> by <code>I</code>.) My answer looks very much like the
way a stack would have been implemented in lambda calculus. (The
tape is implemented as two stacks, to be exact.) And still,
there were some technical problems to solve. Look at the program
for more details.</p></li>
<li><p>There are many other interesting things to look at, e.g. the way
to access the information in the user-provided program, the way a
non-defined state is detected, the way the picture is produced, etc. If
you want a real challenge, try to understand what the line
<code>w j k(P ## x)</code> does.</p></li>
to access the information in the user-provided program, the way
a non-defined state is detected, the way the picture is
produced, etc. If you want a real challenge, try to understand
what the line <code>w j k(P ## x)</code> does.</p></li>
<li><p>Due to the fact that our alphabet has only 53 ;-) letters, I had
to use many variables more than once.</p></li>
<li><p>I couldn’t refrain from doing a little bit of nasty stuff
like</p>
<li><p>I couldn’t refrain from doing a little bit of nasty stuff like</p>
<pre><code> #define a 0&amp;0
#if !a</code></pre>
<p>Of course, it is a bit more subtle, and even useful.</p></li>
<li><p>The layout of the source code…, well, let’s call it the “modern
art of programming” - a mixture of program-like indenting and modern
art. There are even some comments…</p></li>
<li><p>The layout of the source code…, well, let’s call it the
“modern art of programming” - a mixture of program-like
indenting and modern art. There are even some comments…</p></li>
</ul>
<h3 id="compatibility">Compatibility</h3>
<ul>
<li><p>It works with many versions of gcc. I tested it with versions
2.7.2.1, 2.8.1, 2.95.2, and ecgs-2.91.66. However, an old version of gcc
produced “internal compiler errors” (obviously not my fault).</p></li>
<li><p>The only warnings I get tell me that I’m undefining
<code>__FILE__</code> and that preprocessing directives are not
recognized within macro args. My answer to this is “yes, I know this and
it’s all right”. With <code>-Wall</code>, I also get some warnings about
<code>/*</code> inside comments (Well, <em>I</em> like some well-placed
<code>/*/*/</code>.) as well as some suggestions where to place some
more parentheses (as if I didn’t know the operator precedence).</p></li>
<li><p>Different versions of <code>cc</code> all produced only rubbish.
Apparently, the preprocessors didn’t really work. (I don’t feel guilty
there, either. Even with very simple programs, they produced mysterious
output.)</p></li>
2.7.2.1, 2.8.1, 2.95.2, and ecgs-2.91.66. However, an old version
of gcc produced “internal compiler errors” (obviously not my
fault).</p></li>
<li><p>The only warnings I get tell me that I’m undefining <code>__FILE__</code> and
that preprocessing directives are not recognized within macro
args. My answer to this is “yes, I know this and it’s all
right”. With <code>-Wall</code>, I also get some warnings about <code>/*</code>
inside comments (Well, <em>I</em> like some well-placed <code>/*/*/</code>.) as
well as some suggestions where to place some more parentheses
(as if I didn’t know the operator precedence).</p></li>
<li><p>Different versions of <code>cc</code> all produced only rubbish. Apparently,
the preprocessors didn’t really work. (I don’t feel guilty
there, either. Even with very simple programs, they produced
mysterious output.)</p></li>
<li><p>For Mac-Users: It works with the C compiler of CodeWarrior (an
old version). This compiler even leaves out all that unnecessary white
space, so that no clean-up is needed. (It would be useful to write a
kind of script which does the equivalent to the build script, so that
one does not have to choose “preprocess” from the menu over and over
again. I leave this as an exercise to the experienced Mac
programmer.)</p></li>
<li><p>In the build script, I passed the <code>-P</code> option to gcc
to suppress the insertion of <code>#line</code> directives. If your
compiler doesn’t support this option (and does insert <code>#line</code>
directives), you should change the call to <code>sed</code> to remove
them, too: Add</p>
old version). This compiler even leaves out all that unnecessary
white space, so that no clean-up is needed. (It would be useful
to write a kind of script which does the equivalent to the build
script, so that one does not have to choose “preprocess” from
the menu over and over again. I leave this as an exercise to the
experienced Mac programmer.)</p></li>
<li><p>In the build script, I passed the <code>-P</code> option to gcc to suppress
the insertion of <code>#line</code> directives. If your compiler doesn’t
support this option (and does insert <code>#line</code> directives), you
should change the call to <code>sed</code> to remove them, too: Add</p>
<pre><code> -e &quot;/^#line/ d&quot;</code></pre>
<p>to the sed parameters. Or, if your <code>#line</code> directives look
like</p>
<p>to the sed parameters. Or, if your <code>#line</code> directives look like</p>
<pre><code> # 15 &quot;filename&quot;</code></pre>
<p>add</p>
<pre><code> -e &quot;/^# [0-9]/ d&quot;</code></pre>
<p>instead.</p></li>
<li><p>First, I had <code>-ansi -pedantic</code> turned on, but on some
systems, the <code>stdio.h</code> is not compatible to that, so I turned
it back off.</p></li>
<li><p>First, I had <code>-ansi -pedantic</code> turned on, but on some systems,
the <code>stdio.h</code> is not compatible to that, so I turned it back off.</p></li>
<li><p>The build script probably needs a bash to run in. So perhaps you
have to add <code>#!/bin/bash</code> or something like this at the
beginning.</p></li>
<li><p>On SunOS, I had to remove the <code>-q</code> option from diff in
the build script.</p></li>
<li><p>On SunOS, I had to remove the <code>-q</code> option from diff in the build
script.</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-2001herrmann1"><a name="inventory"></a>Inventory
for 2001/herrmann1</h1>
<h1 id="inventory-for-2001herrmann1"><a name="inventory"></a>Inventory for 2001/herrmann1</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/2001/herrmann1/herrmann1.c">herrmann1.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.orig.c">herrmann1.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.gcd">herrmann1.gcd</a>
- GCD program as c defines</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.sh">herrmann1.sh</a>
- how to run</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.times2">herrmann1.times2</a>
- turning program as c defines</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/plus1.turing">plus1.turing</a>
- turning program as c defines</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/try.sh">try.sh</a>
- how to run</li>
<li><a href="2001_herrmann1.tar.bz2">2001_herrmann1.tar.bz2</a> -
download entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.c">herrmann1.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.orig.c">herrmann1.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.gcd">herrmann1.gcd</a> - GCD program as c defines</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.sh">herrmann1.sh</a> - how to run</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/herrmann1.times2">herrmann1.times2</a> - turning program as c defines</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/plus1.turing">plus1.turing</a> - turning program as c defines</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/try.sh">try.sh</a> - how to run</li>
<li><a href="2001_herrmann1.tar.bz2">2001_herrmann1.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/2001/herrmann1/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/.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/2001/herrmann1/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/.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/2001/herrmann1/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann1/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 -141
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Immanuel_Herrmann">Immanuel
Herrmann</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#Immanuel_Herrmann">Immanuel Herrmann</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 -->
@@ -145,80 +145,77 @@ Herrmann</a><br> Location: <a href="../../location.html#DE">DE</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">./herrmann2</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>If you use vi(m) you can see a pattern in <a
href="herrmann2.cup">herrmann2.cup</a> and
<p>If you use vi(m) you can see a pattern in <a href="herrmann2.cup">herrmann2.cup</a> and
[herrmann2.ioccc][(herrmann2.ioccc]) by say:</p>
<pre><code>/[pon]\</code></pre>
<p>and</p>
<pre><code>/l</code></pre>
<p>For additional fun in <a href="herrmann2.cup">herrmann2.cup</a>
try:</p>
<p>For additional fun in <a href="herrmann2.cup">herrmann2.cup</a> try:</p>
<pre><code>/[po]
/q</code></pre>
<p>and in <a href="herrmann2.ioccc">herrmann2.ioccc</a> try:</p>
<pre><code>/n</code></pre>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>Be careful when staring at the source code - your eyes might cross,
but if you concentrate on your focus you will find illumination!</p>
<p>Be careful when staring at the source code - your eyes might cross, but
if you concentrate on your focus you will find illumination!</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>You probably know those “magic eye” 3D pictures - pictures looking
like random noise, but when you look “through” the paper, you either get
a three dimensional picture or a headache. With this program, you can
create your own 3D pictures in ASCII art. And yes, the program itself is
such a 3D picture.</p>
like random noise, but when you look “through” the paper, you
either get a three dimensional picture or a headache. With this
program, you can create your own 3D pictures in ASCII art. And
yes, the program itself is such a 3D picture.</p>
<h3 id="how-to-use-it">How to use it</h3>
<ol type="1">
<li><p>Create a file which describes the desired 3D picture. The file
must be a block of lowercase letters the size of the desired picture.
The letters specify the depth of the corresponding pixel: <code>a</code>
means close to the paper, <code>z</code> means far away. The info files
are examples. Be aware that the size of the picture is restricted to
about 9k.</p></li>
<li><p>Pipe your picture into the program. The output will be your 3D
picture, constructed of random characters (with ASCII code between 32
and 126). For example, type</p></li>
must be a block of lowercase letters the size of the desired
picture. The letters specify the depth of the corresponding pixel:
<code>a</code> means close to the paper, <code>z</code> means far away. The info files
are examples. Be aware that the size of the picture is restricted
to about 9k.</p></li>
<li><p>Pipe your picture into the program. The output will be your
3D picture, constructed of random characters (with ASCII code between
32 and 126). For example, type</p></li>
</ol>
<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">./herrmann2</span> <span class="op">&lt;</span> herrmann2.ioccc</span></code></pre></div>
<ol start="3" type="1">
<li>If you want to control the characters used in the output (for
example if your picture is to consist only of digits), pass them as the
first argument. In this case, each time the program needs a new random
character, it will take the next one from the argument. When it arrives
at the end of the argument, it will start over at the beginning.
Example:</li>
example if your picture is to consist only of digits), pass them
as the first argument. In this case, each time the program needs a
new random character, it will take the next one from the
argument. When it arrives at the end of the argument, it will
start over at the beginning. Example:</li>
</ol>
<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">./herrmann2</span> <span class="st">&quot;234 84 045 5 6765 7487 65190 84 656 254 12 43931 818 0 6542 </span><span class="dt">\</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a><span class="st">341 45 567 76967 7244 606 976567 895 81898 095 68678 1843 4650547 </span><span class="dt">\</span></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a><span class="st">565980691 389 04974&quot;</span> <span class="op">&lt;</span> herrmann2.ioccc</span></code></pre></div>
<h3 id="some-hints-to-get-better-results">Some hints to get better
results</h3>
<h3 id="some-hints-to-get-better-results">Some hints to get better results</h3>
<ul>
<li><p>Due to the way these 3D pictures work, the left part of the
picture won’t look really 3D, so don’t put things too much on the left.
The reason is that for each letter in the source file, a character for
the right eye is printed. The 3D effect appears when the left eye sees
the same character more to the left. This is of course impossible on the
left border of the picture.</p></li>
picture won’t look really 3D, so don’t put things too much on
the left. The reason is that for each letter in the source file,
a character for the right eye is printed. The 3D effect appears
when the left eye sees the same character more to the left. This
is of course impossible on the left border of the picture.</p></li>
<li><p>Don’t use too different depths and don’t use the depths very
close to the paper (beginning of the alphabet). This would make it more
difficult to see the picture.</p></li>
close to the paper (beginning of the alphabet). This would make
it more difficult to see the picture.</p></li>
<li><p>When passing an argument, don’t use a too short one; the
repeating pattern which arises from the repetition of the argument could
interfere with the repeating pattern which creates the 3D
repeating pattern which arises from the repetition of the argument
could interfere with the repeating pattern which creates the 3D
effect.</p></li>
</ul>
<h3 id="extra-features">Extra-Features</h3>
<ul>
<li><p>The program is able to handle all common kinds of line breaks:
Unix, DOS and Mac. To get an output with a certain kind of line breaks,
simply use the same kind of line breaks in the input file.</p></li>
<li><p>As the source code is a 3D picture itself, the easiest way to get
it (if you lost it or if you don’t have it already) is to use the
program itself on the right picture and with the right
Unix, DOS and Mac. To get an output with a certain kind of line
breaks, simply use the same kind of line breaks in the input
file.</p></li>
<li><p>As the source code is a 3D picture itself, the easiest way to
get it (if you lost it or if you don’t have it already) is to use
the program itself on the right picture and with the right
argument:</p></li>
</ul>
<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">./herrmann2</span> <span class="dt">\</span></span>
<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">./herrmann2</span> <span class="dt">\</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a><span class="st">&#39;char*d,A[9876];e;b;*ad,a,c; tw,ndr,T; wri; ;*h; _,ar ;on;&#39;</span><span class="dt">\</span></span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a><span class="st">&#39; ;l ;i(V)man,n {-!har ; =Aadre(0,&amp;e,o||n -- +,o4,=9,l=b=8,&#39;</span><span class="dt">\</span></span>
<span id="cb10-4"><a href="#cb10-4" aria-hidden="true" tabindex="-1"></a><span class="st">&#39;!( te-*Aim)|(0~l),srand (l),,!A,d=,b))&amp;&amp;+((A + te-A(&amp;(*)=+ +95&gt;&#39;</span><span class="dt">\</span></span>
@@ -229,132 +226,104 @@ class="sourceCode sh"><code class="sourceCode bash"><span id="cb10-1"><a href="#
<span id="cb10-9"><a href="#cb10-9" aria-hidden="true" tabindex="-1"></a><span class="st">&#39;a;}return _+= &#39;</span> <span class="op">&lt;</span> herrmann2.ioccc</span></code></pre></div>
<ul>
<li><p>If I had submitted the program last year, I would have said that
it has exactly the maximum allowed length: 1536 characters. Now let’s
say it’s a way of protesting against the inflation in program
length.</p></li>
it has exactly the maximum allowed length: 1536 characters. Now
let’s say it’s a way of protesting against the inflation in
program length.</p></li>
<li><p>The size of the source 3D picture has been chosen carefully: as
big as possible, but small enough to be viewed without problems on
normal-sized terminals.</p></li>
big as possible, but small enough to be viewed without problems
on normal-sized terminals.</p></li>
</ul>
<h3 id="why-this-program-should-win">Why this program should win</h3>
<ul>
<li><p>The layout is of a completely new kind. And it describes what the
program does more precisely than any comment could.</p></li>
<li><p>I don’t think there has ever been an IOCCC program with so severe
layout constraints. Once the 3D picture has been fixed, only a sixth of
the characters can be chosen freely! (457 of 1840, to be exact.) In
contrast, in palindrome programs, for example, half of the characters
can be chosen freely.</p></li>
<li><p>I did not cheat by using comments or <code>-D</code> options -
something I’ve seen even some palindrome programs do. In fact, at my
first attempt at writing the program I became convinced that it isn’t
possible without cheating. But then I found out that with comments or
defines, it would become trivial, so I had to try harder…</p></li>
<li><p>The layout is of a completely new kind. And it describes what
the program does more precisely than any comment could.</p></li>
<li><p>I don’t think there has ever been an IOCCC program with so
severe layout constraints. Once the 3D picture has been fixed,
only a sixth of the characters can be chosen freely! (457 of
1840, to be exact.) In contrast, in palindrome programs, for
example, half of the characters can be chosen freely.</p></li>
<li><p>I did not cheat by using comments or <code>-D</code> options - something
I’ve seen even some palindrome programs do. In fact, at my first
attempt at writing the program I became convinced that it
isn’t possible without cheating. But then I found out that with
comments or defines, it would become trivial, so I had to try
harder…</p></li>
<li><p>If you don’t believe the constraints are hard, try to write just
one single line which satisfies them. (To be able to make one function
call, for example, you have to fill an entire line with stuff doing
mostly nothing.)</p></li>
one single line which satisfies them. (To be able to make one
function call, for example, you have to fill an entire line with
stuff doing mostly nothing.)</p></li>
<li><p>Just in case this is not enough: Yes, the code itself is
obfuscated: It’s (almost) only one big expression, with deep nesting of
<code>()</code> and <code>?:</code>, and full of unnecessary operations
which do not really help making it readable. And it contains a lot of
obfuscated: It’s (almost) only one big expression, with deep
nesting of <code>()</code> and <code>?:</code>, and full of unnecessary operations which
do not really help making it readable. And it contains a lot of
“magic numbers”. (My favourite is the <code>7</code> in line 15 (each
one). Which is the other digit I could have put there instead, and what
other changes to the program would have been necessary? Without
violating the constraints of course.)</p></li>
<li><p>The fact that the main loop of the program calls
<code>main()</code> recursively is nothing new. New however is that this
program only needs a logarithmic recursion depth! (Find out how this
one). Which is the other digit I could have put there instead,
and what other changes to the program would have been necessary?
Without violating the constraints of course.)</p></li>
<li><p>The fact that the main loop of the program calls <code>main()</code>
recursively is nothing new. New however is that this program
only needs a logarithmic recursion depth! (Find out how this
works.)</p></li>
<li><p>When still in doubt about how to judge this program,
type</p></li>
<li><p>When still in doubt about how to judge this program, type</p></li>
</ul>
<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">./herrmann2</span> <span class="op">&lt;</span> herrmann2.cup</span></code></pre></div>
<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">./herrmann2</span> <span class="op">&lt;</span> herrmann2.cup</span></code></pre></div>
<p>and let the result inspire you. ;-)</p>
<h3 id="requirements-to-the-compiler-compatibility">Requirements to the
compiler / Compatibility</h3>
<h3 id="requirements-to-the-compiler-compatibility">Requirements to the compiler / Compatibility</h3>
<ul>
<li><p>I fear that gcc is the only compiler for which this program
works. Due to the severe restrictions, I was forced to use declarations
of <code>int</code> variables, functions and parameters without
specifying their type. The biggest problem was to put
<code>int main(int c, char ** v){</code> into the program. After some
time, I became convinced that this is impossible. Finally, at least I
managed to squeeze <code>main(c, v){</code> into the constraints
instead.</p></li>
works. Due to the severe restrictions, I was forced to use
declarations of <code>int</code> variables, functions and parameters without
specifying their type. The biggest problem was to put <code>int main(int c, char ** v){</code> into the program. After some time, I
became convinced that this is impossible. Finally, at least I
managed to squeeze <code>main(c, v){</code> into the constraints instead.</p></li>
<li><p>Also, a lot of warnings are produced - most of them “data
definition has no type or storage class”, but also some “parameter names
(without types) in function declaration” and “assignment from
incompatible pointer type”. I wasn’t able to get rid of them.</p></li>
<li><p>At least, it probably works with all sufficiently recent versions
of gcc. I tested it with versions 2.7.2.1, 2.8.1, 2.95.2, and
ecgs-2.91.66.</p></li>
<li><p>Of course I couldn’t put <code>#include</code>s at the beginning
of the program. Usually, this is not really necessary with gcc. However,
for this program it would have been, because some functions appear as
function pointers, and as such they are not generated implicitly. So the
build script has to pass <code>-include ...</code> to gcc. A problem
with this is that the complete path of the include files has to be
provided. In the build script, I assume that the path is
<code>/usr/include</code>, but this can easily be adapted.</p></li>
definition has no type or storage class”, but also some
“parameter names (without types) in function declaration” and
“assignment from incompatible pointer type”. I wasn’t able to
get rid of them.</p></li>
<li><p>At least, it probably works with all sufficiently recent
versions of gcc. I tested it with versions 2.7.2.1, 2.8.1,
2.95.2, and ecgs-2.91.66.</p></li>
<li><p>Of course I couldn’t put <code>#include</code>s at the beginning of
the program. Usually, this is not really necessary with
gcc. However, for this program it would have been, because some
functions appear as function pointers, and as such they are not
generated implicitly. So the build script has to pass <code>-include ...</code> to gcc. A problem with this is that the complete path of
the include files has to be provided. In the build script, I
assume that the path is <code>/usr/include</code>, but this can easily be
adapted.</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-2001herrmann2"><a name="inventory"></a>Inventory
for 2001/herrmann2</h1>
<h1 id="inventory-for-2001herrmann2"><a name="inventory"></a>Inventory for 2001/herrmann2</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/2001/herrmann2/herrmann2.c">herrmann2.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.alt.c">herrmann2.alt.c</a>
- alternative source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.orig.c">herrmann2.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.cup">herrmann2.cup</a>
- sample input</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.ioccc">herrmann2.ioccc</a>
- sample input</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/try.sh">try.sh</a>
- how to run</li>
<li><a href="2001_herrmann2.tar.bz2">2001_herrmann2.tar.bz2</a> -
download entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.c">herrmann2.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.alt.c">herrmann2.alt.c</a> - alternative source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.orig.c">herrmann2.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.cup">herrmann2.cup</a> - sample input</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/herrmann2.ioccc">herrmann2.ioccc</a> - sample input</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/try.sh">try.sh</a> - how to run</li>
<li><a href="2001_herrmann2.tar.bz2">2001_herrmann2.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/2001/herrmann2/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/.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/2001/herrmann2/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/.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/2001/herrmann2/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/herrmann2/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+48 -74
View File
@@ -123,28 +123,23 @@
<!-- 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="sixteenth-international-obfuscated-c-code-contest">Sixteenth
International Obfuscated C Code Contest</h1>
<h1 id="sixteenth-international-obfuscated-c-code-contest">Sixteenth 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>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>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> i.e. the <code>-D</code> flag).</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>
@@ -155,83 +150,62 @@ language that was not supplied with the entry.</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
<a href="ollinger/index.html">Best of Show</a> is a fine example of
obfuscation. But don’t ignore the other entries! There are games,
programs that speak, ones that compile code and <a
href="2001/anonymous/index.html">one that <em>might</em> run binaries
you already have</a>.</p>
<p>The <a href="bellard/index.html">Best/Worst Abuse of the Rules</a> is
technically allowed by the <a href="rules.txt">rules</a>. This year we
awarded it again, but don’t assume you can get away with using the same
technique next time … :-)</p>
<p>We believe you will be impressed with this year’s winning entries The <a href="ollinger/index.html">Best of
Show</a> is a fine example of obfuscation. But don’t ignore
the other entries! There are games, programs that speak, ones that compile code
and <a href="2001/anonymous/index.html">one that <em>might</em> run binaries you already have</a>.</p>
<p>The <a href="bellard/index.html">Best/Worst Abuse of the Rules</a> is technically allowed by the
<a href="rules.txt">rules</a>. This year we awarded it again, but don’t assume you can get
away with using the same technique next time … :-)</p>
<p>This year there were several repeat authors. This is understating the
achievement a little - <a href="../authors.html#Brian_Westley">one
person</a> has won 8 times before! (Please note that judging is done
completely anonymously.)</p>
<h2 id="why-has-it-taken-so-long-to-post-the-winning-source">Why has it
taken so long to post the winning source?</h2>
<p>This is somewhat my (Simon Cooper’s) fault. I do apologize to the
IOCCC community for this! Judging does take quite a lot of time, and I
over-committed myself several times this year. Without divulging too
much, we do look at and work out what every entry does.</p>
person</a> has won 8 times
before! (Please note that judging is done completely anonymously.)</p>
<h2 id="why-has-it-taken-so-long-to-post-the-winning-source">Why has it taken so long to post the winning source?</h2>
<p>This is somewhat my (Simon Cooper’s) fault. I do apologize to the IOCCC
community for this! Judging does take quite a lot of time, and I
over-committed myself several times this year. Without divulging too much,
we do look at and work out what every entry does.</p>
<h2 id="final-comments">Final Comments</h2>
<p>Please send us comments and suggestions what we have expressed above.
Also include anything else that you would like to see in future
contests. Send such email to:</p>
Also include anything else that you would like to see in future contests.
Send such email to:</p>
<pre><code>questions@ioccc.org</code></pre>
<p><strong>IMPORTANT NOTE</strong>: The email addresses found above are
for historical purposes only, and should not be used today. 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>: The email addresses found above are for historical
purposes only, and should not be used today. 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) 2001,2002,2023, Landon Curt Noll, Peter Seebach 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) 2001,2002,2023, Landon Curt Noll, Peter Seebach 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-2001---the-16th-ioccc"><a name=inventory></a><a name=2001></a>Winning
Entries of 2001 - The 16th IOCCC</h1>
<p><strong>Download IOCCC</strong> <a
href="2001/ioccc.2001.tar.bz2">2001 entry source</a></p>
<h1 id="winning-entries-of-2001---the-16th-ioccc"><a name=inventory></a><a name=2001></a>Winning Entries of 2001 - The 16th IOCCC</h1>
<p><strong>Download IOCCC</strong> <a href="2001/ioccc.2001.tar.bz2">2001 entry source</a></p>
<ul>
<li><a href="anonymous/index.html">2001/anonymous</a> - Dishonorable
mention</li>
<li><a href="bellard/index.html">2001/bellard</a> - Best abuse of the
rules</li>
<li><a href="cheong/index.html">2001/cheong</a> - Best short
program</li>
<li><a href="coupard/index.html">2001/coupard</a> - Most obfuscated
sound</li>
<li><a href="anonymous/index.html">2001/anonymous</a> - Dishonorable mention</li>
<li><a href="bellard/index.html">2001/bellard</a> - Best abuse of the rules</li>
<li><a href="cheong/index.html">2001/cheong</a> - Best short program</li>
<li><a href="coupard/index.html">2001/coupard</a> - Most obfuscated sound</li>
<li><a href="ctk/index.html">2001/ctk</a> - Worst Driver</li>
<li><a href="dgbeards/index.html">2001/dgbeards</a> - Best AI</li>
<li><a href="herrmann1/index.html">2001/herrmann1</a> - Best abuse of
the C preprocessor</li>
<li><a href="herrmann2/index.html">2001/herrmann2</a> - Most
eye-crossing</li>
<li><a href="herrmann1/index.html">2001/herrmann1</a> - Best abuse of the C preprocessor</li>
<li><a href="herrmann2/index.html">2001/herrmann2</a> - Most eye-crossing</li>
<li><a href="jason/index.html">2001/jason</a> - Best Of Show</li>
<li><a href="kev/index.html">2001/kev</a> - Best Curses Game</li>
<li><a href="ollinger/index.html">2001/ollinger</a> - Best of Show</li>
<li><a href="rosten/index.html">2001/rosten</a> - Best abuse of the
user</li>
<li><a href="schweikh/index.html">2001/schweikh</a> - Best
one-liner</li>
<li><a href="westley/index.html">2001/westley</a> - Best
position-independent code</li>
<li><a href="williams/index.html">2001/williams</a> - Best Graphic
Game</li>
<li><a href="rosten/index.html">2001/rosten</a> - Best abuse of the user</li>
<li><a href="schweikh/index.html">2001/schweikh</a> - Best one-liner</li>
<li><a href="westley/index.html">2001/westley</a> - Best position-independent code</li>
<li><a href="williams/index.html">2001/williams</a> - Best Graphic Game</li>
</ul>
<p> <strong>Jump to:</strong> <a href="#">top</a></p>
+69 -86
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Jason_Orendorff">Jason
Orendorff</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#Jason_Orendorff">Jason Orendorff</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,18 +145,17 @@ Orendorff</a><br> Location: <a href="../../location.html#US">US</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">./jason</span></span></code></pre></div>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>You are in a maze of twisty little passages, all alike.</p>
<p>The really amazing part of this is that it’s a text adventure, and
there’s not a single word in the source that isn’t a C keyword or
function name, being used as such.</p>
<p>The really amazing part of this is that it’s a text adventure, and there’s
not a single word in the source that isn’t a C keyword or function name,
being used as such.</p>
<p>The interface isn’t very tolerant of errors, but you can’t really
expect that from something this small.</p>
<p>Of particular interest: Go ahead, run it through the preprocessor.
You <em>still</em> won’t see the words that are used in the game.</p>
<p>If you run it through a beautifier you might cause a crash as most of
the whitespace is significant. Also, if you attempt to change one
character identifiers to longer names expect problems. Even swapping the
<code>Y</code> and <code>Z</code> can cause problems. Go ahead, try it!
:-)</p>
<p>Of particular interest: Go ahead, run it through the preprocessor. You
<em>still</em> won’t see the words that are used in the game.</p>
<p>If you run it through a beautifier you might cause a crash as most of the
whitespace is significant. Also, if you attempt to change one character
identifiers to longer names expect problems. Even swapping the <code>Y</code> and <code>Z</code> can
cause problems. Go ahead, try it! :-)</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>TED Shroyer came up with the idea that made it possible to hide all
the text. Thanks, TED. You won. :)</p>
@@ -167,106 +166,90 @@ the text. Thanks, TED. You won. :)</p>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="ex">you</span> see</span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a> <span class="ex">a</span> lamp</span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a><span class="op">&gt;</span> _</span></code></pre></div>
<p>This program is a rather nostalgic little labyrinth game. Start out
by typing “<code>get lamp</code>”, then use the direction words
“<code>left</code>”, “<code>right</code>”, “<code>forward</code>”, and
“<code>back</code>” to explore the caves. Note that these words can
refer to different passages depending on which way you’re facing.
“<code>back</code>” always takes you back the way you came. Type
“<code>quit</code>” to quit.</p>
<p>This program is a rather nostalgic little labyrinth game. Start
out by typing “<code>get lamp</code>”, then use the direction words “<code>left</code>”,
“<code>right</code>”, “<code>forward</code>”, and “<code>back</code>” to explore the caves. Note that
these words can refer to different passages depending on which way
you’re facing. “<code>back</code>” always takes you back the way you came.
Type “<code>quit</code>” to quit.</p>
<p>The maze is randomly generated each time you play. The algorithm
ensures that you start at least 6 hops away from the exit. All passages
are two-way.</p>
<p>(There is a trick, well-known among <a
href="https://en.wikipedia.org/wiki/Colossal_Cave_Adventure">Adventure</a>
game fans, to keeping one’s bearings in games like this. Unless you know
the trick, it can be very difficult to find your way around. Try it out
first; I’ll give away the secret at the bottom of this document.)</p>
ensures that you start at least 6 hops away from the exit. All
passages are two-way.</p>
<p>(There is a trick, well-known among
<a href="https://en.wikipedia.org/wiki/Colossal_Cave_Adventure">Adventure</a> game fans, to
keeping one’s bearings in games like this. Unless you know the
trick, it can be very difficult to find your way around. Try it
out first; I’ll give away the secret at the bottom of this
document.)</p>
<p>The goal is to collect 8 treasures (plus the lamp) and escape into
the sunlight - or moonlight, as the case may be. After a few minutes,
the lamp runs out of oil, and things become perilous.</p>
<p>If you manage to escape, you score 50 points for your hide, 50 points
per item, and bonus points for speed.</p>
the sunlight - or moonlight, as the case may be. After a few
minutes, the lamp runs out of oil, and things become perilous.</p>
<p>If you manage to escape, you score 50 points for your hide, 50
points per item, and bonus points for speed.</p>
<p>Why I think this program is obfuscated:</p>
<ul>
<li><p>70% more <code>#</code> symbols than the average entry.</p></li>
<li><p>Where are all the messages? The game is downright chatty for only
having two string literals (<code>"%d \n"</code> and
<code>"Y\n : ! ,.?&gt;"</code>).</p></li>
<li><p>There is exactly one loop in the program, a <code>for</code>
loop, and it is clearly the product of a deranged mind. Running the
<li><p>Where are all the messages? The game is downright chatty for
only having two string literals (<code>"%d \n"</code> and <code>"Y\n : ! ,.?&gt;"</code>).</p></li>
<li><p>There is exactly one loop in the program, a <code>for</code> loop, and it is
clearly the product of a deranged mind. Running the
preprocessor only makes it worse.</p></li>
<li><p>Microsoft Visual C++ won’t even compile this program, even though
it is plain ANSI C (<em>innocent look</em>) and limits itself to the
most standard and portable of the standard library facilities.</p></li>
<li><p>Most of the whitespace is significant, so attempts to beautify it
can easily lead to segmentation faults.</p></li>
<li><p>Microsoft Visual C++ won’t even compile this program, even
though it is plain ANSI C (<em>innocent look</em>) and limits itself to
the most standard and portable of the standard library
facilities.</p></li>
<li><p>Most of the whitespace is significant, so attempts to
beautify it can easily lead to segmentation faults.</p></li>
<li><p>Attempts to replace the one-character identifiers with longer,
more meaningful names will likewise cause problems. In fact, simply
changing all the <code>Y</code>s to <code>Z</code>s and vice versa
results in some unexpected side effects.</p></li>
more meaningful names will likewise cause problems. In fact,
simply changing all the <code>Y</code>s to <code>Z</code>s and vice versa results in
some unexpected side effects.</p></li>
</ul>
<p>When all warnings are enabled, some compilers express the desire to
see a few more parentheses. I respectfully submit that there are plenty
of parentheses in the program (370 in all.) Besides, any more would put
me over the size limit. <code>gcc</code> also generates a warning about
some calculations not being used. Having just spent 19 hours staring at
this program, sweating over every character, I swear gcc is wrong.</p>
<p>The program is formatted as a poem, to make it more readable. I find
the plaintive chorus “B? B?” particularly poignant. Also, smiley faces
are formatted flush left. (If you don’t find the game entertaining, see
if you can find</p>
<p>When all warnings are enabled, some compilers express the desire
to see a few more parentheses. I respectfully submit that there are
plenty of parentheses in the program (370 in all.) Besides, any
more would put me over the size limit. <code>gcc</code> also generates a
warning about some calculations not being used. Having just spent
19 hours staring at this program, sweating over every character, I
swear gcc is wrong.</p>
<p>The program is formatted as a poem, to make it more readable.
I find the plaintive chorus “B? B?” particularly poignant.
Also, smiley faces are formatted flush left. (If you don’t find
the game entertaining, see if you can find</p>
<pre><code> the fish scales Q)++j&lt;
the shooting star -~- ~ -~i +</code></pre>
<p>in the source code.)</p>
<h3 id="game-strategy-spoiler">GAME STRATEGY SPOILER</h3>
<p>The trick, of course, is to drop items in empty rooms to mark them.
That way you usually know if you’re in a room you’ve seen before. It
greatly aids mapping.</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 trick, of course, is to drop items in empty rooms to mark them. That way
you usually know if you’re in a room you’ve seen before. It greatly aids
mapping.</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-2001jason"><a name="inventory"></a>Inventory for
2001/jason</h1>
<h1 id="inventory-for-2001jason"><a name="inventory"></a>Inventory for 2001/jason</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/2001/jason/jason.c">jason.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/jason/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/jason/jason.orig.c">jason.orig.c</a>
- original source</li>
<li><a href="2001_jason.tar.bz2">2001_jason.tar.bz2</a> - download entry
source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/jason/jason.c">jason.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/jason/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/jason/jason.orig.c">jason.orig.c</a> - original source</li>
<li><a href="2001_jason.tar.bz2">2001_jason.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/2001/jason/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/jason/.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/2001/jason/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/jason/.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/2001/jason/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/jason/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+116 -156
View File
@@ -130,8 +130,8 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Kevin_Pulo">Kevin Pulo</a><br>
Location: <a href="../../location.html#AU">AU</a> - <em>Commonwealth of
Australia</em> (<em>Australia</em>) <br><br></li>
Location: <a href="../../location.html#AU">AU</a> - <em>Commonwealth of Australia</em> (<em>Australia</em>)
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -141,35 +141,30 @@ Australia</em> (<em>Australia</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 another version which lets you use the arrow keys rather
than the more awkward <code>,</code> and <code>.</code> keys. See <a
href="#alternate-code">alternate code</a> below.</p>
<p>There is another version which lets you use the arrow keys rather than the more
awkward <code>,</code> and <code>.</code> keys. 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#2001_kev">2001 kev bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_kev">2001 kev 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">./kev</span> <span class="co"># in one terminal</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="ex">./kev</span> hostname <span class="co"># in another terminal</span></span></code></pre></div>
<p>NOTE: each player’s paddle is at the bottom and the opponent at the
top.</p>
<p>NOTE: each player’s paddle is at the bottom and the opponent at the top.</p>
<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">./kev</span> <span class="co"># in one terminal</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="ex">./kev</span> localhost <span class="co"># in another terminal on the same host</span></span></code></pre></div>
<p>If you need to change the speed you can reconfigure it like (say for
over a network and not the same host):</p>
<p>If you need to change the speed you can reconfigure it like (say
for over a network and not the same host):</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="fu">make</span> clobber SPEED=50 all <span class="co"># original default value which is very fast</span></span></code></pre></div>
<p>If you wish to change the port you can do so like:</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">make</span> clobber PORT=3773 all</span></code></pre></div>
<p>Of course if you want a port &lt; 1024 you’ll need to be root so
don’t do that.</p>
<p>And if you know what you’re doing you can redefine the call to the
<code>socket(2)</code> syscall with the <code>l_</code> macro, changing
the <code>L</code> variable like one would <code>PORT</code>. Of course
you can do more than one at the same time. For instance to change the
<p>Of course if you want a port &lt; 1024 you’ll need to be root so don’t do that.</p>
<p>And if you know what you’re doing you can redefine the call to the <code>socket(2)</code>
syscall with the <code>l_</code> macro, changing the <code>L</code> variable like one would <code>PORT</code>. Of
course you can do more than one at the same time. For instance to change the
speed and port:</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> clobber SPEED=512 PORT=3773 all</span></code></pre></div>
<p>If you have <code>xterm</code> try on one system:</p>
@@ -178,32 +173,27 @@ speed and port:</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">xterm</span> <span class="at">-geometry</span> 80x40 <span class="at">-fg</span> green <span class="at">-bg</span> black <span class="at">-fn</span> 9x15bold <span class="at">-e</span> ./kev localhost<span class="kw">&amp;</span></span></code></pre></div>
<p>This might look nicer than just the terminal itself.</p>
<h2 id="alternate-code">Alternate code:</h2>
<p>This version allows you to use arrow keys on the keyboard rather than
the more awkward <code>,</code> and <code>.</code> keys to move your
paddle.</p>
<p>This version allows you to use arrow keys on the keyboard rather than the more
awkward <code>,</code> and <code>.</code> keys to move your paddle.</p>
<h3 id="alternate-build">Alternate build:</h3>
<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="fu">make</span> alt</span></code></pre></div>
<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="fu">make</span> alt</span></code></pre></div>
<p>You can reconfigure the macros described above in the same way.</p>
<h3 id="alternate-use">Alternate use:</h3>
<p>Use <code>kev.alt</code> as you would <code>kev</code>.</p>
<p>What happens if you use both, one in one terminal and the other in
another terminal?</p>
<p>What happens if you use both, one in one terminal and the other in another
terminal?</p>
<h3 id="alternate-try">Alternate try:</h3>
<p>If you have <code>xterm</code> try on one system:</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">xterm</span> <span class="at">-geometry</span> 80x40 <span class="at">-fg</span> green <span class="at">-bg</span> black <span class="at">-fn</span> 9x15bold <span class="at">-e</span> ./kev.alt <span class="kw">&amp;</span></span></code></pre></div>
<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">xterm</span> <span class="at">-geometry</span> 80x40 <span class="at">-fg</span> green <span class="at">-bg</span> black <span class="at">-fn</span> 9x15bold <span class="at">-e</span> ./kev.alt <span class="kw">&amp;</span></span></code></pre></div>
<p>and then the other, the client system:</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">xterm</span> <span class="at">-geometry</span> 80x40 <span class="at">-fg</span> green <span class="at">-bg</span> black <span class="at">-fn</span> 9x15bold <span class="at">-e</span> ./kev.alt localhost<span class="kw">&amp;</span></span></code></pre></div>
<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">xterm</span> <span class="at">-geometry</span> 80x40 <span class="at">-fg</span> green <span class="at">-bg</span> black <span class="at">-fn</span> 9x15bold <span class="at">-e</span> ./kev.alt localhost<span class="kw">&amp;</span></span></code></pre></div>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>Continuing with this year’s “retro game” theme, this is another old
game; arguably, one of the oldest. Requires a functioning network, and
curses.</p>
<p>The graphics aren’t the impressive part; the graphics and network
are. How many games come out at $50 and still require you to wait for a
patch to come out before you can play multiplayer? This one works out of
the box.</p>
<p>Continuing with this year’s “retro game” theme, this is another old game;
arguably, one of the oldest. Requires a functioning network, and curses.</p>
<p>The graphics aren’t the impressive part; the graphics and network are.
How many games come out at $50 and still require you to wait for a patch
to come out before you can play multiplayer? This one works out of the
box.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p><strong>NETWORK PONG!</strong></p>
<h3 id="requirements">REQUIREMENTS</h3>
@@ -213,159 +203,129 @@ the box.</p>
<li><code>usleep(3)</code></li>
</ul>
<h3 id="description">DESCRIPTION</h3>
<p>This program is a two-player networked version of the eighties arcade
classic, <a href="https://en.wikipedia.org/wiki/Pong">Pong</a>. It uses
standard TCP sockets to communicate over the net, and
<code>ncurses</code> for display. It supports variable terminal sizes
(though both players must have the same terminal size) and game speeds.
Each player has a paddle to hit the ball, and you get points for getting
the ball past your opponent’s paddle. It’s pretty fun! :)</p>
<p>This program is a two-player networked version of the eighties arcade classic,
<a href="https://en.wikipedia.org/wiki/Pong">Pong</a>. It uses standard TCP sockets to
communicate over the net, and <code>ncurses</code> for display. It supports variable
terminal sizes (though both players must have the same terminal size) and game
speeds. Each player has a paddle to hit the ball, and you get points for
getting the ball past your opponent’s paddle. It’s pretty fun! :)</p>
<h3 id="running">RUNNING</h3>
<p>Run the server first without any command line arguments, i.e.</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">./kev</span></span></code></pre></div>
<p>Then run the client with a single command line argument which is the
name of the machine running the server, e.g.</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">./kev</span> localhost</span></code></pre></div>
<p>Make sure that the terminals on both ends are the same size. Also,
the TCP port number (by default 5455) specified in the <a
href="Makefile">Makefile</a> mustn’t be blocked by a firewall.</p>
<p>Here’s a good quick example to see it in action on your own machine,
assuming you have <code>Xwindows</code>:</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">xterm</span> <span class="at">-geometry</span> 80x40 <span class="at">-fg</span> green <span class="at">-bg</span> black <span class="at">-fn</span> 9x15bold <span class="at">-e</span> ./kev <span class="kw">&amp;</span></span>
<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">./kev</span></span></code></pre></div>
<p>Then run the client with a single command line argument which is
the name of the machine running the server, e.g.</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">./kev</span> localhost</span></code></pre></div>
<p>Make sure that the terminals on both ends are the same size. Also, the TCP port
number (by default 5455) specified in the <a href="Makefile">Makefile</a> mustn’t be
blocked by a firewall.</p>
<p>Here’s a good quick example to see it in action on your own
machine, assuming you have <code>Xwindows</code>:</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">xterm</span> <span class="at">-geometry</span> 80x40 <span class="at">-fg</span> green <span class="at">-bg</span> black <span class="at">-fn</span> 9x15bold <span class="at">-e</span> ./kev <span class="kw">&amp;</span></span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a><span class="ex">xterm</span> <span class="at">-geometry</span> 80x40 <span class="at">-fg</span> green <span class="at">-bg</span> black <span class="at">-fn</span> 9x15bold <span class="at">-e</span> ./kev localhost<span class="kw">&amp;</span></span></code></pre></div>
<h3 id="playing">PLAYING</h3>
<p>Your paddle is the one at the bottom of the screen, your opponent is
at the top. To move your paddle left, hold down <code>,</code>
(i.e. <code>&lt;</code> but don’t press shift). To move your paddle
right, hold down <code>.</code>. To quit, either player may press
<code>q</code>.</p>
<p>The current score is shown on the left side of the halfway line. Your
score is the lower number, your opponents score is the upper number.
Your score is the number of times your opponent has missed the ball.</p>
<p>Your paddle is the one at the bottom of the screen, your opponent
is at the top. To move your paddle left, hold down <code>,</code> (i.e. <code>&lt;</code>
but don’t press shift). To move your paddle right, hold down <code>.</code>.
To quit, either player may press <code>q</code>.</p>
<p>The current score is shown on the left side of the halfway line.
Your score is the lower number, your opponents score is the upper
number. Your score is the number of times your opponent has
missed the ball.</p>
<p>You can control the speed of the ball by the motion of your paddle
when the ball hits it. If your paddle is still, then the ball just
bounces normally off it. If your paddle is moving in the same direction
as the ball, then the ball’s speed in that direction will increase. If
your paddle is moving in the opposite direction to the ball, then the
ball’s speed in that direction will decrease (or if the ball is going
slowly enough, it’ll turn around).</p>
<p>You might want to increase your keyboard repeat rate before playing.
On the Linux console try <code>kbdrate -r 24.0 -d 250</code>
(<code>kbdrate</code> might be “hidden” from normal users in
<code>/sbin</code>, and you might need to be root anyway), in
<code>Xwindows</code> try <code>xset r rate 250 24</code> (find out your
current rate first with <code>xset q</code>, so that you can reset it
later).</p>
when the ball hits it. If your paddle is still, then the ball
just bounces normally off it. If your paddle is moving in the
same direction as the ball, then the ball’s speed in that
direction will increase. If your paddle is moving in the opposite
direction to the ball, then the ball’s speed in that direction
will decrease (or if the ball is going slowly enough, it’ll turn
around).</p>
<p>You might want to increase your keyboard repeat rate before
playing. On the Linux console try <code>kbdrate -r 24.0 -d 250</code>
(<code>kbdrate</code> might be “hidden” from normal users in <code>/sbin</code>, and you
might need to be root anyway), in <code>Xwindows</code> try <code>xset r rate 250 24</code> (find out your current rate first with <code>xset q</code>, so that you
can reset it later).</p>
<p>Look below in the Building section for info on how to speed up or
slow down the game (useful if you increase or decrease the terminal
size).</p>
slow down the game (useful if you increase or decrease the
terminal size).</p>
<h3 id="building">BUILDING</h3>
<p>Just run <code>make</code> to use the Makefile as above. The
<code>SPEED</code> variable in the Makefile controls the speed of the
game (defaults to <code>50</code>). This speed is the delay between
frames in milliseconds. Thus a value of 0 will make the game go as fast
as your network can handle, and values less than 50 are useful for
larger terminals or more exciting games. The program needs bandwidth
equal to 1/s bytes per second (where <code>s</code> is the speed value).
Any latency on the network will be added to <code>s</code> - so you
should probably subtract any latency from the value of <code>s</code>
you want to have. Given that <code>loopback</code> and fast Ethernet
LANs are both much less than 1ms of latency, you should only need to
worry about this if you plan on playing over a slower link like a cable
modem, DSL, or (God-forbid) dial-up.</p>
<p>Just run <code>make</code> to use the Makefile as above. The <code>SPEED</code> variable in the
Makefile controls the speed of the game (defaults to <code>50</code>). This speed is the
delay between frames in milliseconds. Thus a value of 0 will make the game go
as fast as your network can handle, and values less than 50 are useful for
larger terminals or more exciting games. The program needs bandwidth equal to
1/s bytes per second (where <code>s</code> is the speed value). Any latency on the network
will be added to <code>s</code> - so you should probably subtract any latency from the
value of <code>s</code> you want to have. Given that <code>loopback</code> and fast Ethernet LANs are
both much less than 1ms of latency, you should only need to worry about this if
you plan on playing over a slower link like a cable modem, DSL, or (God-forbid)
dial-up.</p>
<p>The TCP port to use for network communications is specified by the
<code>PORT</code> variable in the Makefile. If the default of
<code>5455</code> is blocked for whatever reason, you can change it to
something else. Of course if you use a port &lt; 1024, you’ll need to be
root.</p>
<code>PORT</code> variable in the Makefile. If the default of <code>5455</code> is
blocked for whatever reason, you can change it to something else.
Of course if you use a port &lt; 1024, you’ll need to be root.</p>
<h3 id="obfuscation">OBFUSCATION</h3>
<p>The program’s broad structure is fairly straightforward, but
individual tasks are rarely done in a straightforward manner. ;)</p>
<p>Identifier names have mostly been chosen to resemble paddles and
balls, and to generally decrease readability.</p>
<p>The source has been cleverly formatted to resemble one of the paddles
from the game, rotated 90 degrees. ;) (The “source paddle” has
approximately the same aspect ratio as the game at 80 columns wide,
which is 1:10.)</p>
<p>Finally, the number of “non-whitespace characters” (as defined by the
rules) in the file is exactly 2048, which I think is rather unexpectedly
cool. :)</p>
<p>The source has been cleverly formatted to resemble one of the
paddles from the game, rotated 90 degrees. ;) (The “source
paddle” has approximately the same aspect ratio as the game at 80
columns wide, which is 1:10.)</p>
<p>Finally, the number of “non-whitespace characters” (as defined by
the rules) in the file is exactly 2048, which I think is rather
unexpectedly cool. :)</p>
<h3 id="bugs">BUGS</h3>
<p>There are 3 warnings when I compile with gcc 2.95.3
(<code>-Wall -ansi -pedantic</code>) on my Linux system, but all are
completely harmless.</p>
<p>I don’t like the curses and/or termcaps/terminfos on IRIX and Solaris
(the only two non-Linux systems I have access to). Despite calling
<code>timeout(0);</code>, <code>notimeout(win, TRUE);</code>,
<code>nodelay(win, TRUE);</code> and/or
<code>keypad(win, FALSE);</code>, it still seems to force a delay into
calls to <code>getch()</code> - I’m guessing at a termcap/terminfo
level. At any rate, I can’t seem to force no delay. This is a shame,
because it basically plays havoc with the input code, particularly the
read-ahead canceller. It still works, but not nearly as well (key
presses are dodgy and holding down keys doesn’t always work), and so I
<em>much</em> prefer and recommend Linux <code>libncurses</code>.</p>
<p>Sometimes when <code>q</code> is pressed in one, the other will crash
out with <code>Broken pipe</code>.</p>
<p>There are 3 warnings when I compile with gcc 2.95.3 (<code>-Wall -ansi -pedantic</code>) on my Linux system, but all are completely harmless.</p>
<p>I don’t like the curses and/or termcaps/terminfos on IRIX and
Solaris (the only two non-Linux systems I have access to).
Despite calling <code>timeout(0);</code>, <code>notimeout(win, TRUE);</code>, <code>nodelay(win, TRUE);</code> and/or <code>keypad(win, FALSE);</code>, it still seems to force a delay
into calls to <code>getch()</code> - I’m guessing at a termcap/terminfo level.
At any rate, I can’t seem to force no delay. This is a shame,
because it basically plays havoc with the input code, particularly
the read-ahead canceller. It still works, but not nearly as well
(key presses are dodgy and holding down keys doesn’t always work),
and so I <em>much</em> prefer and recommend Linux <code>libncurses</code>.</p>
<p>Sometimes when <code>q</code> is pressed in one, the other will crash out
with <code>Broken pipe</code>.</p>
<p>If the specified port can’t be bound or connected to, the program
segfaults.</p>
<p>If your terminal is too wide (we’re talking gigantic here - over 500
characters wide) then the program can segfault. It’s also possible to
crash the program a player scores over a billion points (1e9). Maybe you
can consider that the goal… ;)</p>
<p>If your terminal is too wide (we’re talking gigantic here - over
500 characters wide) then the program can segfault. It’s also
possible to crash the program a player scores over a billion
points (1e9). Maybe you can consider that the goal… ;)</p>
<p>If you run the client and server on different architectures, both
architectures need to have the same character systems (i.e. don’t try
mixing ASCII and EBCDIC). It is independent of endianness though.</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>
architectures need to have the same character systems (i.e. don’t
try mixing ASCII and EBCDIC). It is independent of endianness
though.</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-2001kev"><a name="inventory"></a>Inventory for
2001/kev</h1>
<h1 id="inventory-for-2001kev"><a name="inventory"></a>Inventory for 2001/kev</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/2001/kev/kev.c">kev.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/kev.alt.c">kev.alt.c</a>
- alternative source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/kev.orig.c">kev.orig.c</a>
- original source</li>
<li><a href="2001_kev.tar.bz2">2001_kev.tar.bz2</a> - download entry
source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/kev.c">kev.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/kev.alt.c">kev.alt.c</a> - alternative source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/kev.orig.c">kev.orig.c</a> - original source</li>
<li><a href="2001_kev.tar.bz2">2001_kev.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/2001/kev/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/.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/2001/kev/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/.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/2001/kev/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/kev/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+38 -63
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Nicolas_Ollinger">Nicolas
Ollinger</a><br> Location: <a href="../../location.html#FR">FR</a> -
<em>French Republic</em> (<em>France</em>) <br><br></li>
<li>Name: <a href="../../authors.html#Nicolas_Ollinger">Nicolas Ollinger</a><br>
Location: <a href="../../location.html#FR">FR</a> - <em>French Republic</em> (<em>France</em>)
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -151,22 +151,20 @@ high (200x100) with a tiny font.</p>
<p>Do get lost in the program’s line of thought! :-)</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<h3 id="whats-this">What’s this?</h3>
<p>What do you see? On the left, you will see an enumeration of all
successive <a
href="https://en.wikipedia.org/wiki/Prime_number">primes</a> from 2 to
the parameter you gave to the program. On the right part, you can see
the sieve used to find these primes. The big diagonals from right to
left are used to erase composed numbers. When no diagonal crosses a
number, then the left cell take value 1 and the number is prime.</p>
<p>The parallel version of this algorithm works in real time
<code>n</code>. This C sequential version is slower as it works in
<code>O(n*log n)</code>. But you have some nice picture instead… the
cost is a constant number of operation for each character printed on the
screen.</p>
<p>What do you see? On the left, you will see an enumeration of all successive
<a href="https://en.wikipedia.org/wiki/Prime_number">primes</a> from 2 to the parameter you
gave to the program. On the right part, you can see the sieve used to find these
primes. The big diagonals from right to left are used to erase composed numbers.
When no diagonal crosses a number, then the left cell take value 1 and the
number is prime.</p>
<p>The parallel version of this algorithm works in real time <code>n</code>. This C
sequential version is slower as it works in <code>O(n*log n)</code>. But you have some
nice picture instead… the cost is a constant number of operation for each
character printed on the screen.</p>
<h3 id="why-did-i-write-this">Why did I write this ?</h3>
<p>Let’s just quote the <a href="../../faq.html">FAQ</a>:</p>
<p>Q: Are there types of entries that are submitted so frequently that
the judges get tired of them?</p>
<p>Q: Are there types of entries that are submitted so frequently that the
judges get tired of them?</p>
<p>A: Yes, there are types of entries that show up over and over again.
The guidelines say:</p>
<pre><code>We tend to dislike programs that:
@@ -197,72 +195,49 @@ entries that use some complex state machine/table to print something
1988/phillipps
Unbeaten for 12 years and counting...</code></pre>
<p>I think this is enough motivation for trying to submit a program
which uses some complex state machine/table to generate small primes and
print them.</p>
<p>I think this is enough motivation for trying to submit a program which uses
some complex state machine/table to generate small primes and print them.</p>
<h3 id="the-way-it-works">The way it works</h3>
<p>This program simply prints the space-time diagram of some particular
cellular automaton. The automaton is a 9-state automaton by <a
href="https://sk-m-wikipedia-org.translate.goog/wiki/Ivan_Korec?_x_tr_sl=auto&amp;_x_tr_tl=en&amp;_x_tr_hl=en-US&amp;_x_tr_pto=wapp">Ivan
Korec</a> in 1998. It is an optimization of an old automaton for
recognizing primes designed by <a
href="http://richardallenfischer.com">Fischer</a> in 1965.</p>
<p>The table of the automaton is encoded into the string <code>e</code>
and consists of 345 transitions of the kind
<code>ff(left,middle,right)</code>. This encoding into <code>e</code> is
obfuscated to reduce its size, restrict it to characters 32 to 127 and
cellular automaton. The automaton is a 9-state automaton by <a href="https://sk-m-wikipedia-org.translate.goog/wiki/Ivan_Korec?_x_tr_sl=auto&amp;_x_tr_tl=en&amp;_x_tr_hl=en-US&amp;_x_tr_pto=wapp">Ivan
Korec</a> in 1998.
It is an optimization of an old automaton for recognizing primes designed
by <a href="http://richardallenfischer.com">Fischer</a> in 1965.</p>
<p>The table of the automaton is encoded into the string <code>e</code> and consists of
345 transitions of the kind <code>ff(left,middle,right)</code>. This encoding into <code>e</code>
is obfuscated to reduce its size, restrict it to characters 32 to 127 and
guarantee a constant time.</p>
<p>The main loop simply iterates this transition function on each
cell.</p>
<p>The main loop simply iterates this transition function on each cell.</p>
<p>“The rest is silence” (Hamlet, V.2)</p>
<p>Enjoy!</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-2001ollinger"><a name="inventory"></a>Inventory
for 2001/ollinger</h1>
<h1 id="inventory-for-2001ollinger"><a name="inventory"></a>Inventory for 2001/ollinger</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/2001/ollinger/ollinger.c">ollinger.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/ollinger.orig.c">ollinger.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/try.sh">try.sh</a>
- how to run</li>
<li><a href="2001_ollinger.tar.bz2">2001_ollinger.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/ollinger.c">ollinger.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/ollinger.orig.c">ollinger.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/try.sh">try.sh</a> - how to run</li>
<li><a href="2001_ollinger.tar.bz2">2001_ollinger.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/2001/ollinger/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/.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/2001/ollinger/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/.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/2001/ollinger/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/ollinger/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+49 -77
View File
@@ -129,10 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Edward_Rosten">Edward
Rosten</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#Edward_Rosten">Edward Rosten</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 -->
@@ -145,12 +144,11 @@ Rosten</a><br> Location: <a href="../../location.html#GB">GB</a> -
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
<p>The current status of this entry is:</p>
<pre><code>STATUS: missing files - please provide them</code></pre>
<p>For more detailed information see <a
href="../../bugs.html#2001_rosten">2001 rosten bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_rosten">2001 rosten 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">./rosten</span> <span class="pp">[</span><span class="ss">number</span><span class="pp">]</span></span></code></pre></div>
<p>WARNING: this will mess with your mouse and can make it hard to quit
the program. Use at your own risk.</p>
<p>WARNING: this will mess with your mouse and can make it hard to quit the
program. Use at your own risk.</p>
<p>NOTE: number is floating point.</p>
<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">./rosten</span> 1.03</span>
@@ -162,31 +160,28 @@ the program. Use at your own risk.</p>
cursor) in the wrong way. :-)</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<h3 id="name">NAME</h3>
<p><code>rosten</code> - make the mouse act as if it has been
greased</p>
<p><code>rosten</code> - make the mouse act as if it has been greased</p>
<h3 id="synopsis">SYNOPSIS</h3>
<div class="sourceCode" id="cb6"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./rosten</span> <span class="pp">[</span><span class="ss">greasiness</span><span class="pp">]</span></span></code></pre></div>
<h3 id="description">DESCRIPTION</h3>
<p>This program is designed primarily to make your X windows interface
more obfuscated. Try doing something mouse driven (such as using a mouse
<p>This program is designed primarily to make your X windows interface more
obfuscated. Try doing something mouse driven (such as using a mouse
driven editor on this program) whilst it is running. If you’re not sure
what it does, looking at the code should give a fair idea.</p>
<p>It also has a [cat] man page if you want to install it as a
‘utility’.</p>
<p>It also has a [cat] man page if you want to install it as a ‘utility’.</p>
<h3 id="options">OPTIONS</h3>
<p>It only takes one optional option: the greasiness factor. This is the
number that the speed is divided by on each iteration. The default is
1.03. A setting of 1 - no friction - is fun as is 0.99.</p>
<p>Being an X program, it recognises the <code>DISPLAY</code>
variable.</p>
<p>Being an X program, it recognises the <code>DISPLAY</code> variable.</p>
<h3 id="portability">PORTABILITY</h3>
<p>The program is very portable, even to non X architectures. All that
is required is a large desk and some good grease.</p>
<p>The program is very portable, even to non X architectures. All that is
required is a large desk and some good grease.</p>
<h3 id="comments">COMMENTS</h3>
<p>It is really rather surprising that code like this should not only be
portable, but compile with almost no warnings on most of the compilers
tested. It’s a kind of shame that none of the compilers do anything like
this:</p>
tested. It’s a kind of shame that none of the compilers do anything
like this:</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">$</span> make greasymouse</span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a><span class="fu">cc</span> greasymouse.c <span class="at">-o</span> greasymouse <span class="at">-lX11</span></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a><span class="ex">greasymouse.c:30:</span> This macro should have more text and spaces in it</span>
@@ -196,89 +191,66 @@ this:</p>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a><span class="st">greasymouse.c:55: So is that</span></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a><span class="st">...</span></span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true" tabindex="-1"></a><span class="st">greasymouse.c:58: This program is rubbish. I&#39;</span>m not going to link it.</span></code></pre></div>
<p>The code is best viewed with <a
href="https://en.wikipedia.org/wiki/Tab_stop">tab stops</a> every 8
spaces.</p>
<p>The code is best viewed with <a href="https://en.wikipedia.org/wiki/Tab_stop">tab stops</a> every 8 spaces.</p>
<h3 id="bugs">BUGS</h3>
<p>The mouse gets stuck completely if you give it an option of less than
1 and leave it for too long. This is quite annoying if it didn’t leave
the terminal it was run from in focus.</p>
<p>It gets very jerky if the processor is being used. There are better
time functions than <code>clock()</code> but I haven’t used them.</p>
<p>The mouse gets stuck completely if you give it an option of less
than 1 and leave it for too long. This is quite annoying if it
didn’t leave the terminal it was run from in focus.</p>
<p>It gets very jerky if the processor is being used. There are
better time functions than <code>clock()</code> but I haven’t used them.</p>
<p>It deflects slightly when it gets very slow.</p>
<p>It annoys other people if you run it on their display too often.
Maybe I should make future versions print funny jokes to keep the humor
fresh.</p>
<p>It annoys other people if you run it on their display too
often. Maybe I should make future versions print funny jokes to
keep the humor fresh.</p>
<p>It’s pretty ropey over a 56K modem.</p>
<p>It’s even ropier over a 56K modem and tunneled through 3 ssh
links.</p>
<p>It’s even ropier over a 56K modem and tunneled through 3 ssh links.</p>
<h3 id="warnings">WARNINGS</h3>
<p>Pages and pages and pages of things, with GCC at any rate.</p>
<p>It suggests loads of <code>()</code>s where they’re not needed.</p>
<p>It reckons I have not used some of the values I have computed. I
would never do a thing like that: I just haven’t used them in the way
it’s used to.</p>
<p>The MIPS compiler suggests an <code>==</code> instead of an
<code>=</code> in expressions such as:</p>
would never do a thing like that: I just haven’t used them in
the way it’s used to.</p>
<p>The MIPS compiler suggests an <code>==</code> instead of an <code>=</code> in expressions
such as:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="op">&amp;&amp;(</span>a<span class="op">=</span>b<span class="op">)</span></span></code></pre></div>
<p>but its suggestions would break my program. It also reckons that
<code>r()</code> has no prototype.</p>
<p>Giving the <code>-pedantic</code> option to the MIPS compiler causes
it to generate warnings about its own header files, but not any extra
ones with this program.</p>
<p>but its suggestions would break my program. It also reckons
that <code>r()</code> has no prototype.</p>
<p>Giving the <code>-pedantic</code> option to the MIPS compiler causes it to generate
warnings about its own header files, but not any extra ones with this
program.</p>
<p>With all warnings enabled, the DEC compiler, oddly enough finds some
problems with its own include files, but none with my program.</p>
<h3 id="errors">ERRORS</h3>
<p>The DEC compiler of this version:
<code>DEC C V5.6-079 on Digital UNIX V4.0 (Rev. 878)</code> can’t
compile the code. It thinks that preprocessor lines can not have
whitespace preceding the <code>#</code>. Moving the preprocessor
directives to the beginning of the line wrecks the layout but makes it
compile.</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 DEC compiler of this version: <code>DEC C V5.6-079 on Digital UNIX V4.0 (Rev. 878)</code> can’t compile the code. It thinks that preprocessor lines can not have
whitespace preceding the <code>#</code>. Moving the preprocessor directives to the
beginning of the line wrecks the layout but makes it compile.</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-2001rosten"><a name="inventory"></a>Inventory for
2001/rosten</h1>
<h1 id="inventory-for-2001rosten"><a name="inventory"></a>Inventory for 2001/rosten</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/2001/rosten/rosten.c">rosten.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/rosten/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/rosten/rosten.orig.c">rosten.orig.c</a>
- original source</li>
<li><a href="2001_rosten.tar.bz2">2001_rosten.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/rosten/rosten.c">rosten.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/rosten/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/rosten/rosten.orig.c">rosten.orig.c</a> - original source</li>
<li><a href="2001_rosten.tar.bz2">2001_rosten.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/2001/rosten/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/rosten/.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/2001/rosten/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/rosten/.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/2001/rosten/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/rosten/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+47 -77
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Jens_Schweikhardt">Jens
Schweikhardt</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#Jens_Schweikhardt">Jens Schweikhardt</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,36 +144,31 @@ Schweikhardt</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#2001_schweikh">2001 schweikh bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_schweikh">2001 schweikh 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">./schweikh</span> string string2</span></code></pre></div>
<p>This program will very likely crash or do something else if you do
not give it two args.</p>
<p>Note also that the glob pattern must match the whole string. See the
author’s comments for details and a workaround.</p>
<p>This program will very likely crash or do something else if you do not give it
two args.</p>
<p>Note also that the glob pattern must match the whole string. See the author’s
comments for details and a workaround.</p>
<p>There’s also no way to escape meta characters.</p>
<p>This is supposed to happen. As is written in the <a
href="http://catb.org/jargon/html/F/feature.html">The Jargon
File</a>:</p>
<p>This is supposed to happen. As is written in the
<a href="http://catb.org/jargon/html/F/feature.html">The Jargon File</a>:</p>
<pre><code>That&#39;s not a bug, that&#39;s a feature.</code></pre>
<h2 id="try">Try:</h2>
<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>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>Do you get the pattern here?</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>This one-liner program is a glob pattern matcher. It understands the
glob characters <code>*</code> meaning ‘zero or more characters’ and
<code>?</code> meaning exactly one character, just like your unix
shell.</p>
<p>Run it with two args, the string and the glob pattern. The exit
status is 0 (shell true) when the pattern matches, 1 otherwise. The glob
pattern must match the whole string, so you may want to use
<code>*</code> at the beginning and end of the pattern if you are
looking for something in the middle.</p>
<p>You can use it for your shell scripting needs similar to a silent
grep (and without <code>stdout</code> redirected to
<code>/dev/null</code>):</p>
<p>This one-liner program is a glob pattern matcher. It understands
the glob characters <code>*</code> meaning ‘zero or more characters’ and
<code>?</code> meaning exactly one character, just like your unix shell.</p>
<p>Run it with two args, the string and the glob pattern. The exit status is 0
(shell true) when the pattern matches, 1 otherwise. The glob pattern must match
the whole string, so you may want to use <code>*</code> at the beginning and end of the
pattern if you are looking for something in the middle.</p>
<p>You can use it for your shell scripting needs similar to a silent grep
(and without <code>stdout</code> redirected to <code>/dev/null</code>):</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="cf">if</span> <span class="ex">prog</span> <span class="st">&quot;</span><span class="va">${VARIABLE}</span><span class="st">&quot;</span> <span class="st">&#39;&lt;glob&gt;&#39;</span><span class="kw">;</span> <span class="cf">then</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> VARIABLE matches</span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a><span class="cf">else</span></span>
@@ -182,83 +177,58 @@ grep (and without <code>stdout</code> redirected to
<h3 id="bugs">Bugs</h3>
<p>There is no way to escape the meta characters. Dammit Jim, I’m a
one-liner, not a regexp lib.</p>
<p>All obfuscation is obviously in the recursive <code>m()</code>
function, an 86 character glob pattern evaluator, returning nonzero for
a match:</p>
<p>All obfuscation is obviously in the recursive <code>m()</code> function, an 86
character glob pattern evaluator, returning nonzero for a match:</p>
<ul>
<li>Just a single complex return expression.</li>
<li>Nested ternary operator <code>?:</code> to save on
<code>if</code>/<code>else</code> verbosity.</li>
<li>Short circuiting <code>&amp;&amp;</code> and <code>||</code> to save
even more on <code>if</code>/<code>else</code> verbosity.</li>
<li>Subtraction instead of an equality operator in
<code>*t - 42</code>.</li>
<li>Nested ternary operator <code>?:</code> to save on <code>if</code>/<code>else</code> verbosity.</li>
<li>Short circuiting <code>&amp;&amp;</code> and <code>||</code> to save even more on <code>if</code>/<code>else</code> verbosity.</li>
<li>Subtraction instead of an equality operator in <code>*t - 42</code>.</li>
<li>ASCII codes for <code>*</code> and <code>?</code>.</li>
<li>Careful use of blanks even though this year’s rules have extended
that resource limit.</li>
<li>The source is a complete preprocessed C program. Because it
communicates with the world out there by means of <code>argv</code> and
the exit status, there is no need for <code>stdio.h</code> bloat. An asm
guru could surely squeeze this program in less than a screenful.</li>
<li>The source is a complete preprocessed C program. Because it communicates
with the world out there by means of <code>argv</code> and the exit status, there
is no need for <code>stdio.h</code> bloat. An asm guru could surely squeeze this
program in less than a screenful.</li>
<li><code>indent(1)</code> is probably not too helpful.</li>
</ul>
<p>The recursion wonderfully and magically takes care of iteration and
backtracking. I could tell you how it works but then I would have to
<strike>kill</strike> request a NDA from you :-) Run it under a debugger
with several inputs, it will be quite helpful and instructive. Handling
of <code>?</code> is straightforward; for <code>*</code> start out with
<code>*foo</code> and <code>foo*</code> against <code>foo</code>. How
does it deal with sequences of adjacent <code>*</code>? How could this
be improved? If all else fails, recode the <code>?:</code> operators
with <code>if</code>/<code>else</code> and try again. For extra credit
implement character classes like <code>[a-z]</code>.</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>
<strike>kill</strike> request a NDA from you :-) Run it under a debugger with several
inputs, it will be quite helpful and instructive. Handling of <code>?</code> is
straightforward; for <code>*</code> start out with <code>*foo</code> and <code>foo*</code> against <code>foo</code>.
How does it deal with sequences of adjacent <code>*</code>? How could this be
improved? If all else fails, recode the <code>?:</code> operators with <code>if</code>/<code>else</code> and
try again. For extra credit implement character classes like <code>[a-z]</code>.</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-2001schweikh"><a name="inventory"></a>Inventory
for 2001/schweikh</h1>
<h1 id="inventory-for-2001schweikh"><a name="inventory"></a>Inventory for 2001/schweikh</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/2001/schweikh/schweikh.c">schweikh.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/schweikh.orig.c">schweikh.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/try.sh">try.sh</a>
- how to run</li>
<li><a href="2001_schweikh.tar.bz2">2001_schweikh.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/schweikh.c">schweikh.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/schweikh.orig.c">schweikh.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/try.sh">try.sh</a> - how to run</li>
<li><a href="2001_schweikh.tar.bz2">2001_schweikh.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/2001/schweikh/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/.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/2001/schweikh/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/.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/2001/schweikh/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/schweikh/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 -134
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Brian_Westley">Brian
Westley</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#Brian_Westley">Brian Westley</a><br>
Location: <a href="../../location.html#US">US</a> - <em>United States of America</em> (<em>United States</em>)
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -141,18 +141,16 @@ Westley</a><br> Location: <a href="../../location.html#US">US</a> -
<h2 id="to-build">To build:</h2>
<div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">make</span></span></code></pre></div>
<p>There are two additional programs based on the author’s remarks and
the original version, provided as alternate code as it might be less
portable. See <a href="#sorted-code">sorted code</a>, <a
href="#punch-card-code">punch card code</a> and <a
href="#alternate-code">alternate code</a> below.</p>
<p>There are two additional programs based on the author’s remarks and the original
version, provided as alternate code as it might be less portable. See <a href="#sorted-code">sorted
code</a>, <a href="#punch-card-code">punch card code</a> and <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: uses gets() - change to fgets() if possible
STATUS: missing files - please provide them
STATUS: main() has only one arg - try and make it have 2 or 3</code></pre>
<p>For more detailed information see <a
href="../../bugs.html#2001_westley">2001 westley bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_westley">2001 westley 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">./westley</span> <span class="dv">2</span><span class="op">&gt;</span>/dev/null</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="co"># enter some input, terminate with EOF</span></span>
@@ -163,71 +161,62 @@ href="../../bugs.html#2001_westley">2001 westley bugs</a>.</p>
<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="sorted-code">Sorted code:</h2>
<p>The author stated that one can sort (ignoring leading blanks
i.e. <code>sort -b</code>) the code by line and it will always sort the
order of the input.</p>
<p>This is compiled by default; use <code>westley.sort</code> as you
would <code>westley</code> above.</p>
<p>The author stated that one can sort (ignoring leading blanks i.e. <code>sort -b</code>) the
code by line and it will always sort the order of the input.</p>
<p>This is compiled by default; use <code>westley.sort</code> as you would <code>westley</code> above.</p>
<h2 id="punch-card-code">Punch card code:</h2>
<p>The author also stated that if you just sort the code you’ll get the
with <code>sort</code>) version that just prints out the punch card. The
<a href="westley.punch.c">westley.punch.c</a> code is specifically so
that Westley can punch everyone in the face! :-) This is also compiled
by default.</p>
<p>The author also stated that if you just sort the code you’ll get the with
<code>sort</code>) version that just prints out the punch card. The
<a href="westley.punch.c">westley.punch.c</a> code is specifically so that Westley can punch
everyone in the face! :-) This is also compiled by default.</p>
<h3 id="punch-card-try">Punch card try:</h3>
<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">&#39;Brian Westley does it again!&#39;</span> <span class="kw">|</span> <span class="ex">./westley.punch</span> <span class="dv">2</span><span class="op">&gt;</span>/dev/null</span></code></pre></div>
<h2 id="alternate-code">Alternate code:</h2>
<p>An alternate version of this entry, <a
href="westley.alt.c">westley.alt.c</a>, is provided. This alternate code
might be less portable.</p>
<p>An alternate version of this entry, <a href="westley.alt.c">westley.alt.c</a>, is provided.
This alternate code might be less portable.</p>
<h3 id="alternate-build">Alternate build:</h3>
<div class="sourceCode" id="cb6"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="fu">make</span> alt</span></code></pre></div>
<h3 id="alternate-use">Alternate use:</h3>
<p>Use <code>westley.alt</code> as you would <code>westley</code>
above.</p>
<p>Use <code>westley.alt</code> as you would <code>westley</code> above.</p>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>Try copying the source to a new file and changing around the order of
the lines. Does it produce the exact same output?</p>
<p>Try copying the source to a new file and changing around the
order of the lines. Does it produce the exact same output?</p>
<p>By changing the order of the source, figure out in how many different
ways this program can transform input to output.</p>
<p>This assortment of obfuscated lines takes <a
href="https://en.wikipedia.org/wiki/Position-independent_code">position-independent
<p>This assortment of obfuscated lines takes <a href="https://en.wikipedia.org/wiki/Position-independent_code">position-independent
code</a> to a new level! :-)</p>
<p>We find it amazing that with just 28 lines of code (not counting
comments and blank lines) there are <code>28!</code> or
<code>304,888,344,611,713,860,501,504,000,000</code> versions of the
program, all valid C!</p>
<p>We find it amazing that with just 28 lines of code (not counting comments and
blank lines) there are <code>28!</code> or <code>304,888,344,611,713,860,501,504,000,000</code>
versions of the program, all valid C!</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p><a href="https://en.wikipedia.org/wiki/Punched_card">Punch cards</a>,
or Hollerith cards, were becoming obsolete just as C was becoming more
popular*; this is rather unfortunate, because C has an advantage over
many other languages when it comes to punch cards - C programs can be
written to be “drop proof”.</p>
<p><a href="https://en.wikipedia.org/wiki/Punched_card">Punch cards</a>, or Hollerith cards,
were becoming obsolete just as C was becoming more popular*; this is rather
unfortunate, because C has an advantage over many other languages when it comes
to punch cards - C programs can be written to be “drop proof”.</p>
<p>Consider the following C program:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a>main<span class="op">(){</span>a<span class="op">();</span>b<span class="op">();</span>c<span class="op">();}</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>a<span class="op">(){</span>printf<span class="op">(</span><span class="st">&quot;A&quot;</span><span class="op">);}</span></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>b<span class="op">(){</span>printf<span class="op">(</span><span class="st">&quot;B&quot;</span><span class="op">);}</span></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>c<span class="op">(){</span>printf<span class="op">(</span><span class="st">&quot;C&quot;</span><span class="op">);}</span></span></code></pre></div>
<p>This program will compile and run no matter what order the lines are
in. If you punch it on cards (one line of code per card, naturally) and
drop them, you don’t need to put them in any particular order**; it will
always produce <code>ABC</code> as output.</p>
<p>This program will compile and run no matter what order the
lines are in. If you punch it on cards (one line of code per
card, naturally) and drop them, you don’t need to put them in
any particular order**; it will always produce <code>ABC</code> as output.</p>
<p>You can also use global variables:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="dt">char</span> <span class="op">*</span>greet <span class="op">=</span> <span class="st">&quot;Hello, world!&quot;</span><span class="op">;</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="dt">char</span> <span class="op">*</span>greet<span class="op">;</span> main<span class="op">(){</span>puts<span class="op">(</span>greet<span class="op">);}</span></span></code></pre></div>
<p>It would be trivial to write an entire C program that is “drop proof”
using the above techniques; surprisingly, it’s possible to write a
program that will always compile but behave differently depending on the
line order:</p>
<p>It would be trivial to write an entire C program that is
“drop proof” using the above techniques; surprisingly, it’s
possible to write a program that will always compile but
behave differently depending on the line order:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>test<span class="op">(</span>a<span class="op">,</span>b<span class="op">){</span><span class="cf">return</span> a<span class="op">;}</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a><span class="pp">#define test</span><span class="op">(</span><span class="pp">a</span><span class="op">,</span><span class="pp">b</span><span class="op">)</span><span class="pp"> test</span><span class="op">(</span><span class="pp">b</span><span class="op">,</span><span class="pp">a</span><span class="op">)</span></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a>main<span class="op">(){</span><span class="cf">if</span> <span class="op">(</span>test<span class="op">(</span><span class="dv">0</span><span class="op">,</span><span class="dv">1</span><span class="op">))</span> printf<span class="op">(</span><span class="st">&quot;T&quot;</span><span class="op">);</span> <span class="cf">else</span> printf<span class="op">(</span><span class="st">&quot;F&quot;</span><span class="op">);}</span></span></code></pre></div>
<p>This program will print out <code>T</code> if the
<code>#define</code> statement falls between the declaration of
<code>test()</code> and its use in <code>main()</code>, otherwise it
will print out <code>F</code>. Furthermore, you can use the same call to
<code>test()</code> repeatedly in different lines to return different
values:</p>
<p>This program will print out <code>T</code> if the <code>#define</code> statement
falls between the declaration of <code>test()</code> and its use in
<code>main()</code>, otherwise it will print out <code>F</code>. Furthermore,
you can use the same call to <code>test()</code> repeatedly in
different lines to return different values:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#define test</span><span class="op">(</span><span class="pp">x</span><span class="op">,</span><span class="pp">y</span><span class="op">)</span><span class="pp"> test</span><span class="op">(</span><span class="pp">y</span><span class="op">,</span><span class="pp">x</span><span class="op">)</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a>main<span class="op">(){</span><span class="dt">int</span> i<span class="op">=</span><span class="dv">0</span><span class="op">;</span>a<span class="op">(&amp;</span>i<span class="op">);</span>b<span class="op">(&amp;</span>i<span class="op">);</span>c<span class="op">(&amp;</span>i<span class="op">);</span>d<span class="op">(&amp;</span>i<span class="op">);</span>printf<span class="op">(</span><span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span><span class="op">,</span>i<span class="op">);}</span></span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a>a<span class="op">(</span>i<span class="op">)</span><span class="dt">int</span><span class="op">*</span>i<span class="op">;{</span><span class="cf">if</span> <span class="op">(</span>test<span class="op">(</span><span class="dv">0</span><span class="op">,</span><span class="dv">1</span><span class="op">))</span> <span class="op">*</span>i <span class="op">+=</span> <span class="dv">1</span><span class="op">;}</span></span>
@@ -235,14 +224,15 @@ values:</p>
<span id="cb10-5"><a href="#cb10-5" aria-hidden="true" tabindex="-1"></a>c<span class="op">(</span>i<span class="op">)</span><span class="dt">int</span><span class="op">*</span>i<span class="op">;{</span><span class="cf">if</span> <span class="op">(</span>test<span class="op">(</span><span class="dv">0</span><span class="op">,</span><span class="dv">1</span><span class="op">))</span> <span class="op">*</span>i <span class="op">+=</span> <span class="dv">4</span><span class="op">;}</span></span>
<span id="cb10-6"><a href="#cb10-6" aria-hidden="true" tabindex="-1"></a>d<span class="op">(</span>i<span class="op">)</span><span class="dt">int</span><span class="op">*</span>i<span class="op">;{</span><span class="cf">if</span> <span class="op">(</span>test<span class="op">(</span><span class="dv">0</span><span class="op">,</span><span class="dv">1</span><span class="op">))</span> <span class="op">*</span>i <span class="op">+=</span> <span class="dv">8</span><span class="op">;}</span></span>
<span id="cb10-7"><a href="#cb10-7" aria-hidden="true" tabindex="-1"></a>test<span class="op">(</span>x<span class="op">,</span>y<span class="op">){</span><span class="cf">return</span> x<span class="op">;}</span></span></code></pre></div>
<p>If you enter the above program on punch cards, throw them up in the
air, gather them up, and run it, you will get a number from 0 to 15
printed out. Now <em>that’s</em> a random number generator…</p>
<p>Of course, there are drawbacks to C programming on punch cards; an
80-character line limit can be restricting, and (to be maximally
portable) you need to use trigraphs for the characters
<code>^[]{}\</code> (these aren’t found on every keypunch, and have
various encodings).</p>
<p>If you enter the above program on punch cards, throw them
up in the air, gather them up, and run it, you will get
a number from 0 to 15 printed out. Now <em>that’s</em> a random
number generator…</p>
<p>Of course, there are drawbacks to C programming on punch
cards; an 80-character line limit can be restricting, and
(to be maximally portable) you need to use trigraphs for
the characters <code>^[]{}\</code> (these aren’t found on every
keypunch, and have various encodings).</p>
<p>My C program entry does the following:</p>
<ol type="1">
<li><p>Reads in lines.</p></li>
@@ -251,103 +241,79 @@ various encodings).</p>
<li>if it rearranges the lines, they are sorted or scrambled.</li>
</ul></li>
<li><p>Reverses the order of the lines, or not.</p></li>
<li><p>Prints out the lines as either text or <a
href="https://en.wikipedia.org/wiki/EBCDIC">EBCDIC</a> punch
cards.</p></li>
<li><p>Prints out the lines as either text or
<a href="https://en.wikipedia.org/wiki/EBCDIC">EBCDIC</a> punch cards.</p></li>
</ol>
<p>The code, as written, scrambles the input and prints it out as normal
text, so you can simulate ‘dropping’ the cards. You can repeatedly
scramble the code to get all 12 variants (but the scrambling isn’t very
random; it’s just a bubble sort with a random number, so some variants
are more common than others). You can also just swap the arguments in
the calls to <code>t()</code> in all combinations to get all the
variations.</p>
<p>If you sort the lines, you will get the version that just prints out
the input as punch cards (you will need to display at least 82 columns
of text, or clip the last few chars by piping it through
<code>sed s/...$//</code>). If you use this on the original code, you
will see that it spells out <code>HOLLERITH</code> when punched on cards
(you can see the tall, thin letters spelling out <code>HOLLERITH</code>
if you turn the C code sideways). You will also see why
<code>/KC 0000 K</code> is a <code>Hollerith emoticon</code>.
Unrecognized characters are punched as a lace column. (You can see an
ASCII simulation of the code as punch cards by looking at
<code>card.gif</code>.)</p>
<p>The code, as written, scrambles the input and prints it out
as normal text, so you can simulate ‘dropping’ the cards.
You can repeatedly scramble the code to get all 12 variants
(but the scrambling isn’t very random; it’s just a bubble
sort with a random number, so some variants are more common
than others). You can also just swap the arguments in the
calls to <code>t()</code> in all combinations to get all the variations.</p>
<p>If you sort the lines, you will get the version that just
prints out the input as punch cards (you will need to display
at least 82 columns of text, or clip the last few chars by
piping it through <code>sed s/...$//</code>). If you use this on the
original code, you will see that it spells out <code>HOLLERITH</code>
when punched on cards (you can see the tall, thin letters
spelling out <code>HOLLERITH</code> if you turn the C code sideways).
You will also see why <code>/KC 0000 K</code> is a <code>Hollerith emoticon</code>.
Unrecognized characters are punched as a lace column.
(You can see an ASCII simulation of the code as punch cards
by looking at <code>card.gif</code>.)</p>
<p>For a nice test pattern, try</p>
<pre><code>&amp;-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ:#@&#39;=&quot;.&lt;(+|!$*);,%_&gt;?abcmnoxyz^[]{}\</code></pre>
<p>If you want to analyze the program, sorting the lines while ignoring
leading blanks works best (<code>sort -b</code>). This will produce the
version that just reverses the line order, and the routines in the code
are in a sensible order.</p>
<p>This program should work on EBCDIC computers. It assumes that the
<code>time_t</code> ptr param to <code>time(3)</code> will work with an
<code>int</code> ptr, and that “passing through” a <code>char[][]</code>
array as a simple <code>char *</code> is OK. Your compiler MUST
understand trigraphs, or it will miss the trigraph backslash before the
double quote in the <code>K</code> string and complain about a malformed
string; for GNU C, use <code>-ansi</code> or <code>-trigraphs</code>.
Entering a line of more than 80 characters, or more than 81 lines, will
jam the card reader.</p>
<p>I’ve used the <code>a[b]</code> ==&gt; <code>*(a+b)</code> trick,
because this is actually shorter than the trigraph version of
<code>a??(b??)</code>.</p>
<p>With 28 lines of code (not counting the blank lines or the comment),
there are technically <code>28!</code> different programs, or
<p>If you want to analyze the program, sorting the lines while
ignoring leading blanks works best (<code>sort -b</code>). This will
produce the version that just reverses the line order, and
the routines in the code are in a sensible order.</p>
<p>This program should work on EBCDIC computers. It assumes
that the <code>time_t</code> ptr param to <code>time(3)</code> will work with an <code>int</code>
ptr, and that “passing through” a <code>char[][]</code> array as a simple
<code>char *</code> is OK. Your compiler MUST understand trigraphs, or it
will miss the trigraph backslash before the double quote in
the <code>K</code> string and complain about a malformed string; for GNU
C, use <code>-ansi</code> or <code>-trigraphs</code>. Entering a line of more than 80
characters, or more than 81 lines, will jam the card reader.</p>
<p>I’ve used the <code>a[b]</code> ==&gt; <code>*(a+b)</code> trick, because this is
actually shorter than the trigraph version of <code>a??(b??)</code>.</p>
<p>With 28 lines of code (not counting the blank lines or the
comment), there are technically <code>28!</code> different programs, or
<code>304,888,344,611,713,860,501,504,000,000</code> different versions,
all legal C.</p>
<pre><code>* except in Florida voting machines
** all cards must be face down, nine-edge first, of course.</code></pre>
<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-2001westley"><a name="inventory"></a>Inventory for
2001/westley</h1>
<h1 id="inventory-for-2001westley"><a name="inventory"></a>Inventory for 2001/westley</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/2001/westley/westley.c">westley.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/westley.alt.c">westley.alt.c</a>
- alternative source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/westley.orig.c">westley.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/try.sh">try.sh</a>
- how to run</li>
<li><a href="2001_westley.tar.bz2">2001_westley.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/westley.c">westley.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/westley.alt.c">westley.alt.c</a> - alternative source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/westley.orig.c">westley.orig.c</a> - original source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/try.sh">try.sh</a> - how to run</li>
<li><a href="2001_westley.tar.bz2">2001_westley.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/2001/westley/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/.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/2001/westley/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/.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/2001/westley/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/westley/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
+35 -60
View File
@@ -129,9 +129,9 @@
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#John_Williams">John
Williams</a><br> Location: <a href="../../location.html#ZZ">ZZ</a> -
<em>Unknown location</em> <br><br></li>
<li>Name: <a href="../../authors.html#John_Williams">John Williams</a><br>
Location: <a href="../../location.html#ZZ">ZZ</a> - <em>Unknown location</em>
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
@@ -144,89 +144,64 @@ Williams</a><br> Location: <a href="../../location.html#ZZ">ZZ</a> -
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
<p>The current status of this entry is:</p>
<pre><code>STATUS: known bug - please help us fix</code></pre>
<p>For more detailed information see <a
href="../../bugs.html#2001_williams">2001 williams bugs</a>.</p>
<p>For more detailed information see <a href="../../bugs.html#2001_williams">2001 williams 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">./williams</span></span></code></pre></div>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p><a href="https://en.wikipedia.org/wiki/WarGames">A strange game. The
only winning move is not to play</a>. No, really; you can’t actually
win. :)</p>
<p>The formatting really wants a wide screen; if you can’t read it that
way, it’s the standard “three triangles around a circular” logo for
nukes.</p>
<p><a href="https://en.wikipedia.org/wiki/WarGames">A strange game. The only winning move is not to
play</a>. No, really; you can’t
actually win. :)</p>
<p>The formatting really wants a wide screen; if you can’t read it that way, it’s
the standard “three triangles around a circular” logo for nukes.</p>
<p>This is a pretty straightforward game.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>What this program does:</p>
<p>It plays <a
href="https://en.wikipedia.org/wiki/Missile_Command">Missile
Command</a>, complete with MIRVs, smart bombs, extra cities, and
scoring.</p>
<p>It plays <a href="https://en.wikipedia.org/wiki/Missile_Command">Missile Command</a>,
complete with MIRVs, smart bombs, extra cities, and scoring.</p>
<p>Command line arguments and input files are ignored.</p>
<p>To play, just point and click where you want your ABMs to
explode.</p>
<p>The score is 10 points for each missile which is destroyed before it
reaches the ground, -1 point for each ABM used, and 100 bonus points for
each city left at the end of a level.</p>
<p>To play, just point and click where you want your ABMs to explode.</p>
<p>The score is 10 points for each missile which is destroyed before
it reaches the ground, -1 point for each ABM used, and 100 bonus
points for each city left at the end of a level.</p>
<p>The game ends when you lose all your cities, although you will have
to wait until the level finishes raining down to see your final
score.</p>
to wait until the level finishes raining down to see your final score.</p>
<h3 id="obfuscation">Obfuscation</h3>
<p>The main obfuscation technique is the need to compress the code to
fit all the functionality within the size limits. I could not have
included smart bombs without the rule excluding <code>{};</code>
characters in the counts. All of the <code>#define</code>s are there to
reduce code size.</p>
<p>The main obfuscation technique is the need to compress the code to fit
all the functionality within the size limits. I could not have included
smart bombs without the rule excluding <code>{};</code> characters in the counts.
All of the <code>#define</code>s are there to reduce code size.</p>
<p>On the other hand, I did waste a few characters in order to include
some rather obfuscated math in the program. It uses fixed-point
arithmetic, resulting in the overuse of bitwise shift operators. Another
example is <code>(x|1)</code>, which is used in a couple different ways.
The purpose of <code>A/(x|1)</code> is probably obvious, but what does
<code>(x|1)%2</code> do?</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>
arithmetic, resulting in the overuse of bitwise shift operators.
Another example is <code>(x|1)</code>, which is used in a couple different ways.
The purpose of <code>A/(x|1)</code> is probably obvious, but what does <code>(x|1)%2</code> do?</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-2001williams"><a name="inventory"></a>Inventory
for 2001/williams</h1>
<h1 id="inventory-for-2001williams"><a name="inventory"></a>Inventory for 2001/williams</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/2001/williams/williams.c">williams.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/williams/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/williams/williams.orig.c">williams.orig.c</a>
- original source</li>
<li><a href="2001_williams.tar.bz2">2001_williams.tar.bz2</a> - download
entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/williams/williams.c">williams.c</a> - entry source</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/williams/Makefile">Makefile</a> - entry Makefile</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/williams/williams.orig.c">williams.orig.c</a> - original source</li>
<li><a href="2001_williams.tar.bz2">2001_williams.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/2001/williams/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/williams/.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/2001/williams/.entry.json">.entry.json</a> - description of entry in JSON</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/williams/.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/2001/williams/README.md">README.md</a>
- markdown source for index.html</li>
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2001/williams/README.md">README.md</a> - markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->