Chấm điểm Briscola


11

Giới thiệu

Briscola là một trong những trò chơi bài phổ biến nhất của Ý. Đây là một trò chơi đánh bài lừa, như Bridge. Briscola nổi tiếng với hệ thống điểm kỳ quái. Trong thử thách này, được đưa ra hai thẻ, bạn sẽ xuất ra liệu thẻ thứ nhất ghi được nhiều hơn, ít hơn hoặc cùng số điểm như thứ hai trong hệ thống điểm của Briscola.

Thử thách

Briscola được chơi với một bộ bài chơi Ý. Có bốn mươi thẻ trong một cỗ bài, 1-10 trong mỗi bốn bộ quần áo: cốc, kiếm, gậy và tiền xu. Chúng tôi sẽ bỏ qua các bộ quần áo cho thử thách này. Thẻ 2 - 7 là thẻ số và thẻ 8, 9 và 10 là thẻ mặt. Xếp hạng của các thẻ, từ cao nhất đến thấp nhất, là:

 +------------------------+-------------+
 |     Cards, by Rank     | Point Value |
 +------------------------+-------------+
 | Ace (1)                |     11      |
 | Three (3)              |     10      |
 | King (10)              |      4      |
 | Knight (9)             |      3      |
 | Jack (8)               |      2      |
 | Numeric Cards (2, 4-7) |      0      |
 +------------------------+-------------+

Cảm ơn Orphevs cho chiếc bàn đẹp! :)

Nhiệm vụ của bạn là tạo ra một chương trình hoặc chức năng đầy đủ chấp nhận hai số 1-10 đại diện cho thứ hạng thẻ và xuất ra (hoặc trả về) cho dù giá trị điểm của thẻ đầu tiên lớn hơn, nhỏ hơn hoặc bằng giá trị điểm của thẻ thứ hai. Ghi chú bổ sung:

  • Chương trình của bạn có thể xuất ba giá trị bất kỳ để biểu thị nhỏ hơn, lớn hơn và bằng, tuy nhiên, nó phải xuất cùng một giá trị cho mỗi điều kiện mỗi lần.
  • Chương trình của bạn có thể sử dụng bất kỳ mặc định IO nào .
  • Sơ hở tiêu chuẩn là không được phép.
  • Hoặc là một chức năng đầy đủ hoặc một chương trình được cho phép.
  • Câu hỏi này là , vì vậy, số byte thấp nhất sẽ thắng.

  • Dưới đây là một số mẫu đầu vào và đầu ra:

     1, 4 => nhiều hơn (ace đạt 11 điểm, 4 điểm 0 điểm, thứ nhất là hơn thứ hai.
     8, 3 => nhỏ hơn (8 điểm 2, 3 điểm 10, lần đầu tiên ít hơn lần thứ hai.
     5, 2 => bằng nhau (5 và 2 cả hai điểm 0)

Nếu bạn có bất kỳ câu hỏi nào, đừng ngần ngại hỏi. Chúc may mắn!


1
Tôi luôn nghĩ rằng Primiera của Scopa kỳ quái hơn;)
FryAmTheEggman

@FryAmTheEggman bạn nói đúng, tôi đã thay đổi nó. Ngoài ra, bạn có thể có một điểm về primiera ...;)
Amphibological

Chúng ta có thể lấy một mảng với hai giá trị làm đầu vào không?
digEmAll

1
@digEmA sẽ chắc chắn điều.
Lưỡng cư

Không phải là kỳ quái. Điểm rất giống nhau tồn tại trên các trò chơi thẻ Sueca và Bisca của Bồ Đào Nha!
sergiol

Câu trả lời:


2

Thạch , 12 11 byte

“®µ½¤¢‘iⱮIṠ

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

Đầu ra 0cho bằng nhau, -1cho lớn hơn và 1ít hơn. Sử dụng chỉ mục trang mã “®µ½¤¢‘để đánh giá [8, 9, 10, 3, 1].

Đưa đầu vào như một cặp thẻ. Sử dụng 1,2làm ví dụ.

“®µ½¤¢‘iⱮIṠ
“®µ½¤¢‘       [8,9,10,3,1]
       i      index of 
        Ɱ     each element in the input -> 5,0
         I    Finds the forward difference: 0-5 = -5.
          Ṡ   Sign -> -1.
                When ranks are equal, Ṡ returns 0 and when the rank of the second
                card is higher, Ṡ returns 1.

1
Không khó chịu, nhưng ai có thể hạ thấp giải thích tại sao?
dylnan

Trong trường hợp đó là một downvote tình cờ - và giả sử rằng nó đã xảy ra sau lần chỉnh sửa cuối cùng - tôi khuyên bạn nên thực hiện cập nhật giả cho bài đăng để nó có thể được hoàn tác khi / nếu downvoter nhận ra rằng đã xảy ra sự cố.
Arnauld

5

MATL , 12 byte

[DEXIl]&mdZS

Đầu vào là một mảng gồm hai số. Đầu ra là -1, 01tương ứng cho nhiều hơn , bằng hoặc nhỏ hơn .

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

