เกณฑ์การให้คะแนน Briscola


11

บทนำ

Briscolaเป็นหนึ่งในเกมไพ่ยอดนิยมของอิตาลี มันเป็นเกมไพ่ที่เล่นเล่ห์เหลี่ยมเช่น Bridge Briscola เป็นที่รู้จักกันดีสำหรับระบบจุดที่แปลกประหลาด ในความท้าทายนี้เมื่อได้รับไพ่สองใบคุณจะแสดงผลไม่ว่าคะแนนแรกจะเพิ่มขึ้นน้อยลงหรือจำนวนแต้มเท่ากันเป็นอันดับที่สองในระบบคะแนนของ Briscola

ท้าทาย

Briscola เล่นกับสำรับไพ่ของอิตาลี มีไพ่สี่สิบใบในสำรับไพ่ 1-10 ในแต่ละชุดไพ่ทั้งสี่ใบ: ถ้วยดาบสโมสรและเหรียญ เราจะเพิกเฉยต่อความท้าทายนี้ ไพ่ 2 - 7 คือไพ่ที่เป็นตัวเลขและไพ่ 8, 9 และ 10 คือไพ่หน้า อันดับของไพ่จากมากไปน้อยคือ:

 +------------------------+-------------+
 |     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      |
 +------------------------+-------------+

ขอบคุณ Orphevs สำหรับตารางที่ดี! :)

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบซึ่งรับสองตัวเลข 1-10 ที่แสดงถึงลำดับการ์ดและเอาท์พุท (หรือคืน) ว่าค่าจุดของไพ่ใบแรกมากกว่าหรือน้อยกว่าหรือเท่ากับค่าจุดของ บัตรที่สอง หมายเหตุเพิ่มเติม:

  • โปรแกรมของคุณอาจส่งออกสามค่าใด ๆ เพื่อระบุว่าน้อยกว่ามากกว่าและเท่ากับอย่างไรก็ตามมันจะต้องส่งออกค่าเดียวกันสำหรับแต่ละเงื่อนไขในแต่ละครั้ง
  • โปรแกรมของคุณอาจใช้ค่าเริ่มต้น IO
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • อนุญาตให้ใช้ฟังก์ชั่นเต็มรูปแบบหรือโปรแกรมก็ได้
  • คำถามนี้คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ

  • นี่คือตัวอย่างอินพุตและเอาต์พุตตัวอย่าง:

     1, 4 => มากกว่า (ace 11 คะแนน, 4 คะแนน 0 คะแนน, ครั้งแรกมากกว่าวินาที
     8, 3 => น้อยกว่า (8 คะแนน 2, 3 คะแนน 10, อันดับแรกน้อยกว่าวินาที
     5, 2 => เท่ากัน (5 และ 2 ทั้งสองคะแนน 0)

หากคุณมีคำถามใด ๆ อย่าลังเลที่จะถาม โชคดี!


1
ฉันมักจะคิดว่าPrimiera ของ Scopaนั้นแปลกประหลาดกว่า;)
FryAmTheEggman

@FryAmTheEggman คุณพูดถูกฉันเปลี่ยนไปแล้ว นอกจากนี้คุณอาจจะมีประเด็นเกี่ยวกับ primiera ที่ ... ;)
Amphibological

เราสามารถนำอาเรย์ที่มีสองค่าเป็นอินพุตได้หรือไม่?
digEmAll

1
@digEmAll แน่นอน
ครึ่งบกครึ่งน้ำ

ไม่ใช่ว่าแปลก การให้คะแนนที่คล้ายกันมากมีอยู่ในเกมไพ่โปรตุเกส Sueca และ Bisca!
sergiol

คำตอบ:


2

เจลลี่ , 12 11 ไบต์

“®µ½¤¢‘iⱮIṠ

ลองออนไลน์!

  • -1 ไบต์โดยใช้หลุยส์ Mendo ของวิธีการ

เอาต์พุต0สำหรับเท่ากัน-1สำหรับมากกว่าและ1น้อยกว่า ใช้ดัชนีรหัสหน้าซึ่งประเมิน“®µ½¤¢‘[8, 9, 10, 3, 1]

รับอินพุตเป็นการ์ด ใช้1,2เป็นตัวอย่าง

