找到将Python代码转换为PHP的逻辑错误

时间:2009-11-07 18:20:13

标签: php python

输入7|12|1|14|2|13|8|11|16|3|10|5|9|6|15|4由PHP代码返回0,而1由Python代码返回:1表示4x4幻方的总和相同,而0表示相反。 Python代码是正确的。

PHP代码的问题似乎在函数 divide 中为-loop,因为PHP提供了太多的总和。

PHP代码的逻辑与Python的有什么不同?

PHP

$data = "7|12|1|14|2|13|8|11|16|3|10|5|9|6|15|4";
$array = explode("|", $data);

# Calculate the unique sums of the four figures
# @return array int
function divide ( $array ) {
        $sum = array_map('array_sum', array_chunk($array, 4));
        $apu_a = array();
        for ( $i = 0; $i < count( $sum ); $i++ ) {
                if ( $i % 5 == 0 )
                        $apu_a []= $array[$i];
        }
        $sum []= array_sum( $apu_a );

        $apu_a = array();
        for ( $i = 0; $i < count( $sum ); $i++ ) {
                if ( $i % 3 == 0 and $i != 15 and $i != 0 )
                        $apu_a []= $array[$i];
        }
        $sum []= array_sum( $apu_a );

        $result = array_unique($sum);
        return $result;
}

的Python

data = "7|12|1|14|2|13|8|11|16|3|10|5|9|6|15|4"
lista = map(int,data.split("|"))

def divide( lista ):
        summat = [sum(lista[i:i+4]) for i in range(0,len(lista),4)]
        summat += [sum(lista[0::5]) for i in range(0, len(lista), 16)]
        summat += [sum(a for i,a in enumerate(lista) if i %3==0 and i != 15 and i != 0)]
        return set(summat)

3 个答案:

答案 0 :(得分:2)

问题在于你的PHP行:

for ( $i = 0; $i < count( $sum ); $i++ ) {

你想要:

for ( $i = 0; $i < count( $array ); $i++ ) {

在两个地方修复它,你得到了正确的答案。

BTW:你只是检查主要对角线,但你也可以检查其他包裹对角线,正如格雷格指出的那样,你永远不会对列进行求和。

答案 1 :(得分:1)

在Python代码中,您有:

    summat += [sum(lista[0::5]) for i in range(0, len(lista), 16)]

我很确定这不是你打算做的。 len(lista)为16,因此此范围为range(0, 16, 16),即[0]。然后,你甚至没有在列表理解的左侧使用i,你只是在主对角线上对值进行求和。如果这是为了沿主对角线求和,可以用更简单的方式替换它和以下行:

    summat += [sum(lista[0::5])]
    summat += [sum(lista[3:15:3])]

最后,你根本不计算魔方中的总和。你需要这样的东西:

    summat += [sum(lista[i::4]) for i in range(4)]

答案 2 :(得分:1)

向Ned寻求答案;这只是为了注意PHP的改进:

    $s = 0;
    for ( $i = 0; $i < count( $array ); $i += 5 ) {
        $s += $array[$i];
    }
    $sum[]=$s;

    $s=0;
    for ( $i = 3; $i < 15; $i+=3 ) {
        $s += $array[$i];
    }
    $sum[]=$s;