スコアリングブリスコラ


11

前書き

ブリスコラは、イタリアで最も人気のあるカードゲームの1つです。それは、ブリッジのようなトリックをとるカードゲームです。ブリスコラは、その奇妙なポイントシステムで有名です。このチャレンジでは、2枚のカードが与えられた場合、最初のカードのスコアがブリスコラのポイントシステムの2番目のカードより多いか少ないか、同じポイントかを出力します。

チャレンジ

ブリスコラはイタリアのトランプのデッキでプレイされます。デッキには40枚のカードがあり、カップ、剣、クラブ、コインの4つのスーツのそれぞれに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に感謝します!:)

あなたの仕事は、カードランクを表す2つの数字1-10を受け入れ、最初のカードのポイント値が、セカンドカード。その他の注意事項:

  • プログラムは、より小さい、より大きい、等しいを示す3つの値を出力できますが、各条件ごとに同じ値を出力する必要があります。
  • プログラムはIOのデフォルトを使用できます。
  • 標準の抜け穴は許可されていません。
  • 全機能またはプログラムのいずれかが許可されます。
  • この質問はなので、バイト数が最も少なくなります。

  • 入力と出力のサンプルを次に示します。

     1、4 =>以上(エーススコア11ポイント、4スコア0ポイント、最初は2番目以上。
     8、3 =>より小さい(8スコア2、3スコア10、最初は2番目より小さい。
     5、2 =>等しい(5と2は両方ともスコア0)

ご質問がありましたら、お気軽にお尋ねください。幸運を!


1
私はいつもスコパの
プリミエラ

@FryAmTheEggmanあなたは正しいです、私はそれを変更しました。また、あなたは... primieraについてのポイントを有していてもよく;)
Amphibological

入力として2つの値を持つ配列を取ることができますか?
digEmAll

1
@digEmAll確かなこと。
Amphibological

奇妙ではありません。ポルトガルのスエカとビスカのカードゲームにも非常によく似たスコアがあります!
sergiol

回答:


2

ゼリー12 11バイト

“®µ½¤¢‘iⱮIṠ

オンラインでお試しください!

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
いらいらすることはありませんが、誰がその理由を説明できるでしょうか?
ディルナン

それが偶然のダウン投票であった場合-そして、それが最後の編集の後に発生したと仮定して-私はダウンボッターが何かがうまくいかなかったことを認識した場合に元に戻すことができるように投稿のダミー更新を行うことをお勧めします。
アーナルド

5

MATL、12バイト

[DEXIl]&mdZS

入力は2つの数値の配列です。出力され-10そして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バイト

カリー化構文の2つのランクを取ります(a)(b)。戻り値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))

オンラインでお試しください!

どうやって?

0n

p=2n そして 21+23+28+29+210
p=2n そして 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=6pモッド13
    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

カリー化されたパラメーターを使用したこのアプローチについてメタディスカッションがありましたか?技術的には、これはこの課題と一致しません。これは、作成した関数が応答ではなく関数を返すためです。
スパー


3

Japt25 21 16バイト

  • 1 => 以上
  • -1 => より小さい
  • 0 => 等しい

£"78920"bXÉÃr- g

オンラインでお試しください!


-gフラグを使用して2バイトを節約できます。
シャギー

私は13バイトのソリューションを持っています(-gあなたがそれを試してみたいのであれば、フラグも使用しています)。
シャギー

@Shaggy 2バイトの節約とは言いませんが、フラグ付きの提出は単なる言語ソリューションであり、純粋なJaptソリューションとはみなされません。
Nit

フラグを使用したくない場合、上記のソリューションは15バイトになります。(ヒント:[8,9,10,3,1]配列とベース変換を使用)
シャギー

3

Japt -g、13バイト

出力-1のため>1<0===

m!b#ù991ìD)rn

試してみるか複数のテストを実行します(2行目は-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]

オンラインでお試しください!

  • 関数の代わりに完全なプログラムに切り替えるための@JayCeの提案による-6バイト

プログラムは2for 'greater than'1for 'less than'1.5forを返します'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 アンサーの移植版であるカリー化構文でパラメーターを取るLambda 。

戻り値は0.0 等しく1.0のためにより大きい、と-1.0のためのより少ないですこちらからオンラインでお試しください。

3バイトのゴルフをしてくれたKevin Cruijssenに感謝します。


1
あなたは2回との直接リターン行うことによって、3つのバイトを保存することができます"05040000123".charAt(...)代わりに、整数配列のを:a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))
ケビンCruijssen

2

MarioLANG578 548 530バイト

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

オンラインでお試しください!

説明:

  • 最初の大きな城では、カード番号を入力として読み取り、読み取るまで0(入力なし)、同等のポイント値を計算します。これは、入力として厳密に正の値が2つしかないことを前提としています。
  • 実際に適切なポイント値を設定する必要はないので注意してください。ポイント値として[1-5]最も多くのポイント値を持つカードを計算できるようにポイント値として設定するだけです。
  • 2番目の小さなは、計算された2つのポイント値を比較するだけです。
  • 1最初のポイント値が-12番目のポイント値よりも大きい場合、2番目のポイント値が最初のポイント値よりも大きい場合、および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

PHP51 45バイト

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

オンラインでお試しください!

実行するには:

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

例:

php -n briscola_score.php 3 1

注:このコードでは、PHP 7の宇宙船演算子を使用しています。そのため、7より前のバージョンのPHPでは動作しません。


出力:

  • 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文字のもう1つのバージョン:

(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.