Introducción
Arithmetic Gaol es una instalación especial que encarcela números enteros positivos. Sin embargo, recientemente, los enteros positivos han estado tratando de escapar. Por lo tanto, los guardianes han decidido, um, eliminar algunos de los enteros positivos para enviar un mensaje a los otros enteros. Han contratado a un ingeniero de software para escribir un programa para averiguar qué enteros eliminar para obtener el máximo efecto.
Descripción de entrada
La entrada se proporciona a través de STDIN, argumentos de línea de comando o una función de entrada de usuario (como raw_input
). No puede tenerlo como un argumento de función o una variable preinicializada (por ejemplo, este programa espera entrada en una variable x
).
La primera línea de entrada contiene un solo entero positivo n
donde 8 >= n >= 3
. A continuación hay n
líneas que contienen n
caracteres del conjunto [1,2,3,4,5,6,7,8,9]
. Aquí hay un ejemplo de entrada:
5
22332
46351
65455
24463
65652
Descripción de salida
Los guardias desean eliminar los números para que se cumplan las siguientes condiciones:
- En cada fila y columna de la cuadrícula resultante, ningún número aparecerá dos veces;
- No hay dos números eliminados que puedan ser adyacentes horizontal o verticalmente;
- Los números supervivientes deben formar un grupo contiguo ortogonalmente: será posible viajar de cualquier número superviviente a cualquier otro número superviviente que se mueva solo horizontal y verticalmente y nunca cruce ningún número eliminado.
Salida de la entrada (menos la primera línea), con los números eliminados reemplazados por #
.
Puede haber más de una solución. Si ese es el caso, puede generar cualquier solución.
También puede no haber solución. Si ese es el caso, envíe la cadenano answer
.
Aquí hay una salida posible para la entrada de ejemplo:
#2#3#
46351
6#4#5
24#63
#56#2
Ejemplo de entradas y salidas
Hay múltiples salidas para cada entrada, por lo que estas salidas son solo ejemplos.
Entrada:
5
46551
51565
32654
14423
43244
Salida:
46#51
#156#
326#4
1#423
#324#
Entrada:
7
7183625
1681563
5238564
8786268
1545382
3814756
5325345
Salida:
71#362#
#6815#3
5238#64
#7#62#8
154#382
3814756
#325#4#
Entrada:
8
21534768
75196287
68392184
96244853
44865912
76516647
89751326
43698979
Salida:
21#34768
#5196287
683#21#4
9#24#853
#4865912
7#51#64#
89751326
436#8#7#
Entrada:
4
2222
2331
3112
1322
Salida:
no answer
prompt
no permite la entrada de varias líneas.Respuestas:
Ruby,
346344329316 bytes, sl∞∞∞∞∞∞wEsto es código golf, no código rápido, así que ...
Úselo como:
El indicador
-W0
no es necesario, pero le sugiero que lo agregue para desactivar las advertencias o redirigirstderr
...Dime si tuviste suficiente paciencia para ejecutarlo en los ejemplos para n = 6,7,8
Registro de cambios
each
⇨map
, gracias a @NotThatCharlesregexp
s, similar a lo que sugirió @NotThatCharlesfuente
\d
es más corto que[^#]
en la penúltima línea;M.times.to_a
es más largo que(0..M-1).to_a
M.times.to_a
es 1 byte más corto que(0..M-1).to_a
;)(0...M).to_a
también funciona y tiene la misma longitud.Rubí -
541 ...,394El algoritmo básico es una búsqueda recursiva de duplicados en profundidad para seleccionar afirmativamente, mirando a través de la fila 1, luego la columna 1, luego la fila 2, etc., y verificando que dos vecinos no se eliminen y que la cuadrícula esté conectada (esa es la
break if
cláusula en allí, y lo que viene antes).Algunos buenos trucos:
if w[1]
es mucho más corto queif !w.one?
y si sabes que hay al menos un miembro, es el mismo resultado.Del mismo modo,
[0]
es más corto queany?
si no hay bloque, ys[j]
es un lindo atajo paraj<s.size
(técnicamente, es más comoj.abs<s.size
)Y
y%N+(y/N).i
es mucho más corto queComplex(y%N,y/N)
Además, cuando hay dos condicionales complicados para generar cadenas, puede ser más corto
[cond1?str1a:str1b,cond2?str2a:str2b]*''
que agregar todos los parens o#{}
s.Sin pretensiones y explicación:
(Esto es de la versión de 531 bytes. He realizado cambios. En particular, he eliminado la llamada al producto: solo resuelva un dígito por fila / columna a la vez, y J ahora es solo una matriz, indexada por enteros. Todas las coordenadas son solo enteros.)
H
calcula vecinosN
es el tamaño de la cuadrículaK
son las claves del mapa (números complejos)J
es el mapa de entrada (cárcel)k
son las llaves no asesinadasQ
es el principal método recursivoEl código se ejecuta con:
Registro de cambios
394 agregó la sugerencia de @ blutorange a continuación, y cortó mucha más manipulación
408 salida revisada una vez más. También use en
.min
lugar de.inject(:+)
ya que solo estoy tomando una fila de todos modos.417Cálculo de salida más corto
421 descartaron números complejos. Solo usa números enteros. Guardar un paquete
450 mejoras de entrada más
456 mejoras de entrada
462 mejoras incrementales - esp.
find
noselect
475 caídos
u
y aplastó al constructor de fila / col dupe503 solo resuelve un dígito duplicado por fila / columna a la vez.
530 uso en
map &:pop
lugar devalues
531 saca la lambda que hace que los dupes se arreglen
552 ¡Uy! se perdió un requisito
536 población marginalmente mejorada de dupes array (lo que era antes
d
)541 inicial
fuente
break
se puede usar en lugar dereturn
, puede guardar un byte más. Realmente me gusta este, muchos trucos y mucho más rápido.a
se usa solo una vez, podría hacer esoJ=gets(p).split*''
. ¿Has probado argumentos cli, ves mi respuesta?HTML + JavaScript ( ES6 ) 459
Usar un área de texto HTML para obtener entradas de varias líneas.
Para probar, ejecuta el fragmento en Firefox. Si lo desea, amplíe el área de texto, pegue la entrada dentro del área de texto (cuidado: entrada exacta, sin espacios adicionales en ninguna línea) y retírela. Se adjunta el resultado.
Método: una profundidad recursiva First Serarch. Encuentra soluciones no óptimas para todos los casos de prueba en segundos (es un buen juego de golf, pero una respuesta válida debería terminar para los casos de prueba comunes)
Primer intento
Método: un primer Serarch de profundidad, no recursivo, utilizando una pila de usuarios.
La función podría transformarse fácilmente en Breadth First Search, cambiar
l.pop
al.shift
, por lo tanto, usar una cola en lugar de una pila, pero es demasiado lenta y no estoy seguro de que pueda encontrar una solución óptima de todos modos.Mostrar fragmento de código
fuente