The location of the link is in the About menu under the 'Contacting the IOCCC' and above 'Thanks for the help'. At first I had it at the very bottom, under 'IOCCC markdown guidelines', but it seemed better to have it closer to contacting the IOCCC. This is the same location in the no JavaScript menu (which, for those who do not know or forget, is not a requirement except for some screen sizes). The top level Makefile has a new 'security' rule. Updated make help. Typo fixes in make help. SECURITY.html has had a few updates as well: change the wording of entry code is unsupported (it now says 'ALL CODE IN ALL IOCCC ENTRIES IS UNSUPPORTED!!') and it now links to the mkiocccentry repo and how to report a possible security vulnerability in that repo; as that IS supported - and since there was reference to discussing security concerns is in SECURITY.html - even though the entries will not receive security updates - it seemed a good idea to have a link to report such security issues in the mkiocccentry repo. Perhaps the FAQ needs to be updated for this too.
756 lines
32 KiB
HTML
756 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>2011/fredriksson - Most useful</title>
|
||
<link rel="icon" type="image/x-icon" href="../../favicon.ico">
|
||
<meta name="description" content="2011 IOCCC entry fredriksson - Most useful">
|
||
<meta name="keywords" content="IOCCC, 2011, IOCCC 2011, IOCCC entry, fredriksson, Most useful">
|
||
</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: 2011/fredriksson/README.md -->
|
||
<!-- -->
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2011/fredriksson/README.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2011/fredriksson/README.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2011/fredriksson/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="../../SECURITY.html" class="sub-item-link">
|
||
IOCCC Security Policy
|
||
</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>2011/fredriksson - Most useful</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="../eastman/index.html">← eastman</a>
|
||
<a class="Left" href="../index.html">↑ 2011 ↑</a>
|
||
<a class="Left" href="../goren/index.html">goren →</a>
|
||
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/fredriksson.c">C code</a>
|
||
<a class="Right" href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/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%2F2011%2Ffredriksson%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#Kimmo_Fredriksson">Kimmo Fredriksson</a><br>
|
||
Location: <a href="../../location.html#FI">FI</a> - <em>Republic of Finland </em> (<em>Finland</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: 2011/fredriksson/README.md -->
|
||
<h2 id="to-build">To build:</h2>
|
||
<pre><code> make</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#2011_fredriksson">2011/fredriksson in bugs.html</a>.</p>
|
||
<h2 id="to-use">To use:</h2>
|
||
<pre><code> ./fredriksson [-icvtnk#] regexp < file</code></pre>
|
||
<h2 id="try">Try:</h2>
|
||
<pre><code> ./try.sh</code></pre>
|
||
<p>NOTE: you need to be allowed to change your stack size or else the last command
|
||
in the script would likely cause the program to dump core, which is why the
|
||
script checks the exit code of <code>ulimit</code> first.</p>
|
||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||
<p>The author of this entry was making sure that it does not win the “Best Short
|
||
Program” award. On the outside, the program behaves as an approximate <code>grep</code>.
|
||
On the inside, it is a <a href="https://en.wikipedia.org/wiki/Burrows-Wheeler_transform">Burrows-Wheeler
|
||
transform</a> decompressor
|
||
that produces the source code of the actual obfuscated approximate <code>grep</code>
|
||
program and calls it. As an exercise, try writing the compressor.</p>
|
||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||
<h3 id="approximate-grep">Approximate grep</h3>
|
||
<p>Implements a variant of <code>grep</code>.</p>
|
||
<h3 id="usage">Usage</h3>
|
||
<p>To search regexp from file, do:</p>
|
||
<pre><code> ./fredriksson [-icvtnk#] regexp < file</code></pre>
|
||
<p>Pipes might not work, see the section Limitations.
|
||
The options <code>-i</code>, <code>-c</code>, <code>-v</code> and <code>-n</code> are the classic ones:</p>
|
||
<ul>
|
||
<li><p><code>-i</code> Ignore case.</p></li>
|
||
<li><p><code>-c</code> Count only, prints the number of matches, but not the matching lines.</p></li>
|
||
<li><p><code>-v</code> Invert match.</p></li>
|
||
<li><p><code>-n</code> Prefixes each printed line by its line number (only if
|
||
<code>-c</code> was not given).</p></li>
|
||
</ul>
|
||
<p>This version of <code>grep</code> recognizes two more options, not present in normal
|
||
<code>grep</code> implementations:</p>
|
||
<ul>
|
||
<li><p><code>-kN</code> Permit <code>N</code> insertions, deletions or mismatches of characters in the
|
||
matches, aka
|
||
<a href="https://en.wikipedia.org/wiki/Edit_distance">edit-distance</a>. E.g.,
|
||
“<code>obfuscated</code>” matches “<code>obfuscation</code>”
|
||
with one deletion and two mismatches. Likewise, “<code>obfuscate</code>” and
|
||
“<code>oversimplify</code>” match with 7
|
||
<a href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit operations</a>.
|
||
The default is <code>-k0</code> (i.e. exact match).</p></li>
|
||
<li><p><code>-t</code> Add local transpositions to the set of allowed
|
||
<a href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit-operations</a>.
|
||
That is, “<code>ab</code>” matches “<code>ba</code>” with one transposition (swap), and
|
||
“<code>obfuscated</code>” matches “<code>bofsuact</code>” with three swaps and two insertions,
|
||
i.e. use <code>-tk5</code> to find this.</p></li>
|
||
</ul>
|
||
<p>Of course, one could construct a standard
|
||
<a href="https://www.regular-expressions.info">regexp</a> that matches the same
|
||
patterns, but the problem is that such a regexp grows exponentially in
|
||
size when the number of allowed <a href="https://en.wikipedia.org/wiki/Edit_distance#Formal_definition_and_properties">edit
|
||
operations</a>
|
||
is increased.</p>
|
||
<p>This version does not recognize all regular expressions, but the
|
||
following are allowed:</p>
|
||
<ul>
|
||
<li><p>Wildcard: <code>.</code> (dot) matches any character.</p></li>
|
||
<li><p>Bracket expression: list of characters enclosed by <code>[</code> and <code>]</code>,
|
||
matches any single character in the list.</p></li>
|
||
<li><p>Range expression: two characters separated by hyphen and enclosed in
|
||
brackets, matches any character that is lexicographically between the
|
||
two characters (inclusive). E.g. <code>[a-d]</code> is the same as <code>[abcd]</code>.</p></li>
|
||
</ul>
|
||
<p>The special characters must be escaped, if they are to be taken
|
||
literally (e.g. <code>\.</code> to match period). You might want to protect
|
||
these with <code>'</code>, i.e. use <code>'foo\[bar'</code> instead of <code>foo\[bar</code>. If you want to
|
||
use the literal <code>-</code> in bracket expression, protect that too (<code>\-</code>),
|
||
otherwise this is not needed. Note that the syntax differs from standard
|
||
(?) grep a bit, i.e. in plain grep you can use <code>]</code> and <code>-</code> in bracket
|
||
expressions by putting <code>]</code> as the first character, and putting <code>-</code> last.</p>
|
||
<h3 id="other-uses">Other uses</h3>
|
||
<ul>
|
||
<li>You can use this in place of <a href="https://en.wikipedia.org/wiki/Cat_(Unix)">cat</a>.
|
||
Just say</li>
|
||
</ul>
|
||
<pre><code> ./fredriksson -k3 cat < file</code></pre>
|
||
<ul>
|
||
<li>Like with <code>cat</code>, you can append line numbers too:</li>
|
||
</ul>
|
||
<pre><code> ./fredriksson -nk3 cat < file</code></pre>
|
||
<h3 id="other-features">Other features</h3>
|
||
<ul>
|
||
<li><p>It is assumed that the user knows how to feed correct input to the
|
||
program. If undefined options are given, the result is also undefined.
|
||
This is a feature.</p></li>
|
||
<li><p>It may consume huge amounts of memory, and a stack overflow may occur.
|
||
This results in Segmentation fault (or the equivalent of your favorite
|
||
system, such as Bus error). This is a feature, that can be used to detect
|
||
overly long lines in the input file, such as checking the length of one
|
||
liners in IOCCC entries, just adjust your stack size to a suitable
|
||
threshold, and search for “<code>ioccc</code>”, with option <code>-vk5</code>.</p></li>
|
||
</ul>
|
||
<h3 id="limitations-and-remarks">Limitations and remarks</h3>
|
||
<ul>
|
||
<li><p>Using warning options (such as <code>-Wall</code>) when building gives a lot of warning,
|
||
such as <code>suggest parentheses around '&&' within '||'</code>, <code>value computed is not used</code>, <code>implicit declaration of function 'putchar'</code>, <code>implicit declaration of function 'getchar'</code>, <code>control reaches end of non-void function</code> and <code>format not a string literal and no format arguments</code>.
|
||
Please ignore them all, since they just try to tell you that the source
|
||
is obfuscated.</p></li>
|
||
<li><p>Only standard input is handled. And <em>only</em> if <code>stdin</code> comes from a file,
|
||
i.e. pipes may or may not work. If you want to count only (<code>-c</code> option),
|
||
then this shouldn’t be an issue.</p></li>
|
||
<li><p>The total length of the (preprocessed) pattern is at most
|
||
<code>sizeof(long)*CHAR_BIT</code>. That does not count things like bracket expressions
|
||
or escape chars, that is, the pattern <code>'a[bcd]e\.f'</code> is 5 chars long, not
|
||
10 chars. That does not mean that the matched substring in the standard
|
||
input has this limit, as using the edit operations can make the string
|
||
longer. However, no assumptions are made for <code>sizeof(long)</code>. In fact,
|
||
you can easily use <code>long long</code> instead,</p></li>
|
||
<li><p>Depending on the file, it might require a lot of stack space. If the
|
||
program segfaults (because of this), say</p></li>
|
||
</ul>
|
||
<pre><code> ulimit -s unlimited</code></pre>
|
||
<p>cross your fingers, hope it is enough, and try again.</p>
|
||
<ul>
|
||
<li><p>Assumes C99 standard, because of the one very long line. Most C compilers
|
||
handle this just fine even in C89 mode, though.</p></li>
|
||
<li><p>The code should be reasonably portable, it assumes standard ASCII codes
|
||
for each char, and that a C compiler is on <code>$PATH</code>; the latter is hard coded
|
||
to be ‘gcc’, but any compiler would work, provided that it supports
|
||
C99, or long lines as an extension. This code has been tested on:</p></li>
|
||
<li><p>GNU/Linux FC4, i386, gcc</p></li>
|
||
<li><p>GNU/Linux FC7, x86_64, gcc 4.1.2, tcc 0.9.24 and icc 10.0</p></li>
|
||
<li><p>GNU/Linux FC9, x86_64, gcc 4.?.?</p></li>
|
||
<li><p>GNU/Linux CentOS 5, gcc 4.1.2</p></li>
|
||
<li><p>GNU/Linux Ubuntu 11.04, gcc 4.5.2</p></li>
|
||
<li><p>SunOS 5.8, UltraSPARC IIIi, gcc 4.1.2</p></li>
|
||
<li><p>SunOS 5.9, UltraSPARC IIIi, gcc 4.1.1 and Sun ONE Studio 8 CC</p></li>
|
||
<li><p>AIX 5.3, IBM eServer p5-550, gcc 3.3.3 and AIX CC Version 6</p>
|
||
<p>(Btw, tcc has its roots in IOCCC…)</p></li>
|
||
</ul>
|
||
<h3 id="notice-to-those-who-wish-for-a-greater-challenge">NOTICE to those who wish for a greater challenge:</h3>
|
||
<p><strong>If you want a greater challenge, don’t read any further</strong>:
|
||
just try to understand the program via the source.</p>
|
||
<p>If you get stuck, come back and read below for additional hints and information.</p>
|
||
<h3 id="how-this-entry-works">How this entry works:</h3>
|
||
<ul>
|
||
<li>The initialized char array includes the source code of the real program,
|
||
as well as its name and commands to build and run it, all
|
||
<a href="https://en.wikipedia.org/wiki/Burrows-Wheeler_transform">Burrows-Wheeler</a>
|
||
-transformed, then run-length-encoded with unary coding. The main program
|
||
extracts and builds that, and then calls it. More precisely, the command
|
||
to build is</li>
|
||
</ul>
|
||
<pre><code> gcc -O3 ag.c -o ag</code></pre>
|
||
<p>To change that you need to edit the char array <code>p[]</code> and (possibly) two
|
||
specially encoded constants, <code>-~('('*'(')</code> and <code>'C'*' '-'-'</code>.
|
||
The extracted source (<code>ag.c</code>) is obfuscated as well.</p>
|
||
<p>(The original version also deleted the generated source and the
|
||
corresponding binary after running it, but this feature was removed
|
||
from the submitted entry.)</p>
|
||
<ul>
|
||
<li><p>The code demonstrates several useful programming paradigms, such as:</p>
|
||
<ul>
|
||
<li>recursion to remove all loops</li>
|
||
<li>subroutines (<code>main()</code> contains several logical subroutines,
|
||
selected by the first argument)</li>
|
||
<li>function pointers</li>
|
||
</ul></li>
|
||
<li><p>Algorithmically, it incorporates the following:</p>
|
||
<ul>
|
||
<li>(inverse) Burrows-Wheeler transform (used also e.g. in <code>bzip2(1)</code>)</li>
|
||
<li>data compression (really expansion :-), run-length-encoding,
|
||
unary coding (this is why it is expansion rather than compression)</li>
|
||
<li>approximate string matching</li>
|
||
<li>dynamic programming to compute the edit distance</li>
|
||
<li>parallel computation in sequential computers (by packing
|
||
several objects into a single <code>long</code>, to speed up the dynamic
|
||
programming)</li>
|
||
<li>self extracting, compiling and running code</li>
|
||
</ul></li>
|
||
<li><p>As a C program, it demonstrates that</p>
|
||
<ul>
|
||
<li>a C subset without reserved words is complete enough,
|
||
excluding data type specific things (<code>int</code>, <code>char</code>, <code>void</code> …)</li>
|
||
<li>only letters are needed (i.e. the digits <code>0-9</code> are not)</li>
|
||
<li>only one statement is enough to code any program (plus
|
||
variable definitions)</li>
|
||
<li>white space has other uses than just indenting the code</li>
|
||
</ul></li>
|
||
<li><p>It also shows the power of boolean logic and bitwise arithmetic.</p></li>
|
||
<li><p>This is the first (?) entry in the history of IOCCC, that cannot be
|
||
totally de-obfuscated by the author. This is due to the clever choice of
|
||
the actual algorithm, that is obfuscated by nature, and it is an open
|
||
research problem whether a simpler algorithm exists, with the same time
|
||
complexity.</p></li>
|
||
<li><p>The main obfuscation comes from using only arithmetic and boolean
|
||
(short-circuit) logic combined with recursion to remove all loops and
|
||
if-then-else constructs (also, no ternary <code>?:</code> constructs are present).
|
||
Two’s complement representation of integers is also abused. E.g. instead
|
||
of writing <code>x++</code> or <code>x-1</code>, it is much better to write <code>x=-~x</code> and <code>~-x</code>.</p></li>
|
||
<li><p>No numerical values, other than in the initialized char array, try</p></li>
|
||
</ul>
|
||
<pre><code> ./fredriksson -ck0 [0-9] < fredriksson.c</code></pre>
|
||
<p>This should print 1, as there is a number <code>3</code> in the char array (only).
|
||
You can also try</p>
|
||
<pre><code> ./fredriksson -ck0 [0-9] < ag.c</code></pre>
|
||
<p>after running <code>fredriksson</code> at least once (since this generates that
|
||
<code>ag.c</code> file), and this should print 0.</p>
|
||
<ul>
|
||
<li><p>The source code is best viewed with cat (or using the program itself),
|
||
instead of some editor. (This is a somewhat system dependent thing.)</p>
|
||
<p>One reason for this is that the code builds (some of the) constant
|
||
values from string literal <code>"\b"</code>, except that the backspace <code>\b</code> is not
|
||
escaped like that; the source uses the raw ASCII value (<code>010</code> octal) instead.
|
||
Thus when viewing with cat or something, that backspace erases the leading
|
||
quotation mark. Makes it appear uncompilable, and it is: if you copy-paste
|
||
the cat output from terminal to some editor, save it, the result would not
|
||
compile.</p>
|
||
<p>Some other constants are built from ASCII values of <code>char</code>s.</p>
|
||
<p>Besides of making the code hard to read, all this makes it also quite large.</p></li>
|
||
<li><p>Running it through GNU <code>indent(1)</code> or <code>bcpp(1)</code> (C beautifiers) does not beautify
|
||
it a bit. In fact, <code>indent</code> makes it only worse (at least with the default
|
||
options). Running it through the preprocessor does basically nothing,
|
||
since no <code>#define</code>s are used.</p></li>
|
||
<li><p>Some <em>abuse of the rules</em>. The number of non-whitespace and <code>;</code>, <code>{</code>
|
||
and <code>}</code> chars is below the limit, but most of the whitespace chars are
|
||
in an <em>initialized character array</em>. That is, the number of chars in the
|
||
program exceeds the 2048 limit. However, whitespace is whitespace and
|
||
the rules did not specify that these must be in between the statements.
|
||
A character is a whitespace if <code>isspace()</code> returns non-zero value. Even
|
||
if deleting even one of those chars it breaks the program! (This does not
|
||
apply to the generated source <code>ag.c</code>.)</p></li>
|
||
</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: 2011/fredriksson/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-2011fredriksson">Inventory for 2011/fredriksson</h1>
|
||
</div>
|
||
<h2 id="primary-files">Primary files</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/fredriksson.c">fredriksson.c</a> - entry source code</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/Makefile">Makefile</a> - entry Makefile</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/fredriksson.orig.c">fredriksson.orig.c</a> - original source code</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/try.sh">try.sh</a> - script to try entry</li>
|
||
</ul>
|
||
<h2 id="secondary-files">Secondary files</h2>
|
||
<ul>
|
||
<li><a href="2011_fredriksson.tar.bz2">2011_fredriksson.tar.bz2</a> - download entry tarball</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/README.md">README.md</a> - markdown source for this web page</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/.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/2011/fredriksson/.gitignore">.gitignore</a> - list of files that should not be committed under git</li>
|
||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2011/fredriksson/.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%2F2011%2Ffredriksson%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 -->
|