Add 2020 source files for real
This commit is contained in:
1 parent
a3c1748648
commit
9d61fc0fb4
147 files changed
+32101
No files matched your search
@@ -0,0 +1,609 @@
|
||||
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional //EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta name="GENERATOR" content="mkd2html 2.2.2">
|
||||
<meta http-equiv="Content-Type"
|
||||
content="text/html; charset=utf-8"> <link rel="stylesheet"
|
||||
type="text/css"
|
||||
href="../hint.css" />
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<CENTER>
|
||||
<IMG SRC="/png/ioccc.png" ALT="IOCCC" height=78 width=267>
|
||||
<P><FONT size="6"><I>The International Obfuscated C Code Contest</I></FONT></P>
|
||||
<div id="bar">
|
||||
<ul>
|
||||
<li><a href="../index.html">About the 27th IOCCC</a></li>
|
||||
<li><a href="../whowon.html">27th IOCCC Winners</a></li>
|
||||
<li><a href="/index.html">IOCCC home</a></li>
|
||||
<li><a href="/winners.html">List of All Winners</a></li>
|
||||
<li><a href="/judges.html">The Judges</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<P><FONT size="6"><B>Supplemental Info</B></FONT></P>
|
||||
</CENTER>
|
||||
|
||||
|
||||
<h1>The recode configurator documentation (and a fun way to explore my 2020 IOCCC Enigma simulator)</h1>
|
||||
|
||||
<p>N.B. At the end of this file I have given a fun exercise that can be used to
|
||||
explore my Enigma simulator. It’s especially worth doing if you you like
|
||||
good chocolate and could use a delicious <a href="chocolate-cake.html">Double-layered Chocolate Fudge Cake</a>.</p>
|
||||
|
||||
<p>Alternatively if you just want the recipe you could look at my Snake entry
|
||||
‘Don’t tread on me award’ since it’s also there and not enciphered.</p>
|
||||
|
||||
<p><a name="toc"></a>
|
||||
- <a href="#recode">What is recode and why is it recommended?</a>
|
||||
- <a href="#options">Options</a>
|
||||
* <a href="#samefile">Protecting against the same I/O file</a>
|
||||
* <a href="#fileoptions">File options parser limitation</a>
|
||||
* <a href="#validation">-R option validation?</a>
|
||||
- <a href="#pipingtorecode">Piping commands to recode</a>
|
||||
- <a href="#pipingtoenigma">Piping recode to the Enigma simulator</a>
|
||||
- <a href="#manuallytest">Manually test the recode program with the Enigma program</a>
|
||||
- <a href="#onlyconfig">Only write config file</a>
|
||||
- <a href="#reuseconfig">Reusing a configuration</a>
|
||||
- <a href="#passtoenigma">Write config file, read data file and pass to Enigma simulator</a>
|
||||
- <a href="#directlytoenigma">Piping directly to the Enigma code once (with randomised settings, saved)</a>
|
||||
- <a href="#conclusion">Usage conclusion</a>
|
||||
- <a href="#additions">Example additions</a>
|
||||
- <a href="#exampleuses">Example uses</a>
|
||||
- <a href="#cake">Delicious Enigma: Double-layered Chocolate Fudge Cake</a></p>
|
||||
|
||||
<h1><a name="recode" href="#toc">What is recode and why is it recommended?</a></h1>
|
||||
|
||||
<p>To demonstrate how to and why you should use the recode program with the Enigma
|
||||
simulator I have included some examples here as well as brief (‘brief?!’ I am sure
|
||||
many would think but it’s brief for me) commentary.</p>
|
||||
|
||||
<p>It would not be possible to do all that the recode program does in my entry
|
||||
itself but I wanted to demonstrate the features of my entry and this seemed the
|
||||
best way to do that. It also enhances the use of the simulator to make it
|
||||
reusable etc.</p>
|
||||
|
||||
<p>The recode name idea is that it recodes the input (validating first) to be input
|
||||
for the simulator itself. It can pseudo-randomly select all the settings, it can
|
||||
write the settings to a file, read from input file (e.g. for the text to
|
||||
encipher if piped to the simulator) etc.</p>
|
||||
|
||||
<p>Basically it’s a configurator for the Enigma simulator that makes it easier to
|
||||
use the simulator as well as to reuse the configuration to decipher messages
|
||||
that have been enciphered by those settings. But it also tries to make it look
|
||||
more like the real thing in that it shows the actual rotors (labelling them with
|
||||
the Roman numeral), the reflectors (labelling them with B, C and showing the
|
||||
actual strings) etc.</p>
|
||||
|
||||
<p>In this file I will show an example of each feature and then get to the
|
||||
wonderful ‘challenge’ for everyone.</p>
|
||||
|
||||
<h1><a name="options" href="#toc">Options</a></h1>
|
||||
|
||||
<pre><code> usage: ./recode [options]
|
||||
-v display selected settings
|
||||
-r pseudo-randomly select settings
|
||||
-f<input file> read file for Enigma input
|
||||
-R<string|file> init settings from settings string or file
|
||||
-o<output file> write settings to file
|
||||
</code></pre>
|
||||
|
||||
<p><code>-r</code> randomises settings. It won’t prompt you for settings but it will for input
|
||||
if you don’t give the option to read in a file for input.</p>
|
||||
|
||||
<p><code>-v</code> shows selected settings. For example combining <code>-r</code> and <code>-v</code>:</p>
|
||||
|
||||
<pre><code> $ echo IOCCC | ./recode -r -v
|
||||
Ring 1: ( I) EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||||
Ring 2: ( V) VZBRGITYUPSDNHLXAWMJQOFECK
|
||||
Ring 3: ( IV) ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||||
Ring settings: WAR
|
||||
Ring positions: XKE
|
||||
Reflector: (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||||
Plugboard pair #01: XE
|
||||
Plugboard pair #02: HJ
|
||||
Plugboard pair #03: SA
|
||||
Plugboard pair #04: PY
|
||||
Plugboard pair #05: CI
|
||||
Plugboard pair #06: ZB
|
||||
Plugboard pair #07: WD
|
||||
Plugboard pair #08: QN
|
||||
Plugboard pair #09: RU
|
||||
Plugboard pair #10: VG
|
||||
1WX5AK4RE1XEHJSAPYCIZBWDQNRUVGIOCCC
|
||||
</code></pre>
|
||||
|
||||
<p>Though you won’t find such strings in recode.c or prog.c. (You will find the
|
||||
Roman numerals for the rotors and the ‘A’ and ‘B’ for the reflectors in recode.c
|
||||
though). Yes the ‘WAR’ for the Ringstellung (Ring settings) is an amusing
|
||||
coincidence <em>but it really did happen!</em></p>
|
||||
|
||||
<p>As for <code>-f</code> the contents would be output with the settings e.g. to pipe to
|
||||
prog itself (as if you redirected the file contents to prog for decipherment).
|
||||
If the file cannot be opened it sets back to stdin.</p>
|
||||
|
||||
<p><code>-o</code> outputs the settings to the file. If the file cannot be opened for writing
|
||||
or is the same file name (see below) then only stdout will be used. Example of
|
||||
randomised output going to a file:</p>
|
||||
|
||||
<pre><code> $ ./recode -r -oconfig
|
||||
IOCCC
|
||||
3PP4UB5GG1ELGTKFCOPVBNUYXJAWSDIOCCC
|
||||
$ cat config
|
||||
3PP4UB5GG1ELGTKFCOPVBNUYXJAWSD$
|
||||
</code></pre>
|
||||
|
||||
<p>Notice that a terminating newline isn’t added. Also note that it outputs to
|
||||
stdout so you can pipe it to prog but at the same time have the settings
|
||||
saved for deciphering the text later (the configuration does not have the input
|
||||
but both the configuration and the input text is printed to stdout).</p>
|
||||
|
||||
<p>If you want to initialise the settings from previously saved settings (as a
|
||||
string or an input file that has the same format) use the <code>-R<settings></code> option.
|
||||
Again note that this does not validate input! Although it detects out of range
|
||||
for the arrays it doesn’t detect duplicates. This is because it wasn’t meant to
|
||||
be any given file nor anything but the direct output of a previous run (thus
|
||||
validated). I’m not even guaranteeing that I got the array tests valid in
|
||||
recode.c -R option!</p>
|
||||
|
||||
<h2><a name="samefile" href="#toc">Protecting against the same I/O file</a></h2>
|
||||
|
||||
<p>Because some file systems are case-insensitive I have implemented a
|
||||
case-insensitive strcmp(); if the input file name is the same as the output file
|
||||
name I won’t write to it. From a quick test this is important particularly if
|
||||
neither file exist because if both calls to stat() fail then the inodes will be
|
||||
the same (since what else could they be set to but the same initial value?).
|
||||
This might be overprotective but I believe it better to prevent user error where
|
||||
possible. Of course if neither file exists it might be argued that it’s not
|
||||
necessary to worry since you can’t read from a file that doesn’t exist. But then
|
||||
what about if one exists but the other does not?</p>
|
||||
|
||||
<h2><a name="fileoptions" href="#toc">File options parser limitation</a></h2>
|
||||
|
||||
<p>Due to the way the parsing of options is done (no spaces between option char and
|
||||
argument) shell expansion will not work right so for example doing:</p>
|
||||
|
||||
<pre><code>$ ./recode -R~/config
|
||||
</code></pre>
|
||||
|
||||
<p>Will not read the file ‘config’ in the home directory. I show another way to
|
||||
achieve this later.</p>
|
||||
|
||||
<p>This limitation also applies to the <code>-f</code> and <code>-o</code> options!</p>
|
||||
|
||||
<h2><a name="validation" href="#toc">-R option validation?</a></h2>
|
||||
|
||||
<p>Again the <code>-R</code> option does not validate input. For validation you have to run
|
||||
the program interactively.</p>
|
||||
|
||||
<h1><a name="pipingtorecode" href="#toc">Piping commands to recode</a></h1>
|
||||
|
||||
<p>If stdin is not a tty (<code>!isatty(0)</code>) and neither randomised mode nor reading in
|
||||
from a file is specified then you might just see something like:</p>
|
||||
|
||||
<pre><code> $ echo testing test tests | ./recode
|
||||
1AB2BB3CC1testing test tests
|
||||
|
||||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null
|
||||
mfrwxan lzng ofnlu
|
||||
|
||||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null | ./recode
|
||||
1AB2BB3CC1mfrwxan lzng ofnlu
|
||||
|
||||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null | ./recode | ./prog - 2>/dev/null
|
||||
testing test tests
|
||||
</code></pre>
|
||||
|
||||
<p>In other words just the defaults. This was to simplify the problems with
|
||||
prompting again for input if it’s invalid (though as you’ll see it does a good
|
||||
job at this anyway).</p>
|
||||
|
||||
<h1><a name="pipingtoenigma" href="#toc">Piping recode to the Enigma simulator</a></h1>
|
||||
|
||||
<p>If you’re using recode to recode the input so you don’t have to type in the
|
||||
input manually (if you randomise or read in from previously saved file no input
|
||||
need be done at all) then make sure to redirect stderr to /dev/null. If you
|
||||
don’t you might see something like:</p>
|
||||
|
||||
<pre><code> $ ./recode -r | ./prog -
|
||||
Ring 1: IOCCC
|
||||
Setting 1: Position 1: Ring 2: Setting 2: Position 2: Ring 3: Setting 3: Position 3: Reflector: Plugboard pair 1: Plugboard pair 2: Plugboard pair 3: Plugboard pair 4: Plugboard pair 5: Plugboard pair 6: Plugboard pair 7: Plugboard pair 8: Plugboard pair 9: Plugboard pair 10: DEVIY
|
||||
</code></pre>
|
||||
|
||||
<p>What happened is that <code>Ring 1:</code> is printed to stderr but since it’s not been
|
||||
redirected to /dev/null it prints this out; at this point however it prompts for
|
||||
input. Why or how it shows the first prompt instead of later on I do not know.
|
||||
Anyway at this point the simulator is already expecting input to en/decipher.
|
||||
That’s why after I sent EOF it printed out the remaining strings to stderr.</p>
|
||||
|
||||
<h1><a name="manuallytest" href="#toc">Manually test the recode program with the Enigma program</a></h1>
|
||||
|
||||
<pre><code> $ cat input
|
||||
IOCCC
|
||||
|
||||
$ ./recode -finput
|
||||
Rotors:
|
||||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||||
Input rotor 1 (1 - 5): 1
|
||||
Input rotor 2 (1 - 5): 2
|
||||
Input rotor 3 (1 - 5): 3
|
||||
Input setting 1 (A - Z): A
|
||||
Input setting 2 (A - Z): A
|
||||
Input setting 3 (A - Z): A
|
||||
Input position 1 (A - Z): A
|
||||
Input position 2 (A - Z): A
|
||||
Input position 3 (A - Z): A
|
||||
Reflector:
|
||||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||||
Input reflector (1 - 2): 2
|
||||
Input plugboard pair 1: AB
|
||||
Input plugboard pair 2: CD
|
||||
Input plugboard pair 3: ..
|
||||
Input plugboard pair 4: EF
|
||||
Input plugboard pair 5: GH
|
||||
Input plugboard pair 6: IJ
|
||||
Input plugboard pair 7: KL
|
||||
Input plugboard pair 8: MN
|
||||
Input plugboard pair 9: OP
|
||||
Input plugboard pair 10: QR
|
||||
1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC
|
||||
</code></pre>
|
||||
|
||||
<p>Notice that I skipped a plugboard pair; this can be done in a number of ways but
|
||||
two dots is one. Notice also that it’s in a different order than the simulator:
|
||||
because with the size restrictions on my entry I saved bytes by using the same
|
||||
loop where I could. It just felt more natural to have them grouped together in a
|
||||
configurator for the simulator.</p>
|
||||
|
||||
<pre><code> $ echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC | ./prog - 2>/dev/null
|
||||
HQNVO
|
||||
$ echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC | ./prog - 2>/dev/null | echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRHQNVO | ./prog - 2>/dev/null
|
||||
IOCCC
|
||||
</code></pre>
|
||||
|
||||
<p>As you can see the recode program prompts for the settings and outputs the
|
||||
input for the Enigma program. I then copied/pasted that output to the program
|
||||
and got the result HQNVO.</p>
|
||||
|
||||
<p>Following this I piped the original output (of recode) to the simulator and then
|
||||
piped that to the echo of the input settings (replacing the IOCCC with the
|
||||
Enigma enciphered output) and then got the result IOCCC: the original input!
|
||||
(This was before I implemented the <code>-R</code> option to greatly simplify things.)</p>
|
||||
|
||||
<p>Of course the last command was redundant in that I didn’t need to show the first
|
||||
part again; I could have just done the latter part but I wanted to show the way
|
||||
the pipeline works with settings etc.</p>
|
||||
|
||||
<p>What happens if the plugboard pairs are the same but in a different order? It’s
|
||||
the same output:</p>
|
||||
|
||||
<pre><code> $ echo 1AA2AA3AA2AB..CDEFGHIJKLMNOPQRIOCCC|./prog - 2>/dev/null
|
||||
HQNVO
|
||||
</code></pre>
|
||||
|
||||
<p>Also if you flip the order of the letters in the pair e.g. the AB as BA instead:</p>
|
||||
|
||||
<pre><code> $ echo 1AA2AA3AA2BA..CDEFGHIJKLMNOPQRIOCCC|./prog - 2>/dev/null
|
||||
HQNVO
|
||||
</code></pre>
|
||||
|
||||
<h1><a name="onlyconfig" href="#toc">Only write config file</a></h1>
|
||||
|
||||
<pre><code> $ ./recode -v -oconfig -finput >/dev/null
|
||||
Rotors:
|
||||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||||
Input rotor 1 (1 - 5): 1
|
||||
Input rotor 2 (1 - 5): 2
|
||||
Input rotor 3 (1 - 5): 3
|
||||
Input setting 1 (A - Z): A
|
||||
Input setting 2 (A - Z): C
|
||||
Input setting 3 (A - Z): E
|
||||
Input position 1 (A - Z): B
|
||||
Input position 2 (A - Z): D
|
||||
Input position 3 (A - Z): F
|
||||
Reflector:
|
||||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||||
Input reflector (1 - 2): 2
|
||||
Input plugboard pair 1: AB
|
||||
Input plugboard pair 2: CD
|
||||
Input plugboard pair 3: EF
|
||||
Input plugboard pair 4: GHIJ
|
||||
Input plugboard pair 5: IJ
|
||||
Input plugboard pair 6: KL
|
||||
Input plugboard pair 7: MN
|
||||
Input plugboard pair 8: OP
|
||||
Input plugboard pair 9: QR
|
||||
Input plugboard pair 10: ST
|
||||
Ring 1: ( I) EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||||
Ring 2: ( II) AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||||
Ring 3: (III) BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||||
Ring settings: ACE
|
||||
Ring positions: BDF
|
||||
Reflector: (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||||
Plugboard pair #01: AB
|
||||
Plugboard pair #02: CD
|
||||
Plugboard pair #03: EF
|
||||
Plugboard pair #04: GH
|
||||
Plugboard pair #05: IJ
|
||||
Plugboard pair #06: KL
|
||||
Plugboard pair #07: MN
|
||||
Plugboard pair #08: OP
|
||||
Plugboard pair #09: QR
|
||||
Plugboard pair #10: ST
|
||||
</code></pre>
|
||||
|
||||
<p>Notice that I redirect stdout to /dev/null so that the config is only written to
|
||||
the file config. But also notice that for plugboard pair 4 I typed in <code>GHIJ</code> and
|
||||
it didn’t report an error. Neither did it complain about <code>IJ</code> in the next pair.
|
||||
This is because it consumes input overflow.</p>
|
||||
|
||||
<p>It shouldn’t be this way for the simulator though because that could cause
|
||||
inconsistent number of characters expected before the text to encipher.</p>
|
||||
|
||||
<pre><code> $ cat config
|
||||
1AB2CD3EF2ABCDEFGHIJKLMNOPQRST
|
||||
|
||||
$ ( cat config ; cat input ) | ./prog - 2>/dev/null
|
||||
LRAVE
|
||||
|
||||
$ ( cat config ; cat input ) | ./prog - 2>/dev/null | ( cat config ; echo LRAVE ) | ./prog - 2>/dev/null
|
||||
IOCCC
|
||||
</code></pre>
|
||||
|
||||
<p>What if you don’t want to worry about having to specify input but just have the
|
||||
settings written? You can do that too by either sending a newline or else
|
||||
directly type ctrl-d (or whatever you have EOF set to) or give it an empty file.</p>
|
||||
|
||||
<p>The following are all equivalent in that they will write to a settings file (the
|
||||
first one will print a newline with the echo but that won’t matter):</p>
|
||||
|
||||
<pre><code> $ echo | ./recode -r -osettings
|
||||
$ echo -n | ./recode -r -osettings
|
||||
$ > empty
|
||||
$ ./recode -r -osettings < empty
|
||||
$ cat empty | ./recode -r -osettings
|
||||
$ ./recode -r -osettings
|
||||
^D
|
||||
</code></pre>
|
||||
|
||||
<p>(Above ^D was not shown but I typed it.) The way it works: if nothing is read
|
||||
the buffer remains NULL and so I don’t print it but still do print the settings
|
||||
file. Actually even if getdelim() fails you’re supposed to free the buffer so I
|
||||
set another variable to indicate if it should be printed.</p>
|
||||
|
||||
<h1><a name="reuseconfig" href="#toc">Reusing a configuration</a></h1>
|
||||
|
||||
<pre><code> $ echo -n|./recode -r -oconfig
|
||||
4UH5II1RJ1SPIFEJLYGZWRTBHVCAMN$
|
||||
|
||||
$ cat input.txt
|
||||
IOCCC 2020 Enigma simulator example text file
|
||||
|
||||
This is a sentence.
|
||||
|
||||
This is another sentence.
|
||||
|
||||
$ ( cat config ; cat input.txt ) | ./prog - 2>/dev/null > output
|
||||
$ cat output
|
||||
AAPRT 2020 Dkemny tpgnjsjai xpovrgl jvgs wxra
|
||||
|
||||
Fytt ly m xyiilaqh.
|
||||
|
||||
Ybbp ox dmuzerm oscwgytb.
|
||||
$ ( cat config ; cat output ) | ./prog - 2>/dev/null > io
|
||||
$ diff io input.txt
|
||||
$
|
||||
</code></pre>
|
||||
|
||||
<p>Alternatively you can just use the <code>-R</code> and <code>-f</code> options:</p>
|
||||
|
||||
<pre><code> $ ./recode -finput.txt -Rconfig | ./prog - 2>/dev/null > output2
|
||||
$ diff output output2
|
||||
$
|
||||
</code></pre>
|
||||
|
||||
<h1><a name="passtoenigma" href="#toc">Write config file, read data file and pass to Enigma simulator</a></h1>
|
||||
|
||||
<pre><code> $ ./recode -finput.txt -oconfig | ./prog - 2>/dev/null > output
|
||||
Rotors:
|
||||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||||
Input rotor 1 (1 - 5): 2
|
||||
Input rotor 2 (1 - 5): 5
|
||||
Input rotor 3 (1 - 5): 3
|
||||
Input setting 1 (A - Z): C
|
||||
Input setting 2 (A - Z): O
|
||||
Input setting 3 (A - Z): D
|
||||
Input position 1 (A - Z): E
|
||||
Input position 2 (A - Z): L
|
||||
Input position 3 (A - Z): O
|
||||
Reflector:
|
||||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||||
Input reflector (1 - 2): 2
|
||||
Input plugboard pair 1: TR
|
||||
Input plugboard pair 2: SN
|
||||
Input plugboard pair 3: OG
|
||||
Input plugboard pair 4: ME
|
||||
Input plugboard pair 5: XY
|
||||
Input plugboard pair 6: WZ
|
||||
Input plugboard pair 7: UV
|
||||
Input plugboard pair 8: AB
|
||||
Input plugboard pair 9: CD
|
||||
Input plugboard pair 10: FI
|
||||
|
||||
$ cat config
|
||||
2CE5OL3DO2TRSNOGMEXYWZUVABCDFI
|
||||
</code></pre>
|
||||
|
||||
<p>Besides a famous book that I happen to love (who doesn’t? Ah, but what is it
|
||||
Cody?) there’s also a reference to code which I also love (just as all
|
||||
participants of the IOCCC do). But what matters is the output:</p>
|
||||
|
||||
<pre><code> $ cat output
|
||||
DBFAF 2020 Ittejg ltblwriac uqdfqvr dhqh ghhf
|
||||
|
||||
Jsjy ce v pxdmullo.
|
||||
|
||||
Sara tj rtaayak uxfhjcti.
|
||||
|
||||
$ ./recode -Rconfig -foutput | ./prog - 2>/dev/null
|
||||
IOCCC 2020 Enigma simulator example text file
|
||||
|
||||
This is a sentence.
|
||||
|
||||
This is another sentence.
|
||||
</code></pre>
|
||||
|
||||
<h1><a name="directlytoenigma" href="#toc">Piping directly to the Enigma code once (with randomised settings, saved)</a></h1>
|
||||
|
||||
<p>This is like the above only randomised:</p>
|
||||
|
||||
<pre><code> $ ./recode -r -oconfig|./prog - 2>/dev/null
|
||||
IOCCC
|
||||
UGEVP
|
||||
</code></pre>
|
||||
|
||||
<p>Note that I typed in IOCCC and sent EOF (ctrl-d); the settings were written to
|
||||
the config file (for deciphering later) and then all of it was piped to the
|
||||
Enigma entry resulting in the line below IOCCC. But let’s verify it worked out
|
||||
okay:</p>
|
||||
|
||||
<pre><code> $ cat config
|
||||
2BM4GJ3HK1LNCBXWRMGKSYIAZUTPVJ
|
||||
</code></pre>
|
||||
|
||||
<p>Without having to copy/paste intermediate results:</p>
|
||||
|
||||
<pre><code> $ echo IOCCC | ./recode -Rconfig | ./prog - 2>/dev/null | ./recode -Rconfig | ./prog - 2>/dev/null
|
||||
IOCCC
|
||||
</code></pre>
|
||||
|
||||
<p>You can also use a string for the <code>-R</code> option. I’ll use command substitution and
|
||||
actual pasting to demonstrate:</p>
|
||||
|
||||
<pre><code> $ echo IOCCC | ./recode -R$(cat config) | ./prog - 2>/dev/null | ./recode -R2BM4GJ3HK1LNCBXWRMGKSYIAZUTPVJ | ./prog - 2>/dev/null
|
||||
IOCCC
|
||||
</code></pre>
|
||||
|
||||
<h1><a name="conclusion" href="#toc">Usage conclusion</a></h1>
|
||||
|
||||
<p>That should give you an idea of how to use the recode program. I leave it as
|
||||
an exercise to the reader to implement additional features but here are some
|
||||
ideas of what could be done and how this entry might be used (including that
|
||||
delicious challenge).</p>
|
||||
|
||||
<h1><a name="additions" href="#toc">Example additions</a></h1>
|
||||
|
||||
<ul>
|
||||
<li>Add code (to prog.c) that tries to determine possible decipherments based on
|
||||
a given crib (or set of cribs).</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h1><a name="exampleuses" href="#toc">Example uses</a></h1>
|
||||
|
||||
<ul>
|
||||
<li><p>Take an actual key sheet and message for that day and try and decipher the
|
||||
message (might help if you know German!). I haven’t actually done this for
|
||||
reasons I explained in the remarks (including that I cannot easily verify one
|
||||
particular as well as the fact that there were different procedures, different
|
||||
machines etc. - plus my vision is not good enough for the quality of the
|
||||
pictures).</p></li>
|
||||
<li><p>Try making sense of a politician’s speeches by putting them into the
|
||||
simulator. It might not make much sense but can it honestly be that much worse ?
|
||||
:) Actually yes it could be (and we don’t need the Enigma helping them either)
|
||||
and I can think of a whole host of other things more entertaining including
|
||||
watching dry paint stay dry on a wall but why not poke fun at politicians
|
||||
anyway?</p></li>
|
||||
<li><p>Best idea: try the below experiment!</p></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h1><a name="cake" href="#toc">Delicious Enigma: Double-layered Chocolate Fudge Cake</a></h1>
|
||||
|
||||
<p>As I was making the above silly list something occurred to me. My other entries
|
||||
this year include a recipe for a wonderful double-layered chocolate fudge cake
|
||||
but why would it not be included in this one too? But then if that’s the case
|
||||
why on Earth should it be unscrambled?</p>
|
||||
|
||||
<p>So this is what I offer: if you take one of the settings below and run the
|
||||
simulator on the file <a href="chocolate-cake.html">chocolate-cake.html</a> you will have a wonderful
|
||||
chocolate cake recipe (that even my late stepmum who didn’t even like chocolate
|
||||
loved - it’s a speciality of my mum’s and they were the best of friends too). If
|
||||
you’re lazy just go and look at my other entry. Then again if you’re lazy you’re
|
||||
probably not reading this far! :)</p>
|
||||
|
||||
<p>The settings is one of the below but a couple questions you might ask yourself:</p>
|
||||
|
||||
<ol>
|
||||
<li><p>Are any invalid input?</p></li>
|
||||
<li><p>Is there some other kind of trickery involved here?</p></li>
|
||||
</ol>
|
||||
|
||||
|
||||
<p>I can think of the best way to answer these and I think I need not even mention
|
||||
it. Have fun and enjoy! BTW: Depending on where you are in this world and how
|
||||
warm it is the icing can be a bit of an issue - I give some ideas in the file on
|
||||
what can be done for this. At worst though the icing won’t come out as good as
|
||||
it usually does.</p>
|
||||
|
||||
<p>Hints:</p>
|
||||
|
||||
<ol>
|
||||
<li><p>It’s not the middle one.</p></li>
|
||||
<li><p>Yes there are some things kind of spelt here. These include things about
|
||||
cake and chocolate. Some things spelt mean nothing whatever and can be
|
||||
considered coincidences. Some were randomised.</p></li>
|
||||
<li><p>There is an obscure thing about my entry that can help locate the proper key
|
||||
of the 16 given below! The questions are what is it and is is it worth going
|
||||
this way? (I think the second answer is ‘no’ but that’s me.)</p></li>
|
||||
<li><p>The above points might or might not be relevant. What is relevant is one
|
||||
will reveal a wonderful <a href="chocolate-cake.html">Double-layered Chocolate Fudge Cake</a> recipe:</p>
|
||||
|
||||
<pre><code> 142CHOCOLATESVCAKESTBJLKMUMVWX
|
||||
0EZ4PC1CC0PGTAQSOXWNMDRYKFUZEI
|
||||
3UY0XF4QG1GTJQLARPKHBEMCOFVUIN
|
||||
0WE1HK4PL0RVSGXFDKENZYTPCMAHUW
|
||||
2LV0KC1IE0HTFPCLWOJDBQIRVMEAGN
|
||||
1SS4QX2RY1SRAQGKUYHCBLPFJDVTNZ
|
||||
3IW1QR0TZ0GQEDWIYJUPMFZBRAONHS
|
||||
3OP1KN4MO0HPFZCEAKYQIRXGVMOTUW
|
||||
4OC2CC0AK1CODELUVRSNGKIZBJPTMY
|
||||
4MU0MS1CA1KELUVRSXTABJNOCDMQFG
|
||||
0MU4MC2HO1CLATEFBJMONPQRVWXYZD
|
||||
125CHOCOLATESEXCAKESJADFNOPQRS
|
||||
0CH3OC1OL1ATEMBJNOCDLSIFWHRVXY
|
||||
4MU1MS3CA0KECHOLATBJSNPXVUFGZY
|
||||
4VW0SL1YB0IYJSLBECKTNAXGPUVHRF
|
||||
0MC4OH2CO1LATEUMBJCDFGHINOPRQS
|
||||
</code></pre></li>
|
||||
</ol>
|
||||
|
||||
|
||||
<p>BTW: What’s the middle of a list with even numbered items anyway?</p>
|
||||
<BR>
|
||||
<HR>
|
||||
<TABLE><TR>
|
||||
<TD><a rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="/png/by-sa-3.0-88x31.png" /></a></TD>
|
||||
<TD><P>© Copyright 1984-2020,
|
||||
<A HREF="/judges.html">Leo Broukhis, Simon Cooper, Landon Curt Noll</A>
|
||||
- All rights reserved<BR>
|
||||
This work is licensed under a <a rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.</P></TD>
|
||||
<TD> <!--<a href="https://validator.w3.org/check?uri=referer"><img src="https://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Transitional" height="31" width="88"></a>--></TD>
|
||||
</TR></TABLE>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user