Golf (6 thẻ) Golf!


10

Golf Golf!

Đây là thử thách đầu tiên của tôi, vì vậy hãy nhẹ nhàng! Thách thức là viết một chương trình sẽ đưa ra số điểm chính xác cho bố cục trong trò chơi bài "Golf".

Trò chơi bài Golf có nhiều biến thể. Các quy tắc nhà tôi sử dụng tuân theo các quy tắc tiêu chuẩn cho Six-Card Golf do Pagat đưa ra, với một chút khác biệt. Đã có một thử thách tương tự ở đây nhưng tôi nghĩ rằng điều này thú vị hơn bởi vì nó đòi hỏi bạn phải tính đến sự định hướng của các thẻ.

Mỗi người chơi có bố trí 2x3 thẻ. Đến cuối mỗi vòng, tất cả các thẻ được lật úp và ghi điểm như sau:

  • Mỗi ace tính 1 điểm.
  • Mỗi hai tính trừ hai điểm.
  • Mỗi thẻ số từ 3 đến 10 điểm mệnh giá.
  • Mỗi Jack hoặc Queen đạt 10 điểm.
  • Mỗi vị vua không có điểm nào.
  • Một cặp thẻ bằng nhau trong cùng một cột ghi điểm 0 cho cột (ngay cả khi các thẻ bằng nhau là twos).
  • Một bộ ba thẻ bằng nhau trong cùng một hàng sẽ ghi điểm 0 cho hàng (ngay cả khi các thẻ bằng nhau là twos).

Đầu vào

Đầu vào có thể là một chuỗi hoặc mảng của bất kỳ loại nào.

Đầu ra

Một số nguyên biểu thị số điểm của tay Golf.

Ví dụ

Những ví dụ này sử dụng ký hiệu A23456789TJQKnhưng bạn không cần sử dụng ký hiệu đó trong câu trả lời của mình.

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

Đây là mã golf, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!


6
Không phải là ví dụ đầu tiên điểm 9?
Jonathan Allan

2
Thử thách đầu tiên tốt đẹp! Xin lưu ý một chút, các phần "(ngay cả khi các thẻ bằng nhau là twos)" là không cần thiết và hơi khó hiểu trong thử thách này, vì điểm số kết quả không được so sánh với điểm của người chơi khác. Thay vào đó, bạn có thể muốn làm rõ rằng điểm số của cột và hàng bằng nhau sẽ ghi đè lên điểm số riêng của các thẻ trong cột hoặc hàng tương ứng của chúng.
Erik the Outgolfer

1
"... Hoặc mảng dưới bất kỳ hình thức nào" - nội dung phải là ký tự (hoặc chúng ta có thể phá vỡ ánh xạ của các ký tự thành giá trị) không?
Jonathan Allan

@Jonathan ALLan Hừm, nó có ghi "Những ví dụ này sử dụng ký hiệu A23456789TJQKnhưng bạn không cần sử dụng ký hiệu đó trong câu trả lời của mình."
Erik the Outgolfer

2
Tôi khuyên bạn nên thêm một trường hợp thử nghiệm với một cột VÀ một hàng bằng nhau, như JJJ 2J2-> -4.
Jonathan Allan

Câu trả lời:



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]

Hãy thử trực tuyến!

Lợi dụng thực tế là chỉ có hai hàng. Chúng tôi lặp lại gấp đôi trên các hàng lấy một hàng rvà một hàng o. Khi chúng ở cùng một hàng, kết quả sẽ luôn bằng 0 (do "cột" khớp nhau) vì vậy chúng tôi sẽ chỉ xem xét hai lần lặp trong đó rotham chiếu đến các hàng riêng biệt. Tôi loại bỏ các hàng bằng cách kiểm tra đầu tiên xem có mục nào trong hàng không bằng mục đầu tiên không. Nếu tất cả các hàng bằng nhau thì điều này sẽ là sai và danh sách sẽ trống, với tổng bằng 0. Nếu không, tôi nén hàng này với hàng khác và lặp lại trên các cặp không bằng nhau (điều này thay đổi các cột bằng nhau trong một cột tương tự cách thức). Cuối cùng, tôi lập chỉ mục một danh sách các cấp bậc thẻ bắt đầu bằng -2 đệm với các khoảng trống cần thiết để ánh xạ từng cấp bậc theo điểm số của nó. Tôi chỉ phải sử dụngmin 10 để kẹp chỉ số đó để làm cho jack cắm và kiến ​​trúc có giá 10 thay vì 11 và 12.

EDIT: cảm ơn @xnor vì đã gỡ 4 byte! Tôi không biết bạn có thể đặt số nhận dạng trực tiếp sau số chữ thật tuyệt!

EDIT2: Một lần nữa xin cảm ơn @xnor vì đã có thêm 5 byte! Ý tưởng tuyệt vời để lặp đi lặp lại trên các hàng như thế


