ゴルフスコアラー


25

子供の頃、私はカードゲームゴルフをよくプレイしていました。あなたの挑戦は、あなたがそれを受け入れることを選択した場合、ゴルフのハンドのスコアを計算することです。このカードゲームには9000を超えるバリエーションがあります1ので、プレイした覚えのあるルールに従っていきます。

ゲームのルール)

  • あなたは6枚のカードでラウンドを終了し、できるだけ少ないポイントが必要です。

  • ジョーカーは使用されません。

  • エースと2はそれぞれ-1、-2ポイントの価値があります。

  • ジャックとキングはどちらも0ポイントの価値があります。

  • 3から10のカードは額面価値があります。ただし、これらはペアリングするとキャンセルされます。たとえば、5は5ポイントの価値がありますが、2つの5はゼロの価値があります。3つの5は5ポイントの価値があり(最初の2つはペアリングされますが、3つ目はそうではありません)、4つの5は0の価値があります(2つのペアを作るため)。

  • クイーンズは15ポイントの価値があります。クイーンをキャンセルすることはできません。たとえば、クイーン2人は30ポイントの価値があります。

(チャレンジの)ルール

入力は整数の配列、または6つの個別の整数になります。あなたが好むもの。1はエースを表し、2〜10は2〜10を表し、ジャック、クイーン、キングは11、12、13を表します。出力は、上記のルールに従ったハンドのスコアです。すべての入力が有効であると安全に想定できます。たとえば、4回を超えて数字が表示されず、すべての数字がの範囲にあると仮定できます[1, 13]。入力と出力は任意の合理的な形式にすることができます。

テストIO:

[11, 10, 3, 1, 2, 2]    --> 8
[4, 5, 5, 3, 8, 7]      --> 22
[2, 2, 2, 2, 1, 1]      --> -10 (The lowest score possible)
[12, 12, 12, 12, 10, 9] --> 79 (The highest score possible)
[9, 9, 9, 9, 11, 1]     --> -1
[8, 8, 8, 8, 11, 13]    --> 0
[10, 9, 3, 7, 12, 2]    --> 42
[1, 2, 3, 4, 5, 6]      --> 15
[10, 9, 2, 3, 4, 1]     --> 23
[10, 3, 12, 3, 7, 12]   --> 47

バイト単位の最短回答が勝ちます!


1そうではありませんが、多くのバリエーションがあります。

回答:


3

Pyth、28 27 25バイト

s+*L%/Qd2}3Tm?<d3_d*15q12

オンラインでお試しください。 テストスイート。

説明

  • まず、Pythはいくつかの変数を自動的に追加します。コードは今s+*L%/Qd2}3Tm?<d3_d*15q12dQです。
  • }3Tリストを生成します[3, 4, 5, 6, 7, 8, 9, 10]
  • そのリストの各数値(*L)に、入力のその数値のカウント(/Qd)を法2(%2)で乗算します。結果は、ペアの番号の場合は0、ペアになっていない番号の場合は番号自体です。
  • 入力番号をマッピングします(mQ):
    • 数が3未満の場合(?<d3)、それを否定します(_d)。
    • それ以外の場合はq12d、12()かどうかを確認し、ブール値に15(*15)を掛けます。結果は、クイーンの場合は15、その他の場合は0です。
  • リストを連結します(+)。結果のリストには、ペアになっていない数字(最初の部分)と特別なカードA、2、Q(2番目の部分)のスコアが含まれ、さらにゼロが追加されます。
  • 最後に、結果の合計(s)を取得します。

代替の25バイトソリューション

-+s*L%/Qd2}3T*15/Q12s<#3Q

これは最初のものと同様に機能しますが、クイーンを個別にカウントし、フィルターでエースと2を無効にします。


11

Python 2、72 70バイト

f=lambda x,*T:[x*(-1)**T.count(x),~x%2*15,-x][(x-3)/8]+(T>()and f(*T))

ある時点で、私はPython 0**0 == 0が一度だけ扱われて、私ができるようになりたかった(-condition)**num。のように呼び出しf(11, 10, 3, 1, 2, 2)ます。

以前の72バイトバージョン:

f=lambda x,*T:[~x%2*15,x*(-1)**(x<3or T.count(x))][x<11]+(T>()and f(*T))

