サイコロ10,000ロールを評価する


18

前書き

サイコロ10,000は、6つのサイコロと何か書くことでプレイできるサイコロゲームです。プレイヤーはサイコロを1ターンに複数回転がし、最後にスコアを獲得します。最初に10,000ポイントに達したプレーヤーがゲームに勝ちます。1つのロールのスコアを計算することは、この課題におけるあなたの仕事です。完全なルールについては
こちらご覧ください
ゲームは広く知られているため、ルール(特にスコアリング)は地域によって異なることに注意してください。以下で説明するルールを使用します。

チャレンジ

サイコロを表す1から6までの6つの数字のリストが与えられたら、それらのスコアを出力します。スコアは次の方法で計算されます。

  • 100ポイントを数える
  • Fivesは50ポイントを数えます
  • トリプレットはその数に100ポイントを掛けます。たとえば、3つの2は200ポイントを与えます。例外は、1000ポイントをカウントする3つの例外です。
  • 同じ数の6つは、上記の2つのトリプレットのようにカウントされます。したがって、6 3は600ポイントを与えます。同じことはエッジケースにも当てはまります:6つは2,000ポイントです。
  • 1つのダイを複数回使用することはできません。ダイスがトリプレットの一部である場合、他のスコアリングにはカウントされません。トリプレットのファイブは、500ポイントに加えて50ポイントをカウントしません
  • スコアを最大化するために、トリプルが常に最初にカウントされます。したがって、スリーファイブは150ポイントとしてカウントされません。4つのファイブは1つのトリプレットと1つの通常のファイブとしてカウントされ、550ポイントを獲得します。

ノート

  • 入力には常に1〜6の6つの数字が含まれます。無効な入力は受け取りません。
  • 番号は任意の順序にすることができます。特定の順序を想定することはできません。

ルール

  • 入力形式は、前処理されていない限り自由です。
  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

テストケース

[1、2、3、4、5、6]-> 150
[1、1、1、2、3、5]-> 1050
[1、1、1、1、1、1]-> 2000
[2、2、2、2、2、2]-> 400
[6、6、1、5、5、6]-> 800
[2、3、4、6、2、4]-> 0
[1、5、1、5、1、5]-> 1500
[5、5、5、5、2、3]-> 550
[1、1、1、1、1、5]-> 1250
[3、3、4、4、3、4]-> 700

11
また、dieダイスの単数形です。
mbomb007

5
@ThreeFx「サイコロ」はまだ間違っています。参照してくださいenglish.stackexchange.com/a/167107/125966
mbomb007

3
@ mbomb007は、参照してくださいこれを
ThreeFx

4
@ mbomb007ドイツ語では単数形と複数形で同じですが、なぜ英語はそれほど複雑なのですか?:Pしかし、とにかく感謝、ダイは実際に良い音:)
デンカー

9
@DenkerAffeああ、それは「Der dice」、「Die dice」、または「Das dice」ですか?
デイブ

回答:


6

05AB1E34 31 30バイト

7G¹N¢O3‰N*2LRN1Q+°*X5‚Nå_i¨}OO

説明

7G                                  # for N in 1..6
  ¹N¢O                              # count number of occurrences of N in input
      3‰                            # divmod 3
        N*                          # multiply by N
          2LRN1Q+°*                 # multiply by 10, 100 or 1000
                   X5‚Nå_i¨}        # if N is not 1 or 5, scrap the singles
                            OO      # sum all triple and single scores so far
                                    # implicitly display total sum

オンラインで試す


4

パイソン2、152の 148 125バイト

非常にシンプルなソリューション。もっとゴルフができます。L.count少し長いですが、Lが更新されているため、最初の呼び出しを削除できませんでした。

def f(L):s=n=0;exec"n+=1\nwhile L.count(n)>2:s+=[n*100,1e3][n<2];exec'L.remove(n);'*3\n"*6;C=L.count;print s+100*C(1)+50*C(5)

オンラインで試す -(すべてのテストケース)

ゴルフをしていない:

def f(L,s=0):
    L.sort()
    for n in range(1,7):
        while L.count(n)>2:
            s+=n*100*((n<2)*9+1) # multiply by 10 if n==1
            i=L.index(n)
            L=L[:i]+L[i+3:]
    s+=100*L.count(1)+50*L.count(5)
    print s

@Copperのいくつかのゴルフクレジット、彼のコードのヒントを使用


