Ваша задача - найти, сколько разных последовательностей Блэкджек можно найти в упорядоченном списке из 12 карт.
Последовательность блэкджека определяется как последовательность последовательных карт, сумма очков которых составляет ровно 21. Очки подсчитываются в соответствии со следующей таблицей:
Symbol | Name | Points Symbol | Name | Points
-------+-------+-------- -------+-------+--------
2 | Two | 2 9 | Nine | 9
3 | Three | 3 T | Ten | 10
4 | Four | 4 J | Jack | 10
5 | Five | 5 Q | Queen | 10
6 | Six | 6 K | King | 10
7 | Seven | 7 A | Ace | 1 or 11
8 | Eight | 8
вход
Строка из 12 символов, используя символы, описанные выше. Нам плевать на цвета карточек, поэтому они не предусмотрены.
Пример:
K6K6JA3Q4389
Выход
Количество различных последовательностей Блэкджек, которые можно найти во входной строке.
Пример:
K6K6JA3Q4389
включает в себя две различные последовательности Блэкджек:
JA
с тузом считается 11 очками (10 + 11 = 21)A3Q43
с тузом считается 1 очко (1 + 3 + 10 + 4 + 3 = 21)
Так что ответ будет 2
.
правила
- Две последовательности Блэкджек считаются различными, если они содержат разные карты или одинаковые карты в разных порядках. Если одна и та же последовательность появляется в разных позициях в списке ввода, она должна учитываться только один раз.
- Последовательности блэкджека могут перекрывать друг друга.
- Каждый вид карты может появляться до 12 раз в последовательности. (Мы предполагаем, что карты выбраны как минимум из 3 разных колод).
- Если во входной строке нет последовательности Блэкджека, вы должны вернуть
0
или любое другое ложное значение. - Это код-гольф, поэтому выигрывает самый короткий ответ в байтах. Стандартные лазейки запрещены.
Контрольные примеры
Последовательности предоставлены в информационных целях, но вам нужно только вывести их количество.
Input | Output | Distinct sequences
-------------+--------+--------------------------------------------------------
3282486Q3362 | 0 | (none)
58A24JJ6TK67 | 1 | 8A2
Q745Q745Q745 | 1 | Q74
AAAAAAAAAAAA | 1 | AAAAAAAAAAA
T5AQ26T39QK6 | 2 | AQ, 26T3
JQ4A4427464K | 3 | A442, 44274, 7464
Q74Q74Q74Q74 | 3 | Q74, 74Q, 4Q7
37AQKA3A4758 | 7 | 37A, 37AQ, AQ, AQK, QKA, KA, A3A475
TAQA2JA7AJQA | 10 | TA, TAQ, AQ, QA, A2JA7, 2JA7A, JA, AJ, AJQ, JQA
TAJAQAKAT777 | 13 | TA, TAJ, AJ, JA, JAQ, AQ, QA, QAK, AK, KA, KAT, AT, 777
code-golf
subsequence
card-games
Arnauld
источник
источник
Ответы:
Желе ,
3029 байтПопробуйте онлайн! или проверить набор тестов
Как?
Обратите внимание, что если мы всегда оцениваем туза как 1, то единственными действительными суммами являются 21 и 11 , причем последние приемлемы, если туз появляется в последовательности.
источник
Python 2, 215 байт
Добавлены комментарии:
источник
Python ,
134130 байтПопробуйте онлайн!
Как?
Безымянная функция, принимающая строку длиной 12 в качестве
x
.x[i:j]
фрагмент строки от i + 1- го до j- го символа.Ломтики принимаются таким образом, что у нас есть все подсписки Обходя от
i=0
кi=11
сfor i in range(12)
, для каждого из которых мы пересекаем отj=0
кj=12
сfor j in range(13)
.(Нам нужно только
j=i+1
вверх и вверх, но срезыj<=i
- это просто пустые строки, поэтому мы можем выйти из 4 байтовfor j in range(i+1,13)
)Они отфильтрованы для тех с правильной суммой ...
Действительными суммами являются 11 и 21, если в срезе есть туз, или только 21, если нет.
'A'in x[i:j]
дает нам эту информацию и~(v)
выполняет-1-v
, что мы используем для нарезки[11,21]
- таким образом, если туз находится в последовательности, которую мы получаем,[11,21][-2:]
а если нет, мы получаем[11,21][-1:]
,[11,21]
и[21]
соответственно.Сумма должна сама лечить
A
как 1, цифры , как их значения, иT
,J
,Q
, и ,K
как 10. Это отображение достигается за счет первой отливки ординалах:" 2 3 4 5 6 7 8 9 T J Q K A"
(без пробелов) становится[50, 51, 52, 53, 54, 55, 56, 57, 84, 74, 81, 75, 65]
, вычитая 48 , чтобы получить[ 2, 3, 4, 5, 6, 7, 8, 9, 36, 26, 33, 27, 17]
, взявmin
с 26 выходами[ 2, 3, 4, 5, 6, 7, 8, 9, 26, 26, 26, 26, 17]
, и моды (%
) шестнадцать те[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 1]
, по мере необходимости на сумму,sum(...)
.Отфильтрованные результаты помещаются в набор с
{...}
, поэтому остаются только уникальные результаты, а длинаlen(...)
- это число.источник
05AB1E ,
393837 байтПопробуйте онлайн!
объяснение
источник
JavaScript (ES6), 123 байта
источник
0
к ,AAAAAAAAAAAA
а не1
. (A
может быть одновременно 1 и 11)s=>eval("q=new Set;for(i=0;s[i];i++)for(t=A=0,j=i;c=s[j++];t==21|t==11&A&&q.add(s.slice(i,j)))t+=+c||(c<'B'?A=1:10);q.size")
за 124 байтаJavaScript (ES6),
144138129128126124 байтовСтарая попытка 128:
источник
s.search`A`>-1
может быть~s.search`A`
-2
, и1&-2 == 0
t
на0
в.slice(0,-1)
вызове (экономит 2Б)?t
это глобальная переменная, и она будет сброшена из-за вызоваf(s.slice(0,-1))
. Но я нашел способs.search`A`>-1
JavaScript (ES6), 112 байт
Эта кодовая логика очень похожа на ту, которая используется в существующих ответах JS от ETHproductions и Neil . Но он использует базовый массив для отслеживания обнаруженных последовательностей Блэкджек, а не
Set
.Отформатировано и прокомментировано
Контрольные примеры
Показать фрагмент кода
источник
05AB1E ,
40 39 38 3736 байт-4 Спасибо Эмигне
Попробуйте онлайн!
Нам нужно сделать декремент -> подстрока -> инкремент, чтобы лицевые карты были представлены одной цифрой.
источник
S
посколькуÇ
превращает строку в список кодов символов."SIPJ"
может быть„èµJu
„
в документации.Ç<çJŒÙ'@0:)vy„èµJuS9:S>D1å2‚T*>sOå}O
Тогда Вы будете на 1 байт короче, чем мой ответ :)Утилиты Bash + Unix,
145142141 байтПопробуйте онлайн!
Тестовые прогоны:
источник
PHP, 240 байт
Ungolfed:
Попробуй это здесь!
источник
$i
не было объявлено. Добавлены 4 байта и все работает отлично.