Files
ioccc/2011/hamaji/index.html
T
Landon Curt Noll ffb738af07 create new status.json model
Changed the model of `status.json` model.

Updated `status.json` IOCCC_status_version from  "0.2 2023-05-22"
to "1.0 2024-03-09".

Updated FAQ 2.6, improving how IOCCC entries announced.

Moved `bin/ioccc-status.sh` to `tmp/ioccc-status.sh`
now that we have a new status.json model for
which this tool no longer fits (sorry tm Canada 🇨🇦).

Added `status.md` markdown to explain the `status.json` model.

Added `status.html` to both display the contents of `status.json`
and render the contents of `status.md` as HTML.

Added `bin/status2html.sh` to convert `status.json`
into HTML for the `status.html` file.

Added `bin/gen-status.sh` to form `status.json`
and `status.html` files.

Added `make gen_status` to top level Makefile.

Performed `make www` to complete all of the above.
2024-03-10 10:05:08 -07:00

431 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- START: two lines up starts content from: inc/top.default.html -->
<!-- -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- -->
<!-- END: this line ends content from: inc/top.default.html -->
<!-- -->
<!-- This web page was formed via the tool: bin/readme2index.sh -->
<!-- -->
<!-- The content of main section of this web page came from: 2011/hamaji/README.md -->
<!-- -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- !!! Do not modify this web page, instead modify the file: 2011/hamaji/README.md -->
<!-- !!! Do not modify this web page, instead modify the file: 2011/hamaji/README.md -->
<!-- !!! Do not modify this web page, instead modify the file: 2011/hamaji/README.md -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- -->
<!-- Markdown content was converted into HTML via the tool: bin/md2html.sh -->
<!-- -->
<!-- START: this line starts content from: inc/head.default.html -->
<head>
<link rel="stylesheet" href="../../ioccc.css">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>2011/hamaji - Best solved puzzle</title>
<meta name="description" content="2011 IOCCC entry hamaji - Best solved puzzle">
<meta name="keywords" content="IOCCC, 2011, IOCCC 2011, IOCCC entry, hamaji, Best solved puzzle">
</head>
<!-- END: this line ends content from: inc/head.default.html -->
<!-- START: this line starts content from: inc/body.default.html -->
<body>
<!-- END: this line ends content from: inc/body.default.html -->
<!-- START: this line starts content from: inc/header.default.html -->
<div class="header">
<img src="../../png/ioccc.png" alt="IOCCC image by Matt Zucker" width=300 height=110>
<h1>The International Obfuscated C Code Contest</h1>
<h2>2011/hamaji - Best solved puzzle</h2>
</div>
<!-- END: this line ends content from: inc/header.default.html -->
<!-- START: this line starts content from: inc/topnav.mid.html -->
<div class="topnav">
<a class="Left" href="../goren/index.html">&larr; goren</a>
<a class="Left" href="../index.html">&uarr; 2011 &uarr;</a>
<a class="Left" href="../hou/index.html">hou &rarr;</a>
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/2011/hamaji/hamaji.c">C code</a>
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/2011/hamaji/Makefile">Makefile</a>
<a class="Right" href="#inventory">Inventory</a>
</div>
<!-- END: this line ends content from: inc/topnav.mid.html -->
<!-- START: this line starts content from: inc/begin-row.default.html -->
<div class="row">
<!-- END: this line ends content from: inc/begin-row.default.html -->
<!-- START: this line starts content from: inc/begin-leftcolumn.default.html -->
<div class="leftcolumn">
<!-- END: this line ends content from: inc/begin-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/sidenav.default.html -->
<div class="sidenav">
<a href="#content">Jump to contents</a>
</div>
<hr>
<div class="sidenav">
<a href="../../index.html">IOCCC Home</a>
<a href="../../years.html">Winning Entries</a>
<a href="../../authors.html">People who have won</a>
<a href="../../location.html">Location of authors</a>
</div>
<hr>
<div class="sidenav">
<a href="../../news.html">IOCCC News</a>
<a href="../../status.html">Contest status</a>
<a href="../../faq.html#submit">How to enter the IOCCC</a>
<a href="../../faq.html">FAQ</a>
</div>
<hr>
<div class="sidenav">
<a href="../../bugs.html">Bugs &amp; (mis)features</a>
<a href="../../faq.html#fix_an_entry">Fixing IOCCC entries</a>
<a href="../../faq.html#fix_web_site">Fixing the web site</a>
<a href="../../faq.html#fix_author">Fixing author info</a>
<a href="../../thanks-for-help.html">Thanks for the help</a>
</div>
<hr>
<div class="sidenav">
<a href="../../judges.html">The IOCCC Judges</a>
<a href="../../contact.html">Contacting the IOCCC</a>
</div>
<hr>
<div class="sidenav">
<a href="#top">Jump to top</a>
</div>
<!-- END: this line ends content from: inc/sidenav.default.html -->
<!-- START: this line starts content from: inc/end-leftcolumn.default.html -->
</div>
<!-- END: this line ends content from: inc/end-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/begin-rightcolumn.default.html -->
<div class="rightcolumn">
<!-- END: this line ends content from: inc/begin-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/before-content.default.html -->
<a name="content"></a>
<!-- END: this line ends content from: inc/before-content.default.html -->
<!-- START: this line starts content for HTML phase 20 by: bin/output-index-author.sh via bin/md2html.sh -->
<!-- START: this line starts content generated by: bin/output-index-author.sh -->
<h2 id="authors"><a name="author"></a>Authors:</h2>
<ul>
<li>Name: <a href="../../authors.html#Bsoup">bsoup</a><br> Location: <a
href="../../location.html#JP">JP</a> - <em>Japan</em> <br><br></li>
<li>Name: <a href="../../authors.html#Shinichiro_Hamaji">Shinichiro
Hamaji</a><br> Location: <a href="../../location.html#JP">JP</a> -
<em>Japan</em> <br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
<!-- END: this line ends content for HTML phase 20 by: bin/output-index-author.sh via bin/md2html.sh -->
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<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>
<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">./hamaji</span> <span class="op">&lt;</span> a_nonogram_file</span></code></pre></div>
<h2 id="try">Try:</h2>
<div class="sourceCode" id="cb3"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./try.sh</span></span></code></pre></div>
<p>If you have perl installed you should be able to reproduce <a
href="dragon.nono">dragon.nono</a> like:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="fu">perl</span> c2nono.pl hamaji.c <span class="kw">|</span> <span class="ex">./hamaji</span></span></code></pre></div>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>This program solves <a
href="http://en.wikipedia.org/wiki/Nonogram">Nonograms</a> which is also
known as “Paint by Numbers”.</p>
<p>This entry roars as the Year of the Dragon: A year considered some to
be good luck. Well it was certainly true that the IOCCC was lucky to get
such a fine submission!</p>
<p>The source code is a solution to a Paint by Numbers puzzle when you
paint by C. Try your hand at solving a few of the other
<code>.nono</code> files and then compare your solution with this
program!</p>
<p>NOTE: NONOGRAM (r) is a registered Trademark and is used with
permission. See <a href="https://nonogram.com"
class="uri">https://nonogram.com</a> for more information.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<p>The format of the input files are as same as this site: <a
href="https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers"
class="uri">https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers</a>.</p>
<p>For example, for a simple problem which shows a glider of <a
href="http://en.wikipedia.org/wiki/Conway&#39;s_Game_of_Life">Conway’s
Game of Life</a>:</p>
<pre><code> 1
.
112
1 X
1 X
3 XXX
</code></pre>
<p>the input should be</p>
<pre><code>1
1
3
-
1
1.1
2</code></pre>
<p>The width and the height of an input puzzle should be less than or
equal to 60.</p>
<p>When this solver finds the problem has no solution, it prints
“<code>invalid</code>”. This means the problem is indeed broken. For
example, this happens for an input like</p>
<pre><code>2
-
2</code></pre>
<p>When this solver cannot find a solution, it prints
“<code>failed</code>”. This failure can happen when the problem has more
than one solution or the solver cannot solve the input problem. Here is
an example input of the former:</p>
<pre><code>1
1
-
1
1</code></pre>
<p>There are two solutions:</p>
<pre><code> 11
1 X
1 X</code></pre>
<p>and</p>
<pre><code> 11
1 X
1 X</code></pre>
<h3 id="detail">Detail</h3>
<p>Solving Nonogram is <a
href="https://en.wikipedia.org/wiki/NP-completeness">NP-complete</a>, so
we cannot make a solver which solves all puzzles. However, we can write
a solver which solves most problems solvable by humans. There are a
bunch of ways to write such programs. The two most obvious approaches
are:</p>
<ol type="1">
<li>Check all possible solutions with backtracking.</li>
<li>Implement all techniques which humans use.</li>
</ol>
<p>The former, brute-force approach is easy to implement. However, it
works only for smaller problems (width and height should be at most 30
or so). Similarly, using generic probabilistic <a
href="https://en.wikipedia.org/wiki/Metaheuristic">metaheuristics</a>
such as <a
href="https://en.wikipedia.org/wiki/Simulated_annealing">simulated
annealing</a> doesn’t work for big problems.</p>
<p>See: <a
href="http://ccl.northwestern.edu/netlogo/models/community/Nonogram"
class="uri">http://ccl.northwestern.edu/netlogo/models/community/Nonogram</a>.</p>
<p>By its definition, the latter method works for all human-solvable
problems. The issue of the latter approach is this kind of program tends
to be lengthy. This approach still requires some <a
href="https://en.wikipedia.org/wiki/Recursion">recursions</a>. The most
difficult problems which are considered human-solvable may require some
“guesses”. For these kinds of problems, we need to assume a cell is a
space or a box, go ahead some steps with simple methods and mark the
tried cell as a box (or a space if we assumed the tried cell is a box)
if a contradiction is found.</p>
<p>My program uses an approach like “Set based solver” introduced in <a
href="https://wiki.haskell.org/Nonogram#Set_based_solver"
class="uri">https://wiki.haskell.org/Nonogram#Set_based_solver</a>. This
should be equivalent to the combinations of simple methods (no advanced
reasoning with guess). My solver also runs a non-recursive guess for
each undetermined cells. So, my program should be able to solve most
human-solvable problems (assuming humans cannot execute deeper
recursions).</p>
<h3 id="obfuscation">Obfuscation</h3>
<p>First of all, as you see, my program looks like a nonogram puzzle
which results in a <a href="https://www.draconika.com/what">dragon</a>.
This puzzle is <a href="dragon.nono">dragon.nono</a> in this directory.
Note that whitespaces in character literals, a string literal, and
around the last comment are considered as a boxed cell.</p>
<p>My program is based on bit operations for speed. Many values are
stored using negative logic (0 means on and 1 means off) to utilize the
initial value of global variables. Thus, it might be difficult to figure
out how it works.</p>
<p>My program is decently shortened, because the size of source code is
limited by IOCCC’s rule (2048 non-whitespace characters) and a lot of
characters are just wasted for numbers around the picture.</p>
<p>The three requirements (dragon, speed, and size) naturally ended up
with the well obfuscated code.</p>
<h3 id="portability">Portability</h3>
<p>This program uses two C99 features. One line comments and
<code>long long</code>. GCC’s <code>-ansi -pedantic</code> check should
pass:</p>
<div class="sourceCode" id="cb11"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="fu">cc</span> <span class="at">-ansi</span> <span class="at">-pedantic</span> <span class="at">-std</span><span class="op">=</span>c99 hamaji.c</span></code></pre></div>
<p>I checked my program with gcc-4.6.2 on linux, llvm-gcc-4.2 on Mac,
and clang-3.0 on Mac.</p>
<p>Note that the behavior of <code>scanf(3)</code> differs on linux and
mac, but this program supports both semantics.</p>
<p>This program should not depend on <code>sizeof(int)</code>,
<code>sizeof(void*)</code>, ASCII, memory layout, undefined evaluation
order (e.g., <code>a[i++]=i</code>), etc. This program won’t work if the
size of <code>long long</code> literal is less than 8. By grepping the
source code of gcc</p>
<div class="sourceCode" id="cb12"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="fu">grep</span> LONG_LONG_TYPE_SIZE gcc/config/<span class="pp">*</span>/<span class="pp">*</span></span></code></pre></div>
<p>I found long long may be 32bit integers only on AVR.</p>
<h3 id="a-few-more-things">A few more things</h3>
<p>This code is considered as a <a
href="http://en.wikipedia.org/wiki/Japanese_New_Year#Postcards">new
year’s postcard in Japan</a>. We chose the dragon because 2012 is the <a
href="https://japanesezodiac.com/japanese-year-of-the-dragon">year of
dragon</a>.</p>
<p>The second author wrote the picture, and the first author did
everything else.</p>
<p>The <a href="dragon.nono">dragon.nono</a>, <a
href="samurai.nono">samurai.nono</a>, and <a
href="penguin.nono">penguin.nono</a> were written by the second author.
The <a href="soccer.nono">soccer.nono</a> was from a wikipedia entry.
This file is important because it requires some guesses. The <a
href="random.nono">random.nono</a> file was randomly generated. The <a
href="codegolf.nono">codegolf.nono</a> and <a
href="face.nono">face.nono</a> were taken from <a
href="https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers"
class="uri">https://web.archive.org/web/20130218055139/http://codegolf.com/paint-by-numbers</a>.</p>
<p>You can reproduce <a href="dragon.nono">dragon.nono</a> from <a
href="hamaji.c">hamaji.c</a> using <a
href="c2nono.pl">c2nono.pl</a>:</p>
<div class="sourceCode" id="cb13"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="fu">perl</span> c2nono.pl hamaji.c <span class="kw">|</span> <span class="ex">./hamaji</span></span></code></pre></div>
<h2 id="copyright-and-cc-by-sa-4.0-license">Copyright and CC BY-SA 4.0
License:</h2>
<p>This file is Copyright (c) 2023 by Landon Curt Noll. All Rights
Reserved. You are free to share and adapt this file under the terms of
this license:</p>
<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>
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<!-- START: this line starts content for HTML phase 22 by: bin/output-index-inventory.sh via bin/md2html.sh -->
<!-- START: this line starts content generated by: bin/output-index-inventory.sh -->
<h1 id="inventory-for-2011hamaji"><a name="inventory"></a>Inventory for
2011/hamaji</h1>
<p><a href="#top">Jump to top</a></p>
<h2 id="primary-files">Primary files</h2>
<ul>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/hamaji.c">hamaji.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/hamaji.orig.c">hamaji.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/c2nono.pl">c2nono.pl</a>
- reproduce dragon.nono</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/codegolf.nono">codegolf.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/conway-game-of-life.nono">conway-game-of-life.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/dragon.nono">dragon.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/face.nono">face.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/multi-solutions.nono">multi-solutions.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/no-solution.nono">no-solution.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/penguin.nono">penguin.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/plus.nono">plus.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/random.nono">random.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/samurai.nono">samurai.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/smiley.nono">smiley.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/soccer.nono">soccer.nono</a>
- nonogram input data</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/try.sh">try.sh</a>
- how to run</li>
<li><a href="2011_hamaji.tar.bz2">2011_hamaji.tar.bz2</a> - download
entry source</li>
</ul>
<h2 id="secondary-files">Secondary files</h2>
<ul>
<li><a href="index.html">index.html</a> - entry home page</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/.gitignore">.gitignore</a>
- list of files that should not be committed under git</li>
<li><a href=".path">.path</a> - directory path from top directory</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/hamaji/README.md">README.md</a>
- markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
<!-- END: this line ends content for HTML phase 22 by: bin/output-index-inventory.sh via bin/md2html.sh -->
<!-- START: this line starts content from: inc/after-content.default.html -->
<!-- END: this line ends content from: inc/after-content.default.html -->
<!-- START: this line starts content from: inc/end-rightcolumn.default.html -->
</div>
<!-- END: this line ends content from: inc/end-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/end-row.default.html -->
</div>
<!-- END: this line ends content from: inc/end-row.default.html -->
<!-- START: this line starts content from: inc/footer.default.html -->
<div class="footer">
<hr>
<h2>Coda</h2>
<p><a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2011%2Fhamaji%2Findex.html">Nu HTML check this web page</a></p>
<p><a href="#top">Jump to top</a> <a href="#content">Jump to Content</a> <a href="#inventory">Jump to Inventory</a></p>
</div>
<!-- END: this line ends content from: inc/footer.default.html -->
<!-- START: this line starts content from: inc/bottom.default.html -->
</body>
</html>
<!-- END: this line ends content from: inc/bottom.default.html -->