Estaba navegando por Stackoverflow y vi esta pregunta sobre cómo colocar un mosaico en un rectángulo MxN, y pensé que sería genial para jugar al golf. Aquí está la tarea.
Dadas las dimensiones M y N, escriba un programa que muestre de cuántas maneras únicas puede rectificarse un rectángulo MxN (N es el número de filas, no columnas. No es que realmente importe) dadas estas restricciones.
- Todas las fichas son 2x1 o 3x1
- Todos los mosaicos permanecen dentro de su fila (es decir, todos son horizontales)
- Entre cada dos filas adyacentes, los mosaicos no deben alinearse, excepto en los dos extremos.
- M y N están garantizados para ser al menos 1
Por ejemplo, un mosaico válido de una matriz de 8x3 sería
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|_____|___|
|___|_____|_____|
Pero lo siguiente no sería válido, porque las filas se alinean
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|___|_____|
|_____|_____|___|
Casos de prueba:
8x3: 4
3x1: 1
1x1: 0
9x4: 10
Código de golf, por lo que gana la respuesta más corta.
2x1
o3x1
? ¿También es la salida para4x1
cero?|
s no contribuya a la longitud de la fila, mediante el uso de una representación como esta (donde, si no hay una tubería (|
), hay un espacio).Respuestas:
Jalea , 20 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 119101106
9691 bytesPruébalo en línea!
Comentado
fuente
R ,
243231 bytesPruébalo en línea!
Versión con saltos de línea:
Tenga en cuenta que no hay recursión y maneja valores bastante grandes de myn (por ejemplo, 24x20 -> 3.3e19)
Aquí hay una respuesta comentada que funciona más o menos igual que la anterior, pero desactivé todas las funciones, por lo que en realidad es legible:
El método para tomar una matriz y multiplicarla repetidamente por sí mismo proviene de una pregunta sobre stackoverflow . Este enfoque funciona aquí porque calcula efectivamente el número acumulado de ramas a través de las diferentes filas posibles de ladrillos.
Si se permiten paquetes externos, puedo bajarlo a 192:
fuente
Jalea , 26 bytes
Pruébalo en línea!
Desglosado:
Genere una lista de posibles muros como sumas acumulativas con el final eliminado:
Encuentre la tabla exterior de todos los muros posibles uno contra el otro que no tengan intersecciones:
Lleve esta matriz al poder de (N-1) y luego sume todo:
Utiliza el primer bit de la respuesta de @ EriktheOutgolfer para generar la lista de posibles muros, y luego usa el enfoque de intersección de matriz y exponenciación de matriz de mi respuesta R. Como tal, funciona bien incluso con grandes N. Esta es mi primera respuesta de Jelly, y sospecho que se puede jugar más. Idealmente, también me gustaría cambiar la primera sección para que los requisitos de tiempo y memoria no escalen exponencialmente con M.
fuente
05AB1E , 42 bytes
Estoy casi avergonzado de publicar esto, y definitivamente se puede jugar MUCHO con un enfoque diferente, pero como me llevó un tiempo completarlo, decidí publicarlo de todos modos y jugarlo desde aquí. El desafío parece más fácil de lo que es, pero definitivamente estoy usando un enfoque incorrecto aquí y tengo la sensación de que 05AB1E podría hacer alrededor de 25 bytes.
Pruébalo en línea. NOTA: No solo es largo, también es ineficiente, ya que el
9x4
caso de prueba se ejecuta en aproximadamente 40 segundos en TIO.Explicación:
fuente
Carbón , 89 bytes
Pruébalo en línea!El enlace es a la versión detallada del código. Funciona para rectángulos de un tamaño de hasta aproximadamente 12 en TIO, pero podría hacerse aproximadamente tres veces más rápido a un costo de 2 bytes mediante el giro de bits en lugar de la intersección de la lista. Explicación:
Ingrese el ancho.
Comience con una fila sin ladrillos.
Comience sin filas completadas.
Pase sobre las filas.
Pase sobre los ladrillos.
Agregue el ancho de ladrillo al ancho de fila actual.
Si esto da como resultado el ancho de entrada, agregue esta fila a la lista de filas completadas.
De lo contrario, si esto es aún menor que el ancho de entrada, agregue la nueva fila a la lista de filas, lo que hará que sea recuperada por una iteración posterior.
Haga una lista de paredes de una fila.
Pase sobre uno menos que la altura.
Guarda la lista de paredes.
Borrar la lista de paredes.
Recorre la lista guardada de muros.
Pase sobre las filas completadas.
Si la fila se puede agregar a este muro, agréguelo a la lista de muros.
Salida de la longitud de la lista final de paredes.
fuente