Giải trình

Hãy xem xét đầu vào [1 4]là một ví dụ.

[DEXIl]    % Push [8 9 10 3 1]
           % STACK: [8 9 10 3 1] 
&m         % Implicit input. Index (1-based) of membership, 0 if not member
           % STACK: [5 0]
d          % Consecutive difference
           % STACK: -5
ZS         % Sign. Implicit display
           % STACK: -1

5

JavaScript (ES6), 42 byte

Có hai cấp bậc trong cú pháp currying (a)(b). Trả về 1 cho nhiều hơn , -1 cho ít hơn hoặc 0 cho bằng nhau .

a=>b=>Math.sign((s="05040000123")[a]-s[b])

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


Sử dụng công thức, 48 byte

Điều này chắc chắn dài hơn so với sử dụng bảng tra cứu nhưng cũng thú vị hơn một chút.

Định dạng I / O giống nhau.

a=>b=>Math.sign((g=n=>(1<<n&1802)*6%13)(a)-g(b))

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

Làm sao?

0n

p=2n and (21+23+28+29+210)
p=2n and 1802
  n (card)   | 2**n | AND 1802
-------------+------+----------
  1 (Ace)    |    2 |      2
  2          |    4 |      0
  3 (Three)  |    8 |      8
  4          |   16 |      0
  5          |   32 |      0
  6          |   64 |      0
  7          |  128 |      0
  8 (Jack)   |  256 |    256
  9 (Knight) |  512 |    512
 10 (King)   | 1024 |   1024

Bây giờ chúng tôi muốn chuyển đổi các giá trị khác không còn lại theo cách mà chúng có thể được sắp xếp theo đúng thứ tự. Chúng tôi sử dụng:

q=6pmod13
    p (card)   |   6p | MOD 13
---------------+------+--------
    2 (Ace)    |   12 |   12
    8 (Three)  |   48 |    9
  256 (Jack)   | 1536 |    2     --> Ace > Three > King > Knight > Jack
  512 (Knight) | 3072 |    4
 1024 (King)   | 6144 |    8

Đã có thảo luận meta về phương pháp này bằng cách sử dụng các tham số curried? Về mặt kỹ thuật, điều này không phù hợp với thử thách này, bởi vì chức năng bạn đã viết trả về một chức năng chứ không phải câu trả lời.
Sparr


3

Japt , 25 21 16 byte

  • 1 => nhiều hơn
  • -1 => ít hơn
  • 0 => bằng

£"78920"bXÉÃr- g

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


Bạn có thể sử dụng -gcờ để lưu 2 byte.
Shaggy

Tôi có một giải pháp 13 byte (cũng sử dụng -gcờ, nếu bạn muốn thử cho nó).
Shaggy

@Shaggy Tôi không nói rằng việc tiết kiệm hai byte, các bài nộp được gắn cờ chỉ là các giải pháp ngôn ngữ riêng biệt và không được tính là các giải pháp Japt thuần túy.
Nit

Nếu bạn không muốn sử dụng cờ thì giải pháp tôi đã đề cập ở trên trở thành 15 byte. (Gợi ý: nó sử dụng [8,9,10,3,1]chuyển đổi mảng và cơ sở)
Shaggy

3

Japt -g , 13 byte

Đầu ra -1cho >, 1cho <0cho ===.

m!b#ù991ìD)rn

Hãy thử hoặc chạy nhiều thử nghiệm (Dòng thứ hai sao chép chức năng của -gcờ để cho phép các cờ được sử dụng để xử lý nhiều đầu vào)


Giải trình

                   :Implicit input of 2 integer array
m                  :Map
   #ù991           :  249991
        ìD         :  Convert to array of base-13 digits = [8,9,10,3,1]
 !b                :  Get the index of the current element in that
          )        :End map
           rn      :Reduce by subtraction
                   :Implicitly output the sign of the result

2

R , 35 byte

rank(c(6,0,5,1:4*0,1:3)[scan()])[1]

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

  • -6 Byte nhờ đề xuất @JayCe để chuyển sang chương trình đầy đủ thay vì chức năng

Chương trình trả về 2cho 'greater than', 1cho 'less than', 1.5cho'equal'

Giải trình :

      c(6,0,5,1:4*0,1:3)[v]          # extract the score of each card in v (got from scan());
                                     # cards in v are used as indexes in the cards rank 
                                     # vector, which is based on briscola scores vector 
                                     # c(11,0,10,0,0,0,0,2,3,4) but divided by 2 and rounded 
                                     # to integer preserving the original order

rank(                      )[1]      # rank returns : c(1,  2)   if v[1] < v[2]
                                     #                c(2,  1)   if v[1] > v[2]
                                     #                c(1.5,1.5) if v[1] == v[2]
                                     # and we select the first value

1
rank(c(6,0,5,1:4*0,1:3)[scan()])[1](chương trình đầy đủ) sẽ giúp bạn tiết kiệm 6 byte
JayCe

@JayCe: vâng tôi nhận thấy điều đó, nhưng tôi vẫn bối rối về sự cần thiết phải thêm cat () khi đó là một chương trình đầy đủ ... dù sao, đã cập nhật mã của tôi;)
digEmAll 20/07/18

