これはおそらく些細なことであり、解決策はありますが、満足していません。どういうわけか、(はるかに) 単純なフォームは機能しないようで、角のケース (最初または最後に一致するペアのいずれか) が乱雑になります。
簡単にするために、一致ルールを2 の差がある 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
ましたが、「簡単な」部分を台無しにしてしまいました...
答えを導く
- Daniel's last、113 文字*、わかりやすい、遅い
- Kvbの2番目、106文字*(関数を含める場合)、簡単ですが、戻り値には作業が必要です
- Stephen's 2nd、397 文字*、長くて比較的複雑ですが、最速です
- Abel の155 文字* は、Daniel のものに基づいており、複製が可能で (これは必須ではありませんでした)、比較的高速です。
もっと多くの答えがありましたが、上記が最も明確だったと思います。ダニエルの答えを解決策として受け入れることで、誰かの気持ちを傷つけていないことを願っています。
※関数名は1文字としてカウント