Format fixes in html files from 2018
This commit is contained in:
1 parent
18268ae452
commit
cb5ab11092
21 files changed
+493
-604
No files matched your search
@@ -81,7 +81,11 @@ from hearing. But even without training you can easily read along with the
|
||||
printed characters and have the sound make sense with the look of the
|
||||
characters.
|
||||
|
||||
See image [spectrogram.png](spectrogram.png) for an example spectrogram.
|
||||
See image [spectrogram.png](spectrogram.png) for an example spectrogram:
|
||||
|
||||
<img src="spectrogram.png"
|
||||
alt="example spectrogram"
|
||||
width=748 height=400>
|
||||
|
||||
|
||||
### Limitations
|
||||
|
||||
@@ -457,7 +457,10 @@ could listen to a cacophony of chirpy characters.</p>
|
||||
from hearing. But even without training you can easily read along with the
|
||||
printed characters and have the sound make sense with the look of the
|
||||
characters.</p>
|
||||
<p>See image <a href="spectrogram.png">spectrogram.png</a> for an example spectrogram.</p>
|
||||
<p>See image <a href="spectrogram.png">spectrogram.png</a> for an example spectrogram:</p>
|
||||
<p><img src="spectrogram.png"
|
||||
alt="example spectrogram"
|
||||
width=748 height=400></p>
|
||||
<h3 id="limitations">Limitations</h3>
|
||||
<p>There is no error checking done when opening files, so expect segfaults if you
|
||||
provide the wrong path to a file.</p>
|
||||
|
||||
+7
-10
@@ -51,7 +51,7 @@ One line, one array, one loop and one statement but it prints many bytes. It won
|
||||
|
||||
Feed this anything on `stdin`.
|
||||
|
||||
The [included script.sh](%%REPO_URL%%/2018/burton1/scripthd.sh) may be used as a driver program for this entry.
|
||||
The included [scripthd.sh](%%REPO_URL%%/2018/burton1/scripthd.sh) may be used as a driver program for this entry.
|
||||
It adds several nice-to-have features, and allows salt-to-taste customizability.
|
||||
|
||||
This code has been compiled and tested on:
|
||||
@@ -227,15 +227,12 @@ It pre-dates `varargs.h`, and assembly was the only way to gain access to the
|
||||
variable argument types. The first edition _The C Programming Language_, 1978,
|
||||
page 71, remarks:
|
||||
|
||||
```
|
||||
By the way, there is no entirely satisfactory way to write a portable function
|
||||
that accepts a variable number of arguments, because there is no portable way
|
||||
for the called function to determine how many arguments where actually passed
|
||||
to it in a given call.
|
||||
...
|
||||
`printf`, the most common C function with a variable number of arguments,
|
||||
... is also non-portable and must be modified for different environments.
|
||||
```
|
||||
> By the way, there is no entirely satisfactory way to write a portable function
|
||||
that accepts a variable number of arguments, because there is no portable way
|
||||
for the called function to determine how many arguments where actually passed to
|
||||
it in a given call. ... `printf`, the most common C function with a variable
|
||||
number of arguments, ... is also non-portable and must be modified for different
|
||||
environments.
|
||||
|
||||
It is fascinating to explore the roots of C through the history of the operating
|
||||
system it was birthed within. C is often criticized as a difficult, inscrutable
|
||||
|
||||
@@ -429,7 +429,7 @@ with <code>-Wno-</code> options.</p>
|
||||
<p>One line, one array, one loop and one statement but it prints many bytes. It won.</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p>Feed this anything on <code>stdin</code>.</p>
|
||||
<p>The <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2018/burton1/scripthd.sh">included script.sh</a> may be used as a driver program for this entry.
|
||||
<p>The included <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2018/burton1/scripthd.sh">scripthd.sh</a> may be used as a driver program for this entry.
|
||||
It adds several nice-to-have features, and allows salt-to-taste customizability.</p>
|
||||
<p>This code has been compiled and tested on:</p>
|
||||
<ul>
|
||||
@@ -559,13 +559,14 @@ shortest code that compiles and runs correctly in Ancient UNIX.</p>
|
||||
It pre-dates <code>varargs.h</code>, and assembly was the only way to gain access to the
|
||||
variable argument types. The first edition <em>The C Programming Language</em>, 1978,
|
||||
page 71, remarks:</p>
|
||||
<pre><code> By the way, there is no entirely satisfactory way to write a portable function
|
||||
that accepts a variable number of arguments, because there is no portable way
|
||||
for the called function to determine how many arguments where actually passed
|
||||
to it in a given call.
|
||||
...
|
||||
`printf`, the most common C function with a variable number of arguments,
|
||||
... is also non-portable and must be modified for different environments.</code></pre>
|
||||
<blockquote>
|
||||
<p>By the way, there is no entirely satisfactory way to write a portable function
|
||||
that accepts a variable number of arguments, because there is no portable way
|
||||
for the called function to determine how many arguments where actually passed to
|
||||
it in a given call. … <code>printf</code>, the most common C function with a variable
|
||||
number of arguments, … is also non-portable and must be modified for different
|
||||
environments.</p>
|
||||
</blockquote>
|
||||
<p>It is fascinating to explore the roots of C through the history of the operating
|
||||
system it was birthed within. C is often criticized as a difficult, inscrutable
|
||||
language, but as this contest demonstrates, this is in parody. <em>Shell-gol</em> is
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
```
|
||||
|
||||
There is an alternate version that lacks a useful bug fix. See [Alternate
|
||||
code](#alternate-code) and the author's remarks, [remarks section](#remarks),
|
||||
code](#alternate-code) and the author's remarks' [remarks section](#remarks),
|
||||
below for more details.
|
||||
|
||||
|
||||
|
||||
@@ -411,7 +411,7 @@ Location: <a href="../../location.html#PL">PL</a> - <em>Republic of Poland</em>
|
||||
<h2 id="to-build">To build:</h2>
|
||||
<pre><code> make</code></pre>
|
||||
<p>There is an alternate version that lacks a useful bug fix. See <a href="#alternate-code">Alternate
|
||||
code</a> and the author’s remarks, <a href="#remarks">remarks section</a>,
|
||||
code</a> and the author’s remarks’ <a href="#remarks">remarks section</a>,
|
||||
below for more details.</p>
|
||||
<h2 id="to-use">To use:</h2>
|
||||
<pre><code> ./prog < text</code></pre>
|
||||
|
||||
@@ -33,7 +33,7 @@ This is an EX-tremely obfuscated program!
|
||||
|
||||
A high-context work that combines parrots that new hackers like and parrots that
|
||||
old hackers like. One is an internet meme called [Party
|
||||
Parrot](https://cultofthepartyparrot.com) (WARNING: has flashing lights). The other is a
|
||||
Parrot](https://cultofthepartyparrot.com) (**WARNING**: has flashing lights). The other is a
|
||||
sketch [comté](https://en.wikipedia.org/wiki/Comté_cheese) called ["Dead
|
||||
Parrot"](https://en.wikipedia.org/wiki/Dead_Parrot_sketch) from the British
|
||||
sitcom ["Monty Python's Flying Circus"](https://en.wikipedia.org/wiki/Monty_Python%27s_Flying_Circus)
|
||||
@@ -44,8 +44,8 @@ The "_Python_" in the award name refers to Monty Python, **not** the
|
||||
The shape of [prog.c](%%REPO_URL%%/2018/endoh2/prog.c) is "Undead Parrot" based on "dead parrot". The
|
||||
message that appears in the bottom line of the output source code is the subject
|
||||
of the dialogue that appears in "Dead Parrot" and explains in various
|
||||
expressions that the parrot died. Also, the second **__<-_Source_of_Parrots__**
|
||||
line from the bottom of <http://cultofthepartyparrot.com/> (WARNING: has
|
||||
expressions that the parrot died. Also, the second `__<-_Source_of_Parrots__`
|
||||
line from the bottom of <http://cultofthepartyparrot.com/> (**WARNING**: has
|
||||
flashing lights) has a hidden URL (hidden by the parrot's body).
|
||||
|
||||
Although it is a boring Quine story, it is quite difficult to have 10 parrot
|
||||
|
||||
@@ -423,7 +423,7 @@ This is an EX-tremely obfuscated program!</p>
|
||||
<h2 id="authors-remarks">Author’s remarks:</h2>
|
||||
<p>A high-context work that combines parrots that new hackers like and parrots that
|
||||
old hackers like. One is an internet meme called <a href="https://cultofthepartyparrot.com">Party
|
||||
Parrot</a> (WARNING: has flashing lights). The other is a
|
||||
Parrot</a> (<strong>WARNING</strong>: has flashing lights). The other is a
|
||||
sketch <a href="https://en.wikipedia.org/wiki/Comté_cheese">comté</a> called <a href="https://en.wikipedia.org/wiki/Dead_Parrot_sketch">“Dead
|
||||
Parrot”</a> from the British
|
||||
sitcom <a href="https://en.wikipedia.org/wiki/Monty_Python%27s_Flying_Circus">“Monty Python’s Flying Circus”</a>
|
||||
@@ -433,8 +433,8 @@ The “<em>Python</em>” in the award name refers to Monty Python, <strong>not<
|
||||
<p>The shape of <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2018/endoh2/prog.c">prog.c</a> is “Undead Parrot” based on “dead parrot”. The
|
||||
message that appears in the bottom line of the output source code is the subject
|
||||
of the dialogue that appears in “Dead Parrot” and explains in various
|
||||
expressions that the parrot died. Also, the second **__<-_Source_of_Parrots__**
|
||||
line from the bottom of <a href="http://cultofthepartyparrot.com/" class="uri">http://cultofthepartyparrot.com/</a> (WARNING: has
|
||||
expressions that the parrot died. Also, the second <code>__<-_Source_of_Parrots__</code>
|
||||
line from the bottom of <a href="http://cultofthepartyparrot.com/" class="uri">http://cultofthepartyparrot.com/</a> (<strong>WARNING</strong>: has
|
||||
flashing lights) has a hidden URL (hidden by the parrot’s body).</p>
|
||||
<p>Although it is a boring Quine story, it is quite difficult to have 10 parrot
|
||||
pictures and 10 lines of data. Only the outline data of the parrot picture is
|
||||
|
||||
@@ -393,15 +393,15 @@
|
||||
<ul>
|
||||
<li><a href="prog.c">prog.c</a>
|
||||
<ul>
|
||||
<li>This is the source file to the <code>weasel</code> program [1].</li>
|
||||
<li>This is the source file to the <code>weasel</code> program.</li>
|
||||
</ul></li>
|
||||
<li><a href="prog.alt.c">prog.alt.c</a>
|
||||
<ul>
|
||||
<li>This is the source code file to the <code>weasel.alt</code> program [1].</li>
|
||||
<li>This is the source code file to the <code>weasel.alt</code> program.</li>
|
||||
</ul></li>
|
||||
<li><a href="test.sh">test.sh</a>
|
||||
<ul>
|
||||
<li>Script provided to test the weasel program [1].</li>
|
||||
<li>Script provided to test the weasel program.</li>
|
||||
</ul></li>
|
||||
<li><a href="test-strings.txt">test-strings.txt</a>
|
||||
<ul>
|
||||
@@ -412,24 +412,17 @@ target strings.</li>
|
||||
<ul>
|
||||
<li>The Makefile that simplifies compilation as well as providing some deep
|
||||
magic and other things designed by the IOCCC judges. There’s also a <code>make test</code> target that runs the <code>test.sh</code> script. The index.html file shows how
|
||||
to pass options to the script itself [1].</li>
|
||||
to pass options to the script itself.</li>
|
||||
</ul></li>
|
||||
<li><a href="weasel.1">weasel.1</a>
|
||||
<ul>
|
||||
<li>The man page for weasel.</li>
|
||||
</ul></li>
|
||||
<li><a href="README.md">README.md</a>
|
||||
<li><a href="rpm.html">rpm.html</a>
|
||||
<ul>
|
||||
<li>The source of the index.html file [3].</li>
|
||||
<li>This file briefly answers ‘why’ I submitted an rpm spec file.</li>
|
||||
</ul></li>
|
||||
<li><a href="rpm.md">rpm.md</a>
|
||||
<ul>
|
||||
<li>This file briefly answers ‘why’ I submitted an rpm spec file ‘weasel.spec’
|
||||
as well as the possibility of building the RPM for others (despite the fact
|
||||
I am confident that I’m the only one who would make use of it). This file
|
||||
isn’t included in the RPM itself; it remains only on the IOCCC website.</li>
|
||||
</ul></li>
|
||||
<li><a href="weasel.spec">weasel.spec</a>
|
||||
<li><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2018/ferguson/weasel.spec">weasel.spec</a>
|
||||
<ul>
|
||||
<li>The RPM spec file for building the RPM. This is specific to the entry on
|
||||
the IOCCC website but would also be available in the source rpm file if it
|
||||
@@ -439,30 +432,7 @@ was built.</li>
|
||||
<ul>
|
||||
<li>This web page.</li>
|
||||
</ul></li>
|
||||
<li><a href="FILES.md">FILES.md</a>
|
||||
<ul>
|
||||
<li>The markdown source file for <a href="FILES.html">FILES.html</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h2 id="footnote">Footnote</h2>
|
||||
<p>The follow footnotes are for if the weasel program is installed into the
|
||||
system via the RPM file (that can be built by say <code>rpmbuild -bb weasel.spec</code> on
|
||||
an RPM linux system).</p>
|
||||
<p>As I noted before it was primarily personal reasons that I submitted the spec
|
||||
file. Years later I thought of removing it but since I quite enjoyed the judges’
|
||||
remarks I have kept it in place. Please note that the paths below are dependent
|
||||
on the prefix used in installation; where I suggest <code>/usr</code> it is equally
|
||||
possible it could be under ‘/usr/local’, for example.</p>
|
||||
<p>[1] Note that <a href="prog.c">prog.c</a> and
|
||||
<a href="prog.alt.c">prog.alt.c</a> would be
|
||||
linked to <code>weasel.c</code> and <code>weasel.alt.c</code>
|
||||
(respectively) in the <code>/usr/src/weasel</code>
|
||||
subdirectory.</p>
|
||||
<p>[2] The file would most likely be compressed as
|
||||
<code>weasel.1.gz</code> under the <code>/usr/share/man/man1</code>
|
||||
subdirectory.</p>
|
||||
<p>[3] These files would be in the <code>/usr/share/doc/weasel</code>
|
||||
subdirectory.</p>
|
||||
<hr style="width:10%;text-align:left;margin-left:0">
|
||||
<p>Jump to: <a href="#">top</a></p>
|
||||
<!--
|
||||
|
||||
+7
-42
@@ -1,64 +1,29 @@
|
||||
# List of files in this entry with a brief description
|
||||
|
||||
- [prog.c](prog.c)
|
||||
* This is the source file to the `weasel` program [1].
|
||||
* This is the source file to the `weasel` program.
|
||||
- [prog.alt.c](prog.alt.c)
|
||||
* This is the source code file to the `weasel.alt` program [1].
|
||||
* This is the source code file to the `weasel.alt` program.
|
||||
- [test.sh](test.sh)
|
||||
* Script provided to test the weasel program [1].
|
||||
* Script provided to test the weasel program.
|
||||
- [test-strings.txt](test-strings.txt)
|
||||
* The `test.sh` script reads from this file and runs the program with these
|
||||
target strings.
|
||||
|
||||
- [Makefile](Makefile)
|
||||
* The Makefile that simplifies compilation as well as providing some deep
|
||||
magic and other things designed by the IOCCC judges. There's also a `make
|
||||
test` target that runs the `test.sh` script. The index.html file shows how
|
||||
to pass options to the script itself [1].
|
||||
to pass options to the script itself.
|
||||
- [weasel.1](weasel.1)
|
||||
* The man page for weasel.
|
||||
- [README.md](README.md)
|
||||
* The source of the index.html file [3].
|
||||
- [rpm.md](rpm.md)
|
||||
* This file briefly answers 'why' I submitted an rpm spec file 'weasel.spec'
|
||||
as well as the possibility of building the RPM for others (despite the fact
|
||||
I am confident that I'm the only one who would make use of it). This file
|
||||
isn't included in the RPM itself; it remains only on the IOCCC website.
|
||||
- [weasel.spec](weasel.spec)
|
||||
- [rpm.html](rpm.html)
|
||||
* This file briefly answers 'why' I submitted an rpm spec file.
|
||||
- [weasel.spec](%%REPO_URL%%/2018/ferguson/weasel.spec)
|
||||
* The RPM spec file for building the RPM. This is specific to the entry on
|
||||
the IOCCC website but would also be available in the source rpm file if it
|
||||
was built.
|
||||
- [FILES.html](FILES.html)
|
||||
* This web page.
|
||||
- [FILES.md](FILES.md)
|
||||
* The markdown source file for [FILES.html](FILES.html)
|
||||
|
||||
|
||||
|
||||
## Footnote
|
||||
|
||||
The follow footnotes are for if the weasel program is installed into the
|
||||
system via the RPM file (that can be built by say `rpmbuild -bb weasel.spec` on
|
||||
an RPM linux system).
|
||||
|
||||
As I noted before it was primarily personal reasons that I submitted the spec
|
||||
file. Years later I thought of removing it but since I quite enjoyed the judges'
|
||||
remarks I have kept it in place. Please note that the paths below are dependent
|
||||
on the prefix used in installation; where I suggest `/usr` it is equally
|
||||
possible it could be under '/usr/local', for example.
|
||||
|
||||
[1] Note that [prog.c](prog.c) and
|
||||
[prog.alt.c](prog.alt.c) would be
|
||||
linked to `weasel.c` and `weasel.alt.c`
|
||||
(respectively) in the `/usr/src/weasel`
|
||||
subdirectory.
|
||||
|
||||
[2] The file would most likely be compressed as
|
||||
`weasel.1.gz` under the `/usr/share/man/man1`
|
||||
subdirectory.
|
||||
|
||||
[3] These files would be in the `/usr/share/doc/weasel`
|
||||
subdirectory.
|
||||
|
||||
<hr style="width:10%;text-align:left;margin-left:0">
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ PROG= prog
|
||||
#
|
||||
OBJ= ${PROG}.o
|
||||
CSRC= ${PROG}.o
|
||||
DATA= FILES hint.css rpm.md test-strings.txt weasel.1 weasel.spec
|
||||
DATA= hint.css rpm.md test-strings.txt weasel.1 weasel.spec
|
||||
TARGET= ${PROG} weasel
|
||||
#
|
||||
ALT_OBJ= ${PROG}.alt
|
||||
@@ -149,7 +149,7 @@ ${PROG}: ${PROG}.c
|
||||
${CC} ${CFLAGS} $< -o $@ ${LDFLAGS}
|
||||
|
||||
weasel: ${PROG}
|
||||
${CP} -f $< $@
|
||||
${LN} -sf $< $@
|
||||
|
||||
test: ${PROG} test.sh
|
||||
@./test.sh
|
||||
|
||||
+178
-186
@@ -208,16 +208,14 @@ It is an implementation of Richard Dawkins' [Weasel program][] (Wikipedia).
|
||||
According to Wikipedia in chapter three of his book [The Blind Watchmaker][]
|
||||
Dawkins wrote:
|
||||
|
||||
```
|
||||
I don't know who it was first pointed out that, given enough time, a monkey
|
||||
bashing away at random on a typewriter could produce all the works of
|
||||
Shakespeare. The operative phrase is, of course, *given enough time.* Let us
|
||||
limit the task facing our monkey somewhat. Suppose that he has to produce, not
|
||||
the complete works of Shakespeare but just the short sentence 'Methinks it is
|
||||
like a weasel', and we shall make it relatively easy by giving him a typewriter
|
||||
with a restricted keyboard, one with just the 26 (capital) letters, and a space
|
||||
bar. How long will he take to write this one little sentence?
|
||||
```
|
||||
> I don't know who it was first pointed out that, given enough time, a monkey
|
||||
bashing away at random on a typewriter could produce all the works of
|
||||
Shakespeare. The operative phrase is, of course, *given enough time.* Let us
|
||||
limit the task facing our monkey somewhat. Suppose that he has to produce, not
|
||||
the complete works of Shakespeare but just the short sentence 'Methinks it is
|
||||
like a weasel', and we shall make it relatively easy by giving him a typewriter
|
||||
with a restricted keyboard, one with just the 26 (capital) letters, and a space
|
||||
bar. How long will he take to write this one little sentence?
|
||||
|
||||
He refers to the [Infinite Monkey Theorem][] (Wikipedia). As he points out the
|
||||
operative phrase is *given enough time*; but even if it's extremely unlikely
|
||||
@@ -250,18 +248,16 @@ Here you can find a general explanation of a *[genetic algorithm][]* as well as
|
||||
brief history. Although the link provides more information (including images to
|
||||
try and show the way they work) for those interested I will cite the summary:
|
||||
|
||||
```
|
||||
Genetic Algorithms (GAs) are adaptive heuristic search algorithm based on the
|
||||
evolutionary ideas of natural selection and genetics. As such they represent an
|
||||
intelligent exploitation of a random search used to solve optimization problems.
|
||||
Although randomised, GAs are by no means random, instead they exploit historical
|
||||
information to direct the search into the region of better performance within
|
||||
the search space. The basic techniques of the GAs are designed to simulate
|
||||
processes in natural systems necessary for evolution, specially those follow the
|
||||
principles first laid down by Charles Darwin of "survival of the fittest.".
|
||||
Since in nature, competition among individuals for scanty resources results in
|
||||
the fittest individuals dominating over the weaker ones.
|
||||
```
|
||||
> Genetic Algorithms (GAs) are adaptive heuristic search algorithm based on the
|
||||
evolutionary ideas of natural selection and genetics. As such they represent an
|
||||
intelligent exploitation of a random search used to solve optimization problems.
|
||||
Although randomised, GAs are by no means random, instead they exploit historical
|
||||
information to direct the search into the region of better performance within
|
||||
the search space. The basic techniques of the GAs are designed to simulate
|
||||
processes in natural systems necessary for evolution, specially those follow the
|
||||
principles first laid down by Charles Darwin of "survival of the fittest.".
|
||||
Since in nature, competition among individuals for scanty resources results in
|
||||
the fittest individuals dominating over the weaker ones.
|
||||
|
||||
**OBFUSCATION NOTE: Some of the below might help you follow the code more
|
||||
easily.**
|
||||
@@ -292,9 +288,8 @@ Note that the generation is checked *before the scoring takes place* by a prefix
|
||||
increment equality check; when the generation is `SIZE_MAX - 1` the fitness
|
||||
test loop will not be entered; instead the outer loop will end after printing:
|
||||
|
||||
```
|
||||
Too many attempts, blaming the monkey Eric even if he isn't typing or doesn't exist. Bye.
|
||||
```
|
||||
> Too many attempts, blaming the monkey Eric even if he isn't typing or doesn't
|
||||
exist. Bye.
|
||||
|
||||
Why '*Eric*'? Because the judges stated in the [2018 guidelines][] that when
|
||||
there is a user input error the program should insult the pet fish Eric even if
|
||||
@@ -304,22 +299,21 @@ final but this is relevant) they give is:
|
||||
|
||||
The judges might not have a pet fish named Eric, so might want to state:
|
||||
|
||||
```
|
||||
This entry factors integers between 1 and 2305567963945518424753102147331756070.
|
||||
Attempting to factor anything else will cause the program to insult your
|
||||
pet fish Eric, or in the case that you lack such a pet, will insult the
|
||||
pet that you do not have.
|
||||
```
|
||||
> This entry factors integers between 1 and
|
||||
2305567963945518424753102147331756070\. Attempting to factor anything else will
|
||||
cause the program to insult your pet fish Eric, or in the case that you lack
|
||||
such a pet, will insult the pet that you do not have.
|
||||
|
||||
After the final message they ask:
|
||||
|
||||
BTW: **What is so special about 2305567963945518424753102147331756070**? You tell us!
|
||||
> BTW: **What is so special about 2305567963945518424753102147331756070**? You
|
||||
tell us!
|
||||
|
||||
The answer is this: **it is the primorial prime of 97:** the product of all
|
||||
prime numbers less than or equal to N; **and the primorial prime of `N == 97` is
|
||||
`2305567963945518424753102147331756070`. There is no reference to this number
|
||||
in my entry but it's nonetheless possible to **change the default target to it
|
||||
without modifying the source code**; there are two hints in this very
|
||||
`2305567963945518424753102147331756070`.** But there is no reference to this number
|
||||
in my entry but it's nonetheless possible to change the default target to it
|
||||
**without modifying the source code**; there are two hints in this very
|
||||
paragraph; the first sentence in fact: the answer to the judges' question and
|
||||
the definition. Can you get the program to search the primorial prime of 97
|
||||
without passing in specially?
|
||||
@@ -328,6 +322,7 @@ 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.
|
||||
|
||||
|
||||
### On <del>user</del> monkey errors
|
||||
|
||||
If the generation reaches `SIZE_MAX - 1` I consider it a monkey (or if you
|
||||
@@ -349,7 +344,7 @@ assumption that **the user could in fact be a monkey called Eric** *although it
|
||||
isn't insolent enough to say the user is a monkey for certain!*
|
||||
|
||||
[genetic algorithm]: https://web.archive.org/web/20180308131613/http://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol1/hmw/article1.html
|
||||
[2018 guidelines]: ../../2018/guidelines.txt
|
||||
[2018 guidelines]: ../guidelines.txt
|
||||
|
||||
|
||||
<div id="hints">
|
||||
@@ -372,11 +367,15 @@ precise the following characters are acceptable; it equates to this in C (note
|
||||
it includes a literal space `' '` but it doesn't include other
|
||||
`isspace()` characters) and this is why some of the characters are escaped:
|
||||
|
||||
const char keyboard[]=" !\"#$<%:>&'()*+,-./0123456789;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`{|}~";
|
||||
``` <!---c-->
|
||||
const char keyboard[]=" !\"#$<%:>&'()*+,-./0123456789;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`{|}~";
|
||||
```
|
||||
|
||||
The simpler keyboard looks like:
|
||||
|
||||
const char keyboard[]=" !\"&'(),.0123456789;?ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
``` <!---c-->
|
||||
const char keyboard[]=" !\"&'(),.0123456789;?ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
```
|
||||
|
||||
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
|
||||
@@ -394,7 +393,7 @@ 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).
|
||||
|
||||
**Enable quiet output:**
|
||||
#### Enable quiet output:
|
||||
|
||||
```
|
||||
-q
|
||||
@@ -404,7 +403,7 @@ 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
|
||||
output) and the final answer.
|
||||
|
||||
**Change the mutation rate to `<rate>`:**
|
||||
#### Change the mutation rate to `<rate>`:
|
||||
|
||||
```
|
||||
-r<num>
|
||||
@@ -502,9 +501,9 @@ The target string will be: `-TEST`. This means though that here:
|
||||
./weasel -q -- -test -r5
|
||||
```
|
||||
|
||||
The string to be searched would actually be `-r5` and the mutation rate
|
||||
will remain the default because after the `-` option is seen it will no
|
||||
longer parse additional options: only target strings if anything left on the
|
||||
The string to be searched would actually be `-r5` and the mutation rate will
|
||||
remain the default because after the `-` option (that is `--`) is seen it will
|
||||
no longer parse additional options: only target strings if anything left on the
|
||||
command line. Because of the joining of arguments this means that the first two
|
||||
examples of the last set of three above are equivalent i.e. the following two
|
||||
are equivalent:
|
||||
@@ -558,6 +557,7 @@ it no longer cares about the `-` for option parsing. In other words options
|
||||
are only parsed if the first character is `-` and if the parser hasn't seen
|
||||
the `-` - *in an earlier element of `argv`. This is not a bug!*
|
||||
|
||||
|
||||
<div id="obfuscation">
|
||||
### Obfuscation
|
||||
</div>
|
||||
@@ -608,12 +608,10 @@ So in this case I joined the options in the following order:
|
||||
|
||||
Quiet output.
|
||||
|
||||
|
||||
2. `-r101`
|
||||
|
||||
Mutation rate 101 (out of range).
|
||||
|
||||
|
||||
3. `-r5`
|
||||
|
||||
Mutation rate of 5 but note that during parsing I only print invalid mutation
|
||||
@@ -622,7 +620,6 @@ being); so while it appears there is a bug, showing mutation rate out of range
|
||||
three times, this is expected (given the next one, `-r101`). This means here
|
||||
the typewriter was taken from Eric the monkey.
|
||||
|
||||
|
||||
4. `-r101`
|
||||
|
||||
Mutation rate to 101: this too is out of range (this is the second mutation rate
|
||||
@@ -634,7 +631,6 @@ out of range message). The typewriter returns to Eric.
|
||||
|
||||
Set mutation rate to 1. Take that typewriter away!
|
||||
|
||||
|
||||
6. `-r`
|
||||
|
||||
Set mutation rate to 0; when there are no valid characters passed to
|
||||
@@ -645,15 +641,14 @@ mutation rate; if there are any systems where the widths differ this *shouldn't
|
||||
matter* because of truncation but I do in any case specifically check for `R <
|
||||
0 || R > 100`. Either way the invalid range returns the typewriter to Eric.
|
||||
|
||||
|
||||
7. `test`
|
||||
|
||||
Finally I requested it find the string `test` (will search for `TEST`).
|
||||
|
||||
Given that it was a short string it did find the answer relatively quickly, even
|
||||
in monkey mode.
|
||||
Given that it was a short string it did find the answer relatively quickly,
|
||||
even in monkey mode.
|
||||
|
||||
Another example:
|
||||
Another example:
|
||||
|
||||
``` <!---sh-->
|
||||
$ ./weasel -q -r101 test -r5
|
||||
@@ -664,12 +659,12 @@ Another example:
|
||||
Generation 109 Offspring 13: TEST
|
||||
```
|
||||
|
||||
In this case I also enabled quiet mode but I didn't join the options; the
|
||||
`-r101` reports that it's out of range and sets monkey mode. I then specify
|
||||
the target string and then set a valid mutation rate. This disabled monkey mode
|
||||
which means that it'll use the genetic algorithm.
|
||||
In this case I also enabled quiet mode but I didn't join the options; the
|
||||
`-r101` reports that it's out of range and sets monkey mode. I then specify
|
||||
the target string and then set a valid mutation rate. This disabled monkey
|
||||
mode which means that it'll use the genetic algorithm.
|
||||
|
||||
One more example of monkey mode:
|
||||
One more example of monkey mode:
|
||||
|
||||
``` <!---sh-->
|
||||
$ ./weasel -q -mr101 test -r5
|
||||
@@ -681,18 +676,19 @@ One more example of monkey mode:
|
||||
Generation 465298 Offspring 10: TEST
|
||||
```
|
||||
|
||||
Here I also requested quiet output and then *explicitly requested that Eric the
|
||||
monkey types.* After this I set the mutation rate to be 101 which would have
|
||||
set monkey mode (*in this case only temporarily as I later set it to a valid
|
||||
number*) but since I have also requested monkey mode that won't matter. Then I
|
||||
set the string to `test` and then set a valid mutation rate of 5. Now note
|
||||
that it is actually set to 5 but also note that monkey mode remains active: it
|
||||
also took a lot longer to come to a conclusion for even four characters. This
|
||||
example does demonstrate one other thing in a subtle way though.
|
||||
Here I also requested quiet output and then *explicitly requested that Eric
|
||||
the monkey types.* After this I set the mutation rate to be 101 which would
|
||||
have set monkey mode (*in this case only temporarily as I later set it to a
|
||||
valid number*) but since I have also requested monkey mode that won't
|
||||
matter. Then I set the string to `test` and then set a valid mutation rate
|
||||
of 5. Now note that it is actually set to 5 but also note that monkey mode
|
||||
remains active: it also took a lot longer to come to a conclusion for even
|
||||
four characters. This example does demonstrate one other thing in a subtle
|
||||
way though.
|
||||
|
||||
When the program prints out each iteration (I'll give an example next) it goes a
|
||||
lot slower; this makes sense because it's an expensive operation. Here are the
|
||||
times for the same but without quiet output enabled:
|
||||
When the program prints out each iteration (I'll give an example next) it
|
||||
goes a lot slower; this makes sense because printing is an expensive
|
||||
operation. Here are the times for the same but without quiet output enabled:
|
||||
|
||||
```
|
||||
real 0m17.065s
|
||||
@@ -700,7 +696,7 @@ times for the same but without quiet output enabled:
|
||||
sys 0m2.402s
|
||||
```
|
||||
|
||||
Whereas with quiet output:
|
||||
.. whereas with quiet output:
|
||||
|
||||
```
|
||||
real 0m0.127s
|
||||
@@ -708,12 +704,12 @@ Whereas with quiet output:
|
||||
sys 0m0.001s
|
||||
```
|
||||
|
||||
Of course it isn't only down to the printing but the point is it slows it down
|
||||
significantly. Adding an option to print every X lines would go over the limit
|
||||
(`iocccsize -i` reports 2052!).
|
||||
Of course it isn't only down to the printing but the point is it slows it
|
||||
down significantly. Adding an option to print every X lines would go over
|
||||
the limit (`iocccsize -i` reports 2052!).
|
||||
|
||||
Finally I'll show a default example in normal output (I omit many lines showing
|
||||
instead **[...]**). Note that the real/user/sys times are from the `time`
|
||||
8. Finally I'll show a default example in normal output (I omit many lines showing
|
||||
instead `[...]`). Note that the real/user/sys times are from the `time`
|
||||
bash shell built-in utility: that isn't output from my entry.
|
||||
|
||||
```
|
||||
@@ -740,13 +736,14 @@ bash shell built-in utility: that isn't output from my entry.
|
||||
sys 0m0.001s
|
||||
```
|
||||
|
||||
|
||||
Keep in mind the way I display the generations and the fact that generation 0
|
||||
has no parents; it is generation 1 that starts working towards the goal. You'll
|
||||
see also **(mutation)** at the end of the line at this point (if you enable
|
||||
monkey mode you'll find that it shows something else). The lines that only have
|
||||
back-quote ("\`") are separators: you won't see this between generation 0 and 1 but you will
|
||||
between future generations - as well as the final answer (if the answer is in
|
||||
generation 0 you won't see the ``).
|
||||
see also `(mutation)` at the end of the line at this point (if you enable monkey
|
||||
mode you'll find that it shows something else). The lines that only have
|
||||
back-quote (`` "\`" ``) are separators: you won't see this between generation 0
|
||||
and 1 but you will between future generations - as well as the final answer (if
|
||||
the answer is in generation 0 you won't see the `` ` ``).
|
||||
|
||||
<div id="test">
|
||||
One final thing to consider is that **the program doesn't directly read from a
|
||||
@@ -934,23 +931,22 @@ Skip to [How to build](#build).
|
||||
|
||||
On the subject of beauty: the judges stated in the guidelines the following:
|
||||
|
||||
```
|
||||
We want to get away from source that is simply **a compact blob of
|
||||
octets.** Really try to be more creative than **blob coding.** *HINT!*
|
||||
```
|
||||
> We want to get away from source that is simply **a compact blob of octets.**
|
||||
Really try to be more creative than **blob coding.** *HINT!*
|
||||
|
||||
And if you'll notice that although it *might look like a compact blob of octets*
|
||||
at first glance if you look throughout the file you'll see two statements to
|
||||
set your thinking straight:
|
||||
(although not really: a blob is by definition roundish) at first glance if you
|
||||
look throughout the file you'll see two statements to set your thinking
|
||||
straight:
|
||||
|
||||
**NO BLOB CODING**
|
||||
|
||||
**THIS IS NOT A COMPACT BLOB OF OCTETS**
|
||||
> **NO BLOB CODING**
|
||||
>
|
||||
> **THIS IS NOT A COMPACT BLOB OF OCTETS**
|
||||
|
||||
So you see even if your eyes are trying to deceive you they're quite wrong. Yes
|
||||
some of it might look like a blob but this is clearly false; *as all good
|
||||
programmers know if something is potentially confusing or misleading it should
|
||||
be made clear in the comments! :)*
|
||||
some of it might look like a blob (for certain definitions of 'blob' :) ) but
|
||||
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**
|
||||
@@ -1157,7 +1153,8 @@ 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.
|
||||
this) if for some (strange or maybe even mad) reason you're interested, which
|
||||
basically means nobody but me.
|
||||
|
||||
[rpm.html]: rpm.html
|
||||
|
||||
@@ -1180,50 +1177,48 @@ two things I think are rather amusing (in order of least to most):
|
||||
Dennis Ritchie's Anti-Foreword:
|
||||
</div>
|
||||
|
||||
```
|
||||
Anti-Foreword
|
||||
|
||||
By Dennis Ritchie
|
||||
From: dmr@plan9.research.att.com
|
||||
Date: Tue, 15 Mar 1994 00:38:07 EST
|
||||
Subject: anti-foreword
|
||||
|
||||
To the contributers to this book:
|
||||
|
||||
I have succumbed to the temptation you offered in your preface: I do write you
|
||||
off as envious malcontents and romantic keepers of memories. The systems you
|
||||
remember so fondly (TOPS-20, ITS, Multics, Lisp Machine, Cedar/Mesa, the Dorado)
|
||||
are not just out to pasture, they are fertilizing it from below.
|
||||
|
||||
Your judgments are not keen, they are intoxicated by metaphor. In the Preface
|
||||
you suffer first from heat, lice, and malnourishment, then become prisoners in
|
||||
a Gulag. In Chapter 1 you are in turn infected by a virus, racked by drug
|
||||
addiction, and addled by puffiness of the genome.
|
||||
|
||||
Yet your prison without coherent design continues to imprison you. How can
|
||||
this be, if it has no strong places? The rational prisoner exploits the weak
|
||||
places, creates order from chaos: instead, collectives like the FSF vindicate
|
||||
their jailers by building cells almost compatible with the existing ones, albeit
|
||||
with more features. The journalist with three undergraduate degrees from MIT,
|
||||
the researcher at Microsoft, and the senior scientist at Apple might volunteer a
|
||||
few words about the regulations of the prisons to which they have been
|
||||
transferred.
|
||||
|
||||
Your sense of the possible is in no sense pure: sometimes you want the same
|
||||
thing you have, but wish you had done it yourselves; other times you want
|
||||
something different, but can't seem to get people to use it; sometimes one
|
||||
wonders why you just don't shut up and tell people to buy a PC with Windows or a
|
||||
Mac. No Gulag or lice, just a future whose intellectual tone and interaction
|
||||
style is set by Sonic the Hedgehog. You claim to seek progress, but you succeed
|
||||
mainly in whining.
|
||||
|
||||
Here is my metaphor: your book is a pudding stuffed with apposite
|
||||
observations, many well-conceived. Like excrement, it contains enough undigested
|
||||
nuggets of nutrition to sustain life for some. But it is not a tasty pie: it
|
||||
reeks too much of contempt and of envy.
|
||||
|
||||
Bon appetit!
|
||||
```
|
||||
> Anti-Foreword
|
||||
>
|
||||
> By Dennis Ritchie
|
||||
> From: dmr@plan9.research.att.com
|
||||
> Date: Tue, 15 Mar 1994 00:38:07 EST
|
||||
> Subject: anti-foreword
|
||||
>
|
||||
> To the contributers to this book:
|
||||
>
|
||||
> I have succumbed to the temptation you offered in your preface: I do write you
|
||||
> off as envious malcontents and romantic keepers of memories. The systems you
|
||||
> remember so fondly (TOPS-20, ITS, Multics, Lisp Machine, Cedar/Mesa, the Dorado)
|
||||
> are not just out to pasture, they are fertilizing it from below.
|
||||
>
|
||||
> Your judgments are not keen, they are intoxicated by metaphor. In the Preface
|
||||
> you suffer first from heat, lice, and malnourishment, then become prisoners in
|
||||
> a Gulag. In Chapter 1 you are in turn infected by a virus, racked by drug
|
||||
> addiction, and addled by puffiness of the genome.
|
||||
>
|
||||
> Yet your prison without coherent design continues to imprison you. How can
|
||||
> this be, if it has no strong places? The rational prisoner exploits the weak
|
||||
> places, creates order from chaos: instead, collectives like the FSF vindicate
|
||||
> their jailers by building cells almost compatible with the existing ones, albeit
|
||||
> with more features. The journalist with three undergraduate degrees from MIT,
|
||||
> the researcher at Microsoft, and the senior scientist at Apple might volunteer a
|
||||
> few words about the regulations of the prisons to which they have been
|
||||
> transferred.
|
||||
>
|
||||
> Your sense of the possible is in no sense pure: sometimes you want the same
|
||||
> thing you have, but wish you had done it yourselves; other times you want
|
||||
> something different, but can't seem to get people to use it; sometimes one
|
||||
> wonders why you just don't shut up and tell people to buy a PC with Windows or a
|
||||
> Mac. No Gulag or lice, just a future whose intellectual tone and interaction
|
||||
> style is set by Sonic the Hedgehog. You claim to seek progress, but you succeed
|
||||
> mainly in whining.
|
||||
>
|
||||
> Here is my metaphor: your book is a pudding stuffed with apposite
|
||||
> observations, many well-conceived. Like excrement, it contains enough undigested
|
||||
> nuggets of nutrition to sustain life for some. But it is not a tasty pie: it
|
||||
> reeks too much of contempt and of envy.
|
||||
>
|
||||
> Bon appetit!
|
||||
|
||||
Yes he misspelt *'contributors'*! But then again we're talking about obfuscation
|
||||
and since it doesn't break his message it's not broken - it's just obfuscated
|
||||
@@ -1234,56 +1229,51 @@ contest is about? :)
|
||||
Ken Thompson's ending:
|
||||
</div>
|
||||
|
||||
```
|
||||
Creators Admit C, Unix Were Hoax
|
||||
|
||||
FOR IMMEDIATE RELEASE
|
||||
|
||||
In an announcement that has stunned the computer industry, Ken Thompson,
|
||||
Dennis Ritchie, and Brian Kernighan admitted that the Unix operating system and
|
||||
C programming language created by them is an elaborate April Fools prank kept
|
||||
alive for more than 20 years. Speaking at the recent UnixWorld Software
|
||||
Development Forum, Thompson revealed the following:
|
||||
|
||||
"In 1969, AT&T had just terminated their work with the GE/AT&T Multics
|
||||
project. Brian and I had just started working with an early release of Pascal
|
||||
from Professor Nichlaus Wirth's ETH labs in Switzerland, and we were impressed
|
||||
with its elegant simplicity and power. Dennis had just finished reading Bored of
|
||||
the Rings, a hilarious National Lampoon parody of the great Tolkien Lord of the
|
||||
Rings trilogy. As a lark, we decided to do parodies of the Multics environment
|
||||
and Pascal. Dennis and I were responsible for the operating environment. We
|
||||
looked at Multics and designed the new system to be as complex and cryptic as
|
||||
possible to maximize casual users' frustration levels, calling it Unix as a
|
||||
parody of Multics, as well as other more risque allusions.
|
||||
|
||||
"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:
|
||||
```
|
||||
|
||||
``` <!---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
|
||||
years. Imagine our surprise when AT&T and other U.S. corporations actually began
|
||||
trying to use Unix and C! It has taken them 20 years to develop enough
|
||||
expertise to generate even marginally useful applications using this 1960s
|
||||
technological parody, but we are impressed with the tenacity (if not common
|
||||
sense) of the general Unix and C programmer.
|
||||
|
||||
"In any event, Brian, Dennis, and I have been working exclusively in Lisp on
|
||||
the Apple Macintosh for the past few years and feel really guilty about the
|
||||
chaos, confusion, and truly bad programming that has resulted from our silly
|
||||
prank so long ago."
|
||||
```
|
||||
|
||||
Major Unix and C vendors and customers, including AT&T, Microsoft,
|
||||
> Creators Admit C, Unix Were Hoax
|
||||
>
|
||||
> FOR IMMEDIATE RELEASE
|
||||
>
|
||||
> In an announcement that has stunned the computer industry, Ken Thompson,
|
||||
Dennis Ritchie, and Brian Kernighan admitted that the Unix operating system and
|
||||
C programming language created by them is an elaborate April Fools prank kept
|
||||
alive for more than 20 years. Speaking at the recent UnixWorld Software
|
||||
Development Forum, Thompson revealed the following:
|
||||
>
|
||||
> "In 1969, AT&T had just terminated their work with the GE/AT&T Multics
|
||||
project. Brian and I had just started working with an early release of Pascal
|
||||
from Professor Nichlaus Wirth's ETH labs in Switzerland, and we were impressed
|
||||
with its elegant simplicity and power. Dennis had just finished reading Bored of
|
||||
the Rings, a hilarious National Lampoon parody of the great Tolkien Lord of the
|
||||
Rings trilogy. As a lark, we decided to do parodies of the Multics environment
|
||||
and Pascal. Dennis and I were responsible for the operating environment. We
|
||||
looked at Multics and designed the new system to be as complex and cryptic as
|
||||
possible to maximize casual users' frustration levels, calling it Unix as a
|
||||
parody of Multics, as well as other more risque allusions.
|
||||
>
|
||||
> "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:
|
||||
>
|
||||
> `for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/`<br>
|
||||
> `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
|
||||
years. Imagine our surprise when AT&T and other U.S. corporations actually began
|
||||
trying to use Unix and C! It has taken them 20 years to develop enough
|
||||
expertise to generate even marginally useful applications using this 1960s
|
||||
technological parody, but we are impressed with the tenacity (if not common
|
||||
sense) of the general Unix and C programmer.
|
||||
>
|
||||
> "In any event, Brian, Dennis, and I have been working exclusively in Lisp
|
||||
on the Apple Macintosh for the past few years and feel really guilty about the
|
||||
chaos, confusion, and truly bad programming that has resulted from our silly
|
||||
prank so long ago."
|
||||
>
|
||||
> Major Unix and C vendors and customers, including AT&T, Microsoft,
|
||||
Hewlett-Packard, GTE, NCR, and DEC have refused comment at this time. Borland
|
||||
International, a leading vendor of Pascal and C tools, including the popular
|
||||
Turbo Pascal, Turbo C, and Turbo C++, stated they had suspected this for a
|
||||
@@ -1295,13 +1285,15 @@ cryptic statement, Professor Wirth of the ETH Institute and father of the
|
||||
Pascal, Modula 2, and Oberon structured languages, merely stated that P. T.
|
||||
Barnum was correct.
|
||||
|
||||
<hr>
|
||||
|
||||
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
|
||||
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
|
||||
matter do send me an email - I love Tolkien's legendarium and having another
|
||||
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
|
||||
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
|
||||
|
||||
+165
-153
@@ -547,14 +547,16 @@ dedicated to this entry beyond what will be published on the IOCCC website.</p>
|
||||
<p>It is an implementation of Richard Dawkins’ <a href="https://en.wikipedia.org/wiki/Weasel_program">Weasel program</a> (Wikipedia).
|
||||
According to Wikipedia in chapter three of his book <a href="https://en.wikipedia.org/wiki/The_Blind_Watchmaker">The Blind Watchmaker</a>
|
||||
Dawkins wrote:</p>
|
||||
<pre><code> I don't know who it was first pointed out that, given enough time, a monkey
|
||||
bashing away at random on a typewriter could produce all the works of
|
||||
Shakespeare. The operative phrase is, of course, *given enough time.* Let us
|
||||
limit the task facing our monkey somewhat. Suppose that he has to produce, not
|
||||
the complete works of Shakespeare but just the short sentence 'Methinks it is
|
||||
like a weasel', and we shall make it relatively easy by giving him a typewriter
|
||||
with a restricted keyboard, one with just the 26 (capital) letters, and a space
|
||||
bar. How long will he take to write this one little sentence?</code></pre>
|
||||
<blockquote>
|
||||
<p>I don’t know who it was first pointed out that, given enough time, a monkey
|
||||
bashing away at random on a typewriter could produce all the works of
|
||||
Shakespeare. The operative phrase is, of course, <em>given enough time.</em> Let us
|
||||
limit the task facing our monkey somewhat. Suppose that he has to produce, not
|
||||
the complete works of Shakespeare but just the short sentence ‘Methinks it is
|
||||
like a weasel’, and we shall make it relatively easy by giving him a typewriter
|
||||
with a restricted keyboard, one with just the 26 (capital) letters, and a space
|
||||
bar. How long will he take to write this one little sentence?</p>
|
||||
</blockquote>
|
||||
<p>He refers to the <a href="https://en.wikipedia.org/wiki/Infinite_monkey_theorem">Infinite Monkey Theorem</a> (Wikipedia). As he points out the
|
||||
operative phrase is <em>given enough time</em>; but even if it’s extremely unlikely
|
||||
<em>technically the probability is greater than 0</em>. He simplified it for the
|
||||
@@ -577,16 +579,18 @@ comparison and output will always be capitalised).</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
|
||||
brief history. Although the link provides more information (including images to
|
||||
try and show the way they work) for those interested I will cite the summary:</p>
|
||||
<pre><code> Genetic Algorithms (GAs) are adaptive heuristic search algorithm based on the
|
||||
evolutionary ideas of natural selection and genetics. As such they represent an
|
||||
intelligent exploitation of a random search used to solve optimization problems.
|
||||
Although randomised, GAs are by no means random, instead they exploit historical
|
||||
information to direct the search into the region of better performance within
|
||||
the search space. The basic techniques of the GAs are designed to simulate
|
||||
processes in natural systems necessary for evolution, specially those follow the
|
||||
principles first laid down by Charles Darwin of "survival of the fittest.".
|
||||
Since in nature, competition among individuals for scanty resources results in
|
||||
the fittest individuals dominating over the weaker ones.</code></pre>
|
||||
<blockquote>
|
||||
<p>Genetic Algorithms (GAs) are adaptive heuristic search algorithm based on the
|
||||
evolutionary ideas of natural selection and genetics. As such they represent an
|
||||
intelligent exploitation of a random search used to solve optimization problems.
|
||||
Although randomised, GAs are by no means random, instead they exploit historical
|
||||
information to direct the search into the region of better performance within
|
||||
the search space. The basic techniques of the GAs are designed to simulate
|
||||
processes in natural systems necessary for evolution, specially those follow the
|
||||
principles first laid down by Charles Darwin of “survival of the fittest.”.
|
||||
Since in nature, competition among individuals for scanty resources results in
|
||||
the fittest individuals dominating over the weaker ones.</p>
|
||||
</blockquote>
|
||||
<p><strong>OBFUSCATION NOTE: Some of the below might help you follow the code more
|
||||
easily.</strong></p>
|
||||
<p>For each <em>generation</em> there is a total of <code>N</code> <em>offspring</em>; generation 0 is
|
||||
@@ -612,24 +616,32 @@ found.</p>
|
||||
<p>Note that the generation is checked <em>before the scoring takes place</em> by a prefix
|
||||
increment equality check; when the generation is <code>SIZE_MAX - 1</code> the fitness
|
||||
test loop will not be entered; instead the outer loop will end after printing:</p>
|
||||
<pre><code> Too many attempts, blaming the monkey Eric even if he isn't typing or doesn't exist. Bye.</code></pre>
|
||||
<p>Why ‘<em>Eric</em>’? Because the judges stated in the <a href="../../2018/guidelines.txt">2018 guidelines</a> that when
|
||||
<blockquote>
|
||||
<p>Too many attempts, blaming the monkey Eric even if he isn’t typing or doesn’t
|
||||
exist. Bye.</p>
|
||||
</blockquote>
|
||||
<p>Why ‘<em>Eric</em>’? Because the judges stated in the <a href="../guidelines.txt">2018 guidelines</a> that when
|
||||
there is a user input error the program should insult the pet fish Eric even if
|
||||
such a fish (no, weasels do not equate monkeys to fish but see below) doesn’t
|
||||
exist. The second to last example limitation example note (it’s improved in the
|
||||
final but this is relevant) they give is:</p>
|
||||
<p>The judges might not have a pet fish named Eric, so might want to state:</p>
|
||||
<pre><code> This entry factors integers between 1 and 2305567963945518424753102147331756070.
|
||||
Attempting to factor anything else will cause the program to insult your
|
||||
pet fish Eric, or in the case that you lack such a pet, will insult the
|
||||
pet that you do not have.</code></pre>
|
||||
<blockquote>
|
||||
<p>This entry factors integers between 1 and
|
||||
2305567963945518424753102147331756070. Attempting to factor anything else will
|
||||
cause the program to insult your pet fish Eric, or in the case that you lack
|
||||
such a pet, will insult the pet that you do not have.</p>
|
||||
</blockquote>
|
||||
<p>After the final message they ask:</p>
|
||||
<p>BTW: <strong>What is so special about 2305567963945518424753102147331756070</strong>? You tell us!</p>
|
||||
<blockquote>
|
||||
<p>BTW: <strong>What is so special about 2305567963945518424753102147331756070</strong>? You
|
||||
tell us!</p>
|
||||
</blockquote>
|
||||
<p>The answer is this: <strong>it is the primorial prime of 97:</strong> the product of all
|
||||
prime numbers less than or equal to N; <strong>and the primorial prime of <code>N == 97</code> is
|
||||
<code>2305567963945518424753102147331756070</code>. There is no reference to this number
|
||||
in my entry but it’s nonetheless possible to </strong>change the default target to it
|
||||
without modifying the source code**; there are two hints in this very
|
||||
<code>2305567963945518424753102147331756070</code>.</strong> But there is no reference to this number
|
||||
in my entry but it’s nonetheless possible to change the default target to it
|
||||
<strong>without modifying the source code</strong>; there are two hints in this very
|
||||
paragraph; the first sentence in fact: the answer to the judges’ question and
|
||||
the definition. Can you get the program to search the primorial prime of 97
|
||||
without passing in specially?</p>
|
||||
@@ -676,12 +688,12 @@ can actually produce but there is a certain type of input error that might
|
||||
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>
|
||||
<p><strong>Enable quiet output:</strong></p>
|
||||
<h4 id="enable-quiet-output">Enable quiet output:</h4>
|
||||
<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
|
||||
output) and the final answer.</p>
|
||||
<p><strong>Change the mutation rate to <code><rate></code>:</strong></p>
|
||||
<h4 id="change-the-mutation-rate-to-rate">Change the mutation rate to <code><rate></code>:</h4>
|
||||
<pre><code> -r<num></code></pre>
|
||||
<p>Please note that there cannot be a space between the <code>-r</code> and the number.
|
||||
This is to simplify the parsing of options. As for combining options you can do
|
||||
@@ -743,9 +755,9 @@ example if you were to do any of:</p>
|
||||
./weasel -q -- -test</code></pre>
|
||||
<p>The target string will be: <code>-TEST</code>. This means though that here:</p>
|
||||
<pre><code> ./weasel -q -- -test -r5</code></pre>
|
||||
<p>The string to be searched would actually be <code>-r5</code> and the mutation rate
|
||||
will remain the default because after the <code>-</code> option is seen it will no
|
||||
longer parse additional options: only target strings if anything left on the
|
||||
<p>The string to be searched would actually be <code>-r5</code> and the mutation rate will
|
||||
remain the default because after the <code>-</code> option (that is <code>--</code>) is seen it will
|
||||
no longer parse additional options: only target strings if anything left on the
|
||||
command line. Because of the joining of arguments this means that the first two
|
||||
examples of the last set of three above are equivalent i.e. the following two
|
||||
are equivalent:</p>
|
||||
@@ -834,11 +846,11 @@ returns a <code>long</code> but I compare the return value of <code>rand()</code
|
||||
mutation rate; if there are any systems where the widths differ this <em>shouldn’t
|
||||
matter</em> because of truncation but I do in any case specifically check for <code>R < 0 || R > 100</code>. Either way the invalid range returns the typewriter to Eric.</p></li>
|
||||
<li><p><code>test</code></p>
|
||||
<p>Finally I requested it find the string <code>test</code> (will search for <code>TEST</code>).</p></li>
|
||||
<p>Finally I requested it find the string <code>test</code> (will search for <code>TEST</code>).</p>
|
||||
<p>Given that it was a short string it did find the answer relatively quickly,
|
||||
even in monkey mode.</p>
|
||||
<p>Another example:</p></li>
|
||||
</ol>
|
||||
<p>Given that it was a short string it did find the answer relatively quickly, even
|
||||
in monkey mode.</p>
|
||||
<p>Another example:</p>
|
||||
<pre><code> $ ./weasel -q -r101 test -r5
|
||||
quiet output
|
||||
mutation rate out of range
|
||||
@@ -847,8 +859,8 @@ in monkey mode.</p>
|
||||
Generation 109 Offspring 13: TEST</code></pre>
|
||||
<p>In this case I also enabled quiet mode but I didn’t join the options; the
|
||||
<code>-r101</code> reports that it’s out of range and sets monkey mode. I then specify
|
||||
the target string and then set a valid mutation rate. This disabled monkey mode
|
||||
which means that it’ll use the genetic algorithm.</p>
|
||||
the target string and then set a valid mutation rate. This disabled monkey
|
||||
mode which means that it’ll use the genetic algorithm.</p>
|
||||
<p>One more example of monkey mode:</p>
|
||||
<pre><code> $ ./weasel -q -mr101 test -r5
|
||||
quiet output
|
||||
@@ -857,30 +869,33 @@ which means that it’ll use the genetic algorithm.</p>
|
||||
mutation rate 5
|
||||
monkey at typewriter
|
||||
Generation 465298 Offspring 10: TEST</code></pre>
|
||||
<p>Here I also requested quiet output and then <em>explicitly requested that Eric the
|
||||
monkey types.</em> After this I set the mutation rate to be 101 which would have
|
||||
set monkey mode (<em>in this case only temporarily as I later set it to a valid
|
||||
number</em>) but since I have also requested monkey mode that won’t matter. Then I
|
||||
set the string to <code>test</code> and then set a valid mutation rate of 5. Now note
|
||||
that it is actually set to 5 but also note that monkey mode remains active: it
|
||||
also took a lot longer to come to a conclusion for even four characters. This
|
||||
example does demonstrate one other thing in a subtle way though.</p>
|
||||
<p>When the program prints out each iteration (I’ll give an example next) it goes a
|
||||
lot slower; this makes sense because it’s an expensive operation. Here are the
|
||||
times for the same but without quiet output enabled:</p>
|
||||
<p>Here I also requested quiet output and then <em>explicitly requested that Eric
|
||||
the monkey types.</em> After this I set the mutation rate to be 101 which would
|
||||
have set monkey mode (<em>in this case only temporarily as I later set it to a
|
||||
valid number</em>) but since I have also requested monkey mode that won’t
|
||||
matter. Then I set the string to <code>test</code> and then set a valid mutation rate
|
||||
of 5. Now note that it is actually set to 5 but also note that monkey mode
|
||||
remains active: it also took a lot longer to come to a conclusion for even
|
||||
four characters. This example does demonstrate one other thing in a subtle
|
||||
way though.</p>
|
||||
<p>When the program prints out each iteration (I’ll give an example next) it
|
||||
goes a lot slower; this makes sense because printing is an expensive
|
||||
operation. Here are the times for the same but without quiet output enabled:</p>
|
||||
<pre><code> real 0m17.065s
|
||||
user 0m1.245s
|
||||
sys 0m2.402s</code></pre>
|
||||
<p>Whereas with quiet output:</p>
|
||||
<p>.. whereas with quiet output:</p>
|
||||
<pre><code> real 0m0.127s
|
||||
user 0m0.125s
|
||||
sys 0m0.001s</code></pre>
|
||||
<p>Of course it isn’t only down to the printing but the point is it slows it down
|
||||
significantly. Adding an option to print every X lines would go over the limit
|
||||
(<code>iocccsize -i</code> reports 2052!).</p>
|
||||
<p>Finally I’ll show a default example in normal output (I omit many lines showing
|
||||
instead <strong>[…]</strong>). Note that the real/user/sys times are from the <code>time</code>
|
||||
bash shell built-in utility: that isn’t output from my entry.</p>
|
||||
<p>Of course it isn’t only down to the printing but the point is it slows it
|
||||
down significantly. Adding an option to print every X lines would go over
|
||||
the limit (<code>iocccsize -i</code> reports 2052!).</p>
|
||||
<ol start="8" type="1">
|
||||
<li>Finally I’ll show a default example in normal output (I omit many lines showing
|
||||
instead <code>[...]</code>). Note that the real/user/sys times are from the <code>time</code>
|
||||
bash shell built-in utility: that isn’t output from my entry.</li>
|
||||
</ol>
|
||||
<pre><code> target 'METHINKS IT IS LIKE A WEASEL'
|
||||
mutation rate 1
|
||||
Generation 0 Offspring 1: 4V YGY.GH/}_|>Q1M.R8;KD[=(05
|
||||
@@ -904,11 +919,11 @@ bash shell built-in utility: that isn’t output from my entry.</p>
|
||||
sys 0m0.001s</code></pre>
|
||||
<p>Keep in mind the way I display the generations and the fact that generation 0
|
||||
has no parents; it is generation 1 that starts working towards the goal. You’ll
|
||||
see also <strong>(mutation)</strong> at the end of the line at this point (if you enable
|
||||
monkey mode you’ll find that it shows something else). The lines that only have
|
||||
back-quote (“`”) are separators: you won’t see this between generation 0 and 1 but you will
|
||||
between future generations - as well as the final answer (if the answer is in
|
||||
generation 0 you won’t see the ``).</p>
|
||||
see also <code>(mutation)</code> at the end of the line at this point (if you enable monkey
|
||||
mode you’ll find that it shows something else). The lines that only have
|
||||
back-quote (<code>"\`"</code>) are separators: you won’t see this between generation 0
|
||||
and 1 but you will between future generations - as well as the final answer (if
|
||||
the answer is in generation 0 you won’t see the <code>`</code>).</p>
|
||||
<div id="test">
|
||||
<p>One final thing to consider is that <strong>the program doesn’t directly read from a
|
||||
file</strong>. This combined with the way the shell works could possibly confuse some
|
||||
@@ -1044,17 +1059,22 @@ deciphering #7 help you decipher #5).</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>
|
||||
<pre><code> We want to get away from source that is simply **a compact blob of
|
||||
octets.** Really try to be more creative than **blob coding.** *HINT!*</code></pre>
|
||||
<blockquote>
|
||||
<p>We want to get away from source that is simply <strong>a compact blob of octets.</strong>
|
||||
Really try to be more creative than <strong>blob coding.</strong> <em>HINT!</em></p>
|
||||
</blockquote>
|
||||
<p>And if you’ll notice that although it <em>might look like a compact blob of octets</em>
|
||||
at first glance if you look throughout the file you’ll see two statements to
|
||||
set your thinking straight:</p>
|
||||
(although not really: a blob is by definition roundish) at first glance if you
|
||||
look throughout the file you’ll see two statements to set your thinking
|
||||
straight:</p>
|
||||
<blockquote>
|
||||
<p><strong>NO BLOB CODING</strong></p>
|
||||
<p><strong>THIS IS NOT A COMPACT BLOB OF OCTETS</strong></p>
|
||||
</blockquote>
|
||||
<p>So you see even if your eyes are trying to deceive you they’re quite wrong. Yes
|
||||
some of it might look like a blob but 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>
|
||||
some of it might look like a blob (for certain definitions of ‘blob’ :) ) but
|
||||
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>
|
||||
</div>
|
||||
@@ -1187,7 +1207,8 @@ however leaving it as it is because this is what won.</p>
|
||||
<p>Skip to <a href="#thoughts">Final thoughts</a>.</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.</p>
|
||||
this) if for some (strange or maybe even mad) reason you’re interested, which
|
||||
basically means nobody but me.</p>
|
||||
<div id="thoughts">
|
||||
<h2 id="final-thoughts"><strong>6. Final thoughts</strong></h2>
|
||||
</div>
|
||||
@@ -1203,48 +1224,42 @@ two things I think are rather amusing (in order of least to most):</p>
|
||||
<div id="dmr">
|
||||
<p>Dennis Ritchie’s Anti-Foreword:</p>
|
||||
</div>
|
||||
<pre><code> Anti-Foreword
|
||||
|
||||
By Dennis Ritchie
|
||||
From: dmr@plan9.research.att.com
|
||||
Date: Tue, 15 Mar 1994 00:38:07 EST
|
||||
Subject: anti-foreword
|
||||
|
||||
To the contributers to this book:
|
||||
|
||||
I have succumbed to the temptation you offered in your preface: I do write you
|
||||
off as envious malcontents and romantic keepers of memories. The systems you
|
||||
remember so fondly (TOPS-20, ITS, Multics, Lisp Machine, Cedar/Mesa, the Dorado)
|
||||
are not just out to pasture, they are fertilizing it from below.
|
||||
|
||||
Your judgments are not keen, they are intoxicated by metaphor. In the Preface
|
||||
you suffer first from heat, lice, and malnourishment, then become prisoners in
|
||||
a Gulag. In Chapter 1 you are in turn infected by a virus, racked by drug
|
||||
addiction, and addled by puffiness of the genome.
|
||||
|
||||
Yet your prison without coherent design continues to imprison you. How can
|
||||
this be, if it has no strong places? The rational prisoner exploits the weak
|
||||
places, creates order from chaos: instead, collectives like the FSF vindicate
|
||||
their jailers by building cells almost compatible with the existing ones, albeit
|
||||
with more features. The journalist with three undergraduate degrees from MIT,
|
||||
the researcher at Microsoft, and the senior scientist at Apple might volunteer a
|
||||
few words about the regulations of the prisons to which they have been
|
||||
transferred.
|
||||
|
||||
Your sense of the possible is in no sense pure: sometimes you want the same
|
||||
thing you have, but wish you had done it yourselves; other times you want
|
||||
something different, but can't seem to get people to use it; sometimes one
|
||||
wonders why you just don't shut up and tell people to buy a PC with Windows or a
|
||||
Mac. No Gulag or lice, just a future whose intellectual tone and interaction
|
||||
style is set by Sonic the Hedgehog. You claim to seek progress, but you succeed
|
||||
mainly in whining.
|
||||
|
||||
Here is my metaphor: your book is a pudding stuffed with apposite
|
||||
observations, many well-conceived. Like excrement, it contains enough undigested
|
||||
nuggets of nutrition to sustain life for some. But it is not a tasty pie: it
|
||||
reeks too much of contempt and of envy.
|
||||
|
||||
Bon appetit!</code></pre>
|
||||
<blockquote>
|
||||
<p>Anti-Foreword</p>
|
||||
<p>By Dennis Ritchie
|
||||
From: dmr@plan9.research.att.com
|
||||
Date: Tue, 15 Mar 1994 00:38:07 EST
|
||||
Subject: anti-foreword</p>
|
||||
<p>To the contributers to this book:</p>
|
||||
<p>I have succumbed to the temptation you offered in your preface: I do write you
|
||||
off as envious malcontents and romantic keepers of memories. The systems you
|
||||
remember so fondly (TOPS-20, ITS, Multics, Lisp Machine, Cedar/Mesa, the Dorado)
|
||||
are not just out to pasture, they are fertilizing it from below.</p>
|
||||
<p>Your judgments are not keen, they are intoxicated by metaphor. In the Preface
|
||||
you suffer first from heat, lice, and malnourishment, then become prisoners in
|
||||
a Gulag. In Chapter 1 you are in turn infected by a virus, racked by drug
|
||||
addiction, and addled by puffiness of the genome.</p>
|
||||
<p>Yet your prison without coherent design continues to imprison you. How can
|
||||
this be, if it has no strong places? The rational prisoner exploits the weak
|
||||
places, creates order from chaos: instead, collectives like the FSF vindicate
|
||||
their jailers by building cells almost compatible with the existing ones, albeit
|
||||
with more features. The journalist with three undergraduate degrees from MIT,
|
||||
the researcher at Microsoft, and the senior scientist at Apple might volunteer a
|
||||
few words about the regulations of the prisons to which they have been
|
||||
transferred.</p>
|
||||
<p>Your sense of the possible is in no sense pure: sometimes you want the same
|
||||
thing you have, but wish you had done it yourselves; other times you want
|
||||
something different, but can’t seem to get people to use it; sometimes one
|
||||
wonders why you just don’t shut up and tell people to buy a PC with Windows or a
|
||||
Mac. No Gulag or lice, just a future whose intellectual tone and interaction
|
||||
style is set by Sonic the Hedgehog. You claim to seek progress, but you succeed
|
||||
mainly in whining.</p>
|
||||
<p>Here is my metaphor: your book is a pudding stuffed with apposite
|
||||
observations, many well-conceived. Like excrement, it contains enough undigested
|
||||
nuggets of nutrition to sustain life for some. But it is not a tasty pie: it
|
||||
reeks too much of contempt and of envy.</p>
|
||||
<p>Bon appetit!</p>
|
||||
</blockquote>
|
||||
<p>Yes he misspelt <em>‘contributors’</em>! But then again we’re talking about obfuscation
|
||||
and since it doesn’t break his message it’s not broken - it’s just obfuscated
|
||||
albeit not very much (and it still <em>‘compiles’!</em>); and isn’t that what this
|
||||
@@ -1252,46 +1267,41 @@ contest is about? :)</p>
|
||||
<div id="ken">
|
||||
<p>Ken Thompson’s ending:</p>
|
||||
</div>
|
||||
<pre><code> Creators Admit C, Unix Were Hoax
|
||||
|
||||
FOR IMMEDIATE RELEASE
|
||||
|
||||
In an announcement that has stunned the computer industry, Ken Thompson,
|
||||
Dennis Ritchie, and Brian Kernighan admitted that the Unix operating system and
|
||||
C programming language created by them is an elaborate April Fools prank kept
|
||||
alive for more than 20 years. Speaking at the recent UnixWorld Software
|
||||
Development Forum, Thompson revealed the following:
|
||||
|
||||
"In 1969, AT&T had just terminated their work with the GE/AT&T Multics
|
||||
project. Brian and I had just started working with an early release of Pascal
|
||||
from Professor Nichlaus Wirth's ETH labs in Switzerland, and we were impressed
|
||||
with its elegant simplicity and power. Dennis had just finished reading Bored of
|
||||
the Rings, a hilarious National Lampoon parody of the great Tolkien Lord of the
|
||||
Rings trilogy. As a lark, we decided to do parodies of the Multics environment
|
||||
and Pascal. Dennis and I were responsible for the operating environment. We
|
||||
looked at Multics and designed the new system to be as complex and cryptic as
|
||||
possible to maximize casual users' frustration levels, calling it Unix as a
|
||||
parody of Multics, as well as other more risque allusions.
|
||||
|
||||
"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:</code></pre>
|
||||
<pre><code> for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/
|
||||
8)%2))P("|"+(*u/4)%2);</code></pre>
|
||||
<pre><code> "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
|
||||
years. Imagine our surprise when AT&T and other U.S. corporations actually began
|
||||
trying to use Unix and C! It has taken them 20 years to develop enough
|
||||
expertise to generate even marginally useful applications using this 1960s
|
||||
technological parody, but we are impressed with the tenacity (if not common
|
||||
sense) of the general Unix and C programmer.
|
||||
|
||||
"In any event, Brian, Dennis, and I have been working exclusively in Lisp on
|
||||
the Apple Macintosh for the past few years and feel really guilty about the
|
||||
chaos, confusion, and truly bad programming that has resulted from our silly
|
||||
prank so long ago."</code></pre>
|
||||
<blockquote>
|
||||
<p>Creators Admit C, Unix Were Hoax</p>
|
||||
<p>FOR IMMEDIATE RELEASE</p>
|
||||
<p>In an announcement that has stunned the computer industry, Ken Thompson,
|
||||
Dennis Ritchie, and Brian Kernighan admitted that the Unix operating system and
|
||||
C programming language created by them is an elaborate April Fools prank kept
|
||||
alive for more than 20 years. Speaking at the recent UnixWorld Software
|
||||
Development Forum, Thompson revealed the following:</p>
|
||||
<p>“In 1969, AT&T had just terminated their work with the GE/AT&T Multics
|
||||
project. Brian and I had just started working with an early release of Pascal
|
||||
from Professor Nichlaus Wirth’s ETH labs in Switzerland, and we were impressed
|
||||
with its elegant simplicity and power. Dennis had just finished reading Bored of
|
||||
the Rings, a hilarious National Lampoon parody of the great Tolkien Lord of the
|
||||
Rings trilogy. As a lark, we decided to do parodies of the Multics environment
|
||||
and Pascal. Dennis and I were responsible for the operating environment. We
|
||||
looked at Multics and designed the new system to be as complex and cryptic as
|
||||
possible to maximize casual users’ frustration levels, calling it Unix as a
|
||||
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>
|
||||
<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
|
||||
years. Imagine our surprise when AT&T and other U.S. corporations actually began
|
||||
trying to use Unix and C! It has taken them 20 years to develop enough
|
||||
expertise to generate even marginally useful applications using this 1960s
|
||||
technological parody, but we are impressed with the tenacity (if not common
|
||||
sense) of the general Unix and C programmer.</p>
|
||||
<p>“In any event, Brian, Dennis, and I have been working exclusively in Lisp
|
||||
on the Apple Macintosh for the past few years and feel really guilty about the
|
||||
chaos, confusion, and truly bad programming that has resulted from our silly
|
||||
prank so long ago.”</p>
|
||||
<p>Major Unix and C vendors and customers, including AT&T, Microsoft,
|
||||
Hewlett-Packard, GTE, NCR, and DEC have refused comment at this time. Borland
|
||||
International, a leading vendor of Pascal and C tools, including the popular
|
||||
@@ -1303,13 +1313,15 @@ the RS/6000, merely stating “Workplace OS will be available Real Soon Now.”
|
||||
cryptic statement, Professor Wirth of the ETH Institute and father of the
|
||||
Pascal, Modula 2, and Oberon structured languages, merely stated that P. T.
|
||||
Barnum was correct.</p>
|
||||
</blockquote>
|
||||
<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
|
||||
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
|
||||
matter do send me an email - I love Tolkien’s legendarium and having another
|
||||
matter do send me an email - I love Tolkien’s Legendarium and having another
|
||||
person to talk about it with is more than welcome!</em>). 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; <strong>on the contrary it makes all of us C programmers even more
|
||||
|
||||
+7
-29
@@ -392,38 +392,16 @@
|
||||
<h2 id="an-rpm-what-kind-of-absolute-madness-is-this">An RPM: what kind of absolute MADNESS is this ?</h2>
|
||||
<p>What kind of crazy idea is this? Install an IOCCC entry? I realise it seems odd
|
||||
(at best) so why did I make a rpm spec file and why did I hint at building RPMs
|
||||
for others? I can’t say precisely; <strong>certainly I’m under no impression that
|
||||
for others? I can’t say precisely; <strong>certainly I’m under <em>NO IMPRESSION</em> that
|
||||
anyone else will want to use it</strong> <em>but the entry was fun enough for me that I
|
||||
actually will</em> (a number of my programs over the years are programs I actually
|
||||
install and I already have done so with this entry).</p>
|
||||
<p>I already have my own RPM repository and initially after having won I set it up
|
||||
so that I could host the weasel rpm (binary and source) there. At the same time
|
||||
though I feel the entry belongs on the IOCCC website; that is to say the only
|
||||
place the raw files should be downloadable from is the IOCCC website itself.
|
||||
Simon Cooper (the judge who at the time dealt with setting up the entries on the
|
||||
IOCCC website) asked me if there is any real attachment in having the RPM built
|
||||
as part of the entry and the answer is ‘no’. He did suggest too that if I were
|
||||
to have the RPM hosted on the IOCCC website not only would it place a burden on
|
||||
me to keep it up to date (not that it ever needed to be updated) but it would
|
||||
place a burden on the judges. This is no longer true with GitHub but anyway
|
||||
since this was for personal reasons I decided that:</p>
|
||||
<ul>
|
||||
<li><p>I would not host the actual source code or scripts on my website; they will
|
||||
remain on the IOCCC website. This will most likely never change; instead I would
|
||||
link to the entry directory so that they remain where they belong: the IOCCC
|
||||
website itself. I have set up an <a href="https://ioccc.xexyl.net/2018/weasel/errata">errata page</a> however should there be anything
|
||||
requiring a fix.</p></li>
|
||||
<li><p>I am keeping the weasel.spec file in the entry as it was part of my
|
||||
submission but I do not explain here how to set up the build environment or how
|
||||
to build a RPM: if you know how to use <strong>rpmbuild</strong> then you should be able to
|
||||
work it out. Again that’s a crazy idea but again it was there and it was part of
|
||||
the judges’ comments (which I liked a lot) which is yet another reason I kept
|
||||
it.</p></li>
|
||||
<li><p>Because I strongly suspect (in other words since I know) I am the only one
|
||||
who has any desire for actually installing an IOCCC entry I did not do anything
|
||||
further. Nevertheless more information on my entry can be found at
|
||||
<a href="https://ioccc.xexyl.net/2018/weasel">https://ioccc.xexyl.net/2018/weasel</a>.</p></li>
|
||||
</ul>
|
||||
<p>Nonetheless I am keeping the
|
||||
<a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2018/ferguson/weasel.spec">weasel.spec</a> file in the entry as it was part of my
|
||||
submission but I won’t explain here how to set up the build environment or how
|
||||
to build a RPM; even if anyone did want to (and I know nobody else will) want to
|
||||
do this, they can figure it out themselves. Again, this was more personal but
|
||||
since the Judges’ remarks were fun for me I am keeping this here anyway.</p>
|
||||
<hr style="width:10%;text-align:left;margin-left:0">
|
||||
<p>Jump to: <a href="#">top</a></p>
|
||||
<!--
|
||||
|
||||
+7
-35
@@ -2,45 +2,17 @@
|
||||
|
||||
What kind of crazy idea is this? Install an IOCCC entry? I realise it seems odd
|
||||
(at best) so why did I make a rpm spec file and why did I hint at building RPMs
|
||||
for others? I can't say precisely; **certainly I'm under no impression that
|
||||
for others? I can't say precisely; **certainly I'm under _NO IMPRESSION_ that
|
||||
anyone else will want to use it** *but the entry was fun enough for me that I
|
||||
actually will* (a number of my programs over the years are programs I actually
|
||||
install and I already have done so with this entry).
|
||||
|
||||
I already have my own RPM repository and initially after having won I set it up
|
||||
so that I could host the weasel rpm (binary and source) there. At the same time
|
||||
though I feel the entry belongs on the IOCCC website; that is to say the only
|
||||
place the raw files should be downloadable from is the IOCCC website itself.
|
||||
Simon Cooper (the judge who at the time dealt with setting up the entries on the
|
||||
IOCCC website) asked me if there is any real attachment in having the RPM built
|
||||
as part of the entry and the answer is 'no'. He did suggest too that if I were
|
||||
to have the RPM hosted on the IOCCC website not only would it place a burden on
|
||||
me to keep it up to date (not that it ever needed to be updated) but it would
|
||||
place a burden on the judges. This is no longer true with GitHub but anyway
|
||||
since this was for personal reasons I decided that:
|
||||
|
||||
|
||||
* I would not host the actual source code or scripts on my website; they will
|
||||
remain on the IOCCC website. This will most likely never change; instead I would
|
||||
link to the entry directory so that they remain where they belong: the IOCCC
|
||||
website itself. I have set up an [errata page][] however should there be anything
|
||||
requiring a fix.
|
||||
|
||||
* I am keeping the weasel.spec file in the entry as it was part of my
|
||||
submission but I do not explain here how to set up the build environment or how
|
||||
to build a RPM: if you know how to use **rpmbuild** then you should be able to
|
||||
work it out. Again that's a crazy idea but again it was there and it was part of
|
||||
the judges' comments (which I liked a lot) which is yet another reason I kept
|
||||
it.
|
||||
|
||||
* Because I strongly suspect (in other words since I know) I am the only one
|
||||
who has any desire for actually installing an IOCCC entry I did not do anything
|
||||
further. Nevertheless more information on my entry can be found at
|
||||
[https://ioccc.xexyl.net/2018/weasel][].
|
||||
|
||||
[errata page]: https://ioccc.xexyl.net/2018/weasel/errata
|
||||
[https://ioccc.xexyl.net/2018/weasel]: https://ioccc.xexyl.net/2018/weasel
|
||||
|
||||
Nonetheless I am keeping the
|
||||
[weasel.spec](%%REPO_URL%%/2018/ferguson/weasel.spec) file in the entry as it was part of my
|
||||
submission but I won't explain here how to set up the build environment or how
|
||||
to build a RPM; even if anyone did want to (and I know nobody else will) want to
|
||||
do this, they can figure it out themselves. Again, this was more personal but
|
||||
since the Judges' remarks were fun for me I am keeping this here anyway.
|
||||
|
||||
<hr style="width:10%;text-align:left;margin-left:0">
|
||||
|
||||
|
||||
+26
-31
@@ -231,7 +231,7 @@ Let's try some:
|
||||
```
|
||||
|
||||
The program you've just run was the [winning entry of the first IOCCC contest from
|
||||
1984] [1] (or was it 1894?), a personal favorite of mine. It is rather
|
||||
1984][1] (or was it 1894?), a personal favorite of mine. It is rather
|
||||
tightly bound to running on either a PDP-11 or a VAX-11. Now you have one.
|
||||
|
||||
Hitting Control-C will return you to the BSD UNIX prompt. Hitting Control-D
|
||||
@@ -245,7 +245,7 @@ well enough with whatever sort of ANSI terminal emulation you are using.
|
||||
|
||||
Note that I have not mounted the `/usr` disk here, so some commands from
|
||||
`/usr/bin` will be missing, along with all of the `man` pages. They are
|
||||
[available online] [2] if you need them. Adding a second RK05 disk was
|
||||
[available online][2] if you need them. Adding a second RK05 disk was
|
||||
possible, but I didn't get around to it... As the Judges can no doubt attest,
|
||||
"Mid 2017" creeps up on you quicker than you expect. :)
|
||||
|
||||
@@ -320,7 +320,7 @@ Assuming you're more careful than that, we can try a few commands:
|
||||
Why is Version 6 interesting? Well, it was the oldest version that I could
|
||||
find a boot image of that had a C compiler... This C compiler is recognizably
|
||||
C, but not quite the same syntax as we have today. It's much closer to the
|
||||
[B language] [3] from which it is derived. In particular, this C compiler
|
||||
[B language][3] from which it is derived. In particular, this C compiler
|
||||
would not be able to compile `mullender.c` (as simple as it is), because the
|
||||
following syntax features don't exist yet:
|
||||
|
||||
@@ -351,10 +351,10 @@ back to the BSD emulation, you should either delete `rk05.fs` or do a
|
||||
|
||||
We now set the Wayback Machine to the very start of it all, 1969.
|
||||
|
||||
[The story] [4] here is interesting and well worth a read. Bell Labs was
|
||||
[The story][4] here is interesting and well worth a read. Bell Labs was
|
||||
pulling out of the Multics project and Ken Thompson and his colleagues had
|
||||
become accustomed to the relatively nice programming environment. They also
|
||||
enjoyed the early computer game [*Space Travel*] [5] and wanted another system
|
||||
enjoyed the early computer game [*Space Travel*][5] and wanted another system
|
||||
to run it on. They found a PDP-7 which was already obsolete at the time to
|
||||
port *Space Travel* to. The primitive programming environment influenced
|
||||
Thompson to recreate parts of the Multics experience in the much more
|
||||
@@ -385,14 +385,11 @@ respectively. Let's try the Dennis Richie's `dmr` account:
|
||||
Even though this is not Ken's doing, I feel this gives me licence to
|
||||
include this quote from the BSD `fortune` program:
|
||||
|
||||
```
|
||||
Ken Thompson has an automobile which he helped design. Unlike
|
||||
most automobiles, it has neither speedometer, nor gas gauge,
|
||||
nor any of the numerous idiot lights which plague the modern
|
||||
driver. Rather, if the driver makes any mistake, a giant "?"
|
||||
lights up in the center of the dashboard. "The experienced
|
||||
driver", he says, "will usually know what's wrong."
|
||||
```
|
||||
> Ken Thompson has an automobile which he helped design. Unlike most
|
||||
automobiles, it has neither speedometer, nor gas gauge, nor any of the numerous
|
||||
idiot lights which plague the modern driver. Rather, if the driver makes any
|
||||
mistake, a giant "?" lights up in the center of the dashboard. "The experienced
|
||||
driver", he says, "will usually know what's wrong."
|
||||
|
||||
What's the deal here? Well, that's a slightly long story. The short version
|
||||
is we have gone so far back in the history of UNIX that *we don't have
|
||||
@@ -461,16 +458,14 @@ Now `ls` will work, and we can try some other things while we are here:
|
||||
```
|
||||
|
||||
The last command is invoking the compiler for an extremely early version of
|
||||
the [B programming language] [3], the predecessor to C. Thompson missed the
|
||||
the [B programming language][3], the predecessor to C. Thompson missed the
|
||||
convenience of writing code in a high-level language -- Multics was written
|
||||
in a version of PL/1 -- and wanted the same convenience in UNIX. He preferred
|
||||
BCPL (a typeless language) to PL/1. As Dennis Ritchie [wrote] [6]:
|
||||
BCPL (a typeless language) to PL/1. As Dennis Ritchie [wrote][6]:
|
||||
|
||||
> B can be thought of as C without types; more accurately, it is BCPL
|
||||
squeezed into 8K bytes of memory and filtered through Thompson's brain.
|
||||
|
||||
```
|
||||
B can be thought of as C without types; more accurately,
|
||||
it is BCPL squeezed into 8K bytes of memory and filtered
|
||||
through Thompson's brain.
|
||||
```
|
||||
|
||||
A look at the B reference manual will show the strong correlation with C, and
|
||||
shows the source of a lot of C's mysteriousness -- some of which is preserved
|
||||
@@ -531,14 +526,14 @@ version of C, it felt cheap, as it would be
|
||||
|
||||
It was during this time that I discovered that in 2016, members of the Unix
|
||||
Heritage Society got access to [printouts of assembly-language source for the
|
||||
original version of UNIX] [7]. With what was a [huge amount of work] [8],
|
||||
original version of UNIX][7]. With what was a [huge amount of work][8],
|
||||
they scanned in the printouts, fixed up the OCR translations, built assembler
|
||||
and file system tools from scratch and made an accurate emulation of
|
||||
Thompson's PDP-7 that allowed them to get the system up and running. Although
|
||||
source for the entire kernel and about half of the user-space commands were
|
||||
present (including the runtime and libraries for the B compiler), the
|
||||
remainder needed to be written from scratch, including the shell. The final
|
||||
results of the project are [available on GitHub] [9].
|
||||
results of the project are [available on GitHub][9].
|
||||
|
||||
None of this was remotely easy (as I was to discover myself). The PDP-7 is
|
||||
long gone, and the documentation for it is less complete than one would like.
|
||||
@@ -563,7 +558,7 @@ division and shifting.
|
||||
* Perforated Tape Reader Type 444.
|
||||
* RB09 Fixed Disk Controller.
|
||||
|
||||
The [PDP-7] [10] is an odd duck by modern computer standards:
|
||||
The [PDP-7][10] is an odd duck by modern computer standards:
|
||||
|
||||
* 18 bit words, with no byte addressing.
|
||||
* Both one's and two's complement math (there is `ADD` for one's complement and
|
||||
@@ -588,7 +583,7 @@ memory locations to support. Being clever also helps.
|
||||
* I/O is done with dedicated I/O instructions (which are also microcoded).
|
||||
* The RB09 disk controller gets a special mention here because of its
|
||||
particularly annoying encoding of track and sector offsets in
|
||||
[packed BCD] [11]. A non-trivial amount of code space in the simulator
|
||||
[packed BCD][11]. A non-trivial amount of code space in the simulator
|
||||
is needed to convert into and out of BCD, along with an equivalent amount
|
||||
of code in the UNIX kernel itself.
|
||||
|
||||
@@ -639,7 +634,7 @@ You still have two other UNICES to play with.
|
||||
|
||||
What about the other two UNIX variants? These are both covered by licences
|
||||
that allow me to use them. Back in 2002, Caldera International released
|
||||
Research Unix versions 1-7 and 32V under a [permissive BSD-like license] [12].
|
||||
Research Unix versions 1-7 and 32V under a [permissive BSD-like license][12].
|
||||
BSD UNIX is based off of v7 UNIX, and of course has its own permissive
|
||||
BSD licence. And in 2017, Nokia also released versions 8-10 under the
|
||||
condition that it will not assert copyright rights for non-commercial use.
|
||||
@@ -719,7 +714,7 @@ came about from the realization that I needed a response to the late-discovered
|
||||
licence issue, I'm quite pleased with the result -- it enables an interesting
|
||||
window on the dawn of the UNIX era. I feel that someone should complete the
|
||||
circle here by emulating a VAX 780 on the PDP-11 and run 4.2BSD on it, so that
|
||||
we can get the [original runtime environment used for the first IOCCC] [13].
|
||||
we can get the [original runtime environment used for the first IOCCC][13].
|
||||
|
||||
|
||||
### Compile-time Options:
|
||||
@@ -757,7 +752,7 @@ you will need to escape `$` as `$$` to protect it from `make`.
|
||||
|
||||
### What is the ASCII art supposed to be?
|
||||
|
||||
The ASCII art represents a torn piece of [paper tape] [14].
|
||||
The ASCII art represents a torn piece of [paper tape][14].
|
||||
|
||||
|
||||
### Acknowledgements
|
||||
@@ -765,19 +760,19 @@ The ASCII art represents a torn piece of [paper tape] [14].
|
||||
None of this could have been possible without the hard work of
|
||||
|
||||
* Warren Toomey and the other members of the
|
||||
[The Unix Heritage Society] [15]
|
||||
* Robert M. Supnik and the other contributors to [SimH] [16], the simulator
|
||||
[The Unix Heritage Society][15]
|
||||
* Robert M. Supnik and the other contributors to [SimH][16], the simulator
|
||||
for historic computer architectures. The number of times I needed to
|
||||
"Use the Source, Luke" on SimH to unravel some dark corner of these
|
||||
machines was uncountable.
|
||||
* [Bitsavers] [17], which acquired, scanned and preserved all the manuals
|
||||
* [Bitsavers][17], which acquired, scanned and preserved all the manuals
|
||||
I spent many hours squinting at.
|
||||
* Ken Thompson, Dennis Ritchie, Brian Kernigan, M\. D\. McIlroy, J\. F\.
|
||||
Osssanna, Rudd Canaday and the other members of the Bell Labs
|
||||
Computing Science Research Center who were responsible for the invention
|
||||
of UNIX, the C programming language, and the innumerable other innovations
|
||||
that we now take for granted as part of the modern software landscape.
|
||||
In particular, the [home page of the late Dennis Ritchie] [18] contained
|
||||
In particular, the [home page of the late Dennis Ritchie][18] contained
|
||||
a trove of useful information on the evolution of UNIX and C and is
|
||||
recommended for perusal by others who share my peculiar retro computing
|
||||
passion.
|
||||
|
||||
+31
-29
@@ -548,8 +548,8 @@ Let’s try some:</p>
|
||||
/dev/rk0 / 1958 1688 270 86%
|
||||
# bin/cc mullender.c
|
||||
# ./a.out</code></pre>
|
||||
<p>The program you’ve just run was the [winning entry of the first IOCCC contest from
|
||||
1984] <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1984/mullender/mullender.c" title="mullender.c">1</a> (or was it 1894?), a personal favorite of mine. It is rather
|
||||
<p>The program you’ve just run was the <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1984/mullender/mullender.c" title="mullender.c">winning entry of the first IOCCC contest from
|
||||
1984</a> (or was it 1894?), a personal favorite of mine. It is rather
|
||||
tightly bound to running on either a PDP-11 or a VAX-11. Now you have one.</p>
|
||||
<p>Hitting Control-C will return you to the BSD UNIX prompt. Hitting Control-D
|
||||
will log you out of the single-user session and get you back to the <code>:login:</code>
|
||||
@@ -561,7 +561,7 @@ carriage. I’ve also predefined <code>TERM</code> to <code>vt100</code>, which
|
||||
well enough with whatever sort of ANSI terminal emulation you are using.</p>
|
||||
<p>Note that I have not mounted the <code>/usr</code> disk here, so some commands from
|
||||
<code>/usr/bin</code> will be missing, along with all of the <code>man</code> pages. They are
|
||||
[available online] <a href="http://minnie.tuhs.org/cgi-bin/utree.pl?file=2.9BSD" title="2.9 BSD">2</a> if you need them. Adding a second RK05 disk was
|
||||
<a href="http://minnie.tuhs.org/cgi-bin/utree.pl?file=2.9BSD" title="2.9 BSD">available online</a> if you need them. Adding a second RK05 disk was
|
||||
possible, but I didn’t get around to it… As the Judges can no doubt attest,
|
||||
“Mid 2017” creeps up on you quicker than you expect. :)</p>
|
||||
<p>Once you’ve had enough fun in BSD 2.9, type Control-E to exit the emulation.</p>
|
||||
@@ -617,7 +617,7 @@ may need to use Control-E to quit the emulation.</p>
|
||||
<p>Why is Version 6 interesting? Well, it was the oldest version that I could
|
||||
find a boot image of that had a C compiler… This C compiler is recognizably
|
||||
C, but not quite the same syntax as we have today. It’s much closer to the
|
||||
[B language] <a href="https://www.bell-labs.com/usr/dmr/www/kbman.html" title="B Language">3</a> from which it is derived. In particular, this C compiler
|
||||
<a href="https://www.bell-labs.com/usr/dmr/www/kbman.html" title="B Language">B language</a> from which it is derived. In particular, this C compiler
|
||||
would not be able to compile <code>mullender.c</code> (as simple as it is), because the
|
||||
following syntax features don’t exist yet:</p>
|
||||
<ul>
|
||||
@@ -641,10 +641,10 @@ back to the BSD emulation, you should either delete <code>rk05.fs</code> or do a
|
||||
<code>make clean</code> before you do a <code>make</code>.</p>
|
||||
<h3 id="building-and-running-unix-v0">Building and Running UNIX v0:</h3>
|
||||
<p>We now set the Wayback Machine to the very start of it all, 1969.</p>
|
||||
<p>[The story] <a href="https://www.bell-labs.com/usr/dmr/www/hist.html" title="UNIX history">4</a> here is interesting and well worth a read. Bell Labs was
|
||||
<p><a href="https://www.bell-labs.com/usr/dmr/www/hist.html" title="UNIX history">The story</a> here is interesting and well worth a read. Bell Labs was
|
||||
pulling out of the Multics project and Ken Thompson and his colleagues had
|
||||
become accustomed to the relatively nice programming environment. They also
|
||||
enjoyed the early computer game [<em>Space Travel</em>] <a href="https://www.bell-labs.com/usr/dmr/www/spacetravel.html" title="Space Travel">5</a> and wanted another system
|
||||
enjoyed the early computer game <a href="https://www.bell-labs.com/usr/dmr/www/spacetravel.html" title="Space Travel"><em>Space Travel</em></a> and wanted another system
|
||||
to run it on. They found a PDP-7 which was already obsolete at the time to
|
||||
port <em>Space Travel</em> to. The primitive programming environment influenced
|
||||
Thompson to recreate parts of the Multics experience in the much more
|
||||
@@ -665,12 +665,13 @@ respectively. Let’s try the Dennis Richie’s <code>dmr</code> account:</p>
|
||||
. ?</code></pre>
|
||||
<p>Even though this is not Ken’s doing, I feel this gives me licence to
|
||||
include this quote from the BSD <code>fortune</code> program:</p>
|
||||
<pre><code> Ken Thompson has an automobile which he helped design. Unlike
|
||||
most automobiles, it has neither speedometer, nor gas gauge,
|
||||
nor any of the numerous idiot lights which plague the modern
|
||||
driver. Rather, if the driver makes any mistake, a giant "?"
|
||||
lights up in the center of the dashboard. "The experienced
|
||||
driver", he says, "will usually know what's wrong."</code></pre>
|
||||
<blockquote>
|
||||
<p>Ken Thompson has an automobile which he helped design. Unlike most
|
||||
automobiles, it has neither speedometer, nor gas gauge, nor any of the numerous
|
||||
idiot lights which plague the modern driver. Rather, if the driver makes any
|
||||
mistake, a giant “?” lights up in the center of the dashboard. “The experienced
|
||||
driver”, he says, “will usually know what’s wrong.”</p>
|
||||
</blockquote>
|
||||
<p>What’s the deal here? Well, that’s a slightly long story. The short version
|
||||
is we have gone so far back in the history of UNIX that <em>we don’t have
|
||||
filesystem paths yet</em>. In other words, we can’t say something like
|
||||
@@ -728,13 +729,14 @@ directory, and the new name).</p>
|
||||
Hello, World!
|
||||
@</code></pre>
|
||||
<p>The last command is invoking the compiler for an extremely early version of
|
||||
the [B programming language] <a href="https://www.bell-labs.com/usr/dmr/www/kbman.html" title="B Language">3</a>, the predecessor to C. Thompson missed the
|
||||
the <a href="https://www.bell-labs.com/usr/dmr/www/kbman.html" title="B Language">B programming language</a>, the predecessor to C. Thompson missed the
|
||||
convenience of writing code in a high-level language – Multics was written
|
||||
in a version of PL/1 – and wanted the same convenience in UNIX. He preferred
|
||||
BCPL (a typeless language) to PL/1. As Dennis Ritchie [wrote] <a href="https://www.bell-labs.com/usr/dmr/www/chist.html" title="C History">6</a>:</p>
|
||||
<pre><code> B can be thought of as C without types; more accurately,
|
||||
it is BCPL squeezed into 8K bytes of memory and filtered
|
||||
through Thompson's brain.</code></pre>
|
||||
BCPL (a typeless language) to PL/1. As Dennis Ritchie <a href="https://www.bell-labs.com/usr/dmr/www/chist.html" title="C History">wrote</a>:</p>
|
||||
<blockquote>
|
||||
<p>B can be thought of as C without types; more accurately, it is BCPL
|
||||
squeezed into 8K bytes of memory and filtered through Thompson’s brain.</p>
|
||||
</blockquote>
|
||||
<p>A look at the B reference manual will show the strong correlation with C, and
|
||||
shows the source of a lot of C’s mysteriousness – some of which is preserved
|
||||
simply so that C could compile the <em>dozens</em> of lines of existing B code…</p>
|
||||
@@ -787,15 +789,15 @@ that was still a possibility on an interpreted version of B or a stripped-down
|
||||
version of C, it felt cheap, as it would be
|
||||
<a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/1984/mullender/mullender.c">mullender.c</a> only in spirit.</p>
|
||||
<p>It was during this time that I discovered that in 2016, members of the Unix
|
||||
Heritage Society got access to [printouts of assembly-language source for the
|
||||
original version of UNIX] <a href="http://www.tuhs.org/Archive/Distributions/Research/McIlroy_v0/" title="V0 Scans">7</a>. With what was a [huge amount of work] <a href="https://web.archive.org/web/20180826162445/https://minnie.tuhs.org//Y5/wkt_hapop_paper.pdf" title="UNIX v0">8</a>,
|
||||
Heritage Society got access to <a href="http://www.tuhs.org/Archive/Distributions/Research/McIlroy_v0/" title="V0 Scans">printouts of assembly-language source for the
|
||||
original version of UNIX</a>. With what was a <a href="https://web.archive.org/web/20180826162445/https://minnie.tuhs.org//Y5/wkt_hapop_paper.pdf" title="UNIX v0">huge amount of work</a>,
|
||||
they scanned in the printouts, fixed up the OCR translations, built assembler
|
||||
and file system tools from scratch and made an accurate emulation of
|
||||
Thompson’s PDP-7 that allowed them to get the system up and running. Although
|
||||
source for the entire kernel and about half of the user-space commands were
|
||||
present (including the runtime and libraries for the B compiler), the
|
||||
remainder needed to be written from scratch, including the shell. The final
|
||||
results of the project are [available on GitHub] <a href="https://github.com/DoctorWkt/pdp7-unix" title="PDP-7 UNIX">9</a>.</p>
|
||||
results of the project are <a href="https://github.com/DoctorWkt/pdp7-unix" title="PDP-7 UNIX">available on GitHub</a>.</p>
|
||||
<p>None of this was remotely easy (as I was to discover myself). The PDP-7 is
|
||||
long gone, and the documentation for it is less complete than one would like.
|
||||
In addition, the devices attached for it were a bit of a mystery. The disk
|
||||
@@ -817,7 +819,7 @@ division and shifting.</li>
|
||||
<li>Perforated Tape Reader Type 444.</li>
|
||||
<li>RB09 Fixed Disk Controller.</li>
|
||||
</ul>
|
||||
<p>The [PDP-7] <a href="http://bitsavers.trailing-edge.com/pdf/dec/pdp7/F-75P_PDP7prelimUM_Dec64.pdf" title="PDP-7 Manual">10</a> is an odd duck by modern computer standards:</p>
|
||||
<p>The <a href="http://bitsavers.trailing-edge.com/pdf/dec/pdp7/F-75P_PDP7prelimUM_Dec64.pdf" title="PDP-7 Manual">PDP-7</a> is an odd duck by modern computer standards:</p>
|
||||
<ul>
|
||||
<li>18 bit words, with no byte addressing.</li>
|
||||
<li>Both one’s and two’s complement math (there is <code>ADD</code> for one’s complement and
|
||||
@@ -842,7 +844,7 @@ memory locations to support. Being clever also helps.</li>
|
||||
<li>I/O is done with dedicated I/O instructions (which are also microcoded).</li>
|
||||
<li>The RB09 disk controller gets a special mention here because of its
|
||||
particularly annoying encoding of track and sector offsets in
|
||||
[packed BCD] <a href="https://en.wikipedia.org/wiki/Binary-coded_decimal" title="BCD">11</a>. A non-trivial amount of code space in the simulator
|
||||
<a href="https://en.wikipedia.org/wiki/Binary-coded_decimal" title="BCD">packed BCD</a>. A non-trivial amount of code space in the simulator
|
||||
is needed to convert into and out of BCD, along with an equivalent amount
|
||||
of code in the UNIX kernel itself.</li>
|
||||
</ul>
|
||||
@@ -885,7 +887,7 @@ can just not do so. Delete the lines from the <code>Makefile</code> and sleep we
|
||||
You still have two other UNICES to play with.</p>
|
||||
<p>What about the other two UNIX variants? These are both covered by licences
|
||||
that allow me to use them. Back in 2002, Caldera International released
|
||||
Research Unix versions 1-7 and 32V under a [permissive BSD-like license] <a href="http://www.tuhs.org/Archive/Caldera-license.pdf" title="Caldera Licence">12</a>.
|
||||
Research Unix versions 1-7 and 32V under a <a href="http://www.tuhs.org/Archive/Caldera-license.pdf" title="Caldera Licence">permissive BSD-like license</a>.
|
||||
BSD UNIX is based off of v7 UNIX, and of course has its own permissive
|
||||
BSD licence. And in 2017, Nokia also released versions 8-10 under the
|
||||
condition that it will not assert copyright rights for non-commercial use.</p>
|
||||
@@ -956,7 +958,7 @@ came about from the realization that I needed a response to the late-discovered
|
||||
licence issue, I’m quite pleased with the result – it enables an interesting
|
||||
window on the dawn of the UNIX era. I feel that someone should complete the
|
||||
circle here by emulating a VAX 780 on the PDP-11 and run 4.2BSD on it, so that
|
||||
we can get the [original runtime environment used for the first IOCCC] <a href="https://groups.google.com/forum/?hl=en#!msg/net.lang.c/lx-TAuEyeRI/HdOOnNx6LC0J" title="First annual IOCCC announcement">13</a>.</p>
|
||||
we can get the <a href="https://groups.google.com/forum/?hl=en#!msg/net.lang.c/lx-TAuEyeRI/HdOOnNx6LC0J" title="First annual IOCCC announcement">original runtime environment used for the first IOCCC</a>.</p>
|
||||
<h3 id="compile-time-options">Compile-time Options:</h3>
|
||||
<p>The following command flags control the compilation:</p>
|
||||
<ul>
|
||||
@@ -989,24 +991,24 @@ quoting here – there are at least three levels going on. In particular,
|
||||
you will need to escape <code>$</code> as <code>$$</code> to protect it from <code>make</code>.</li>
|
||||
</ul>
|
||||
<h3 id="what-is-the-ascii-art-supposed-to-be">What is the ASCII art supposed to be?</h3>
|
||||
<p>The ASCII art represents a torn piece of [paper tape] <a href="https://en.wikipedia.org/wiki/Punched_tape" title="Paper Tape">14</a>.</p>
|
||||
<p>The ASCII art represents a torn piece of <a href="https://en.wikipedia.org/wiki/Punched_tape" title="Paper Tape">paper tape</a>.</p>
|
||||
<h3 id="acknowledgements">Acknowledgements</h3>
|
||||
<p>None of this could have been possible without the hard work of</p>
|
||||
<ul>
|
||||
<li>Warren Toomey and the other members of the
|
||||
[The Unix Heritage Society] <a href="http://www.tuhs.org" title="The Unix Heritage Society">15</a></li>
|
||||
<li>Robert M. Supnik and the other contributors to [SimH] <a href="http://simh.trailing-edge.com" title="SimH">16</a>, the simulator
|
||||
<a href="http://www.tuhs.org" title="The Unix Heritage Society">The Unix Heritage Society</a></li>
|
||||
<li>Robert M. Supnik and the other contributors to <a href="http://simh.trailing-edge.com" title="SimH">SimH</a>, the simulator
|
||||
for historic computer architectures. The number of times I needed to
|
||||
“Use the Source, Luke” on SimH to unravel some dark corner of these
|
||||
machines was uncountable.</li>
|
||||
<li>[Bitsavers] <a href="http://bitsavers.trailing-edge.com" title="Bitsavers.org">17</a>, which acquired, scanned and preserved all the manuals
|
||||
<li><a href="http://bitsavers.trailing-edge.com" title="Bitsavers.org">Bitsavers</a>, which acquired, scanned and preserved all the manuals
|
||||
I spent many hours squinting at.</li>
|
||||
<li>Ken Thompson, Dennis Ritchie, Brian Kernigan, M. D. McIlroy, J. F.
|
||||
Osssanna, Rudd Canaday and the other members of the Bell Labs
|
||||
Computing Science Research Center who were responsible for the invention
|
||||
of UNIX, the C programming language, and the innumerable other innovations
|
||||
that we now take for granted as part of the modern software landscape.
|
||||
In particular, the [home page of the late Dennis Ritchie] <a href="https://www.bell-labs.com/usr/dmr/www/" title="DMR Homepage">18</a> contained
|
||||
In particular, the <a href="https://www.bell-labs.com/usr/dmr/www/" title="DMR Homepage">home page of the late Dennis Ritchie</a> contained
|
||||
a trove of useful information on the evolution of UNIX and C and is
|
||||
recommended for perusal by others who share my peculiar retro computing
|
||||
passion.</li>
|
||||
|
||||
+6
-13
@@ -26,10 +26,8 @@ least 125x38, try:
|
||||
|
||||
It is said by some students of Astronomy:
|
||||
|
||||
```
|
||||
Oh, Be A Fine Gal, Kiss Me!
|
||||
Oh, Be A Fine Gentleman, Kiss Me!
|
||||
```
|
||||
> Oh, Be A Fine Gal, Kiss Me!<br>
|
||||
> Oh, Be A Fine Gentleman, Kiss Me!
|
||||
|
||||
Many [Mnemonic variations](http://www.star.ucl.ac.uk/%7Epac/obafgkmrns.html) exist.
|
||||
You might wish, on a star, to better understand the colors being displayed.
|
||||
@@ -173,21 +171,16 @@ Because the rot13 is too easy to decode with the plain eyes, I decided to use
|
||||
the [Caesar cipher](https://en.wikipedia.org/wiki/Caesar_cipher) with the key
|
||||
18:
|
||||
|
||||
```
|
||||
Lzw xajkl tsffwj ak wfugvwv mkafy AWWW 754 xdgslk gf dafw 47. Al ak hjaflwv
|
||||
gfdq gf dalldw-wfvasf esuzafwk.
|
||||
```
|
||||
> Lzw xajkl tsffwj ak wfugvwv mkafy AWWW 754 xdgslk gf dafw 47. Al ak hjaflwv
|
||||
gfdq gf dalldw-wfvasf esuzafwk.
|
||||
|
||||
If you want to or must know and don't know how to decipher this, you might look
|
||||
at the [Caesar cipher decoder](https://www.dcode.fr/caesar-cipher). Find the
|
||||
text that says:
|
||||
|
||||
```
|
||||
Manual decryption and parameters
|
||||
Shift/Key (number)
|
||||
```
|
||||
> Manual decryption and parameters Shift/Key (number)
|
||||
|
||||
and enter 18 and then click the button that says: `DECRYPT (BRUTEFORCE)`.
|
||||
.. and enter 18 and then click the button that says: `DECRYPT (BRUTEFORCE)`.
|
||||
|
||||
<!--
|
||||
|
||||
|
||||
+12
-7
@@ -418,8 +418,10 @@ least 125x38, try:</p>
|
||||
<pre><code> ./try.sh</code></pre>
|
||||
<h2 id="judges-remarks">Judges’ remarks:</h2>
|
||||
<p>It is said by some students of Astronomy:</p>
|
||||
<pre><code> Oh, Be A Fine Gal, Kiss Me!
|
||||
Oh, Be A Fine Gentleman, Kiss Me!</code></pre>
|
||||
<blockquote>
|
||||
<p>Oh, Be A Fine Gal, Kiss Me!<br>
|
||||
Oh, Be A Fine Gentleman, Kiss Me!</p>
|
||||
</blockquote>
|
||||
<p>Many <a href="http://www.star.ucl.ac.uk/%7Epac/obafgkmrns.html">Mnemonic variations</a> exist.
|
||||
You might wish, on a star, to better understand the colors being displayed.
|
||||
And those in the deep south might wish to go north for a better view.</p>
|
||||
@@ -514,14 +516,17 @@ questions:</p>
|
||||
<p>Because the rot13 is too easy to decode with the plain eyes, I decided to use
|
||||
the <a href="https://en.wikipedia.org/wiki/Caesar_cipher">Caesar cipher</a> with the key
|
||||
18:</p>
|
||||
<pre><code> Lzw xajkl tsffwj ak wfugvwv mkafy AWWW 754 xdgslk gf dafw 47. Al ak hjaflwv
|
||||
gfdq gf dalldw-wfvasf esuzafwk.</code></pre>
|
||||
<blockquote>
|
||||
<p>Lzw xajkl tsffwj ak wfugvwv mkafy AWWW 754 xdgslk gf dafw 47. Al ak hjaflwv
|
||||
gfdq gf dalldw-wfvasf esuzafwk.</p>
|
||||
</blockquote>
|
||||
<p>If you want to or must know and don’t know how to decipher this, you might look
|
||||
at the <a href="https://www.dcode.fr/caesar-cipher">Caesar cipher decoder</a>. Find the
|
||||
text that says:</p>
|
||||
<pre><code> Manual decryption and parameters
|
||||
Shift/Key (number)</code></pre>
|
||||
<p>and enter 18 and then click the button that says: <code>DECRYPT (BRUTEFORCE)</code>.</p>
|
||||
<blockquote>
|
||||
<p>Manual decryption and parameters Shift/Key (number)</p>
|
||||
</blockquote>
|
||||
<p>.. and enter 18 and then click the button that says: <code>DECRYPT (BRUTEFORCE)</code>.</p>
|
||||
<!--
|
||||
|
||||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||||
|
||||
Reference in new issue
Block a user