Возьмите список с числами и конвертируйте его в минимальную / максимальную версию. - PullRequest
0 голосов
/ 29 марта 2020

Возьмите список чисел, а затем создайте другой список, который включает пары, которые создаются путем выбора минимального числа и максимального числа, пока в списке не останется ни одного номера.

Ввод:

[3,6,1,8,7,9,12,4]

Вывод:

[(1,12),(3,9),(4,8),(6,7)]

Как это можно сделать?

Должен ли я использовать функции transpose и fromIntegral?

1 Ответ

0 голосов
/ 30 марта 2020

Простое решение. Обратите внимание, что средний элемент будет пропущен, если список имеет нечетную длину.

import Data.List(sort)

fun :: Ord a => [a] -> [(a, a)]
fun l =
  let x = sort l
  in take (length l `div` 2) (zip x (reverse x))

Сначала мы отсортируем l в порядке возрастания. Поэтому, учитывая ваш пример [3,6,1,8,7,9,12,4]:

x == [1,3,4,6,7,8,9,12]

Мы zip x с обратным x:

zip x (reverse x) == [(1,12),(3,9),(4,8),(6,7),(7,6),(8,4),(9,3),(12,1)]

И затем мы берем первую половину элементов, что is length l `div` 2:

take (length l `div` 2) (zip x (reverse x))
 == [(1,12),(3,9),(4,8),(6,7)]
...