ErJab
ErJab

Reputation: 6375

Erlang list comprehension, traversing two lists and excluding values

I need to generate a set of coordinates in Erlang. Given one coordinate, say (x,y) I need to generate (x-1, y-1), (x-1, y), (x-1, y+1), (x, y-1), (x, y+1), (x+1, y-1), (x+1, y), (x+1, y+1). Basically all surrounding coordinates EXCEPT the middle coordinate (x,y). To generate all the nine coordinates, I do this currently:

[{X,Y} || X<-lists:seq(X-1,X+1), Y<-lists:seq(Y-1,Y+1)]

But this generates all the values, including (X,Y). How do I exclude (X,Y) from the list using filters in the list comprehension?

Upvotes: 7

Views: 699

Answers (3)

Zed
Zed

Reputation: 57648

[{X,Y} || X <- lists:seq(X0-1,X0+1),
          Y <- lists:seq(Y0-1,Y0+1), {X,Y} =/= {X0,Y0}].

Upvotes: 12

Hynek -Pichi- Vychodil
Hynek -Pichi- Vychodil

Reputation: 26121

I think distinguish between parameters and generated values will help a little:

[{Xc,Yc} || Xc<-lists:seq(X-1,X+1), Yc<-lists:seq(Y-1,Y+1), Xc=/=X orelse Yc=/=Y]

or else

[{Xc,Yc} || Xc<-lists:seq(X-1,X+1), Yc<-lists:seq(Y-1,Y+1)] -- [{X,Y}]

Upvotes: 2

Dustin
Dustin

Reputation: 90960

Adding -- [{X,Y}] would probably be the easiest thing.

Upvotes: 1

Related Questions