Nick Parlante, Nifty Assignments 2011
The "image puzzle" is a short, nifty Media Computation exercise. You have 2-d pixel data for image of a mystery thing, however the pixels are messed up in some way. The students write code to fix the image, and so reveal the mystery object. What makes this assignment nifty is that the code required is quite simple -- basically calling a couple methods, passing in the right values -- yet the puzzle problem is engaging and the output is neat. It's also a pretty short exercise however you slice it. I got his idea originally from David Malan.
I use this in CS101, a CS0 / CS Principles type course. In this course I provide the "loop to touch every pixel", so the students just write the change-one-pixel code, essentially calling a few setXXX() methods with the right values to fix the image.
It's a nice simple assignment idea; as soon as you see it, you'll understand how it works. Part of the value of this page is that three versions, complete with PNG files and problem statements are done, so it's very ready to adopt. Using the CS101 code-in-browser infrastructure below, the puzzles will just run embedded in this page. You can just point students here, or copy the puzzle PNG files to solve it your own way. The original images were public domain, and I hereby place these PNG files in the public domain.
The iron-puzzle.png image is a puzzle; it contains an image of something famous, however the image has been distorted. The famous object is in the red values, however the red values have all been divided by 10, so they are too small by a factor of 10. The blue and green values are all just meaningless random values ("noise") added to obscure the real image. You must undo these distortions to reveal the real image. First, set all the blue and green values to 0 to get them out of the way. Look at the result .. if you look very carefully, you may see the real image, although it is very very dark (way down towards 0). Then multiply each red value by 10, scaling it back up to approximately its proper value. What is the famous object?
The copper-puzzle.png image is a puzzle -- it shows something famous, however the image has been distored. The true image is in the blue and green values, however all the blue and green values have all be divided by 20, so the values are very small. The red values are all just random numbers, noise added on top to obscure things. Undo these distortions to reveal the true image.
First, set the red values to 0 to get that of the way. You may be able to see the image very faintly at this point, but it is very dark. Then multiply the blue and green values by 20 to get them back approximately to their proper values. What is the famous object?
The west-puzzle.png image is a puzzle. It shows something famous, however the image has been distorted. Use if-logic along with other pixel techniques to recover the true image. The true image is exclusively in the blue values, so set all red and green values to 0. The hidden image is encoded using only the blue values that are less than 16 (that is, 0 through 15). If a blue value is less than 16, multiply it by 16 to scale it up to its proper value. Alternately if a blue value in the encoded image is 16 or more, it is random garbage and should be ignored (interpreted as 0). This should yield the recovered image, but all in the blue channel. As a final fix, the image should be in the red channel to look more correct, so change your code to also move the values from the blue channel to the red channel.
Image-Puzzle is a neat exercise, where the students write a few lines of code to reveal a hidden image.
CS0 or later. It's a unique combination of a quite simple code and an engaging puzzle. In CS0 I provide all the infrastructure, and they just write the core "fix one pixel" code which is basically just a few setXXX() calls with the right expressions to fix the image. To add work for a more advanced class, you could make the students implement loading and displaying the images.
The code required is quite simple. However, you also need to have explained that an image is made of pixels and each pixel can be represented by red/green/blue values. The x/y organization of the pixels is not stressed by this project, as you basically just loop over all the pixels. Obviously this is pretty easy to implement in any language.
The strength of this assignment is that the "puzzle" aspect draws the students in, the code required is small, so it can fit into a course easily, and the output is quite neat. Because it is so small, it's pretty easy for the instructor to create more instances of it.
It's a small assignment. It's a great way to make a few points about pixels and motivate writing some method-calling code, but it's not that big. It's just a little thing you can use.
Extra info about this assignment: