Eu ganhei na loteria?

8

Acabei de enviar uma resposta a esta pergunta e, em seguida, observei algumas notícias sobre a mania da loteria MegaMillions que está acontecendo agora nos EUA. Este artigo dizia que um indivíduo comprou US $ 20.000 em ingressos de uma só vez (são 20.000 conjuntos de números para confirmar!) Para tentar testar sua sorte.

Isso me levou a pensar em como determinar rapidamente se eles ganharam ou não algum prêmio, e não apenas um jackpot, em uma grande quantidade de ingressos comprados.

O desafio então é o seguinte:

Visão geral:

Escreva uma função ou programa que aceite uma sequência de números como argumento (STDIN ou leia a partir de um arquivo, sua escolha) e retorne os números dos tickets com pelo menos o pagamento mínimo concedido.

Detalhes do código:

  • A entrada consistirá em uma série de linhas, uma para cada ingresso comprado. Os números vencedores serão prefixados com 0, enquanto os números sorteados serão prefixados com um número incrementado começando em 1. (veja o exemplo)
  • A entrada deve ser um conjunto completamente aleatório de números a cada vez, incluindo empates e números vencedores.
  • A entrada deve aceitar qualquer número de tickets n em que 1 <= n <= 20.000. (Suponha que nenhum bilhete seja executado.)
  • Cada linha de entrada terá 7 números por linha. Um para o prefixo mencionado acima, 5 para as bolas padrão e um adicional para a bola 'match'. (veja detalhes da loteria abaixo)
  • A entrada pode ser delimitada da maneira que você desejar (espaço em branco, ponto e vírgula, etc.)
  • O resultado deve ser uma lista de todos os empates vencedores e o valor vencedor. (Então você sabe qual entregar.)
  • A listagem de saída deve ser ordenada pelo valor da vitória. (Quem se importa se você ganhou US $ 2 em um bilhete, se você também ganhou US $ 10.000 em outro ???)
  • Quando mais de um ticket ganha a mesma quantia, a ordem desses tickets é irrelevante.
  • A saída também deve fornecer uma lista do valor total ganho.

Detalhes da loteria:

  • As regras padrão para o jogo MegaMillions serão aplicadas, já que é o que há de mais quente no momento.
  • Os sorteios consistem em seis números de dois grupos de números separados - cinco números diferentes de 1 a 56 e um número (a bola da partida) de 1 a 46.
  • O jackpot é ganho combinando todos os seis números vencedores em um desenho.
  • Os prêmios por ganhos que não são do jackpot são concedidos da seguinte forma (veja a imagem abaixo).

    (Principal) + (Correspondência) = (Pagamento)
    5 + 1 = Jackpot
    5 + 0 = $ 250.000
    4 + 1 = $ 10.000
    4 + 0 = $ 150
    3 + 1 = $ 150
    3 + 0 = $ 7
    2 + 1 = $ 10
    1 + 1 = $ 3
    0 + 1 = $ 2

  • Suponha que o jackpot atual seja de US $ 1.000.000 (um milhão).

  • Assuma apenas um vencedor do jackpot, a menos que seu sorteio aleatório faça o mesmo sorteio do jackpot mais de uma vez (você está trapaceando?) .
  • Suponha que não haja regras multiplicadoras / da Califórnia em jogo.

Montantes atribuídos

Detalhes do Desafio:

  • Isso é código de golfe, então o código mais curto vence.
  • Em caso de empate, aceitarei a resposta mais votada. Eu sei que isso é um pouco subjetivo, mas o ponto principal ainda é o placar.

Exemplo:

Entrada:

0   2   4   23  38  46  23  
1   17  18  22  23  30  40  
2   2   5   24  37  45  23  
3   4   23  38  40  50  9  
4   2   4   23  38  46  17  
5   5   16  32  33  56  46  

Resultado:

4 - $250,000  
3 - $7  
2 - $3  
Total Winnings: $250,010 
Gaffi
fonte
5
Você pode repetir as regras da loteria aqui? Eu acho que as perguntas devem ser independentes. E também não consigo acessar sites de jogos do trabalho.
Ugoren
1
Claro ... adicionando acima em um minuto!
Gaffi
O Jackpot não está dividido entre todos os bilhetes premiados?
deixou de girar no sentido anti
@leftaroundabout Fixed.
Gaffi
Não ... eu ganhar ....
Steve Robbins

Respostas:

3

Python, 239 caracteres

import sys
a=map(eval,sys.stdin)
w=lambda x:(0,2,0,3,0,10,7,150,150,1e4,25e4,1e6)[2*len(set(x[1:-1])&set(a[0][1:-1]))+(x[6]==a[0][6])]
s=0
for e in sorted(a[1:],cmp,w,1):
    t=w(e);s+=t
    if t:print e[0],"- $%u"%t
