Гольф-гольф-бомбардир


25

У дитинстві я багато грав у карточну гру « гольф » . Якщо ви вирішите прийняти це ваше завдання, це обчислити рахунок руки в гольфі. Так як існує понад 9000 варіацій на цю карткову гру 1 , ми будемо йти з правилами , я пам'ятаю , як грав.

Правила (гри)

  • Ви закінчуєте раунд з 6 карт, і вам потрібно якомога менше очок.

  • Жарти не використовуються.

  • Тузи та 2с варті відповідно -1, і -2 бали відповідно.

  • Джеки та королі коштують 0 балів.

  • Картки від 3 до 10 варті номіналу. Однак вони скасовуються, коли ви їх відключаєте. Наприклад, 5 - це 5 балів, а два 5 - нуль. Три 5-ти коштують 5 балів (оскільки перші 2 спарені, але 3-го немає), а чотири 5-х - 0 (оскільки це 2 пари).

  • Королеви коштують 15 балів. Королів не можна скасувати, наприклад 2 королеви мають суму 30 балів.

Правила (виклик)

Введеним буде масив цілих чисел, або 6 окремих цілих чисел. Кому б ви не віддавали перевагу. 1 являє собою туза, 2-10 являє собою 2-10, а Джек, Королева та Кінг представляє 11, 12 та 13. Вихід - це оцінка руки відповідно до вищезазначених правил. Ви можете з упевненістю припустити, що всі вхідні дані є дійсними, наприклад, жодне число не з’являється більше 4 разів, а всі цифри знаходяться в діапазоні [1, 13]. Введення та вихід можуть бути у будь-якому розумному форматі.

IO тесту:

[11, 10, 3, 1, 2, 2]    --> 8
[4, 5, 5, 3, 8, 7]      --> 22
[2, 2, 2, 2, 1, 1]      --> -10 (The lowest score possible)
[12, 12, 12, 12, 10, 9] --> 79 (The highest score possible)
[9, 9, 9, 9, 11, 1]     --> -1
[8, 8, 8, 8, 11, 13]    --> 0
[10, 9, 3, 7, 12, 2]    --> 42
[1, 2, 3, 4, 5, 6]      --> 15
[10, 9, 2, 3, 4, 1]     --> 23
[10, 3, 12, 3, 7, 12]   --> 47

Найкоротша відповідь у байтах виграє!


1 насправді, але варіацій дуже багато.

Відповіді:


3

Pyth, 28 27 25 байт

s+*L%/Qd2}3Tm?<d3_d*15q12

Спробуйте в Інтернеті. Тестовий набір.

Пояснення

  • По-перше, Pyth автоматично додає деякі змінні. Код зараз s+*L%/Qd2}3Tm?<d3_d*15q12dQ.
  • }3Tгенерує список [3, 4, 5, 6, 7, 8, 9, 10].
  • Помножте кожне число у цьому списку ( *L) на підрахунок цього числа на вході ( /Qd), модуль 2 ( %2). Результат - 0 для парних чисел, а саме число для непарних.
  • Мапа на вхідні числа ( mQ):
    • Якщо число менше 3 ( ?<d3), заперечте його ( _d).
    • В іншому випадку перевірте, чи немає 12 ( q12d), і помножте булеву на 15 ( *15). Результат - 15 для королеви і 0 для всього іншого.
  • Об'єднайте списки ( +). Тепер отриманий список містить бали для парних чисел (перша частина) та спеціальні картки A, 2, Q (друга частина) з деякими додатковими нулями.
  • Нарешті, візьміть суму результату ( s).

Альтернативне 25-байтове рішення

-+s*L%/Qd2}3T*15/Q12s<#3Q

Це працює аналогічно першому, але рахує королеви окремо і заперечує тузів та двійок фільтром.


11

Python 2, 72 70 байт

f=lambda x,*T:[x*(-1)**T.count(x),~x%2*15,-x][(x-3)/8]+(T>()and f(*T))

0**0 == 0Якось я побажав, щоб Пітон пішов на лікування, щоб я міг зробити це (-condition)**num. Телефонуйте як f(11, 10, 3, 1, 2, 2).

Попередня 72-байтна версія:

f=lambda x,*T:[~x%2*15,x*(-1)**(x<3or T.count(x))][x<11]+(T>()and f(*T))

5

> <> , 63 57 56 + 2 = 65 59 58 байт

