Advent 2019 Day 8 - addendum - generating inputs
As I said in my last post, day 8 would be a nice project or lesson in an APCS-A or college CS1 class. Another nice problem would be to write a program to generate an image in the format required by the question. Alternatively, a teacher doing day 8 with their classes might want to generate a bunch of images for the students to test their decoders on.
I thought I'd write one to see how appropriate it would be for the students. I tried to do it without anything fancy or advanced.
To start, you'll need a way to generate the block text for the images. I found this site and used the Banner3 font. I generated some text and saved it in a file. The important thing for our purposes is that any space will count as white and any character as black.
The encoded image is a N * Width * Height sequence of digits where each Width * Height sequence of digits represents one layer. See the problem text for details.
You can follow along with the code here.
So, here's how the program works:
The top 51 lines of the program consist of a routine which I'll describe later and code to handle command line argument (to set the number of layers).
Then, on line 55 I erad in the file with the source image (from stdin).
In line 57 through 63, I loop over the data and changed each non space or newline to a star character. I really don't have to do this but I wanted to see what the image looked like in just "black and white."
Line 65 through 67 is where I split on the newlines. Now I could take the length of any line to get the image width and the number of lines the height.
70 through 79 creates a long list for the image. At each location, I
generate a list of values. Each list has one entry per layer. The
actual pixel value (1 or 0) is stored at a random location. Everything
before that is a random choice between the real color and transparent
and everything after is just random. Details for that step are in the
genpixel
routine.
Finally, in 83 through 89 I loop over each layer and for each layer the image and and output all the values into a single string.
This is then output to stdout while the dimensions go to stderr.
If I had a source image in a file named "hello.dat" I'd convert it to
source input for day 8 by typing cat hello.dat | python3 day08-generator.py
-l 10 > day08-input.dat
. This would create a 10 layer input.
That's it. Once again, the code is all here. It would make for another nice student assignment or for a teacher to prepare inputs for the class.
Enjoy.