Это, вероятно, тривиально, и у меня есть решение, но я не доволен им.Каким-то образом (гораздо) более простые формы, похоже, не работают, и они запутываются в угловых случаях (либо первое, либо последнее совпадение пар в строке).
Чтобы упростить задачу, давайте определим правило соответствиякак любые два или более чисел с разницей в два .Пример:
> 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 символов *, легко проследить, медленно
- 2-ой Kvb, 106 символов * (если я включу функцию), легко, но возвращаемозначение требует работы
- 2-е число Стивена , 397 символов *, длинная и сравнительно сложная, но самая быстрая
- Абель , 155 символов *, на основеДаниэль разрешает дубликаты (кстати, это не было необходимостью) и является относительно быстрым.
Было больше ответов, но я считаю, что вышеизложенные были наиболее отчетливыми.Надеюсь, я не обидел никого на чувства, приняв ответ Даниэля в качестве решения: каждое решение заслуживает того, чтобы быть выбранным ответом (!).
* подсчет, выполненный с именами функций как один символ