2016-03-18 2 views
-2

У меня есть список кортежей, где каждый кортеж представляет строку и столбец пикселя. Как бы я мог эффективно построить список, где для каждого кортежа (i, j) в первом списке элемент в позиции i*width + j в новом списке имеет значение 1?Haskell Построение списка из списка кортежей

+0

Эффективное, в отличие от того, какой подход? Конечно, вы можете сделать это как-то. – leftaroundabout

+0

Если вы говорите о пикселях, разве вы не имеете в виду 'i + stride * j' position, а не' i * j'? Или вы действительно хотите скомпоновать все кортежи, чьи элементы умножаются, чтобы дать одинаковое значение? – comingstorm

+0

Я попытался проверить каждую комбинацию i и j, если кортеж (i, j) был элементом первого списка, но этот подход казался слишком медленным. – dissem

ответ

1

Во-первых, сортировать список точек

let sortedPoints = sort [(0, 1), (1, 0), (1, 1)] 
-- == [(0, 0), (0, 1), (1, 0)] 

Затем создайте список всех точек

let allPoints = [(x, y) | x <- [0, 3], y <- [0, 3]] 
-- where I chose width = 3 
-- = [(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3),(3,0),(3,1),(3,2),(3,3)] 

Обратите внимание, что это происходит автоматически сортируется.

Наконец, написать функцию, которая проходит через пункты один за другим и проверяет, какие элементы из списка sortedPoints находятся в allPoints

isIn::[(Int, Int)]->[(Int, Int)]->[Int] 
isIn [] [] = [] 
isIn (first:rest) (allFirst:allRest) | first == allFirst = 1:isIn rest allRest 
isIn points (_:rest) = 0:isIn points rest 

Тогда просто вычислить

isIn sortedPoints allPoints 
Смежные вопросы