Add 2019/yang/try.sh, update bugs.md + formatting

The try.sh script checks that the terminal size is large enough for two
files, the prog.c (last check) and sample_input.txt (provided by the
author). If it's too small for either it exits as it can't work. The
added ioccc.txt is very short in column and rows so that should not be a
problem (except in very extreme cases?).

The sample_input.txt file had trailing newlines removed because it
showed differences in output otherwise (and shouldn't).

The bugs.md was updated - add INABIAF for this entry.

Format/typo check README.md file.
This commit is contained in:
Cody Boone Ferguson committed 2023-12-17 10:35:25 -08:00
1 parent a76d3fde42
commit 9104ac41f3
7 files changed
+236 -42

No files matched your search

+9
View File
@@ -9,6 +9,15 @@ e
indent
indent.c
indent.o
input.txt
original.txt
output.txt
output1.txt
output2.txt
prog
prog.orig
scrambled.txt
scrambled1.txt
scrambled2.txt
scrambled3.txt
unscrambled.txt
+32 -40
View File
@@ -5,6 +5,17 @@ make
```
### Bugs and (Mis)features:
The current status of this entry is:
```
STATUS: INABIAF - please **DO NOT** fix
```
For more detailed information see [2019 yang in bugs.md](/bugs.md#2019-yang).
## To use:
```sh
@@ -25,28 +36,7 @@ cat a b c d | ./prog
### Try:
```sh
./prog prog.c a b c d e
cat a
cat b
cat c
cat d
cat e
cat a b c d e | ./prog
cat a b c d e | ./prog | diff - prog.c
./prog prog.c | ruby prog.c
./prog violet.c | ruby prog.c
./prog violet.c | ruby violet.c
./try.sh
```
@@ -108,13 +98,13 @@ can simply use `cat` to unscramble the output text.
cat output.txt
```
It might seem like nothing was scrambled, but you can try passing the
output through `strings(1)` and see that most of the original strings
are gone. What happened is that the original text has been shuffled
with ANSI cursor positioning codes inserted such that characters are
printed in random order. This effect is more visible if there is a
delay after each character is printed. For convenience, a utility is
included in the source to output characters slowly:
It might seem like nothing was scrambled, but you can try passing the output
through `strings(1)` and see that most of the original strings are gone. What
happened is that the original text has been shuffled with ANSI cursor
positioning codes inserted in such a way that characters are printed in random
order. This effect is more visible if there is a delay after each character is
printed. For convenience, a utility is included in the source to output
characters slowly:
```sh
./prog input.txt | ruby prog.c
@@ -146,14 +136,14 @@ For files that are larger than your terminal window, `cat` will not be
sufficient for unscrambling because any scrolling causes the character
positions to be misaligned. But fear not, this utility also includes
unscrambling functionality. If no argument is specified, input will
be read through stdin and unscrambled to stdout:
be read through `stdin` and unscrambled to `stdout`:
```sh
./prog < scrambled.txt > unscrambled.txt
```
Where this is useful is that if you scramble the input to multiple
files and unscramble each output files individually, those output
files and unscramble each output file individually, those output
files can be printed on transparencies and distributed separately.
```sh
@@ -181,8 +171,8 @@ A simple text scrambling utility might not have required a screenful
of code, but this particular one natively supports UTF-8.
Specifically: individual UTF-8 byte sequences will not be split into
broken ones, and the utility is aware of full-width versus half-width
differences such that cursor is positioned correctly for most CJK
input. `sample_input.txt` demonstrates this feature with a mix of
differences such that the cursor is positioned correctly for most CJK
input. [sample_input.txt](sample_input.txt) demonstrates this feature with a mix of
Basic Latin and Japanese characters.
Output cursor positions will most definitely be wrong for inputs
@@ -191,17 +181,19 @@ be possible to unscramble those text back to the original using this
same utility, since the utility is self-consistent in how cursor
positions are handled.
### Error handling
If any file can not be opened for reading or writing, an error is
printed to stderr, and the utility will exit with nonzero status.
printed to `stderr`, and the utility will exit with nonzero status.
If there isn't enough memory, the utility will likely crash.
If input contains CR-LF end of line sequences, those CRs are silently
If input contains CR-LF end of line sequences, those `CR`s are silently
dropped. In fact, most control codes are silently ignored except line
feeds (preserved) and tabs (expanded to 8 spaces).
### Compatibility
Verified to work and compiles without warnings on these environments:
@@ -212,13 +204,13 @@ Verified to work and compiles without warnings on these environments:
* clang 5.0.1 on Cygwin
* gcc 4.8.4 on Linux
### Full version
I tried really hard to make `prog.c` fit in a 80x25 terminal without
wrapping. If I were not constrained by space, I would have made an
ASCII art out of it. `violet.c` is that program, and also comes with
the minor benefit of supporting lines longer than a million columns
depending on `sizeof(int)`.
I tried really hard to make `prog.c` fit in a 80x25 terminal without wrapping.
If I were not constrained by space, I would have made an ASCII art out of it.
[violet.c](violet.c) is that program, and also comes with the minor benefit of
supporting lines longer than a million columns depending on `sizeof(int)`.
Violet is named after [Violet
Evergarden](https://en.wikipedia.org/wiki/Violet_Evergarden) in the story with
+4
View File
@@ -0,0 +1,4 @@
IOCCC 2019 Most
in need of
transparency
by Don Yang!
-2
View File
@@ -11,5 +11,3 @@
あぁ おおo ぉオオ しい シシシシシシ CCCCc cCc
ぁあ おぉおぉお しぃしぃしっ シシシシ CCCCccCCC
(*゚ー゚)
+168
View File
@@ -0,0 +1,168 @@
#!/usr/bin/env bash
#
# try.sh - demonstrate IOCCC winner 2019/yang
#
# 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 scramble ioccc.txt into five files: "
echo 1>&2
echo "$ ./prog ioccc.txt a b c d e" 1>&2
./prog ioccc.txt a b c d e
read -r -n 1 -p "Press any key to unscramble part a with cat: "
clear
cat a
read -r -n 1 -p "Press any key to unscramble part b with cat: "
clear
cat b
read -r -n 1 -p "Press any key to unscramble part c with cat: "
clear
cat c
read -r -n 1 -p "Press any key to unscramble part d with cat: "
clear
cat d
read -r -n 1 -p "Press any key to unscramble part e with cat: "
clear
cat e
echo "$ cat a b c d e | ./prog" 1>&2
read -r -n 1 -p "Press any key to unscramble all parts: "
echo 1>&2
cat a b c d e | ./prog
echo 1>&2
echo "$ cat a b c d e | ./prog | diff - ioccc.txt" 1>&2
read -r -n 1 -p "Press any key to continue: "
echo 1>&2
cat a b c d e | ./prog | diff -s - ioccc.txt
LINES="$(tput lines)"
COLS="$(tput cols)"
if [[ "$COLS" -lt 75 || "$LINES" -lt 13 ]]; then
# if screen size < 75 x 13 then exit
exit 0
fi
read -r -n 1 -p "Press any key to scramble sample_input.txt into five files: "
echo 1>&2
echo "$ ./prog sample_input.txt a b c d e" 1>&2
./prog sample_input.txt a b c d e
read -r -n 1 -p "Press any key to unscramble part a with cat: "
clear
cat a
read -r -n 1 -p "Press any key to unscramble part b with cat: "
clear
cat b
read -r -n 1 -p "Press any key to unscramble part c with cat: "
clear
cat c
read -r -n 1 -p "Press any key to unscramble part d with cat: "
clear
cat d
read -r -n 1 -p "Press any key to unscramble part e with cat: "
clear
cat e
echo "$ cat a b c d e | ./prog" 1>&2
read -r -n 1 -p "Press any key to unscramble all parts: "
echo 1>&2
cat a b c d e | ./prog
echo 1>&2
echo "$ cat a b c d e | ./prog | diff - sample_input.txt" 1>&2
read -r -n 1 -p "Press any key to continue: "
echo 1>&2
cat a b c d e | ./prog | diff -s - sample_input.txt
if [[ "$COLS" -lt 80 || "$LINES" -lt 25 ]]; then
# if screen size < 80 x 25 then exit
exit 0
fi
read -r -n 1 -p "Press any key to run: cat prog.c: "
echo 1>&2
cat prog.c
echo 1>&2
read -r -n 1 -p "Press any key to scramble prog.c into five files: "
echo 1>&2
echo "$ ./prog prog.c a b c d e" 1>&2
./prog prog.c a b c d e
read -r -n 1 -p "Press any key to unscramble part a with cat: "
clear
cat a
read -r -n 1 -p "Press any key to unscramble part b with cat: "
clear
cat b
read -r -n 1 -p "Press any key to unscramble part c with cat: "
clear
cat c
read -r -n 1 -p "Press any key to unscramble part d with cat: "
clear
cat d
read -r -n 1 -p "Press any key to unscramble part e with cat: "
clear
cat e
echo "$ cat a b c d e | ./prog" 1>&2
read -r -n 1 -p "Press any key to unscramble all parts: "
echo 1>&2
cat a b c d e | ./prog
echo 1>&2
echo "$ cat a b c d e | ./prog | diff - prog.c" 1>&2
read -r -n 1 -p "Press any key to continue: "
echo 1>&2
cat a b c d e | ./prog | diff -s - prog.c
# For the next three we have to see if ruby is installed
RUBY="$(type -P ruby)"
if [[ -n "$RUBY" ]]; then
read -r -p "Do you want to see the slow scrambling: ./prog prog.c | ruby prog.c (Y/N)? "
if [[ "$REPLY" == "y" || "$REPLY" == "Y" ]]; then
echo "This may take a while, hit ctrl-c to exit script." 1>&2
echo 1>&2
./prog prog.c | ruby prog.c
fi
read -r -p "Do you want to see the slow scrambling: ./prog violet.c | ruby prog.c (Y/N)? "
if [[ "$REPLY" == "y" || "$REPLY" == "Y" ]]; then
echo "This may take a while, hit ctrl-c to exit script." 1>&2
echo 1>&2
./prog violet.c | ruby prog.c
fi
read -r -p "Do you want to see the slow scrambling: ./prog violet.c | ruby violet.c (Y/N)? "
if [[ "$REPLY" == "y" || "$REPLY" == "Y" ]]; then
echo "This may take a while, hit ctrl-c to exit script." 1>&2
echo 1>&2
./prog violet.c | ruby violet.c
fi
fi
+15
View File
@@ -3401,6 +3401,21 @@ This program will not validate input so it might fail or get stuck if invoked
erroneously.
## 2019 yang
### STATUS: INABIAF - please **DO NOT** fix
### Source code: [2019/yang/prog.c](2019/yang/prog.c)
### Information: [2019/yang/README.md](2019/yang/README.md)
The author noted that if the program runs out of memory it is likely to crash.
The author also stated that 'if input contains CR-LF end of line sequences,
those `CR`s are silently dropped. In fact, most control codes are silently
ignored except line feeds (preserved) and tabs (expanded to 8 spaces).'
# 2020
+8
View File
@@ -4212,6 +4212,14 @@ He also added the script [try.sh](/2019/karns/try.sh) to showcase the entry a
bit more easily.
## <a name="2019_yang"></a>[2019/yang](/2019/yang/prog.c) ([README.md](/2019/yang/README.md]))
[Cody](#cody) added the [try.sh](/2019/yang/try.sh) script which also involved
slightly updating the [sample_input.txt](/2019/yang/sample_input.txt) file
(removed trailing newlines as it resulted in `diff` showing differences when it
shouldn't) and adding the [ioccc.txt](/2019/yang/ioccc.txt) file.
# <a name="2020"></a>2020