169 похожих чатов

Впервые код пишу на функциональном языке и кажись я оч

плохо это делаю
Можете подсказать как получше подойти к написанию такого простенького кода?
В целом у меня главная проблема с этим громадным выражением которое преобразует список строк во вложенные списки с числами
["123\r\n1223123\r\n999\r\n", "555\r\n696\r\n" ] ->
[[123, 1223123, 999], [555, 696]]

def mostCalories do
{:ok, data} = File.read("./input.txt")
listData = String.split(data, "\r\n\r\n")

numList =
listData
|> Enum.map(fn elve ->
String.split(elve, "\r\n")
|> Enum.map(fn str ->
case Integer.parse(str) do
{int, _rest} -> int
:error -> 0
end
end)
end)
summedList = numList |> Enum.map(&Enum.sum(&1))
sortedList = Enum.sort(summedList, &>=/2)
Enum.take(sortedList, 3) |> Enum.sum()
end

11 ответов

68 просмотров

если я правильно понял что код пытается сделать, то не так уж плохо, только причесать надо. что то вроде этого (не запускал самой собой) def most_calories do {:ok, data} = File.read("./input.txt) data |> String.split("\r\n\r\n") |> Enum.map(fn line -> line |> String.split("\r\n") |> Enum.map(fn str -> case Integer.parse(str) do {int, _rest} -> int :error -> 0 end end) |> Enum.sum() end) |> Enum.sort(:desc) |> Enum.take(3) |> Enum.sum() end

Просто выносишь в отдельную функцию и не будет этого громадного выражения

Ivan-Lukov Автор вопроса

Если я не вижу функцию, значит её нет)

Ivan Lukov
Если я не вижу функцию, значит её нет)

чаще всего fn -> ... лучше вынести в отдельную именованую функцию defp .... А лесенку из двух вложенных fn и подавно, иначе при чтении такого кода можно случайно сломать мозг)

Alexey Novoselov
чаще всего fn -> ... лучше вынести в отдельную име...

и потом скроль туда сюда ищи чтобы понять что происходит)

Aliaksandr
и потом скроль туда сюда ищи чтобы понять что прои...

Если давать осмысленные названия, то и так понятно

Евгений
Если давать осмысленные названия, то и так понятно

реальн что это я, нейминг функций это же давно решенная проблема, все это знают

Alexey Novoselov
чаще всего fn -> ... лучше вынести в отдельную име...

Если уж занудствовать, то считается хорошим тоном объявлять функцию там где она применяется (если это лямбда функция). Если же она переиспользуется в нескольких местах - стоит вынести в приватную функцию модуля

defmodule CalParser do @spec decode(binary()) :: list(list(integer())) def decode(raw_data) do raw_data |> split_chunks() |> Enum.map(&parse_chunk/1) end defp split_chunks(data), do: String.split(data, "\r\n\r\n") defp parse_chunk(chunk) do chunk |> String.split("\r\n") |> Enum.map(&parse_line/1) end defp parse_line(line) do case Integer.parse(line) do {int, _rest} -> int :error -> 0 end end end def most_calories() do data = "input.txt" |> File.read!() |> CalParser.decode() summed_data = Enum.map(data, &Enum.sum/1) sorted_data = Enum.sort(summed_data, &>=/2) top_three_sum = sorted_data |> Enum.take(3) |> Enum.sum() end Если нету надобности в summed и sorted то тогда надо в один пайп. Просто не понятно что именно ты хочешь выводить

Źmićer Rubinštejn
defmodule CalParser do @spec decode(binary()) ::...

Я лично стараюсь не писать функции с глубиной больше двух пайпов. Поэтому я бы писал примерно так: def mostCalories do {:ok, data} = File.read("./input.txt") num_list = data |> String.split(data, "\r\n\r\n") |> Enum.map(fn elve -> elve |> String.split("\r\n") |> Enum.map(&to_int/1) end) # ... end def to_int(str) when is_bitstring(str) do case Integer.parse(str) do {int, _rest} -> int :error -> 0 end end

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта