diff --git a/2013/endoh3/.gitignore b/2013/endoh3/.gitignore index fbe1fd107..a86f8b31b 100644 --- a/2013/endoh3/.gitignore +++ b/2013/endoh3/.gitignore @@ -7,3 +7,4 @@ indent indent.c indent.o prog.orig +*.wav diff --git a/2013/endoh3/Makefile b/2013/endoh3/Makefile index f419e61bf..41622f97f 100644 --- a/2013/endoh3/Makefile +++ b/2013/endoh3/Makefile @@ -39,7 +39,7 @@ include ../../var.mk # Common C compiler warnings to silence # CSILENCE= -Wno-error -Wno-implicit-function-declaration -Wno-implicit-int \ - -Wno-main -Wno-deprecated-non-prototype + -Wno-main -Wno-deprecated-non-prototype -Wno-unused-parameter # Common C compiler warning flags # diff --git a/2013/endoh3/README.md b/2013/endoh3/README.md index b330ca946..ca7d055ae 100644 --- a/2013/endoh3/README.md +++ b/2013/endoh3/README.md @@ -22,21 +22,32 @@ For more detailed information see [2013 endoh3 in bugs.md](/bugs.md#2013-endoh3) ./endoh3 ``` +This program plays sound. See [FAQ 3.10 - How do I compile and use an IOCCC +winner that requires sound?](/faq.md#faq3_10) if you do not know how to set your +system up for this or if you want to verify that everything is oky. + ## Try: -Trying this out will depend on how your system can play sounds. The author's -remarks include some options for different operating systems. - -The simplest way is to create a .wav file and have your system play that. - ```sh -echo 'CDEFGABc' | ./endoh3 | ruby wavify.rb > cde.wav +./try.sh + +./try.sh ABC + +./try.sh test.abc yankee.abc + +./try.sh *.abc ``` -Observe how you will need ruby installed. +The script will check for SoX first and next `padsp` from `PulseAudio` and +finally if neither are found if you have `ruby(1)` installed it'll use the +included ruby script to convert it to a WAV file for you to play. -There are also some other musical samples, twinkle.abc and menuet.abc. +If no args are passed to the script it will play [twinkle.abc](twinkle.abc) and +the string `ABC`. Otherwise while there's a remaining arg if it's a file it will +run the program on the file. If it's not a file it'll run it as a string. + +The `*.abc` files are provided as music samples. ## Judges' remarks: diff --git a/2013/endoh3/endoh3.c b/2013/endoh3/endoh3.c index ef1a255a1..dfdd552db 100644 --- a/2013/endoh3/endoh3.c +++ b/2013/endoh3/endoh3.c @@ -1 +1 @@ -char a;float b,c;main(d){for(;d>2e3*c?c=1,scanf(" %c%f",&a,&c),d=55-a%32*9/5,b=d>9,d=d%13-a/32*12:1;a=2)++d<24?b*=89/84.:putchar(a=b*d);} \ No newline at end of file +char a;float b,c;main(d,e)char**e;{for(;d>2e3*c?c=1,scanf(" %c%f",&a,&c),d=55-a%32*9/5,b=d>9,d=d%13-a/32*12:1;a=2)++d<24?b*=89/84.:putchar(a=b*d);} diff --git a/2013/endoh3/try.sh b/2013/endoh3/try.sh new file mode 100755 index 000000000..02606cd4c --- /dev/null +++ b/2013/endoh3/try.sh @@ -0,0 +1,116 @@ +#!/usr/bin/env bash +# +# try.sh - demonstrate IOCCC winner 2013/endoh3 +# + +# 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 + +# Because there are numerous ways to run this entry we check for different tools +# being installed in order to determine how to proceed. Even so /dev/dsp seems +# to be uninstalled in modern systems so we check for what the author suggested +# with that but only if the other options won't work (like SoX not installed). +# +SOX="$(type -P sox)" +PADSP="$(type -P padsp)" +RUBY="$(type -P ruby)" + +endoh3() +{ + if [[ "$#" -ne 1 ]]; then + echo "$0: endoh3() requires one arg, got: $#" 1>&2 + return + fi + if [[ -f "$1" && -r "$1" ]]; then + if [[ -n "$SOX" ]]; then + echo "$ cat $1 | ./endoh3 | $SOX -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio" 1>&2 + read -r -n 1 -p "Press any key to continue: " + echo 1>&2 + # The author suggested the form below and it simplifies the command + # as well so we disable the supposed useless cat (there are no + # useless cats). + # + # SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead. + # https://www.shellcheck.net/wiki/SC2002 + # shellcheck disable=SC2002 + cat "$1" | ./endoh3 | "$SOX" -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio + echo 1>&2 + elif [[ -n "$PADSP" ]]; then + echo "$ cat $1 | ./endoh3 | $PADSP tee /dev/dsp > /dev/null" 1>&2 + read -r -n 1 -p "Press any key to continue: " + echo 1>&2 + # The author suggested the form below and it simplifies the command + # as well so we disable the supposed useless cat (there are no + # useless cats). + # + # SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead. + # https://www.shellcheck.net/wiki/SC2002 + # shellcheck disable=SC2002 + cat "$1" | ./endoh3 | "$PADSP" tee /dev/dsp > /dev/null + echo 1>&2 + elif [[ -n "$RUBY" ]]; then + echo "$ cat $1 | ./endoh3 | $RUBY wavify.rb > $1.wav" 1>&2 + read -r -n 1 -p "Press any key to continue: " + echo 1>&2 + # The author suggested the form below and it simplifies the command + # as well so we disable the supposed useless cat (there are no + # useless cats). + # + # SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead. + # https://www.shellcheck.net/wiki/SC2002 + # shellcheck disable=SC2002 + cat "$1" | ./endoh3 | "$RUBY" wavify.rb > "$1".wav + echo "Now try playing $1.wav in a program that plays WAV files." 1>&2 + echo 1>&2 + else + echo "Please install either SoX, ruby or padsp (from PulseAudio)." 1>&2 + exit 1 + fi + else # no file + if [[ -n "$SOX" ]]; then + echo "$ echo $1 | ./endoh3 | $SOX -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio" 1>&2 + read -r -n 1 -p "Press any key to continue: " + echo 1>&2 + echo "$1" | ./endoh3 | "$SOX" -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio + echo 1>&2 + elif [[ -n "$PADSP" ]]; then + echo "$ echo $1 | ./endoh3 | $PADSP tee /dev/dsp > /dev/null" 1>&2 + read -r -n 1 -p "Press any key to continue: " + echo 1>&2 + echo "$1" | ./endoh3 | "$PADSP" tee /dev/dsp > /dev/null + echo 1>&2 + elif [[ -n "$RUBY" ]]; then + echo "$ echo $1 | ./endoh3 | $RUBY wavify.rb > $1.wav" 1>&2 + read -r -n 1 -p "Press any key to continue: " + echo 1>&2 + echo "$1" | ./endoh3 | "$RUBY" wavify.rb > "$1".wav + echo "Now try playing $1.wav in a program that plays WAV files." 1>&2 + echo 1>&2 + else + echo "Please install either SoX, ruby or padsp (from PulseAudio)." 1>&2 + exit 1 + fi + fi +} + +if [[ "$#" -lt 1 ]]; then + # if we have no arg just run endoh3 with twinkle.abc and the string ABC. + endoh3 twinkle.abc + endoh3 ABC + endoh3 CDEFGABc +else + # otherwise while we have an arg run endoh3 on it as a file or string + while [[ "$#" -gt 0 ]]; do + endoh3 "$1" + shift 1 + done +fi diff --git a/thanks-for-help.md b/thanks-for-help.md index ba05f795d..1d2b540de 100644 --- a/thanks-for-help.md +++ b/thanks-for-help.md @@ -3977,6 +3977,14 @@ not found. The entry can still be enjoyed if you do not have these tools, however. +## [2013/endoh3](/2013/endoh3/endoh3.c) ([README.md](/2013/endoh3/README.md)) + +[Cody](#cody) added the [try.sh](/2013/endoh3/try.sh) script. + +Cody also (out of an abundance of caution for `clang(1)` which is strict with +arg type and count to `main()`) added a second (unused) arg to `main()`. + + ## [2013/endoh4](/2013/endoh4/endoh4.c) ([README.md](/2013/endoh4/README.md)) [Cody](#cody) added the [try.sh](/2013/endoh4/try.sh) script which temporarily