根据子值计算父值

  • 本文关键字:计算 elixir comparison
  • 更新时间 :
  • 英文 :


如果标题没有意义,我很抱歉,我很难准确地描述它是什么,但希望下面的内容能给你启发。

这是AoC挑战的一部分,但我相信这是一个足够具体的问题,无论如何都可能遇到它。对于这个挑战,我认为我的方法不对,造一棵树会更好,但现在我只想知道如何解决这个问题。


我在哪里

我的数据如下:

iex(249)> Day7.part1
[
%{path: ["/", "a", "e"], size: 584},
%{path: ["/", "a"], size: 94269},
%{path: ["/", "d"], size: 24933642},
%{path: ["/"], size: 23352670}
]

我想做的是遍历比较:path值的位置,如果它们匹配,则较短的列表必须是父列表,并且父列表:size将被更新,以便size: parent.size + child.size。或者至少是类似的。


期望输出值

iex(249)> Day7.part1
[
%{path: ["/", "a", "e"], size: 584},
%{path: ["/", "a"], size: 94853},
%{path: ["/", "d"], size: 24933642},
%{path: ["/"], size: 48381165}
]

我已经尝试过了

def child_dirs([], system), do: system
def child_dirs([head | tail] = dirs, system) do
Enum.map(dirs, fn x ->
if x.path == List.delete_at(head.path, -1) do
system = system ++ [%{path: x.path, size: head.size + x.size}]
end
end)
child_dirs(tail, system)
end

结果如下

iex(281)> Day7.part1 |> Day7.child_dirs([])
[]

但是如果我改变system = system ++ ...来检查它,像这样IO.inspect(system = system ++ [%{path: x.path, size: head.size + x.size}])。我得到以下内容:

iex(284)> Day7.part1 |> Day7.child_dirs([])
[%{path: ["/", "a"], size: 94853}]
[%{path: ["/"], size: 23446939}]
[%{path: ["/"], size: 48286312}]
[]

所以它显然在某些方面工作,但只是没有将更新的值添加到正在进行的累加器命名为system

任何帮助或建议将不胜感激:)

这很可能不是最优的方式,但却是最干净、最习惯的方式——AFACT。

input
[
%{path: ["/", "a", "e"], size: 584},
%{path: ["/", "a"], size: 94269},
%{path: ["/", "d"], size: 24933642},
%{path: ["/"], size: 23352670}
]

遍历列表,从列表中选择以当前元素开头的元素,并将它们全部相加。

for %{path: path} <- input do
size =
input
|> Enum.filter(&Enum.slice(&1.path, 0..length(path)-1) == path)
|> Enum.map(& &1.size)
|> Enum.sum()
%{path: path, size: size}
end
#⇒ [
#   %{path: ["/", "a", "e"], size: 584},
#   %{path: ["/", "a"], size: 94853},
#   %{path: ["/", "d"], size: 24933642},
#   %{path: ["/"], size: 48381165}
# ]

相关内容

  • 没有找到相关文章

最新更新