“®µ½¤¢‘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
ไม่รำคาญ แต่ใครก็ตามที่สามารถลงคะแนนอธิบายได้ว่าทำไม
dylnan

ในกรณีที่เป็น downvote โดยไม่ตั้งใจ - และสมมติว่ามันเกิดขึ้นหลังจากการแก้ไขครั้งล่าสุด - ฉันขอแนะนำให้ทำการอัปเดตหุ่นจำลองของโพสต์เพื่อให้สามารถยกเลิกได้เมื่อ / ถ้า downvoter ตระหนักว่ามีบางอย่างผิดปกติ
Arnauld

5

MATLขนาด 12 ไบต์

[DEXIl]&mdZS

อินพุตเป็นอาร์เรย์ของตัวเลขสองตัว เอาท์พุท-1, 0และ1ตามลำดับมากกว่า , เท่ากับหรือน้อยกว่า

ลองออนไลน์!

คำอธิบาย

พิจารณาอินพุต[1 4]เป็นตัวอย่าง

[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 ไบต์

(a)(b)ใช้เวลาสองแถวในไวยากรณ์ currying ผลตอบแทนที่1สำหรับมากกว่า , -1สำหรับน้อยกว่าหรือ0สำหรับเท่ากับ

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

ลองออนไลน์!


ใช้สูตร 48 ไบต์

สิ่งนี้ยาวกว่าการใช้ตารางการค้นหา แต่ก็น่าสนใจกว่าอีกเล็กน้อย

รูปแบบ I / O เดียวกัน

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

ลองออนไลน์!

อย่างไร?

เนื่องจากการ์ดหลายใบมีค่าเป็นเราต้องลบมันออก เมื่อได้อันดับการ์ดเราคำนวณ:n0n

p = 2 n  และ  1802

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

ตอนนี้เราต้องการแปลงค่าที่ไม่เป็นศูนย์ที่เหลือในวิธีที่สามารถเรียงลำดับตามลำดับที่ถูกต้อง เราใช้:

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

มีการอภิปรายเมตาเกี่ยวกับวิธีการนี้โดยใช้พารามิเตอร์ curried หรือไม่? ในทางเทคนิคสิ่งนี้ไม่ตรงกับความท้าทายนี้เพราะฟังก์ชั่นที่คุณเขียนจะส่งคืนฟังก์ชันไม่ใช่คำตอบ
Sparr


3

Japt , 25 21 16 ไบต์

  • 1 => มากกว่า
  • -1 => น้อยกว่า
  • 0 => เท่ากัน

£"78920"bXÉÃr- g

ลองออนไลน์!


คุณสามารถใช้การ-gตั้งค่าสถานะเพื่อบันทึก 2 ไบต์
Shaggy

ฉันมีวิธีการแก้ปัญหา 13 ไบต์ (เช่นใช้-gธงหากคุณต้องการลอง)
Shaggy

@Shaggy ฉันจะไม่บอกว่าประหยัดสองไบต์การส่งที่ถูกตั้งค่าสถานะเป็นเพียงการแก้ปัญหาภาษาแยกต่างหากและไม่นับเป็นโซลูชัน Japt ล้วน ๆ
Nit

หากคุณไม่ต้องการใช้แฟล็กโซลูชันที่ฉันกล่าวถึงข้างต้นจะกลายเป็น 15 ไบต์ (คำแนะนำ: มันใช้การ[8,9,10,3,1]แปลงแบบอาเรย์และเบส)
Shaggy

3

Japt -g , 13 ไบต์

ขาออก-1สำหรับ>, 1สำหรับ<และสำหรับ0===

m!b#ù991ìD)rn

ลองใช้หรือเรียกใช้การทดสอบหลายรายการ (บรรทัดที่สองจำลองการทำงานของ-gแฟล็กเพื่ออนุญาตให้ใช้แฟล็กเพื่อประมวลผลอินพุตจำนวนมาก)


คำอธิบาย

                   :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 ไบต์

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

ลองออนไลน์!

  • -6 Bytes ขอบคุณ @JayCe ข้อเสนอแนะเพื่อเปลี่ยนเป็นโปรแกรมเต็มรูปแบบแทนฟังก์ชั่น

โปรแกรมส่งคืน2สำหรับ'greater than', 1สำหรับ'less than', 1.5สำหรับ'equal'

คำอธิบาย:

      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](โปรแกรมเต็มรูปแบบ) จะช่วยให้คุณประหยัด 6 ไบต์
