Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

André Severino

Exercícios sobre Arrays

Recommended Posts

O amigo André quer exercícios de arrays para treinar um pouco, não alguns exercícios sobre algorítimos.

 

Se fosse assim, eu teria movido o tópico para o fórum de Lógica de Programação e Algorítimos

 

Então, como nosso amigo Periscuelo já respondeu adequadamente o problema, vamos para um próximo:

 

Realmente, acabei me empolgando porque, como comentamos depois, no Google Summer of Code o objetivo original do problema era encontrar uma solução menos complexa e diferente que a sugerida.

 

Mas valeu.

 

Se der um tempinho aqui eu tento resolver o segundo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá João, obrigado por me passar os exercicios.

 

Estou um pouco apertado no momento, mas acredito que hj eu consiga fazer os 2 :thumbsup:

Assim que eu terminar eu vou postando tb.

 

Abraços até +

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez não seja a melhor solução mas tá funcionando

<?php
$alunos = array(
       1.65 , 1.75 , 1.75 , 1.95 , 1.71,
       1.75 , 1.83 , 1.72 , 1.73 , 1.74,
       1.68 , 1.75 , 1.78 , 1.67 , 1.76,
       1.87 , 1.75 , 1.81 , 1.74 , 1.92,
       1.74 , 1.76 , 1.72 , 1.73 , 1.75,
       1.76 , 1.75 , 1.68 , 1.67 , 1.78,
);

sort( $alunos );

$t = count($alunos);
$m = array_sum($alunos)/$t;
$s = null;

array_map(function($aluno) use(&$s,$m)
	{
		$s += pow( $aluno - $m , 2 );
	},$alunos);

$s = sqrt( $s / ( $t - 1 ) ) ;

array_map(function($aluno) use ($m,$s)
	{
        if ( $aluno < $m - $s ) {
                printf( "%f está abaixo da média<br/>" , $aluno );
        } elseif ( $aluno > $m + $s ){
                printf( "%f está acima da média<br/>" , $aluno );
        } else {
                printf( "%f está na média<br/>" , $aluno );
        }

	},$alunos);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez não seja a melhor solução mas tá funcionando

 

Quase lá, Kratos...

 

Um detalhe é que você está utilizando a função array_map() para calcular o desvio padrão amostral, o ideal seria utilizar array_reduce() para tal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez não seja a melhor solução mas tá funcionando

 

Quase lá, Kratos...

 

Um detalhe é que você está utilizando a função array_map() para calcular o desvio padrão amostral, o ideal seria utilizar array_reduce() para tal.

 

Valeu pela dica :lol:

 

Seria algo assim:

<?php
$alunos = array(
       1.65 , 1.75 , 1.75 , 1.95 , 1.71,
       1.75 , 1.83 , 1.72 , 1.73 , 1.74,
       1.68 , 1.75 , 1.78 , 1.67 , 1.76,
       1.87 , 1.75 , 1.81 , 1.74 , 1.92,
       1.74 , 1.76 , 1.72 , 1.73 , 1.75,
       1.76 , 1.75 , 1.68 , 1.67 , 1.78,
);

sort( $alunos );

$t = count($alunos);
$m = array_sum($alunos)/$t;

$s = sqrt(array_reduce($alunos,function($s,$aluno) use ($m)
	{
		$s += pow( $aluno - $m , 2 );
		return $s;
	}) / ( $t - 1 ) ) ;

array_map(function($aluno) use ($m,$s)
	{
        if ( $aluno < $m - $s ) {
                printf( "%f está abaixo da média<br/>" , $aluno );
        } elseif ( $aluno > $m + $s ){
                printf( "%f está acima da média<br/>" , $aluno );
        } else {
                printf( "%f está na média<br/>" , $aluno );
        }

	},$alunos);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria algo assim:

 

Show !!!

 

Agora, veja a array_walk() em vez da array_map() afinal, você quer percorrer a matriz, e não mapeá-la.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra completar de vez então:

<?php
$alunos = array(
       1.65 , 1.75 , 1.75 , 1.95 , 1.71,
       1.75 , 1.83 , 1.72 , 1.73 , 1.74,
       1.68 , 1.75 , 1.78 , 1.67 , 1.76,
       1.87 , 1.75 , 1.81 , 1.74 , 1.92,
       1.74 , 1.76 , 1.72 , 1.73 , 1.75,
       1.76 , 1.75 , 1.68 , 1.67 , 1.78,
);

