如果标题没有意义,我很抱歉,我很难准确地描述它是什么,但希望下面的内容能给你启发。
这是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}
# ]