Puanlama Briscola


11

Giriş

Briscola , İtalya'nın en popüler kart oyunlarından biridir. Köprü gibi aldatıcı bir kart oyunudur. Briscola tuhaf nokta sistemi ile ünlüdür. Bu meydan okumada, iki kart verildiğinde, birincisinin Briscola'nın puan sistemindeki ikinciyle daha fazla, daha az veya aynı sayıda puan toplayıp kazanmadığını göreceksiniz.

Meydan okuma

Briscola İtalyan iskambil destesi ile oynanır. Bir destede kırk kart, dört takımın her birinde 1-10 vardır: bardaklar, kılıçlar, kulüpler ve madeni paralar. Bu meydan okuma için davaları görmezden geleceğiz. 2 - 7 numaralı kartlar sayısal kartlar, 8, 9 ve 10 numaralı kartlar da yüz kartlarıdır. Kartların en yüksekten en düşüğe doğru sıralaması:

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

Güzel masa için Orphevs'e teşekkürler! :)

Göreviniz, kart sıralarını temsil eden 1-10 arasındaki iki sayıyı kabul eden tam bir program veya işlev oluşturmak ve ilk kartın puan değerinin, ikinci kart. Ek Notlar:

  • Programınız, her seferinde her koşul için aynı değeri vermeli, daha büyük, daha büyük ve eşit olduğunu belirten üç değer çıkarabilir.
  • Programınız IO varsayılanlarını kullanabilir .
  • Standart boşluklara izin verilmez.
  • Tam işleve veya programa izin verilir.
  • Bu soru , bu yüzden en düşük bayt sayısı kazanır.

  • İşte bazı örnek giriş ve çıkışlar:

     1, 4 => daha fazla (ace 11 puan, 4 puan 0 puan, ilk önce ikiden fazla.
     8, 3 => daha az (8 puan 2, 3 puan 10, birincisi ikiden az.
     5, 2 => eşit (5 ve 2'nin ikisi de 0 puan)

Herhangi bir sorunuz varsa, sormaktan çekinmeyin. İyi şanslar!


1
Ben her zaman
Scopa'nın

@FryAmTheEggman haklısın, değiştirdim. Ayrıca, primiera hakkında bir noktanız olabilir…;)
Amfibi II

İki değeri içeren bir diziyi girdi olarak alabilir miyiz?
digEmTüm

1
Tüm emin şeyler.
Amfibolojik

O kadar tuhaf değil. Portekizce Sueca ve Bisca kart oyunlarında çok benzer puanlama var!
sergiol

Yanıtlar:


2

Jöle , 12 11 bayt

“®µ½¤¢‘iⱮIṠ

Çevrimiçi deneyin!

  • Luis Mendo yöntemi kullanılarak -1 bayt .

0Eşit, -1daha büyük ve daha küçük çıktılar 1. Olarak “®µ½¤¢‘değerlendirilen kod sayfası dizinini kullanır [8, 9, 10, 3, 1].

Bir çift kart olarak girdi alır. 1,2Örnek olarak kullanın .

“®µ½¤¢‘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
Rahatsız olmadım, ama kim düştüğünü neden açıklayabilir?
dylnan

Eğer kazara bir iniş vesilesiyle - ve son düzenlemeden sonra meydana geldiğini varsayarsak - iniş vekilinin bir şeylerin yanlış gittiğini fark edip etmediği zaman geri alınabilmesi için yazıya kukla bir güncelleme yapılmasını öneririm.
Arnauld

5

MATL , 12 bayt

[DEXIl]&mdZS

Girdi iki sayılık bir dizidir. Çıktı -1, 0ve 1sırasıyla için birden fazla , e eşit veya daha az .

Çevrimiçi deneyin!

açıklama

Girişi [1 4]örnek olarak ele alalım.

[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 bayt

Sözdiziminde iki aşamayı alır (a)(b). İade 1 için daha fazla , -1 için daha az ya da 0 için eşit .

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

Çevrimiçi deneyin!


Formül kullanarak, 48 bayt

Bu kesinlikle bir arama tablosu kullanmaktan daha uzun ama aynı zamanda biraz daha ilginç.

Aynı G / Ç formatı.

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

Çevrimiçi deneyin!

Nasıl?

0n

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

Şimdi kalan sıfır olmayan değerleri doğru sırada sıralanabilecek şekilde dönüştürmek istiyoruz. Kullanırız:

q=6pşık13
    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 parametreleri kullanarak bu yaklaşım hakkında meta tartışma oldu mu? Teknik olarak bu, bu zorlukla eşleşmez, çünkü yazdığınız işlev bir işlevi değil bir işlevi döndürür.
Sparr


3

Japt , 25 21 16 bayt

  • 1 => daha fazla
  • -1 => daha az
  • 0 => eşit

£"78920"bXÉÃr- g

Çevrimiçi deneyin!


-gBayrağı 2 bayt kaydetmek için kullanabilirsiniz .
Shaggy

Ben 13 bayt çözüm var ( -gdenemek istiyorsanız, aynı zamanda bayrak kullanarak ).
Shaggy

@Shaggy İki bayt tasarruf ettiğini söyleyemem, işaretli gönderimler sadece ayrı dil çözümleri ve saf Japt çözümleri olarak sayılmaz.
Nit

Bir bayrak kullanmak istemiyorsanız, yukarıda bahsettiğim çözüm 15 bayt olur. (İpucu: [8,9,10,3,1]dizi ve taban dönüşümünü kullanır )
Shaggy

3

Japt -g , 13 bayt

-1İçin >, 1için <ve 0için çıkışlar ===.

m!b#ù991ìD)rn

Deneyin veya birden çok test çalıştırın (İkinci satır -g, bayrakların birden fazla girişi işlemek için kullanılmasına izin vermek için bayrağın işlevselliğini çoğaltır )


açıklama

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

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

Çevrimiçi deneyin!

  • @JayCe işlevi yerine tam programa geçme önerisi sayesinde -6 bayt

Program döndürür 2için 'greater than', 1için 'less than', 1.5için'equal'

Açıklama:

      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](tam program) 6 bytes kurtaracak
JayCe

@JayCe: evet fark ettim, ama yine de tam bir program olduğunda cat () eklemenin gerekliliği hakkında kafam karıştı ... neyse, kodumu güncelledi;)
digEmAll

2

Java 8, 69 66 bayt

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

Lambda curried sözdiziminde parametre alarak, Arnauld'un JavaScript cevabının bağlantı noktası .

İade 0.0 eşit , 1.0için Büyüktür ve -1.0için daha az . Burada çevrimiçi deneyin .

Kevin Cruijssen'e 3 bayt golf yaptığı için teşekkürler .


1
"05040000123".charAt(...)Tamsayı dizisi yerine iki kez doğrudan dönüş yaparak 3 bayt kaydedebilirsiniz :a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))
Kevin Cruijssen

