Ir para conteúdo

POWERED BY:

Arquivado

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

João Batista Neto

Desafio Premiado PHP

Recommended Posts

Olá a todos,

 

O desafio consiste em 6 etapas, cada etapa será apresentada individualmente e somente ao fim de uma etapa que a próxima será apresentada.

 

Os prazos serão os seguintes:

Para a 1a e 2a etapa -> 2 dias para cada uma (total de 4 dias)

Para a 3a e 4a etapa -> 3 dias para cada uma (total de 6 dias)

Para a 5a e 6a etapa -> 5 dias para cada uma (total de 10 dias)

 

Ao fim do desafio, aqueles que completarem pelo menos até a 4a etapa concorrerão e o concorrente com maior pontuação será o vencedor.

 

Os critérios de avaliação serão os seguintes, e serão aplicados igualmente a todos os códigos:

 

1. Aquele que apresentar o código fora do prazo estará automaticamente desclassificado.

2. Para participar da segunda etapa em diante, é necessário ter participado de todas as etapas anteriores.

3. O código que não executar corretamente o proposto pela etapa perderá 10 pontos.

4. O código que apresentar corretamente o proposto pela etapa ganhará 10 pontos.

5. O código que for capaz de identificar uma situação adversa ganhará 20 pontos.

----5.1 No caso de identificar uma situação adversa, o código deverá disparar a exceção RuntimeException ou utilizar a função trigger_error com a seguinte mensagem: 'Foi identificado uma situação inesperada durante a execução do código'

----5.2 No caso do uso da função trigger_error deverá ser utilizado o nível E_USER_ERROR -> Predefined Constants

6. O código que executar 100 problemas diferentes em menor tempo ganhará 20 pontos.

----6.1 Todos os códigos terão adicionados à primeira linha o seguinte: error_reporting( E_ALL | E_STRICT ).

----6.2 Caso algum código durante a execução apresente: Notice ou Warning perderá 10 pontos.

----6.3 Caso algum código durante a execução apresente: Fatal Error perderá 20 pontos.

7. As pontuações apresentadas servirão para todas as etapas, porém algumas etapas poderão ter pontuações complementares, específicas para o problema.

8. Caso o código apresentado não execute corretamente o proposto pela etapa não desqualificará o competidor para a próxima etapa.

9. Os pontos são cumulativos, ganhará o desafio aquele que ao fim de todas as etapas tiver o maior número de pontos.

10. Nenhum Moderador Trainee, Moderador, Moderador Global ou Administrador poderá participar do desafio.

 

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif O vencedor terá como prêmio a última edição do livro do Juliano Niederauer: PHP para quem conhece PHP ISBN: 9788575221655

 

Somente concorrerá ao prêmio aquele que apresentar no mínimo até a 4a etapa.

 

Primeira etapa:

 

1. Criação de um script capaz de analisar uma expressão matemática simples (10 + 10) porém capaz de aceitar todos os seguintes operadores +, -, *, /.

----1.1 Para avaliação serão utilizadas expressões semelhantes às seguintes: (os valores e a ordem dos operadores poderão ser diferentes)

--------1.1.1: 10 + 20 + 30 + 40 - 30 - 20 - 10, o código que retornar o resultado correto ganhará 10 pontos.

--------1.1.2: 1 * 2 * 3 * 4 / 3 / 2 / 1, o código que retornar o resultado correto ganhará 10 pontos.

--------1.1.3: 1 * 2 + 3 * 4 - 5 * 2, o código que retornar o resultado correto ganhará 20 pontos.

 

Início hoje (sexta-feira dia 27 de Novembro), meia noite e prazo final domingo (29 de Novembro), meia noite.

 

Somente concorrerão os códigos que estiverem postados nesse tópico no prazo estipulado.

 

Sucesso a todos que participarem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

NOSSA ! agora sim vai dar emoção *-* ...

 

Mas só uma dúvida, terá de postar aqui o código mesmo ? ou mandar por pm pra você não seria melhor ?

 

 

 

Parabéns pela iniciativa João !

Compartilhar este post


Link para o post
Compartilhar em outros sites

NOSSA ! agora sim vai dar emoção *-* ...

 

:D

 

Mas só uma dúvida, terá de postar aqui o código mesmo ? ou mandar por pm pra você não seria melhor ?

 

Caso o código fique muito grande, poste aqui no tópico um link para download do código...

 

