Описание задачи
Домино - это игра, в которую играют с тайлами с двумя значениями - одним слева, другим справа, например, [2|4]
или [4|5]
. Две плитки могут быть объединены вместе, если они содержат общее значение. Две плитки выше можно соединить так:
[2|4][4|5]
Последовательность n
соединенных плиток будем называть цепочкой длины n. Конечно, плитки можно поворачивать, так что плитки [1|2]
, [1|3]
и [5|3]
могут быть изменены в цепочку [2|1][1|3][3|5]
длиной 3.
Учитывая список пар целых чисел, определите длину самой длинной цепочки, которая может быть сформирована с использованием этих плиток. Если список пуст, правильный ответ 0
(обратите внимание, что вы всегда можете сформировать цепочку длины 1
из непустого списка плиток).
Пример ввода / вывода
[(0, -1), (1, -1), (0, 3), (3, 0), (3, 1), (-2, -1), (0, -1), (2, -2), (-1, 2), (3, -3)] -> 10
([-1|0][0|-1][-1|2][2|-2][-2|-1][-1|1][1|3][3|0][0|3][3|-3])
[(17, -7), (4, -9), (12, -3), (-17, -17), (14, -10), (-6, 17), (-16, 5), (-3, -16), (-16, 19), (12, -8)] -> 4
([5|-16][-16|-3][-3|12][12|-8])
[(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)] -> 7
([1|1][1|1][1|1][1|1][1|1][1|1][1|1])
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)] -> 1
(any chain of length 1)
[] -> 0
(no chain can be formed)
O(n!)
I guess it's P
Ответы:
Брахилог , 23 байта
Попробуйте онлайн!
объяснение
Другими словами, для ввода, подобного
[[1:2]:[1:3]:[5:3]]
, мы пытаемся переставить его в правильную цепочку[[2:1]:[1:3]:[3:5]]
, а затем сгладить / behead / unkknife, чтобы произвести[1:1:3:3:5:_]
(где_
представляет неизвестное). Комбинация~c
и:{…l2}a
эффективно разбивает это на группы из 2 элементов, и мы гарантируем, что все группы равны. Поскольку мы сгладили (удвоив длину), удалили один элемент из начала и добавили один в конце (без изменений) и сгруппировали в пары (вдвое уменьшив длину), он будет иметь ту же длину, что и исходная цепочка домино.Инструкция «behead» завершится ошибкой, если на входе нет домино (фактически, IIRC
:pa
также потерпит неудачу;a
не нужны пустые списки), поэтому нам нужен особый случай для 0. (Одна большая причина, по которой мы имеем асимметрию междуb
и~k
поэтому что нам также не нужен особый случай для 1.)источник
Брахилог , 29 байт
Попробуйте онлайн!
Уверен, это ужасно долго, но что угодно. Это тоже ужасно медленно.
объяснение
Причина, по которой он найдет самый большой, заключается в том, что он
s - subset
генерирует точки выбора от самого большого до самого маленького подмножества.источник
Mathematica, 191 байт
Я уверен, что играю в гольф. Но в основном тот же алгоритм, что и в ответе Брахилога Фатализ , с немного другим тестом в конце.
источник
Differences/@Rest@Flatten@#~Partition~2
вместоDifferences/@Partition[Rest@Flatten@#,2]
(Infix
имеет более высокий приоритет, чемMap
)JavaScript (Firefox 30-57), 92 байта
l
является последним значением илиundefined
для начального вызова.l-n
поэтому является ложным значением, если в домино можно играть.d
домино на рассмотренииn
конец рассматриваемого домино для цепочки с предыдущим домино. Другой конец может быть легко рассчитан какd[0]+d[1]-n
.0,
просто обрабатывает базовый случай отсутствия играбельных домино.источник
Haskell ,
180 134131117 байтПопробуйте онлайн! Новый подход оказался как более коротким, так и более эффективным. Вместо всех возможных перестановок строятся только все допустимые цепочки.
Изменить: 117-байтовая версия снова намного медленнее, но все же быстрее, чем грубая сила.
Старый метод грубой силы:
Это реализация методом грубой силы, которая пробует все возможные перестановки (количество возможных перестановок, по-видимому, дается A000165 , « двойным факториалом четных чисел »). Попробуйте онлайн, едва управляет входами до длины 7 (что впечатляет, так как 7 соответствует 645120 перестановкам).
Использование:
источник
Python 2, 279 байт
Golfed:
Попробуйте онлайн!
То же самое с некоторыми комментариями:
Я пишу, потому что я не видел никаких ответов Python ... кто-то увидит мой ответ и, с отвращением, будет вынужден опубликовать что-то гораздо более короткое и эффективное.
источник
Clojure,
198183 байтаОбновление: улучшена обработка «максимально возможной пустой последовательности»
Более ранняя версия:
Соглашение о вызовах и контрольные примеры:
F
возвращает элементы спискаC
без элементаa
,M
возвращает максимум входных данных или 1.L
является основной функцией, при вызове с одним аргументом генерирует все возможные начальные фрагменты и находит максимальную длину для каждого из них. При вызове с двумя аргументамиl
первый элемент последовательности, которому должен соответствовать следующий фрагмент,R
является остальными частями.Генерировать перестановки и «выбрать один элемент и разбить на остальное» было довольно сложно, чтобы реализовать в сжатой форме.
источник