Забив Брісколу


11

Вступ

Бріскола - одна з найпопулярніших ігор Італії з картами. Це карткова гра, як мост. Бріскола добре відома своєю химерною точковою системою. У цьому виклику, отримавши дві картки, ви виведете, чи перша набирає більше, менше чи однакова кількість балів, як друга в точковій системі Брісколи.

Виклик

Бріскола грається з колодою італійських ігрових карт. У колодах сорок карт, по 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      |
 +------------------------+-------------+

Дякуємо Орфеву за приємний стіл! :)

Ваше завдання - створити повну програму або функцію, яка приймає два числа 1-10, що представляють ранги картки, і виводить (або повертає), чи точкове значення першої картки більше, ніж менше, або рівне точковому значенню друга карта. Додаткові нотатки:

  • Ваша програма може виводити будь-які три значення, щоб вказати менше, більше та дорівнює, однак вона повинна виводити однакове значення для кожної умови кожен раз.
  • Ваша програма може використовувати будь-які за замовчуванням IO .
  • Стандартні лазівки заборонені.
  • Дозволена або повна функція, або програма.
  • Це питання є , тому виграє найменший байт.

  • Ось кілька зразкових входів та виходів:

     1, 4 => більше (туз набирає 11 балів, 4 балів 0 балів, перший - більше, ніж другий.
     8, 3 => менше (8 балів 2, 3 бали 10, перший менше другого.
     5, 2 => рівний (5 і 2 обидва бали 0)

Якщо у вас є якісь питання, не соромтесь задавати питання. Удачі!


1
Я завжди вважав, що праймерінг Скопа є більш химерним;)
FryAmTheEggman,

@FryAmTheEggman ти маєш рацію, я змінив це. Також у вас може бути пункт про примірію…;)
Амфібологічний

Чи можемо ми взяти масив із двома значеннями як вхідні дані?
digEmAll

1
@digEmВсі впевнені.
Амфібологічний

Не такий химерний. Дуже подібний бал існує на португальські ігри Суека та Біска!
серхіол

Відповіді:


2

Желе , 12 11 байт

“®µ½¤¢‘iⱮIṠ

Спробуйте в Інтернеті!

  • -1 байт, використовуючи метод Луїса Мендо .

Виходи 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

Введення - це масив з двох чисел. Вихід -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). Повертає 1 для більше , -1 для менше або 0 для рівних .

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

Спробуйте в Інтернеті!


Використовуючи формулу, 48 байт

Це, безумовно, довше, ніж використання таблиці пошуку, але також трохи цікавіше.

Той самий формат вводу / виводу

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

Спробуйте в Інтернеті!

Як?

Оскільки багато карток мають значення , ми спершу хочемо їх замаскувати. З огляду на карту , ми обчислюємо:н0n

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

Чи проводилася мета дискусія щодо такого підходу з використанням кривих параметрів? Технічно це не відповідає цьому виклику, оскільки написана вами функція повертає функцію, а не відповідь.
Спарр


3

Japt , 25 21 16 байт

  • 1 => більше
  • -1 => менше, ніж
  • 0 => рівний

£"78920"bXÉÃr- g

Спробуйте в Інтернеті!


Ви можете використовувати -gпрапор, щоб зберегти 2 байти.
Кудлатий

У мене є 13-байтне рішення (також використовуючи -gпрапор, якщо ви хочете спробувати його).
Кудлатий

@Shaggy Я б не сказав, що це збереження двох байтів, позначені прапорами - це лише окремі мовні рішення і не вважаються чистими рішеннями Japt.
Ніт

Якщо ви не хочете використовувати прапор, тоді рішення, про яке я згадував, стає 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))

Лембда, що приймає параметри в синтаксисі каррі, відповідь JavaScript на відповідь Арнальда .

Повертає 0.0 рівний , 1.0для переважаючих , і -1.0для менш . Спробуйте його онлайн тут .

Дякую Кевіну Крейсейну за те, що він займався 3 байтами для гри в гольф.


1
Ви можете зберегти 3 байти, зробивши пряме повернення два рази "05040000123".charAt(...)замість цілого масиву:a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))
Кевін Круїйсен

2

MarioLANG , 578 548 530 байт

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

Спробуйте в Інтернеті!

Пояснення:

  • Перший, великий замок зчитує номер картки як вхід і обчислює його еквівалентне значення точки, поки воно не прочитає 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))))

скріншот

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.