Em tempos de Mega Sena acumulada…

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! :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 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]

Veja também:

Tags: , , , , ,

Deixe um comentário