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

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

Спасибо Orphevs за хороший стол! :)

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

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

  • Вот несколько примеров входов и выходов:

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

Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать. Удачи!

Уклоняющийся
источник
1
Я всегда думал, что премьера Скопы была более странной;)
FryAmTheEggman
@FryAmTheEggman ты прав, я это изменил. Кроме того, вы можете иметь точку зрения о примире ...;)
Амфибологическое
Можем ли мы взять массив с двумя значениями в качестве входных данных?
digEmAll
1
@ DigEm Все точно.
Амфибологическое
Не так странно. Очень похожая оценка существует в португальских карточных играх Sueca и Bisca!
sergiol

Ответы:

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.
dylnan
источник
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

пзнак равно2N и (21+23+28+29+210)
пзнак равно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знак равно6пмодификация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
Arnauld
источник
Была ли мета дискуссия об этом подходе с использованием каррированных параметров? Технически это не соответствует этой задаче, потому что написанная вами функция возвращает функцию, а не ответ.
Спарр
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
digEmAll
источник
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 байта.

OOBalance
источник
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

C (gcc) , 57 байтов

Возвращает обычное значение [-1..1] для <, = и> соответственно.

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

Попробуйте онлайн!

ErikF
источник
Предлагаю *s=L"...вместо char*s="...и a=(s[a]>s[b])-(s[a]<s[b])вместоa=s[a];b=s[b];b=(a>b)-(a<b)
потолок кошка
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. Создает карту значений для карт и сравнивает значения карт из нее. Положение значения на карте совпадает с номером карты.

night2
источник
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))))

снимок экрана

Qwertiy
источник