Add 2020/kurdyukov2/try.sh + format/typo checks

Also made a minor change to makegif.sh to use $0 instead of literal
'makegif.sh' in usage string.
This commit is contained in:
Cody Boone Ferguson committed 2023-12-22 10:34:35 -08:00
1 parent 85042e4487
commit 635bad2b1a
4 files changed
+75 -20

No files matched your search

+20 -18
View File
@@ -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.
+1 -1
View File
@@ -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."
+51
View File
@@ -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
+3 -1
View File
@@ -4411,7 +4411,9 @@ use the program to play the WAV files (and in one case `stdout`).
## <a name="2020_kurdyukov2"></a>[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`).