2009-11-07 67 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;