在4x4板上查找给定元素右侧的元素

时间:2014-11-23 20:16:20

标签: 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 <- 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]

我找不到东方的有效等式。有什么帮助吗?

编辑:

例如,东14应该给出15和16。东16应该给出空列表。我真的很难过。

2 个答案:

答案 0 :(得分:0)

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

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

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

Psuedo代码

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"

这是一个用Python编写的示例函数

A9: =IF(B$8=MAX($B$8:$E$8),SUM($B$8:$E$8)-SUM(ROUND($B$8:$E$8,0))+ROUND(B$8,0),ROUND(B$8,0))

答案 1 :(得分:0)

我认为Esat应该是:

ESAT->    

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