首页 > 解决方案 > 如何生成具有不同组合的连续整数列表?

问题描述

我想生成从 1 到 6(1,2,3,4,5,6)的所有可能的整数列表(长度为 5),其中至少有 4 个按顺序排列的整数。

例如:

[6,1,2,3,4] -> 1,2,3,4 are in sequential order 

[1,3,4,5,6] -> 3,4,5,6 are in sequential order 

[2,3,4,5,1] -> 2,3,4,5 are in sequential order

[1,2,3,4,5] -> 1,2,3,4 and 2,3,4,5 are in sequential order

每个数字只能在列表中出现一次

请帮助完成这项任务。怎么可能解决?

目前我尝试了这样的选择:

Enum.map(1..6, fn a -> [a, b, c, d] = Enum.to_list(a..6) |> Enum.shuffle() |> Enum.take(4) |> Enum.sort() end )
Enum.map(0..2, fn a -> [x,y,z,w] = [a + 1, a + 2, a + 3, a + 4]  end )
Enum.map(1..3, fn a -> Enum.to_list(a..6) end)

但所有选项都无法正常工作

标签: elixirpermutation

解决方案


我确信必须有更好的方法来做到这一点,但这似乎有效。我使用了Rosetta Code permutations 实现并添加了一个外层,它根据您指定的顺序条件过滤最终结果。

defmodule Example do
  def run() do
    list = [1, 2, 3, 4, 5, 6]

    for x <- list,
        [a, b, c, d, e] <- permute(list -- [x]),
        (a == b - 1 && b == c - 1 && c == d - 1) ||
          (b == c - 1 && c == d - 1 && d == e - 1) do
      [a, b, c, d, e]
    end
  end

  def permute([]), do: [[]]

  def permute(list) do
    for x <- list, y <- permute(list -- [x]), do: [x | y]
  end
end

结果:

iex> Example.run
[
  [2, 3, 4, 5, 6],
  [3, 4, 5, 6, 2],
  [6, 2, 3, 4, 5],
  [1, 3, 4, 5, 6],
  [3, 4, 5, 6, 1],
  [1, 2, 3, 4, 6],
  [6, 1, 2, 3, 4],
  [1, 2, 3, 4, 5],
  [2, 3, 4, 5, 1],
  [5, 1, 2, 3, 4]
]

推荐阅读