Cuando escribo documentación, comentarios, etc. Me encanta hacer tablas ASCII. Por lo general, terminan viéndose bastante bien, pero siempre siento que podrían verse aún mejor, especialmente porque UTF-8 / Unicode incluye los caracteres de dibujo de caja . Sin embargo, estos caracteres son muy pesados de usar y requieren varias pulsaciones de teclas para insertar. ¿Tu tarea? Escriba un programa o una función que pueda convertir automáticamente tablas ASCII al equivalente UTF-8 / Unicode.
Este desafío fue sandboxed .
Desafío
Escriba un programa que, dada una tabla ASCII como una cadena de entrada, muestre la tabla redibujada con los caracteres de dibujo de cuadro Unicode / UTF-8. Específicamente, los caracteres que forman parte de la tabla deben traducirse de la siguiente manera:
(Unicode, 3 bytes each in UTF-8)
- to ─ (\u2500)
| to │ (\u2502)
= to ═ (\u2550)
and + to one of:
┌ (\u250C), ┐ (\u2510), └ (\u2514), ┘ (\u2518),
├ (\u251C), ┤ (\u2524), ┬ (\u252C), ┴ (\u2534),
┼ (\u253C)
or, if '=' on either side:
╒ (\u2552), ╕ (\u2555), ╘ (\u2558), ╛ (\u255D),
╞ (\u255E), ╡ (\u2561), ╤ (\u2564), ╧ (\u2567),
╪ (\u256A)
Detalles
E / S:
- Se permite E / S predeterminada
- Puede tomar la entrada en cualquier formato razonable, incluida la tabla como una cadena, o una ruta a un archivo que contiene la tabla.
- Puede generar un archivo y tomar el nombre del archivo como argumento adicional.
- Sin embargo, no puede modificar el archivo de entrada . (Debe conservarse para facilitar la edición futura)
Entrada:
- Puede suponer que cada fila de entrada se ha rellenado para tener la misma longitud
.
- No puede suponer que el primer carácter después de una nueva línea es parte de los bordes de la tabla (ya que puede ser un espacio en blanco).
- La entrada se considera una tabla válida si todos los caracteres (que forman parte de la tabla)
-=|
están conectados a exactamente dos caracteres y+
están conectados a al menos un carácter tanto horizontal como verticalmente. - Su programa puede no producir ningún error con entradas válidas.
- Si la entrada no es válida, el comportamiento es indefinido y puede producir cualquier salida.
- La entrada puede contener caracteres UTF-8, incluidos los caracteres de dibujo de recuadro.
Salida:
- Cualquiera de los caracteres
-=|+
que no forman parte de la tabla debe dejarse como está. - Del mismo modo, cualquier otro personaje debe dejarse como está.
- Se permite una nueva línea inicial y / o final.
Otro:
- Las lagunas estándar están prohibidas, como de costumbre.
- Si su idioma preferido tiene una función integrada que resuelve este problema, no puede usarlo.
- Esto significa programas, funciones, subrutinas o instrucciones que serían presentaciones válidas para este desafío sin adiciones.
- Cada uno de los caracteres necesarios en este desafío tiene una longitud de tres bytes cuando están codificados en UTF-8.
Personajes conectados :
Un personaje está conectado a otro, si:
- Está
|
y está directamente arriba o abajo+
o|
; - Es
-
y es directamente antes o después+
o-
; - Es
=
y es directamente antes o después+
o=
; - Está
+
y está directamente arriba o abajo|
o+
, o está directamente antes o después-
,=
o+
.
Un personaje se considera parte de la tabla, si está conectado a algún personaje que sea parte de la tabla. Por definición, el primero +
en la entrada es una parte de la tabla.
Ejemplos
Ejemplos disponibles aquí como una versión copiable y pastable.
Input: Output:
+------------------+ ┌──────────────────┐
| Hello+World! | │ Hello+World! │
+==================+ ╞══════════════════╡
| This is+my first | -> │ This is+my first │
|+-+ code|golf +-+| │+-+ code|golf +-+│
|+-+chall|enge! +-+| │+-+chall|enge! +-+│
+------------------+ └──────────────────┘
+===+===+===+ ╒═══╤═══╤═══╕
| 1 | 2 | 3 | │ 1 │ 2 │ 3 │
+---+===+===+===+ ┌───╪═══╪═══╪═══╡
| 1 | 1 | 2 | 3 | │ 1 │ 1 │ 2 │ 3 │
+---+---+---+---+ -> ├───┼───┼───┼───┤
| 2 | 2 | 4 | 6 | │ 2 │ 2 │ 4 │ 6 │
+---+---+---+---+ ├───┼───┼───┼───┤
|-3 |-3 |-6 |-9 | │-3 │-3 │-6 │-9 │
+===+---+---+---+ ╘═══╧───┴───┴───┘
+-----+ -> <Undefined>
+-----+ -> ┌─────┐
+-----+ └─────┘
+-----------------+
| Hello, World! |
| This is invalid | -> <Undefined>
| input |
-----------------+
++++ ┌┬┬┐
++++ -> ├┼┼┤
++++ └┴┴┘
+--+
++++ -> <Undefined>
+--+
Finalmente...
Este es el código de golf , por lo que gana la menor cantidad de bytes. ¡Feliz golf!
+-+
no se considera que los extractos consecutivos forman una tabla conectada?Hello World
tabla, no se considera que las tablas internas formen una tabla porque el texto dentro de la tabla debe permanecer sin cambios, y no se consideran parte de los bordes de la tabla externa ya que no están conectadas a ellas correctamente.+----+
ejemplo, sería porque la dirección de las esquinas sería ambigua.Respuestas:
Python 3,
392281 bytesLo jugué un poco más y lo convertí en una solución recursiva en lugar de una iterativa:
Toma una cadena de filas de igual longitud separadas por nuevas líneas y devuelve una cadena en el mismo formato. Puede lanzar una excepción en una entrada no válida.
Solución previa:
Versión sin golf:
fuente
Python 3 ,
914898827823594587569540469 bytesEditar: cambió significativamente la estrategia, ahora haciendo un campo de bits de vecinos (similar a la respuesta de dead-zarigüeya). He dejado la versión anterior a continuación.
Pruébalo en línea!
La entrada tiene la forma de una lista de listas de caracteres, que se modifica en su lugar. Recurre desde el primer + que encuentra.
Pruébalo en línea!
Esto es lo más parecido que tengo a una versión sin golf:
fuente
JavaScript,
311307 bytesMostrar fragmento de código
Explicación
Comenzando en el primer
+
cruce encontrado , el programa intenta encontrar caminos a otros cruces en todas las direcciones, realizando reemplazos a medida que avanza. Almacena las direcciones encontradas y el estado de "doble borde" en un mapa de bits, que luego determina el carácter de unión apropiado.fuente
Python 3 , 599 bytes
No soy muy bueno jugando al golf en Python 3, pero (para mi vergüenza) no pude obtener la salida normal de caracteres UTF-8 en Python 2. Así que aquí estamos.
Supongo que el único truco interesante aquí es decidir la
+
transformación.He codificado todas las variantes posibles con direcciones de 4 bits. Cada bit de dirección se asemeja a la conexión a la celda vecina. Entonces 0 - sin conexión y 1 - conexión.
1111
is┼
0011
is┐
etc.
Algunas configuraciones de conexiones no son válidas y se reemplazan con valores ficticios:
'012┐45┌┬8┘0┤└┴├┼'
Si alguna celda de vecino contiene
=
, la segunda lista se usará con líneas duplicadas.La dirección se combina aquí.
r
contiene la longitud de cadena 8, donde cada dos caracteres son 1/0 y los caracteres reales vecinos.Por ejemplo:
1+0y1-1|
.Esto se utiliza para elegir la lista de sustituciones como se muestra anteriormente. Y luego contratado a la dirección:
int(r[0::2],2)
Esta lambda se usa para verificar que las coordenadas de la celda sean válidas y el char de la celda sea uno de '+ - | ='
Este lambda solía recibir carbón de la célula. Devuelve
' '
si las coordenadas no son válidas. (Definitivamente se puede jugar golf)Condiciones de recursión. Podría ser golfable también.
Pruébalo en línea!
fuente