Mencetak Briscola


11

pengantar

Briscola adalah salah satu permainan kartu paling populer di Italia. Ini adalah permainan kartu pengambilan trik, seperti Bridge. Briscola terkenal dengan sistem poin anehnya. Dalam tantangan ini, diberikan dua kartu, Anda akan menampilkan apakah yang pertama skor lebih banyak, lebih sedikit, atau jumlah poin yang sama dengan yang kedua dalam sistem poin Briscola.

Tantangan

Briscola dimainkan dengan setumpuk kartu remi Italia. Ada empat puluh kartu di dalam geladak, 1-10 di masing-masing dari empat kartu: piala, pedang, tongkat, dan koin. Kami akan mengabaikan jas untuk tantangan ini. Kartu 2 - 7 adalah kartu numerik, dan kartu 8, 9, dan 10 adalah kartu wajah. Peringkat kartu, dari tertinggi ke terendah, adalah:

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

Terima kasih kepada Orphevs untuk meja yang bagus! :)

Tugas Anda adalah membuat program atau fungsi lengkap yang menerima dua angka 1-10 yang mewakili peringkat kartu, dan menghasilkan (atau mengembalikan) apakah nilai poin kartu pertama lebih besar dari, lebih kecil dari, atau sama dengan nilai poin dari kartu. kartu kedua. Catatan tambahan:

  • Program Anda dapat menampilkan tiga nilai untuk menunjukkan kurang dari, lebih besar dari, dan sama dengan, namun, harus menghasilkan nilai yang sama untuk setiap kondisi setiap kali.
  • Program Anda dapat menggunakan standar IO apa pun .
  • Celah standar tidak diijinkan.
  • Baik fungsi penuh atau program diizinkan.
  • Pertanyaan ini adalah , sehingga byte-count terendah menang.

  • Berikut beberapa contoh input dan output:

     1, 4 => lebih dari (ace skor 11 poin, 4 skor 0 poin, pertama lebih dari kedua.
     8, 3 => kurang dari (8 skor 2, 3 skor 10, pertama kurang dari kedua.
     5, 2 => sama (5 dan 2 keduanya skor 0)

Jika Anda memiliki pertanyaan, jangan ragu untuk bertanya. Semoga berhasil!


1
Saya selalu berpikir primiera Scopa lebih aneh;)
FryAmTheEggman

@FryAmTheEggman Anda benar, saya sudah mengubahnya. Juga, Anda mungkin ada benarnya tentang primiera ...;)
Amfibologis

Bisakah kita mengambil array dengan dua nilai sebagai input?
digEmAll

1
@digEmSemua hal yang pasti.
Amfibologis

Bukannya aneh. Skor yang sangat mirip ada pada permainan kartu Sueca dan Bisca Portugis!
sergiol

Jawaban:


2

Jelly , 12 11 byte

“®µ½¤¢‘iⱮIṠ

Cobalah online!

  • -1 byte dengan menggunakan metode Luis Mendo .

Outputs 0sama, -1lebih besar dari dan 1kurang dari. Menggunakan indeks halaman kode “®µ½¤¢‘yang dievaluasi menjadi [8, 9, 10, 3, 1].

Mengambil input sebagai sepasang kartu. Gunakan 1,2sebagai contoh.

“®µ½¤¢‘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
Tidak kesal, tetapi bisakah orang yang undur diri menjelaskan mengapa?
dylnan

Dalam kasus itu adalah downvote yang tidak disengaja - dan dengan asumsi bahwa itu terjadi setelah edit terakhir - saya sarankan untuk melakukan pembaruan dummy ke posting sehingga dapat dibatalkan ketika / jika downvoter menyadari bahwa ada masalah.
Arnauld

5

MATL , 12 byte

[DEXIl]&mdZS

Input adalah array dari dua angka. Output adalah -1, 0dan 1masing-masing lebih dari , sama dengan atau kurang dari .

Cobalah online!

Penjelasan

Pertimbangkan input [1 4]sebagai contoh.