sort( $alunos );

$t = count($alunos);
$m = array_sum($alunos)/$t;

$s = sqrt(array_reduce($alunos,function($s,$aluno) use ($m)
	{
		$s += pow( $aluno - $m , 2 );
		return $s;
	}) / ( $t - 1 ) ) ;

array_walk($alunos,function($aluno) use ($m,$s)
	{
        if ( $aluno < $m - $s ) {
                printf( "%f está abaixo da média<br/>" , $aluno );
        } elseif ( $aluno > $m + $s ){
                printf( "%f está acima da média<br/>" , $aluno );
        } else {
                printf( "%f está na média<br/>" , $aluno );
        }

	});
?>

 

Quando puder posta mais alguma coisa pra galera :joia:, e obrigado pelas dicas que servem como aprendizado :lol:

 

Qual seria a diferença entre array_map e array_walk, sendo que as duas neste caso fazem a mesma coisa, até agora utilizei tanto uma quanto a outra mas na verdade não sei a principal diferença entre elas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual seria a diferença entre array_map e array_walk, sendo que as duas neste caso fazem a mesma coisa, até agora utilizei tanto uma quanto a outra mas na verdade não sei a principal diferença entre elas.

 

A diferença é conceitual, ambos realizam a tarefa, mas o array_map() serve para mapear um conjunto de dados enquanto o array_walk() serve para percorrer um conjunto de dados.

 

A solução:

<?php
$alunos = array(
1.65 , 1.75 , 1.75 , 1.95 , 1.71,
1.75 , 1.83 , 1.72 , 1.73 , 1.74,
1.68 , 1.75 , 1.78 , 1.67 , 1.76,
1.87 , 1.75 , 1.81 , 1.74 , 1.92,
1.74 , 1.76 , 1.72 , 1.73 , 1.75,
1.76 , 1.75 , 1.68 , 1.67 , 1.78,
);

sort( $alunos );

//Solução
$t = count( $alunos );
$m = array_sum( $alunos ) / $t;

array_walk( $alunos,
function( $x , $k , $s ) use ( $m ) {
	printf( "%f está %s média\n" , $x , $x < $m - $s ? 'abaixo da' : ( $x > $m + $s ? 'acima da' : 'na' ) );
},
sqrt( array_reduce( $alunos,
	function( $s , $x ) use ( $m ) {
		return $s + ( pow( $x - $m , 2 ) );
	}
) / ( $t - 1 ) )
);

 

Vamos esperar mais algumas soluções, depois posto um novo problema.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou falar João porque "Tio João" ta pegando mal po é marca de arroz :P

 

Sem querer sair muito do contexto amigo João, da um exemplo pra gente de

aplicação do conceito, onde é necessário mapear array para entendermos as

diferenças entre um e outro. ^_^

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Sem querer sair muito do contexto amigo João, da um exemplo pra gente de

aplicação do conceito, onde é necessário mapear array para entendermos as

diferenças entre um e outro. ^_^

 

Abraços.

Seria bem interessante ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem querer sair muito do contexto amigo João, da um exemplo pra gente de aplicação do conceito

 

Seria bem interessante

 

Utilizando a mesma ideia do problema atual:

 

<?php
$alunos = array(
1.65 , 1.75 , 1.75 , 1.95 , 1.71,
1.75 , 1.83 , 1.72 , 1.73 , 1.74,
1.68 , 1.75 , 1.78 , 1.67 , 1.76,
1.87 , 1.75 , 1.81 , 1.74 , 1.92,
1.74 , 1.76 , 1.72 , 1.73 , 1.75,
1.76 , 1.75 , 1.68 , 1.67 , 1.78,
);

sort( $alunos );

$t = count( $alunos );
$m = array_sum( $alunos ) / $t;
$s = sqrt( array_reduce( $alunos , function( $s , $x ) use ( $m ) {
	return $s + ( pow( $x - $m , 2 ) );
} ) / ( $t - 1 ) );

