Descripción del desafío
Dominoes es un juego que se juega con fichas con dos valores: uno a la izquierda, otro a la derecha, por ejemplo [2|4]
o [4|5]
. Se pueden unir dos mosaicos si contienen un valor común. Los dos mosaicos anteriores se pueden unir así:
[2|4][4|5]
Llamaremos a una secuencia de n
mosaicos unidos una cadena de longitud n. Por supuesto, las fichas se pueden rotar, por lo que las fichas [1|2]
, [1|3]
y [5|3]
se pueden reorganizar en una cadena [2|1][1|3][3|5]
de longitud 3.
Dada una lista de pares de enteros, determine la longitud de la cadena más larga que se puede formar con estos mosaicos. Si la lista está vacía, la respuesta correcta es 0
(tenga en cuenta que siempre puede formar una cadena de longitud a 1
partir de una lista no vacía de mosaicos).
Entrada / salida de muestra
[(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)
code-golf
combinatorics
path-finding
dominoes
shooqie
fuente
fuente
O(n!)
como deseeI guess it's P
Respuestas:
Brachylog , 23 bytes
Pruébalo en línea!
Explicación
En otras palabras, para entradas como
[[1:2]:[1:3]:[5:3]]
, tratamos de reorganizarlo en una cadena válida[[2:1]:[1:3]:[3:5]]
, luego aplanar / decapitar / desenredar para producir[1:1:3:3:5:_]
(donde_
representa un desconocido). La combinación de~c
y:{…l2}a
efectivamente divide esto en grupos de 2 elementos, y nos aseguramos de que todos los grupos sean iguales. A medida que aplanamos (duplicamos la longitud), eliminamos un elemento desde el principio y agregamos uno al final (sin cambios), y lo agrupamos en pares (reduciendo a la mitad la longitud), esto tendrá la misma longitud que la cadena original de dominó.La instrucción "decapitar" fallará si no hay fichas de dominó en la entrada (en realidad, IIRC
:pa
también fallará; noa
le gustan las listas vacías), por lo que necesitamos un caso especial para 0. (Una gran razón por la que tenemos la asimetría entreb
y~k
es que tampoco necesitamos un caso especial para 1.)fuente
Brachylog , 29 bytes
Pruébalo en línea!
Estoy bastante seguro de que esto es terriblemente largo, pero lo que sea. Esto también es muy lento.
Explicación
La razón por la que esto encontrará el más grande es porque
s - subset
genera puntos de elección del subconjunto más grande al más pequeño.fuente
Mathematica, 191 bytes
Se puede jugar al golf un poco, estoy seguro. Pero básicamente el mismo algoritmo que en la respuesta Brachylog de Fatalize , con una prueba ligeramente diferente al final.
fuente
Differences/@Rest@Flatten@#~Partition~2
lugar deDifferences/@Partition[Rest@Flatten@#,2]
(Infix
tiene mayor prioridad queMap
)JavaScript (Firefox 30-57), 92 bytes
l
es el último valor, oundefined
para la invocación inicial.l-n
es, por lo tanto, un valor falso si se puede jugar al dominó.d
es el dominó bajo consideración.n
es el final del dominó bajo consideración para encadenar al dominó anterior. El otro extremo puede calcularse fácilmente comod[0]+d[1]-n
.0,
simplemente maneja el caso base de dominó no jugable.fuente
Haskell ,
180 134131117 bytesPruébalo en línea! El nuevo enfoque resultó ser más corto y más eficiente. En lugar de todas las permutaciones posibles, solo se crean todas las cadenas válidas.
Editar: La versión de 117 bytes es mucho más lenta nuevamente, pero aún más rápida que la fuerza bruta.
Viejo método de fuerza bruta:
Esta es una implementación de fuerza bruta que intenta todas las permutaciones posibles (el número de permutaciones posibles parece ser dado por A000165 , el " factorial doble de números pares "). Pruébelo en línea apenas administra entradas de hasta 7 (lo cual es impresionante ya que 7 corresponde a 645120 permutaciones).
Uso:
fuente
Python 2, 279 bytes
Golfizado:
Pruébalo en línea!
Lo mismo con algunos comentarios:
Estoy publicando porque no vi ninguna respuesta de Python ... alguien verá mi respuesta y, disgustado, se verá obligado a publicar algo mucho más corto y eficiente.
fuente
Clojure,
198183bytesActualización: Mejor manejo del "máximo de secuencia posiblemente vacía"
Version anterior:
Convenciones de convocatoria y casos de prueba:
F
devuelve elementos de la listaC
sin el elementoa
,M
devuelve el máximo de ingerers de entrada o 1.L
es la función principal, cuando se llama con un solo argumento, genera todas las piezas iniciales posibles y encuentra la longitud máxima para cada una de ellas. Cuando se llama con dos argumentos,l
es el primer elemento de la secuencia con el que debe coincidir la siguiente pieza yR
es el resto de las piezas.Generar permutaciones y "elegir un elemento y dividir para descansar" fue bastante difícil de implementar de manera sucinta.
fuente