Debes escribir un programa o función.
La entrada es un 'mapa' de números. Puede elegir tomar el mapa como una cadena con nuevos caracteres de línea ( \n
) o como una matriz 2D de cadenas.
Todos los mapas tienen 5 caracteres por 5 caracteres, y los caracteres son siempre dígitos mayores que 0 o espacios.
Aquí hay un ejemplo de un mapa:
12 45
11233
233
1
2 899
Su tarea es encontrar los componentes conectados en el mapa. Un componente válido es una serie de al menos tres dígitos idénticos ( no espacios ) conectados horizontalmente y / o verticalmente ( no diagonalmente ). Luego deberá reemplazar los caracteres de los componentes conectados válidos con sy imprimir o devolver ese resultado.x
Entonces, la salida para el ejemplo anterior sería:
x2 45
xx2xx
2xx
1
2 899
Aquí hay otro caso de prueba (gracias a Martin Ender):
Input:
2 3
4
1 5
111 6
11 7
Output:
2 3
4
x 5
xxx 6
xx 7
Este es el código de golf, ¡el código más corto en bytes gana!
fuente
Respuestas:
JavaScript (ES6),
171161139137136133132 bytesEsta es una traducción de mi respuesta de Python. E / S como matrices de caracteres.
Lástima que no haya una forma eficiente de hacerlo
sum
...fuente
Python 3,
238237200199192181 bytesDefine una función
f(a)
que toma la entrada como una matriz de caracteres y devuelve la misma matriz modificada. (Las matrices de caracteres son aceptables como cadenas de forma predeterminada ) .Sin disculpas con la explicación
El código modificado es recursivo, pero funciona igual.
fuente
Rubí, 304 bytes
ejemplo de uso:
el código reutiliza el método 'blot' para calcular la longitud de la ruta.
variables / métodos:
Intente una explicación más detallada:
haga una copia de la cadena de entrada, que usamos para encontrar la longitud de la ruta desde cualquier punto dado en el mapa.
defina una función anónima 'ps' (longitud de ruta) (lambda) que tome el índice del mapa i como argumento. devuelve la longitud del camino desde ese punto. Lo hace llamando al método 'b' (blot) para insertar x en una copia del mapa original y luego contando el número de x en la cadena devuelta.
la siguiente parte itera sobre cada carácter en el mapa (índice i, carácter s [i]). llama a la función 'b' (blot) en la posición del mapa i si la longitud del camino desde la posición i es mayor que 2, y si no es un espacio o un carácter de nueva línea.
la función b (blot) toma la cadena del mapa y un índice como argumento. Inicializa @v (matriz visitada) y llama a la función auxiliar b2.
la función b2 toma la cadena del mapa, una posición del mapa (i) y un carácter en la ruta actual (c). se llama recursivamente para reemplazar secciones conectadas de dígitos con el carácter 'x'. devuelve la cadena de entrada (esto es para que la función ps pueda llamar a scan () en el valor de retorno).
esto si la declaración verifica que la posición del mapa (i) dada está dentro de los límites de la cadena (0 ... s.size) y que el carácter en s [i] es el mismo que el carácter inicial. también @v [i] está marcado para evitar una recursión infinita.
Este es el bit que reemplaza el carácter en el índice (i) con el carácter 'x'. También marca ese índice como visitado.
Aquí es donde b2 se llama a sí mismo buscando recursivamente la ruta. i + 1 es un carácter a la derecha, i-1 es un carácter a la izquierda, i + 6 está una fila hacia abajo (5 dígitos + 1 nueva línea = 6 caracteres), i-6 está una fila hacia arriba.
fuente
C (Ansi),
243233179188 BytesGolfizado:
Con anotaciones:
}
Entrada:
Espera una nueva línea al principio y al final de la cadena.
Entrada de ejemplo:
Salida de ejemplo:
Actualizar
La reparación de la cuadrícula me permitió reducir casi 60 bytes.
fuente
Mathematica, 180 bytes
Explicación:
Función pura que acepta una
5x5
matriz.
es el carácter de uso privado de 3 bytes queU+F3C7
representa el operador de transposición postfix\[Transpose]
.(f=Flatten@#;p=Partition)
: Aplana la lista de entrada y la almacenaf
. Lo establecep = Partition
y lo devuelve.g=p[r,5]
: La matriz{{1,2,3,4,5}, ..., {21,22,23,24,25}}
(esto se debe a quer
se establece enRange@25
).Join[g=p[r,5],g]
: la lista de filas y columnas deg
.p[#,2,1]&
: Función pura que divide la lista#
en sublistas de longitud2
con superposición1
; es decir, la lista de pares adyacentes en#
.##&@@p[#,2,1]&
: Igual que el anterior, excepto que devuelve aSequence
.##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Asigna la función anterior de las filas y columnas deg
para obtener una lista de todas las entradas adyacentes eng
. Mi instinto dice que hay una forma más corta de hacer esto.r~Graph~Cases[...]
: Gráfico cuyos vértices son los enteros1, ..., 25
y cuyos bordes son los bordes entre las entradas adyacentes en lasg
que tienen las mismas entradas correspondientes en la matriz de entrada (que no sea" "
){a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Patrón que coincide de{a,b}
tal maneraf[[a]] == f[[b]]
(mismo valor en la matriz de entrada) y que no son iguales a" "
. EstablecerA = f[[a]]
para guardar el1
byte....:>a<->b
: Reemplace cada partido con un borde no dirigido de a a b.VertexComponent
: Devuelve el componente conectado del segundo argumento (un vértice) en el primer argumento (un gráfico).Tr[1^VertexComponent[...]]
: El tamaño del componente conectado. Guarda1
byte deLength@VertexComponent[...]
.If[Tr[...]<3,f[[#]],"x"]&
: Función pura que tiene una entrada#
eng
. Si el tamaño de su componente conectado es menor que3
, reemplácelo con la entrada correspondiente en la entrada. De lo contrario, reemplácelo con"x"
.(f=Flatten@#;p=Partition)[...,5]
: Y finalmente, rediseñar el resultado para que sea una5x5
matriz.fuente
Clojure, 188 bytes
Esto es bastante abrumador: D
Llamado así (toma un vector 1D de caracteres):
Demasiado perezoso para deshacerse de él, pero básicamente
for[m(range 30)]
visita cada índice y para cada índice el internolet[n(for[p[-1 -6 1 6]...(+ m p))]
hace una lista de 0 a 4 elementos que enumera las ubicaciones que tenían el mismo valor (1 - 9) que la ubicación intermedia. Si más de 1 vecino coincide con la pieza intermedia, significa que todos estos forman un grupo, por lo que esas ubicaciones se agregan al conjunto utilizado en(if((set(flatten(...)))i)
. Sii
se encuentra el índice del conjunto,\x
se emite y el valor original de lo contrario. Eso:when( ... )
es bastante interesante ...fuente