tadarank afiliados

06 setembro, 2007

Code contest: Mega Sena acumulada

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.

10 comentários:

  1. Muito bom! Vou tentar fazer numa linha so :D

    ResponderExcluir
  2. Puts 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!

    ResponderExcluir
  3. Micox, acho que consegui fazer em JavaScript numa linha somente.

    Da uma olhada por favor:

    http://www.mouseoverstudio.com/blog/?p=23

    ResponderExcluir
  4. Jisuis, maria, josé. Fiquei com medo agora Diego.
    Eu nem sabia da existencia desse forEach aí pra arrays ehehahe

    ResponderExcluir
  5. 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...

    ResponderExcluir
  6. Fala 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.
    Passa la e diz o que você acha. :D
    http://www.fazedordesite.com

    ResponderExcluir
  7. Poutzz...
    Mancada 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.

    ResponderExcluir
  8. Aews!
    Estou 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!

    ResponderExcluir
  9. Segue ae entao o codigo em PHP, consegui fazer em 2 linhas.

    assim 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 - ";

    ResponderExcluir
  10. caracas walker. ficou muito louco.
    Post lá no blog do macaco chefe.

    ResponderExcluir

Resultado! Concursos