代码之家  ›  专栏  ›  技术社区  ›  Léo Léopold Hertz 준영

在将python代码转换为php时发现一个逻辑错误

  •  2
  • Léo Léopold Hertz 준영  · 技术社区  · 15 年前

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

    PHP代码的问题似乎在函数中 是for-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;
    }
    

    蟒蛇

    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 回复  |  直到 15 年前
        1
  •  2
  •   Ned Batchelder    15 年前

    问题出在PHP行中:

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

    你想要的是:

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

    在两个地方都修好,你就能得到正确的答案。

    顺便说一句:您只检查主对角线,但也可以检查其他环绕对角线,正如Greg指出的,您永远不会对列求和。

        2
  •  1
  •   Greg Hewgill    15 年前

    在您的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)]
    
        3
  •  1
  •   outis    15 年前

    查看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;