得分布里斯科拉


11

介绍

Briscola是意大利最受欢迎的纸牌游戏之一。这是一个招人喜欢的纸牌游戏,例如Br​​idge。Briscola以其怪异的点系统而闻名。在此挑战中,给定两张牌,您将输出第一张得分高于,低于或等于Briscola积分系统中第二张得分的积分。

挑战

布里斯科拉(Briscola)与一副意大利扑克牌一起玩。一副纸牌中有40张卡片,四种套装中的每套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
我一直以为斯科帕的原始人更奇怪;)
FryAmTheEggman '18

@FryAmTheEggman你是对的,我已经更改了。);此外,你可能有一个关于primiera点...
Amphibological

我们可以将两个值作为输入的数组吗?
digEmAll

1
@digEm所有确定的事情。
血液流变学

不那么奇怪。葡萄牙的Sueca和Bisca纸牌游戏的得分非常相似!
sergiol

Answers:


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
没烦恼,但是谁能拒绝我的解释呢?
dylnan '18

万一这是一次偶然的降票-并假设它是在上次编辑之后发生的-我建议对帖子进行一次虚拟更新,以便当降票者意识到出了问题时可以撤消它。
Arnauld

5

MATL,12字节

[DEXIl]&mdZS

输入是两个数字组成的数组。输出是-101分别为大于等于小于

在线尝试!

说明

以输入[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个字节

在currying语法上排名两位(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))

在线尝试!

怎么样?

0ñ

p=2ñ 和 21个+23+28+29+210
p=2ñ 和 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=6p13
    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

是否有关于使用咖喱参数的方法的元讨论?从技术上讲,这与挑战不符,因为您编写的函数会返回一个函数,而不是答案。
Sparr


3

Japt25 21 16字节

  • 1 => 大于
  • -1 => 小于
  • 0 => 等于

£"78920"bXÉÃr- g

在线尝试!


您可以使用该-g标志保存2个字节。
毛茸茸的

我有一个13字节的解决方案(-g如果您想尝试的话,也可以使用该标志)。
粗野的

@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个字节,感谢@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))

Lambda以易变的语法获取参数,这是Arnauld的JavaScript 答案的端口。

返回0.0 等于1.0大于,并-1.0小于在这里在线尝试。

感谢Kevin Cruijssen打高尔夫球3个字节。


1
您可以通过两次直接返回"05040000123".charAt(...)而不是整数数组来节省3个字节:a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))
Kevin Cruijssen

2

MarioLANG578个548 530字节

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

在线尝试!

说明:

  • 第一个大城堡读取卡号作为输入,并计算其等效点值,直到读取a 0(无输入)为止。假设只有两个严格的正值作为输入。
  • 请注意,我实际上并不需要设置适当的点值,而只是将介于 [1-5]以帮助计算哪张卡具有最多的点值。
  • 第二座小城堡仅比较两个计算出的点值。
  • 它返回1如果第一点值大于第二个值,-1如果第二点值是比第一个更大,并且0如果点值是相同的。



1

05AB1E,14 个字节

ε78920S>sk}`.S

返回1-10超过;少于; 或分别等于。

在线尝试验证所有测试用例

说明:

ε              # 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的spaceship operator。因此它不适用于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个字符:

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

屏幕截图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.