elixir - 如何生成具有不同组合的连续整数列表?
问题描述
我想生成从 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)
但所有选项都无法正常工作
解决方案
我确信必须有更好的方法来做到这一点,但这似乎有效。我使用了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]
]
推荐阅读
- function - 函数中的日志文件变量会占用所有内存
- sql - 在计算列的查询中返回文本字段的好方法是什么?
- java - 用于两级方法调用的双冒号 lambda
- python - 如何删除'TypeError:需要一个类似字节的对象,而不是'str''
- python - 使用 logit 比例的条形图给出错误:LogitScale 对象不可调用
- mysql - 为什么这个 MySql 组合唯一键不起作用?
- php - php数组替换到相同的深度
- solr - 在 SOLR 7.7 中禁用 master 中的复制会自动从 slave 中删除记录
- javascript - 为列表中的搜索项创建服务
- kentico - 具有继承的自定义页面类型属性