$r = array_reduce( array_map(
function( $x ) use ( $m , $s ) {
	$k = $x < $m - $s ? 'abaixo' : ( $x > $m + $s ? 'acima' : 'média' );
	return array( $k => $x );
} , $alunos ),
function( $v , $b ) {
	$k = key( $b );

	if ( $v == null ) $v = array();
	if ( !isset( $v[ $k ] ) ) $v[ $k ] = array();

	$v[ $k ][] = current( $b );

	return $v;
}
);

print_r( $r );

 

Saída:

Array
(
[abaixo] => Array
   	(
       	[0] => 1.65
       	[1] => 1.67
       	[2] => 1.67
       	[3] => 1.68
       	[4] => 1.68
   	)

[média] => Array
   	(
       	[0] => 1.71
       	[1] => 1.72
       	[2] => 1.72
       	[3] => 1.73
       	[4] => 1.73
       	[5] => 1.74
       	[6] => 1.74
       	[7] => 1.74
       	[8] => 1.75
       	[9] => 1.75
       	[10] => 1.75
       	[11] => 1.75
       	[12] => 1.75
       	[13] => 1.75
       	[14] => 1.75
       	[15] => 1.76
       	[16] => 1.76
       	[17] => 1.76
       	[18] => 1.78
       	[19] => 1.78
       	[20] => 1.81
   	)

[acima] => Array
   	(
       	[0] => 1.83
       	[1] => 1.87
       	[2] => 1.92
       	[3] => 1.95
   	)

)

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas assim amigo João a seco? Sem nem uma orientaçãozinha, um porque, nadinha? :cry:

Da uma palinha do seu vasto conhecimento para o povo meu amigo ^_^

Explique para nós o conceito dentro do exemplo (porque deve ou não se usar determinada função).

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas assim amigo João a seco? Sem nem uma orientaçãozinha, um porque, nadinha?

 

Mas se for muito diferente, sairemos do escopo tópico, já pensou se empolgo na explicação e esse tópico vira alguma coisa parecida com :seta: http://forum.imasters.com.br/topic/408602-buscar-array/

 

Explique para nós o conceito dentro do exemplo (porque deve ou não se usar determinada função).

 

Não existe um "deve ou não deve", como eu disse antes, as duas realizam a tarefa e que a diferença é conceitual.

 

Primeiro, com array_map() mapeamos e geramos um conjunto de pares chave/valor intermediários e, em seguida, a função array_reduce() mesclamos todos os valores com a mesma chave intermediária.

 

Pense nesse mapa (par chave/valor) como um conjunto nomeado que possui uma série de valores, quando agrupamos as informações dessa forma, conseguimos descrever e sumarizar um conjunto de dados.

 

Isso pode ser visto pelo resultado das duas funções, enquanto a array_walk() apenas percorreu a matriz, a array_map() retornou uma nova matriz com os dados agrupados.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz diferente, já que meus braços estão formigando.

 

Sem classes, funções mirabolantes ou até mesmo preocupações com performance.

 

 

$students = array(
         1.65 , 1.75 , 1.75 , 1.95 , 1.71,
         1.75 , 1.83 , 1.72 , 1.73 , 1.74,
         1.68 , 1.75 , 1.78 , 1.67 , 1.76,
         1.87 , 1.75 , 1.81 , 1.74 , 1.92,
         1.74 , 1.76 , 1.72 , 1.73 , 1.75,
         1.76 , 1.75 , 1.68 , 1.67 , 1.78,
);

$average = average( $students );

$above = above( $students, $average );
$below = below( $students, $average );
$match = match( $students, $above, $below );

print( 'Average: ' . $average );

print '<pre>Above the Average:<br /><br />';
print_r( $above );
print '<br />Below the Average:<br/><br />';
print_r( $below );
print '<br />In the Average:<br /><br />';
print_r( $match );

function match( $students, $below, $above ) {
   return array_keys( array_diff( $students, $below, $above ) );
}

function average( $students ) {
   return (float) sprintf( '%.2F', array_sum( $students ) / count( $students ) );
}

function below( $students, $average ) {

   $r = array_filter(

               $students,

               function( $student ) use( $average ) {
                   return $student < $average;
               });

   asort( $r );

   return $r;
}

