2009-11-07 9 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은 반대입니다. 파이썬 코드가 맞습니다.파이썬 코드를 PHP로 변환 할 때의 논리 버그 찾기

PHP 코드의 문제점은 을 -loop로 나누기 때문에 PHP가 너무 많은 합계를 제공하기 때문에 발생합니다.

PHP 코드의 논리는 어떻게 파이썬의과 다른가요?

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; 
} 

파이썬 코드에서 파이썬

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

논리 버그는 PHP로 변환한다는 사실입니다. 그건 논리적 인 문제가 아닙니다! ;) – ThiefMaster

답변

2

문제는 당신의 PHP 라인에 있습니다 : 당신은 뭔가를해야

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

당신은 원 :

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

두 곳에서 수정을하고, 당신은 바로 답변을 얻을 .

BTW : 주요 대각선 만 확인하고 있지만 다른 래핑 대각선을 확인할 수도 있습니다. 그렉이 지적했듯이 절대로 열을 합치 지 마십시오.

1

, 당신은 :

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; 
관련 문제