Files
brc/brc.exs
2024-01-17 15:00:57 +01:00

40 lines
931 B
Elixir

Mix.install([
{:flow, "~> 1.2.4"},
{:ex_cldr_collation, "~> 0.7.2"}
])
defmodule Brc do
require Logger
def run(path) do
for {city, [min, max, mean]} <- parse_file(path) do
"#{city}=#{min}/#{max}/#{Float.round(mean, 1)}"
end
|> Enum.sort(Cldr.Collation)
|> Enum.join(",")
|> then(fn out -> "{" <> out <> "}" end)
|> IO.puts()
end
def parse_file(path) do
Logger.info("parse file #{path}")
File.stream!(path)
|> Flow.from_enumerable()
|> Flow.map(&parse_line/1)
|> Flow.partition()
|> Flow.reduce(fn -> %{} end, fn {city, temp}, acc ->
Map.update(acc, city, [temp, temp, temp], fn [prev_min, prev_max, mean] ->
[min(prev_min, temp), max(prev_max, temp), (mean + temp) / 2]
end)
end)
end
def parse_line(line) do
[city, temp] = String.trim(line) |> String.split(";")
{city, String.to_float(temp)}
end
end
Brc.run("./priv/data.txt")