2015-09.py: Simplify path searching and weight calculation
2015-09.py: Simplify path searching and weight calculation

breadth_first_search doesn’t do any weight-calculation or
tracking itself, and so doesn’t try to work out what is the
'best' path it has seen.

Instead it now yields those full-length (Hamiltonian) paths
as it finds them, and they are processed by the calling
function (which calculates the weights.)

The search_all_{min,max} functions are now just thin wrappers
around a search_all function, which returns lists containing
tuples of the form (total_cost, path).

The search appears to be less efficient than before, which is
to be expected as there were some attempts to reduce the
search space — for shortest path rather than longest.
These have now been removed, so we’re left with a fairly
straightforward brute-forcing of the problem.

However the code is much easier to reason about now.

robjwells/adventofcode-solutions,robjwells/adventofcode-solutions,robjwells/adventofcode-solutions,robjwells/adventofcode-solutions,robjwells/adventofcode-solutions,robjwells/adventofcode-solutions