Habe ich das Lotto gewonnen?

8

Ich habe gerade eine Antwort auf diese Frage eingereicht und mir dann einige Nachrichten über den MegaMillions-Lotterie-Wahn angesehen, der gerade in den USA stattfindet. Diese Meldung angegeben , dass eine Person $ 20.000 im Wert von Tickets auf einmal (das ist 20.000 gekauft Sätze von Zahlen zu bestätigen!) Ihr Glück zu versuchen und zu testen.

Das brachte mich dazu, darüber nachzudenken, wie man schnell feststellen könnte, ob sie auf einer großen Menge von Tickets, die sie gekauft hatten, einen Preis gewonnen hatten oder nicht, nicht nur einen Jackpot.

Die Herausforderung lautet dann:

Überblick:

Schreiben Sie eine Funktion oder ein Programm, die eine Reihe von Zahlen als Argument akzeptiert (STDIN oder aus einer Datei Ihrer Wahl einlesen), und geben Sie die Nummern der Tickets mit mindestens der Mindestauszahlung zurück.

Codedetails:

  • Die Eingabe besteht aus einer Reihe von Zeilen, eine für jedes gekaufte Ticket. Den Gewinnzahlen wird eine 0 vorangestellt, während den gezogenen Zahlen eine inkrementierte Zahl ab 1 vorangestellt wird (siehe Beispiel).
  • Die Eingabe sollte jedes Mal ein völlig zufälliger Satz von Zahlen sein, einschließlich Ziehungen und Gewinnzahlen.
  • Die Eingabe sollte eine beliebige Anzahl von Tickets n akzeptieren, wobei 1 <= n <= 20.000. (Angenommen, es werden keine 0 Tickets ausgeführt.)
  • Jede Eingabezeile enthält 7 Zahlen pro Zeile. Eine für das oben angegebene Präfix, 5 für die Standardbälle und eine zusätzliche für den 'Match'-Ball. (siehe Lottodetails unten)
  • Die Eingabe kann beliebig begrenzt werden (Leerzeichen, Semikolon usw.).
  • Die Ausgabe sollte eine Auflistung aller Gewinnspiele und des Gewinnbetrags sein. (Sie wissen also, welche Sie abgeben müssen.)
  • Die Ausgabeliste sollte nach Gewinnbetrag sortiert sein. (Wen interessiert es, ob Sie mit einem Ticket 2 $ gewonnen haben, wenn Sie mit einem anderen auch 10.000 $ gewonnen haben ???)
  • Wenn mehr als ein Ticket den gleichen Betrag gewinnt, ist die Reihenfolge dieser Tickets irrelevant.
  • Die Ausgabe sollte auch eine Auflistung des gewonnenen Gesamtbetrags enthalten.

Lotto Details:

  • Es gelten die Standardregeln für das MegaMillions-Spiel , da dies momentan so heiß ist.
  • Die Ziehungen bestehen aus sechs Zahlen aus zwei getrennten Zahlenpools - fünf verschiedenen Zahlen von 1 bis 56 und einer Zahl (dem Matchball) von 1 bis 46.
  • Der Jackpot wird gewonnen, indem alle sechs Gewinnzahlen in einer Ziehung abgeglichen werden.
  • Auszeichnungen für Nicht-Jackpot-Gewinne werden wie folgt vergeben (siehe Bild unten).

    (Main) + (Match) = (Auszahlung)
    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

  • Angenommen, der aktuelle Jackpot beträgt 1.000.000 USD (eine Million).

  • Nehmen Sie nur einen Jackpot-Gewinner an, es sei denn, Ihre zufällige Ziehung zieht dieselbe Jackpot-Auswahl mehr als einmal (betrügen Sie?) .
  • Angenommen, es sind keine Multiplikator- / kalifornischen Regeln im Spiel.

Vergebene Beträge

Details zur Herausforderung:

  • Dies ist Code Golf, also gewinnt der kürzeste Code.
  • Im Falle eines Unentschieden nehme ich die am höchsten bewertete Antwort. Ich weiß, dass dies etwas subjektiv ist, aber der Hauptpunkt ist immer noch die Punktzahl.

Beispiel:

Eingang:

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  

Ausgabe:

4 - $250,000  
3 - $7  
2 - $3  
Total Winnings: $250,010 
Gaffi
quelle
5
Können Sie die Lotterieregeln hier wiederholen? Ich denke, Fragen sollten in sich geschlossen sein. Außerdem kann ich von der Arbeit aus nicht auf Glücksspielseiten zugreifen.
Ugoren
1
Sicher ... in einer Minute oben hinzufügen!
Gaffi
Ist der Jackpot nicht auf alle Gewinnscheine aufgeteilt?
hörte auf, gegen den Uhrzeigersinn am
@leftaroundabout Behoben.
Gaffi
Nein ... ich gewinne ...
Steve Robbins

Antworten:

3

Python, 239 Zeichen

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

Angenommen, die eingegebenen Nummern sind durch Kommas getrennt.

Hallvabo
quelle
Vielen Dank für die mathematische Idee: 1e4usw. (Ich hätte es von Anfang
Gaffi
Zählen Zeilenumbrüche in Python? Was ist mit Einrückung?
Joel Cornett
Ja, beides zählt. Zeilenumbrüche zählen jeweils als 1 Zeichen. Einrückungen können durch Verschachteln von Leerzeichen und Tabulatoren minimiert werden: 1. Ebene = <Leerzeichen>, 2. Ebene = <Tab>, 3. Ebene = <Tab> <Leerzeichen> usw.
Hallvabo
2

VBA ( 660 535 Zeichen)

Angenommen, das Trennzeichen ist ein Leerzeichen ( " ") ...

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
quelle
Ich konnte die Größe erheblich reduzieren, indem ich die Select CaseinChoose()
Gaffi
Toller Trick! Es ist so viele Jahre her, seit ich von Choose()... gehört habe. Dies ist eine schöne Sache, die ich
Cristian Lupascu
@ w0lf Keine schlechte Idee!
Gaffi
Sie können einige Zeichen verlieren, indem Sie die vorletzte Zeile durch Debug.?r& "Total Winnings:" &Format(q,"$#,##0")Leerzeichen ersetzen und Leerzeichen in Verkettungen entfernen
Taylor Scott
Oh und wann immer Sie eine For i=1 To 5oder ähnliche Schleife haben, die verdichtet werden kannFor 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")

Könnte wahrscheinlich ein paar Zeichen davon abbringen: D.

Ed James
quelle
Ich sehe das als 499 Zeichen (mit den Argumenten am Ende Ihrer einzeiligen Version) ... Vermisse ich etwas?
Gaffi
@Gaffi Ja, das ist interessant ... Ich habe es in eine Funktion eingewickelt und "toString (). Length" bearbeitet und 517 erhalten, aber bei 499 kommt eine gerade Zeichenanzahl ... Danke, dass Sie darauf hingewiesen haben!
Ed James