[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

Membawa dua peringkat dalam sintaks currying (a)(b). Mengembalikan 1 untuk lebih dari , -1 untuk kurang dari atau 0 untuk sama .

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

Cobalah online!


Menggunakan rumus, 48 ​​byte

Ini jelas lebih lama daripada menggunakan tabel pencarian tetapi juga sedikit lebih menarik.

Format I / O yang sama.

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

Cobalah online!

Bagaimana?

0n

hal=2n dan (21+23+28+29+210)
hal=2n dan 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

Kami sekarang ingin mengubah nilai-nilai non-nol yang tersisa sedemikian rupa sehingga mereka dapat diurutkan dalam urutan yang benar. Kita gunakan:

q=6halmod13
    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

Apakah ada diskusi meta tentang pendekatan ini menggunakan parameter curried? Secara teknis ini tidak cocok dengan tantangan ini, karena fungsi yang Anda tulis mengembalikan fungsi, bukan jawaban.
Sparr


3

Japt , 25 21 16 byte

  • 1 => lebih dari
  • -1 => kurang dari
  • 0 => sama

£"78920"bXÉÃr- g

Cobalah online!


Anda dapat menggunakan -gbendera untuk menyimpan 2 byte.
Shaggy

Saya punya solusi 13 byte (juga menggunakan -gflag, jika Anda ingin mencobanya).
Shaggy

@ Shaggy Saya tidak akan mengatakan itu menyimpan dua byte, pengiriman yang ditandai hanya solusi bahasa terpisah dan tidak dihitung sebagai solusi Japt murni.
Nit

Jika Anda tidak ingin menggunakan flag maka solusi yang saya sebutkan di atas menjadi 15 byte. (Petunjuk: ini menggunakan [8,9,10,3,1]konversi array dan basis)
Shaggy

3

Japt -g , 13 byte

Output -1untuk >, 1untuk <dan 0untuk ===.

m!b#ù991ìD)rn

Cobalah atau jalankan beberapa tes (Baris kedua mereplikasi fungsi -gflag untuk memungkinkan flag digunakan untuk memproses beberapa input)


Penjelasan

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

Cobalah online!

  • -6 Bytes berkat saran @JayCe untuk beralih ke program lengkap, bukan fungsi

Program kembali 2untuk 'greater than', 1untuk 'less than',1.5 untuk'equal'

Penjelasan:

      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](program lengkap) akan menghemat 6 byte
JayCe

@JayCe: ya saya perhatikan itu, tapi saya masih bingung tentang perlunya menambahkan cat () ketika itu adalah program lengkap ... tetap, perbarui kode saya;)
digEmAll

2

Java 8, 69 66 byte

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

Lambda mengambil parameter dalam sintaks currying, port dari jawaban JavaScript Arnauld .

Pengembalian 0.0 sama , 1.0untuk lebih besar dari , dan -1.0untuk kurang dari . Cobalah online sini .

Terima kasih kepada Kevin Cruijssen untuk bermain golf 3 byte.


1
Anda dapat menyimpan 3 byte dengan melakukan pengembalian langsung dengan dua kali "05040000123".charAt(...)alih-alih integer-array:a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))
Kevin Cruijssen

2

MarioLANG , 578 548 530 byte

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

Cobalah online!

Penjelasan:

  • Pertama, kastil besar membaca nomor kartu sebagai input dan menghitung nilai poin ekuivalennya hingga membaca 0(tidak ada input). Ini mengandaikan bahwa hanya akan ada dua nilai yang benar-benar positif sebagai input.
  • Perhatikan bahwa saya tidak benar-benar menetapkan nilai titik yang tepat karena tidak diperlukan, saya hanya menetapkan sebagai nilai titik antara angka [1-5] untuk membantu menghitung kartu mana yang memiliki nilai poin terbanyak.
  • Yang kedua, kastil kecil hanya membandingkan dua nilai titik yang dihitung.
  • Ini mengembalikan 1jika nilai titik pertama lebih besar dari yang kedua, -1jika nilai titik kedua lebih besar dari yang pertama, dan 0jika nilai titik sama.


1

C (gcc) , 57 byte

Mengembalikan [-1..1] yang biasa untuk masing-masing <, = dan>.

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

Cobalah online!


Sarankan *s=L"...alih-alih char*s="...dan a=(s[a]>s[b])-(s[a]<s[b])bukannyaa=s[a];b=s[b];b=(a>b)-(a<b)
ceilingcat

1

05AB1E , 14 byte

ε78920S>sk}`.S

Pengembalian 1,, -1atau 0lebih dari; kurang dari; atau sama dengan masing-masing.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

ε              # 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]];

Cobalah online!

Untuk menjalankannya:

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

Contoh:

php -n briscola_score.php 3 1

Catatan: Kode ini menggunakan operator pesawat ruang angkasa PHP 7 . Jadi itu tidak akan berfungsi pada versi PHP apa pun sebelum 7.


Keluaran:

  • 1 = lebih dari (card1 > card2 )
  • 0 = sama (card1 == card2 )
  • -1 = kurang dari ( card1 < card2)

Bagaimana?

Sama seperti pendekatan yang digunakan dalam banyak jawaban lain, tetapi dalam PHP. Membuat peta nilai untuk kartu dan membandingkan nilai kartu dari itu. Posisi nilai di peta sama dengan nomor kartu.


0

Javascript ES2016 +, 73 karakter

Bukan yang terpendek, tapi saya harap menarik karena matematika dan melimpah :)

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

Dan versi lainnya dengan 74 karakter, sayangnya:

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

Uji

Buka konsol browser sebelum dijalankan

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

tangkapan layar

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.