El propósito de este desafío es determinar si una colección de piezas unidimensionales se puede colocar en mosaico para formar un trozo continuo finito.
Una pieza es una secuencia finita no vacía de ceros y unos que comienza y termina con uno. Algunas piezas son posibles 1
, 101
, 1111
, 1100101
.
Mosaico significa organizar las piezas de manera que se forme un bloque contiguo de unidades. Un uno de una pieza puede ocupar el lugar de un cero, pero no de un uno, de otra pieza.
De manera equivalente, si consideramos que uno es "material sólido" y un cero como "agujero", las piezas deben encajar para formar un solo tramo, sin dejar ningún agujero.
Para formar un mosaico, las piezas solo se pueden desplazar a lo largo de su espacio unidimensional. (No se pueden dividir ni reflejar). Cada pieza se usa exactamente una vez.
Ejemplos
Las tres piezas 101
, 11
, 101
se pueden embaldosar como se muestra en la siguiente, donde cada pieza está representado con el cambio requerido:
101
11
101
entonces el mosaico obtenido es
111111
Como segundo ejemplo, las piezas 11011
y 1001101
no pueden ser en mosaico. En particular, el cambio
11011
1001101
no es válido porque hay dos que chocan; y
11011
1001101
no es válido porque el resultado contendría un cero.
Reglas adicionales
La entrada es una colección de una o más piezas. Se permite cualquier formato razonable; por ejemplo:
- Una lista de cadenas, donde cada cadena puede contener dos caracteres diferentes y consistentes;
- Varios conjuntos, donde cada conjunto contiene las posiciones de unos para una pieza;
- Una lista de enteros (impares) como la representación binaria de cada número define una pieza.
La salida debe ser un valor verdadero si es posible un mosaico, y un valor falso de lo contrario. Los valores de salida no necesitan ser consistentes; es decir, pueden ser diferentes para diferentes entradas.
Se permiten programas o funciones , en cualquier lenguaje de programación . Las lagunas estándar están prohibidas.
El código más corto en bytes gana.
Casos de prueba
Cada entrada está en una línea diferente
Verdad
1
111
1, 1
11, 111, 1111
101, 11, 1
101, 11, 101
10001, 11001, 10001
100001, 1001, 1011
10010001, 1001, 1001, 101
10110101, 11001, 100001, 1
110111, 100001, 11, 101
1001101, 110111, 1, 11, 1
Falsa
101
101, 11
1, 1001
1011, 1011
11011, 1001101
1001, 11011, 1000001
1001, 11011, 1000001, 10101
fuente
101101
serían verdaderas, aunque ningún número finito de ellas dé como resultado un bloque contiguo.Respuestas:
Jalea , 15 bytes
Toma una lista de índices y devuelve un entero positivo (verdadero) o 0 (falso).
Pruébalo en línea! o verificar la mayoría de los casos de prueba .
fuente
JavaScript (ES6),
747370 bytesToma datos como una matriz de enteros de 32 bits. Devuelve un booleano.
O 66 bytes con valores de verdad / falsedad invertidos:
Casos de prueba
Mostrar fragmento de código
¿Cómo?
fuente
Casco , 16 bytes
Toma una lista de listas de índices basados en 1. Pruébalo en línea!
Explicación
fuente
Jalea , 16 bytes
Un enlace monádico que toma una lista de listas de unos y ceros que devuelven
1
(verdad) o0
(falsey).Pruébalo en línea! o vea un conjunto de pruebas (acortado: los primeros 6 falseys seguidos de los primeros ocho trueys, ya que los cuatro largos tardan demasiado en incluirse debido al uso del producto cartesiano).
¿Cómo?
fuente
Python 2 , 159 bytes
Pruébalo en línea!
fuente
Jalea , 16 bytes
Pruébalo en línea!
-1 byte gracias al Sr. Xcoder
Desarrollé esto completamente independiente de Jonathan Allan, pero ahora mirarlo es exactamente lo mismo:
fuente
J 74 bytes
Podría intentar hacerlo tácito más tarde, pero por ahora es un verbo explícito. Explicaré la versión sin golf. Toma una lista de enteros en caja y retornos
1
(verdadero) o0
(falso).Pruébalo en línea!
fuente