这可能是微不足道的,我确实有一个解决方案,但我对此并不满意。不知何故,(很多)更简单的形式似乎不起作用,并且在角落案例(第一个或最后一个匹配对)周围变得混乱。
为简单起见,我们将匹配规则定义为任何两个或多个相差为 2 的数字。例子:
> filterTwins [1; 2; 4; 6; 8; 10; 15; 17]
val it : int list = [2; 4; 6; 8; 10; 15; 17]
我目前使用的代码是这样的,只是感觉草率和超重:
let filterTwins list =
let func item acc =
let prevItem, resultList = acc
match prevItem, resultList with
| 0, []
-> item, []
| var, [] when var - 2 = item
-> item, item::var::resultList
| var, hd::tl when var - 2 = item && hd <> var
-> item, item::var::resultList
| var, _ when var - 2 = item
-> item, item::resultList
| _
-> item, resultList
List.foldBack func list (0, [])
|> snd
我打算用我自己的原始练习来试验List.foldBack
大列表和并行编程(进展顺利),但最终弄乱了“简单”的部分......
引导答案
- 丹尼尔的最后,113个字符*,易学,慢
- Kvb 的第 2 个,106 个字符*(如果我包含该函数),很简单,但返回值需要工作
- 斯蒂芬的第二部,397 个字符*,冗长而复杂,但最快
- Abel 的,155 个字符*,基于 Daniel 的,允许重复(这不是必需的,顺便说一句)并且相对较快。
有更多的答案,但我相信以上是最明显的。希望我接受丹尼尔的答案作为解决方案不会伤害任何人的感情:每一个解决方案都应该成为选定的答案(!)。
* 以函数名作为一个字符进行计数