Ir para conteúdo
Fórum Script Brasil
  • 0

Triângulo de Pascal


LucasConstantino

Pergunta

Bom, galera... eu tava usando o Triângulo de Pascal pra coisas que não vem ao caso agora, e resolvi criar funções relacionadas ao bendito (ou maldito) triângulo. Eis aqui meu trabalho:

// Retorna o triangulo dentro de uma array contendo várias arrays (linhas) com elementos (colunas)
    function pascal( $lineEnd )
    {
        $index = array();
        
        $index[ 0 ][ 0 ] = 1;
        
        $line = 1;
        while( $line <= $lineEnd )
        {
            $index[ $line ] = array();
            
            $coluna = 0;
            while( $coluna <= $line )
            {
                $index[ $line ][ $coluna ] = $index[ $line - 1][ $coluna - 1] + $index[ $line - 1][ $coluna ];
                $coluna ++;
            }
            $line ++;
        }
        
        return( $index );
    }
    
    // Retorna uma linha do triangulo dentro de uma array. $columnStart e $columnEnd identificam o intervalo de colunas a ser utilizado.
    // Caso sejam NULL, todos os elementos da linha estarão disponíveis
    function pascalLine( $lineNumber, $columnStart = NULL, $columnEnd = NULL )
    {
        $pascal = pascal( $lineNumber );
        
        $result = array_slice( $pascal[ $lineNumber ], $columnStart, $columnEnd, true );
        
        return( $result );
    }
    
    // Retorna uma coluna do triangulo dentro de uma array. $lineEnd e $lineStart definem o intervalo de linhas a ser utilizado.
    // $lineEnd é obrigatório.
    function pascalColumn( $columnNumber, $lineEnd, $lineStart = 0 )
    {
        $pascal = pascal( $lineEnd );
        $result = array();
        
        $count = $lineStart;
        while( $count <= $lineEnd )
        {
            if( $count < $columnNumber )
            {
                $result[] = NULL;
            }
            else
            {
                $result[$count] = $pascal[ $count ][ $columnNumber ];
            }
            $count ++;
        }
        
        return( $result );
    }

    // Retorna um período do Triangulo de Pascal dentro de uma array contendo varias arrays (linhas) que contém elementos (colunas)
    function pascalIntersection( $lineStart, $lineEnd, $columnStart, $columnEnd )
    {
        $pascal = pascal( $lineEnd );
        
        $countLine = $lineStart;
        while( $countLine <= $lineEnd)
        {
            $countColumn = $columnStart;
            while( $countColumn <= $columnEnd )
            {
                $result[ $countLine ][ $countColumn ] = $pascal[ $countLine ][ $countColumn ];
                $countColumn ++;
            }
            $countLine ++;
        }
        
        return ( $result );
    }

    // Retorna o elmento encontrado na intersecção da linha " $line " pela coluna " $column "    
    function pascalElement( $line, $column )
    {
        $pascal = pascal( $line );
        
        return( $pascal[ $line ][ $column] );
    }
    
    // Retorna a soma dos elementos de uma linha " $lineNumber ", durante o intervalo de colunas $columnStart e $columnEnd
    // Se ( $columnStart e $columnEnd ) = NULL, a linha inteira é somada 
    function pascalLineSum( $lineNumber, $columnStart = NULL, $columnEnd = NULL )
    {
        $pascalLine = pascalLine( $lineNumber, $columnStart, $columnEnd );
        
        $result = array_sum( $pascalLine );
        
        return( $result );
    }
    
    // Retorna a soma dos elementos de uma coluna $columnNumber, durante o intervalo de linhas $lineStart e $lineEnd
    // $lineEnd é obrigado
    // o padrão de $lineStart é "0"("zero")
    function pascalColumnSum( $columnNumber, $lineEnd, $lineStart = 0 )
    {        
        $pascalColumn = pascalColumn( $columnNumber, $lineEnd, $lineStart );
        
        $result = array_sum( $pascalColumn );
        
        return( $result );
    }
    
    // Retorna uma tabela HTML mostrnado o triangulo de pascal na intersecção dos intervalos ( $lineStart, $lineEnd ) e ($columnStart, $columnEnd)
    // $lineEnd é obrigatório
    function pascalDraw( $lineEnd, $lineStart = 0, $columnStart = 0, $columnEnd = NULL )
    {
        if( !$columnEnd )
        {
            $columnEnd = $lineEnd;
        }
        
        $pascal = pascal( $lineEnd );
        
        echo "<table border='1'><tr><td align='center' style='font-family:Verdana; font-size:10px;'>PASCAL</td>";
        
        // Cria a coluna de localização
        $coluna = $columnStart;
        while( $coluna <= $columnEnd )
        {
            echo "<td align='center' style='background-color:#999; color:#FFF;'>" . $coluna . "</td>"; 
            $coluna ++;
        }
        
        echo "</tr>";
        
        $linha = $lineStart;
        while( $linha <= $lineEnd )
        {            
            // Cria a linha de localização
            echo "<tr><td align='center' style='background-color:#999; color:#FFF; padding-right:15px; padding-left:15px;'>" . $linha . "</td>";
            
            $color = ($linha%2) ? '#CCC' : '#FFF';
            
            
            // Cria as coordenadas
            $coluna = $columnStart;
            while( $coluna <= $columnEnd && $coluna <= $linha )
            {
                    echo "<td align='center' style='background-color:" . $color . "; padding-right:10px; padding-left:10px;'>";
                    echo $pascal[ $linha ][ $coluna ];
                    $coluna ++;
                    echo "</td>";
            }
            // Cria as coordenadas vazias
            while( $coluna <= $columnEnd )
            {
                echo "<td align='center' style='background-color:#000; color:#fff;'>0</td>";
                $coluna ++;
            }
                  
            echo "</tr>";
            $linha ++;
        }
        
        echo "</table>";
    }

Bom, é isso aí... espero que seja de uso pra alguém por ai, nem que seja pra verificar o triangulo de vez em quando :)

Vlw!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...