Em tempos de Mega Sena acumulada…

Há alguns minutos 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! :D

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 estou aprendendo Groovy, não podia deixar esta oportunidade passar. E, de fato, não deixei!

Veja, abaixo, um programa em Groovy que soluciona o “problema” proposto:

  1. def hist = [:], v
  2. 100000.times{hist[v = 1 + Math.random() * 60 as int] = !hist[v] ? 1 : hist[v] + 1}
  3. println hist.keySet().toList().sort{-hist[it]}[0..5].join(‘,’)

Os programas postados até então foram de, no mínimo, três linhas. Então podemos dizer que o Groovy — pelo menos no escopo do problema proposto — não deve nada a outras linguagens que a galerinha gosta de chamar de “ágeis”! :P

Aliás, será que esse programa aqui poderia ser escrito em menos linhas?

UPDATE

Minha consciência estava ficando pesada. Por isso, segue a versão Squeak/Smalltalk:

  1. | s |
  2. s := ((OrderedCollection withAll: ((1 to: 100000) collect: [:each | 60 atRandom])) groupBy: [:each | each] having: [:each | true]) asSortedCollection: [:a :b | b size < a size].
  3. 1 to: 6 do: [:each | Transcript show: ((s at: each) at: 1); cr]

:D

Tags: , , , ,