List 查找4x4电路板上给定元素右侧的元素

List 查找4x4电路板上给定元素右侧的元素,list,list-comprehension,List,List Comprehension,我现在被一个看似简单的问题弄得目瞪口呆 我有一块4x4电路板,上面有顺序排列的元素,如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 我想写一个列表理解,给定一个方向和元素,一个列表将返回给定方向上的所有元素。 例如:给定元素10的北向将给出6和2。 我已经确定了三个方向,北,南,西,但我不知道东 我对3的列表理解是,Id是有问题的元素,列出1到16之间的列表: North-> [ X | X &

我现在被一个看似简单的问题弄得目瞪口呆

我有一块4x4电路板,上面有顺序排列的元素,如下所示:

1  2   3  4    
5  6   7  8
9  10 11 12
13 14 15 16
我想写一个列表理解,给定一个方向和元素,一个列表将返回给定方向上的所有元素。 例如:给定元素10的北向将给出6和2。 我已经确定了三个方向,北,南,西,但我不知道东

我对3的列表理解是,Id是有问题的元素,列出1到16之间的列表:

     North->
        [ X | X <- List, X < Id, (Id-X) mod 4 == 0]
    South ->
        [ X | X <- List, X > Id, (Id-X) mod4 == 0]
    West ->
        [ X | X <- List, X < Id, X > ((Id-1) div 4)*4]
我找不到一个有效的东方方程式。有什么帮助吗

编辑:


例如,East 14应该给出15和16。East 16应该给出空列表。我真的被难住了。

这个问题的关键是使用除法和模来判断哪些数字在同一行上

如果两个值具有相同的模结果,则它们位于同一列上。如果它们小于给定值,则它们为北。如果它们大于给定值,则它们是南方

通常,如果两个值具有相同的整数除法结果,则它们应位于同一行上。对于基于0的正方形,这始终是正确的;但是,此示例使用从1开始的正方形。不要测试给定值和电路板上数字的除法结果,而是从给定值和测试值中减去1,然后除法并比较结果

伪代码

given = 10
for x in board:
    if int( (given - 1) / 4 ) equals int( (x - 1) / 4 ):
        if x < given:
            x is west
        if x > given:
            x is east
下面是一个用Python编写的示例函数

import math
def figure(board, num, dir):
    dir = dir.lower()
    sq = math.sqrt(len(board))
    if sq != int(sq) or num not in board:
        return "invalid sqaure"

    if dir == "n":
        return [x for x in board if x < num and x%sq == num%sq] 
    elif dir == "s":
        return [x for x in board if x > num and x%sq == num%sq]
    elif dir == "e":
        return [x for x in board if x > num and int((x-1)/sq) == int((num-1)/sq)]
    elif dir == "w":
        return [x for x in board if x < num and int((x-1)/sq) == int((num-1)/sq)]
    else:
        return "invalid direction"

我认为Esat应该是:

ESAT->    

 [ X | X <- List, X >Id, X <= ⌈Id / 4)⌉ * 4  ]

那是什么语言?我想用Erlang编写,但这是更多的伪代码。通常,它应该是可读的,每个人都有经验的函数式语言。如果不是,请告诉我