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:
1 parent
a76d3fde42
commit
9104ac41f3
7 files changed
+236
-42
No files matched your search
@@ -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
@@ -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
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
IOCCC 2019 Most
|
||||
in need of
|
||||
transparency
|
||||
by Don Yang!
|
||||
@@ -11,5 +11,3 @@
|
||||
あぁ おおo ぉオオ しい シシシシシシ CCCCc cCc
|
||||
ぁあ おぉおぉお しぃしぃしっ シシシシ CCCCccCCC
|
||||
(*゚ー゚)
|
||||
|
||||
|
||||
Executable
+168
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user