Problem description is copied verbatim from the linked Code Review question:
Problem Statement
A group of farmers has some elevation data, and we're going to help
them understand how rainfall flows over their farmland.
We'll represent the land as a two-dimensional array of altitudes and
use the following model, based on the idea that water flows downhill:
If a cell’s four neighboring cells all have higher altitudes, we call
this cell a sink; water collects in sinks.
Otherwise, water will flow to the neighboring cell with the lowest
altitude. If a cell is not a sink, you may assume it has a unique
lowest neighbor and that this neighbor will be lower than the cell.
Cells that drain into the same sink – directly or indirectly – are
said to be part of the same basin.
Your challenge is to partition the map into basins. In particular,
given a map of elevations, your code should partition the map into
basins and output the sizes of the basins, in descending order.
Assume the elevation maps are square. Input will begin with a line
with one integer, S, the height (and width) of the map. The next S
lines will each contain a row of the map, each with S integers – the
elevations of the S cells in the row. Some farmers have small land
plots such as the examples below, while some have larger plots.
However, in no case will a farmer have a plot of land larger than S =
5000.
Your code should output a space-separated list of the basin sizes, in
descending order. (Trailing spaces are ignored.)
For examples see the the linked question :)
I like this challenge because it can be solved in so many different ways. It has a large variety of solution processes and it helps with correctly extrapolating from small problem spaces into big problem spaces. Making code correctly deal with scaling is hard for many programmers and this would make for a great project in a new language where (the millionth) FizzBuzz and (the billionth) Linked Lists are utterly boring, but bigger problems seem daunting