In most cases the word was changed to 'obfuscation' as it was about
obfuscation, not deobfuscation. In some cases like 1995/leo since the
file was (in 1995/leo) about a secret switch it was changed to
'secret.md' (and 'secret.html') but there were others like that as well.
One entry had the words 'spoiling the size rule' but this had been
changed to 'deobfuscating the size rule' which was obviously wrong.
In the latter YYYY/README.md files the judges had written after some
entries (brief summaries) '...
...We'll stop spouting spoilers now. Have fun exploring all the
entries!
but that was changed to:
...We'll stop spouting deobfuscation information now. Have fun
exploring all the entries!
which wasn't really about deobfuscation but just a brief summary of what
the entries did.
And in the most problematic case (at least for me :-), 2018/ferguson) I
had put a joke in:
... but it's the only Easter egg I won't spoil
but it was changed to 'won't deobfuscate' which not only is not what it
is but it spoilt the joke.
In some cases the word was changed back to 'SPOILER' (or similar) but in
most cases not. I believe it should be better now. There are some
caveats, however, as below.
Although make find_missing_links is okay I do not remember if this will
catch links that refer to '%%REPO_URL%%' or other pandoc tokens. This
means I might have to go back to some earlier years to verify links are
okay. That should not take that much time I hope.
It might also be that some wording can still be improved some but it is
hoped this will be discovered when checking links and looking over the
manifest (which obviously changed).
723 lines
32 KiB
HTML
723 lines
32 KiB
HTML
<!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 -->
|
||
|
||
<!-- END: this line ends content from: inc/top.default.html -->
|
||
<!-- START: this line starts content from: inc/head.default.html -->
|
||
|
||
<head>
|
||
<link rel="stylesheet" href="../../ioccc.css">
|
||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap" rel="stylesheet">
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||
<title>2013/hou - Best use of one infinite loop</title>
|
||
<link rel="icon" type="image/x-icon" href="../../favicon.ico">
|
||
<meta name="description" content="2013 IOCCC entry hou - Best use of one infinite loop">
|
||
<meta name="keywords" content="IOCCC, 2013, IOCCC 2013, IOCCC entry, hou, Best use of one infinite loop">
|
||
</head>
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! 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/head.default.html -->
|
||
|
||
<!-- -->
|
||
<!-- This web page was formed via the tool: bin/readme2index.sh -->
|
||
<!-- The content of main section of this web page came from: 2013/hou/README.md -->
|
||
<!-- -->
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2013/hou/README.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2013/hou/README.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2013/hou/README.md !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- Markdown content was converted into HTML via the tool: bin/md2html.sh -->
|
||
|
||
<!-- 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/topbar.default.html -->
|
||
|
||
<div class="theader">
|
||
<nav class="topbar">
|
||
<div class="container">
|
||
<div class="logo">
|
||
<a href="../../index.html" class="logo-link">
|
||
IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="topbar-items">
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Entries
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../years.html" class="sub-item-link">
|
||
Winning Entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../authors.html" class="sub-item-link">
|
||
Winning Authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../location.html" class="sub-item-link">
|
||
Location of winning authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../bugs.html" class="sub-item-link">
|
||
Bugs and (mis)features
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Status
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../news.html" class="sub-item-link">
|
||
IOCCC News
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../status.html" class="sub-item-link">
|
||
Contest status
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../next/index.html" class="sub-item-link">
|
||
Rules and Guidelines
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
FAQ
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html" class="sub-item-link">
|
||
FAQ
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#submit" class="sub-item-link">
|
||
How to enter the IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_an_entry" class="sub-item-link">
|
||
Fixing IOCCC entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_web_site" class="sub-item-link">
|
||
Fixing the website
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_author" class="sub-item-link">
|
||
Updating author info
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
About
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../index.html" class="sub-item-link">
|
||
IOCCC Home
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../judges.html" class="sub-item-link">
|
||
The IOCCC Judges
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../contact.html" class="sub-item-link">
|
||
Contacting the IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../thanks-for-help.html" class="sub-item-link">
|
||
Thanks for the help
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../markdown.html" class="sub-item-link">
|
||
IOCCC markdown guidelines
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<div class="header-mobile-menu">
|
||
<noscript>
|
||
<a href="../../nojs-menu.html" class="topbar-js-label">
|
||
Please Enable JavaScript
|
||
</a>
|
||
</noscript>
|
||
|
||
<button id="header-open-menu-button" class="topbar-mobile-menu">
|
||
<img
|
||
src="../../png/hamburger-icon-open.png"
|
||
alt="hamburger style menu icon - open state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<button id="header-close-menu-button" class="hide-content">
|
||
<img
|
||
src="../../png/hamburger-icon-closed.png"
|
||
alt="hamburger style menu icon - closed state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<div id="mobile-menu-panel" class="hide-content">
|
||
<div class="mobile-menu-container">
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
Entries
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../years.html">
|
||
Winning Entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../authors.html">
|
||
Authors of winning IOCCC entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../location.html">
|
||
Location of authors
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../bugs.html">
|
||
Bugs and (mis)features
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
|
||
<div class="mobile-menu-item">
|
||
Status
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../status.html">
|
||
Contest status
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../next/index.html">
|
||
Rules and Guidelines
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../news.html">
|
||
IOCCC News
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
FAQ
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html">
|
||
Frequently Asked Questions
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#submit">
|
||
How to enter the IOCCC
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_an_entry">
|
||
Fixing IOCCC entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_web_site">
|
||
Fixing the website
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_author">
|
||
Fixing author info
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
About
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../index.html">
|
||
IOCCC Home
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../judges.html">
|
||
The IOCCC Judges
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../contact.html">
|
||
Contacting the IOCCC
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../thanks-for-help.html">
|
||
Thanks for the help
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<script>
|
||
var headerOpenMenuButton = document.getElementById("header-open-menu-button");
|
||
var headerCloseMenuButton = document.getElementById("header-close-menu-button");
|
||
var mobileMenuPanel = document.getElementById("mobile-menu-panel");
|
||
|
||
headerOpenMenuButton.addEventListener("click", () => {
|
||
headerOpenMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.add("hide-content");
|
||
|
||
headerCloseMenuButton.classList.remove("hide-content");
|
||
headerCloseMenuButton.classList.add("topbar-mobile-menu");
|
||
|
||
mobileMenuPanel.classList.remove("hide-content");
|
||
mobileMenuPanel.classList.add("topbar-mobile-panel");
|
||
});
|
||
|
||
headerCloseMenuButton.addEventListener("click", () => {
|
||
headerCloseMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerCloseMenuButton.classList.add("hide-content");
|
||
|
||
mobileMenuPanel.classList.add("hide-content");
|
||
mobileMenuPanel.classList.remove("topbar-mobile-panel");
|
||
|
||
headerOpenMenuButton.classList.add("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.remove("hide-content");
|
||
});
|
||
</script>
|
||
|
||
<!-- END: this line ends content from: inc/topbar.default.html -->
|
||
<!-- START: this line starts content from: inc/header.default.html -->
|
||
|
||
<div class="header">
|
||
<a href="../../2011/zucker/index.html">
|
||
<img src="../../png/ioccc.png"
|
||
alt="IOCCC image by Matt Zucker"
|
||
width=300
|
||
height=110>
|
||
</a>
|
||
<h1>The International Obfuscated C Code Contest</h1>
|
||
<h2>2013/hou - Best use of one infinite loop</h2>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/header.default.html -->
|
||
<!-- START: this line starts content from: inc/navbar.mid.html -->
|
||
|
||
<div class="navbar">
|
||
<a class="Left" href="../endoh4/index.html">← endoh4</a>
|
||
<a class="Left" href="../index.html">↑ 2013 ↑</a>
|
||
<a class="Left" href="../mills/index.html">mills →</a>
|
||
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.c">C code</a>
|
||
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/Makefile">Makefile</a>
|
||
<a class="Right" href="#inventory">Inventory</a>
|
||
<a class="Right" href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2013%2Fhou%2Findex.html">✓</a>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/navbar.mid.html -->
|
||
<!-- START: this line starts content from: inc/before-content.default.html -->
|
||
|
||
<div class="content" id="content">
|
||
|
||
<!-- 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="author">Author:</h2>
|
||
<ul>
|
||
<li>Name: <a href="../../authors.html#Qiming_HOU">Qiming HOU</a><br>
|
||
Location: <a href="../../location.html#CN">CN</a> - <em>People’s Republic of China</em> (<em>China</em>)</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 -->
|
||
|
||
<!-- BEFORE: 1st line of markdown file: 2013/hou/README.md -->
|
||
<p>https://github.com/ioccc-src/temp-test-ioccc/blob/master/## To build:</p>
|
||
<pre><code> make all</code></pre>
|
||
<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#2013_hou">2013/hou in bugs.html</a>.</p>
|
||
<h2 id="to-use">To use:</h2>
|
||
<pre><code> ./hou [scene-file-name] [options]</code></pre>
|
||
<p>Follow the instructions in <code>stdout</code>, preferably with an auto-refreshing PPM
|
||
image viewer ready. Refresh the image every time the output refreshes, all
|
||
effects should be more or less recognizable when you see 16.</p>
|
||
<h2 id="try">Try:</h2>
|
||
<pre><code> ./try.sh</code></pre>
|
||
<p>Try opening the file noted by the program then let the program run a while and
|
||
every so often reopen the file, to see how it changes. The author suggests that
|
||
you leave the program running overnight to see what happens. If however you do
|
||
not have all night :-) then the following JPEG files should show you what
|
||
happens with some of the invocations above:</p>
|
||
<p><img src="luna.jpg"
|
||
alt="artificial image showing a room lit by light from a window"
|
||
width=640 height=480></p>
|
||
<p><img src="old_default.jpg"
|
||
alt="artificial image showing IOCCC 2013 in a room with stars on the floor and double helix in the backgrond"
|
||
width=640 height=480></p>
|
||
<p><img src="otherroom.jpg"
|
||
alt="artificial image the background double helix"
|
||
width=320 height=240></p>
|
||
<p>This program does not terminate by itself: you must kill <code>hou</code> (but not Qiming
|
||
Hou :-) ) in order to end the program.</p>
|
||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||
<p>You could consider that this program violates the source code size
|
||
limit. This is because the first compilation of this program is
|
||
really just a decompressor to generate the real source code of the
|
||
program.</p>
|
||
<p>This program will loop infinitely while progressively refining a
|
||
<a href="https://en.wikipedia.org/wiki/Ray_tracing_(graphics)">raytraced</a> image.</p>
|
||
<p>NOTE: the author refers to <code>a.c</code>, placed in a gzipped file <code>a.c.gz</code>. We do not
|
||
include it but it can be generated like:</p>
|
||
<pre><code> make a.c</code></pre>
|
||
<p>There is no longer a need to do this as the Makefile takes care of it without
|
||
even needing to create a temporary file but as the author refers to it and its
|
||
uses it can still be generated to follow along.</p>
|
||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||
<h3 id="using-hou">Using hou</h3>
|
||
<p>This program is a programmable rendering engine with a built-in default scene.
|
||
The standard command line is:</p>
|
||
<pre><code> ./hou [scene-file-name] [options]</code></pre>
|
||
<p>As <code>hou</code> runs, it writes a progressively refining image to a ppm file specified
|
||
in the scene. The initialization may take a while, but once it’s done, a rough
|
||
preview should be available in seconds. Leave <code>hou</code> running for the night, and you
|
||
get a high quality result like the attached <code>*.jpg</code> files. Kill <code>hou</code> manually
|
||
after you’re satisfied with the image quality.</p>
|
||
<p>To save time and energy for the judges, rendered images for all provided scenes
|
||
are provided as attached files.</p>
|
||
<h3 id="features">Features</h3>
|
||
<ul>
|
||
<li>Fully programmable: Almost every stage of the renderer is programmable with
|
||
a shader, i.e., a short script that does something rendering-related. In
|
||
particular, each scene consists of one or more geometry shaders, a camera
|
||
shader, and one or more material shaders. Shaders are written in an
|
||
interpreted language that supports basic arithmetic, a few math functions,
|
||
variables and procedural calls in the CPS (Continuation Passing Style).</li>
|
||
<li>Fast preview: This renderer isn’t just a naive path tracer, it actually uses a
|
||
modern global illumination algorithm which is robust against challenging scene
|
||
configurations. You can mostly place light sources and specify surface
|
||
properties as you please without worrying too much about the convergence speed;
|
||
you always get a nice fast preview within one or two minutes. As proof, there
|
||
is a comparison: <code>./hou otherroom.scene</code> gives a rough idea about the overall
|
||
illumination at 16 samples per pixel (i.e., when the program prints 16), whereas
|
||
the naive approach <code>./hou otherroom.scene NAIVE</code> only produces a mess of white
|
||
dots.</li>
|
||
<li>Rich visual effects: The algorithm samples all light path types so most
|
||
physically based effects can be produced. The default scene demonstrates quite a
|
||
few of them: reflection, area light, soft shadows, color bleeding, caustics, and
|
||
depth-of-field blur. Of course, one can also get programmable-shading effects
|
||
like procedural texturing and approximated Fresnel terms.</li>
|
||
<li>Accelerated ray tracing: The ray tracing part uses an algorithm better than
|
||
the brute-force intersection of everything. The renderer even builds an
|
||
acceleration data structure! Despite the double precision and the
|
||
single-threadedness, it still runs at about 0.5 million rays per second on the
|
||
author’s machine.</li>
|
||
<li>Pause and resume: Can’t run <code>./hou</code> overnight? No problem! You can kill and
|
||
resume a rendering session whenever you want. The renderer automatically saves
|
||
the progress every 16 samples and resumes where it’s left off when restarted.
|
||
Also, each scene/parameter combination gets a different saved session so you
|
||
don’t have to worry about conflicts.</li>
|
||
</ul>
|
||
<h3 id="abuse-of-the-rules">Abuse of the rules</h3>
|
||
<ul>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.c">hou.c</a> uses compression to get around the size limit. The compression
|
||
fully complies with the rules and the guidelines (at least the portion that
|
||
shows up in <code>grep</code> “size limit”). Please see the <a href="#self-imposed-restrictions">Self-imposed
|
||
restrictions</a> section below for more details.</li>
|
||
<li><code>hou</code> does not terminate (as suggested by the second line of rule 6).</li>
|
||
</ul>
|
||
<h3 id="self-imposed-restrictions">Self-imposed restrictions</h3>
|
||
<ul>
|
||
<li>The building process does not involve any OS tool beyond <code>cc(1)</code> and
|
||
<code>make(1)</code>. No <code>gzip(1)</code> compression! <code>a.c.gz</code> doesn’t fit in 2053 bytes, anyway.</li>
|
||
<li>Neither <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.c">hou.c</a> nor <code>a.c</code> (the <em>real</em> decompressed source) uses
|
||
<code>#define</code> (or <code>cc -D</code>) at all.</li>
|
||
<li>The source code is not required at runtime.</li>
|
||
<li><code>a.c</code> does not drop optional features to reduce size. There are pure
|
||
optimization code that can be dropped without affecting the converged output
|
||
(only affecting the ray tracing speed / convergence rate). All files are
|
||
properly <code>fopen()</code>ed with <code>"rb"</code> / <code>"wb"</code> for Windows compatibility. The PPM
|
||
header has a comment line for non-standard-compliant viewers (specifically, my
|
||
old HDRShop 1.0). And there is a nice text message saying “please wait…”.
|
||
Despite the messy look, <code>a.c</code> and <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.c">hou.c</a> compile warning-free
|
||
(<a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.c">hou.c</a> even wastes 18 bytes on <code>#include<stdio.h></code> just for <code>putchar(3)</code>).
|
||
<code>a.c</code> compiles mostly clean in the C99/ANSI modes of clang and gcc (with:</li>
|
||
</ul>
|
||
<pre><code> -Wall --pedantic</code></pre>
|
||
<p>The only warning generated is a pedantic one: <code>"string constant too long"</code>.</p>
|
||
<h3 id="comments-and-why-obfuscated">Comments and why obfuscated</h3>
|
||
<ul>
|
||
<li>Both the compression and the rendering use mathematically involved algorithms.
|
||
Understanding the C doesn’t help much if one isn’t familiar with the math.</li>
|
||
<li>Modern renderers provide shader access to just about any internal state. This
|
||
one follows suit and reuses the same shader-accessible array for all important
|
||
internal states.</li>
|
||
<li>Infinity and NaN (not-a-number) are used during normal course of execution.</li>
|
||
<li>Previous image-generating entries may take care to hide the “IOCCC” string in
|
||
the code, but they leave the text clear in the <em>result</em>. This entry takes it
|
||
further and obfuscates the output image as well. Can you find the text in the
|
||
image? Hint: look up.</li>
|
||
<li><code>a.c</code> leaves all shaders in plain text, but the plain text shader code can’t
|
||
be taken for its face value; the arithmetic rules subtly diverge from our common
|
||
sense.</li>
|
||
<li><code>a.c</code> is less portable than <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.c">hou.c</a> itself. <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.c">hou.c</a> only depends
|
||
on ASCII and should run just fine on 16-bit, small memory, or
|
||
floating-point-incapable machines. <code>a.c</code>, while still reasonably portable, is
|
||
quite memory consuming, requires IEEE754-compliant <code>double</code>, and assumes <code>int</code> to be
|
||
32-bits.</li>
|
||
<li>Though technically endian-dependent, <code>a.c</code> remains portable providing that one
|
||
doesn’t copy saved sessions across different endianness.</li>
|
||
</ul>
|
||
<h3 id="spoiler">Spoiler</h3>
|
||
<pre><code> 3225 3225 3225 9 9 3225 3225
|
||
1 1 1 1 1 1 1 1 1 1
|
||
4225 1226 1 1 1 1 1222 1226
|
||
1 1 1 1 1 1 1 1 1
|
||
4226 1 4226 8 4222 4226 1 1</code></pre>
|
||
<p>The program consists of a recursive-descent interpreter, a <code>3DDDA</code> (3D Discrete
|
||
Differential Analysis) ray tracer, a <code>PSSMLT</code> (Primary Sample Space Metropolis
|
||
Light Transport) light path sampler, all squeezed into the size limit using a
|
||
<code>PPM</code> compressor (Prediction by Partial Matching, and yes, the output format is
|
||
chosen for the pun..).</p>
|
||
<p><code>PSSMLT</code> uses the Metropolis-Hasting algorithm to sample a 32D unit hypercube.
|
||
Each point in the hypercube is interpreted as a sequence of random numbers, and
|
||
is sent to a path tracer to generate a light path. The point’s
|
||
Metropolis-Hasting energy is then defined as the corresponding path’s
|
||
contribution value to the final image. Since each path is sampled with a
|
||
probability proportional to its energy, the sample distribution directly
|
||
corresponds to the final image, which can then be produced as a simple per-pixel
|
||
histogram of all generated paths. The robustness comes from a state mutation
|
||
strategy that actively tries to explore the neighborhood of high energy peaks
|
||
(e.g., paths that happen to hit the light source in
|
||
<a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/otherroom.scene">otherroom.scene</a> file).
|
||
In addition, a rudimentary form of lens
|
||
path stratification is added to balance the attention each pixel receives. The
|
||
Metropolis-Hasting process completely avoids the tell-tale pixel sampling loop
|
||
required in most other image generation methods.</p>
|
||
<p>The <code>3DDDA</code> tracer is chosen for scalability: its performance doesn’t get much
|
||
worse as scene complexity increases. Another benefit is that with the <code>DDA</code> code
|
||
in place one can naturally use hierarchical grids as an acceleration structure.
|
||
The downside, of course, is that the setup involves quite a few divisions, which
|
||
naturally turns into divisions-by-zero. Fortunately, the IEEE754 standard has a
|
||
nice set of rules just for this purpose and the arithmetics are organized in a
|
||
specific way to take advantage of this. The shader interpreter component is
|
||
relatively straightforward, just an expression evaluator stripped to the bare
|
||
minimum – it doesn’t even support numerical constants natively. A final little
|
||
bit is a just-good-enough PRNG (Pseudo Random Number Generator) to replace the
|
||
low precision Windows <code>rand()</code> and the non-C99 Unix <code>drand48(3)</code>. An overnight
|
||
session would run through its short period many times, but that doesn’t
|
||
necessarily map to the same set of paths in <code>PSSMLT</code>. After all,
|
||
Metropolis-Hasting used an even worse PRNG in their 1953 paper.</p>
|
||
<p>The <code>PPM</code> compressor uses statically weighted fixed order contexts with an
|
||
arithmetic encoder tweaked for <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/iocccsize.c">iocccsize.c</a>. The encoder emits octet-space pairs
|
||
where each octet encodes ~6.5 bits of information and each space encodes 2 bits
|
||
(thanks to the generous definition of “space” in <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/iocccsize.c">iocccsize.c</a> code).
|
||
The compressor
|
||
actively shuffles the variable names around until the compressed string happens
|
||
to contain enough <code>{};</code>s to pass the final <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/iocccsize.c">iocccsize.c</a> test.
|
||
There are a few other tweaks:</p>
|
||
<ul>
|
||
<li><p>The <code>PPM</code> model uses mostly whitespace characters for weights.</p></li>
|
||
<li><p>The encoder never emits <code>'"'</code> and <code>'\\'</code>.</p></li>
|
||
<li><p>The decoder uses an O(n^2) algorithm to avoid the gigabytes-sized hash table
|
||
frequently found in other <code>PPM</code> implementations.</p></li>
|
||
</ul>
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
<!-- AFTER: last line of markdown file: 2013/hou/README.md -->
|
||
|
||
<!-- 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 -->
|
||
|
||
<div id="inventory">
|
||
<h1 id="inventory-for-2013hou">Inventory for 2013/hou</h1>
|
||
</div>
|
||
<h2 id="primary-files">Primary files</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.c">hou.c</a> - entry source code</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/Makefile">Makefile</a> - entry Makefile</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/hou.orig.c">hou.orig.c</a> - original source code</li>
|
||
<li><a href="doc/example.html">doc/example.html</a> - scene format documentation</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/old_default.scene">old_default.scene</a> - sample input</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/otherroom.scene">otherroom.scene</a> - sample input</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/try.sh">try.sh</a> - script to try entry</li>
|
||
<li><a href="luna.jpg">luna.jpg</a> - sample image input file</li>
|
||
<li><a href="old_default.jpg">old_default.jpg</a> - sample image input file</li>
|
||
<li><a href="otherroom.jpg">otherroom.jpg</a> - sample image input file</li>
|
||
</ul>
|
||
<h2 id="secondary-files">Secondary files</h2>
|
||
<ul>
|
||
<li><a href="2013_hou.tar.bz2">2013_hou.tar.bz2</a> - download entry tarball</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/README.md">README.md</a> - markdown source for this web page</li>
|
||
<li><a href="doc/camera.png">doc/camera.png</a> - documentation support image</li>
|
||
<li><a href="doc/cosine.png">doc/cosine.png</a> - documentation support image</li>
|
||
<li><a href="doc/draft.png">doc/draft.png</a> - documentation support image</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/doc/example.md">doc/example.md</a> - markdown source for doc/example.html</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/.entry.json">.entry.json</a> - entry summary and manifest in JSON</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/.gitignore">.gitignore</a> - list of files that should not be committed under git</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2013/hou/.path">.path</a> - directory path from top level directory</li>
|
||
<li><a href="index.html">index.html</a> - this web page</li>
|
||
</ul>
|
||
<hr style="width:10%;text-align:left;margin-left:0">
|
||
<h4>
|
||
Jump to: <a href="#">top</a>
|
||
</h4>
|
||
|
||
<!-- 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 -->
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/after-content.default.html -->
|
||
<!-- START: this line starts content from: inc/footer.inventory.html -->
|
||
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
|
||
<div class="footer">
|
||
|
||
<div id="copyright"><h3>Copyright © 1984-2024 by Landon Curt Noll:
|
||
<a href="https://creativecommons.org/faq/#what-does-some-rights-reserved-mean"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">Some Rights Reserved</a></h3>
|
||
<p>
|
||
This work is <b>licensed by Landon Curt Noll</b> under
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1"
|
||
target="_blank"
|
||
rel="license noopener noreferrer"
|
||
style="display:inline-block;">CC BY-SA 4.0</a></b>.
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/cc.png"
|
||
alt="cc inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/by.png"
|
||
alt="person inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/sa.png"
|
||
alt="arrow looping back on itself inside circle symbol"><br>
|
||
You should <b>carefully review</b> the
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode.en"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">CC BY-SA 4.0 LEGAL CODE</a></b>
|
||
before using the licensed material.<br>
|
||
You may wish to review the
|
||
<b><a href="../../license.html"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">highlights of some of the key features and terms</a></b>
|
||
of <b>CC BY-SA 4.0</b>.<br>
|
||
</p>
|
||
</div>
|
||
|
||
<div id="coda"><h3>Coda</h3>
|
||
<p>
|
||
<a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2013%2Fhou%2Findex.html" rel="nofollow">Nu HTML check this web page</a><br>
|
||
<a href="#top">Jump to top</a> <a href="#content">Jump to Content</a> <a href="#inventory">Jump to Inventory</a><br>
|
||
</p>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/footer.inventory.html -->
|
||
<!-- START: this line starts content from: inc/bottom.default.html -->
|
||
|
||
</body>
|
||
</html>
|
||
|
||
<!-- END: this line ends content from: inc/bottom.default.html -->
|