Golf (6-kartu) Golf!

10

Golf golf!

Ini adalah tantangan pertama saya, jadi harap lembut! Tantangannya adalah untuk menulis program yang akan menghasilkan skor yang benar untuk tata letak dalam permainan kartu "Golf."

Permainan kartu Golf memiliki banyak variasi. Aturan rumah yang saya gunakan mengikuti aturan standar untuk Six-Card Golf yang diberikan oleh Pagat, dengan satu perbedaan kecil. Sudah ada tantangan serupa di sini, tetapi saya pikir yang ini lebih menarik karena mengharuskan Anda untuk mempertimbangkan orientasi kartu.

Setiap pemain memiliki tata letak kartu 2x3. Pada akhir setiap putaran semua kartu menghadap ke atas dan diberi skor sebagai berikut:

  • Setiap ace menghitung 1 poin.
  • Masing-masing dua jumlah dikurangi dua poin.
  • Setiap kartu angka dari 3 hingga 10 nilai nominal.
  • Setiap Jack atau Queen mencetak 10 poin.
  • Setiap Raja mencetak poin nol.
  • Sepasang kartu yang sama dalam kolom yang sama mencetak poin nol untuk kolom (bahkan jika kartu yang sama berpasangan).
  • Seperangkat tiga kartu yang sama dalam baris yang sama skor poin nol untuk baris (bahkan jika kartu yang sama adalah dua).

Memasukkan

Input dapat berupa string atau larik apa pun.

Keluaran

Integer mewakili skor tangan Golf.

Contohnya

Contoh-contoh ini menggunakan notasi A23456789TJQKtetapi Anda tidak perlu menggunakan notasi itu dalam jawaban Anda.

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

Ini kode golf, jadi jawaban tersingkat dalam byte menang!

qdread
sumber
6
Bukankah seharusnya contoh pertama skor 9?
Jonathan Allan
2
Tantangan pertama yang bagus! Sebagai catatan kecil, bagian "(bahkan jika kartu yang sama berpasangan)" tidak diperlukan dan sedikit membingungkan dalam tantangan ini, karena skor yang dihasilkan tidak dibandingkan dengan skor pemain lain. Sebagai gantinya, Anda mungkin ingin mengklarifikasi bahwa nilai kolom dan baris semua-sama menimpa skor individu kartu di masing-masing kolom atau baris.
Erik the Outgolfer
1
"... atau larik apa pun" - haruskah konten menjadi karakter (atau bisakah kita menghindari pemetaan karakter ke nilai)?
Jonathan Allan
@ JonathanAllan Hm, katanya, "Contoh-contoh ini menggunakan notasi A23456789TJQKtetapi Anda tidak perlu menggunakan notasi itu dalam jawaban Anda."
Erik the Outgolfer
2
Saya sarankan menambahkan test case dengan kolom DAN baris sama, seperti JJJ 2J2-> -4.
Jonathan Allan

Jawaban:

5

Jelly , 9 byte

n/aEÐḟẎḞS

Cobalah online!

-1 terima kasih kepada Jonathan Allan .

[[A, B, C], [D, E, F]]AF(1,-2,3,4,5,6,7,8,9,10,10.1,10.2,0)SEBUAH,2,3,4,5,6,7,8,9,T,J,Q,K

Erik the Outgolfer
sumber
4

Haskell , 107 103 98 byte

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]

Cobalah online!

Mengambil keuntungan dari kenyataan hanya ada dua baris. Kami menggandakan iterate atas baris mengambil satu baris rdan satu baris o. Ketika mereka berada di baris yang sama hasilnya akan selalu nol (karena pencocokan "kolom") jadi kami hanya akan mempertimbangkan dua iterasi di mana rdan omerujuk ke baris yang berbeda. Saya nol baris dengan terlebih dahulu memeriksa apakah ada entri di baris tidak sama dengan yang pertama. Jika semua baris sama, ini akan salah dan daftar ini akan kosong, dengan jumlah 0. Kalau tidak, saya zip baris ini dengan yang lain dan beralih ke pasangan yang tidak sama (ini nol kolom yang sama di sama cara). Akhirnya saya mengindeks daftar peringkat kartu yang dimulai dengan -2 padding dengan spasi yang diperlukan untuk memetakan setiap peringkat ke nilainya. Saya hanya harus menggunakanmin 10 untuk menjepit indeks itu untuk membuat jack dan ratu berharga 10 daripada 11 dan 12.

EDIT: terima kasih kepada @xnor karena telah melepas 4 byte! Saya tidak tahu Anda bisa meletakkan pengidentifikasi langsung setelah literal angka yang benar-benar keren!

EDIT2: Sekali lagi terima kasih kepada @xnor untuk 5 byte lainnya! Ide bagus untuk beralih pada baris seperti itu

pengguna1472751
sumber
1
Solusi bagus! Dua optimisasi yang lebih kecil: Anda tidak perlu spasi setelahnya 10, dan lebih pendek untuk menghilangkan @(a:_)dan bukannya menulis r!!0untuk a.
xnor
1
Pikiran lain: karena a%adan b%bnol, sepertinya Anda dapat menentukan fsecara langsung dengan mengulangi beberapa baris seperti ini .
xnor
3