5

> <>63 57 56 + 2 = 65 59 58バイト

入力番号は、プログラムの開始時にスタック上にあると予想されるため、-vフラグは+2バイトです。オンラインでお試しください!

</!?lp6$+1g6:
3\0
?\::6g2%*{+}1+:b=
;\~16g-26g2*-c6gf*+n

コードフィールド内の未使用の値はすべてに初期化さ0れるため、値を取得し[value,6]、インクリメントし、コードフィールドに戻すことで、スタックに存在する各値の数を計算するために使用できます。合計は次のように計算されます:

T = 0 + {for x in 3 to 10, x*([x,6]%2)} - [1,6] - 2*[2,6] + 15*[12,6]

編集:入力を再構築し、計算ステップを切り替えることにより、6バイトをオフにしました。前のバージョン:

:6g1+$6pl0=?\
/-*2g62-g610/
c ;n$\
6:b=?/>::6g2%*{+}1+!
\gf*+3/

編集2:Sp3000のおかげで1バイトを保存しました


私はあなたが0=?数回使用または類似していることを見てきました- ?!代わりに使用できますか?
Sp3000

@ Sp3000 Ack、もちろん、あなたは正しい。おかげで、私はそれを追加します
ソク

5

MATL27 26バイト

3:10=s2\7M*G12=15*Gt3<*_vs

入力は列配列です。つまり、値はセミコロンで区切られます。

オンラインでお試しください!または、すべてのテストケースを検証します(これにより、すべての入力を受け取るループが追加Gされ1$0G、最新の入力をプッシュするために置き換えられます)。

説明

3:10=    % Take input implicitly. Compare with range [3 4 ... 10], with broadcast
s        % Sum of each column: how may threes, fours, ... tens there are
2\       % Modulo 2
7M       % Push [3 4 ... 10] again
*        % Element-wise multiply (the sum of this array is the score of 3...10)
G        % Push input again
12=      % Compare with 12, element-wise
15*      % Multiply by 15 (this is the score of 12)
G        % Push input again
t3<      % Duplicate. True for entries 1 or 2
*_       % Multiply and negate (the sum of this array is the score of 1, 2)
v        % Concatenate all stack concents into a vertical array
s        % Sum of array. Implicitly display

4

パイス-37 36 35

これは大きすぎるようですが、FGITWです。

J<#h;K-QS2++*15/K12sm*d%/Jd2{J_s@S2

テストスイート


2
「これは大きすぎるように思えますが、FGITW。」それで最初にゴルフ?

私は自分を終えたまで、私はこれを見ていないが、彼らは使用を除いてほぼ同一JKゴルフをすることができ、完全に不要と思われる、ともあなた+_-;)私は31を得た:+*15/Q12-sm*d%/Qd2{>#2<#11Qs@S2
FryAmTheEggman

1
@FryAmTheEggman 24:+*15/Q12-s*R%/Qd2}3Ts@S2
ジャクベ

3

JavaScript(ES6)、63バイト

a=>a.map(e=>r+=e<3?-e:e>10?e-12?0:15:(m[e]^=1)?e:-e,r=0,m=[])|r

または、必要に応じて、

a=>a.map(e=>r-=e<3?e:e>10?e-12?0:-15:(m[e]^=1)?-e:e,r=0,m=[])|r


0

Perl 5.10.0 + -n115 64 60 56バイト

$p+=$_-12?$_>2?$_<11?++$l[$_]%2?$_:-$_:0:-$_:15}{say$p

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

説明:

-nループを追加する:

# Used variables:
# $_: input (auto)
# $p: points
# $l[n]: number of occurences of n (for 3-10)
while (<>) { # for every input
    $p += $_ - 12 ? # if the input is not 12 (queen) ...
        $_ > 2 ? # then: if it's > 2 (not ace or 2) ...
            $_ < 11 ? # then: if < 11 (3-10) ...
                ++$l[$_] % 2 ? # then: if it's an odd occurence (1st, 3rd, 5th, ...)
                    $_ # add it
                    : -$_ # else subtract it
            : 0 # no points for other stuff (J, K)
        : -$_ # negative points for ace and 2
    : 15 # 15 points for queen
}
{ # after input:
    say $p # output points
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.