ゴルフ(6枚)ゴルフ!


10

ゴルフゴルフ!

初挑戦なので優しくしてください!課題は、カードゲーム「ゴルフ」のレイアウトの正しいスコアを出力するプログラムを作成することです。

カードゲームゴルフには多くのバリエーションがあります。私が使用するハウスルールは、パガットが提供する6カードゴルフの標準ルールに従いますが、わずかに1つ違いがあります。ここでもすでに同様の課題がありますが、カードの向きを考慮する必要があるため、これはより興味深いと思います。

各プレーヤーには、2x3のレイアウトのカードがあります。各ラウンドの終わりまでに、すべてのカードが表向きになり、次のように採点されます。

  • 各エースは1ポイントを数えます。
  • 2カウントごとに2ポイントを差し引きます。
  • 3から10までの各数字カードは額面をスコアリングします。
  • 各ジャックまたはクイーンは10ポイントを獲得します。
  • 各キングの得点は0です。
  • 同じ列の等しいカードのペアは、列のゼロ点を獲得します(等しいカードが2の場合でも)。
  • 同じ行の3つの等しいカードのセットは、その行のゼロポイントを獲得します(等しいカードが2の場合でも)。

入力

入力は、任意の種類の文字列または配列です。

出力

ゴルフハンドのスコアを表す整数。

これらの例では表記法を使用してA23456789TJQKいますが、回答でその表記法を使用する必要はありません。

Layout
AK3
J23

Score
9
-----------------------    
Layout
25Q
25J

Score
20
-----------------------        
Layout
T82
T8A

Score
-1
-----------------------        
Layout
QQQ
234

Score
5
-----------------------        
Layout
TJQ
QTJ

Score
60
-----------------------
Layout
888
382

Score
1
-----------------------
Layout
888
888

Score
0

これはコードゴルフなので、バイトでの最短の答えが勝ちます!


6
最初の例のスコアは9にすべきではありませんか?
ジョナサンアラン

2
素敵な最初の挑戦!わずかな注意として、「(等しいカードが2の場合でも)」の部分は不要であり、このチャレンジでは結果のスコアが他のプレイヤーのスコアと比較されないため、少し混乱します。代わりに、すべて等しい列と行のスコアが、それぞれの列または行にあるカードの個々のスコアをオーバーライドすることを明確にしたい場合があります。
Erik the Outgolfer

1
「...または任意の種類の配列」-コンテンツは文字である必要がありますか(または値と文字のマッピングを回避できますか)?
ジョナサンアラン

@JonathanAllanええと、「これらの例では表記法を使用してA23456789TJQKいますが、回答でその表記法を使用する必要はありません」と書かれています。
Erik the Outgolfer

2
JJJ 2J2->のように、列と行が等しいテストケースを追加することをお勧めし-4ます。
ジョナサンアラン

回答:


5

ゼリー、9バイト

n/aEÐḟẎḞS

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

-1 Jonathan Allanに感謝します。

の形式で入力を受け取ります[[A, B, C], [D, E, F]]。ここでA、... はそれぞれF要素であり、値表します。124567891010.110.202456789TJQK


4

ハスケル107の 103 98バイト

f m=sum[min 10k|r<-m,o<-m,any(/=r!!0)r,(j,x)<-zip o r,j/=x,(k,c)<-zip[-2..]"2 KA 3456789TJQ",c==x]

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

2行しかないという事実を利用します。行を取得する行rと行を二重に反復しoます。それらが同じ行である場合、結果は常に(「列」の一致により)ゼロになるため、異なる行ro参照して参照する2つの反復のみを考慮します。行のエントリが最初のエントリと等しくないかどうかを最初にチェックして、行をゼロにします。行がすべて等しい場合、これはfalseになり、リストは空になり、合計は0になります。それ以外の場合は、この行を他の行と一緒に圧縮し、等しくないペアを繰り返します(これにより、類似する列の等しい列がゼロになります)マナー)。最後に、各ランクをスコアにマップするために、必要に応じて-2パディングをスペースでパディングして、カードランクのリストにインデックスを付けます。私は使用する必要がありますmin 10 ジャックとクイーンのコストを11と12ではなく10にするためにそのインデックスをクランプします。

