defmodule Population do
def count_people(people) do
people
|> Enum.reduce(%{}, fn (%{ birth: birth, death: death }, acc) ->
acc
|> Map.update(birth, 1, &(&1 + 1))
|> Map.update(death, -1, &(&1 - 1))
end)
|> Enum.scan({0, 0}, fn({ year, population }, { _, population_acc }) -> { year, population + population_acc } end)
|> Enum.max_by(fn({_, year}) -> year end)
end
end
people = [
%{ birth: 1920, death: 1950 },
%{ birth: 1920, death: 1980 },
%{ birth: 1940, death: 1990 },
%{ birth: 1930, death: 1940 },
%{ birth: 1970, death: 2010 },
%{ birth: 1920, death: 1960 },
%{ birth: 1720, death: 1860 },
%{ birth: 1730, death: 1810 }
];
people
|> Population.count_people
|> IO.inspect
ZGVmbW9kdWxlIFBvcHVsYXRpb24gZG8KICAgIGRlZiBjb3VudF9wZW9wbGUocGVvcGxlKSBkbwogICAgICAgIHBlb3BsZQogICAgICAgICAgICB8PiBFbnVtLnJlZHVjZSgle30sIGZuICgleyBiaXJ0aDogYmlydGgsIGRlYXRoOiBkZWF0aCB9LCBhY2MpIC0+CiAgICAgICAgICAgICAgICBhY2MKICAgICAgICAgICAgICAgICAgICB8PiBNYXAudXBkYXRlKGJpcnRoLCAxLCAmKCYxICsgMSkpCiAgICAgICAgICAgICAgICAgICAgfD4gTWFwLnVwZGF0ZShkZWF0aCwgLTEsICYoJjEgLSAxKSkKICAgICAgICAgICAgZW5kKQogICAgICAgICAgICB8PiBFbnVtLnNjYW4oezAsIDB9LCBmbih7IHllYXIsIHBvcHVsYXRpb24gfSwgeyBfLCBwb3B1bGF0aW9uX2FjYyB9KSAtPiB7IHllYXIsIHBvcHVsYXRpb24gKyBwb3B1bGF0aW9uX2FjYyB9IGVuZCkKICAgICAgICAgICAgfD4gRW51bS5tYXhfYnkoZm4oe18sIHllYXJ9KSAtPiB5ZWFyIGVuZCkKICAgIGVuZAplbmQKCnBlb3BsZSA9IFsKICAleyBiaXJ0aDogMTkyMCwgZGVhdGg6IDE5NTAgfSwKICAleyBiaXJ0aDogMTkyMCwgZGVhdGg6IDE5ODAgfSwKICAleyBiaXJ0aDogMTk0MCwgZGVhdGg6IDE5OTAgfSwKICAleyBiaXJ0aDogMTkzMCwgZGVhdGg6IDE5NDAgfSwKICAleyBiaXJ0aDogMTk3MCwgZGVhdGg6IDIwMTAgfSwKICAleyBiaXJ0aDogMTkyMCwgZGVhdGg6IDE5NjAgfSwKICAleyBiaXJ0aDogMTcyMCwgZGVhdGg6IDE4NjAgfSwKICAleyBiaXJ0aDogMTczMCwgZGVhdGg6IDE4MTAgfQpdOwoKcGVvcGxlCiAgICB8PiBQb3B1bGF0aW9uLmNvdW50X3Blb3BsZQogICAgfD4gSU8uaW5zcGVjdA==