Reto
Se le dará una tabla como entrada, dibujada con ASCII |
y _
. Su tarea es colocar las sillas a su alrededor.
Ejemplo
Entrada:
____
| |
| |
| |
| |
|____|
Salida:
_^_^_
< >
| |
< >
| |
<_ _ _>
v v
Esas sillas están hechas de <>
y v^
.
Otro ejemplo:
La línea debe tener tantas sillas como sea posible.
_____
| |_____
| |
| |
| |
| _____|
|_____|
_^_^_
< |_^_^_
| >
< |
| |
< _ _ _>
|_ _ _| v v
v v
Debe haber espacios entre cada silla. Y >_^_^_<
no es válido, debería serlo |_^_^_|
.
_____ _____
| |_____| |
| |
| |
| |
| ___________|
|_____|
_^_^_ _^_^_
< |_^_^_| >
| |
< >
| |
< _ _ _ _ _ _>
|_ _ _| v v v v v
v v
No se pueden colocar sillas en el interior de una "dona".
_________________
| _____ |
| | | |
| | | |
| |_____| |
|_________________|
_^_^_^_^_^_^_^_^_
< _____ >
| | | |
< | | >
| |_____| |
<_ _ _ _ _ _ _ _ _>
v v v v v v v v
^
y v
priorizar <
y >
. No hay silla sola (debe tener al menos una |
o _
en la fila).
_________________
| _____ |
| | | |
| | |_____|
| |_____
|___________|
_^_^_^_^_^_^_^_^_
< _ _ _ >
| | v v | |
< > <_ _ _>
| |_^_^_ v v
<_ _ _ _ _ _|
v v v v v
Este es el código de golf, por lo que gana el código más corto.
Respuestas:
Python 2,
10331007924879829787713699692691688687672670664659654648643642630625623620570560554545518514513510505492476454451443 bytes6 bytes guardados gracias a Riley
6 bytes guardados gracias a Adnan
Como esta pregunta tiene más de un año y todavía no tiene respuestas, pensé en intentarlo.
Pruébalo en línea!
El programa lee la mesa en un archivo llamado
I
e imprime la mesa con sus sillasstd::out
. No estaba seguro acerca de un montón de casos límite, así que tomé mi mejor juicio (lo que tomó el menor esfuerzo) pero parece pasar todos los casos de prueba. Algunas de las salidas no coinciden exactamente, pero todas tienen el mismo número de sillas.Explicación
La primera línea simplemente establece algunas definiciones que nos ahorrarán bytes en el futuro:
(Descomprimiré estas macros para facilitar la lectura en líneas futuras)
Luego abriremos un archivo llamado
I
porque ya tenemos una variable que es la abreviatura de eso, por lo que ahorra algunos bytes.Nos dividimos a lo largo de las nuevas líneas para crear una lista de cadenas (las filas de la imagen)
Luego encuentro la longitud de la línea más larga para poder rellenar todas las líneas a esa longitud. (También agrego 3 porque necesitamos un poco de relleno adicional)
Luego realizamos el relleno real y creamos un borde de
I
caracteres alrededor del borde. Esto se debe a que más adelante tendremos que diferenciar entre el interior y el exterior de la forma. También cambiaremos el tipo de datos de una lista de cadenas a una lista de caracteres (cadenas de longitud 1).La siguiente línea es solo otra definición para guardar bytes.
(También desempacaré este)
Ahora queremos difundir los
I
personajes a todas partes fuera de la forma. Podemos hacer esto con un autómata pseudocelular. Cada unoI
se extenderá a cualquierpersonaje adyacente . Podríamos repetir hasta que el autómata se estabilice, sin embargo, esto no puede tomar más iteraciones de las que hay caracteres, por lo que simplemente recorremos cada carácter en
b
(la entrada original)Para cada iteración, queremos pasar sobre cada carácter en la lista 2D (excluyendo el relleno más externo)
Para cada posición ejecutamos el siguiente código:
Vamos a romper esto.
Tenemos un if con dos condiciones separadas por un
&
(bit a bitand
)El primero simplemente verifica si hay un
I
en cualquiera de las celdas adyacentes y el segundo simplemente verifica si la celda actual es a" "
. Si pasamos esas condiciones, establecemos que la celda actual sea anI
.Ahora que hemos determinado el exterior y el interior de la forma, podemos comenzar a colocar las sillas alrededor de la mesa.
Una vez más, recorremos todas las celdas (y establecemos algunas más shorthands)
Ahora aquí está mi parte favorita. Si hasta ahora has recorrido mi aburrido golf, principalmente basado en la definición, te recompensaré con un buen truco de golf inteligente (si lo digo yo mismo).
Un poco de historia en python:
En Python, si intenta asignar una clave de diccionario dos veces, asigna la última. Por ejemplo
Abusaremos de esta propiedad para asignar la celda actual a un personaje en particular.
La primera condición es
Si la celda está en el medio de un borde de 3
_
caracteres, reasignaremos la celda actual y la celda debajo de ella. Lo asignaremos al resultado de indexar un diccionario sobrecargado porI
. Primero establecemos nuestro valor predeterminado con el par,"I":"_"+a[x+1][y]
esto significa que si no hay cambio, asignaremos las dos celdas a sus valores originales. A continuación agregamos el para[x-1][y]:"^ "
. Esto no hará nada (importante) a menos que la celda sobre la actual (a[x-1][y]
) esté llena de unI
. Si tiene una entradaI
, anulará el valor predeterminado que nos indica que coloquemos una silla en la celda actual. A continuación, pasamos a la celda debajo de la celda actual si esa celda seI
anula nuevamente para colocar una silla hacia arriba debajo del punto actual.La siguiente condición es un poco más simple
Verificamos si la celda actual y la celda superior son ambas
|
. Si es así, creamos un diccionario.El primer par en el diccionario
"I":"|"
establece el valor predeterminado. Dado que vamos a acceder a la claveI
siI
no se reasigna, volverá por defecto a|
(el carácter que ya es) y no hará nada.Luego, agregamos las dos teclas.
A[y+1]:">",A[y-1]:"<"
Si cualquiera de las dos celdas a la izquierda y a la derecha lo sonI
, reasignará la celda actual a una silla que apunte en la dirección del exterior.Ahora solo tenemos que dar salida. Sin embargo, no podemos simplemente imprimir, hay un par de cosas de limpieza que tenemos que hacer primero. Tenemos que convertir de nuevo a una cadena y eliminar todos los
I
correos electrónicos que creamos. Esto se hace en una línea.fuente
i,o="I "
lugar dei="I";o=" "
trabajar?n
costos cuesta 4 bytes y me ahorra 6. Aunque no lo uso a menudo, ahorra 2 bytes.