function above( $students, $average ) {

   $r = array_filter(

               $students,

               function( $student ) use( $average ) {
                   return $student > $average;
               });

   asort( $r );

   return $r;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, continuando com a brincadeira:

 

A chance de uma campanha publicitária atingir sucesso a ponto de ser comentada nas ruas e até incorporada ao vocabulário da população é muito baixa. De acordo com estudos essa probabilidade se altera de acordo com o meio de comunicação utilizado.

 

Na amostra abaixo, temos algumas campanhas que obtiveram sucesso (true) e outras que não obtiveram sucesso, cada uma dessas campanhas possui uma chave indicando o meio de comunicação utilizado:

 

<?php
$campanhas = array(
'radio' => array(
	true  , false , false , true  , false,
	false , false , false , true  , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	true  , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , true  , false , false,
	false , false , false , false , false
),
'tv' => array(
	false , false , false , false , false,
	true  , true  , false , true  , false,
	false , false , false , false , false,
	false , false , false , false , false,
	true  , false , false , false , false,
	false , false , false , false , true,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , true,
	true  , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	true  , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , true  , false , false,
	false , false , false , false , false
),
'radio+tv' => array(
	false , false , false , false , false,
	false , false , false , true  , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , true  , false , false , true,
	false , false , false , true  , false,
	false , false , false , false , false,
	false , false , false , true  , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , true  , false , false,
	false , true  , false , false , false,
	true  , false , false , false , false,
	false , true  , false , false , false,
	false , false , true  , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , true  , false,
	false , false , false , false , false,
	false , false , false , false , false,
	false , false , false , true  , false,
	false , false , false , false , false,
)
);

 

Com base na matriz acima, qual a probabilidade de sucesso para cada um dos meios de comunicação ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha contribuição:

 

 

function prob( $vehicle ) {

   $total = count( $vehicle );

   list( $fail, $success ) = array_count_values(

                               array_map(

                                   function( $item ) {

                                       return ( $item === TRUE ? 1 : 0 );
                                   },

                                   $vehicle
                               ));

   return array( 'success' => ( ( 100 * $success ) / $total ),
                 'fail'    => ( ( 100 * $fail ) / $total ) );
}

var_dump( prob( $campaigns['radio'] ), prob( $campaigns['tv'] ), prob( $campaigns['radio+tv'] ) );

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha contribuição:

 

 

 

<?php
$campanhas = array(
       'radio' => array(
               true  , false , false , true  , false,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               true  , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , true  , false , false,
               false , false , false , false , false
       ),
       'tv' => array(
               false , false , false , false , false,
               true  , true  , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               true  , false , false , false , false,
               false , false , false , false , true,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , true,
               true  , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               true  , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , true  , false , false,
               false , false , false , false , false
       ),
       'radio+tv' => array(
               false , false , false , false , false,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , true  , false , false , true,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , true  , false , false,
               false , true  , false , false , false,
               true  , false , false , false , false,
               false , true  , false , false , false,
               false , false , true  , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , true  , false,
               false , false , false , false , false,
       )
);

array_walk ( $campanhas, function ($campanha, $nome) use ($campanhas) {
echo 'O percentual de sucesso da campanha ', $nome, ' é de ', ((100 * count ( array_filter ( $campanha ) )) / count ( $campanha )), '<br/>';
} );

 

 

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops... foi uma falha... tava tentando pegar o nome da campanha, mas não funcionou. Daí eu li novamente o manual de array_walk e vi que o segundo parâmetro seria a chave do array. Esqueci de tirar.

 

Código corrigido.

 

 

 

<?php
$campanhas = array(
       'radio' => array(
               true  , false , false , true  , false,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               true  , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , true  , false , false,
               false , false , false , false , false
       ),
       'tv' => array(
               false , false , false , false , false,
               true  , true  , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               true  , false , false , false , false,
               false , false , false , false , true,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , true,
               true  , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               true  , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , true  , false , false,
               false , false , false , false , false
       ),
       'radio+tv' => array(
               false , false , false , false , false,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , true  , false , false , true,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , true  , false , false,
               false , true  , false , false , false,
               true  , false , false , false , false,
               false , true  , false , false , false,
               false , false , true  , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , true  , false,
               false , false , false , false , false,
               false , false , false , false , false,
               false , false , false , true  , false,
               false , false , false , false , false,
       )
);

array_walk ( $campanhas, function ($campanha, $nome) {
echo 'O percentual de sucesso da campanha ', $nome, ' é de ', ((100 * count ( array_filter ( $campanha ) )) / count ( $campanha )), '<br/>';
} );

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.