宝くじに当選しましたか?


8

私はこの質問への回答を送信し、現在米国で現在行われているMegaMillions宝くじの流行に関するいくつかのニュース記事を見ました。このニュース記事は、個人が運を試すために一度に20,000ドル相当のチケットを購入した(これは20,000 セットの確認用です!)と述べています。

そのため、購入した大量のチケットで、ジャックポットだけでなく賞品を獲得できるかどうかをすばやく判断する方法について考えました。

その場合の課題は次のとおりです。

概要:

引数として数値の文字列を受け入れる関数またはプログラムを作成し(STDIN、または選択したファイルから読み取る)、少なくとも最低支払額が支払われたチケットの数を返します。

コードの詳細:

  • 入力は、購入されたチケットごとに1つずつ、一連​​の行で構成されます。当選番号の先頭には0が付けられ、抽選番号の先頭には1から始まる増分番号が付けられます(例を参照)。
  • 入力は、抽選や当選番号など、毎回完全にランダムな数字のセットである必要があります。
  • 入力は、1 <= n <= 20,000の任意の数のチケットnを受け入れる必要があります。(0チケットが実行されないと仮定します。)
  • 入力の各行には、1行あたり7つの数字があります。1つは上記のプレフィックス用、5つは標準ボール用、もう1つは「マッチ」ボール用です。(以下のロトの詳細を参照)
  • 入力は任意の方法で区切ることができます(空白、セミコロンなど)。
  • 出力は、すべての勝利抽選と勝利額のリストでなければなりません。(それであなたはどちらを提出するか知っています。)
  • 出力リストは、勝ち額順に並べる必要があります。(あるチケットで$ 2を獲得した場合、別のチケットで$ 10,000を獲得した場合、誰が気にしますか?)
  • 複数のチケットが同じ金額を獲得した場合、それらのチケットの順序は関係ありません。
  • 出力には、勝った合計金額のリストも表示されます。

ロトの詳細:

  • MegaMillionsゲームの標準ルールが適用されます。これは、現在非常に暑いためです。
  • ドローは、2つの別々の数字のプールからの6つの数字で構成されます。1から56までの5つの異なる数字と、1から46までの1つの数字(マッチボール)です。
  • ジャックポットは、抽選で6つすべての当選番号を照合することによって獲得されます。
  • ジャックポット以外の賞は以下のように授与されます(下の画像を参照)。

    (メイン)+(マッチ)=(支払い)
    5 + 1 =ジャックポット
    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

  • 現在のジャックポットが$ 1,000,000(100万)であると想定します。

  • あなたのランダム抽選が同じジャックポットを複数回選ぶ引っ張っていない限り、一つだけ大当たりの勝者を想定(あなたが浮気しています?)
  • 乗数/カリフォルニアのルールが機能していないと仮定します。

授与額

チャレンジの詳細:

  • これはコードゴルフなので、最短のコードが勝ちます。
  • 引き分けの場合、私は最も高い投票された答えをとります。これはやや主観的ですが、要点はスコアです。

例:

入力:

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  

出力:

4 - $250,000  
3 - $7  
2 - $3  
Total Winnings: $250,010 

5
ここで抽選ルールを繰り返すことはできますか?質問は自己完結型である必要があると思います。また、職場からギャンブルサイトにアクセスできません。
ugoren

1
承知しました... 1分後に上記を追加します!
Gaffi

ジャックポットは当選したすべてのチケットの間で分割されませんか?
反時計回りを停止

@leftaroundabout修正済み。
Gaffi

いいえ...私は勝ちます...
スティーブ・ロビンス

回答:


3

Python、239文字

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

入力番号がカンマで区切られていると仮定します。


数学のアイデアをありがとう:1e4など(最初から知っていたはずです!)
Gaffi

Pythonでは改行はカウントされますか?インデントはどうですか?
Joel Cornett 2012

はい、どちらも重要です。改行はそれぞれ1文字としてカウントされます。インデントは、スペースとタブを交互に配置することで最小限に抑えることができます。1番目のレベル= <スペース>、2番目のレベル= <タブ>、3番目のレベル= <タブ> <スペース>など
hallvabo

2

VBA(660 535文字)

区切り文字がスペース(" ")であると想定しています...

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

に変換することでサイズを大幅に削減できSelect CaseましたChoose()
Gaffi

素晴らしいトリック!私が聞いたので、それは非常に多くの年をされているChoose()...これはに投稿するために素晴らしい事ですcodegolf.stackexchange.com/questions/5175/...
クリスティアンLupascu

@ w0lf悪くないね!
Gaffi、2012年

最後から2行目を置換してDebug.?r& "Total Winnings:" &Format(q,"$#,##0")空白を削除することで、かなりの数の文字を失う可能性があります
Taylor Scott

ああ、あなたがFor i=1 To 5凝縮できるループを持っているときはいつでもFor I=1To 5
テイラースコット

2

JavaScript、353バイト

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

ゴルフなし:

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

おそらくいくつかの文字をノックすることができます:D


私はそれを499文字(単一行バージョンの最後に引数がある)として表示します...何か不足していますか?
Gaffi

@Gaffiはい、それは面白いです...私はそれを関数にラップして「toString()。length」を付けて517を取得しましたが、ストレート文字数は499に来ました...指摘してくれてありがとう!
Ed James
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.