Гольф гольфист

25

В детстве я много играл в карточную игру " гольф " . Ваша задача, если вы решите принять ее, состоит в том, чтобы подсчитать счет в игре в гольф. Поскольку в этой карточной игре 1 более 9000 вариантов , мы будем придерживаться правил, которые я помню, играя.

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

  • Вы заканчиваете раунд с 6 картами, и вы хотите как можно меньше очков.

  • Джокеры не используются.

  • Тузы и 2 дают -1 и -2 очка соответственно.

  • Валеты и короли стоят по 0 очков.

  • Карты от 3 до 10 стоят номиналом. Тем не менее, они отменяются при их сопряжении. Например, 5 стоит 5 баллов, а два 5 - ноль. Три пятерки стоят 5 баллов (так как первые два парные, а третье нет), а четыре пятерки равны 0 (поскольку это две пары).

  • Королевы стоят 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 не очень, но вариаций много.

DJMcMayhem
источник

Ответы:

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) на количество этого числа в input ( /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

Это работает аналогично первому, но подсчитывает королев отдельно и сводит на нет тузы и двойки с помощью фильтра.

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

В какой-то момент я хотел, чтобы Python лечил 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))
Sp3000
источник
5

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

Ожидается, что входные числа будут в стеке при запуске программы, поэтому +2 байта для -vфлага. Попробуйте онлайн!

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

Поскольку все неиспользуемые значения в поле кода инициализируются 0, его можно использовать для определения количества каждого значения в стеке, получая значение [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

Sok
источник
Я видел, что вы использовали 0=?или подобное несколько раз - вы можете использовать ?!вместо этого?
Sp3000
@ Sp3000 Ок, конечно, ты прав. Спасибо, я добавлю это
Сок
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

Тестовый пакет .

Maltysen
источник
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
}
Wastl
источник