Introducción
Este desafío está inspirado en Grime , mi lenguaje de coincidencia de patrones 2D. Básicamente, se le da una "gramática" que describe cuadrículas de caracteres bidimensionales, y su trabajo es generar una cuadrícula de acuerdo con la gramática. Además, la cuadrícula debe ser lo más pequeña posible en cierto sentido débil.
Entrada
Su entrada es una cadena que contiene caracteres ASCII en minúsculas y los símbolos |
y -
. Para simplificar, la entrada no contiene caracteres en minúsculas repetidos. La cadena es una especificación para una clase de cuadrículas rectangulares de caracteres, y se analiza de izquierda a derecha utilizando una pila de la siguiente manera.
- Dado un carácter en minúscula
c
, empuje a la pila unam×n
cuadrícula del personajec
, para cualquieram, n ≥ 1
. - Dada una tubería
|
, revienta dos cuadrículasA
yB
desde la pila (B
estaba arriba), y empuja la cuadrículaAB
obtenida concatenandoB
a la derecha deA
. Esto requiere esoA
yB
tener la misma altura. - Dado un guión
-
, haga estallar dos cuadrículasA
yB
desde la pila (B
estaba en la parte superior), y empuje la cuadrículaA/B
obtenida concatenandoB
hasta el fondo deA
. Esto requiere esoA
yB
tener el mismo ancho.
Se garantiza que para algunas elecciones m
y n
realizadas durante el proceso de análisis (que puede ser diferente para cada letra), la especificación de entrada describe correctamente algún rectángulo, que se deja en la pila al final.
Salida
Su salida es una cuadrícula rectangular de caracteres especificados por la entrada. La cuadrícula debe ser mínima en el sentido de que eliminar cualquier fila o columna la invalidaría. Puede devolver una cadena separada por una nueva línea (con o sin una nueva línea final), una matriz 2D de caracteres o una matriz de cadenas, según el formato más conveniente.
Tenga en cuenta que no es necesario que procese la entrada exactamente como se describe anteriormente; Lo único importante es que su salida es correcta.
Ejemplo
Considere la especificación
par-s||e-
Primero, elegimos empujar un 1×2
rectángulo de p
y 1×1
rectángulos de a
y r
(la razón de esto se aclarará más adelante). Entonces, nos pop las a
y los r
rectángulos, y empujar a sus concatenación verticales
a
r
Luego, empujamos un 1×2
rectángulo de s
, lo sacamos y el rectángulo de arriba, y empujamos su concatenación horizontal
as
rs
Luego hacemos estallar ese rectángulo y el p
rectángulo, y empujamos su concatenación
pas
prs
Finalmente, empujamos un 3×1
rectángulo de e
, lo sacamos y el rectángulo de arriba, y empujamos la concatenación vertical
pas
prs
eee
Esta es la salida del programa, o al menos una de las posibilidades. Tenga en cuenta que aunque
ppas
ppas
pprs
eeee
también es generado por la especificación, no es una salida válida, ya que muchas de las filas y columnas podrían eliminarse.
Como un ejemplo más sutil, considere
co|m|p|il|e|r|-
Esta especificación genera el rectángulo
comp
iler
que es una salida válida Sin embargo, también genera
commp
iiler
que también es válido, ya que no se puede eliminar una sola fila o columna sin invalidarlo.
Reglas
Puedes dar un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba extra
Puede usarlos para probar su programa.
Input:
a
Output:
a
Input:
co|mp|l|-ex|i|f|-y|
Example output:
cccoy
mplly
exify
Input:
ja-r|g-o|ni-|ze|d-|
Example output:
jronze
arondd
ggoidd
Input:
un|co|p-yr|i|gh-t-ab|-|le-||-
Example output:
unnnnnnn
coyriggl
ppyrihhe
ppyritte
ppyriabe
fuente
n
ym
se eligen de forma no determinista. Se garantiza que existen valores adecuados para ellos, pero es el trabajo de su programa encontrarlos.un|co|p-|yr|i|gh--t-ab|-|le-||-
Es imposible ser válido. El último-
tiene una aridad de 2, mientras que solo hay 1 elemento en la pila.Respuestas:
K,
123110bytesUtilicé un enfoque similar a la solución de cartón_box.
Este programa es una serie de definiciones auxiliares seguidas de una función tácita que toma una cadena como argumento correcto. Reformatear para facilitar la lectura y asignar la función final como
f
:Use ejemplo:
Probado con Kona, pero también funcionará en OK si reemplaza el
:
en la definición def
a$
- k5 cambió la sintaxis de "cond".Un punto clave es reconocer que hacer un apéndice vertical es la transposición del apéndice horizontal de la transposición de ambas matrices. (Ver definición
v
.) Creo que todavía hay espacio para exprimir algunos caracteres aquí y allá. Si alguien está interesado en una explicación más detallada, puedo proporcionar una.editar:
Se actualizó el programa en la parte superior de esta entrada. Versión sin golf:
Las optimizaciones de longitud notables incluyen el uso de "aplicar punto"
a
, reemplazando el "cond" con la indexación de listaf
(menos eficiente, pero más corta) y reemplazando los términos del formularioa[b;c]
ena[b]c
donde lo permita la agrupación. Como ya no uso "cond" ni ninguna primitiva que sea diferente entre k3 y k5, esta versión ahora funciona en oK sin modificación.fuente
Prólogo, 539 bytes
Explicación
Comenzamos con un predicado
g
, que toma una cadena, la convierte como una lista de caracteres y llama alp
predicado (parse) con una pila vacía como segundo argumento.Predicate se
p
llama a sí mismo de forma recursiva con una pila adecuadamente modificada (busque[H|T]
patrones de desestructuración y de construcción) Cuando se invoca en el caso base, donde la lista de entrada está vacía,p
imprime el elemento único de la pila. Si la pila tiene menos o más de un elemento en este punto, significa que tenemos una cadena de entrada vacía, una cadena de entrada incorrecta o un error (con una cadena vacía, el predicado falla (dice PrologNo
), pero no se imprime nada, lo cual está bien, ya que no debemos imprimir nada para cadenas vacías).Resolviendo
La pila contiene una descripción de los rectángulos construidos, indicada
S:W:H
, dondeS
es una representación simbólica del rectángulo,W
su ancho yH
su altura (nota,A:B
es azúcar sintáctico para la:(A,B)
tupla con un functor llamado:
; es más corto de escribir que tener una tupla con notación de prefijo).Con las especificaciones
A
yB
sub-rectángulo,S
puede ser:h(A,B)
: concat horizontal de A y Bv(A,B)
: concat vertical de A y Bf(C)
: rellene con C, donde C es un código de caracteresLos anchos y las alturas de las cuadrículas son variables de programación de restricciones: durante la concatenación vertical (resp. Horizontal), el ancho (resp. Altura) de los rectángulos manipulados se unifica, mientras que la altura resultante (resp. Ancho) se limita a ser la suma de altura de cada subcuadrícula (ancho de resp.)
El paso de etiquetado al final del proceso instancia las variables mientras respeta las restricciones, utilizando los valores mínimos posibles (esta es una propiedad del orden por el que se prueban las soluciones).
Podría haber obtenido una respuesta más corta usando el mismo razonamiento que se hace en otras respuestas, sin restricciones, pero ahora es demasiado tarde.
Tenga en cuenta también que debido a que el dominio predeterminado para las variables está establecido en
1..100
, existe una limitación sobre los posibles tamaños de cuadrículas. El límite superior se puede cambiar si es necesario. Las implicaciones de rendimiento de esto son que podría tomar mucho tiempo determinar que una solución en particular no admite ninguna solución. Dije " podría " porque es probable que las restricciones reduzcan drásticamente la búsqueda exponencial. Si encuentra una cadena de entrada que es difícil / costosa de rechazar, por favor comparta.Impresión
La parte de impresión es interesante porque hay una especie de algoritmo de proyección de rayos sobre la estructura: itero sobre cada celda de la cuadrícula resultante, de punto
(1,1)
a punto(W,H)
y llamo alw
predicado para imprimir el contenido de la cuadrícula en el árbol principal, en esta ubicación (por supuesto, se imprime una nueva línea después de procesar cada línea).En
w
, las posiciones son relativas a la cuadrícula actual (la cuadrícula raíz define coordenadas absolutas).Cuando imprimo una
h(A,B)
estructura en un punto(X,Y)
, imprimo incondicionalmente en ambas ramas:A
en el punto(X,Y)
, yB
en el punto(H,Y)
, dondeH
esX
menos el ancho deA
.Las ramas de la hoja del árbol de la cuadrícula
f(C)
, finalmente imprimen el carácterC
, si la ubicación relativa está dentro de la cuadrícula, o no hacen nada. Así es como puedo imprimir el contenido de la cuadrícula en la secuencia de salida, de arriba a abajo, de izquierda a derecha. No se producen matrices reales.Pruebas
Prueba de carrera:
fuente
No actual arrays are produced.
así es como debe hacerse. Exagerar en este caso, ya que la gramática es muy simple y hay atajos.Python 2.7, 259
g
es una función que toma una especificación y proporciona una matriz 2D de caracteres. Si desea una versión más fácil de usar, agregue esta línea para que tome una especificación de stdin e imprima la cuadrícula:Casos de prueba
Explicación
La estrategia es simple: si una cuadrícula
G
es válida para una especificaciónS
, la repetición de la columna más a la derecha deG
también proporciona una especificación válida paraS
, y lo mismo es cierto con la repetición de la fila inferior (la prueba de esto es por inducción estructural activadaS
). Por lo tanto, cuando queremos concatenar dos rectángulos, simplemente podemos agregar la última columna / fila del más pequeño hasta que coincidan en tamaño (esto es lo que hace la función p).fuente
Haskell,
388367352 bytesUso:
f "par-s||e-"
->["pas","prs","eee"]
Prueba de funcionamiento con bonita impresión:
Cómo funciona: la función
#
analiza la cadena de entrada en la estructura de árbol,C
que es una hoja queL
contiene el carácter para imprimir o un nodoN
.N
puede ser a) una combinación de lado a lado (t==2
), b) una combinación de arriba a abajo (t==1
) o c) un cuadrado de una sola letra (t==0
). Todos los nodos tienen un campo de ancho y alto y un hijo izquierdo y derecho. Después del análisis,p
imprime el nodo raíz restante ajustando recursivamente el tamaño (ancho x alto) de sus nodos secundarios y uniéndolos.Editar: salida como una lista de líneas en lugar de una bonita impresión
fuente
JavaScript (ES6), 283
295Editar ahora esta solución JS (muy golfizada) es al menos más corta que la solución Python de referencia (bastante golfable).
Al igual que cartón_box, solo repite la columna de la izquierda o la fila superior.
Sin golf Esta es mi primera solución sin golf.
Prueba en la consola Firefox / FireBug
Salida
fuente
Python 3, 251 bytes
Aquí está la respuesta de referencia que prometí, jugar golf un poco más.
Este es un programa completo que toma la cadena de STDIN e imprime en STDOUT. El enfoque es el mismo que el de cartón_box: inserta una matriz 1x1 para un personaje y duplica filas si es necesario para la concatenación.
Explicación detallada
T
transpone una lista dada de listas. La mayor parte del trabajo se realiza mediantezip(*m)
el intercambio de filas en columnas, el resto solo convierte el resultado en una lista de listas, ya quezip
devuelve un generador de tuplas.E(a,b)
vuelvea
con su primer elemento repetido suficientes veces para que coincida con la longitud deb
. Tenga en cuenta que multiplicar una lista por un número negativo da la lista vacía, por lo que sib
es más corto quea
, esto devuelvea
.H(a,b)
devuelve la concatenación horizontal dea
yb
, alargándose la más corta porE
si es necesario.s
es la pilafor
bucle, iteramos sobre la cadena de entrada y la reemplazamoss
por un nuevo valor: si es|
(mayor quez
), sacamos dos valores y empujamos susH
, si es-
(menor quea
), sacamos dos valores, transponemos, alimentamosH
, transponer de nuevo y empujar el resultado, y de lo contrario empujar una matriz 1x1 con la letra.s
.fuente