編集:4バイトを離してくれた@xnorに感謝!本当にクールな数字リテラルの直後に識別子を置くことができるとは知りませんでした!

EDIT2:さらに5バイトありがとう@xnorに感謝します!そのような行を反復する素晴らしいアイデア


1
素敵な解決策!2つの小さな最適化:の後のスペースは不要で、10を省略し@(a:_)て代わりにを書き込む方が短いr!!0ですa
xnor

1
もう1つの考え:a%aand b%bはゼロなので、このようなf行のペアを繰り返し処理することで直接定義できるように見えます。
XNOR

3

チャコール、50バイト

F²⊞υS≔⁰ζF⭆υΦι∧⊙ι¬⁼λν⊙υ¬⁼λ§νμ≡ι2≧⁻²ζA≦⊕ζKω≧⁺∨ΣιχζIζ

オンラインでお試しください!リンクはコードの詳細バージョンです。説明:

F²⊞υS

レイアウトを配列に読み込みます。

≔⁰ζ

スコアをゼロに初期化します。

F⭆υΦι∧⊙ι¬⁼λν⊙υ¬⁼λ§νμ

入力をフィルタリングして、その行または列のすべての文字と等しい文字を削除します。

≡ι

残りの各キャラクターを切り替えます。

2≧⁻²ζ

2スコア-2

A≦⊕ζ

Aスコア1。(1を示すために使用された場合、これらの4バイトは削除される可能性がありますが1、IMHOは入力形式の乱用です。)

何もしないK

≧⁺∨Σιχζ

それ以外の場合、数字はその値をスコアリングし、他の文字はスコアをスコアリングし10ます。

Iζ

暗黙の印刷のために合計を文字列にキャストします。


2

J39 28バイト

[:+/@,]<.@*]+:&(1=#@~.)"1/|:

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

入力エンコーディングのアイデアは、Erik the OutgolferとJonathan Allenの功績によるものです。

説明

非常に「J」なソリューション。例を挙げて説明します...

入力を取りましょう:

AK3
J23

そしてこのエンコーディングを適用します:

┌─┬──┬─┬─┬─┬─┬─┬─┬─┬──┬────┬────┬─┐
│A│2 │3│4│5│6│7│8│9│T │J   │Q   │K│
├─┼──┼─┼─┼─┼─┼─┼─┼─┼──┼────┼────┼─┤
│1│_2│3│4│5│6│7│8│9│10│10.1│10.2│0│
└─┴──┴─┴─┴─┴─┴─┴─┴─┴──┴────┴────┴─┘

生成されるもの:

   1  0 3
10.1 _2 3

ソリューションの最初の部分を見て、始めに詳細を省いてみましょう。

] (...)"1/ |:

これは、入力]とその転置|:を取り、乗算の代わりに動詞を括弧内に適用することを除いて、すべての組み合わせの「乗算表」を作成することを示しています。ランク"1指定子は、両方の引数から行のすべての組み合わせを取得することを保証しますが、転置の行は元の行列の列であるため、これは、行と列のすべての組み合わせを取得することを意味します。つまり、次のようにします。

  Rows                            Cols
┌─────────┐                     ┌──────┐
│1 0 3    │                     │1 10.1│
├─────────┤  "times" table      ├──────┤
│10.1 _2 3│                     │0 _2  │
└─────────┘                     ├──────┤
                                │3 3   │
                                └──────┘

which produces:

┌───────────────────────┬─────────────────────┬────────────────────┐
│┌─────┬────┬──────┐    │┌─────┬────┬────┐    │┌─────┬────┬───┐    │
││1 0 3│verb│1 10.1│    ││1 0 3│verb│0 _2│    ││1 0 3│verb│3 3│    │
│└─────┴────┴──────┘    │└─────┴────┴────┘    │└─────┴────┴───┘    │
├───────────────────────┼─────────────────────┼────────────────────┤
│┌─────────┬────┬──────┐│┌─────────┬────┬────┐│┌─────────┬────┬───┐│
││10.1 _2 3│verb│1 10.1│││10.1 _2 3│verb│0 _2│││10.1 _2 3│verb│3 3││
│└─────────┴────┴──────┘│└─────────┴────┴────┘│└─────────┴────┴───┘│
└───────────────────────┴─────────────────────┴────────────────────┘

