From b18d0c5fa89d51b049224b870b8148d391ebcf8d Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Sat, 25 Nov 2023 11:52:22 -0800 Subject: [PATCH] Add 2011/hou/try.sh + format/typo checks This should complete 2011/hou's review. --- 2011/hou/README.md | 25 +++++++++++++----------- 2011/hou/try.sh | 46 +++++++++++++++++++++++++++++++++++++++++++++ thanks-for-fixes.md | 5 +++++ 3 files changed, 65 insertions(+), 11 deletions(-) create mode 100755 2011/hou/try.sh diff --git a/2011/hou/README.md b/2011/hou/README.md index f1304a0c3..96f8f6dde 100644 --- a/2011/hou/README.md +++ b/2011/hou/README.md @@ -15,16 +15,11 @@ make ### Try: ```sh -./hou '11/26+222/31' - -./hou 'log((21701-19937)-(23209-21701))/log(2)' - -./hou 'sin(1.5708)+0.04321+log(sqrt(exp(1*1*1)))+(1+2*3)-0.4-0.6+(4+6)*(2-1+2*3)-tan(0.785398)+2*10/3*6*sqrt(16/2/2)*10+10000-1000' - -./hou 'a calculator expression -- see the C Code for details' +./try.sh ``` -What does the last one mean? +As the script asks you, what does the last one mean? Can you get it to report a +different value? Hint: it's in this file, kind of. ## Judges' remarks: @@ -50,30 +45,36 @@ What does this evaluate to in C? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ ``` + ### Self documenting source Comments would almost be redundant. :-} + ### The ASCII art is valid C code ... and not just fancy formatted comment removed by the C Pre-processor. + ### The only multi-byte strings are format strings The code does not contain some simple string-encoded lookup table for calculator operations. + ### Example input and output in the source The example input and output in the C code is significant. Can you find out why? + ### The button layout The button layout in the C code is significant ... not just a nice looking layout. -### input parsing + +### Input parsing The parser is functionally equivalent to a normal arithmetic parser for all valid inputs. For another fun challenge: try to determine how it parses the @@ -91,7 +92,7 @@ supported functionality using embedded ASCII art. - A few line numbers are significant and careless beautification will break the program. - The entire ASCII art is valid code. The preprocessor won't remove any part of it. -- The only strings longer than 1 byte are printf/sscanf format strings, even +- The only strings longer than 1 byte are `printf(3)`/`sscanf(3)` format strings, even after preprocessing. No string-encoded lookup table is used. - The example input and its expected output are both algorithmically significant. @@ -99,14 +100,16 @@ significant. - The actual syntax being parsed is not that obvious, despite being functionally equivalent for all correct inputs. + ### Portability - This program requires `argv` to point to writable memory. It doesn't require -the actual argv strings to be writable, though. +the actual `argv` strings to be writable, though. - This program requires ASCII. - This program doesn't work with `%e` style numbers like `1e-4`. - Some seemingly redundant code works to eliminate warnings and evade a gcc bug. + ### Spoilers The parser parses function names, subtraction, and division as single-letter diff --git a/2011/hou/try.sh b/2011/hou/try.sh new file mode 100755 index 000000000..6f7519e06 --- /dev/null +++ b/2011/hou/try.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# +# try.sh - demonstrate IOCCC winner 2011/hou +# + +# 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 "Observe how this one is in the code, both the equation and the answer: " +echo "$ ./hou '11/26+222/31'" 1>&2 +./hou '11/26+222/31' +echo 1>&2 + +read -r -n 1 -p "Press any key to continue: " +echo "$ ./hou 'log((21701-19937)-(23209-21701))/log(2)'" 1>&2 +./hou 'log((21701-19937)-(23209-21701))/log(2)' +echo 1>&2 + +read -r -n 1 -p "Press any key to continue: " +echo "$ ./hou 'sin(1.5708)+0.04321+log(sqrt(exp(1*1*1)))+(1+2*3)-0.4-0.6+(4+6)*(2-1+2*3)-tan(0.785398)+2*10/3*6*sqrt(16/2/2)*10+10000-1000'" 1>&2 +./hou 'sin(1.5708)+0.04321+log(sqrt(exp(1*1*1)))+(1+2*3)-0.4-0.6+(4+6)*(2-1+2*3)-tan(0.785398)+2*10/3*6*sqrt(16/2/2)*10+10000-1000' +echo 1>&2 + +read -r -n 1 -p "Press any key to continue: " +echo "$ ./hou '1+2*3'" 1>&2 +./hou '1+2*3' +echo 1>&2 + +read -r -n 1 -p "Press any key to continue: " +echo "$ ./hou '(1+2)*3'" 1>&2 +./hou '(1+2)*3' +echo 1>&2 + +read -r -n 1 -p "Press any key to continue: " +echo "$ ./hou 'a calculator expression -- see the C Code for details'" 1>&2 +./hou 'a calculator expression -- see the C Code for details' +echo "Now answer: what does the last one mean? Can you get it to report something else?" 1>&2 diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index 5c2d473ac..acb9bd3e1 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -3226,6 +3226,11 @@ and now it does work with 64-bit systems as well as 32-bit systems. Cody added the following words of wisdom: 'this is not a pipe'. +## [2011/hou](2011/hou/hou.c) ([README.md](2011/hou/README.md])) + +Cody added the [try.sh](2011/hou/try.sh) script. + + ## [2011/konno](2011/konno/konno.c) ([README.md](2011/konno/README.md])) Cody fixed the program to not crash if no arg was specified as this was not a