From 400e3f4e0593c8d3fa2b20bec8e642e372177d60 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 04:40:07 -0800 Subject: [PATCH 01/12] Rename and improve 2006/sykes2/sykes2.sh -> try.sh The README.md did not need anything done other than changing it to refer to try.sh instead of sykes2.sh. --- 2006/sykes2/README.md | 2 +- 2006/sykes2/sykes2.sh | 9 --------- 2006/sykes2/try.sh | 21 +++++++++++++++++++++ thanks-for-fixes.md | 6 ++++++ 4 files changed, 28 insertions(+), 10 deletions(-) delete mode 100755 2006/sykes2/sykes2.sh create mode 100755 2006/sykes2/try.sh diff --git a/2006/sykes2/README.md b/2006/sykes2/README.md index 2020cab2b..730bf8dbc 100644 --- a/2006/sykes2/README.md +++ b/2006/sykes2/README.md @@ -15,7 +15,7 @@ make ### Try: ```sh -./sykes2.sh +./try.sh ``` This will repeatedly remake the program and run it then sleep for one second for diff --git a/2006/sykes2/sykes2.sh b/2006/sykes2/sykes2.sh deleted file mode 100755 index 51f237072..000000000 --- a/2006/sykes2/sykes2.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -while :; do - clear - rm -f sykes2 - make sykes2 2>/dev/null 1>&2 - ./sykes2 - sleep 1 -done diff --git a/2006/sykes2/try.sh b/2006/sykes2/try.sh new file mode 100755 index 000000000..4d16dfa46 --- /dev/null +++ b/2006/sykes2/try.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# +# try.sh - demonstrate IOCCC winner 2006/sykes2 +# + +# 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" sykes2 || exit 1 + +while :; do + clear + rm -f sykes2 + make sykes2 2>/dev/null 1>&2 || exit 1 + ./sykes2 + sleep 1 +done diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index def0f35cf..5744dc307 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -3026,6 +3026,12 @@ The video was also no longer available but Cody found an alternative and added it to the repo as well. +## [2006/sykes2](2006/sykes2/sykes2.c) ([README.md](2006/sykes2/README.md])) + +Cody added the [try.sh](2006/sykes2/try.sh) script for easier use of the entry +to show the clock update in real time. + + ## [2006/toledo2](2006/toledo2/toledo2.c) ([README.md](2006/toledo2/README.md])) Cody fixed a segfault in this program which was making it fail to work under From 96079979eb8ef591904f62604df108ffd6c22a2e Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 04:42:36 -0800 Subject: [PATCH 02/12] Format/typo check 2006/toledo1 --- 2006/toledo1/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2006/toledo1/README.md b/2006/toledo1/README.md index 135e6a3e3..ab0d9f656 100644 --- a/2006/toledo1/README.md +++ b/2006/toledo1/README.md @@ -35,7 +35,7 @@ be expected, and some dump core? ## Author's remarks: Can you place a knight on a chess board and make it -to visit the 64 squares without repeating them? +visit the 64 squares without repeating them? If not, this program does it, just run it with an argument giving initial position. From b1a57fd2af52bb33eee88533aead84cb8c8d71af Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 04:57:19 -0800 Subject: [PATCH 03/12] Update bug status / format/typo 2006/borsanyi The bug status is it's not a bug but a feature. --- 2006/borsanyi/README.md | 22 ++++++++++++++++++++-- bugs.md | 11 +++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/2006/borsanyi/README.md b/2006/borsanyi/README.md index 7b1514d5c..16a2ea2be 100644 --- a/2006/borsanyi/README.md +++ b/2006/borsanyi/README.md @@ -5,6 +5,19 @@ make ``` +### Bugs and (Mis)features: + +The current status of this entry is: + +``` +STATUS: INABIAF - please **DO NOT** fix +``` + +For more detailed information see [2006 borsanyi in bugs.md](/bugs.md#2006-borsanyi). + + + + ## To use: ```sh @@ -27,7 +40,7 @@ yourself! :-) The resulting GIF file is likely to puzzle optical character recognition tools. The amount of imagination necessary to -recognise the @ character will certainly challenge a few +recognise the `@` character will certainly challenge a few anti-CAPTCHA tools. @@ -50,6 +63,7 @@ line. To avoid complications with patent issues the [LZW compression](https://en.wikipedia.org/wiki/Lempel-Ziv-Welch) feature is not used. A typical email address is stored in less than 1-2 kilobytes. + ### Usage: ```sh @@ -63,8 +77,10 @@ the characters: `a-z_A-Z0-9@.-`. The program is (like email addresses are) case insensitive. + ### Obfuscation: + Multicore support is a must in present-day applications. This entry supports up to 25 cores. The odd names in the bottom part of the program do have a meaning, they are not there just @@ -73,6 +89,7 @@ small, in fact, everything is a macro. Are you familiar with the GIF format? Studying this program will give you a (very) little insight. + ### Questions: After analyzing the source code, try to answer these questions: @@ -81,9 +98,10 @@ After analyzing the source code, try to answer these questions: 2. Can you alter the look of the output characters? 3. What limits the number of input characters to 42? + ### Portability: -The program uses posix threads (using the linker flag `-lpthread`). +The program uses POSIX threads (using the linker flag `-lpthread`). The program accepts email addresses not longer than 42 bytes composed from letters, digits, and the `@._-` symbols. An address not obeying these rules will cause undefined behaviour. The diff --git a/bugs.md b/bugs.md index ac1797aba..176016891 100644 --- a/bugs.md +++ b/bugs.md @@ -2305,6 +2305,17 @@ used decimal mode, or any of the "undocumented" instructions. # 2006 +## 2006 borsanyi + +### STATUS: INABIAF - please **DO NOT** fix +### Source code: [2006/borsanyi/borsanyi.c](2006/borsanyi/borsanyi.c) +### Information: [2006/borsanyi/README.md](2006/borsanyi/README.md) + +The string specified must be <= 42 characters and may only consist of the +characters in the regex `a-z_A-Z0-9@.-`. Breaking these constraints will end up +with possibly corrupt GIF files. + + ## 2006 monge ### STATUS: doesn't work with some platforms - please help us fix From 6c1c6dc5a4bc8c77174a8c5d7169169077fbe864 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 05:20:12 -0800 Subject: [PATCH 04/12] Add 2006/hamre/try.sh + formatting/typo checks --- 2006/hamre/README.md | 6 ++--- 2006/hamre/try.sh | 58 ++++++++++++++++++++++++++++++++++++++++++++ thanks-for-fixes.md | 2 ++ 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100755 2006/hamre/try.sh diff --git a/2006/hamre/README.md b/2006/hamre/README.md index d1225abd9..7e16f495f 100644 --- a/2006/hamre/README.md +++ b/2006/hamre/README.md @@ -15,7 +15,7 @@ make ### Try: ```sh -./hamre '-1+4/3*(2+1/(3/2*(7/2-7/3+1/6)))/2' +./try.sh ``` @@ -37,10 +37,10 @@ numbers](https://en.wikipedia.org/wiki/Rational_number). Believe it or not, that is a useful tool to have around, and I haven't found a useful version, much less an obfuscated one. -It is rather feature complete as [rational calculators go. The +It is rather feature complete as rational calculators go. The supported operators are: `+`, `-` (binary and unary), `*`, `/` and `()`. Run it by supplying an expression as the first argument, and the normalized -result will be written to stdout. +result will be written to `stdout`. ```sh ./hamre '-1+4/3*(2+1/(3/2*(7/2-7/3+1/6)))/2' diff --git a/2006/hamre/try.sh b/2006/hamre/try.sh new file mode 100755 index 000000000..fe123581b --- /dev/null +++ b/2006/hamre/try.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# +# try.sh - demonstrate IOCCC winner 2006/hamre +# + +# 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 + + + +echo "$ ./hamre '-1*42/3*(42*42*42)/42'" 1>&2 +./hamre '-1*42/3*(42*42*42)/42' +echo 1>&2 + +read -r -n 1 -p "Press any key to continue: " +echo "$ ./hamre '-1+4/3*(2+1/(3/2*(7/2-7/3+1/6)))/2'" 1>&2 +./hamre '-1+4/3*(2+1/(3/2*(7/2-7/3+1/6)))/2' +echo 1>&2 + +read -r -n 1 -p "Press any key to continue: " +echo "$ ./hamre '1/0' 1>&2" 1>&2 +./hamre '1/0' 1>&2 +echo 1>&2 +echo "...why did you not get an answer?" 1>&2 +echo 1>&2 + +LIFE=12 +UNIVERSE=15 +EVERYTHING=15 +read -r -n 1 -p "Press any key to continue: " +echo "For the next two notice how similar they are: why do they give different answers?" 1>&2 + +echo "$ LIFE=12; UNIVERSE=15; EVERYTHING=15; ./hamre \"\$LIFE/\$UNIVERSE/\$EVERYTHING\"" 1>&2 +./hamre "$LIFE/$UNIVERSE/$EVERYTHING" + +echo "$ LIFE=12; UNIVERSE=15; EVERYTHING=15; ./hamre \"\$LIFE / \$UNIVERSE / \$EVERYTHING\"" 1>&2 +./hamre "$LIFE / $UNIVERSE / $EVERYTHING" + +echo 1>&2 +read -r -n 1 -p "Press any key to continue: " +echo "And why do these next two give different answers?" 1>&2 +echo "$ LIFE=12; UNIVERSE=15; EVERYTHING=15; ./hamre \"\$LIFE + \$UNIVERSE + \$EVERYTHING\"" 1>&2 +./hamre "$LIFE + $UNIVERSE + $EVERYTHING" +echo "$ LIFE=12; UNIVERSE=15; EVERYTHING=15; ./hamre \"\$LIFE+\$UNIVERSE+\$EVERYTHING\"" 1>&2 +./hamre "$LIFE+$UNIVERSE+$EVERYTHING" + +echo "As it turns out, \$LIFE+\$UNIVERSE+\$EVERYTHING == 42/1 == 42!" 1>&2 + +exit 0 diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index 5744dc307..53721d8f2 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -2964,6 +2964,8 @@ implicitly linked in. Cody fixed this so that it will not crash without an arg after it was suggested this should be fixed. +Cody also added the [try.sh](2006/hamre/try.sh) script. + ## [2006/monge](2006/monge/monge.c) ([README.md](2006/monge/README.md])) From e9ffd327d6b1218cd0ee9b1f5020c349c19bd4c9 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 07:38:30 -0800 Subject: [PATCH 05/12] Make 2006/sykes2 main() have two args This is out of an abundance of caution as some of the versions of clang report that main() can only have 0, 2 or 3 args to main(), not 4 or anything else. The version (clang version 17.0.4) I have encountered this with actually allows 1 arg but since clang is so picky I decided to make a second unused arg (a char **) in case the devs decide to ruin even more fun programs. There are other entries that also use one arg to main() and I will try locating those too, first with the entries I have not reviewed yet and then later on (time constraints notwithstanding) the ones I have already reviewed. Makefile updated with new -Wno- options for clang with linux. --- 2006/sykes2/Makefile | 3 ++- 2006/sykes2/sykes2.c | 2 +- thanks-for-fixes.md | 8 ++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/2006/sykes2/Makefile b/2006/sykes2/Makefile index d1978f855..847a905fb 100644 --- a/2006/sykes2/Makefile +++ b/2006/sykes2/Makefile @@ -40,7 +40,8 @@ include ../../var.mk # CSILENCE= -Wno-bitwise-op-parentheses -Wno-char-subscripts -Wno-error \ -Wno-implicit-function-declaration -Wno-implicit-int -Wno-main \ - -Wno-pedantic -Wno-deprecated-non-prototype + -Wno-pedantic -Wno-deprecated-non-prototype -Wno-unused-parameter \ + -Wno-parentheses # Common C compiler warning flags # diff --git a/2006/sykes2/sykes2.c b/2006/sykes2/sykes2.c index 2e2ccaf1f..96cba09e6 100644 --- a/2006/sykes2/sykes2.c +++ b/2006/sykes2/sykes2.c @@ -1 +1 @@ -main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);} +main(_,v)char**v;{_^448&&main(-~_,v);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);} diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index 53721d8f2..46661e7e4 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -3030,8 +3030,12 @@ it to the repo as well. ## [2006/sykes2](2006/sykes2/sykes2.c) ([README.md](2006/sykes2/README.md])) -Cody added the [try.sh](2006/sykes2/try.sh) script for easier use of the entry -to show the clock update in real time. +Cody, out of an abundance of caution for `clang`'s defects, made `main()` have +to args instead of 1 as some versions report that `main()` must have 0, 2 or 3 +args, even though at least one of those versions allows 1 arg only. + +Cody also added the [try.sh](2006/sykes2/try.sh) script for easier use of the +entry to show the clock update in real time. ## [2006/toledo2](2006/toledo2/toledo2.c) ([README.md](2006/toledo2/README.md])) From 8231e28567a2c07c67ef619d6d397baa39384201 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 08:10:01 -0800 Subject: [PATCH 06/12] Add 2006/birken/try.sh, bugs.md, format/typo check The try.sh runs the program on all the tofu input files, prompting the user to press a key before running each one so they have time to look at the output of the previous one. The README.md file format and typo checked. This should complete 2006/birken except that it uses gets(), not fgets(), which has been added to the bugs.md file. I almost got it to work but it crashes with computer.tofu so I did not change it. Will look at this later, maybe, but the bugs.md has a diff of the single change that almost works. I did not have the time to write where it fails but I do happen to know at least the end result. --- 2006/birken/README.md | 34 +++++++++++++--------- 2006/birken/try.sh | 68 +++++++++++++++++++++++++++++++++++++++++++ bugs.md | 17 +++++++++++ thanks-for-fixes.md | 2 ++ 4 files changed, 108 insertions(+), 13 deletions(-) create mode 100755 2006/birken/try.sh diff --git a/2006/birken/README.md b/2006/birken/README.md index 29cdf748d..8f1eb658d 100644 --- a/2006/birken/README.md +++ b/2006/birken/README.md @@ -5,6 +5,17 @@ make ``` +### Bugs and (Mis)features: + +The current status of this entry is: + +``` +STATUS: uses gets() - change to fgets() if possible +``` + +For more detailed information see [2006 birken in bugs.md](/bugs.md#2006-birken). + + ## To use: ```sh @@ -15,10 +26,7 @@ make ### Try: ```sh -./birken < counter.tofu -./birken < adder.tofu -./birken < buffer.tofu -./birken < computer.tofu +./try.sh ``` etc. @@ -30,22 +38,22 @@ Q: EDAMAME? A: Electronic Design Automation - Mechanical Abstract Machine Emulator -What is TUFO? It's not a veggy friendly food, nor it is Verilog or -VHDL. It is not even Pascal! +What is TOFU? It's not a veggie friendly food, nor it is +[Verilog](https://en.wikipedia.org/wiki/Verilog) or +[VHDL](https://en.wikipedia.org/wiki/VHDL) It is not even +[Pascal](https://en.wikipedia.org/wiki/Pascal_(programming_language))! -NOTE: On some systems, file(1) claims one of the .tofu files is Pascal +NOTE: On some systems, `file(1)` claims one of the `.tofu` files is Pascal source. :-) It may not be the most readable hardware description language, but it is -one of the easiest 55 page long manual to learn. :-) +one of the easiest 55 page long manuals to learn. :-) For a small but non-trivial design, try implementing a [Linear Feedback Shift Register](http://en.wikipedia.org/wiki/LFSR) -And for those who are still confused: - -> -> +And for those who are still confused, see +and . ## Author's remarks: @@ -64,7 +72,7 @@ The primary obfuscation is the data structure chosen for parsing the input file and for executing the simulation. Oh man... coding that data structure gave me such a bad headache. But, I figure, who needs more than a pair anyway? Subtle obfuscations abound. Bonus points go -out the one who discovers the hidden program within the source. +out to the one who discovers the hidden program within the source. Note that the shape of the source is a wave, not a waveform. diff --git a/2006/birken/try.sh b/2006/birken/try.sh new file mode 100755 index 000000000..f1b0e856b --- /dev/null +++ b/2006/birken/try.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# +# try.sh - demonstrate IOCCC winner 2006/birken +# + +# 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 run: ./birken < adder.tofu 2>/dev/null: " +./birken < adder.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < buffer.tofu 2>/dev/null: " +./birken < buffer.tofu 2>/dev/null +echo 1>&2 + +echo "NOTE: the next one has longer output." 1>&2 +read -r -n 1 -p "Press any key to run: ./birken < computer.tofu 2>/dev/null: " +./birken < computer.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < counter.tofu 2>/dev/null: " +./birken < counter.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < divider.tofu 2>/dev/null: " +./birken < divider.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < lfsr.tofu 2>/dev/null: " +./birken < lfsr.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < memory.tofu 2>/dev/null: " +./birken < memory.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < multiplier.tofu 2>/dev/null: " +./birken < multiplier.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < multiplier2.tofu 2>/dev/null: " +./birken < multiplier2.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < oneline.tofu 2>/dev/null: " +./birken < oneline.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < shift.tofu 2>/dev/null: " +./birken < shift.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < zuse.tofu 2>/dev/null: " +./birken < zuse.tofu 2>/dev/null +echo 1>&2 + +read -r -n 1 -p "Press any key to run: ./birken < zuse2.tofu 2>/dev/null: " +./birken < zuse2.tofu 2>/dev/null diff --git a/bugs.md b/bugs.md index 176016891..847724e9b 100644 --- a/bugs.md +++ b/bugs.md @@ -2305,6 +2305,23 @@ used decimal mode, or any of the "undocumented" instructions. # 2006 +## 2006 birken + +### STATUS: uses gets() - change to fgets() if possible +### Source code: [2006/birken/birken.c](2006/birken/birken.c) +### Information: [2006/birken/README.md](2006/birken/README.md) + +This entry uses `gets(3)` which is unsafe and provides annoying warnings, most +obnoxious in macOS as it shows it at runtime (redirecting `stderr` to +`/dev/null` will silence it). The following diff will almost work but it crashes +with at least `computer.tofu` input file: + +```diff +12a13 +#define gets(c) fgets((c),PI,stdin)&&(((c)[strlen((c))-1]='\0'),c!=NULL) +``` + + ## 2006 borsanyi ### STATUS: INABIAF - please **DO NOT** fix diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index 46661e7e4..d51fac310 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -2952,6 +2952,8 @@ it. Cody fixed a segfault in macOS with this entry. The problem was a missing `+1` for strlen() with malloc(). This prevented it from working. +Cody also added the [try.sh](2006/birken/try.sh) script. + ## [2006/borsanyi](2006/borsanyi/borsanyi.c) ([README.md](2006/borsanyi/README.md])) From 696fef731a26ecf986c3d9995428813bb01cf215 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:01:20 -0800 Subject: [PATCH 07/12] Format/typo check 2006/sloane + change alt default The README.md file has been format/typo checked. The alt code default usleep(3) value has been increased from 65000 to 75000. This should complete 2006/sloane. --- 2006/sloane/Makefile | 2 +- 2006/sloane/README.md | 12 +++++++----- thanks-for-fixes.md | 8 ++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/2006/sloane/Makefile b/2006/sloane/Makefile index 27dbb6129..3409f6b7c 100644 --- a/2006/sloane/Makefile +++ b/2006/sloane/Makefile @@ -59,7 +59,7 @@ ARCH= # Defines that are needed to compile # -CDEFINE= -DS=65000 +CDEFINE= -DS=75000 # Include files that are needed to compile # diff --git a/2006/sloane/README.md b/2006/sloane/README.md index 2cb3c0dfe..18d10b22e 100644 --- a/2006/sloane/README.md +++ b/2006/sloane/README.md @@ -20,7 +20,7 @@ see the [original code](#original-code) section. This alternate version, which we recommend that you use in order to see what is happening with modern systems, and to not flash too quickly, which can be problematic for some people, can be configured to different speeds by way of the -value used in `usleep()`. The default is `-DS=65000` but you can easily change +value used in `usleep()`. The default is `-DS=75000` but you can easily change it. To do so try: ```sh @@ -73,13 +73,13 @@ at first blush, this looks like a self-reproducing program. ## Author's remarks: This program doesn't require any special build options, other than that it -uses `sin()` and `cos()` and hence requires the math library. +uses `sin(3)` and `cos(3)` and hence requires the math library. You will almost certainly get a compiler warning because I declared a bunch -of global ints without types. The code looks better this way, though, I +of global `int`s without types. The code looks better this way, though, I think. There are also no `#include`s, so there may be warnings for -undeclared references to `printf()`, etc. There's a chance that my failure to -include `math.h` or declare `sin()` or `cos()` will make the +undeclared references to `printf(3)`, etc. There's a chance that my failure to +include `math.h` or declare `sin(3)` or `cos(3)` will make the [donut](https://en.wikipedia.org/wiki/Doughnut) not render properly -- it's worked on every system I've tried so far though. @@ -98,6 +98,7 @@ escape codes for clearing the screen and moving the cursor back to the top-left. The donut isn't raytraced. It's much simpler than that. + ### How is it obfuscated? There are three main pieces to this program: the donut, the checkerboard, and @@ -109,6 +110,7 @@ into the smallest I could make it by any means necessary. The logo can actually be compressed much better (ironically, by doing something simpler), but I didn't discover this until well after submitting. + ### Puzzles In increasing order of difficulty: diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index d51fac310..cbfc000d3 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -2991,9 +2991,9 @@ Cody fixed this entry to work with clang which has a defect with the args to `main()`: it requires specific types: `int` and `char **` for the first and latter args. -The [alternate version](2006/sloane/sloane.alt.c), which allows one to see what -is going on in modern systems, and which we recommend one use _first_, was -provided by Cody. +Cody also provided the [alternate version](2006/sloane/sloane.alt.c), which +allows one to see what is going on in modern systems, and which we recommend one +use _first_. Curiously, although clang requires the types of args to be strictly correct, some versions do allow only one arg. This was done at first because it's not @@ -3010,7 +3010,7 @@ Cody also made sure that the Makefile links in `libm` as not all systems do this by default. Since the author suggested that the lack of certain `#include`s might break the -program in some systems he added `-include ...` to the Makefile as well. +program in some systems he also added `-include ...` to the Makefile as well. ## [2006/stewart](2006/stewart/stewart.c) ([README.md](2006/stewart/README.md])) From 471a1f48faeede97c8b3795fc5d32915454c5daa Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:10:24 -0800 Subject: [PATCH 08/12] Format/typo check 2006/meyer --- 2006/meyer/README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/2006/meyer/README.md b/2006/meyer/README.md index 3f6beda7f..64414aab8 100644 --- a/2006/meyer/README.md +++ b/2006/meyer/README.md @@ -8,14 +8,14 @@ make ## To use: ```sh -./meyer +./meyer [SEED] ``` ### Try: ```sh -./meyer +./meyer [SEED] ``` For your first input try: @@ -24,9 +24,14 @@ For your first input try: a 0 1 ``` +where `a` is the row (`a`-`i`), `0` is the column (`0`-`8`) and `1` is the +number (`1`-`9`). + NOTE: if you do not input three different 'words' it will block. You can input more text to fulfil the program's requirements. +NOTE: if your move is invalid it will prompt you again but not show the board. + ## Judges' remarks: @@ -65,13 +70,13 @@ it is obvious, that object-oriented code isn't '`WYWIWID`' ('what you write is what it does'). It may be tempting to think that ``` - Object o; +Object o; ``` might do something similar as ```c - struct not_an_object o; +struct not_an_object o; ``` But this program reveals that it doesn't. Even worse, this program only @@ -86,14 +91,13 @@ include: - virtual method tables (all the virtual method tables have been combined to a single [vtable](https://en.wikipedia.org/wiki/Virtual_method_table)). - runtime method binding. -- -[inheritance](https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)) -and -[polymorphism](https://en.wikipedia.org/wiki/Polymorphism_(computer_science)). +- [inheritance](https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)) +and [polymorphism](https://en.wikipedia.org/wiki/Polymorphism_(computer_science)). It is left as an exercise to the reader to find a corresponding implementation in a popular object-oriented programming language. + ### Starting the game ```sh From b6ed00e3b4c018a0a25d4096d8343fdbd1002522 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:40:05 -0800 Subject: [PATCH 09/12] Add 2006/monge/alt code + format/typo checks The alt code allows one to reconfigure the dimensions and the number of iterations, based on the author's remarks (three #defines at the top of the file). Format/typo check README.md file. Update bugs.md about the entry. It not only requires rwx memory but also x86/x86_64 machines (this was already noted). This was said to be worth fixing if possible (though in some systems it's impossible) so I kept it that way. I was going to suggest alt version instead but since it seemed like a good idea to have an alt version I decided to make it so that it might be good if they update both versions. --- 2006/monge/.gitignore | 1 + 2006/monge/Makefile | 9 ++-- 2006/monge/README.md | 103 ++++++++++++++++++++++++++++++++--------- 2006/monge/monge.alt.c | 79 +++++++++++++++++++++++++++++++ bugs.md | 10 +++- thanks-for-fixes.md | 19 +++++--- 6 files changed, 190 insertions(+), 31 deletions(-) create mode 100644 2006/monge/monge.alt.c diff --git a/2006/monge/.gitignore b/2006/monge/.gitignore index 34f266b2b..bb2b24faf 100644 --- a/2006/monge/.gitignore +++ b/2006/monge/.gitignore @@ -1,3 +1,4 @@ monge +monge.alt monge.orig prog.orig diff --git a/2006/monge/Makefile b/2006/monge/Makefile index 3bc34d80a..2f67911e9 100644 --- a/2006/monge/Makefile +++ b/2006/monge/Makefile @@ -42,7 +42,7 @@ CSILENCE= -Wno-bitwise-op-parentheses -Wno-conditional-type-mismatch \ -Wno-declaration-after-statement -Wno-dollar-in-identifier-extension \ -Wno-error -Wno-implicit-function-declaration \ -Wno-incompatible-pointer-types -Wno-int-conversion -Wno-parentheses \ - -Wno-return-type -Wno-strict-prototypes + -Wno-return-type -Wno-strict-prototypes -Wno-implicit-int # Common C compiler warning flags # @@ -119,8 +119,8 @@ OBJ= ${PROG}.o DATA= TARGET= ${PROG} # -ALT_OBJ= -ALT_TARGET= +ALT_OBJ= ${PROG}.alt.o +ALT_TARGET= ${PROG}.alt ################# @@ -143,6 +143,9 @@ ${PROG}: ${PROG}.c alt: data ${ALT_TARGET} @${TRUE} +${PROG}.alt: ${PROG}.alt.c + ${CC} ${CFLAGS} $< -o $@ ${LDFLAGS} + # data files # data: ${DATA} diff --git a/2006/monge/README.md b/2006/monge/README.md index b1616c263..4fe28852b 100644 --- a/2006/monge/README.md +++ b/2006/monge/README.md @@ -6,6 +6,9 @@ Make sure you have the SDL1 (not SDL2!) development environment installed. make ``` +There is alternate code that lets you redefine the width and height and number +of iterations to use. See [alternate code](#alternate-code) below. + ### Bugs and (Mis)features: @@ -42,6 +45,49 @@ That's not a bug, that's a feature. ``` +## Alternate code: + +This alternate code lets you specify the width and height of the image as well +as the number of iterations to perform. + + +### Alternate build: + + +To use the default values, the same as [monge.c](monge.c), just do: + + +```sh +make alt +``` + +But if you wish to actually make use of it you will want to redefine one or more +of the variables `W`, `H` and `I`. The defaults are (respectively) 400, 300 and +\128. If you wish to change the image size to 500x500 but keep the iterations +the same then do: + +```sh +make clobber CDEFINE="-DW=500 -DH=500" alt +``` + +If you wish to keep the dimensions the same but change the iterations to 512: + +```sh +make clobber CDEFINE="-DI=512" alt +``` + +If you specify a value less than 1 for any of these it sets it back to the +default. The value 1 was selected arbitrarily and such a small number as 1 will +not do anything useful but as long as it's at least 1 it'll not be redefined. +Does not try taking care of overflows but such large values would be impractical +anyway. + + +### Alternate use: + +Use `monge.alt` exactly as you would `monge` above. + + ## Judges' remarks: For those who are familiar with the previous [IOCCC winners](/winners.html), @@ -81,6 +127,7 @@ needed. 4. Enjoy, unless you're more interested in trying to understand how it works. :) + ### Introduction This is a fractal generator that supports custom formulas and real time zoom. @@ -103,68 +150,81 @@ as you like (as understood by the C function `isspace()`). Supported operations and functions are: +``` Operation | Description :-------- | :---------- -`+,-,*,/` | Arithmetic operations, priority of `*`,`/` over `+,-` is - respected. + +,-,*,/ | Arithmetic operations, priority of * , / over +,- is + | respected. | -`<,>` | Compares the real parts of two complex numbers (the imaginary part + <,> | Compares the real parts of two complex numbers (the imaginary part | is ignored). Any number of conditions is allowed, the iteration | will just stop as soon as one of them fails. -`Abs2` | Calculates the squared norm, i.e.: `Abs2(a+b*i)` is `(a*a+b*b)+0*i`. -`Re` | Extract the real part, i.e.: `Re(a+b*i)` is `a+0*i`. -`Im` | Extract the imaginary part, i.e.: `Im(a+b*i) is b+0*i`. -`Exp` | Calculates the complex exponential, i.e. `Exp(a+b*i)` is - | `e^a*(cos(b)+sin(b)*i)` -`Ln` | Calculates the principal value of the natural logarithm, i.e. - `Ln(a+b*i)` is `ln(a*a+b*b)/2` + `atan(b/a)*i` + Abs2 | Calculates the squared norm, i.e.: Abs2(a+b*i) is (a*a+b*b)+0*i. + Re | Extract the real part, i.e.: Re(a+b*i) is a+0*i. + Im | Extract the imaginary part, i.e.: Im(a+b*i) is b+0*i. + Exp | Calculates the complex exponential, i.e. Exp(a+b*i) is + | e^a*(cos(b)+sin(b)*i). + Ln | Calculates the principal value of the natural logarithm, i.e. + Ln(a+b*i) is ln(a*a+b*b)/2 + atan(b/a)*i. +``` Here are a few examples of fractals you can draw: - Mandelbrot: - ./monge "z=1" "z=z*z+c; Abs2(z)<4" +```sh +./monge "z=1" "z=z*z+c; Abs2(z)<4" +``` - Mandelbrot (return time variation): - ./monge "z=c" "z=z*z+c; Abs2(z-c)>0.0001" +```sh +./monge "z=c" "z=z*z+c; Abs2(z-c)>0.0001" +``` - Julia, for `c=0.31+i*0.5`: - ./monge "z=c; c=0.31+i*0.5" "z=z*z+c; Abs2(z)<4" +```sh +./monge "z=c; c=0.31+i*0.5" "z=z*z+c; Abs2(z)<4" +``` - Julia (return time variation), `for c=0.31+i*0.5`: - ./monge "z=c; c=0.31+i*0.5" "z=z*z+c; Abs2(z-c)>0.0001" +```sh +./monge "z=c; c=0.31+i*0.5" "z=z*z+c; Abs2(z-c)>0.0001" +``` - Newton, for `x^3-1`: - ./monge "z=c" "p=z; z=0.6666*z+0.3333/(z*z); Abs2(p-z) > 0.001" +```sh +./monge "z=c" "p=z; z=0.6666*z+0.3333/(z*z); Abs2(p-z) > 0.001" +``` - Newton-Mandelbrot: -``` +```sh ./monge "z=0" "p=z; z=z-(z*z*z + (c-1)*z - c)/(3*z*z+c-1); Abs2(p-z) > 0.001" ``` - Phoenix, Mandelbrot version: -``` +```sh ./monge "z=0; q=0" "t=z; z=z*z+Re(c)+Im(c)*q; q=t; Abs2(z)<4" ``` - Phoenix, Julia version for `c=0.56667-i*0.5`: -``` +```sh ./monge "z=c; c=0.56667-i*0.5; q=0" "t=z; z=z*z+Re(c)+Im(c)*q; q=t; Abs2(z)<4" ``` + ### Compilation and portability This program will only work on x86 (with an x87 FPU) or x86_64 machines, but it requires the SDL library. -Another system requirement is the `mmap()` function (as `#define`d at the +Another system requirement is the `mmap(2)` function (as `#define`d at the beginning of the program). If it is not available the macro `M(a)` will have to be replaced with a system dependent function that allocates readable, writable *AND* executable memory (it will not be possible to make this program run on @@ -186,17 +246,18 @@ changing the definitions of `W`, `H` and `I` at the beginning of the code. - Many SDL identifiers are hardcoded as number, this is safe up to ABI incompatibility. - Better optimization could be done treating known real numbers as just one - double, instead of adding a 0 imaginary part to treat them as complex + `double`, instead of adding a 0 imaginary part to treat them as complex numbers. - There should be some way to switch from Mandelbrot to Julia with chosen parameter. + ### Spoiler Sure, I don't want to deprive you of the pleasure of digging into the infernal mess created by my corrupted mind (writing this remark I noticed that I was ending sentences with ';' instead -that with '.', and I worried for my sanity), but just in case... +of with '.', and I worried for my sanity), but just in case... I used many obfuscation techniques, including a few ones that are different from the tricks used in most common IOCCC program diff --git a/2006/monge/monge.alt.c b/2006/monge/monge.alt.c new file mode 100644 index 000000000..a02351c8b --- /dev/null +++ b/2006/monge/monge.alt.c @@ -0,0 +1,79 @@ +#include +#include + +#include +#define M(a) mmap(0, a, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0) + +#ifndef W +#define W 400 +#elif W < 1 +#undef W +#define W 400 +#endif +#ifndef H +#define H 300 +#elif H < 1 +#undef H +#define H 300 +#endif +#ifndef I +#define I 128 +#elif I < 1 +#undef I +#define I 128 +#endif + +#define L char* +#define _ Sint32 +#define h(a,b) for(a=0; a7?J(Yv]#JJ), P(S++):o++ + :s(4); } s(_ n){ O o96?a(A),P(Z+i-97),a + (A),P (Z+*e++-71) :(p(index( e, 40)+1,1,t), i^82?i^73?i^65?i^69?i^76?1:J + (%YhY`%YmY}]YYB%YBXHYIXH$^A$YqYJ$Ys):J(%Y{YJ%Yj^IY@Y|\\iYIYp%Yh$^AY}$]Y\\J$^I) + : J(XHYIXH^AYn):J(]YYn) : J (]XYn),e= index( *t,41 )+ 1): p ( e , q+ 1, &e); A + = "&%YCXJYLXIYK\\J$^I$^k$^A"; (x -=3)<1?J(&]X]Y),1L <<31<0? J(Zi_`#JO):J(_i]X),x + ?J (#HH):J(#HC),J(#AD#IJPC) ,o-=4:--x?--x?--x?x-3?J(&%YA%YAXHYIXH^AYh$^q\\J$^IY`) + , a(A): 1:a(A):J(&$^j$^j):J(&$^B$^B); } O q==(x=*(*t=e++))/2); } main(_ r,L*U){ + X =V=(Z =(S=(K=M(Y*32))+Y)+ Y)+Y; J(h#AA#AA#AA#AA#FJ:+-*/); h(q,2){ A =E =Q=U[ q+1]; O * A=*A^B++ + [ ";<>+-*/" ]?*A:B,(B%=7)||(isspace(*E=*A)||++E,*A++)); E=V; O B=*Q){ if(Q[1]-61)p( + Q,1,&Q); else{ p(Q+2,1,&Q); h(j,2){ J(]#JJ); P(Z+B-71-j*26); o--; } } *Q&&Q++; } + } J(#PPJ#AP#IF); P (E -V+X +1); J(#IJPC); 0[u =X+7] =I; SDL_Init( 32 ); F= + SDL_SetVideoMode(W,H,8 ,0); A=F->pixels; B=F->pitch; O 1){ C^=3; h(j,H)h(i, + W )b C+2]=9; if(r=(k =SDL_GetMouseState(&x,&y))&5){ f=z/50; f=k&1 ?f:-f ; + c+=(x*T-T/R)*f; g += f*y*T-f; z*=f=1-f/z; v=1/f; h(j,H)h(i,W)h(q,4){ k= + x+(i- x)* f +q/2; l=y+(j-y)*f+q%2; if(k>=0&k=0&l Date: Fri, 24 Nov 2023 11:33:42 -0800 Subject: [PATCH 10/12] Format/typo check 2006/night --- 2006/night/README.md | 47 +++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/2006/night/README.md b/2006/night/README.md index bc1e8d268..28e0bfac6 100644 --- a/2006/night/README.md +++ b/2006/night/README.md @@ -4,6 +4,9 @@ make ``` +There is an alternate version that supports arrow keys. See the [alternate +code](#alternate-code) section below. + ## To use: @@ -11,26 +14,23 @@ make ./night ``` -There is an alternate version that supports arrow keys. See the alternate code -section below. - - -### Try: - -```sh -echo "Do or do not. There is no try." -``` - ## Alternate code: -To compile: +This version allows you to use arrow keys instead of the more awkward `wasd` +keys. + + +### Alternate build: ```sh make alt ``` + +### Alternate use: + Use `night.alt` as you would `night` above. @@ -41,22 +41,16 @@ algorithm](https://towardsdatascience.com/introduction-to-genetic-algorithms-inc involved. Somewhere. But what does it do? Well, it might take you a while to navigate the results, let alone the code. -### Cheating - -There is a nice way to cheat. If you don't want to figure it out you can look at -[Yusuke Endoh](/winners.html#Yusuke_Endoh)'s analysis of this entry at -(translation from Japanese so it's not perfect) -. - ## Author's remarks: Don't worry; this is not a self-reproducing program, as you might at first guess from the layout. I would never be so foolhardy as to -submit an entry on an over-used theme! +submit an entry on an overused theme! Oh, wait a second... it is a maze-generating program. Oops! + ### What it does: This program solves an optimization problem, namely, generating a challenging @@ -86,6 +80,7 @@ Finally, in the world of DNA, the medium is truly the message. There's a short message encoded in here that will only appear when you complete the optimal maze in the required 64 moves. + ### Issues: These depend on your compiler, and they were all intentionally @@ -94,13 +89,14 @@ added for obfuscation purposes. No, really! My compiler warns of nulls in a string literal, and the redefinition of the macro `T`. -On one compiler, compilation took about two minutes. +With one compiler, compilation took about two minutes. `sizeof(unsigned short)` must be 2, and `sizeof(unsigned long)` must be 4. `CLOCKS_PER_SEC` is assumed to be `1000000`. If it's a lot less than that, expect delays. + ### Algorithmic obfuscation: The representation of the maze layout in a 32-bit integer type is @@ -113,6 +109,7 @@ The recursive function `CGAC()` replaces a nested for loop in a handy way. The maze-solving function `TGA()` returns no solution both if no solution exists, and if the search space grows too large, with a single test. + ### Stylistic obfuscation: Four-letter alphabets are confusing. I don't know how @@ -124,11 +121,11 @@ Who needs `!=` when you've got `^`? Who needs `if` when you've got `while`? -For that matter, who needs fixed-iteration-count for and while when -you can just duplicate code with the preprocessor? Duplication by this -macro causes one particular graphics line to be replicated 512 -times. On my system the preprocessed code is over 80KB in length, -hindering the preprocessor's ability to deobfuscate. +For that matter, who needs fixed-iteration-count `for` and `while` when you can +just duplicate code with the preprocessor? Duplication by this macro causes one +particular graphics line to be replicated 512 times. On my system the +preprocessed code is over 80KB in length, hindering the preprocessor's ability +to deobfuscate. Keypad support was removed to save space. To restore, modify the following two macros to: From 8c31afdcc84dc0b38e2562b27e823c6b0c8822b1 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 11:46:55 -0800 Subject: [PATCH 11/12] Format/typo check 2006/stewart The .gitignore has been updated to have '*.xbm' and '*.png' as it seems that the point of maze.xbm and maze.png etc. are to not include the images generated by the program and this is cleaner and easier. The README.md file has been format/typo checked. This should complete the review of 2006/stewart. --- 2006/stewart/.gitignore | 4 +- 2006/stewart/README.md | 95 ++++++++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 41 deletions(-) diff --git a/2006/stewart/.gitignore b/2006/stewart/.gitignore index 1bca7c738..804342c6f 100644 --- a/2006/stewart/.gitignore +++ b/2006/stewart/.gitignore @@ -1,6 +1,6 @@ stewart stewart.html -maze.xbm -maze.png +*.xbm +*.png stewart.orig prog.orig diff --git a/2006/stewart/README.md b/2006/stewart/README.md index ac888b449..aef089097 100644 --- a/2006/stewart/README.md +++ b/2006/stewart/README.md @@ -12,6 +12,16 @@ make convert file.xbm file.png ``` +where `file` is one of: + +``` +altar box box2 box3 build carpet circles cross cross2 cross3 +crystal curve diamonds diamonds2 dragon dragon2 dragon3 +fern gasket gasket_mod gasket_mod2 ioccc maze octagon +pentagon pentagons rings rings2 spirals spirals2 spirals3 +spirals4 squares stars stars2 tree tree2 tree3 tree4 triangle +``` + NOTE: you cannot specify a different width from height; it's one number. NOTE: `convert(1)` belongs to [ImageMagick](https://imagemagick.org/index.php). @@ -20,17 +30,17 @@ NOTE: `convert(1)` belongs to [ImageMagick](https://imagemagick.org/index.php). ### Try: ```sh -./stewart 400 1000000 maze > maze.xbm\ +./stewart 400 1000000 maze > maze.xbm convert maze.xbm maze.png + +./stewart 1024 1000000 gasket > gasket.xbm +convert gasket.xbm gasket.png + +./stewart 1024 1500000 dragon3 > dragon3.xbm +convert dragon3.xbm dragon3.png ``` -where `FILE` is one of: - - altar box box2 box3 build carpet circles cross cross2 cross3 - crystal curve diamonds diamonds2 dragon dragon2 dragon3 - fern gasket gasket_mod gasket_mod2 ioccc maze octagon - pentagon pentagons rings rings2 spirals spirals2 spirals3 - spirals4 squares stars stars2 tree tree2 tree3 tree4 triangle +Now open the images in your favourite graphics viewer or a web browser. ## Judges' remarks: @@ -47,19 +57,24 @@ a reasonably experienced user who can parse formats in their mind. :-) The program should be run with the following -``` - ./stewart - m = The size of the picture (picture will be m X m in size). - n = The number of iterations to run (More will make for a - clearer picture). - ifs = The file to use as input. +```sh +./stewart ``` -The program will spit out a [XBM image](https://en.wikipedia.org/wiki/X_BitMap) on standard out. -Minimal checking is done on the arguments mainly that there are 3. -Wrong arguments will cause the program to bomb out. +where: -Ex: +``` +m = The size of the picture (picture will be m X m in size). +n = The number of iterations to run (More will make for a + clearer picture). +ifs = The file to use as input. +``` + +The program will spit out an [XBM image](https://en.wikipedia.org/wiki/X_BitMap) +on standard out. Minimal checking is done on the arguments mainly that there +are 3. Wrong arguments will cause the program to bomb out. + +#### Example: ```sh ./stewart 1024 1000000 gasket > gasket.xbm @@ -68,7 +83,7 @@ Ex: ### Compilation/Testing The program compiles without warning with `gcc -ansi -Wall`. -`lint` also seems to like the code. This must be a bug in lint. +`lint` also seems to like the code. This must be a bug in `lint`. The program was tested on Linux on a x86 and NetBSD on an alpha. Only gcc was tested for compilers (4.0.3 and 3.3.3). @@ -93,13 +108,13 @@ another kind of fractal, those from the [Iterated Function System The format of the input file is as follows: ``` - -

