diff --git a/2020/kurdyukov2/README.md b/2020/kurdyukov2/README.md index a37474b9e..0b051bf8a 100644 --- a/2020/kurdyukov2/README.md +++ b/2020/kurdyukov2/README.md @@ -19,29 +19,27 @@ make ./prog 1000 selfie.jpg output.jpg # Admire your portrait in cubist style -(echo P6 1024 1024 255; dd if=/dev/urandom bs=3M count=1) > random.ppm -# Look at random.ppm. Do you see any patterns? -./prog_ppm 1000 random.ppm output.ppm -# See which patterns the program has found - -for i in 0001 0002 0004 0008 0016 0032 0064 0128 0256 0512 1024 2048 4096 8192 ; do ./prog $i sample.jpg out$i.jpg; done -# Then flip through the out*.jpg pictures and see when you start recognizing the image. -`` +./try.sh +``` ## Judges' remarks: -This entry has reminded us of a winning entry back in the early 90s. Can you guess which one? +This entry has reminded us of a winning entry back in the early 90s. Can you +guess which one? -For a given image, try graphing the execution time relative to the number of rectangles. -What is the complexity? Is it obvious from the source code? +For a given image, try graphing the execution time relative to the number of +rectangles. What is the complexity? Is it obvious from the source code? ## Author's remarks: + ### Usage -This program divides the image into a specified number of rectangles. This process is content aware, so algorithm tries to match most of the information. However, it doesn't find the best theoretically possible layout. +This program divides the image into a specified number of rectangles. This +process is content aware, so the algorithm tries to match most of the information. +However, it doesn't find the best theoretically possible layout. ```sh ./prog 1000 input.jpg output.jpg @@ -54,7 +52,7 @@ You can build three versions, depending on the image format. Default is JPEG version; if you have the `libjpeg` development package installed in your system, then `make` without arguments should do the right thing. -If you want to use `libjpeg` compiled from sources, then use `LIBS` define to +If you want to use `libjpeg` compiled from sources, then use the `LIBJPEG` define to specify the path to includes and the library. For example using [libjpeg source](https://mac-dev-env.patrickbougie.com/libjpeg/) version 9c: @@ -68,7 +66,8 @@ Use this command to build a PNG version (you need `libpng`): make prog_png LIBPNG="-lpng" ``` -And the PPM version (no additional dependencies, can read raw/ASCII PPM, writes raw PPM): +And the PPM version (no additional dependencies, can read raw/ASCII PPM, writes +raw PPM): ``` make prog_ppm @@ -76,7 +75,8 @@ make prog_ppm ### Building on macOS with MacPorts: -- Thanks to [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) for this information! +Thanks to [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) for this +information! First, make sure you have the compiler tools installed e.g. by: @@ -90,12 +90,13 @@ Make sure you install [MacPorts](https://www.macports.org/install.php). Then do: sudo port install jpeg libpng ImageMagick ``` -The program itself doesn't need ImageMagick, install it only if you plan to make GIFs from the results using `makegif.sh`. +The program itself doesn't need ImageMagick, install it only if you plan to make +GIFs from the results using `makegif.sh`. After that’s installed you need to run make with these options: ```sh -make LIBS="-I/opt/local/include -L/opt/local/lib" +make LDFLAGS="-I/opt/local/include -L/opt/local/lib" ``` ### Building on macOS with HomeBrew @@ -121,11 +122,12 @@ You are now ready to compile this entry: make clobber all ``` + ### Notes Made this thing while experimenting with the idea of representing an image with rectangles (lossy compression). It's not very good in that sense, but the -results look funny, like a kind of cubism pixelart. +results look funny, like a kind of cubism pixel art. Do not use values above 50000, it'll be slow. diff --git a/2020/kurdyukov2/makegif.sh b/2020/kurdyukov2/makegif.sh index f84533f0f..906f29fd9 100755 --- a/2020/kurdyukov2/makegif.sh +++ b/2020/kurdyukov2/makegif.sh @@ -6,7 +6,7 @@ ext="${image##*.}" dir="gif" [ $# -lt 3 ] && [ "$ext" = "png" -o "$ext" = "ppm" ] && prog="./prog_$ext" [ -f "$image" ] || { - echo "Usage: makegif.sh image.jpg output.gif ./prog" + echo "Usage: $0 image.jpg output.gif ./prog" echo "Dependencies: ImageMagick, bc (basic calculator)" echo "Note: don't use large images (dimensions above 1000), ImageMagick may fail." echo "Uses \"gif\" directory for temporary files." diff --git a/2020/kurdyukov2/try.sh b/2020/kurdyukov2/try.sh new file mode 100755 index 000000000..3c5a2d384 --- /dev/null +++ b/2020/kurdyukov2/try.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +# +# try.sh - demonstrate IOCCC winner 2020/kurdyukov2 +# + +# 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 + +# try finding convert(1) from ImageMagick +CONVERT="$(type -P convert)" + + +echo "$ (echo P6 1024 1024 255; dd if=/dev/urandom bs=3M count=1) > random.ppm" 1>&2 +(echo P6 1024 1024 255; dd if=/dev/urandom bs=3M count=1) > random.ppm +echo "Look at random.ppm. Do you see any patterns?" 1>&2 +read -r -n 1 -p "Press any key to continue: " +echo 1>&2 +# Look at random.ppm. Do you see any patterns? +echo "$ ./prog_ppm 1000 random.ppm output.ppm" 1>&2 +./prog_ppm 1000 random.ppm output.ppm +echo 1>&2 +# See which patterns the program has found +echo "Now open output.ppm. What patterns has the program found?" 1>&2 +echo 1>&2 +read -r -n 1 -p "Press any key to continue: " +echo 1>&2 + +echo "$ for i in 0001 0002 0004 0008 0016 0032 0064 0128 + 0256 0512 1024 2048 4096 8192 ; do ./prog $i sample.jpg out$i.jpg; done" 1>&2 +for i in 0001 0002 0004 0008 0016 0032 0064 0128 0256 0512 1024 2048 4096 8192 ; do ./prog "$i" sample.jpg "out$i".jpg; done +echo "Now flip through out*.jpg and see when you start to recognise the image." 1>&2 + +if [[ -n "$CONVERT" ]]; then + echo 1>&2 + read -r -n 1 -p "Press any key to create GIF: " + echo 1>&2 + echo "$ $CONVERT -delay 10 -dither none -loop 0 $(ls out*.jpg | sort -V) $(ls out*.jpg | sort -rV) +map out.gif" 1>&2 + "$CONVERT" -delay 10 -dither none -loop 0 $(ls out*.jpg | sort -V) $(ls out*.jpg | sort -rV) +map out.gif + echo 1>&2 + echo "Now look at out.gif with a viewer that can show animation." 1>&2 + echo "Warning: includes flashing colours." 1>&2 +fi diff --git a/thanks-for-help.md b/thanks-for-help.md index 7a2e30da1..51106ee4f 100644 --- a/thanks-for-help.md +++ b/thanks-for-help.md @@ -4411,7 +4411,9 @@ use the program to play the WAV files (and in one case `stdout`). ## [2020/kurdyukov2](/2020/kurdyukov2/prog.c) ([README.md](/2020/kurdyukov2/README.md)) -[Cody](#cody) added `-L`/`-I` paths to the Makefile to let this compile more easily if +[Cody](#cody) added the [try.sh](/2020/kurdyukov2/try.sh) script. + +Cody also added `-L`/`-I` paths to the Makefile to let this compile more easily if the user has installed the appropriate library with [MacPorts](https://www.macports.org) (with the default MacPorts prefix `/opt/local`).