(Inspirado mientras dibuja en una pizarra)
Desafío:
Dada una cadena de entrada que contiene caracteres que representan diferentes colores de marcadores de borrado en seco en una pizarra blanca, genera el orden en el que fueron dibujados, del primero al último.
Entrada:
Una cadena que contiene colores de marcadores de borrado en seco que están representados por letras alfabéticas (las mayúsculas son diferentes a las minúsculas, puede sustituir cualquier carácter utilizado en mis ejemplos siempre que cada color tenga una letra distinta). El resto de la pizarra será espacio en blanco. Solo habrá una línea de cada color por tablero. No habrá entradas donde todas las líneas se superpongan entre sí (ver caso de prueba 4
). Todas las líneas serán rectas y horizontales o verticales.
Salida:
El orden en que se dibujaron las líneas en el tablero, desde el primero hasta el último. Si hay varias soluciones para cualquier entrada, puede generar cualquiera de ellas. La salida se puede formatear de cualquier manera que prefiera: una sola cadena de caracteres o separada por espacios, nuevas líneas, etc. siempre que los caracteres utilizados coincidan con los utilizados en su entrada.
Casos de prueba:
Entrada 1:
R
R
BBRBB
R
Salida 1:
BR
Entrada 2:
GY
GY
RRRRGYRRR
GY
GY
BBBBBBBB
GY
GY
Salida 2:
RGYB // or RYGB
Entrada 3:
R P
R P
AAAARAAAAPA
R P
R P
GGGGRGGG P
R
Salida 3:
AGPR // or APGR
Entrada 4:
O Y
RRRYR
O Y
GOGGG
O Y
Salida 4:
// Undefined, does not need to be handled by your program
Entrada 5:
YYYB
B
B
Salida 5:
// YB or BY
Reglas:
Este es el código de golf , por lo que gana el código más corto en bytes.
Respuestas:
Perl, 103 + 2 = 105 bytes
Ejecutar con
-n0
(penalización de 2 bytes).Explicación:
Una leve sutileza aquí viene con información como esta:
Mira la cuarta línea aquí. Si el orden de escritura fuera BACBD, realmente podría haber una línea horizontal de
B
s a lo largo de allí sin violar ninguna de las suposiciones del problema (aparte de eso, solo hay una línea de cada color, algo que no verificamos). Para evitar esto, nos aseguramos en la última expresión regular de que cada línea comience con una letra (o dígito o guión bajo, pero eso es imposible), y confiamos en el hecho de que las líneas paralelas se encontrarán de izquierda a derecha y arriba -hasta abajo (porque la expresión regular encontrará la primera coincidencia dentro de la cadena). Como tal, el primer carácter de cada línea ambigua aquí se sobrescribe antes de que la línea misma se vea como una coincidencia, y eso evita la coincidencia de expresiones regulares.fuente
perl -n0E '/.*/;for$i(/(\S)(?=(?:(?:.{@{+}})?(?:\1| ))*(?!.*\1))/gs){/.*/;unless(/$i+[^$i\s]+$i/||/$i(.{@{+}}[^$i ])+.{@{+}}$i/s){$r="$i$r";s/$i/ /g;last}}/\S/?redo:say$r'
(que requiere que las líneas de entrada se rellenen a la derecha con espacios para que tengan la misma longitud))Python 2, 199 bytes
Esto terminó mucho más de lo que inicialmente pensé que sería. Aparte de esto
rindex
, podría ver esto como un muy buen programa para traducir a Pyth.Toma una lista de líneas y genera una lista de caracteres. El código genera permutaciones de forma recursiva, asegurándose de que ninguna de las líneas dibujadas se dibuje encima de la línea actual.
El código abusa de muchas características de Python, por ejemplo, tomar
w
el poder de un booleano, probar conjuntos vacíos al verificar subconjuntos de{0}
(ya que mis conjuntos nunca contienen no cadenas) y mi favorito, distinguir cualquier lista deNone
verificar si la representación es mayor queZ
.Código explicado
fuente