【问题标题】:nested list comprehension in elixir长生不老药中的嵌套列表理解
【发布时间】:2016-08-03 10:05:31
【问题描述】:

为了学习 Elixir,我想解决这个问题:https://projecteuler.net/problem=96

为了通过董事会,我会这样开始: 在python中:

row_indexes = ["A","B","C","D","E","F","G","H","I"];
col_indexes = ["1","2","3","4","5","6","7","8","9"];
row_box_indexes = [["A","B","C"],["D","E","F"],["G","H","I"]];
col_box_indexes = [["1","2","3"],["4","5","6"],["7","8","9"]];

cols = [[r+c for r in row_indexes] for c in col_indexes]
rows = [[r+c for c in col_indexes] for r in row_indexes]
boxes = [[r+c for c in C for r in R] for C in col_box_indexes for R in row_box_indexes]

print(cols) // [['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],...,['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9']]

我正在努力在 elixir 中使用列表理解我尝试了这个,但它给我一个包含我所有结果的列表

row_indexes = ["A","B","C","D","E","F","G","H","I"];
col_indexes = ["1","2","3","4","5","6","7","8","9"];
row_box_indexes = [["A","B","C"],["D","E","F"],["G","H","I"]];
col_box_indexes = [["1","2","3"],["4","5","6"],["7","8","9"]];

# in iex
for c <- col_indexes,
    x <- (for r <- row_indexes, do: r<>c),
    do: x

# ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1", "I1", "A2", "B2", "C2", "D2",..., "I5", "A6", "B6", "C6", "D6", "E6", ...]

1) 在 Elixir 中解决这个问题的好方法吗?

2) 你能解释一下我如何在 python 中达到与 print(cols) 相同的结果吗?

谢谢你:)

【问题讨论】:

  • 在长生不老药中可能有完全不同的方法。简而言之,您为板上的每个方块、每一行和每一列生成一个新进程。然后,您开始在这些进程之间传递消息以发展董事会的状态。如果您愿意,我可以在答案中更好地解释。

标签: elixir


【解决方案1】:

两种理解之间存在差异。在 python 中,您在外部推导上生成一个内部推导列表,而在 Elixir 版本中,没有用于创建嵌套列表的嵌套推导。

标题中for r &lt;- row_indexes, do: r&lt;&gt;c 的结果当然是一个列表,但是它将沿着每个c 的结果进行迭代,以创建c 和r 值的笛卡尔积。

因此,理解的每次迭代都会为您提供当前col_index 和对应的r&lt;&gt;c 的值。当您只返回理解索引的第二个键时,您会得到一个列表。

一种解决方法是对行索引进行实际嵌套的理解,如下所示:

for c <- col_indexes do
  for r <- row_indexes do
    r<>c
  end
end

【讨论】:

    【解决方案2】:

    感谢劳罗的回答! 所以是的,两种理解都是不同的,在 python 和 Elixir 中不可能做同样的事情 这个解决方案(可能不是最好的......)比 python 长,但它有效:

      @doc """
      generate all the rows coordinates
          [[{0,0},{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},],...]
      """
      def create_rows(size \\ 9) do
        Enum.reduce(0..size - 1, [], fn(ord,acc) ->
          col = Enum.reduce(0..size - 1, [], fn(abs, accu) ->
            [{abs,ord}|accu]
          end)
          |> Enum.reverse
          [col | acc]
        end)
        |> Enum.reverse
      end
    

    它会生成这个:

    [
      [{0,0},{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},],
      [{0,1},{1,1},{2,1},{3,1},{4,1},{5,1},{6,1},{7,1},{8,1},],
      [{0,2},{1,2},{2,2},{3,2},{4,2},{5,2},{6,2},{7,2},{8,2},],
      [{0,3},{1,3},{2,3},{3,3},{4,3},{5,3},{6,3},{7,3},{8,3},],
      [{0,4},{1,4},{2,4},{3,4},{4,4},{5,4},{6,4},{7,4},{8,4},],
      [{0,5},{1,5},{2,5},{3,5},{4,5},{5,5},{6,5},{7,5},{8,5},],
      [{0,6},{1,6},{2,6},{3,6},{4,6},{5,6},{6,6},{7,6},{8,6},],
      [{0,7},{1,7},{2,7},{3,7},{4,7},{5,7},{6,7},{7,7},{8,7},],
      [{0,8},{1,8},{2,8},{3,8},{4,8},{5,8},{6,8},{7,8},{8,8},],
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多