JayCe

@ JayCe: ใช่ฉันสังเกตเห็นว่า แต่ฉันยังคงสับสนเกี่ยวกับความจำเป็นที่จะต้องเพิ่ม cat () เมื่อมันเป็นโปรแกรมแบบเต็ม ... ต่อไปอัปเดตโค้ดของฉัน;)
digEmAll

2

Java 8, 69 66 ไบต์

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

แลมบ์ดาการพารามิเตอร์ในไวยากรณ์ดีความชอบท่าเรือArnauld JavaScript 's คำตอบ

ผลตอบแทน0.0 เท่ากับ , 1.0สำหรับมากกว่าและ-1.0สำหรับน้อยกว่า ลองออนไลน์ได้ที่นี่

ขอบคุณKevin Cruijssenสำหรับการเล่นกอล์ฟขนาด 3 ไบต์


1
คุณสามารถบันทึก 3 ไบต์โดยทำการส่งคืนโดยตรงโดยใช้สองครั้ง"05040000123".charAt(...)แทนอาร์เรย์จำนวนเต็ม:a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))
Kevin Cruijssen

2

MarioLANG , 578 548 530 bytes

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

ลองออนไลน์!

คำอธิบาย:

  • ปราสาทขนาดใหญ่แรกอ่านหมายเลขบัตรเป็นอินพุตและคำนวณค่าจุดเทียบเท่าจนกว่าจะอ่าน a 0(ไม่มีอินพุต) สิ่งนี้สมมติว่าจะมีเพียงสองค่าบวกอย่างเคร่งครัดเป็นอินพุต
  • โปรดทราบว่าฉันไม่ได้ตั้งค่าจุดที่เหมาะสมตามที่พวกเขาไม่ต้องการฉันแค่ตั้งค่าเป็นจำนวนจุดระหว่าง[1-5]เพื่อช่วยในการคำนวณบัตรที่มีค่าจุดมากที่สุด
  • ปราสาทขนาดเล็กที่สองเพิ่งเปรียบเทียบค่าจุดที่คำนวณได้สองค่า
  • มันจะส่งคืน1ถ้าค่าจุดแรกมากกว่าค่าที่สอง-1ถ้าค่าจุดที่สองมากกว่าค่าแรกและ0ถ้าค่าจุดเหมือนกัน



1

05AB1E , 14 ไบต์

ε78920S>sk}`.S

ผลตอบแทน1, -1หรือ0นานกว่า; น้อยกว่า; หรือเท่ากันตามลำดับ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ε              # 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 ไบต์

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

ลองออนไลน์!

วิธีเรียกใช้:

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

ตัวอย่าง:

php -n briscola_score.php 3 1

หมายเหตุ:รหัสนี้ใช้ประกอบการยานอวกาศ PHP 7 ดังนั้นมันจะไม่ทำงานกับ PHP เวอร์ชันใด ๆ ก่อน 7


เอาท์พุท:

  • 1 = มากกว่า ( card1 > card2)
  • 0 = เท่ากับ ( card1 == card2)
  • -1 = น้อยกว่า ( card1 < card2)

อย่างไร?

เช่นเดียวกับวิธีการที่ใช้ในคำตอบอื่น ๆ อีกมากมาย แต่ใน PHP สร้างแผนที่ค่าสำหรับบัตรและเปรียบเทียบมูลค่าบัตรจากมัน ตำแหน่งของค่าในแผนที่เหมือนกับหมายเลขบัตร


0

Javascript ES2016 +, 73 ตัวอักษร

ไม่ใช่ที่สั้นที่สุด แต่ฉันหวังว่าจะน่าสนใจเนื่องจากคณิตศาสตร์และล้น :)

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

และรุ่นอื่น ๆ ที่มี 74 ตัวอักษรน่าเสียดาย:

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

ทดสอบ

เปิดคอนโซลเบราว์เซอร์ก่อนเรียกใช้

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

ภาพหน้าจอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.