Dada una matriz rectangular de elevaciones, dibuja sus contornos.
Tarea
Dos elementos x
y y
están en el mismo nivel de contorno si floor(x/10) == floor(y/10)
. Por ejemplo, 52
y 58
están en el mismo nivel de contorno, pero 58
y 64
no 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óne
está en el mismo nivel de contorno quee
o si no hay ningún elemento a continuacióne
y de lo"_"
contrario - el segundo carácter es
" "
si el elemento a la derechae
está en el mismo nivel de contorno quee
o no hay ningún elemento a la derechae
y"|"
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 3
está en el mismo nivel de contorno que 5
, el primer personaje está " "
. Como 20
no está en el mismo nivel de contorno que 5
, el segundo carácter sí "|"
.
Ahora lo miramos 20
. Como 6
no 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 6
está 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$n
contrario. En lugar de dividir entre 10 y pisos, abusamos del hecho de que los ints sonCool
(pueden tratarse como cadenas) y los usamoschop
para 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
q
que 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ónw
como 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
$n
a|
, 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
say
edita (impresa con una nueva línea). Comosay
puede 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 deTrue
s (cadasay
uno devuelve unoTrue
), pero a quién le importa).fuente
but who cares
Jalea ,
25 2322 bytes-1 byte gracias a millas (
I
vectorises)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ż"ç”|$Y
I
que no se vectorizaría así.I
vectoriza en la profundidad 1, y ambosa
yo
vectoriza 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
enumerate
lugar 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:+<.@%&10
coloca 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{.);.3
corta 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 usaf
para 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
\n
representa 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\n
pieza 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>`
\n
parte; 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
len
conL
y 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
-ap
banderasPrué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