Vindo do blog do Bermon (que provavelmente vai ser o vencedor), eu tinha que dar uma contribuição JavaScript para o desafio do Macaco chefe né? (Por favor, sem piadinhas. Ele não é chefe do mico hehehehh)
Mesmo sabendo que não ia nem chegar perto dos vencedores, não podia deixar o Javascript de fora da brincadeira hehe.
O desafio:
"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); "
Os malucos do Ruby conseguiram fazer em 1 linha (incluindo o bermon nos 'malucos').
Com javascript eu tentei de várias formas porém eu só consegui fazer com 2 linhas:
for(var i,ra=new Array(),j=0 ; j<10000 ; j++,i=Math.round(59*Math.random())+1,ra[i]= (typeof(ra[i])=='undefined') ? ra[i]=i+" "+1 : ra[i]=i+' '+(parseInt(ra[i].split(' ')[1]) + 1)) { } document.write(ra.sort(function(a,b){return b.split(' ')[1] - a.split(' ')[1]}).slice(0,6).join(' vez(es)\n<br />'));
Se não valer assim, aumento um pouquinho (também é bom pra verem melhor o que foi feito).
for(var i,ra=new Array(),j=0 ; j<10000 ; j++, i = Math.round(59*Math.random())+1) ra[i] = (typeof(ra[i])=='undefined') ? ra[i]=i+" "+1 : ra[i]=i+' '+(parseInt(ra[i].split(' ')[1]) + 1); document.write(ra.sort(function(a,b){return b.split(' ')[1] - a.split(' ')[1]}).slice(0,6).join(' vez(es)\n<br />'));
Caso não seja aceito da maneira acima, há também uma forma mais extendida que ficaria com 6 linhas (esta já está beeeem mais entendível pra qualquer um, caso queiram explicações é só perguntar).
var ra = new Array(); for(j=0;j<10000;j++){ i = Math.round(59*Math.random())+1; ra[i] = (typeof(ra[i])=='undefined') ? ra[i]=i+" "+1 : ra[i]=i+' '+(parseInt(ra[i].split(' ')[1]) + 1); } document.write(ra.sort(function(a,b){return b.split(' ')[1] - a.split(' ')[1]}).slice(0,6).join(' vez(es)\n<br />'));
Agora é pra todo mundo entender.
var ra = new Array(); //declaro o array for(j=0;j<10000;j++){ //loop 10000 vezes i = Math.round(59*Math.random())+1; //faço o sorteio de 1 até 60 e jogo no 'i' //abaixo vou incrementar quem foi o índice do array sorteado //devido a deficiências de pegar o indice de um array em javascript //vou ter que guardar o índice no primeiro caractere pra splitar depois if(typeof(ra[i])=='undefined'){ ra[i]=i+" "+1; //se ra[i] ainda não existir crio ele }else{ //se já existir, incremento ele ra[i]=i+' '+(parseInt(ra[i].split(' ')[1]) + 1); } } //faço a ordenação de acordo com uma função específica //que pega só o que tem depois do espaço ra.sort(function(a,b){return b.split(' ')[1] - a.split(' ')[1]}) //dou um slice pra pegar os 6 primeiros e uno eles com o join. //jogo o resultado na tela document.write(ra.slice(0,6).join(' vez(es)\n<br />'));
hehe, Engraçado. Viram como um código de 11 linhas pode virar só 2? hehe
Será que alguém consegue fazer com menos linhas aí no javascript? Bora ae, cai pra dentro. heheheahe
PS.: O engraçado é que ontem eu só consegui chegar a 7 linhas. Hoje que vieram umas inspirações heheh.
PS.2.: Este ainda não é o último post do elmicox.blogspot antes de migrar para o elmicox.com. Vocês não precisam mudar seus feeds. Eu vou alterar pelo feedburner.
Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.
Muito bom! Vou tentar fazer numa linha so :D
ResponderExcluirPuts muito bom, a idéia de colocar os indices embutidos foi a luz. Vou ver se faço uma versão em Js tb. Pra mim está valendo sim, visto que a estrutura do for é em uma linha só mesmo. Vlw mico!
ResponderExcluirMicox, acho que consegui fazer em JavaScript numa linha somente.
ResponderExcluirDa uma olhada por favor:
http://www.mouseoverstudio.com/blog/?p=23
Jisuis, maria, josé. Fiquei com medo agora Diego.
ResponderExcluirEu nem sabia da existencia desse forEach aí pra arrays ehehahe
Fiquei de fora dessa, não tenho miolo suficiente pra esse tipo de coisa. Parabéns a você, ao Bermon e ao Diego, quando crescer quero ser igual a vocês hehehe...
ResponderExcluirFala Mico, sem autorização nem sua nem do Diego do Mouseover, peguei o código dos 2 alterei, e juntei tudo em 4 linhas com algumas mudancinhas.
ResponderExcluirPassa la e diz o que você acha. :D
http://www.fazedordesite.com
Poutzz...
ResponderExcluirMancada minha esquece o comentário anterior.
Não tinha visto seu primeiro código la direito, eu pensei que era uma versao soh tudo colado, e nao um código diferente.
Vou apagar meu post.. pq ficou igual aquela praticamente
ahahah
falta de atenção viu.
Aews!
ResponderExcluirEstou postando pra
dizer que tuas dicas aqui no site são incríveis!!!
Estudei um código de ajax q vc colocou aí, e realmente resolveu todos os meus problemas!
Parabéns cara, que seja ainda mais iluminado que vc já é.
[]s!
Segue ae entao o codigo em PHP, consegui fazer em 2 linhas.
ResponderExcluirassim como foi feito em Ruby.
desculpem a cadeia de chamadas de array. mas para o resultado ficar organizado soh assim mesmo ;).
for($x = 0; $x < 100000; $x++, $i = mt_rand(1,60) ) $ar[$i] = (!isset($ar[$i]))?array(1,$i):array($ar[$i][0]+1,$i);
echo ( (rsort($ar) and ($ar=array_slice($ar,0,6)) )?"":"" )."{$ar[0][1]}: {$ar[0][0]} vezes - {$ar[1][1]}: {$ar[1][0]} vezes - {$ar[2][1]}: {$ar[2][0]} vezes - {$ar[3][1]}: {$ar[3][0]} vezes - {$ar[4][1]}: {$ar[4][0]} vezes - {$ar[5][1]}: {$ar[5][0]} vezes - ";
caracas walker. ficou muito louco.
ResponderExcluirPost lá no blog do macaco chefe.