2009-11-07 43 views
2

输入7|12|1|14|2|13|8|11|16|3|10|5|9|6|15|4由PHP代码返回0,而Python代码为1代表1,意味着4x4魔方的总和相同,而0代表反向。 Python代码是正确的。查找将Python代码转换为PHP的逻辑错误

PHP代码的问题似乎在功能的-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) 
+1

我想说的逻辑错误是,你正在将python代码转换为PHP的事实。这不合逻辑! ;) – ThiefMaster 2012-04-15 21:32:43

回答

2

的问题是在你的PHP行:

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

你想:

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

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

顺便说一句:你只是检查主对角线,但你也可以检查其他包装对角线,正如格雷格指出的那样,你从来不总结列。

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)] 
1

向内德寻求答案;这只是为了说明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;