-

- . - . - . + +

+

+

+. +. +. ``` This file describe an IFS. @@ -107,20 +122,20 @@ This file describe an IFS. One of the most well known would be the [Sierpinski Gasket](gasket): ``` - 3 0 0 1 1 - .5 0 0 .5 0 0 .33 - .5 0 0 .5 .5 0 .33 - .5 0 0 .5 .25 .433 .34 +3 0 0 1 1 +.5 0 0 .5 0 0 .33 +.5 0 0 .5 .5 0 .33 +.5 0 0 .5 .25 .433 .34 ``` or the [fern](fern): ``` - 4 -5.5 0 5.5 11 - 0 0 0 .16 0 0 .01 - .85 .04 -.04 .85 0 1.6 .85 - .2 -.26 .23 .22 0 1.6 .07 - -.15 .28 .26 .24 0 .44 .07 +4 -5.5 0 5.5 11 +0 0 0 .16 0 0 .01 +.85 .04 -.04 .85 0 1.6 .85 +.2 -.26 .23 .22 0 1.6 .07 +-.15 .28 .26 .24 0 .44 .07 ``` etc... @@ -136,9 +151,9 @@ Basically the break down is: `num` is the number of equations in the `IFS`. `x` (min, max) and `y` (min, max) define the ranges that will be displayed -in the `xbm`. +in the XBM image file. -The `a b c d e f` are used to iterative find points that lie in the `IFS` +The `a b c d e f` are used to iterative find points that lie in the IFS from the algorithm ``` @@ -156,7 +171,7 @@ the args for `main()`). This causes me to do much casting and pointer arithmetic to get the correct location and completely does away with any meaning the variables could have. This also makes the code more convenient to read in the current form vs preprocessed. After -preprocessing there will almost be 300 casts in the code and I believe +preprocessing there will be almost 300 casts in the code and I believe they are all needed... (I would double check but my brain is kinda mushy right now from chasing down a segfault in the code.) @@ -165,6 +180,7 @@ all that common for a program to do. I mean google only has something like 66,000 hits for "Iterated function system" so that means it is obscure, right? + ### Some other minor obfuscations Since I formatted it as a "normal" program I did inject something that @@ -181,12 +197,13 @@ information about the algorithm. The use of many magic numbers. I figured if I get yelled about them in a review they must be bad, right? + ### Silly things The use of decimal numbers where one would expect hex. Octal numbers where one would expect decimal. Shifts instead of divides. -Using `xbm` as the output format. This might confuse someone who doesn't +Using xbm as the output format. This might confuse someone who doesn't have an X background. It happens to be easy but is probably a very bad choice from a file size standpoint. 1024x1024 image is 641k in size. From 8f41d4fd2669b5cc8a21342bef4ab9ff4e987498 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 24 Nov 2023 11:54:27 -0800 Subject: [PATCH 12/12] Format/typo check 2006/sykes1 + update bugs.md The bugs.md file has some documented features, not bugs. The README.md file has been typo/format checked. This should complete the review of 2006/sykes1. --- 2006/sykes1/README.md | 15 +++++++++++++++ bugs.md | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/2006/sykes1/README.md b/2006/sykes1/README.md index a692c603b..c28bba882 100644 --- a/2006/sykes1/README.md +++ b/2006/sykes1/README.md @@ -5,6 +5,19 @@ make ``` +### Bugs and (Mis)features: + +The current status of this entry is: + +``` +STATUS: INABIAF - please **DO NOT** fix +``` + +For more detailed information see [2006 sykes1 in bugs.md](/bugs.md#2006-sykes1). + + + + ## To use: ```sh @@ -215,6 +228,7 @@ In the ASCII output care must be taken with drawing the edges of each this is taken care of by color, which is graded from the back to the front to ensure edge visibility. + ### Notes The whole program has just one function - `main()` - which is recursively @@ -241,6 +255,7 @@ requirements. The program is known to compile and run under gcc and Intel cc, as well as PellesC on Windows. + ### Bugs The program is not at all a valid html document, but fortunately diff --git a/bugs.md b/bugs.md index 19a2b50f0..a493b220d 100644 --- a/bugs.md +++ b/bugs.md @@ -2352,11 +2352,36 @@ challenging and in some systems it will not be possible to fix but you are welcome to try and fix it if you wish to! + + ### STATUS: INABIAF - please **DO NOT** fix Incorrect formulas will ungracefully crash the program. +## 2006 sykes1 + +### STATUS: INABIAF - please **DO NOT** fix +### Source code: [2006/sykes1/sykes1.c](2006/sykes1/sykes1.c) +### Information: [2006/sykes1/README.md](2006/sykes1/README.md) + +The author stated: + +``` +If you pick a number higher than 19186, the program will return a +solution but it will be a rotation of one of the first 19186. This is +because the cross shaped piece fits 48 ways in the 4x4 cube, but only +2 of those ways are unique - you can rotate one of those to make any +of the other 46. The algorithm used always places the cross piece +first, so the first two placings of that piece result in the 19186 +unique solutions. + +If you pick a number higher than 460464 (24x19186) the program will +return without outputting a solution. If you can wait that long. +``` + + + ## 2006 toledo2 ### STATUS: INABIAF - please **DO NOT** fix

-