2006-12-21

Amigo Oculto

Lua Neste final de ano estão todos pensando em amigo oculto...

Meu professor de Java passou como trabalho criar um serviço de amigo oculto, o pessoal lá do trabalho está fazendo amigo oculto e um colega meu estava com um problema com um programa (acho que em PHP) de amigo oculto.

O Silvio me sugeriu fazer um algoritmo de sorteio para amigo oculto em Lua, já que estamos envolvidos com um Kepler.

Bem, vamos então brincar um pouco com isso. =)

A primeira coisa que precisamos é uma lista dos amigos. Isso pode ser feito via web (sinceramente não estou com muito saco para ficar fazendo a UI, quem quiser que se vire), linha de comando ou GUI, ao gosto do frequês. Depois esta tabela precisa ser passada para o algoritmo de sorteio.

Todos os recursos para criar uma interface web (e até para armazenar os dados em banco de dados) são fornecidos por Kepler, portanto não fiquem acanhados! Quem quiser bricar de fazer isso é só dar uma olhada nos manuais (mais tarde publico um artigo sobre como usar alguns recursos).

Bem, digamos que a tabela – indexada, um vetor – tenha sido passada para a variável amigos.

Vamos agora embaralhar essa brincadeira:

local temp = amigos
amigos = {}
while table.getn(temp) > 0 do
-- Pega um índice aleatório
local i = math.random(table.getn(temp))
table.insert(amigos, table.remove(temp, i))
end


Agora a tabela amigos está toda embaralhada. Vamos então gerar o dicionário que retornará para quem cada um deve dar seu presente:

-- tabela global amigoOculto
amigoOculto = {}
table.foreachi(amigos, function(i, v)
amigoOculto[v] = amigos[i + 1] or amigos[1]
end)


Cada um tem seu amigo oculto. Para saber para quem José das Couves tem de dar presente, é só pedir o valor de amigoOculto["José das Couves"]. Isso pode então ser guardado num banco de dados, por exemplo.

Agora é só desenvolver uma interface, para que cada um possa logar e ver para quem deve dar presente e não possa ver mais nada.

[]'s