Há algum tempo atrás eu acabei me deparando com um desafio bastante interessante proposto por Rodrigo Sol. O desafio em questão pede a criação do menor programa possível — em qualquer linguagem — para gerar um jogo da Mega Sena. Hehe, impressionante o poder de uma loteria acumulada sobre as pessoas!
Seguem as regras do desafio nas palavras do próprio Rodrigo:
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);
Como na época eu estava aprendendo Groovy, não podia deixar esta oportunidade passar. E, de fato, não deixei!
Veja, abaixo, uma solução para o “problema” proposto, usando a linguagem Groovy:
def hist = [:], v 100000.times{hist[v = 1 + Math.random() * 60 as int] = !hist[v] ? 1 : hist[v] + 1} println hist.keySet().toList().sort{-hist[it]}[0..5].join(',')
Será que dá para reduzir ainda mais esse código?
Update: Resolvi tentar resolver o mesmo problema, só que agora usando Smalltalk:
| s | s := ((OrderedCollection withAll: ((1 to: 100000) collect: [:each | 60 atRandom])) groupBy: [:each | each] having: [:each | true]) asSortedCollection: [:a :b | b size < a size]. 1 to: 6 do: [:each | Transcript show: ((s at: each) at: 1); cr]
Posts em Português
Posts in English
show de bola!