2

MarioLANG , 578 548 530 bayt

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

Çevrimiçi deneyin!

Açıklama:

  • Birincisi, büyük kale bir kart numarasını giriş olarak okur ve bir 0(giriş yok) okuyana kadar eşdeğer puan değerini hesaplar . Bu, girdi olarak yalnızca iki kesinlikle pozitif değerin olacağını varsayar.
  • Aslında gerekli olmayan doğru nokta değerlerini ayarlamadığımı, [1-5]hangi kartın en fazla puan değerine sahip olduğunu hesaplamaya yardımcı olmak için aradaki bir sayı olarak nokta değeri olarak ayarladığımı unutmayın .
  • İkincisi, küçük kale sadece hesaplanan iki nokta değerini karşılaştırır.
  • 1İlk nokta değeri -1ikinci değerden büyükse, ikinci nokta değeri ilk değerden büyükse ve 0nokta değerleri aynı ise geri döner .


1

C (gcc) , 57 bayt

Sırasıyla <, = ve> için olağan [-1..1] değerini döndürür.

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

Çevrimiçi deneyin!


Öner *s=L"...yerine char*s="...ve a=(s[a]>s[b])-(s[a]<s[b])yerinea=s[a];b=s[b];b=(a>b)-(a<b)
ceilingcat

1

05AB1E , 14 bayt

ε78920S>sk}`.S

İade 1, -1ya 0daha uzun süre; daha az; veya eşittir.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

ε              # 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 bayt

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

Çevrimiçi deneyin!

Çalıştırmak için:

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

Misal:

php -n briscola_score.php 3 1

Not: Bu kod PHP 7'nin uzay gemisi operatörünü kullanır . Bu yüzden 7'den önce herhangi bir PHP sürümünde çalışmaz.


Çıktı:

  • 1 = daha fazla (card1 > card2 )
  • 0 = eşit (card1 == card2 )
  • -1 = ( card1 < card2) değerinden daha az

Nasıl?

Diğer birçok cevapta kullanılan yaklaşımla aynıdır, ancak PHP'de. Kartlar için bir değer haritası oluşturur ve kart değerlerini karttan karşılaştırır. Haritadaki değerin konumu kart numarasıyla aynıdır.


0

Javascript ES2016 +, 73 karakter

En kısa değil, ama umarım matematik ve taşma nedeniyle ilginç :)

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

Ve 74 karakterli diğer versiyon maalesef:

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

Ölçek

Çalıştırmadan önce tarayıcı konsolunu aç

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

ekran görüntüsü

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.