4

PowerShellのV2 + V3 +、147の 144 137 133バイト

$n=$args[0]|sort;while($n){if(($x=$n[0])-eq$n[2]){$s+=100*$x+900*($x-eq1);$a,$b,$n=$n}else{$s+=50*($x-in1,5)+50*($x-eq1)}$a,$n=$n};$s

144を消すと、144のように見えますか?

入力を受け取り$args[0]sortそれをに保存し$nます。その後、whileまだ要素が残っているので、if/ を評価しelseます。

最初の要素($xいくつかのバイトを保存するために一時的に保存される)が3番目の要素と一致する場合、トリプルがあります。上に追加$sいくつかの乗算のUM結果100*$xプラスブールベースの900場合にのみ$xである-eqUALがします1。これにより1000、3つの要件が満たされます。次に、最初の2つの要素を$a、およびに剥がし$b、残りをに$n削除します。トリプルの3番目の要素の削除は後で処理されます。

それ以外の場合、トリプルはない$sため、別のブールベースの加算の結果をumに追加します。私たちは、追加50場合$xのいずれかである1か、5他に追加し、50それはだ場合-eqにUAL 1。このセクションでは、-inオペレーターにv3 +が必要になりました。

いずれの場合も、まだ削除する要素が残っているため、最初の要素を剥がし$aて残りをに残し$nます。

最後に、ループが完了したら$s、パイプラインに配置します。出力は、Write-Output実行の終了時に暗黙的です。

テストケース

PS C:\Tools\Scripts\golfing> (1,2,3,4,5,6),(1,1,1,2,3,5),(1,1,1,1,1,1),(2,2,2,2,2,2),(6,6,1,5,5,6),(2,3,4,6,2,4),(1,5,1,5,1,5),(5,5,5,5,2,3),(1,1,1,1,1,5),(3,3,4,4,3,4)|%{($_-join',')+" -> "+(.\evaluate-dice-1000.ps1 $_)}
1,2,3,4,5,6 -> 150
1,1,1,2,3,5 -> 1050
1,1,1,1,1,1 -> 2000
2,2,2,2,2,2 -> 400
6,6,1,5,5,6 -> 800
2,3,4,6,2,4 -> 0
1,5,1,5,1,5 -> 1500
5,5,5,5,2,3 -> 550
1,1,1,1,1,5 -> 1250
3,3,4,4,3,4 -> 700

re:「取り消し線144」:取り消し線を太字にすると、より明確になります。
Stackstuck

3

JavaScript(ES6)、87 86バイト

a=>a.sort().join``.replace(/(.)\1\1|1|5/g,s=>r+=s>>7?s/1.11:s>5?1e3:s>1?50:100,r=0)&&r

入力を並べ替えて文字列化し、regexpを使用してスコアの組み合わせを識別できるようにします。編集:@Arnauldのおかげで1バイト保存されました。


s>>7代わりのs>111最初のバージョンで1つのバイトを節約する
アルノー

3

Python 2または3 123 122 121 116 109108104102100 97バイト

Python 2、97バイト

lambda r:100*sum(c/3*((v<2)*9+v)+c%3*(v<2or(v==5)/2.)for v,c in enumerate(map(r.count,range(7))))

テストケースはイデオンにあります

Python 3、97バイト