1
Giải pháp tốt đẹp! Hai tối ưu hóa nhỏ hơn: bạn không cần không gian sau đó 10, và nó ngắn hơn để bỏ qua @(a:_)và thay vào đó viết r!!0cho a.
xnor

1
Một suy nghĩ khác: vì a%ab%bbằng không, có vẻ như bạn có thể định nghĩa ftrực tiếp bằng cách lặp qua các cặp dòng như thế này .
xnor

3

Than , 50 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

F²⊞υS

Đọc bố cục thành một mảng.

≔⁰ζ

Khởi tạo điểm số bằng không.

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

Lọc trên đầu vào, loại bỏ các ký tự bằng tất cả các ký tự trong hàng hoặc cột của nó.

≡ι

Chuyển qua từng nhân vật còn lại.

2≧⁻²ζ

2điểm số -2.

A≦⊕ζ

Ađiểm số 1. (4 byte này có thể bị xóa nếu 1được sử dụng để biểu thị 1, nhưng IMHO đó là lạm dụng định dạng đầu vào.)

Không làm gì cho K.

≧⁺∨Σιχζ

Nếu không, các chữ số ghi giá trị của chúng và các chữ cái khác điểm 10.

Iζ

Truyền tổng thành chuỗi cho in ấn ngầm.


2

J , 39 28 byte

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

Hãy thử trực tuyến!

Tín dụng cho Erik the Outgolfer và Jonathan Allen cho ý tưởng mã hóa đầu vào.

giải trình

Một giải pháp rất "J". Tôi sẽ giải thích bằng ví dụ ...

Hãy lấy đầu vào:

AK3
J23

và áp dụng mã hóa này:

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

sản xuất:

   1  0 3
10.1 _2 3

Chúng ta hãy xem phần đầu tiên của giải pháp, bắt đầu một số chi tiết để bắt đầu:

] (...)"1/ |:

Điều này nói rằng lấy đầu vào ]và chuyển vị của nó |:và tạo một "bảng nhân" của tất cả các kết hợp, ngoại trừ thay vì nhân, chúng tôi sẽ áp dụng động từ trong ngoặc đơn. Trình "1xác định thứ hạng đảm bảo rằng chúng ta lấy tất cả các kết hợp các hàng từ cả hai đối số, nhưng vì các hàng của chuyển vị là các cột của ma trận gốc, điều này có nghĩa là chúng ta sẽ thực hiện tất cả các kết hợp các hàng và cột. Đó là, chúng tôi sẽ làm:

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

Bây giờ, verbchúng tôi áp dụng cho mỗi combo này +:&(1=#@~.)và động từ này trả về false nếu "một trong hai đối số bao gồm một mục lặp lại" và ngược lại. Nó thực hiện điều này bằng cách lấy nub, hoặc uniq ~., hỏi xem độ dài của nó có phải là một 1=#hay không và lấy kết quả cũng không +:.

Nghĩa là, điều này sẽ trả về một mặt nạ boolean có hình dạng giống như ma trận đầu vào, nhưng với các số không cho bất kỳ mục nào trong một hàng hoặc cột của tất cả các mục bằng nhau.

1 1 0
1 1 0

Bây giờ chúng ta chỉ cần thay đổi ma trận ban đầu bằng mặt nạ này và lấy sàn ]<.@*:

1   0 0
10 _2 0

và sau đó làm phẳng và tổng hợp kết quả của điều đó: +/@,

9

2

JavaScript (ES6),  97 95  93 byte

Lấy đầu vào là một mảng gồm 2 mảng gồm 3 ký tự.

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

Hãy thử trực tuyến!

Đã bình luận

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

PHP , 145 109 byte

Sau khi sử dụng A23456789TJQKmã hóa mặc định cho đầu vào và không thu được kết quả tốt, tôi chuyển sang sử dụng mã hóa này tương tự như các câu trả lời khác:

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

Đầu vào là một mảng hai chiều trong định dạng này : [[1,0,3],[10.1,-2,3]]. Về cơ bản kiểm tra hàng (sử dụng minmax) và cột cho mỗi thẻ để không chứa các giá trị bằng nhau và sau đó thêm giá trị thẻ vào tổng số điểm và ở cuối in phần nguyên của tổng số điểm.

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

Hãy thử trực tuyến! (Lưu ý: Hiện tại TIO cho PHP đã bị hỏng, do nâng cấp phiên bản sai, nhưng sẽ quay lại OK)


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

Hãy thử trực tuyến!

Sử dụng định dạng đầu vào giống như một số câu trả lời, giá trị khác 1,-2,3,4,5,6,7,số 8,9,10,10.1,10.2,0 cho các thẻ.


Con trăn 3 , 118 byte

Định dạng đầu vào dễ đọc hơn

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

Hãy thử trực tuyến!


0

Kotlin , 159 byte

Lambda lấy 1.3456789TJQ0 làm đầu vào. Mã bên ngoài lấy A23456789TJQK làm đầu vào, chuyển đổi ace, hai và king để toán học hoạt động, và hiển thị các thẻ & điểm số.

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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.