ここで、verbこれらのコンボのそれぞれに適用され+:&(1=#@~.)ます。この動詞は、「いずれかの引数が単一の繰り返し項目で構成される」場合はfalseを返し、それ以外の場合はtrueを返します。これは、nubまたはuniqを受け取り~.、その長さが1かどうかを尋ね1=#、結果のnorを受け取ることによって行われ+:ます。

つまり、これは、入力マトリックスと同じ形状のブールマスクを返しますが、すべての等しいアイテムの行または列のアイテムにはゼロが含まれます。

1 1 0
1 1 0

これで、このマスクによって元の行列を単純にマルチリップし、フロアを取得します ]<.@*

1   0 0
10 _2 0

次に、その結​​果を平坦化して合計します。 +/@,

9

2

JavaScript(ES6)、 97 95  93バイト

3文字の2つの配列の配列として入力を受け取ります。

a=>a.map((r,i)=>r.map((c,j)=>t-=c!=a[i^1][j]&r!=c+[,c,c]?{K:[],2:2,A:-1}[c]||-c||~9:0),t=0)|t

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

コメントしました

a =>                        // a[] = input
  a.map((r, i) =>           // for each row r[] at position i:
    r.map((c, j) =>         //   for each card c at position j in r[]:
      t -=                  //     update t:
        c != a[i ^ 1][j] &  //       if c is not equal to the sibling card in the other row
        r != c + [, c, c] ? //       and r is not made of 3 times the same card:
          { K: [],          //         add 0 point for a King (but [] is truthy)
            2: 2,           //         subtract 2 points for a Two
            A: -1           //         add 1 point for an Ace
          }[c]              //
          || -c             //         or add the face value
          || ~9             //         or add 10 points (Jack or Queen)
        :                   //       else:
          0                 //         add nothing
    ),                      //   end of inner map()
    t = 0                   //   start with t = 0
  ) | t                     // end of outer map; return t


0

PHP145109バイト

A23456789TJQK入力にデフォルトのコーディングを使用し、良好な結果が得られなかった後、他の回答と同様にこのコーディングの使用に切り替えました。

A |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |  T |    J |    Q | K
1 | -2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 10.1 | 10.2 | 0

入力は、次の形式の2次元配列です[[1,0,3],[10.1,-2,3]]。基本的に、各カードの行(minおよびを使用max)と列をチェックして、等しい値が含まれていないことを確認してから、カードの値を合計スコアに追加し、最後に合計スコアの整数部分を出力します。

function($a){for(;$x++<2;)for($i=3;$i--;)min($r=$a[$x-1])-max($r)&&$r[$i]-$a[$x%2][$i]&&$s+=$r[$i];echo$s^0;}

オンラインでお試しください! (注:PHPのTIOは、間違ったバージョンのアップグレードのため、現時点では壊れていますが、正常に戻るはずです)


0

Python 3、79バイト

lambda d:sum([({*a}!={x}!={y})*int(x)for a,b in(d,d[::-1])for x,y in zip(a,b)])

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

124567891010.110.20


Python 3、118バイト

より読みやすい入力形式

lambda d:sum([({*a}!={x}!={y})*[10,10,10,1,0,-2,int(x,36)]['TJQAK2'.find(x)]for a,b in(d,d[::-1])for x,y in zip(a,b)])

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


0

Kotlin、159バイト

Lambdaは1.3456789TJQ0を入力として受け取ります。外側のコードはA23456789TJQKを入力として受け取り、ace、two、およびkingを変換して、数学が計算され、カードとスコアが表示されるようにします。

{d:List<String>->Int
var s=0
for(r in 0..1)for(c in 0..2)if((d[r][0]!=d[r][1]||d[r][1]!=d[r][2])&&d[0][c]!=d[1][c]){
val n=d[r][c]-'0'
s+=if(n>9)
10
else
n}
s}

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

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