lambda r:100*sum(c//3*((v<2)*9+v)+c%3*(v<2or(v==5)/2)for v,c in enumerate(map(r.count,range(7))))

3

Ruby、80 78バイト

オンラインでお試しください!

@ezrastから-2バイト。

->d{s=0;7.times{|i|c=d.count i;i<2&&i=10;s+=c>2?c/3*i*100:1>i%5?c%3*i*10:0};s}

1
これにより、SyntaxErrorが生成されます。最初のコロンの後にスペースが必要だと思います。
ヨルダン

@Jordan repl.itで問題なく動作しますが、それでも壊れます... OK、私はそれをもう必要としないようにロジックを再配置しました
Value Ink

i<2&&i=102バイト節約できます。
-ezrast

2

Haskell、130 123バイト

これはHaskellにとって挑戦ではありません。また、私はこれをゴルフしています。

@nimiに感謝します。

import Data.List
f=g.sort
g(x:a@(y:z:b))|x>z=j x+g a|0<1=100*h x+g b
g(x:y)=j x+g a
g _=0
h 1=10
h x=x
j 1=100
j 5=50
j _=0

2

Javascript(ES6)、85 84バイト

x=>x.map(v=>s+=v*(((z+=1<<v*3)>>v*3&7)%3?v-5?v-1?0:10:1:v-5?v-1?10:80:8),s=z=0)|10*s

テストケース:

let F =
x=>x.map(v=>s+=v*(((z+=1<<v*3)>>v*3&7)%3?v-5?v-1?0:10:1:v-5?v-1?10:80:8),s=z=0)|10*s

console.log(F([1, 2, 3, 4, 5, 6])); // 150
console.log(F([1, 1, 1, 2, 3, 5])); // 1050
console.log(F([1, 1, 1, 1, 1, 1])); // 2000
console.log(F([2, 2, 2, 2, 2, 2])); // 400
console.log(F([6, 6, 1, 5, 5, 6])); // 800
console.log(F([2, 3, 4, 6, 2, 4])); // 0
console.log(F([1, 5, 1, 5, 1, 5])); // 1500
console.log(F([5, 5, 5, 5, 2, 3])); // 550
console.log(F([1, 1, 1, 1, 1, 5])); // 1250
console.log(F([3, 3, 4, 4, 3, 4])); // 700


1

Python 3、131バイト

lambda r,C=list.count:sum([x%7*100,1e3][x%7<2]*(C(r,x%7)>2and not exec('r.remove(x%7);'*3))for x in range(14))+50*C(r,5)+100*C(r,1)

これはラムダ式です。使用するには、先頭にを付けて割り当てf=ます。

まず、(モジュラスを使用して)トリプルを2回チェックし、トリプルを削除します。その後、単にカウントを追加します5し、1スコアにして返します。

Ideoneでお試しください!(すべてのテストケースで)

古いPython 2の投稿は次のとおりです。

パイソン2、176の 172 171 145 136 134 133バイト

def e(r):s=x=0;exec'x+=1;a=x%7;\nif r.count(a)>2:exec"r.remove(a);"*3;s+=[a*100,1e3][a<2]\n'*14;C=r.count;s+=50*C(5)+100*C(1);print s

@ mbomb007のおかげでPython 2ソリューションのバイトを節約できました!


print sPythonの2の短い
mbomb007

@ mbomb007ありがとう!私はその中を編集します。

1

BASH(sed + bc)161

sed -re's/([1-6])(.*)\1(.*)\1/\100\2\3/g;s/([1-6])( .*)\1( .*)\1/\100\2\3/g;s/10/1/g; s/1/100/g;s/5( |$)/50 /g;s/[1-6][^0]//g;s/ +/+/g;s/(^\+|\+$)//g;s/^$/0/'|bc

すべてをsedでやりたかったのですが、追加は本当に難しいです...

説明:

  1. 追加、トリプレットを探す00最初の番号にし、他の削除
    などを1 2 1 3 1 4- >100 2 3 4
  2. 2つのトリプルがある場合は、手順1を繰り返します
  3. 交換する101、その後1100
    例えば100- > 10- > 10001- > 1- >100
  4. 各置き換え5が続いていない050
  5. で終わらない番号を削除します 0
  6. スペースのグループを +
  7. 先頭および末尾+のsを削除します
  8. 文字列が空の場合、追加します 0
  9. 最後にパイプしbcてすべてを追加します。

1

Perl、69バイト

+2を含む -ap

STDINの入力で実行します。

dice10000.pl <<< "5 1 1 1 1 1"

dice10000.pl

#!/usr/bin/perl -ap
$_=join 0,sort@F,A;print;s%(10|\d)\1\1|10|5%$n+=$1.0||$&%eg;$_=$n.0

これは、「2 2 2 2 2 2」のような入力のために動作するようには思えない
Xcali

0

C#(.NET Core)228 227バイト

class A{static void Main(string[] a){int[] x=new int[7];int i=0,s=0;for(;i<6;i++)x[int.Parse(a[i])]++;while(i>0){while(x[i]>2){s+=i>1?10*i:100;x[i]-=3;}i--;}while(x[1]-->0)s+=10;while(x[5]-->0)s+=5;System.Console.Write(s*10);}}

オンラインでお試しください!

私はここに多くの、多くの潜在的な最適化を欠けているように感じるが、私はやった最後に10を乗じてバイトに保存します。入力は、個別のコマンドライン引数として渡す必要があります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.