Dada una matriz rectangular de elevaciones, dibuja sus contornos.
Tarea
Dos elementos xy yestán en el mismo nivel de contorno si floor(x/10) == floor(y/10). Por ejemplo, 52y 58están en el mismo nivel de contorno, pero 58y 64no lo están.
El acto de dibujar contornos se define de la siguiente manera: para cada elemento e, reemplácelo con una cadena de dos caracteres elegida de la siguiente manera:
- el primer carácter es
" "si el elemento a continuacióneestá en el mismo nivel de contorno queeo si no hay ningún elemento a continuacióney de lo"_"contrario - el segundo carácter es
" "si el elemento a la derechaeestá en el mismo nivel de contorno queeo no hay ningún elemento a la derechaey"|"otra cosa
Los elementos dentro de las filas se unen, luego las filas se unen con nuevas líneas.
Ejemplo
Digamos que la entrada es [[5,20],[3,6]], visualizada como
5 20
3 6
Primero miramos 5. Dado que 3está en el mismo nivel de contorno que 5, el primer personaje está " ". Como 20no está en el mismo nivel de contorno que 5, el segundo carácter sí "|".
Ahora lo miramos 20. Como 6no está en el mismo nivel de contorno que 20, el primer carácter sí "_". Como no hay ningún elemento a la derecha de 20, el segundo carácter es " ".
Ahora lo miramos 3. Como no hay ningún elemento debajo 3, el primer carácter es " ". Como 6está en el mismo nivel de contorno que 3, el segundo personaje está " ".
Ahora lo miramos 6. Como no hay ningún elemento debajo 6, el primer carácter es " ". Como no hay ningún elemento a la derecha de 6, el segundo carácter es " ".
En base a estas cadenas de dos caracteres, hacemos reemplazos para obtener [[" |","_ "],[" "," "]]. Al unirlos, obtenemos una salida de
|_
Reglas
- La matriz de entrada siempre será rectangular y estará compuesta de enteros positivos.
- Los espacios finales o las nuevas líneas pueden ser de cualquier cantidad (incluido 0) y no tienen que ser consistentes de ninguna manera.
- No tiene que seguir el mismo algoritmo siempre que produzca los mismos resultados.
- Su programa o función puede generar una cadena separada por una nueva línea, una lista de cadenas o equivalente.
- Este es el código de golf , por lo que gana el código más corto en bytes.
Casos de prueba
input
output
[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
_ _
| |
|_ _|
[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
|_|_|_|_|_|_|_|_|_
|_ |_ _|_ _|_ _
|_ |_ _ |_
|_ |_ _
|_
|_
|_
|_
|_
[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
_ _ _ _ _ _ _ _ _
| |
| _ _ _ _ _ |
| | | |
| | _ | |
| | |_| | |
| | | |
| |_ _ _ _ _| |
| |
|_ _ _ _ _ _ _ _ _|
[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
_| |_
_| _ _ _ _ _ |_
_| |_
| _ _ _ |
| | | |
| | | |
| |_ _ _| |
|_ _|
_ |_ _ _ _ _| _
|_ _|
| |

Respuestas:
Perl 6 , 135 bytes (131 caracteres)
Pruébalo en línea!
Ligeramente incólume:
Explicación : Primero, definimos una variable
$n(línea 2) y una funciónw(línea 3). Esta función devuelve un espacio si sus dos argumentos están en la misma "elevación", y el contenido de la variable de lo$ncontrario. En lugar de dividir entre 10 y pisos, abusamos del hecho de que los ints sonCool(pueden tratarse como cadenas) y los usamoschoppara eliminar el último carácter (= dígito). Luego los restamos con calma, forzándolos nuevamente a números :—).Después de eso (línea 4) creamos una función
qque toma una lista y la devuelve con el primer elemento eliminado y el último elemento duplicado.En las siguientes 3 líneas, vamos a hacer 2 matrices más a partir de la matriz de entrada: a la primera le falta la primera fila y la última fila está duplicada (es solo que
.&q, usando.&, puede llamar a una función en cualquier cosa como si fuera un método: lo que está delante del punto es entonces el primer argumento), al otro le falta la primera columna y la última columna está duplicada (eso es.map(*.&q)).Primero (línea 4) tomamos la matriz original
$_, la "superponemos" con la matriz de "filas desplazadas" y usamos la funciónwcomo operador binario (eso es[&w]) en los elementos coincidentes. Ese pone un_lugar donde los elementos coincidentes están en las diferentes elevaciones, y locontrario. Entonces obtenemos la mitad del resultado (solo los "primeros caracteres").En la línea 6, hacemos lo mismo, pero primero cambiamos
$na|, y ahora "superponemos" la matriz original con la matriz con columnas desplazadas. El resultado tiene una elevación|diferente ya la misma Estos son los "segundos personajes".Ahora solo los combinamos juntos. Comprimimos las matrices con un zip con un concat (sí ...), lo que da como resultado una matriz de la forma original cuyo elemento son los 2 elementos coincidentes de las "medias soluciones" concatenadas. Finalmente, simplemente mapeamos sobre esta matriz (que es realmente una lista de listas). Cada una de estas listas se aplana y luego se
sayedita (impresa con una nueva línea). Comosaypuede tomar cualquier número de argumentos y los imprime todos sin separadores, haciendo que la nueva línea solo al final, obtengamos la imagen deseada en stdout. (Y el bloque devuelve una lista deTrues (cadasayuno devuelve unoTrue), pero a quién le importa).fuente
but who caresJalea ,
25 2322 bytes-1 byte gracias a millas (
Ivectorises)Un programa completo que imprime el resultado. Como enlace monádico, toma una lista de listas de números, las elevaciones y devuelve una lista de listas, sin embargo, estas "filas" consisten en listas de "pares" de dos caracteres: si esto está bien, se puede guardar 1 byte al eliminarlo
Y.Pruébalo en línea!
¿Cómo?
fuente
⁵te ahorra uno ...:⁵I;€0ao⁶lugar de en el enlace principalZç”_Zż"ç”|$YIque no se vectorizaría así.Ivectoriza en la profundidad 1, y ambosayovectoriza en la profundidad 0Python 2 ,
199186157155 bytesPruébalo en línea!
fuente
Jalea , 24 bytes
Pruébalo en línea!
Explicación
-2 bytes gracias a Jonathan Allan
fuente
Y- devolverá una lista de listas de caracteres, lo cual creo que está bien (mientras que el mío tiene pares dentro de las "filas").Python 2 , 226 bytes
Pruébalo en línea!
Menos mal, eso era una maravilla para resolver la lógica. Ahora veo que Hyper Neutrino me ninja con una respuesta más corta, pero pasé demasiado trabajo en esto para no publicarlo. :PAGS
Además, puedo decir que esta es una forma increíble de hacer arte ASCII. Disculpe mientras hago un bote cargado más de estos.
fuente
enumeratelugar de usar el nombre completo dos veces.enumerate(obs, tuve que eliminar algunas entradas para poder vincularlo aquí)J, 58 bytes
Pruébalo en línea!
Una función anónima que toma una matriz y genera los contornos.
Mucho espacio para mejorar aquí. No tuve tiempo para probar todos los casos de prueba, así que avíseme si hay algún problema. Intentaré jugar más al golf y explicaré más tarde.
(Rápido) Explicación
Función auxiliar: indexa en una cadena de longitud 2 en función de si el primer elemento de una matriz de 2 longitudes es igual al segundo. Si es igual, se indexa en el elemento cero, si es desigual, se indexa en el primero. Una matriz de 1 longitud siempre se indexa en el elemento cero de la cadena.
Función principal
1:+<.@%&10coloca cada elemento dividido entre 10 y agrega 1 (por lo que nunca obtendremos 0; esto es importante para la función auxiliar).2 2((' _'f{."1),' |'f{.);.3corta la matriz en 2 x 2 segmentos si puede (de lo contrario, dará un segmento de 2 x 1, 1 x 2 o 1 x 1 cerca de los bordes) y aplica la función que se usafpara comparar el elemento superior izquierdo con el superior derecha y el elemento superior izquierdo a la parte inferior izquierda.(,/"2)aplana el resultado en la forma deseada. Realmente siento que debería poder evitar tener que usar esto (y muchas otras cosas, pero me estoy desviando).fuente
J ,
4645 bytesPruébalo en línea!
fuente
JavaScript (ES6),
120118 bytesDonde
\nrepresenta el carácter literal de nueva línea. Editar: Guardado 2 bytes gracias a @ Bálint.fuente
(a[i] || [])[j]construcciones a(a[i] || 0)[j]join`\n`podría quitar la\npieza y reemplazarla con una nueva línea reala=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>" _"[(a[i+1]||0)[j]-c&1]+" |"[b[j+1]-c&1]).join``).join`<new line here>`\nparte; Pruebo en un REPL para que las nuevas líneas literales se interpongan en el camino.Protón , 202 bytes
Pruébalo en línea!
-2 bytes gracias a Jonathan Frech
-15 bytes cambiando a Proton en lugar de Python 2
fuente
lenconLy definiendoL=len;.Java 8,
200170169 bytesExplicación:
Pruébalo aquí.
Tenga en cuenta que la división de enteros en Java automáticamente pisos.
fuente
R, 159 bytes
Con nuevas líneas y hendiduras:
Hace la división entera de la matriz, mide las diferencias entre las filas y las columnas, y cuando no es nulo, reemplaza por
|y_respectivamente, luego pega ambas (sin dolor, gracias a la vectorización de R) y las salidas.Casos de prueba:
fuente
Perl 5 ,
130126 bytes124 bytes de código + 2 para
-apbanderasPruébalo en línea!
El formato de entrada es una cuadrícula 2D de números separados por espacios.
Explicación
Esto es de una iteración previa del código.
fuente