Примечание: это связано с вариацией игры Rummikub
Справочная информация и правила
Rummikub - это игра на основе тайлов. Есть четыре цвета: красный, оранжевый, синий и черный. Для каждого цвета есть 13 плиток (помечены от 1 до 13), а также есть 2 джокера, которые не зависят от цвета, следовательно, в общей сложности 54 штук. В этом варианте Rummikub каждый игрок получает 14 плиток и должен получать еще одну плитку и сбрасывать еще одну в каждом раунде, чтобы количество плиток было постоянным. Игроки не видят плитки друг друга. Цель состоит в том, чтобы сгруппировать плитки так, чтобы все фигуры принадлежали хотя бы к одной группе (см. Ниже). Когда игрок сгруппировал все фигуры, он бросает свою плитку и показывает свои фигуры. Другие затем проверяют, все ли комбинации действительны, и если они есть, игрок выигрывает раунд.
Как плитки могут быть сгруппированы?
Есть только два типа групп:
Многоцветные группы:
- Они состоят из 3 или 4 плиток.
- Они содержат только плитки с одинаковым номером на них.
- Все плитки разных цветов.
- Пример:
RED 9, BLUE 9, BLACK 9
.
Одноцветные группы:
- Они состоят как минимум из 3 плиток.
- Они не могут содержать более 13 плиток.
- Они содержат только плитки с разными последовательными номерами в порядке возрастания.
- Все плитки имеют одинаковый цвет.
- Плитки с маркировкой
1
не могут быть местами после маркированных плиток13
. - Пример:
RED 5, RED 6, RED 7
.
Подожди, что делают Джокеры?
Джокеры могут заменить любую фигуру в игре. Например, наш первый пример может стать JOKER, BLUE 9, BLACK 9
, RED 9, JOKER, BLACK 9
или RED 9, BLUE 9, JOKER
. То же самое относится и к нашему другому примеру. Однако нельзя ставить двух джокеров в одну группу, поэтому подобные вещи JOKER, ORANGE 8, JOKER
запрещены.
задача
По заданной группе плиток Rummikub определите, является ли она действительной. Вам гарантировано, что дубликаты плиток не появятся, кроме двух джокеров, и что плитки, которые вы получите в качестве входных данных, действительны (например, такие вещи, как 60
не будут отображаться)
Ввод, вывод
Вы можете получить ввод и предоставить вывод любым стандартным методом.
Некоторые допустимые форматы ввода: список строк, список кортежей, вложенные списки, строки или все, что вы считаете подходящим. Цвета могут быть приняты как строки (например:) "Blue","Red", etc.
, как сокращения строк (пожалуйста, выделите синие и черные плитки), или как целые числа, соответствующие цвету. Когда дело доходит до джокеров, вы должны упомянуть, как ваша программа получает их в качестве входных данных. Если вы выбираете Strings, у вас может быть что-то вроде RED 9, JOKER, ...
, если вы выбираете кортежи, которые вы можете иметь, (9,"RED"), ("JOKER")
или что-то подобное. Если это поможет, вы можете получить цвет для этого Джокера (который не должен влиять на вывод вашей программы). Например, вы можете иметь ("JOKER","RED")
или ("JOKER","BLUE")
, но это никак не должно влиять на вывод.
Что касается вывода, применяются стандартные правила для решения проблемы .
Отработанные примеры
Давайте рассмотрим пример, который, надеюсь, облегчит понимание. Дана группа следующим образом, где каждый кортеж представляет плитку:
[(9, «КРАСНЫЙ»), (9, «ОРАНЖЕВЫЙ»), («ДЖОКЕР»), (9, «ЧЕРНЫЙ»)]
Это должно вернуть истинное значение, потому что ввод действителен. В этом случае джокер подставляет (9, "BLUE")
, и они образуют многоцветную группу.
Если бы вам дали следующую группу:
[(9, «СИНИЙ»), (9, «ОРАНЖЕВЫЙ»), (9, «КРАСНЫЙ»), (9, «ЧЕРНЫЙ»), («ДЖОКЕР»)]
Это было бы недопустимо, и поэтому ваша программа должна возвращать ложное значение, потому что джокеру ничего не осталось заменить, потому что максимальное количество карт в многоцветной группе равно 4.
Дополнительные тестовые случаи
Они предназначены для расширенного набора тестов, который охватывает практически все возможные ситуации:
Вход -> Выход [(1, «СИНИЙ»), (2, «СИНИЙ»), (3, «СИНИЙ»), (4, «СИНИЙ»), (5, «СИНИЙ»), (6, «СИНИЙ»)]] - > правда [(6, «СИНИЙ»), (6, «КРАСНЫЙ»), (6, «ЧЕРНЫЙ)] -> правда [(5, "черный"), (6, "черный"), (7, "черный"), (8, "черный"), (9, "черный"), (10, "черный"), ( "ДЖОКЕР"), (12, "ЧЕРНЫЙ")] -> правда [("Джокер"), (3, "СИНИЙ"), (3, "КРАСНЫЙ")] -> правда [(8, «ЧЕРНЫЙ»), (2, «КРАСНЫЙ»), (13, «СИНИЙ»)] -> ложь [(4, «КРАСНЫЙ»), (3, «КРАСНЫЙ»), (5, «КРАСНЫЙ»)] -> ложь [(5, «ЧЕРНЫЙ»), (6, «ЧЕРНЫЙ)] -> ложь [("ДЖОКЕР"), (5, "КРАСНЫЙ"), ("ДЖОКЕР")] -> ложь [(4, «КРАСНЫЙ»), (5, «КРАСНЫЙ»), (6, СИНИЙ »)] -> ложь [(4, «КРАСНЫЙ»), («ДЖОКЕР»), (5, «КРАСНЫЙ»)] -> ложь [(12, «ЧЕРНЫЙ»), (13, «ЧЕРНЫЙ), (1,« ЧЕРНЫЙ »)] -> ложь
Это код-гольф , поэтому выигрывает самый короткий код в байтах на каждом языке!
источник
Ответы:
APL (Dyalog) , 58 байт
Принимает список цветов (1-4) в качестве правого аргумента и список чисел в качестве левого аргумента. Обозначается номер Джокера,
(⍳4)
который эквивалентен тому,(1 2 3 4)
что он может быть любым из них. Аналогично, его цвет обозначен,(⍳13)
чтобы указать, что это может быть любое из чисел от 1 до 13.Попробуйте онлайн!
Алгоритм
Есть три условия, из которых два последних имеют два условия каждое:
И ЛИБО
одно число И
уникальные цвета
ИЛИ
для того, чтобы пробег был действительным.
Порядок чтения
3≤
3 меньше или равно≢⍺
количеству плиток∧
а такжеs⍵
все числа одинаковы∧
а также⍺≡∪⍺
цвета уникальны∨
или1∊
1 входит≢∘∪¨
в число уникальных⊃,¨/
расширенных⍺
цветов∧
а также∨/
∊
среди всех⊃,¨/⍵
расширенных числовых прогонов существует хотя бы один,⍷¨⊂
встречающийся в⍳13
1-13Полное объяснение кода
{
…}
Анонимная функция, где⍺
левый аргумент и⍵
правый аргумент3.2.
⍳13
цифры от 1 до 13(
...)⍷¨
найти стартовые позиции каждого из следующих запусков:,¨/⍵
объединить каждый элемент чисел (создает прогон для каждого значения Джокера)⊃
раскрыть (потому что/
снижает рейтинг)∊
ε NLIST (Flatten)∨/
ИЛИ сокращение (т. Е. Правда ли?)(
…)∧
И:3,1
(
…)⍺
Результат применения следующей функции в списке цветов:s←{
…}
S (для s ame), которая является следующей анонимной функцией (⍵
является ее аргументом):,¨/⍵
объединить каждый элемент (создает прогон для каждого значения джокера)⊃
раскрыть (потому что/
снижает рейтинг)≢∘∪¨
количество уникальных элементов в каждом списке1∊
один член? (т. е. есть ли какие-либо списки всех одинаковых?)(
…)∨
ИЛИ2.2.
∪⍺
уникальные цвета⍺≡
идентичны цветам (т.е. они уникальны)(
…)∧
И:2.1.
s⍵
цифры все одинаковые(
…)∧
И1.
≢⍺
количество цветов (то есть количество плиток)3≤
три меньше или равно этомуисточник
Желе ,
41403836 байтПопробуйте онлайн! (поставляется с нижним колонтитулом)
Принимает ввод как массив
(color, value)
для обычных плиток и0
для джокеров. Цвета представлены как целые числа (хотя я не уверен, имеет ли это значение для текущего кода).Выходы
1
(правдивые) или0
(ложные).объяснение
источник
Python 2 ,
371 370 362 341 329325 байтstr.split()
вместоlist literal
len(x)-1
J O BK B R
дляJoker, Orange, Black, Blue, Red
литераловПопробуйте онлайн!
источник
BK
на,b
чтобы сохранить 1 байт (TIO с обновленнымиb
Javascript (ES6), 286 байт
(Обратите внимание, что приведенные выше тестовые примеры содержат 2 дополнительных тестовых случая, которых нет в Вопросе: они являются истиной и ложью соответственно: см. Версию без заглядывания для удобства чтения)
Грубый процесс:
Джокеры обозначаются
0
числовым значением (отрицательное число тоже подойдет); это сохраняет входную структуру непротиворечивой (имеет цвет и значение) и не требует проверкиc=="JOKER"
, сохраняя 7 байтов.Возможно, что некоторые скобки могут быть удалены, возможно, не будет упакован
q
как массив (я пробовал, и значение просто оставалось 0 или вызывало назальные демоны ).Ungolfed:
Версия, над которой я работал, чтобы получить правильную логику. Одноразовые лямбды попали в подкладку; вот их соответствующая функция:
источник
C # (.NET Core) , 198 байт
Принимает цвета плиток и цифры на них как отдельные списки целых чисел. Специфика этого отображения не имеет значения, если каждый цвет имеет различное целое число, а джокеры представлены как 0.
Формат ввода чисел довольно особенный, хотя. Число, которое нужно ввести для числа,
n
равно 2 ^ n, а число, используемое для представления джокера, должно быть (2 ^ 14) -1. Это позволяет побитово иu&x
оценивать u, если тайл x имеет значение, равное u, или является джокером.C # (.NET Core) , 200 байт
На 2 байта длиннее решение, которое не эклектично в отношении ввода. Оказывается, просто использование особого случая для джокеров в одном месте, с которым им было трудно иметь дело, не намного дольше, чем умная битовая операция, которой я так гордился. Здесь джокерами являются (0,0), другие числа соответствуют ожидаемым, а цвета представлены любыми 4 значениями, которые отличаются друг от друга сравнением по умолчанию в C # (в частности,
Distinct()
операция Linq должна рассматривать значения для того же цвета как «не отличные»). и значения для разных цветов как «разные»).Нечто, что могло бы быть полезным для других языков,
u*=!u++^x*x
было бы эквивалентноu=u==x|x<1?u+1:0
в некоторых языках; u ^ x равно 0 тогда и только тогда, когда u == x, и 0 раз любое int равно 0, поэтому u ^ x * x будет равно 0 для u == x или x == 0, если C # не делает побитовые операции меньшим приоритетом, чем математические. C # также не может интерпретировать int как bools без явного приведения. Язык, который старается сделать так, чтобы типы работали, может преобразовывать значения в0
иnot 0
доfalse
иtrue
после применения!
к ним, а затем при возвращении к int интерпретировать!false
как 1 и!true
как 0. Все это говорит, что я не могу гарантировать, что другой язык на самом деле будет извлечь выгоду из остальной части алгоритма, так что он может даже не придумать.источник
Scala,
491477 символов,491477 байтовЭтот вызов был веселым; Спасибо.
Таким образом,
f
в строке 4 - рекурсивный вызов, в котором я пытаюсь заменить «JOKER» на любой другой тайл. Видеть tio для более ясного представления кода. Я выбрал в качестве входных данных последовательность из 2-х кортежей (Int, String) - вызываемыхt
в моем коде, см. Tio, поэтому «JOKER» представлен 2-кортежем (0, «JOKER»).РЕДАКТИРОВАТЬ: 14 байтов, сохраненных благодаря комментариям, я беру OB b R для ORANGE BLACK BLUE RED.
Попробуйте онлайн!
EDIT: -2 байта, удалены ненужные
(
условия Вокругcase _ if
систочник
O,B,b,R
вместо того,ORANGE,BLUE,BLACK,RED
чтобы сохранить байты? Я понятия не имею, как работает Scala, но я думаю, что вы можете.var (O,B,b,R)=("ORANGE","BLACK","BLUE","RED")
и вызываетO
B
b
R
, в общей сложности 49 байтов; гдеvar c=Seq("ORANGE","BLACK","BLUE","RED")
и вызовы составляютc(...)
58 байтов. НО первый случай разрешаетfor(u<-c)
вместоfor(u<-Seq(O,B,b,R))
, так что стоимость не -9, но +2. Спасибо за попытку, хотя.var c=Seq("O","B","b","R")
эти символы в качестве входных данных, а не полные строки для цвета. Как уже упоминалось в оригинальном сообщении, «цвета могут быть приняты как ... строковые сокращения».