Очікується, що вхідні цифри будуть на стеку при запуску програми, тому +2 байти для -vпрапора. Спробуйте в Інтернеті!

</!?lp6$+1g6:
3\0
?\::6g2%*{+}1+:b=
;\~16g-26g2*-c6gf*+n

Оскільки всі невикористані значення в кодовому полі ініціалізовані 0, воно може бути використане для того, щоб визначити, скільки кожного значення присутнє в стеці, отримуючи значення at [value,6], збільшуючи його і повертаючи його в поле коду. Потім загальна сума обчислюється як:

T = 0 + {for x in 3 to 10, x*([x,6]%2)} - [1,6] - 2*[2,6] + 15*[12,6]

Редагувати: 6 байтів від гольфу вимикаються шляхом реструктуризації введення та перемикання кроків обчислення. Попередня версія:

:6g1+$6pl0=?\
/-*2g62-g610/
c ;n$\
6:b=?/>::6g2%*{+}1+!
\gf*+3/

Редагувати 2: збережено 1 байт, завдяки Sp3000


Я бачив, що ви 0=?кілька разів використовували або подібне - можете ?!замість цього використовувати ?
Sp3000

@ Sp3000 Ack, звичайно, ти маєш рацію. Дякую, додам це в
Sok

5

MATL , 27 26 байт

3:10=s2\7M*G12=15*Gt3<*_vs

Вхід - це масив стовпців, тобто значення розділені крапкою з комою.

Спробуйте в Інтернеті! або перевірити всі тестові випадки (це додає цикл , щоб прийняти всі входи і замінює Gшлях 1$0Gштовхати останній введення).

Пояснення

3:10=    % Take input implicitly. Compare with range [3 4 ... 10], with broadcast
s        % Sum of each column: how may threes, fours, ... tens there are
2\       % Modulo 2
7M       % Push [3 4 ... 10] again
*        % Element-wise multiply (the sum of this array is the score of 3...10)
G        % Push input again
12=      % Compare with 12, element-wise
15*      % Multiply by 15 (this is the score of 12)
G        % Push input again
t3<      % Duplicate. True for entries 1 or 2
*_       % Multiply and negate (the sum of this array is the score of 1, 2)
v        % Concatenate all stack concents into a vertical array
s        % Sum of array. Implicitly display

4

Піт - 37 36 35

Це здається занадто великим, але FGITW.

J<#h;K-QS2++*15/K12sm*d%/Jd2{J_s@S2

Тестовий сюїт .


2
"Це здається занадто великим, але FGITW." То гольф це спочатку?
кіт

Я не бачив цього , поки я не закінчив свій власний, але вони майже ідентичні , за винятком використання Jі Kздається абсолютно непотрібним, а також ви можете грати в гольф , +_щоб -;) Я отримав 31:+*15/Q12-sm*d%/Qd2{>#2<#11Qs@S2
FryAmTheEggman

1
@FryAmTheEggman 24:+*15/Q12-s*R%/Qd2}3Ts@S2
Якубе

3

JavaScript (ES6), 63 байти

a=>a.map(e=>r+=e<3?-e:e>10?e-12?0:15:(m[e]^=1)?e:-e,r=0,m=[])|r

Або якщо ви віддаєте перевагу,

a=>a.map(e=>r-=e<3?e:e>10?e-12?0:-15:(m[e]^=1)?-e:e,r=0,m=[])|r


0

Perl 5.10.0 + -n, 115 64 60 56 байт

$p+=$_-12?$_>2?$_<11?++$l[$_]%2?$_:-$_:0:-$_:15}{say$p

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

Пояснення:

Додавання -nциклу навколо нього:

# Used variables:
# $_: input (auto)
# $p: points
# $l[n]: number of occurences of n (for 3-10)
while (<>) { # for every input
    $p += $_ - 12 ? # if the input is not 12 (queen) ...
        $_ > 2 ? # then: if it's > 2 (not ace or 2) ...
            $_ < 11 ? # then: if < 11 (3-10) ...
                ++$l[$_] % 2 ? # then: if it's an odd occurence (1st, 3rd, 5th, ...)
                    $_ # add it
                    : -$_ # else subtract it
            : 0 # no points for other stuff (J, K)
        : -$_ # negative points for ace and 2
    : 15 # 15 points for queen
}
{ # after input:
    say $p # output points
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.