¿Gané la lotería?

8

Acabo de enviar una respuesta a esta pregunta , y luego miré algunas noticias sobre la moda de la lotería MegaMillions que está ocurriendo ahora en los Estados Unidos. Este artículo informativo afirma que una persona compró boletos por un valor de $ 20,000 al mismo tiempo (¡eso es 20,000 conjuntos de números para confirmar!) Para probar y probar su suerte.

Eso me llevó a pensar en cómo uno podría determinar rápidamente si habían ganado o no algún premio, no solo un premio gordo, en una gran cantidad de boletos que habían comprado.

El desafío entonces es este:

Visión general:

Escriba una función o programa que acepte una cadena de números como argumento (STDIN, o lea desde un archivo, su elección), y devuelva los números de los boletos con al menos el pago mínimo otorgado.

Detalles del código:

  • La entrada consistirá en una serie de líneas, una por cada boleto comprado. Los números ganadores tendrán el prefijo 0, mientras que los números sorteados tendrán el prefijo un número incrementado que comienza en 1. (ver ejemplo)
  • La entrada debe ser un conjunto de números completamente aleatorio cada vez, incluidos sorteos y números ganadores.
  • La entrada debe aceptar cualquier número de tickets n donde 1 <= n <= 20,000. (Suponga que no se ejecuta ningún ticket 0).
  • Cada línea de entrada tendrá 7 números por línea. Uno para el prefijo mencionado anteriormente, 5 para las bolas estándar y uno adicional para la bola de 'partido'. (ver detalles de la lotería a continuación)
  • La entrada se puede delimitar de la forma que desee (espacios en blanco, punto y coma, etc.)
  • El resultado debe ser una lista de todos los sorteos ganadores y la cantidad ganadora. (Entonces ya sabes a quién entregar)
  • La lista de salida debe ordenarse por cantidad de ganancias. (¿A quién le importa si ganó $ 2 en un boleto si también ganó $ 10,000 en otro ???)
  • Cuando más de un boleto gana la misma cantidad, el orden de esos boletos es irrelevante.
  • El resultado también debe dar una lista de la cantidad total ganada.

Detalles de la lotería:

  • Se aplicarán las reglas estándar para el juego MegaMillions , ya que eso es lo que está de moda en este momento.
  • Los sorteos consisten en seis números de dos grupos separados de números: cinco números diferentes del 1 al 56 y un número (la bola del partido) del 1 al 46.
  • El premio gordo se gana haciendo coincidir los seis números ganadores en un sorteo.
  • Los premios por premios que no son de jackpot se otorgan de la siguiente manera (ver imagen a continuación)

    (Principal) + (Igualar) = (Pago)
    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

  • Suponga que el bote actual es de $ 1,000,000 (un millón).

  • Asumir único ganador del premio mayor, a menos que su sorteo tira del mismo bote recoger más de una vez (estás engañando?) .
  • Suponga que no hay multiplicador / las reglas de California están en juego.

Importes otorgados

Detalles del desafío:

  • Este es el código de golf, por lo que gana el código más corto.
  • En caso de empate, tomaré la respuesta más votada. Sé que esto es algo subjetivo, pero el punto principal sigue siendo el puntaje.

Ejemplo:

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  

Salida:

4 - $250,000  
3 - $7  
2 - $3  
Total Winnings: $250,010 
Gaffi
fuente
55
¿Puedes repetir las reglas de la lotería aquí? Creo que las preguntas deberían ser independientes. Y tampoco puedo acceder a sitios de apuestas desde el trabajo.
ugoren 01 de
1
Claro ... agregando arriba en un minuto!
Gaffi 01 de
¿No se divide el Jackpot entre todos los boletos ganadores?
dejó de girar en sentido antihorario el
@leftaroundabout Fijo.
Gaffi 01 de
No ... yo gano ...
Steve Robbins

Respuestas:

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

Suponiendo que los números de entrada están separados por comas.

hallvabo
fuente
Gracias por la idea matemática 1e4, etc. (¡debería haberlo sabido desde el principio!)
Gaffi
¿Las nuevas líneas cuentan en Python? ¿Qué pasa con la sangría?
Joel Cornett
Sí, ambos cuentan. Las líneas nuevas cuentan como 1 carácter cada una. La sangría puede minimizarse intercalando espacios y pestañas: 1er nivel = <espacio>, 2do nivel = <tab>, 3er nivel = <tab> <espacio> etc.
hallvabo
2

VBA ( 660 535 caracteres)

Suponiendo que delimitador es un espacio ( " ") ...

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
fuente
Yo era capaz de reducir significativamente el tamaño mediante la conversión de la Select CaseenChoose()
Gaffi
Gran truco! Han pasado muchos años desde que escuché de Choose()... Esto es algo bueno para publicar en codegolf.stackexchange.com/questions/5175/…
Cristian Lupascu
@ w0lf ¡No es una mala idea!
Gaffi
puede perder bastantes caracteres reemplazando la penúltima línea Debug.?r& "Total Winnings:" &Format(q,"$#,##0")y eliminando espacios en blanco en las concatenaciones
Taylor Scott
Ah, y siempre que tenga un For i=1 To 5bucle o similar que se pueda condensarFor 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")

sin golf:

(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")

Probablemente podría eliminar algunos caracteres de eso: D

Ed James
fuente
Veo que como 499 caracteres (con los argumentos al final de su versión de una sola línea) ... ¿Me estoy perdiendo algo?
Gaffi
@Gaffi Sí, eso es interesante ... Lo envolví en una función y "toString (). Length" lo editó, y obtuve 517, pero un recuento de caracteres directo llega a 499 ... ¡Gracias por señalarlo!
Ed James