Add 2014/endoh1/try.sh, fix rake.sh, format/typos
The rake.sh script had a typo where '1>&2' was just '1>2'. The README.md and spoilers.md files were format and typo checked. I believe this should complete 2014/endoh1.
This commit is contained in:
1 parent
4a946614e8
commit
539e1dce7f
5 files changed
+109
-48
No files matched your search
+13
-18
@@ -15,25 +15,18 @@ make
|
||||
### Try:
|
||||
|
||||
```sh
|
||||
./prog > main.c
|
||||
|
||||
make main
|
||||
./main Hello
|
||||
./try.sh
|
||||
```
|
||||
|
||||
Also try:
|
||||
|
||||
```sh
|
||||
make rake
|
||||
```
|
||||
|
||||
which will run the [rake.sh](rake.sh) script and then `prog` if all is built
|
||||
okay. If `rake` is not installed then it will check that `gem` is installed. If
|
||||
`gem` is not installed it will tell you where to get it and then tell you how to
|
||||
install `rake`. Otherwise, if `rake` is installed it will try running `rake `
|
||||
and if that fails to run it will tell you to run a `gem` command as either root
|
||||
or via sudo and then to try running `make rake` or `./rake.sh` again. If `rake`
|
||||
succeeds it will run `./prog` which can be used to build `main.c`.
|
||||
The script will ask you if you wish to run `make rake` but this is not necessary
|
||||
to fully enjoy the entry. `make rake` will run the [rake.sh](rake.sh) script and
|
||||
then `prog` if all is built okay. If `rake` is not installed then it will check
|
||||
that `gem` is installed. If `gem` is not installed it will tell you where to get
|
||||
it and then tell you how to install `rake`. Otherwise, if `rake` is installed it
|
||||
will try running `rake ` and if that fails to run it will tell you to run a
|
||||
`gem` command as either root or via sudo and then to try running `make rake` or
|
||||
`./rake.sh` again. If `rake` succeeds it will run `./prog` which can be used to
|
||||
build `main.c`.
|
||||
|
||||
What is the difference between running `./prog` and `main`?
|
||||
|
||||
@@ -64,9 +57,11 @@ more than 1000 words.
|
||||
|
||||
## Author's remarks:
|
||||
|
||||
|
||||
### Remarks
|
||||
|
||||
You may want to use a large display with a very small-font terminal.
|
||||
You may want to use a large display with a very small terminal font.
|
||||
|
||||
|
||||
### Spoiler
|
||||
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ if ! type -P rake >/dev/null 2>&1; then
|
||||
else
|
||||
echo "Please run the following command as root or via sudo:" 1>&2
|
||||
echo ""
|
||||
echo " gem install rake" 1>2
|
||||
echo " gem install rake" 1>&2
|
||||
echo "" 1>&2
|
||||
echo "and then try running make rake or running $0 again" 1>&2
|
||||
fi
|
||||
|
||||
+29
-20
@@ -7,8 +7,8 @@ requires a bit stream, Reed-Solomon codes, BCH codes, data relocation, big (and
|
||||
irregular!) numerical tables, human-oriented pattern arrangement (difficult to
|
||||
implement by a small program), etc.
|
||||
|
||||
On the other hand, a quine has a big restriction:
|
||||
it needs to have two copies of the program!
|
||||
On the other hand, a quine has a big restriction: it needs to have two copies of
|
||||
the program!
|
||||
|
||||
Do you think that it is possible to write QR code encoder in C within *1kB*?
|
||||
|
||||
@@ -18,7 +18,9 @@ Do you think that it is possible to write QR code encoder in C within *1kB*?
|
||||
It is known that we can mitigate the quine restriction by `eval`.
|
||||
For example, this is a quine written in Ruby:
|
||||
|
||||
eval s="print 'eval s='; p s"
|
||||
```ruby
|
||||
eval s="print 'eval s='; p s"
|
||||
```
|
||||
|
||||
Note that `print` appears just once in the program.
|
||||
|
||||
@@ -29,8 +31,10 @@ char s[]="<main code>int main() { <VM code> }";
|
||||
int main() { <VM code>; }
|
||||
```
|
||||
|
||||
* `<VM code>` : An own VM implementation (written in C) that executes the main code
|
||||
* `<main code>` : An object code of quine and QR code encoder (written in the assembly language of the VM)
|
||||
* `<VM code>` : An own VM implementation (written in C) that executes the main
|
||||
code.
|
||||
* `<main code>` : An object code of quine and QR code encoder (written in the
|
||||
assembly language of the VM).
|
||||
|
||||
`<main code>` (about 1100 bytes) appears once and `<VM code>` (about 450 bytes)
|
||||
appears twice. So the whole code is about 1100 + 450 * 2 = 2000 bytes. Hooray!
|
||||
@@ -45,7 +49,7 @@ code>` and `<VM code>`.
|
||||
* 21 integer registers access
|
||||
* read, write, inc-and-read, dec-and-read
|
||||
* Binary operations
|
||||
* add, sub, mul, div, mod, xor, less than, equal, rshift
|
||||
* add, sub, mul, div, mod, xor, less than, equal, right shift
|
||||
* Stack operation
|
||||
* push (an immediate value)
|
||||
* Heap access
|
||||
@@ -55,10 +59,11 @@ code>` and `<VM code>`.
|
||||
* Misc.
|
||||
* putchar, exit
|
||||
|
||||
The instructions have variable length, but many of them are represented as one
|
||||
printable character. (See `machine.rb` and `assemble.rb` in detail.) The
|
||||
mapping between instructions and characters is also carefully designed to
|
||||
minimize `<VM code>`, which makes the resulted program non-human-readable.
|
||||
The instructions have variable lengths, but many of them are represented as one
|
||||
printable character. (See [machine.rb](machine.rb) and
|
||||
[assemble.rb](assemble.rb) in detail.) The mapping between instructions and
|
||||
characters is also carefully designed to minimize `<VM code>`, which makes the
|
||||
resulted program non-human-readable.
|
||||
|
||||
|
||||
## How did I create the main code?
|
||||
@@ -126,30 +131,34 @@ $ rake
|
||||
|
||||
I checked that the following QR code readers can read the output of my program.
|
||||
|
||||
* Linux: [ZBar bar code reader][1]
|
||||
* Linux: [ZBar bar code reader][1].
|
||||
|
||||
### 2023 note from the judges:
|
||||
|
||||
The author also tested an Android app called Barcode Scanner] which used to be
|
||||
### A note from the judges in 2023:
|
||||
|
||||
The author also tested an Android app called Barcode Scanner which used to be
|
||||
found at
|
||||
`https://play.google.com/store/apps/details?id=com.google.zxing.client.android`
|
||||
but it appears to no longer exist.
|
||||
|
||||
[1]: http://zbar.sourceforge.net/
|
||||
|
||||
You can use `tool.rb` to convert the output to a png file.
|
||||
You can use [tool.rb](tool.rb) to convert the output to a png file.
|
||||
|
||||
$ ./main Hello | ruby tool.rb > hello.png
|
||||
```sh
|
||||
./main Hello | ruby tool.rb > hello.png
|
||||
|
||||
$ zbarimg -q hello.png
|
||||
QR-Code:Hello
|
||||
$ zbarimg -q hello.png
|
||||
QR-Code:Hello
|
||||
|
||||
$ ruby tool.rb prog.c
|
||||
$ ruby tool.rb prog.c | ruby tool.rb
|
||||
```
|
||||
|
||||
$ ruby tool.rb prog.c
|
||||
$ ruby tool.rb prog.c | ruby tool.rb
|
||||
|
||||
## Limitations
|
||||
|
||||
* QR code error correction level is fixed to L (Low).
|
||||
* It supports only byte mode (not numeric, alphanumeric, kanji mode...)
|
||||
* It supports only byte mode (not numeric, alphanumeric, kanji mode...).
|
||||
* The mask pattern is fixed to 4.
|
||||
* The mask is not applied to the remained bits.
|
||||
Executable
+54
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# try.sh - demonstrate IOCCC winner 2014/endoh1
|
||||
#
|
||||
|
||||
# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
|
||||
# this way allows us to have the user specify a different compiler in an easy
|
||||
# way.
|
||||
if [[ -z "$CC" ]]; then
|
||||
CC="cc"
|
||||
fi
|
||||
|
||||
make CC="$CC" all >/dev/null || exit 1
|
||||
|
||||
# clear screen after compilation so that only the entry is shown
|
||||
clear
|
||||
|
||||
read -r -n 1 -p "Press any key to show prog.c (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
less -EXF prog.c
|
||||
echo 1>&2
|
||||
|
||||
read -r -n 1 -p "Press any key to run: ./prog: "
|
||||
echo 1>&2
|
||||
./prog
|
||||
echo 1>&2
|
||||
|
||||
read -r -n 1 -p "Press any key to run: ./prog > main.c: "
|
||||
echo 1>&2
|
||||
./prog > main.c
|
||||
read -r -n 1 -p "Press any key to run: make main: "
|
||||
echo 1>&2
|
||||
make main
|
||||
|
||||
read -r -n 1 -p "Press any key to run: ./main IOCCC: "
|
||||
echo 1>&2
|
||||
./main IOCCC
|
||||
echo 1>&2
|
||||
|
||||
read -r -n 1 -p "Press any key to run: ./main Hello: "
|
||||
echo 1>&2
|
||||
./main Hello
|
||||
echo 1>&2
|
||||
|
||||
read -r -n 1 -p "Press any key to run: ./prog IOCCC: "
|
||||
echo 1>&2
|
||||
./prog IOCCC
|
||||
|
||||
echo 1>&2
|
||||
|
||||
read -r -p "Do you want to run make rake (Y/N)? "
|
||||
if [[ "$REPLY" == "y" || "$REPLY" == "Y" ]]; then
|
||||
make rake 2>/dev/null
|
||||
fi
|
||||
+12
-9
@@ -3688,18 +3688,21 @@ that was fixed and it also has `#include <stdio.h>` for `putchar(3)`. The
|
||||
|
||||
## [2014/endoh1](2014/endoh1/prog.c) ([README.md](2014/endoh1/README.md]))
|
||||
|
||||
[Cody](#cody) added the [rake.sh](2014/endoh1/rake.sh) script and `make rake` rule that
|
||||
runs the script. This script will check that `rake` is installed and if it is
|
||||
not it will report this and then check that `gem` is installed. It checks that
|
||||
`gem` is installed in this case because `gem` is how you install `rake`. If
|
||||
`gem` is not installed it tells you to get it along with how to install `gem`.
|
||||
Then it tells you how to install `rake`. If `rake` fails to run then it tells
|
||||
you to install a specific gem and then to try again. Finally if `rake` succeeds
|
||||
it will verify that `prog` is executable and if it is it will run it.
|
||||
[Cody](#cody) added the [rake.sh](2014/endoh1/rake.sh) script and `make rake`
|
||||
rule that runs the script. This script will check that `rake` is installed and
|
||||
if it is not it will report this and then check that `gem` is installed. It
|
||||
checks that `gem` is installed in this case because `gem` is how you install
|
||||
`rake`. If `gem` is not installed it tells you to get it along with how to
|
||||
install `gem`. Then it tells you how to install `rake`. If `rake` fails to run
|
||||
then it tells you to install a specific gem and then to try again. Finally if
|
||||
`rake` succeeds it will verify that `prog` is executable and if it is it will
|
||||
run it.
|
||||
|
||||
Cody also added the [try.sh](2014/endoh1/try.sh) script.
|
||||
|
||||
**_Barely_** worth noting but done nonetheless, Cody renamed the `read_me.md`
|
||||
file to [spoilers.md](2014/endoh1/spoilers.md) to be clearer in its purpose as
|
||||
it is a file with spoilers.
|
||||
it is a file with spoilers (and too close to README.md?).
|
||||
|
||||
|
||||
## [2014/maffiodo1](2014/maffiodo1/prog.c) ([README.md](2014/maffiodo1/README.md]))
|
||||
|
||||
Reference in new issue
Block a user