Lendo hoje o blog do El Micox fiquei sabendo de um desafio muito interessante criado por Macaco Chefe:
Escrever em qualquer linguagem de programação um programa que realize 100.000 sorteios de um numero entre 1 e 60 e mostre na tela os 6 mais freqüentes.
Ganha quem fizer o programa com o menor numero de linhas possíveis, lembrando que a linha considerada é a linha da unidade léxica da linguagem, portanto a seguinte linha em Java seria considerada duas: int i =0; sysout(i);
Fiquei muito surpreso quando El Micox comentou que Bermon tinha conseguido fazer o desafio com somente uma linha, utilizando Ruby, como descreve no seu post. Por sua parte, El Micox não fico muito atrais e utilizando JavaScript, conseguiu resolver o problema em duas linhas, como mostrou aqui.
Dei uma olhada no código dele e tentei por as mãos na massa para ver si conseguia igualar o resultado do Bermon. Finalmente cheguei nessa solução, que espero possam analisar e validar.
A linha do código é:
for (var i, array = new Array(), j = 0; j < 100000; j++, i = Math.round(59 * Math.random ()) + 1, function() { if (j == 100000) array.sort(function(a,b) {return b.split(',')[1] - a.split(',')[1]}).slice(0,6).forEach(function(ele){document.write(ele.split(",")[0] + " ")})}())(typeof array[i] == 'undefined') ? array[i] = i + ",1" : array[i] = i + "," + (parseInt(array[i].split(",")[1]) + 1);
De jeito mais ordenado fica assim:
for (var i, array = new Array(), j = 0; j < 100000; j++, i = Math.round(59 * Math.random ()) + 1,
function() {
if (j == 100000) array.sort(
function(a,b) {
return b.split(',')[1] - a.split(',')[1]
}
).slice(0,6).forEach(
function(ele) {
document.write(ele.split(",")[0] + " ")
}
)
}())
(typeof array[i] == 'undefined') ?
array[i] = i + ",1" :
array[i] = i + "," + (parseInt(array[i].split(",")[1]) + 1)
12 respostas ate agora ↓
1 Micox // Sep 6, 2007 at 2:17 pm
Jisuis!!! Caceta, ainda to tentando entender a parada hehaeheh
//nota: não sabia da existencia do foreach para arrays. Valeu pela nova info
2 Diego Carrion // Sep 6, 2007 at 7:12 pm
Basicamente o que faz o script é validar em cada iteração si ja foram realizadas 10000 sorteios.
Si a validação resultar em verdadeiro, nosso array é ordenado e logo são selecionados os 6 primeiros elementos.
Finalmente imprimimos o valor de cada um desses elementos.
O forEach e muito legal mas acho que no IE não rola, somente nos browsers decentes hehehe
3 Bernardo Rufino // Sep 6, 2007 at 8:33 pm
Poutz! Parabéns pessoal! Javascript no páreo!
4 Bernardo Rufino // Sep 6, 2007 at 8:35 pm
Feed Assinado!
5 Walter Cruz // Sep 6, 2007 at 10:03 pm
Eu até pensei em fazer em Javascript (que é uma das linguagens que eu mais gosto), mas deu uma preguiça! Ainda bem que temos duas versões..
Micox, o forEach é só pra Javascript 1.6, que funciona no Firefox 1.5 (talvez nalgum outro browser não MS, alguém tem alguma informação?)
Bacana o código
6 JulioGreff // Sep 6, 2007 at 10:41 pm
Legal! Dessa fiquei de fora mesmo, faltou miolo pra estudar…
7 Fazedor de Site » Arquivos do Blog » Code contest: Mega Sena acumulada // Sep 7, 2007 at 6:01 am
[…] visto o dos outros, quem sai depois tem vantagem nesse caso Peguei o código do El Micox, com o do Diego, mudei detalhezinhos e acho que consegui reduzir, se vale assim, para 5 ou 4 linhas depende de quem […]
8 Rodrigo Fante // Sep 7, 2007 at 6:19 am
Fala Diego peguei seu código e o do Mico, mudei detalhes, juntei os 2, e deu pra reduzir um pouco.
Diz o que vc acha depois.
9 Rodrigo Fante // Sep 7, 2007 at 6:31 am
Bom.. esquece o comentário anterior.
Eu tinha feito besteira.
A modificação que fiz era quase idêntica ao código reduzido do Mico, que quando li a primeira vez achei que era sempre o mesmo, porém com tudo colado.
Vou editar o post.
:/ falta de atenção é f…
10 Diego Carrion // Sep 7, 2007 at 9:19 am
Hehehe eu também na pressa deixei de prestar atenção em um monte de detalhes e dei um par de F5s até o código funcionar corretamente.
Estava louquinho para conseguir uma solução de uma linha em JavaScript hahahah
11 Rodrigo Fante // Sep 7, 2007 at 10:12 am
ahahaha
eu bem que tentei
mas menor do que o que já mostraram não consegui.
ahahahaha
Mas é isso, o importante é tentar
Quem sabe na próxima
12 RodrigoSol // Sep 9, 2007 at 8:37 pm
Bacana Cara!
Já atualizei lá.
Abraços,
Deixar um comentário