【问题标题】:Calculating parent value based on children values根据子值计算父值
【发布时间】:2022-12-10 23:45:58
【问题描述】:

如果标题没有意义,我深表歉意,我正在努力准确地描述它是什么,但希望以下内容能给您带来启发。

这是 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

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

【问题讨论】:

    标签: elixir comparison


    【解决方案1】:

    这很可能不是最佳方式,但它是最简洁和惯用的方式,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}
    # ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多