2

Java 8, 69 66 byte

a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))

Lambda lấy tham số theo cú pháp currying, cổng câu trả lời JavaScript của Arnauld .

Lợi nhuận 0.0 tương đương , 1.0cho lớn hơn , và -1.0cho ít hơn . Hãy thử trực tuyến tại đây .

Cảm ơn Kevin Cruijssen vì đã chơi golf 3 byte.


1
Bạn có thể lưu 3 byte bằng cách thực hiện trả lại trực tiếp với hai lần "05040000123".charAt(...)thay vì mảng số nguyên:a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))
Kevin Cruijssen

2

MarioLANG , 578 548 530 byte

 )                    <
 ====================="
                   >-[!)
                   "==#)
                >-[!)) )
                "==#=) +
         >-----[!))) + +
         "======#==  + +
     >--[!)))   ++++              -(- <
     "===#===================    ====="
  >-[!)))+++++                    >) [!)+:
; "==#=======================     "===#===
>[!                      )))[!((>[!)[!):
"=#==========================#====#==#===
!;((                         <       >)-:
#============================"       "===

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

Giải trình:

  • Đầu tiên, lâu đài lớn đọc số thẻ làm đầu vào và tính giá trị điểm tương đương của nó cho đến khi đọc số 0(không có đầu vào). Điều này cho rằng sẽ chỉ có hai giá trị dương hoàn toàn làm đầu vào.
  • Lưu ý rằng tôi thực sự không đặt các giá trị điểm thích hợp khi chúng không cần thiết, tôi chỉ đặt giá trị điểm là một số giữa [1-5]để giúp tính toán thẻ nào có giá trị điểm cao nhất.
  • Lâu đài thứ hai, nhỏ chỉ so sánh hai giá trị điểm được tính toán.
  • Nó trả về 1nếu giá trị điểm thứ nhất lớn hơn giá trị thứ hai, -1nếu giá trị điểm thứ hai lớn hơn giá trị điểm thứ nhất và 0nếu các giá trị điểm giống nhau.


1

C (gcc) , 57 byte

Trả về [-1..1] thông thường cho <, = và>, tương ứng.

char*s="-FAEAAAABCD";f(a,b){a=s[a];b=s[b];b=(a>b)-(a<b);}

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


Đề xuất *s=L"...thay vì char*s="...a=(s[a]>s[b])-(s[a]<s[b])thay vìa=s[a];b=s[b];b=(a>b)-(a<b)
trần mèo

1

05AB1E , 14 byte

ε78920S>sk}`.S

Trả về 1, -1hoặc 0cho nhiều hơn; ít hơn; hoặc bằng nhau tương ứng.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

ε              # Loop over the input-array
 78920S>       #  Convert 78920 to a list of digits, and increase each by 1,
               #  resulting in [8,9,10,3,1]
        sk     #  Index this list with the input-number (-1 if not found)
               #   i.e. [1,4] → [4,-1]
          }    # Stop the loop
`              # Put all items of the now mapped list separated onto the stack
 .S            # Take the signum (1 if a>b; -1 if a<b; 0 if a==b)
               #  i.e. 4 and -1 → 1

1

PHP , 51 45 byte

<?=($m=_5040000123)[$argv[1]]<=>$m[$argv[2]];

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

Để chạy nó:

php -n <filename> <card1> <card2>

Thí dụ:

php -n briscola_score.php 3 1

Lưu ý: Mã này sử dụng toán tử tàu vũ trụ của PHP 7 . Vì vậy, nó sẽ không hoạt động trên bất kỳ phiên bản PHP nào trước 7.


Đầu ra:

  • 1 = nhiều hơn ( card1 > card2)
  • 0 = bằng ( card1 == card2)
  • -1 = nhỏ hơn ( card1 < card2)

Làm sao?

Giống như cách tiếp cận được sử dụng trong nhiều câu trả lời khác, nhưng trong PHP. Tạo bản đồ giá trị cho thẻ và so sánh các giá trị thẻ từ nó. Vị trí của giá trị trong bản đồ giống như số thẻ.


0

Javascript ES2016 +, 73 ký tự

Không phải là ngắn nhất, nhưng tôi hy vọng thú vị do toán học và tràn :)

(x,y)=>Math.sign((x&8?x:(16-(x**40|0)%7)^16)-(y&8?y:(16-(y**40|0)%7)^16))

Và phiên bản khác với 74 ký tự, thật không may:

(x,y)=>eval('(x>y)-(x<y)'.replace(/\w/g,'($&&8?$&:(16-($&**40|0)%7)^16)'))

Kiểm tra

Mở bảng điều khiển trình duyệt trước khi chạy

f=(x,y)=>Math.sign((x&8?x:(16-(x**40|0)%7)^16)-(y&8?y:(16-(y**40|0)%7)^16))
console.table(Array(11).fill().map((x,i)=>Array(11).fill().map((x,j)=>f(i,j))))

ảnh chụp màn hình

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.