Apakah saya memenangkan lotre?

8

Saya baru saja mengirimkan jawaban untuk pertanyaan ini , dan kemudian melihat beberapa berita tentang kegilaan lotere MegaMillions yang sedang terjadi saat ini di AS. Artikel berita ini menyatakan bahwa seseorang membeli tiket senilai $ 20.000 sekaligus (itu adalah 20.000 set angka untuk konfirmasi!) Untuk mencoba dan menguji keberuntungan mereka.

Itu membuat saya berpikir tentang bagaimana seseorang dapat dengan cepat menentukan apakah mereka akan memenangkan hadiah, bukan hanya jackpot, pada banyak tiket yang telah mereka beli.

Tantangannya adalah ini:

Gambaran:

Tulis fungsi atau program yang akan menerima serangkaian angka sebagai argumen (STDIN, atau baca dari file, pilihan Anda), dan kembalikan nomor tiket dengan setidaknya pembayaran minimum yang diberikan.

Rincian Kode:

  • Input akan terdiri dari serangkaian garis, satu untuk setiap tiket yang dibeli. Angka yang menang akan diawali dengan 0, sedangkan angka yang ditarik akan diawali dengan angka yang bertambah mulai dari 1. (lihat contoh)
  • Input harus berupa kumpulan angka yang benar-benar acak setiap kali, termasuk pengundian dan nomor pemenang.
  • Input harus menerima jumlah tiket n di mana 1 <= n <= 20.000. (Asumsikan no 0 tiket berjalan.)
  • Setiap baris input akan memiliki 7 angka per baris. Satu untuk awalan yang disebutkan di atas, 5 untuk bola standar, dan satu tambahan untuk bola 'cocok'. (lihat Detail Lotto di bawah)
  • Input dapat dibatasi dengan cara apa pun yang Anda inginkan (spasi putih, titik koma, dll.)
  • Output harus berupa daftar semua undian yang menang dan jumlah yang menang. (Jadi, Anda tahu mana yang harus diserahkan.)
  • Daftar output harus dipesan berdasarkan jumlah yang menang. (Siapa yang peduli jika Anda memenangkan $ 2 pada satu tiket jika Anda juga memenangkan $ 10.000 pada tiket lainnya ???)
  • Ketika lebih dari satu tiket memenangkan jumlah yang sama, urutan tiket tersebut tidak relevan.
  • Output juga harus memberikan daftar jumlah total yang dimenangkan.

Detail Lotto:

  • Aturan standar untuk game MegaMillions akan berlaku, karena itulah yang sangat panas saat ini.
  • Undian terdiri dari enam angka dari dua kelompok angka yang terpisah - lima angka yang berbeda dari 1 hingga 56 dan satu angka (bola pertandingan) dari 1 hingga 46.
  • Jackpot dimenangkan dengan mencocokkan semua enam angka yang menang dalam satu seri.
  • Penghargaan untuk kemenangan non-jackpot diberikan sebagai berikut (lihat gambar di bawah).

    (Utama) + (Pertandingan) = (Pembayaran)
    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

  • Asumsikan jackpot saat ini adalah $ 1.000.000 (satu juta).

  • Asumsikan hanya satu pemenang jackpot, kecuali jika undian acak Anda menarik jackpot yang sama memilih lebih dari satu kali (apakah Anda selingkuh?) .
  • Asumsikan tidak ada pengganda / aturan California sedang dimainkan.

Jumlah yang diberikan

Detail Tantangan:

  • Ini kode golf, jadi kode terpendek menang.
  • Jika terjadi seri, saya akan mengambil jawaban terunggul tertinggi. Saya tahu ini agak subyektif, tetapi poin utamanya masih skor.

Contoh:

Memasukkan:

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  

Keluaran:

4 - $250,000  
3 - $7  
2 - $3  
Total Winnings: $250,010 
Gaffi
sumber
5
Bisakah Anda mengulangi peraturan lotre di sini? Saya pikir pertanyaan harus mandiri. Dan juga saya tidak dapat mengakses situs perjudian dari tempat kerja.
ugoren
1
Tentu ... menambahkan di atas dalam satu menit!
Gaffi
Bukankah Jackpot memisahkan antara semua tiket yang menang?
Berhenti menghidupkan counterclockwis
@leftaroundtentang Tetap.
Gaffi
Tidak ... saya menang ....
Steve Robbins

Jawaban:

3

Python, 239 karakter

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

Dengan asumsi nomor input dipisahkan koma.

hallvabo
sumber
Terima kasih untuk ide matematika 1e4
:,
Apakah baris baru dihitung dengan python? bagaimana dengan indentasi?
Joel Cornett
Ya, keduanya penting. Baris baru dihitung sebagai masing-masing 1 karakter. Lekukan dapat diminimalkan dengan menyisipkan spasi dan tab: level 1 = <spasi>, level 2 = <tab>, level 3 = <tab> <spasi> dll.
hallvabo
2

VBA ( 660 535 Karakter)

Dengan asumsi pembatas adalah spasi ( " ") ...

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
sumber
Saya dapat mengurangi ukuran secara signifikan dengan mengonversikannya Select CasemenjadiChoose()
Gaffi
Trik hebat! sudah bertahun-tahun sejak saya mendengar Choose()... Ini adalah hal yang bagus untuk dikirim ke codegolf.stackexchange.com/questions/5175/…
Cristian
@ w0lf Bukan ide yang buruk!
Gaffi
Anda dapat kehilangan beberapa karakter dengan mengganti baris kedua hingga terakhir dengan Debug.?r& "Total Winnings:" &Format(q,"$#,##0")dan menghapus spasi putih dalam gabungan
Taylor Scott
Oh dan setiap kali Anda memiliki For i=1 To 5atau seperti lingkaran yang dapat dikondensasikan keFor 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")

Mungkin bisa menjatuhkan beberapa karakter dari itu: D

Ed James
sumber
Saya melihat itu sebagai 499 karakter (dengan argumen di akhir versi baris tunggal Anda) ... Apakah saya kehilangan sesuatu?
Gaffi
@ Gaffi Ya, itu menarik ... Saya membungkusnya dalam sebuah fungsi dan "toString (). Length" ed, dan mendapat 517, tetapi hitungan char langsung masuk pada 499 ... Terima kasih telah menunjukkan itu!
Ed James