From d7e73b4f38b1a2e12b64c1736725e51635efd13b Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:57:56 -0800 Subject: [PATCH] Format/typo check 2012/kang + update try.sh --- 2012/kang/README.md | 51 ++++++++++++++++++++++++--------------------- 2012/kang/try.sh | 13 +++++++----- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/2012/kang/README.md b/2012/kang/README.md index 9a2cf1777..1b1edee7d 100644 --- a/2012/kang/README.md +++ b/2012/kang/README.md @@ -5,7 +5,7 @@ make ``` There is alternate code which fixes some German at the expense of other German. -See [Alternate code](#alternate-code) below. +See [Alternate code](#alternate-code) below for the (fun) rationale here. ## To use: @@ -35,8 +35,8 @@ This alternate code fixes the program that would throw off those who know German where the sound of 'V' is 'F' and so the program had the letter be 'F'. A problem, however, with changing it is that it breaks other words including in German. Thus there is the alternate version instead which fixes a problem for -Germans that causes other problems for Germans so if you're German you'll just -have to deal with it :-) It is, however, good as you can appreciate the entry +Germans that causes problems for Germans so if you're German you'll just have to +deal with it :-) It is, however, good as you might be able appreciate the entry even more. @@ -107,10 +107,10 @@ It accepts a variety of spelt numbers: * It correctly handles `zero`. * Hyphen does not make a difference: `forty-two` and `forty two` are same. So does period or comma. -* Cases do not make a difference either: `TWO`, `Two`, `two` are same. -* `one` and `a` are interchangeable: `one hundred` and `a hundred` are same. +* Cases do not make a difference either: `TWO`, `Two`, `two` are the same. +* `one` and `a` are interchangeable: `one hundred` and `a hundred` are the same. * `and` is optional: `one hundred twenty-three` and `one hundred and twenty-three` - are same. + are the same. * It supports every non-negative integer less than 1015-1. It uses the small scale (i.e. American): `billion` is 109 and `trillion` is 1012. @@ -121,13 +121,14 @@ It does *not* accept some spelt numbers, which I found mostly irrelevant: * A bare `hundred`, `thousand` etc. do not work. * `one million million` does not work. Get used to `one trillion`! + ### Requirements This program is quite portable, only requiring the following: * The signature `int main(int, int)` should be accepted by the linker. (Original version only). -* `char` should be at least 8 bits long (as dictated by the standard), `int` +* `char` should be at least 1 byte long (as dictated by the standard), `int` should be at least 32 bits long, `long long` should be at least 64 bits long. * Both the compiler and execution environment should use an ASCII-compatible character set and two's complement representation. @@ -136,16 +137,18 @@ This program is quite portable, only requiring the following: [trustingtrust]: http://cm.bell-labs.com/who/ken/trust.html -The design of the program explicitly allows for `EOF` which does not equal to -1 -(it has to be negative per the standard) and both signed and unsigned `char`, -for example. Furthermore it is endian-independent. +The design of the program explicitly allows for `EOF` even if it does not equal +`-1` (it has to be negative per the standard but not necessarily `-1`) and both +`signed char` and `unsigned char`, for example. Furthermore it is +endian-independent. + ### Obfuscations (SPOILERS!) Many obfuscations used are typical for standard IOCCC entries: -* Two arguments from `main` function are reused as normal variables. -* Every conditional has been replaced with `?:` ternary operator and `||` +* Two arguments from `main()` function are reused as normal variables. +* Every conditional has been replaced with the `?:` ternary operator and `||` short-circuiting operator. * It has exactly three nested `for` loops and nothing else. * Common two's complement tricks: `~-a` instead of `a-1`, @@ -161,9 +164,9 @@ Many obfuscations used are typical for standard IOCCC entries: Other obfuscations are more subtle: * The string `"1+DIY/.K430x9G(kC["` is 18 bytes long, but actually 19 bytes - including the final null character are used. + including the final NUL character are used. * It internally represents numbers as hexadecimal. When the input is `two - hundred and three`, it actually writes 0x203 as hexadecimal. + hundred and three`, it actually writes `0x203` as hexadecimal. * Some variables (notably, `n`) have dual uses. * The magic number [42][hhgg] makes an appearance. * It has a long long numb-`main`-er within it! @@ -174,24 +177,24 @@ But the most important obfuscation is the clever construction of lookup table. The program uses 11 different characters required for recognizing 22 lexemes: ``` - zero one tw- th(i)r- fo(u)r- fi- six- - seven- eigh- nin- ten eleven twelve - hundred(s) thousand(s) million(s) billion(s) trillion(s) - a and -teen -ty +zero one tw- th(i)r- fo(u)r- fi- six- +seven- eigh- nin- ten eleven twelve +hundred(s) thousand(s) million(s) billion(s) trillion(s) +a and -teen -ty ``` So that they are internally represented as like: ``` - r n tw- tr- fr- f- s- - sn- g- nn- tn ln twl - nr(s) tsan(s) lln(s) blln(s) trlln(s) - a an -tn -ty +r n tw- tr- fr- f- s- +sn- g- nn- tn ln twl +nr(s) tsan(s) lln(s) blln(s) trlln(s) +a an -tn -ty ``` The stemmer recognizes the longest matching prefix, so every lexeme can be recognized by at most three characters (e.g. `trl` instead of `trlln`). This is -also handy for ignoring plurals. But that would make that the table does not fit +also handy for ignoring plurals. But that would make it so that the table does not fit in the printable byte---112 is already almost 27! The trick is to use octal; three characters (`a`, `b` and `g`) are interpreted @@ -213,7 +216,7 @@ More spoilers can be found at ### Acknowledgement The cleaner (size-optimized) version of this program was originally published -in my website in July 2011. Sun Park and others have reviewed it and let me +in my website in July 2011. Sun Park and others have reviewed it and made me aware of possible improvements. I'd also like to thank Seo Sanghyeon for proof-reading remarks. diff --git a/2012/kang/try.sh b/2012/kang/try.sh index fa08e6771..ce013b131 100755 --- a/2012/kang/try.sh +++ b/2012/kang/try.sh @@ -14,17 +14,20 @@ make CC="$CC" everything >/dev/null || exit 1 # clear screen after compilation so that only the entry is shown clear -echo "$ echo Nineteen hundred and eighty-four | ./kang" +echo "$ echo Nineteen hundred and eighty-four | ./kang" 1>&2 echo Nineteen hundred and eighty-four | ./kang -echo "$ echo uno | ./kang" +echo "$ echo uno | ./kang" 1>&2 echo uno | ./kang -echo "$ echo trois | ./kang" +echo "$ echo trois | ./kang" 1>&2 echo trois | ./kang -echo "$ echo fier | ./kang # notice the issue here, see alternate code instead" +echo "$ echo fier | ./kang # notice the issue here, see alternate code instead" 1>&2 echo fier | ./kang # notice the issue here, see alternate code instead -echo "$ echo \"shest'\" | ./kang" +echo "$ echo \"shest'\" | ./kang" 1>&2 echo "shest'" | ./kang + +echo "$ echo dos | ./kang" 1>&2 +echo dos | ./kang