Introducción
Observemos el siguiente cuadrado, que consta solo de los dígitos 0 - 9
:
1034
4167
8414
3542
La capa exterior de este cuadrado es:
1034
4 7
8 4
3542
Contiene ceros, por lo que debemos despegar la capa exterior, dejando:
16
41
La capa exterior de este cuadrado es:
16
41
No , no contiene ningún cero y por lo tanto es un no contaminado cuadrado. Básicamente, la definición de un cuadrado no contaminado es cuando la capa externa del cuadrado no contiene ceros.
La tarea
Dado un cuadrado de dígitos (que contiene solo números enteros no negativos) en cualquier formato razonable, genera el cuadrado no contaminado más grande despegando constantemente la cáscara externa, en cualquier formato razonable.
Casos de prueba
Caso de prueba 1:
Input Output
1234 1234
2345 2345
3456 3456
4567 4567
Caso de prueba 2:
Input Output
123 123
204 204
346 346
Caso de prueba 3:
Input Output
101 1
010
101
Caso de prueba 4:
Input Output
000 (none)
000
000
Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
416\n841\n354\n
(esquina inferior izquierda)?0
o algo así.Respuestas:
Jalea ,
1916 bytesPruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
JavaScript
10597 bytes¡Ahorré 8 bytes gracias a @Patrick Roberts!
Define la función
s
, que devuelve una matriz 2D de enteros cuando se proporciona una matriz 2D de enteros como entrada.Cómo funciona
función
l
: dada una matriza
, devuelve una copia sin su primer y último índice.función
p
: dada una matriz 2Da
, llamadasl
para eliminar la primera y última fila, luego para cada fila restante llamadasl
para eliminar el puño y la última columna. Esto realiza el pelado de cebolla.función
c
: dada una matriz 2Da
, devuelve una cadena que solo contiene la0
s en forma de cadena dea
.función
s
: dada una matriz 2Da
, invocac
la forma pelada de la matriz dada porp
y en la matriz misma. Compara estas cadenas lexicográficamente para determinar si la forma pelada tiene menos0
s que la original. Si lo hace, entonces el original está contaminado, así que recurras
recursivamente en la forma pelada. De lo contrario, devuelva el original.fuente
a.length
elend
argumento dearray.slice
inl
y guardar 8 bytes.end
se permite que sea un índice negativo.Retina ,
6057 bytesEl recuento de bytes asume la codificación ISO 8859-1. El avance de línea final es significativo.
Pruébalo en línea!
Explicación
Debido al avance de línea final, esto encuentra todas las coincidencias de la expresión regular después de la
`
y las elimina de la entrada. Debido al inicio,+
esto se hace repetidamente hasta que la salida deja de cambiar (lo que se debe a que la expresión regular dejará de coincidir).En cuanto a la expresión regular en sí, consta de dos partes:
Esta parte verifica si hay un
0
lugar en la capa externa. Lo hace moviendo el "cursor" del motor de expresiones regulares al comienzo de la cadena con una mirada hacia atrás (usamos[^_]
para unir los dígitos y los avances de línea):Y luego, desde esa posición, usamos una búsqueda anticipada para encontrar
0
uno en la primera línea, adyacente a un salto de línea, o en la última línea:Luego, la coincidencia real consistirá en la primera línea (incluido su avance de línea final), la última línea (incluido su avance de línea principal) o el primer o último carácter de una línea, donde abusamos del límite de la palabra
\b
como principio / fin de línea ancla:fuente
MATL ,
2621 bytesLa entrada está en el siguiente formato
Entonces los otros cuatro casos de prueba son
El programa falla en el último caso de prueba, pero produce la salida correcta (que no es nada). ¡Gracias a @Dennis por notarlo!
Pruébalo en línea! . O verifique todos los casos de prueba (esto incluye el código de ajuste).
Explicación
Esto itera tantas veces como el número de columnas en la matriz de entrada, que es más que suficiente. En cada iteración, el shell se elimina o se mantiene según sus valores.
fuente
Pyth, 19 bytes
Banco de pruebas
fuente
JavaScript (ES6), 74 bytes
Toma la entrada en forma de una cadena con líneas nuevas que separan cada fila (pero no líneas nuevas iniciales o finales). Explicación:
/^.*0|0\n|\n0|0.*$/
es una expresión regular que coincide con los cuadrados contaminados, mientras/^.*\n?|.(.*).|\n.*$/
que coincide con las partes del cuadrado que deben eliminarse, excepto las(.*)
que deben mantenerse. (Esto es más corto que mirar hacia adelante o hacia atrás para el personaje de nueva línea).fuente
Perl 5, 63 + 3 = 66 bytes
Requiere la
-0
bandera. La entrada no debe contener un carácter de nueva línea final.fuente
Pyke, 29 bytes
Pruébalo aquí!
También 29 bytes
Pruébalo aquí!
fuente
Pyth ,
3130 bytesBanco de pruebas.(Los últimos errores del caso de prueba)
Mejora: hizo parte del extractor de bucle externo una función (
L+hbeb
).Versión anterior de 31 bytes:
Cómo funciona:
El código es básicamente: mientras que el producto de la capa externa es cero, pélelo.
Analicemos el código principal (Q está implícito aquí):
Comience desde
Q
(entrada),while
primer lambda, realice el segundo lambda.La primera parte sería la lambda en
H
:La segunda parte sería la lambda en
Z
:La primera parte
Analicemos esto:
Dado que Pyth usa la notación de prefijo , esto se evaluaría:
La segunda parte
fuente
Mathematica, 78 bytes
Función anónima, toma la entrada como una matriz. Ignore cualquier error que pueda resultar durante la ejecución.
fuente