- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个组合数学难题(如 Jan Gullberg 的数字诞生以来的数学中提到的),如果您将来自两个类别的 15 个成员(例如 0 类别中的 15 个)排列起来
和 15 个类别 1
总共 30
元素)以特定顺序混合,那么如果您连续沿着这条线走以循环方式(即,当你到达终点时,绕回起点,继续计数)扔掉每一个第九个元素,你最终会得到一个“喜爱”(1
) 类别的元素
line = [1,1,1,1,0,0,0,0,0,1,1,0,1,1,1,...]
line
(请参阅下面的游程编码元组版本)是实际的排序,如果你扔掉每九个,
line = [1,1,1,1,0,0,0,0,1,1,0,1,1,1,...] -- 9th thrown out
你总是会扔掉“不受欢迎的”0
。如果从 RLE 元组的角度来看(其中 (0|1, n)
编码 n
连续出现的 0
或 1
),从元组 (0,x)
中递减,即递减 x
,最终会得到 (1,y)
元组,当然也会丢弃完全耗尽的 (0,0)
元组并重新压缩列表
line = [(1,4),(0,5),(1,2),(0,1),(1,3),(0,1),(1,1),(0,2),(1,2),(0,3),(1,1),(0,2),(1,2),(0,1)]
我已经开始了
tally = foldl (\acc elem -> if (snd(elem)+acc) >= 9
then (snd(elem)+acc)-9
else (snd(elem)+acc)) 0
当我喂它时线
tally [(1,4),(0,5),(1,2),(0,1),(1,3),(0,1),(1,1),(0,2),(1,2),(0,3),(1,1),(0,2),(1,2),(0,1)]
它获取第一个元组的 4
,然后添加第二个元组的 5
,获取 9
并重置累加器以启动再次“倒计时”。因此它准确地返回 3
,这实际上是累加器在经过一轮并用第九个元组识别元组并重置累加器之后的剩余部分。我明显的问题是如何超越仅仅识别第九个元素,并实际开始递减0
元组的元素,以及在它们减少到时将它们扔掉(0,0)
并重新运行。我确信将 line
构建为
line = [1,1,1,1,0,0,0,0,0,1,1,0,1,1,1,...]
并再次开始卡住(即删除)第九个元素,它应该始终是 0
元素(例如,第一个第九个已从 line
中删除)
line = [1,1,1,1,0,0,0,0,1,1,0,1,1,1,...]
但这更像是一个挑战,因为我本质上需要将折叠与 map 结合起来——这就是我想要学习的,即纯功能性、无计数器等风格。感谢提示和帮助。另外,如果组合学领域的某人能够对这里发生的事情提供一些理论解释,那也很好。
最佳答案
寻找 map 和折叠可能会过度限制事情,因为这里有一个可爱的简单功能供您开始:
-- Remove the n-th element (zero-indexed) of a run-length encoded sequence of a.
chuck :: Int -> [(a, Int)] -> [(a, Int)]
扔掉空箱子;我们不应该在这里。
chuck _ [] = error "unexpected empty list"
让我们计算一下 chuck n ((a,m) : l)
。我们面临m
相同的元素a
,我们要删除 n
-th 元素。这取决于是否n < m
(即搜索是否停止在这些 m
元素的中间,还是之后)。
如果n < m
,然后我们将删除其中之一 a
。我们还可以准备结果以预测下一个周期,该周期之后立即恢复a
我们删除了。我们实际上已经跳过了n
之前的其他元素,以及存储这些元素的好地方 n
elements 是列表的末尾,因为无论如何我们都应该在末尾绕回。如果我们想计算圈数,我们需要更复杂的东西,但除非另有说明,YAGNI。还剩m-n-1
元素,位于前面。小 helper rpt
在我们尝试附加零个元素的情况下很有帮助。
otherwise
,我们跳过所有 m
元素,将它们存储在后面,我们有 n-m
还有更多工作要做。
chuck n ((a,m) : l)
| n < m = rpt a (m-n-1) ++ l ++ rpt a n
| otherwise = chuck (n-m) (l ++ [(a,m)])
where rpt a 0 = []
rpt a n = [(a,n)]
(注意:这会将 (a,m)
拆分为 (a,m-n-1)
和 (a,n)
,但不会将它们合并回来......留给读者作为练习。)
由于结果是为下一次迭代准备的,我们可以轻松链接 chuck
看看线路的演变。请注意,在此实现中元素的索引为零,因此 chuck 8
夹住“第九”元素。
ghci
> line
[(1,4),(0,5),(1,2),(0,1),(1,3),(0,1),(1,1),(0,2),(1,2),(0,3),(1,1),(0,2),(1,2),(0,1)]
> chuck 8 line
[(1,2),(0,1),(1,3),(0,1),(1,1),(0,2),(1,2),(0,3),(1,1),(0,2),(1,2),(0,1),(1,4),(0,4)]
> chuck 8 $ chuck 8 line
[(0,1),(1,2),(0,3),(1,1),(0,2),(1,2),(0,1),(1,4),(0,4),(1,2),(0,1),(1,3),(0,1),(1,1)]
这有点难以理解。至少,我们应该确保只有0
正在被抛弃。那么让我们来计算一下元素:
tally :: [(Int,Int)] -> (Int, Int)
tally xs = (sum (map snd (filter ((== 0) . fst) xs)), sum (map snd (filter ((== 1) . fst) xs)))
右侧的计数似乎保持不变,而错误的一侧则较少,正如预期的那样:
> tally line
(15,15)
> tally $ chuck 8 line
(14,15)
> tally $ chuck 8 $ chuck 8 line
(13,15)
通过 iterate
我们可以走得更快,它重复应用一个函数并在无限列表中返回所有中间结果:
> :t iterate
iterate :: (a -> a) -> a -> [a]
迭代chuck 8
,统计起来,只查看我们期望停止的位置(删除一侧的所有 15 个元素后):
> take 16 $ map tally $ iterate (chuck 8) line
[(15,15),(14,15),(13,15),(12,15),(11,15),(10,15),(9,15),(8,15),(7,15),(6,15),(5,15),(4,15),(3,15),(2,15),(1,15),(0,15)]
关于haskell - 组合学:圣彼得博弈算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70426554/
我有一个 mysql 表,其中包含一些随机数字组合。为简单起见,以下表为例: index|n1|n2|n3 1 1 2 3 2 4 10 32 3 3 10 4 4
我有以下代码: SELECT sdd.sd_doc_classification, sdd.sd_title, sdd.sd_desc, sdr.sd_upl
如果我有两个要合并的数据框 Date RollingSTD 01/06/2012 0.16 01/07/2012 0.18 01/08/2012 0.17 01/09/20
我知道可以使用 lein ring war 创建一个 war 文件,但它似乎仍然包含码头依赖项。当我构建 war (并在 tomcat 上部署)时,有没有办法排除码头依赖项? 如果我根本不能做这件事,
维基百科关于封装的文章指出: “封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性” 我在一个论坛上开始讨论封装,在那里我问你是否应该始终在 setter 和/或 gette
对于我使用的组合框内的复选框: AOEDComboAssociationName = new Ext.form.ComboBox({ id: 'AOEDComboAssociationName',
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do I combine LINQ expressions into one? public boo
如何在 rust 中找到排列或组合的数量? 例如C(10,6) = 210 我在标准库中找不到这个函数,也找不到那里的阶乘运算符(这就足够了)。 最佳答案 以@vallentin 的回答为基础,可以进
我有一个复杂的泛型类型用例,已在下面进行了简化 trait A class AB extends A{ val v = 10 } trait X[T<:A]{ def request: T }
如何使用 Hibernate 限制来实现此目的? (((A='X') and (B in('X',Y))) or ((A='Y') and (B='Z'))) 最佳答案 思考有效 Criteria c
我一定会在我的一个项目中使用谷歌图表。我需要的是,显示一个条形图,并且在条形图中,与每个条形相交的线代表另一个值。如果您查看下面的 jsfiddle,您会发现折线图仅与中间的条形图相交,并继续向其他条
只是一个简单的问题,我也很想得到答案,因为我不能百分百理解 Javascript 示例:假设您提示用户输入名称。够简单吧?但是你有一个数组,上面写着一些名字(其中之一就是),基本上就是我到目前为止所说
我试图通过 Haskell 理解函数式编程,但在处理函数组合时遇到了很多麻烦。 其实我有这两个功能: add:: Integer -> Integer -> Integer add x y = x
我正在寻找一种在 Realm 查询中组合 AND 和 OR 的方法。 这是我的课: class Event extends RealmObject { String id; String
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我是Combine 的新手,我想得到一个看似简单的东西。假设我有一个整数集合,例如: let myCollection = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 我想以例如 0
关于“优先组合而不是继承”的问题,我的老师是这样说的: 组合:现有类成为新类的组件 转发:新类中的每个实例方法,在现有类的包含实例上调用相应的方法并返回结果 包装器:新类封装了现有的 这三个概念我不是
我正在尝试将单个整数从 ASCII 值转换为 0 和 1。相关代码如下所示: int num1 = bin.charAt(0); int num2 = bin.charAt(1);
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我经常看到“嵌套”类中的非静态变
我尝试合并两个数据集(DataFrame),如下所示: D1 = pd.DataFrame({'Village':['Ampil','Ampil','Ampil','Bachey','Bachey',
我是一名优秀的程序员,十分优秀!