¡Mira! ¡Es un laberinto ASCII! Soo coolzors, bolas de asombro y esas cosas.
+-+-----+---+
| | | |
| | ++ | |
| | ++ +-+ |
| | |
+-------+ | |
| | |
+---------+-+
Pero, pero, pero ... es un dolor determinar en qué dirección van todas las partes del laberinto. Solo quiero dibujar el diseño y el laberinto se hace mucho más grande sin mucho tiempo.
¿Y si pudiera dibujar esto en ...
#############
# # # #
# # ## # #
# # ## ### #
# # #
######### # #
# # #
#############
¡Eso sería muy dulce!
Las reglas (porque las reglas son frías):
- Escriba código para convertir una cadena en un laberinto ascii y generar el resultado.
- Cualquier carácter que no sea un espacio en blanco se leerá como un muro.
- Cada personaje de muro decidirá qué personaje se basará en sus vecinos (solo en las direcciones Norte, Sur, Este y Oeste).
- Si un carácter no tiene vecinos que no sean espacios en blanco, será un signo más (+).
- Si un personaje tiene vecinos en ambas direcciones vertical (Norte-Sur) y horizontal (Este-Oeste), será un signo más (+).
- Si un personaje tiene vecinos solo en dirección vertical (Norte-Sur), será un símbolo de tubería (|).
- Si un personaje tiene vecinos solo en dirección horizontal (Este-Oeste), será un signo menos (-).
- La entrada puede ser una sola cadena (con líneas separadas por caracteres de nueva línea o una matriz de cadenas).
- Todos los caracteres de entrada serán caracteres ASCII imprimibles, no necesita lidiar con caracteres extendidos.
- Use cualquier idioma antiguo que desee.
- Si hay un espacio en blanco antes de una línea, debe ser la misma cantidad en cada línea. Cualquier espacio en blanco después de cada línea de salida está bien.
- Intenta resolverlo con el menor número de bytes.
Casos de prueba:
1: marco
Entrada:
##########
# #
# #
# #
##########
Salida:
+--------+
| |
| |
| |
+--------+
2: laberinto clásico
Entrada:
#################
# #
# ##### # ##### #
# # # # # #
# # # # ##### # #
# # # # #
### # ####### # #
# # # # # #
# ### # ## # ##
# # ## #
#################
Salida:
--------+-------+
| |
| --+-+ | ----+ |
| | | | | |
| + | | +---- | |
| | | | |
+-- | +----+- | |
| | | | | |
| --+ | ++ | -+
| | ++ |
+-----+-++----+--
3: Huevos verdes, hombre.
Entrada:
I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!
Salida:
| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++
4: carámbanos
Entrada:
Word Icicle!
Word Icicle
Word cicle
ord cicle
ord icle
ord i le
or i le
or i l
or l
or
r
Salida:
++++ ++++++-
++++ ++++++
++++ +++++
+++ +++++
+++ ++++
+++ | ++
++ | ++
++ | |
++ |
++
|
---
?-
s o por qué el laberinto clásico no tiene cuatro+
s en la fila inferior.smallest number of characters
, no bytes?+
en el medio de la primera fila 2) el!
de Icicles debería reemplazarse por a-
. ¿Podría, por favor, verificar estos dos?whitespace
, ¿te refieres solo al espacio? No quiero tener que soportar pestañas y probablemente tampoco quieras que transforme nuevas líneasRespuestas:
APL (Dyalog Unicode) ,
5735 bytes SBCS–22 gracias a una nueva solución de ngn .
Función tácita anónima que toma una matriz de caracteres como argumento.
Pruébalo en línea!
{
…}⌺3 3
En cada vecindario de 3 por 3, aplique la siguiente función:,⍵
ravel (aplanar)' '≠
Booleano donde no espacio⍱∘⌽⍨
que NOR es inverso (incl. ni superior ni inferior, ni izquierda ni derecha)5 4 2⊃¨⊂
recoger 5 º , 4 º , y 2 nd elemento de toda esa listaes decir, auto vacía, no vertical, no horizontal
2⊥
evaluar en base-2 (binario)es decir ≥4: auto vacío; 3: sin vecinos; 2: sin vecinos horizontales; 1: sin vertical; 0: tiene ambos
'+-|+'↓⍨
gota que muchos elementos de esta cadenaes decir, auto vacío:
; solo:
+
; vecino (s) vertical (es) solamente|+
:; horizontal:-|+
; ambos:+-|+
⊃
recoger el primer elemento (almohadilla con espacio si no están disponibles)es decir, auto vacío:
+
; vecino (s) vertical (es) solamente|
:; horizontal:-
; ambos:+
Vieja solución
Función tácita anónima que toma una matriz de caracteres como argumento.
Pruébalo en línea!
{
…}⌺3 3
En cada vecindario de 3 por 3, aplique la siguiente función:,⍵
ravel (aplanar)(
…)/
Filtrar usando la siguiente máscara:9⍴0 1
reformar cíclicamente[0,1]
a la longitud 9 (selecciona N, W, E, S)' '≠
Booleano donde no espacio1⌽
gire un paso a la izquierda;[W,E,S,N]
2 2⍴
remodelar a matriz 2 por 2;[[W,E],[S,N]]
∨/
reducción OR por fila:[horizontal,vertical]
(
...)
aplique la siguiente función tácita:⊢
la identidad;[horizontal,vertical]
∧/,
precedido por su reducción Y;[both,horizontal,vertical]
(
...),
anteponer lo siguiente:,⍵
desentrañar el barrio5⊃
recoger el 5 º elemento (en sí misma)' '=
Booleano si espacio (es decir, vacío)Ahora tenemos
[empty,both,horizontal,vertical]
1⍳⍨
índice del extremo izquierdo 1 (da 5 si no hay vecinos)' +-|+'⊃⍨
usar eso para elegir el símbolofuente
JavaScript (ES6), 110 bytes
Formato de E / S: conjunto de cadenas.
Pruébalo en línea!
O 108 bytes usando una matriz de caracteres en su lugar.
fuente
Python 2 ,
181168 bytesgracias a Leaky Nun por -13 bytes
Pruébalo en línea!
fuente
MATLAB,
113110101 bytesConvierte la entrada a lógica, aplica convolución en horizontal y vertical y combina las salidas para hacer los caracteres correspondientes.
@Adriaan guardó 3 bytes por decirme que puede obstruir la salida en PPCG: P
¡9 bytes guardados gracias a numerosos comentarios de @flawr!
fuente
J ,
4947 bytes¡Gracias a FrownyFrog por -2 bytes!
Pruébalo en línea!
fuente
Retina 0.8.2 , 92 bytes
Pruébalo en línea! Requiere entrada rectangular. El enlace incluye casos de prueba. Explicación:
Cambiar todos los no espacios a
0
s.Busque todas las
0
s con otra0
inmediatamente arriba o abajo en la misma columna y cámbielas a 1. Las1
s son ahora los lugares con vecinos verticales, mientras que las0
s no tienen vecinos verticales.Busque todos los dígitos sin vecinos horizontales. Los
0
s tampoco tienen vecinos verticales, por lo que se convierten en+
s, mientras que los1
s tienen vecinos verticales, por lo que se convierten en|
s.Los dígitos restantes tienen vecinos horizontales. Los
1
s también tienen vecinos verticales, por lo que se convierten en+
s, mientras que los0
s solo tienen vecinos horizontales, por lo que se convierten en-
s.fuente
Python 3 , 336 bytes
Pruébalo en línea!
Tuve que usar mucho código para lidiar con los errores de caso límite.
fuente
C (gcc) , 143 bytes
Pruébalo en línea!
La función f modifica una matriz de cadenas en el lugar. El área alrededor de la matriz debe rellenarse con espacios (un poco restringidos). Aunque esto no cumple exactamente con los requisitos que la mayoría de las soluciones están usando, sí se ajusta a las reglas si decimos que representamos una nueva línea con dos espacios (y tomamos una serie de cadenas que terminan en nuevas líneas).
Sin golf
Este fue un desafío divertido de la aritmética de punteros. Usando la iteración de puntero estilo C es fácil obtener los vecinos horizontales, pero los verticales fueron más difíciles. Afortunadamente, el puntero y todavía está alrededor (que apunta al valor inicial de z) para que pueda deducir mi índice de él y usarlo para acceder al mismo elemento en una fila diferente. ¡Me sentí muy mal escribiendo
y[-1][z-*y]
ya que vuela frente a cualquier estilo razonable!fuente