print"Total Winnings: $%u"%s

Supondo que os números de entrada sejam separados por vírgula.

hallvabo
fonte
Obrigado pela idéia de matemática: 1e4, etc. (eu deveria ter sabido desde o início!)
Gaffi
As novas linhas contam em python? e quanto à indentação?
Joel Cornett
Sim, ambos contam. As novas linhas contam como 1 caracter cada. Recuo pode ser minimizada pela intercalação espaços e tabulações: 1º nível = <espaço>, nível 2 = <tab>, 3º nível = <tab> <espaço> etc.
hallvabo
2

VBA ( 660 535 caracteres)

Supondo que delimitador é um espaço ( " ") ...

Sub a(b)
c=Split(b,vbCr)
Set l=New Collection
Set n=New Collection
d=Split(c(0)," ")
For e=1 To UBound(c)
f=Split(c(e)," ")
p=f(0)
i=1
For g=1 To 5:For h=1 To 5
i=i-(d(g)=f(h))
Next:Next
k=IIf(d(6)=f(6),Choose(i,2,3,10,150,10^4,10^6),Choose(i,0,0,0,7,150,500^2))
If k>0 Then
o=1
For m=1 To l.Count
If k>=l(m) Then l.Add k,p,m:n.Add p,p,m:o=0:m=99999
Next
If o Then l.Add k,p:n.Add p,p
End If
Next
For m=1 To l.Count
r=r & n(m) & ":" & Format(l(m),"$#,##0") & vbCr
q=q+l(m)
Next
MsgBox r & "Total Winnings:" & Format(q,"$#,##0")
End Sub
Gaffi
fonte
Eu era capaz de reduzir significativamente o tamanho convertendo o Select CaseemChoose()
Gaffi
Ótimo truque! tem sido assim por muitos anos desde que eu ouvi de Choose()... Isso é uma coisa boa para postar em codegolf.stackexchange.com/questions/5175/...
Cristian Lupascu
@ w0lf Não é uma má ideia!
Gaffi
você pode perder muito poucos caracteres, substituindo o segundo a última linha com Debug.?r& "Total Winnings:" &Format(q,"$#,##0")e remover os espaços em branco em concatenations
Taylor Scott
Ah, e sempre que tiver uma For i=1 To 5ou como loop que pode ser condensado paraFor I=1To 5
Taylor Scott
2

Javascript, 353 bytes

(function(t){u={"51":1e6,"50":25e4,"41":1e4,"40":150,"31":150,"30":7,"21":10,"11":3,"01":2},a=t.split('\n'),l=a.length-1,m=a[0].split(' '),w=m.slice(1,6),h=0;for(;l--;){s=a[l+1].split(' '),i=s.slice(1,6).filter(function(n){return!!~w.indexOf(n)}),n=i.length+''+(s[6]==m[6]?1:0),v=u[n];if(v){h+=v;console.log(l+'-$'+v)}}console.log('Total Winnings: $'+h)})("0 2 4 23 38 46 23\n" + "1 17 18 22 23 30 40\n" + "2 2 5 24 37 45 23\n" + "3 4 23 38 40 50 9\n" + "4 2 4 23 38 46 17\n" + "5 5 16 32 33 56 46")

ungolfed:

(function (t) {
    u = {
        "51": 1e6,
        "50": 25,
        "41": 1e4,
        "40": 150,
        "31": 150,
        "30": 7,
        "21": 10,
        "11": 3,
        "01": 2
    },
    a = t.split('\n'),
    l = a.length - 1,
    m = a[0].split(' '),
    w = m.slice(1, 6),
    h = 0;
    for (; l--; ) {
        s = a[l + 1].split(' '),
        i = s.slice(1, 6).filter(function (n) { return !! ~w.indexOf(n) }),
        n = i.length + '' + (s[6] == m[6] ? 1 : 0),
        v = u[n];
        if (v) {
            h += v;
            console.log(l + ' - $' + v)
        }
    }
    console.log('Total Winnings: $' + h)
})("0 2 4 23 38 46 23\n" +
"1 17 18 22 23 30 40\n" +
"2 2 5 24 37 45 23\n" +
"3 4 23 38 40 50 9\n" +
"4 2 4 23 38 46 17\n" +
"5 5 16 32 33 56 46")

Provavelmente poderia derrubar alguns caracteres que: D

Ed James
fonte
Vejo isso como 499 caracteres (com os argumentos no final da sua versão de linha única) ... Estou perdendo alguma coisa?
Gaffi
@ Gaffi Sim, isso é interessante ... Eu o envolvi em uma função e "toString (). Length" o editei e obtive 517, mas uma contagem direta de caracteres chega em 499 ... Obrigado por apontar isso!
11552 Ed James