# Best of Show - Most Shrinkable Don Yang ## Judges' comments: ### To build: make akari ### To run: ./akari [input_file_or_- [output_file_or_- [even]]] ### Try: ./akari < example.ppm > odd_output.ppm ./akari - - even < example.ppm > even_output.ppm ./akari example.ppm odd_output.ppm make akari2.c cat akari2.c make akari2 ./akari2 < akari2.c ./akari2 rot13 < akari2.c make akari3.c cat akari3.c make akari3 ./akari3 make akari4.c cat akari4.c ./akari4 ### Selected Judges Remarks: Akari is an image downsampling utility that accepts 3 inout formats: * PGM (netpbm grayscale image). Akari only accept PGM files with this header: P5 255. Images with extra comments such as the ones produced by GIMP will not be parsed properly. * PPM (netpbm RGB image). Only PPM files with this header are accepted: P6 255. * ASCII art (with end of lines in LF bytes only, not CR-LF) Anything that is not parseable as PGM or PPM will be downsampled as ASCII art. ## Author's comments: Akari is an image downsampling utility. She accepts up to 3 arguments: First argument is the input image. If it's "-" or unspecified, Akari will read from stdin. Second argument is the output image. If it's "-" or unspecified, Akari will write to stdout. Third argument, if specified, causes Akari to keep even pixels on even scanlines. By default Akari will keep odd pixels on odd scanlines. Examples: gcc akari.c -o akari ./akari < example.ppm > odd_output.ppm ./akari - - even < example.ppm > even_output.ppm ./akari example.ppm odd_output.ppm Akari accepts 3 input formats: * PGM (netpbm grayscale image). Akari only accept PGM files with this header: P5 255. Images with extra comments such as the ones produced by GIMP will not be parsed properly. * PPM (netpbm RGB image). Only PPM files with this header are accepted: P6 255. * ASCII art (with end of lines in LF bytes only, not CR-LF) This is useful for decoding some curiously interlaced images, such as the included example.ppm Anything that is not parseable as PGM or PPM will be downsampled as ASCII art. Since the source code is formatted as ASCII art, it's only natural to try: ./akari akari.c akari2.c akari2.c is also a valid C program, and accepts up to 1 argument. By default, this second program reads text from stdin and writes expanded output to stdout. If the extra argument is specified, the output text will also pass through a rot13 filter. gcc akari2.c -o akari2 ./akari2 < input.txt > expanded_output.txt ./akari2 rot13 < input.txt > expanded_and_rot13_output.txt You can combine the two programs together to have just a regular rot13 filter: ./akari2 rot13 < input.txt | ./akari > rot13.txt Of course, we wouldn't stop with just 2 programs, you can downsample the source *again* and get yet another C program: ./akari < akari.c | ./akari > akari3.c We must go deeper: ./akari < akari.c | ./akari | ./akari > akari4.c akari3.c and akari4.c are still (mostly valid) C programs. "gcc -Wall" will output a few warnings, but still produce output executables. The output executables each print a message to stdout. It takes quite a bit of skill and obfuscation to interleave a C program 4 levels deep, it's much easier to interleave something like a brainf#$% program in a C program, for example. For comparison, a brainf#$% program is embedded inside akari.c --------------------------------------------------------------------------------