Fixes and updates to 2018/ferguson/index.html

This commit is contained in:
Cody Boone Ferguson committed 2024-11-09 11:42:43 -08:00
1 parent 76b55c8607
commit e4d9d517fe
2 files changed
+261 -129

No files matched your search

+144 -70
View File
@@ -114,23 +114,32 @@ If you find yourself in an evolutionary dead end, try:
## Author's remarks:
0. Preface
1. What it is
2. How it works
3. Hints (Keyboards, Options, Easter egg, Example Invocations)
4. Obfuscation (Techniques, Beauty)
5. How to build (S and N Constants, Compilation, Portability, Installing)
6. Final thoughts
7. Winning comments, thanks, dedications, links, etc.
## **0. Preface**
<div id="toc">
### Table of Contents
</div>
**OBFUSCATION NOTES: A great deal of this document and the man page is full of
obfuscation information of different types; as such I would recommend that you try running the
judges suggested invocations as well as running `make test` before you get into
the document or the man page, unless you don't mind reading obfuscation information. I don't reveal
much in the way of obfuscation however so if you just want documentation on the
program, how to compile, etc. then there isn't need to heed this note.**
- [Preface](#preface)
- [What it is](#what)
- [How it works](#how)
- [Hints &lpar;Keyboards, Options, Easter egg, Example Invocations&rpar;](#hints)
- [Obfuscation &lpar;Techniques, Beauty&rpar;](#obfuscation)
- [How to build &lpar;S and N Constants, Compilation, Portability, Bugs, Installing&rpar;](#build)
- [Final thoughts](#thoughts)
- [Winning comments, thanks, dedications, links, etc.](#winning)
- [Update on the Infinite Monkey Theorem, 2024](#monkey2024)
<div id="preface">
### Preface
</div>
**OBFUSCATION NOTES**: a great deal of this document and the man page is full of
obfuscation information of different types; as such I would recommend that you
try running the judges suggested invocations as well as running `make test`
before you get into the document or the man page, unless you don't mind reading
obfuscation information. I don't reveal much in the way of obfuscation however
so if you just want documentation on the program, how to compile, etc. then
there isn't need to heed this note.
I was at a loss on how to present my remarks; on the one hand I wanted to give
everything to the judges so they didn't miss anything. But on the other hand I
@@ -146,60 +155,66 @@ page (it explains all the options and describes the program briefly):
If that isn't sufficient **I would recommend reading this section** *(and
possibly the next)* where I attempt to give a brief explanation of the sections
to make reading it easier and faster. In addition I want to point out a few
things. *If you want more details read this document more thoroughly (or just
the sections that seem relevant to what you're after).* The [FILES][] file is a
quick list of files and respective summaries in this entry. Because several
things. _If you want more details read this document more thoroughly (or just
the sections that seem relevant to what you're after)._ Because several
sections are quite long I have added a skip to link to skip to the next
subsection or section at the beginning of each section (and subsection).
**[What it is](#what):** This is a brief summary of the program; the man page is
[What it is](#what): this is a brief summary of the program; the man page is
more thorough than this.
**[How it works](#how):** Explain some of the basic concepts and terms of the
[How it works](#how): explains some of the basic concepts and terms of the
program; if you're familiar with genetic algorithms there won't be any problem
following this section but it might be of some value to read anyway. There is a
randomised mode that doesn't use a genetic algorithm; it can be triggered a
number of ways but the `-m` option enables it specially (I discuss this
thoroughly in **[Hints](#hints)**).
thoroughly in [Hints](#hints)).
**[Hints](#hints):** Perhaps the longest part of this document because in it I
[Hints](#hints): perhaps the longest part of this document because in it I
document the [keyboards](#keyboards), [options](#options), subtleties, including
features that might appear to be bugs but aren't - including an
[input error](#error), an [Easter egg obfuscation](#obfuscation) and quite a few
[example invocations](#invocations). If you've read the man page you probably
don't need this unless there is something specific you're after.
**[Obfuscation](#obfuscation):** Some of the techniques that might not be used.
[Obfuscation](#obfuscation): some of the techniques that might not be used.
**[How to build](#build):** Here I describe briefly
[How to build](#build): here I describe briefly
[the constants that can be redefined](#constants) `S`, `M` and `N`: the
maximum size of the chromosome (target string; the maximum length is `S - 1`
but it must be >= the default 38), the number of maximum attempts before giving
up and the number of offspring, respectively. I
also give [example compiler invocations](#compiling), [portability
notes](#portability), an [more portability notes](#bugs) and a [note on
rpm.html](rpm.html).
rpm.html](rpm.html); I obviously **DO NOT** recommend installing it any more than
the Judges would, but it was part of my entry for personal reasons and since the
Judges remarked about it I have kept it in place.
On the subject of `S` and `N`: As the judges' suggested runs imply you
On the subject of `S` and `N`: as the judges' suggested runs imply you
can change the target string at runtime; `make test` runs a script
`test.sh` which reads from the file `test-strings.txt`, running the program
for each string in the file, waiting approximately two seconds before
continuing. I explain how to pass options to the script in part of
**[Hints](#test)**.
[Hints](#test).
**[Final thoughts](#thoughts):** You might enjoy what I included; they're
[Final thoughts](#thoughts): you might enjoy what I included; they're
humorous pieces by [Dennis Ritchie](#dmr) and [Ken Thompson](#ken) themselves
from the infamous *UNIX-HATERS Handbook*.
**[Winning thoughts](#winning):** What it means to me to win as well as some
[Winning thoughts](#winning): what it means to me to win as well as some
dedications and thanks. Here too I include a link to a website which will be
dedicated to this entry beyond what will be published on the IOCCC website.
In 2024 I saw a fun article claiming that a monkey could not in the lifetime of
the universe type up even just Hamlet. This, with my brief foray into the Weasel
program, was fun and amusing to read, as well as interesting. I give my comments
at [my 2024 update](#monkey2024).
[FILES]: FILES
[rpm.html]: rpm.html
<div id="what">
## **1. What it is**
### What it is
</div>
Skip to [How it works](#how).
@@ -239,7 +254,7 @@ comparison and output will always be capitalised).
[The Blind Watchmaker]: https://en.wikipedia.org/wiki/The_Blind_Watchmaker
<div id="how">
## **2. How it works**
### How it works
</div>
Skip to [Hints](#hints).
@@ -323,7 +338,7 @@ question. Later 2018 and all of 2019 was difficult for me so it was like I won a
second time for the same entry.
### On <del>user</del> monkey errors
#### On <del>user</del> monkey errors
If the generation reaches `SIZE_MAX - 1` I consider it a monkey (or if you
insist: user) error; if the user insists on being so petulant enough as to try
@@ -348,7 +363,7 @@ isn't insolent enough to say the user is a monkey for certain!*
<div id="hints">
## **3. Hints**
### Hints
</div>
Skip to [Obfuscation](#obfuscation).
@@ -357,7 +372,7 @@ I noted that there are a number of additional features and here I will document
some of them.
<div id="keyboards">
### Keyboards
#### Keyboards
</div>
Skip to [Options](#options).
@@ -383,7 +398,7 @@ can actually produce but there is a certain type of input error that might
<div id="options">
### Options
#### Options
</div>
Skip to the [obfuscation section](#obfuscation).
@@ -393,7 +408,10 @@ string; some I will document here (the summary being in the man page). You can
join options but there is a caveat with spaces and `-r` option as well as
the target string (see below).
<div id="quiet-mode">
#### Enable quiet output:
</div>
```
-q
@@ -559,7 +577,7 @@ the `-` - *in an earlier element of `argv`. This is not a bug!*
<div id="easter-egg">
### Easter egg
#### Easter egg
</div>
Skip to [Example Invocations](#invocations).
@@ -576,7 +594,7 @@ character in the keyboard. If you want to enable this specially you can use the
`-m` option (*-m for monkey*).
<div id="invocations">
### Example Invocations
#### Example Invocations
</div>
Skip to [Input Error Example](#error).
@@ -834,7 +852,7 @@ example shows (but the strings will still only be read from the
`test-strings.txt` file).
<div id="error">
### Input Error Example
#### Input Error Example
</div>
Skip to [Obfuscation](#obfuscation).
@@ -868,19 +886,19 @@ isspace('\n') == 1`. You can add these characters but the output will be
rather confusing and hard to read.
<div id="obfuscation">
## **4. Obfuscation**
### Obfuscation
</div>
### Techniques
#### Techniques
Skip to [Beauty](#beauty).
The following might be some of the techniques used in this entry:
1. Helpful and descriptive names for all variables and constants (like `S`)
0. Helpful and descriptive names for all variables and constants (like `S`)
as well as some C keywords.
2. The way `main()` is declared is:
1. The way `main()` is declared is:
``` <!---c-->
/* Special C main() handler (encapsulation): */
@@ -895,33 +913,33 @@ encapsulation and executing code is it actually nothing? And if it's nothing why
is it there? If it is something what is it doing? Could it be both? Or maybe it
really isn't nothing or nothing? :)
3. A special C parser called `H()`. It might help to observe that there
2. A special C parser called `H()`. It might help to observe that there
might be recursive calls and much of the program might use it. Or so it seems.
Then again it might not help to not notice it.
4. Digraphs. In their simplest form it's probably not a big deal but consider:
3. Digraphs. In their simplest form it's probably not a big deal but consider:
some source code formatters don't like them at all (neither, incidentally, does
`splint`, which completely baulks). There also is a trick; if you try
translating them then depending upon how you do it there can be functional
changes in the program!
5. The fact the program can by default print the primorial prime of 97 (*but that
default isn't the default - except when it IS the default!*) and yet that number
4. The fact the program can by default print the primorial prime of 97 (_but that
default isn't the default - except when it IS the default!_) and yet that number
isn't seen at all. See also technique #7.
6. Another usual suspect: the source is formatted in a beautiful design that
5. Another usual suspect: the source is formatted in a beautiful design that
could be described artistic; on the other hand some might suggest it's just a
blob of octets *but I disprove this when discussing beauty later on in the next
section.*
7. The string **METHINKS IT IS LIKE A WEASEL** is searched for by default
6. The string **METHINKS IT IS LIKE A WEASEL** is searched for by default
(except when it's not searched by default) but it's nowhere to be found in the
source file in that form. Why? Because anyone familiar with the Weasel program
won't recognise the string and put together what it is by looking at the source
code.
In case you wondered deciphering #5 won't decipher #7 (neither will
deciphering #7 help you decipher #5).
In case you wondered deciphering #4 won't decipher #6 (neither will
deciphering #6 help you decipher #4).
<div id="beauty">
### Beauty
@@ -949,11 +967,11 @@ this is clearly false; *as all good programmers know if something is potentially
confusing or misleading it should be made clear in the comments! :)*
<div id="build">
## **5. How to build**
### 5. How to build
</div>
<div id="constants">
### S, M and N Constants
#### S, M and N Constants
</div>
Skip to [Compilation](#compiling).
@@ -1062,7 +1080,7 @@ If you wanted to change the maximum number attempts to 100 you could do:
### Portability
</div>
Skip to [An aside on bugs](#bugs).
Skip to [Bugs](#bugs).
This entry requires at least C99 even if you translate digraphs. The program
doesn't require third-party libraries and should work on any Unix based system.
@@ -1127,7 +1145,7 @@ Kernel Version: Darwin 17.5.0
```
<div id="bugs">
#### An aside
#### Bugs
</div>
Skip to [Installing](#rpm).
@@ -1154,27 +1172,29 @@ Skip to [Final thoughts](#thoughts).
I have included a RPM spec file for those with a Red Hat based Linux
distribution; see [rpm.html](rpm.html) for details (including why I implemented
this) if for some (strange or maybe even mad) reason you're interested, which
basically means nobody but me.
I fully realise and always realised means nobody but me. Indeed not only do I
know nobody else would use it but I would recommend against it as well. It was a
personal thing and since the Judges remarked about it I kept it in.
[rpm.html]: rpm.html
<div id="thoughts">
## **6. Final thoughts**
### Final thoughts
</div>
Skip to [Winning comments](#winning).
The judges suggested that making them laugh helps entries chance of winning.
Well *laughter helps everything* so in case you haven't seen - and *even if you
have seen* - Dennis Ritchie's anti-foreword to the ghastly *UNIX-HATERS
Handbook* or Ken Thompson's revelation that C and Unix are a hoax (at the end of
Well _laughter helps everything_ so in case you haven't seen - and _even if you
have seen_ - Dennis Ritchie's anti-foreword to the ghastly _UNIX-HATERS
Handbook_ or Ken Thompson's revelation that C and Unix are a hoax (at the end of
that book) I include it below; because I agree that looking at a lot of twisted
code must be quite difficult (though maybe not as much as if you were to have to
look at Microsoft Windows code or code for Windows in any case ? :)) and these
two things I think are rather amusing (in order of least to most):
<div id="dmr">
Dennis Ritchie's Anti-Foreword:
#### Dennis Ritchie's Anti-Foreword:
</div>
> Anti-Foreword
@@ -1226,7 +1246,7 @@ albeit not very much (and it still *'compiles'!*); and isn't that what this
contest is about? :)
<div id="ken">
Ken Thompson's ending:
#### Ken Thompson's ending:
</div>
> Creators Admit C, Unix Were Hoax
@@ -1255,10 +1275,11 @@ parody of Multics, as well as other more risque allusions.
added additional cryptic features and evolved into B, BCPL, and finally C. We
stopped when we got a clean compile on the following syntax:
>
> `for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/`<br>
> `8)%2))P("|"+(*u/4)%2);`
>
>
``` <!---c-->
for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/
8)%2))P("|"+(*u/4)%2);
```
> "To think that modern programmers would try to use a language that allowed
such a statement was beyond our comprehension! We actually thought of selling
this to the Soviets to set their computer science progress back 20 or more
@@ -1289,12 +1310,12 @@ Barnum was correct.
So is it a hoax about a non-hoax, a non-hoax about a hoax, a non-hoax about a
non-hoax or is it a hoax about a hoax ? :) And if it's any of those what does it
mean about Unix and C?** And if a hoax is involved *what is the hoax?* The pedant
mean about Unix and C? And if a hoax is involved _what is the hoax?_ The pedant
and Tolkienist that I am has to state that **Tolkien didn't consider The Lord of
the Rings a trilogy** *(and he made that very clear)* but that doesn't take away
from the humour by any stretch (*if anyone wants me to elaborate or debate the
the Rings a trilogy** _(and he made that very clear)_ but that doesn't take away
from the humour by any stretch (_if anyone wants me to elaborate or debate the
matter do send me an email - I love Tolkien's Legendarium and having another
person to talk about it with is more than welcome!*). Ken suggested that there
person to talk about it with is more than welcome!_). Ken suggested that there
is a lack of common sense but since he was part of its creation I don't think
it's a bad thing; **on the contrary it makes all of us C programmers even more
talented! :)** I do wonder if he tested that bit of C code though:
@@ -1311,7 +1332,7 @@ for the contest but decided for the message by itself in the end). I would
prefer believing that whether true or not.
<div id="winning">
## **7. Winning comments, thanks, dedications, links, etc.**
### Winning comments, thanks, dedications, links, etc.
</div>
I feel incredibly honoured, privileged and I am extremely happy and proud to
@@ -1379,6 +1400,59 @@ winning entries as well.
If you wish to contact me please do so. Please contact via mastodon. You can try
email but I'm more likely to respond to mastodon messages.
<div id="monkey2024">
### Update on the Infinite Monkey Theorem, 2024
</div>
On 1 November 2024 I saw an article called [Typing monkey would be unable to
produce 'Hamlet' within the lifetime of the universe, study
finds](https://phys.org/news/2024-10-monkey-unable-hamlet-lifetime-universe.html).
This interested me greatly given my foray into the Infinite Monkey Theorem, for
this entry, and I'd like to briefly comment on it.
What I found interesting is the beginning where it says that it would take far
longer than the lifetime of our universe as they say it's still technically true
that Eric the monkey could type out the complete works of Shakespeare given
enough time, it is misleading.
With what I did I believe that I have shown how very hard it is and what's more
is that something ignored is that even if this was true the monkey would not
live long enough. There is one possible exception.
If Eric was taught to type and to read then it would be possible. But then that
would not be the Infinite Monkey Theorem as it says specifically typing at
random.
Another thing that interested me in this article is a quote from the
mathematicians:
> 'The Infinite Monkey Theorem only considers the infinite limit, with either an
infinite number of monkeys or an infinite time period of monkey labour,' said
Associate Professor Woodcock.
Yes, this is why it's called the '**Infinite** Monkey Theorem'. It's a fun study
to consider, maybe, but it's likely just as silly as the original theorem and
even the difference of the Weasel program and the original theory (I believe
there are some minor differences as described below).
A difference from the Weasel program, which is what my entry is, is that the
monkey has an easier time by making the keyboard the 26 capital letters and the
space bar. I am not sure how exactly this diverges from the Infinite Monkey
Theorem, however. They did in this study include punctuation and the letters
whereas I also diverged slightly from the Weasel program, namely by including
more than just space and the 26 English capital letters, though the alternate
version has a simpler keyboard.
This was both interesting and amusing:
> The results reveal that it is possible (around a 5% chance) for a single chimp
to type the word 'bananas' in its own lifetime.
My question would be: will Eric be given bananas for typing '_bananas_'? Well
we'll probably never know. Still, a silly study for a silly theorem but all in
good fun, I suppose.
[https://ioccc.xexyl.net/2018/weasel]: https://ioccc.xexyl.net/2018/weasel
[errata page]: https://ioccc.xexyl.net/2018/weasel/errata
+117 -59
View File
@@ -509,23 +509,28 @@ while using more Cenozoic minded code migration, read <a href="rpm.html">rpm.htm
<p>If you find yourself in an evolutionary dead end, try:</p>
<pre><code> man ./weasel.1</code></pre>
<h2 id="authors-remarks">Author’s remarks:</h2>
<ol start="0" type="1">
<li>Preface</li>
<li>What it is</li>
<li>How it works</li>
<li>Hints (Keyboards, Options, Easter egg, Example Invocations)</li>
<li>Obfuscation (Techniques, Beauty)</li>
<li>How to build (S and N Constants, Compilation, Portability, Installing)</li>
<li>Final thoughts</li>
<li>Winning comments, thanks, dedications, links, etc.</li>
</ol>
<h2 id="preface"><strong>0. Preface</strong></h2>
<p><strong>OBFUSCATION NOTES: A great deal of this document and the man page is full of
obfuscation information of different types; as such I would recommend that you try running the
judges suggested invocations as well as running <code>make test</code> before you get into
the document or the man page, unless you don’t mind reading obfuscation information. I don’t reveal
much in the way of obfuscation however so if you just want documentation on the
program, how to compile, etc. then there isn’t need to heed this note.</strong></p>
<div id="toc">
<h3 id="table-of-contents">Table of Contents</h3>
</div>
<ul>
<li><a href="#preface">Preface</a></li>
<li><a href="#what">What it is</a></li>
<li><a href="#how">How it works</a></li>
<li><a href="#hints">Hints (Keyboards, Options, Easter egg, Example Invocations)</a></li>
<li><a href="#obfuscation">Obfuscation (Techniques, Beauty)</a></li>
<li><a href="#build">How to build (S and N Constants, Compilation, Portability, Bugs, Installing)</a></li>
<li><a href="#thoughts">Final thoughts</a></li>
<li><a href="#winning">Winning comments, thanks, dedications, links, etc.</a></li>
<li><a href="#monkey2024">Update on the Infinite Monkey Theorem, 2024</a></li>
</ul>
<h3 id="preface">Preface</h3>
<p><strong>OBFUSCATION NOTES</strong>: a great deal of this document and the man page is full of
obfuscation information of different types; as such I would recommend that you
try running the judges suggested invocations as well as running <code>make test</code>
before you get into the document or the man page, unless you don’t mind reading
obfuscation information. I don’t reveal much in the way of obfuscation however
so if you just want documentation on the program, how to compile, etc. then
there isn’t need to heed this note.</p>
<p>I was at a loss on how to present my remarks; on the one hand I wanted to give
everything to the judges so they didn’t miss anything. But on the other hand I
didn’t want to reveal as much publicly and many people don’t like to read long
@@ -537,47 +542,52 @@ page (it explains all the options and describes the program briefly):</p>
possibly the next)</em> where I attempt to give a brief explanation of the sections
to make reading it easier and faster. In addition I want to point out a few
things. <em>If you want more details read this document more thoroughly (or just
the sections that seem relevant to what you’re after).</em> The <a href="FILES">FILES</a> file is a
quick list of files and respective summaries in this entry. Because several
the sections that seem relevant to what you’re after).</em> Because several
sections are quite long I have added a skip to link to skip to the next
subsection or section at the beginning of each section (and subsection).</p>
<p><strong><a href="#what">What it is</a>:</strong> This is a brief summary of the program; the man page is
<p><a href="#what">What it is</a>: this is a brief summary of the program; the man page is
more thorough than this.</p>
<p><strong><a href="#how">How it works</a>:</strong> Explain some of the basic concepts and terms of the
<p><a href="#how">How it works</a>: explains some of the basic concepts and terms of the
program; if you’re familiar with genetic algorithms there won’t be any problem
following this section but it might be of some value to read anyway. There is a
randomised mode that doesn’t use a genetic algorithm; it can be triggered a
number of ways but the <code>-m</code> option enables it specially (I discuss this
thoroughly in <strong><a href="#hints">Hints</a></strong>).</p>
<p><strong><a href="#hints">Hints</a>:</strong> Perhaps the longest part of this document because in it I
thoroughly in <a href="#hints">Hints</a>).</p>
<p><a href="#hints">Hints</a>: perhaps the longest part of this document because in it I
document the <a href="#keyboards">keyboards</a>, <a href="#options">options</a>, subtleties, including
features that might appear to be bugs but aren’t - including an
<a href="#error">input error</a>, an <a href="#obfuscation">Easter egg obfuscation</a> and quite a few
<a href="#invocations">example invocations</a>. If you’ve read the man page you probably
don’t need this unless there is something specific you’re after.</p>
<p><strong><a href="#obfuscation">Obfuscation</a>:</strong> Some of the techniques that might not be used.</p>
<p><strong><a href="#build">How to build</a>:</strong> Here I describe briefly
<p><a href="#obfuscation">Obfuscation</a>: some of the techniques that might not be used.</p>
<p><a href="#build">How to build</a>: here I describe briefly
<a href="#constants">the constants that can be redefined</a> <code>S</code>, <code>M</code> and <code>N</code>: the
maximum size of the chromosome (target string; the maximum length is <code>S - 1</code>
but it must be &gt;= the default 38), the number of maximum attempts before giving
up and the number of offspring, respectively. I
also give <a href="#compiling">example compiler invocations</a>, <a href="#portability">portability
notes</a>, an <a href="#bugs">more portability notes</a> and a <a href="rpm.html">note on
rpm.html</a>.</p>
<p>On the subject of <code>S</code> and <code>N</code>: As the judges’ suggested runs imply you
rpm.html</a>; I obviously <strong>DO NOT</strong> recommend installing it any more than
the Judges would, but it was part of my entry for personal reasons and since the
Judges remarked about it I have kept it in place.</p>
<p>On the subject of <code>S</code> and <code>N</code>: as the judges’ suggested runs imply you
can change the target string at runtime; <code>make test</code> runs a script
<code>test.sh</code> which reads from the file <code>test-strings.txt</code>, running the program
for each string in the file, waiting approximately two seconds before
continuing. I explain how to pass options to the script in part of
<strong><a href="#test">Hints</a></strong>.</p>
<p><strong><a href="#thoughts">Final thoughts</a>:</strong> You might enjoy what I included; they’re
<a href="#test">Hints</a>.</p>
<p><a href="#thoughts">Final thoughts</a>: you might enjoy what I included; they’re
humorous pieces by <a href="#dmr">Dennis Ritchie</a> and <a href="#ken">Ken Thompson</a> themselves
from the infamous <em>UNIX-HATERS Handbook</em>.</p>
<p><strong><a href="#winning">Winning thoughts</a>:</strong> What it means to me to win as well as some
<p><a href="#winning">Winning thoughts</a>: what it means to me to win as well as some
dedications and thanks. Here too I include a link to a website which will be
dedicated to this entry beyond what will be published on the IOCCC website.</p>
<p>In 2024 I saw a fun article claiming that a monkey could not in the lifetime of
the universe type up even just Hamlet. This, with my brief foray into the Weasel
program, was fun and amusing to read, as well as interesting. I give my comments
at <a href="#monkey2024">my 2024 update</a>.</p>
<div id="what">
<h2 id="what-it-is"><strong>1. What it is</strong></h2>
<h3 id="what-it-is">What it is</h3>
</div>
<p>Skip to <a href="#how">How it works</a>.</p>
<p>It is an implementation of Richard Dawkins’ <a href="https://en.wikipedia.org/wiki/Weasel_program">Weasel program</a> (Wikipedia).
@@ -609,7 +619,7 @@ algorithm) towards the solution of the string <code>METHINKS IT IS LIKE A WEASEL
(note that I use <code>toupper()</code> so it doesn’t matter what case the input is the
comparison and output will always be capitalised).</p>
<div id="how">
<h2 id="how-it-works"><strong>2. How it works</strong></h2>
<h3 id="how-it-works">How it works</h3>
</div>
<p>Skip to <a href="#hints">Hints</a>.</p>
<p>Here you can find a general explanation of a <em><a href="https://web.archive.org/web/20180308131613/http://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol1/hmw/article1.html">genetic algorithm</a></em> as well as a
@@ -684,7 +694,7 @@ without passing in specially?</p>
<p>I was quite proud that when the next contest came the judges removed that
question. Later 2018 and all of 2019 was difficult for me so it was like I won a
second time for the same entry.</p>
<h3 id="on-user-monkey-errors">On <del>user</del> monkey errors</h3>
<h4 id="on-user-monkey-errors">On <del>user</del> monkey errors</h4>
<p>If the generation reaches <code>SIZE_MAX - 1</code> I consider it a monkey (or if you
insist: user) error; if the user insists on being so petulant enough as to try
such a ridiculous set of parameters in an attempt to make it be no more
@@ -702,11 +712,11 @@ such a monkey isn’t typing or even doesn’t exist (because it’s not the <em
Fish Theorem</em>). So although the user might not be a monkey the program makes the
assumption that <strong>the user could in fact be a monkey called Eric</strong> <em>although it
isn’t insolent enough to say the user is a monkey for certain!</em></p>
<h2 id="hints"><strong>3. Hints</strong></h2>
<h3 id="hints">Hints</h3>
<p>Skip to <a href="#obfuscation">Obfuscation</a>.</p>
<p>I noted that there are a number of additional features and here I will document
some of them.</p>
<h3 id="keyboards">Keyboards</h3>
<h4 id="keyboards">Keyboards</h4>
<p>Skip to <a href="#options">Options</a>.</p>
<p>The keyboard, as noted, has more than just the alphabet and space. To be
precise the following characters are acceptable; it equates to this in C (note
@@ -718,13 +728,15 @@ it includes a literal space <code>' '</code> but it doesn’t include other
<p>The program makes sure that the target string only has characters the keyboard
can actually produce but there is a certain type of input error that might
<em>appear</em> to be a bug; see specifically <a href="#error">Input Error Example</a>.</p>
<h3 id="options">Options</h3>
<h4 id="options">Options</h4>
<p>Skip to the <a href="#obfuscation">obfuscation section</a>.</p>
<p>There are a number of options you can pass to the program besides the target
string; some I will document here (the summary being in the man page). You can
join options but there is a caveat with spaces and <code>-r</code> option as well as
the target string (see below).</p>
<div id="quiet-mode">
<h4 id="enable-quiet-output">Enable quiet output:</h4>
</div>
<pre><code> -q</code></pre>
<p>This means don’t print the generation and offspring output; only print (some) of
the options set (this is always done but wouldn’t usually be seen due to verbose
@@ -825,7 +837,7 @@ itself) and then the target string would <em>literally</em> be set to <code>-r</
it no longer cares about the <code>-</code> for option parsing. In other words options
are only parsed if the first character is <code>-</code> and if the parser hasn’t seen
the <code>-</code> - <em>in an earlier element of <code>argv</code>. This is not a bug!</em></p>
<h3 id="easter-egg">Easter egg</h3>
<h4 id="easter-egg">Easter egg</h4>
<p>Skip to <a href="#invocations">Example Invocations</a>.</p>
<p>The Easter egg: since Dawkins references the <a href="https://en.wikipedia.org/wiki/Infinite_monkey_theorem">Infinite Monkey Theorem</a> it
simulates a monkey using a typewriter! This mode has the following changes:</p>
@@ -837,7 +849,7 @@ offspring of each generation will be assigned a pseudo-randomly positioned
character in the keyboard. If you want to enable this specially you can use the
<code>-m</code> option (<em>-m for monkey</em>).</p>
<div id="invocations">
<h3 id="example-invocations">Example Invocations</h3>
<h4 id="example-invocations">Example Invocations</h4>
</div>
<p>Skip to <a href="#error">Input Error Example</a>.</p>
<p>The following examples are used to demonstrate better the command line parsing.
@@ -1023,7 +1035,7 @@ script you will have to directly pass the options to the script</strong> like th
example shows (but the strings will still only be read from the
<code>test-strings.txt</code> file).</p>
<div id="error">
<h3 id="input-error-example">Input Error Example</h3>
<h4 id="input-error-example">Input Error Example</h4>
</div>
<p>Skip to <a href="#obfuscation">Obfuscation</a>.</p>
<p>There is a type of input error, as I said, that might appear to be a bug. What
@@ -1048,11 +1060,11 @@ invalid character (<code>'\n'</code> itself which means another line break) and
finally the closing <code>'</code>. Specifically <code>isspace()</code> characters aren’t
distinctly seen like a letter, digit or symbol is: <code>isprint('\n') == 0 &amp;&amp; isspace('\n') == 1</code>. You can add these characters but the output will be
rather confusing and hard to read.</p>
<h2 id="obfuscation"><strong>4. Obfuscation</strong></h2>
<h3 id="techniques">Techniques</h3>
<h3 id="obfuscation">Obfuscation</h3>
<h4 id="techniques">Techniques</h4>
<p>Skip to <a href="#beauty">Beauty</a>.</p>
<p>The following might be some of the techniques used in this entry:</p>
<ol type="1">
<ol start="0" type="1">
<li><p>Helpful and descriptive names for all variables and constants (like <code>S</code>)
as well as some C keywords.</p></li>
<li><p>The way <code>main()</code> is declared is:</p></li>
@@ -1066,7 +1078,7 @@ isn’t encapsulation and also isn’t executing code but assuming it’s
encapsulation and executing code is it actually nothing? And if it’s nothing why
is it there? If it is something what is it doing? Could it be both? Or maybe it
really isn’t nothing or nothing? :)</p>
<ol start="3" type="1">
<ol start="2" type="1">
<li><p>A special C parser called <code>H()</code>. It might help to observe that there
might be recursive calls and much of the program might use it. Or so it seems.
Then again it might not help to not notice it.</p></li>
@@ -1088,8 +1100,8 @@ source file in that form. Why? Because anyone familiar with the Weasel program
won’t recognise the string and put together what it is by looking at the source
code.</p></li>
</ol>
<p>In case you wondered deciphering #5 won’t decipher #7 (neither will
deciphering #7 help you decipher #5).</p>
<p>In case you wondered deciphering #4 won’t decipher #6 (neither will
deciphering #6 help you decipher #4).</p>
<h3 id="beauty">Beauty</h3>
<p>Skip to <a href="#build">How to build</a>.</p>
<p>On the subject of beauty: the judges stated in the guidelines the following:</p>
@@ -1110,10 +1122,10 @@ some of it might look like a blob (for certain definitions of ‘blob’ :) ) bu
this is clearly false; <em>as all good programmers know if something is potentially
confusing or misleading it should be made clear in the comments! :)</em></p>
<div id="build">
<h2 id="how-to-build"><strong>5. How to build</strong></h2>
<h3 id="how-to-build">5. How to build</h3>
</div>
<div id="constants">
<h3 id="s-m-and-n-constants">S, M and N Constants</h3>
<h4 id="s-m-and-n-constants">S, M and N Constants</h4>
</div>
<p>Skip to <a href="#compiling">Compilation</a>.</p>
<p>There are three <code>#define</code>d constants that can be redefined at compilation to modify the
@@ -1174,7 +1186,7 @@ result. Remember too that <code>S</code> (<code>MAX_SIZE</code>) cannot be less
<p>If you wanted to change the maximum number attempts to 100 you could do:</p>
<pre><code> make clobber MAX_ATTEMPTS=100 everything</code></pre>
<h3 id="portability">Portability</h3>
<p>Skip to <a href="#bugs">An aside on bugs</a>.</p>
<p>Skip to <a href="#bugs">Bugs</a>.</p>
<p>This entry requires at least C99 even if you translate digraphs. The program
doesn’t require third-party libraries and should work on any Unix based system.
It works on both 64-bit and 32-bit (but inevitably some data type sizes will be
@@ -1219,9 +1231,7 @@ Kernel Version: Darwin 17.5.0</p>
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ uname -srmv
Darwin 17.5.0 Darwin Kernel Version 17.5.0: Mon Mar 5 22:24:32 PST 2018; root:xnu-4570.51.1~1/RELEASE_X86_64 x86_64</code></pre>
<div id="bugs">
<h4 id="an-aside">An aside</h4>
</div>
<h4 id="bugs">Bugs</h4>
<p>Skip to <a href="#rpm">Installing</a>.</p>
<p>Any undocumented bugs are the result of insolent monkeys tampering with any
number of things. That includes but is not limited to running the program on a
@@ -1242,9 +1252,11 @@ however leaving it as it is because this is what won.</p>
<p>I have included a RPM spec file for those with a Red Hat based Linux
distribution; see <a href="rpm.html">rpm.html</a> for details (including why I implemented
this) if for some (strange or maybe even mad) reason you’re interested, which
basically means nobody but me.</p>
I fully realise and always realised means nobody but me. Indeed not only do I
know nobody else would use it but I would recommend against it as well. It was a
personal thing and since the Judges remarked about it I kept it in.</p>
<div id="thoughts">
<h2 id="final-thoughts"><strong>6. Final thoughts</strong></h2>
<h3 id="final-thoughts">Final thoughts</h3>
</div>
<p>Skip to <a href="#winning">Winning comments</a>.</p>
<p>The judges suggested that making them laugh helps entries chance of winning.
@@ -1256,7 +1268,7 @@ code must be quite difficult (though maybe not as much as if you were to have to
look at Microsoft Windows code or code for Windows in any case ? :)) and these
two things I think are rather amusing (in order of least to most):</p>
<div id="dmr">
<p>Dennis Ritchie’s Anti-Foreword:</p>
<h4 id="dennis-ritchies-anti-foreword">Dennis Ritchie’s Anti-Foreword:</h4>
</div>
<blockquote>
<p>Anti-Foreword</p>
@@ -1299,7 +1311,7 @@ and since it doesn’t break his message it’s not broken - it’s just obfusca
albeit not very much (and it still <em>‘compiles’!</em>); and isn’t that what this
contest is about? :)</p>
<div id="ken">
<p>Ken Thompson’s ending:</p>
<h4 id="ken-thompsons-ending">Ken Thompson’s ending:</h4>
</div>
<blockquote>
<p>Creators Admit C, Unix Were Hoax</p>
@@ -1322,8 +1334,10 @@ parody of Multics, as well as other more risque allusions.</p>
<p>“Then Dennis and Brian worked on a truly warped version of Pascal, called”A.” When we found others were actually trying to programs with A, we quickly
added additional cryptic features and evolved into B, BCPL, and finally C. We
stopped when we got a clean compile on the following syntax:</p>
<p><code>for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/</code><br>
<code>8)%2))P("|"+(*u/4)%2);</code></p>
</blockquote>
<pre><code> for(;P(&quot;\n&quot;),R=;P(&quot;|&quot;))for(e=C;e=P(&quot;_&quot;+(*u++/
8)%2))P(&quot;|&quot;+(*u/4)%2);</code></pre>
<blockquote>
<p>“To think that modern programmers would try to use a language that allowed
such a statement was beyond our comprehension! We actually thought of selling
this to the Soviets to set their computer science progress back 20 or more
@@ -1351,7 +1365,7 @@ Barnum was correct.</p>
<hr>
<p>So is it a hoax about a non-hoax, a non-hoax about a hoax, a non-hoax about a
non-hoax or is it a hoax about a hoax ? :) And if it’s any of those what does it
mean about Unix and C?** And if a hoax is involved <em>what is the hoax?</em> The pedant
mean about Unix and C? And if a hoax is involved <em>what is the hoax?</em> The pedant
and Tolkienist that I am has to state that <strong>Tolkien didn’t consider The Lord of
the Rings a trilogy</strong> <em>(and he made that very clear)</em> but that doesn’t take away
from the humour by any stretch (<em>if anyone wants me to elaborate or debate the
@@ -1368,7 +1382,7 @@ I’m missing but either way it’s a funny piece. It could also be for irony it
for the contest but decided for the message by itself in the end). I would
prefer believing that whether true or not.</p>
<div id="winning">
<h2 id="winning-comments-thanks-dedications-links-etc."><strong>7. Winning comments, thanks, dedications, links, etc.</strong></h2>
<h3 id="winning-comments-thanks-dedications-links-etc.">Winning comments, thanks, dedications, links, etc.</h3>
</div>
<p>I feel incredibly honoured, privileged and I am extremely happy and proud to
have won! I am more proud and happy about this than anything I have ever done in
@@ -1424,6 +1438,50 @@ what’s already published on the IOCCC website). I have commentary on the other
winning entries as well.</p>
<p>If you wish to contact me please do so. Please contact via mastodon. You can try
email but I’m more likely to respond to mastodon messages.</p>
<div id="monkey2024">
<h3 id="update-on-the-infinite-monkey-theorem-2024">Update on the Infinite Monkey Theorem, 2024</h3>
</div>
<p>On 1 November 2024 I saw an article called <a href="https://phys.org/news/2024-10-monkey-unable-hamlet-lifetime-universe.html">Typing monkey would be unable to
produce ‘Hamlet’ within the lifetime of the universe, study
finds</a>.
This interested me greatly given my foray into the Infinite Monkey Theorem, for
this entry, and I’d like to briefly comment on it.</p>
<p>What I found interesting is the beginning where it says that it would take far
longer than the lifetime of our universe as they say it’s still technically true
that Eric the monkey could type out the complete works of Shakespeare given
enough time, it is misleading.</p>
<p>With what I did I believe that I have shown how very hard it is and what’s more
is that something ignored is that even if this was true the monkey would not
live long enough. There is one possible exception.</p>
<p>If Eric was taught to type and to read then it would be possible. But then that
would not be the Infinite Monkey Theorem as it says specifically typing at
random.</p>
<p>Another thing that interested me in this article is a quote from the
mathematicians:</p>
<blockquote>
<p>‘The Infinite Monkey Theorem only considers the infinite limit, with either an
infinite number of monkeys or an infinite time period of monkey labour,’ said
Associate Professor Woodcock.</p>
</blockquote>
<p>Yes, this is why it’s called the ‘<strong>Infinite</strong> Monkey Theorem’. It’s a fun study
to consider, maybe, but it’s likely just as silly as the original theorem and
even the difference of the Weasel program and the original theory (I believe
there are some minor differences as described below).</p>
<p>A difference from the Weasel program, which is what my entry is, is that the
monkey has an easier time by making the keyboard the 26 capital letters and the
space bar. I am not sure how exactly this diverges from the Infinite Monkey
Theorem, however. They did in this study include punctuation and the letters
whereas I also diverged slightly from the Weasel program, namely by including
more than just space and the 26 English capital letters, though the alternate
version has a simpler keyboard.</p>
<p>This was both interesting and amusing:</p>
<blockquote>
<p>The results reveal that it is possible (around a 5% chance) for a single chimp
to type the word ‘bananas’ in its own lifetime.</p>
</blockquote>
<p>My question would be: will Eric be given bananas for typing ‘<em>bananas</em>’? Well
we’ll probably never know. Still, a silly study for a silly theorem but all in
good fun, I suppose.</p>
<!--
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.