Não receberei código por MP porque dessa forma, outros participantes não saberão quando o código foi enviado de fato, já se for postado aqui no tópico será registrado a data e hora do post e assim todos saberão se um concorrente cumpriu o prazo estipulado.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eita, que premio eim? Deu até vontade participar :rolleyes:

Uma pena que não posso :(

 

Brincaderias a parte, um excelente desafio e com um ótimo prêmio.

Parabéns pela organização João Batista.

 

E desde já desejo boa sorte a todos os participantes.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma dica, acho que não deveria ser postado os codigos aqui, ai outra pessoa pode se basear nos codigos postados e apenas mudar algumas coisas, o melhor seria ele mandar por MP mesmo, e dai postar aqui só dizendo que ja enviou, e cabe ao moderador responsavel que recebeu a MP confirmar isso.

 

t+

 

parabens pelo desafio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma dica, acho que não deveria ser postado os codigos aqui, ai outra pessoa pode se basear nos codigos postados e apenas mudar algumas coisas,

o melhor seria ele mandar por MP mesmo, e dai postar aqui só dizendo que ja enviou, e cabe ao moderador responsavel que recebeu a MP confirmar isso.

 

Não tinha pensado na possibilidade de plágio, façamos assim então, os códigos deverão ser enviados para mim e imediatamente o membro deverá postar aqui tornando público o dia e a hora do envio. Eu acusarei o recebimento dos mesmos no mesmo post.

 

parabens pelo desafio

 

Valeu Fabyo !!!

 

Vamos ver como a galera do iMasters está em PHP !!!

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

faltou informar uma coisa: como será a entrada de dados? um formulário onde será inserido cálculo? Leitura a partir de arquivo (creio que seja o mais interessante)?

 

Bom, como para a avaliação passarei tanto uma quanto várias (item 6 das definições do desafio) o mais adequado é que seja uma função/método que receba como único parâmetro a expressão em si, ficaria assim:

 

function analise( $context ){
//código que irá analisar...

return $response;
}

 

Passarei para a função dessa forma:

echo analise( '10+10+20+20-30-20-10' ); //deverá retornar 0

 

E no do item 6 será feito assim:

$expressoes = array(
'10+10+20+20-30-20-10',
'5+2-2',
/...
'10+20+30+40+50'
);

for ( $i = 0 , $t = count( $expressoes ) ; $i < $i ; ++$i ) echo analise( $expressoes[ $i ] );

 

Lembrando que entre as expressões passadas, poderá ter alguma expressão inválida (item 6) se o analisador exibir um erro ou warning ou notice perderá ponto e caso consiga identificar a expressão inválida (item 5) ganhará pontos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1a Etapa do Desafio Premiado PHP:

 

1. Aquele que apresentar o código fora do prazo estará automaticamente desclassificado.

2. Para participar da segunda etapa em diante, é necessário ter participado de todas as etapas anteriores.

 

Apenas os seguintes membros continuam participando:

 

Beraldo, entregou dia 28/11 - 10:35

SoulDark, entregou dia 29/11 - 08:41

Tomb Raider, entregou dia 29/11 - 21:07

 

3. O código que não executar corretamente o proposto pela etapa perderá 10 pontos.

 

Expressão para avaliação:

10+20+30+40-40-30-20-10

 

Fonte do Beraldo:

echo analise( '10+20+30+40-40-30-20-10' ); //0

 

Por apresentar o resultado correto, Beraldo ganha 10 pontos (1.1.1 específico para a etapa)

 

Fonte do DarkSoul:

echo calcula( '10+20+30+40-40-30-20-10' ); //0

 

Por apresentar o resultado correto, DarkSoul ganha 10 pontos (1.1.1 específico para a etapa)

 

Fonte do Tomb Raider:

echo calcular( '10+20+30+40-40-30-20-10' );

 

Saída:

<b>Fatal error</b>: Foi identificado uma situação inesperada durante a execução do código in <b>/var/www/html/lab/desafio/Tomb_Raider/etapa1.php</b> on line <b>15</b><br />

 

Por exibir um Fatal Error em uma situação válida, Tomb Raider perde 20 pontos (item 6.3)

 

5. O código que for capaz de identificar uma situação adversa ganhará 20 pontos.

 

Expressão para avaliação:

10+20+30+40--40-30-20-10 http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Vejam o duplo - entre os números 40

 

Fonte do Beraldo:

echo analise( '10+20+30+40--40-30-20-10' );

 

Saída:

 

<b>Parse error</b>: syntax error, unexpected T_DEC in <b>/var/www/html/lab/desafio/Beraldo/etapa1.php(21) : eval()'d code</b> on line <b>1</b><br />
<br />
<b>Notice</b>: Undefined variable: value in <b>/var/www/html/lab/desafio/Beraldo/etapa1.php</b> on line <b>29</b><br />

 

Por apresentar o Notice, perde 10 pontos

 

Fonte do DarkSoul:

echo calcula( '10+20+30+40--40-30-20-10' );

 

Saída:

<b>Parse error</b>: syntax error, unexpected T_DEC in <b>/var/www/html/lab/desafio/DarkSoul/etapa1.php(8) : eval()'d code</b> on line <b>1</b><br />
<br />
<b>Notice</b>: Undefined variable: return in <b>/var/www/html/lab/desafio/DarkSoul/etapa1.php</b> on line <b>9</b><br />
0

 

Por apresentar o Notice, perde 10 pontos

 

Fonte do Tomb Raider:

<b>Parse error</b>: syntax error, unexpected T_DEC in <b>/var/www/html/lab/desafio/Tomb_Raider/etapa1.php(10) : eval()'d code</b> on line <b>1</b><br />
<br />
<b>Notice</b>: Undefined variable: resultado in <b>/var/www/html/lab/desafio/Tomb_Raider/etapa1.php</b> on line <b>12</b><br />
<br />
<b>Fatal error</b>: Foi identificado uma situação inesperada durante a execução do código in <b>/var/www/html/lab/desafio/Tomb_Raider/etapa1.php</b> on line <b>15</b><br />

 

Por apresentar o Notice, perde 10 pontos. Porém, por identificar que alguma coisa estava errada, ganha 20 pontos (5.1)

 

1.1.2: 1 * 2 * 3 * 4 / 3 / 2 / 1, o código que retornar o resultado correto ganhará 10 pontos.

 

Beraldo:

echo analise( '1 * 2 * 3 * 4 / 3 / 2 / 1' ); //4

 

DarkSoul:

echo calcula( '1 * 2 * 3 * 4 / 3 / 2 / 1' ); //4

 

Tomb Raider:

echo calcular( '1 * 2 * 3 * 4 / 3 / 2 / 1' ); //4

 

Todos ganharam 10 pontos.

 

1.1.3: 1 * 2 + 3 * 4 - 5 * 2, o código que retornar o resultado correto ganhará 20 pontos.

 

Beraldo:

echo analise( '1 * 2 + 3 * 4 - 5 * 2' ); //4

 

DarkSoul:

echo calcula( '1 * 2 + 3 * 4 - 5 * 2' ); //4

 

Tomb Raider:

echo calcular( '1 * 2 + 3 * 4 - 5 * 2' ); //4

 

Todos ganharam 20 pontos.

 

Para a última avaliação:

O código que executar 100 problemas diferentes em menor tempo ganhará 20 pontos.

Foi criado o seguinte ambiente:

$valores = range( 1 , 1000 );
$operadores = array( '+' , '-' , '*' , '/' );

function geraExpressao( &$valores , &$operadores ){
$ret = '';

shuffle( $operadores );
shuffle( $valores );

for ( $i = 0 ; $i < 4 ; ++$i )
	$ret .= sprintf( '%s%s' , $valores[ $i ] , $operadores[ $i ] );

$ret .= $valores[ $i ];

return $ret;
}

for ( $i = 0 ; $i < 100 ; ++$i ){
$expressao = geraExpressao( $valores , $operadores );

sleep( 1 );
$inicio = microtime( true );
printf( 'Beraldo %d -> %f%s' , analise( $expressao ) , microtime( true ) - $inicio , PHP_EOL );
flush();

sleep( 1 );
$inicio = microtime( true );
printf( 'DarkSoul %d -> %f%s' , calcula( $expressao ) , microtime( true ) - $inicio , PHP_EOL );
flush();

sleep( 1 );
$inicio = microtime( true );
printf( 'Tomb Raider %d -> %f%s' , calcular( $expressao ) , microtime( true ) - $inicio , PHP_EOL );
flush();
}

 

DarkSoul: Tempo total http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 0,009770

Tomb Raider: Tempo total http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 0,011611

Beraldo: Tempo total http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 0,012622

 

Dessa forma, DarkSoul ganha 20 pontos

 

Fechando as pontuações:

DarkSoul http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 10-10+10+20+20 http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 50 pontos

Beraldo http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 10-10+10+20 http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 30 pontos

Tomb Raider http://forum.imasters.com.br/public/style_emoticons/default/seta.gif -20-10+20+10+20 http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 20 pontos

 

Considerações finais:

 

Todos os códigos utilizaram a função eval() para cumprir a primeira etapa:

 

Beraldo:

if ( preg_match( "/\/\s*0/", $exp ) )
//...
if ( preg_match( "/[,!-):-~]/i", $exp ) )

 

Quando se trabalha com expressões regulares, deve-se sempre tentar minimizar o número de expressões, o operador | poderia ser utilizado para unir as duas expressões em uma, dessa forma, o código teria uma execução mais rápida já que a expressão é compilada uma única vez.

 

Tomb Raider:

if ($resultado) 
//...

 

Na primeira avaliação, a expressão retornou 0, ao fazer a verificação lógica do resultado, o 0 foi convertido em false e por esse motivo a função falhou. Tome sempre cuidado ao fazer verificações com os resultados, esperar que um resultado nunca apareça pode causa um problema sério.

 

DarkSoul:

Não houve nenhuma verificação, isso fez com que a execução fosse muito mais rápida que os outros, porém o nível de segurança também caiu, hoje segurança é um tema que deve ser levado muito a sério, muitas vezes é melhor ter uma execução mais lenta porém mais segura.

 

Todos:

EVITEM SEMPRE utilizar a função eval() em uma situação real, um usuário 'do mal' pode perceber o uso dessa função e inserir um código malicioso com uma função como unlink(...). Como regra, a função eval deve ser utilizada APENAS se você conhecer exatamente o que será a entrada.

 

Caso tenha ficado alguma dúvida quanto aos critérios da avaliação ou quanto a soma dos pontos, todos os competidores são livres para solicitar uma revisão, nesse caso, será solicitado a um outro moderador, moderador global ou administrador a revisão.

 

Parabéns a todos os competidores. a próxima etapa será publicada em seguida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A segunda etapa do Desafio Premiado PHP é muito semelhante a primeira, porém, dessa vez, o uso da função eval() não será permitido pelo motivo exposto na conclusão da primeira etapa.

 

1. Criação de um script capaz de analisar uma expressão matemática, aceitando os seguintes operadores +, -, *, / e também parênteses.

----1.1 Para avaliação serão utilizadas expressões semelhantes às seguintes: (os valores e a ordem dos operadores poderão ser diferentes)

--------1.1.1: 10 + 20 + 30 + 40 - (50 * 2), o código que retornar o resultado correto ganhará 10 pontos.

--------1.1.2: 1 * 2 * 3 - ( 4 * 3 ) / ( 2 * 1 ), o código que retornar o resultado correto ganhará 10 pontos.

--------1.1.3: 4 * 5 + ( 2 * ( 4 - ( 5 * 2 ) ) ), o código que retornar o resultado correto ganhará 20 pontos.

2. O script que utilizar a função eval estará automaticamente desclassificado.

 

As regras gerais que foram aplicadas na primeira etapa serão aplicadas também na segunda etapa.

A entrada dos dados será exatamente igual à primeira etapa.

 

Início da segunda etapa: hoje(30/11) a meia noite.

Fim da segunda etapa: quarta (02/12) a meia noite.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cadê a segunda etapa?

 

como vai ficar agora João ?

 

Bom, como ninguém apresentou a segunda etapa dentro do prazo todos foram automaticamente desclassificados.

 

Após algumas opiniões sobre como proceder e após consultar os participantes da primeira etapa, foi decidido que:

 

---- 1. O desafio atual foi cancelado por ninguém apresentar a segunda etapa no prazo estipulado.

---- 2. O desafio será novamente aberto novamente e tornado público para que outros membros possam participar.

---- 3. Eu implementarei a primeira etapa e disponibilizarei o código para que os novos participantes possam tomá-lo como base para o restante do desafio.

---- 4. O desafio iniciará partindo da segunda etapa (que será a nova primeira etapa).

---- 5. Todos os prazos serão revistos para cima, uma vez que ficou óbvio que 2 dias foi insuficiente.

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.