Arang , 50 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

F²⊞υS

Baca tata letak menjadi array.

≔⁰ζ

Inisialisasi skor menjadi nol.

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

Saring pada input, hapus karakter yang sama dengan semua karakter di baris atau kolomnya.

≡ι

Ganti setiap karakter yang tersisa.

2≧⁻²ζ

2skor -2.

A≦⊕ζ

Askor 1. (4 byte ini dapat dihapus jika 1digunakan untuk menunjukkan 1, tapi IMHO itu penyalahgunaan format input.)

Jangan lakukan apa pun untuk K.

≧⁺∨Σιχζ

Jika tidak, angka akan mendapatkan nilainya dan huruf lainnya akan mendapat nilai 10.

Iζ

Keluarkan jumlah ke string untuk cetakan implisit.

Neil
sumber
2

J , 39 28 byte

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

Cobalah online!

Penghargaan untuk Erik the Outgolfer dan Jonathan Allen untuk ide input encoding.

penjelasan

Solusi yang sangat "J". Saya akan menjelaskan dengan contoh ...

Mari kita masukan:

AK3
J23

dan terapkan pengodean ini:

┌─┬──┬─┬─┬─┬─┬─┬─┬─┬──┬────┬────┬─┐
│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│
└─┴──┴─┴─┴─┴─┴─┴─┴─┴──┴────┴────┴─┘

yang menghasilkan:

   1  0 3
10.1 _2 3

Mari kita lihat bagian pertama dari solusinya, pilih beberapa detail untuk memulai:

] (...)"1/ |:

Kata ini, ambil input ]dan transposnya, |:lalu buat "tabel perkalian" dari semua kombinasi, kecuali alih-alih perkalian, kita akan menggunakan kata kerja dalam tanda kurung. Penentu peringkat "1memastikan bahwa kita mengambil semua kombinasi baris dari kedua argumen, tetapi karena baris transpos adalah kolom dari matriks asli, ini berarti kita akan mengambil semua kombinasi baris dan kolom. Artinya, kami akan melakukan:

  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││
│└─────────┴────┴──────┘│└─────────┴────┴────┘│└─────────┴────┴───┘│
└───────────────────────┴─────────────────────┴────────────────────┘

Sekarang verbkita berlaku untuk masing-masing kombo ini +:&(1=#@~.)dan kata kerja ini mengembalikan false jika "salah satu argumen terdiri dari satu item berulang" dan benar sebaliknya. Ini melakukan ini dengan mengambil nub, atau uniq ~., menanyakan apakah panjangnya satu 1=#, dan mengambil hasil juga+: .

Artinya, ini akan mengembalikan topeng boolean dengan bentuk yang sama dengan matriks input, tetapi dengan nol untuk setiap item dalam baris atau kolom dari semua item yang sama.

1 1 0
1 1 0

Sekarang kita cukup menggandakan matriks asli oleh topeng ini dan mengambil lantai ]<.@*:

1   0 0
10 _2 0

dan kemudian ratakan dan jumlah hasil itu: +/@,

9
Jonah
sumber
2

JavaScript (ES6),  97 95  93 byte

Mengambil input sebagai larik 2 array 3 karakter.

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

Cobalah online!

Berkomentar

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
Arnauld
sumber
0

Japt , 22 byte

c xÈf *YgUïUÕ me_â Ê>1

Cobalah

Perwujudan Ketidaktahuan
sumber
0

PHP , 145 109 byte

Setelah menggunakan A23456789TJQKpengkodean default untuk input dan tidak mendapatkan hasil yang baik, saya beralih menggunakan pengkodean ini mirip dengan jawaban lain:

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

Input adalah array dua dimensi dalam format ini: [[1,0,3],[10.1,-2,3]]. Pada dasarnya memeriksa baris (menggunakan mindan max) dan kolom untuk setiap kartu untuk tidak mengandung nilai yang sama dan kemudian menambahkan nilai kartu ke skor total dan pada akhirnya mencetak bagian bilangan bulat dari skor total.

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;}

Cobalah online! (Catatan: TIO untuk PHP rusak saat ini, karena peningkatan versi yang salah, tetapi harus kembali OK)

Night2
sumber
0

Python 3 , 79 byte

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

Cobalah online!

Menggunakan format input yang sama dengan beberapa jawaban dan nilai lainnya 1,-2,3,4,5,6,7,8,9,10,10.1,10.2,0 untuk kartu.


Python 3 , 118 byte

Format input lebih mudah dibaca

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)])

Cobalah online!

ovs
sumber
0

Kotlin , 159 byte

Lambda mengambil 1,3456789TJQ0 sebagai input. Kode luar mengambil A23456789TJQK sebagai input, mengubah kartu as, dua, dan raja sehingga matematika berhasil, dan menampilkan kartu & skor.

{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}

Cobalah online!

JohnWells
sumber