Salvadera
Para los propósitos de la tarea actual, un cubo de unidad de longitud se representa en proyección oblicua con símbolos ASCII de la siguiente manera:
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
+
para los vértices-
para los bordes X La unidad de longitud a lo largo de X está representada por cinco-
entre dos vértices.|
para los bordes Y La unidad de longitud a lo largo de Y está representada por dos|
entre dos vértices./
para los bordes Z La unidad de longitud a lo largo de Z está representada por uno/
entre dos vértices.- Los vértices solo se dibujan donde se cruzan los tres planos.
- Los bordes solo se dibujan donde se cruzan exactamente dos planos.
Cuando se extruye una cara de unidad, se compensa con una longitud de unidad desde su posición original y se crean cuatro bordes nuevos para cada dirección (positiva y negativa).
Puede pensar en la extrusión como en dibujar los ejes de un sistema de coordenadas cartesianas 3D donde cada eje se representa como un cuboide con una sección transversal de 1x1 y una longitud n
de (0,0,0)
Extruido por 1 a lo largo de X:
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
Tarea
Dados tres números para los ejes XYZ, extruya las caras de un cubo unitario simétricamente por las cantidades indicadas y rinda el resultado con los símbolos ASCII como se especificó anteriormente.
Entrada
x, y, z - números no negativos - longitudes de extrusión para los ejes respectivos. 0 significa que no hay extrusión. La entrada puede ser tres números, una lista de tres números, un triple, una cadena o cualquier cosa que sea conveniente para usted.
Salida
El dibujo ASCII del cubo después de la extrusión. Se permiten espacios en blanco iniciales y finales.
Casos de prueba
X Y Z
0 0 0
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
1 0 0
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
0 0 1
+-----+
/ /|
/ / |
/ / +
/ / /
/ / /
+-----+ /
| | /
| |/
+-----+
1 1 0
+-----+
/ /|
+-----+ |
+---| | +-----+
/ | |/ /|
+-----+ +-----+ |
| | +
| |/
+-----+ +-----+
| | +
| |/
+-----+
2 0 1
+-----+
/ /|
+-----------+ +-----------+
/ /|
+-----------+ +-----------+ |
| / /| | +
| +-----+ | |/
+---------| | +-----------+
| |/
+-----+
1 1 1
+-----+
/ /|-+
+-----+ |/|
+---| | +-----+
/ | |/ /|
+-----+-----+-----+ |
| / /| | +
| +-----+ | |/
+---| | +-----+
| |/| +
+-----+ |/
+-----+
Criterios ganadores
La solución más corta en bytes en cada idioma gana. Agregue una breve descripción del método utilizado y su código.
Respuestas:
JavaScript (ES6),
525 ... 475 471459 bytesGuardado 13 bytes gracias a @Neil
Toma la entrada como una matriz
[X,Y,Z]
. Devuelve una matriz de caracteres.Pruébalo en línea!
¿Cómo?
Pasos de dibujo
La salida consta de 15 lados, dibujados en un orden específico.
Implementación
La función de dibujo essol . Funciona con los siguientes parámetros:
Los vértices siempre se dibujan. Dependiendo del valor de otro parámetrodo , los bordes se dibujan o se borran.
Sit = 0 , la función dibuja un lado frontal:
Sit = 1 , dibuja un lado superior:
Para resumir, un lado se describe completamente con:
Por lo tanto, necesitamos almacenar los siguientes 10 parámetros para cada lado:
A continuación se muestran los parámetros de los 15 lados que deben dibujarse:
We force all values into the range[0..9] by applying the following operations:
It results in 15 numbers of exactly 10 decimal digits, which are stored as 15 groups of 7 digits in base 36.
For instance, the first side is encoded as
4032070460
and stored as1uol9h8
.fuente
Array(W*2+9).fill` `
saves a byte.APL (Dyalog Classic),
162161132130 bytesTry it online!
(1 + 4*cx + 2*cy + cz) mod 16
wherecx
,cy
,cz
are the number of same-value "rods" along axis x,y,z, i.e. vectors along that axis that consist of the same value: 0 0 or 1 1. we make an exception if the subarray is all-zero (or all-one - those don't matter) and we consider its number 0 instead of 28-|/+
thanks Scott Milner for spotting that some
+
s rendered as?
sfuente
Charcoal, 325 bytes
Try it online! Link is to verbose version of code. Explanation:
Input the extrusions, but premultiply them to save bytes.
If at least two of the extrusions are zero, then simply draw a cuboid of dimensions (2x+1, 2y+1, 2z+1). Otherwise:
Print the left extrusion, if any.
Print the down extrusion, if any.
Print the back extrusion, if any.
The remaining extrusions all meet at this point (which doesn't get drawn until the very end!)
Print the front extrusion, if any, taking care to erase parts of the left and down extrusions that may overlap.
Print the up extrusion, if any, taking care to erase parts of the back and left extrusions that may overlap.
Print the right extrusion, if any, taking care to erase parts of the down and back extrusions that may overlap.
Draw the joins between the latter extrusions.
fuente
Charcoal,
195164144 bytesPruébalo en línea! El enlace es a la versión detallada del código. Estoy publicando esto como una respuesta separada, ya que utiliza un enfoque completamente diferente para dibujar la extrusión. Explicación:
Ingrese las extrusiones y calcule la mitad del tamaño del cuboide envolvente, pero en aritmética de enteros porque los rangos de carbón son siempre enteros. El origen de la salida se asigna al centro del cubo de la unidad original.
Pase sobre todas las coordenadas dentro (incluido el límite) del cuboide que contiene la extrusión.
Salta a la posición de salida correspondiente a esas coordenadas.
Desde las coordenadas dadas, mire en las ocho direcciones diagonales para determinar si la extrusión se superpone en esa dirección. Se verifica que las coordenadas observadas todavía se encuentran dentro del cuboide, y luego el número de ejes en los que se encuentra la coordenada dentro del cubo original debe ser mayor que 1. Tenga en cuenta que dado que el cubo tiene una altura de visualización impar, los valores del eje Y que se miran son enteros, mientras que los otros ejes usan coordenadas fraccionarias.
Considere la cantidad de direcciones en las que se superpone la extrusión. Hay cinco casos de interés en los que queremos imprimir algo, como en el caso de cero, eso significa que este es un espacio vacío y no queremos imprimir nada, mientras que en el caso de ocho, eso significa que está dentro la extrusión y cualquier cosa que imprimiéramos estaría sobreimpresa por una capa más cerca del punto del ojo.
Si la extrusión solo se superpone en una dirección, entonces esta es una esquina exterior y necesitamos generar una
+
.Si la extrusión se superpone en dos direcciones, entonces este es un borde exterior. Qué tipo de borde se determina a partir de la separación entre las dos superposiciones; 6 y 7 son bordes orientados hacia atrás y se sobrescribirán, 4 es un borde diagonal, 2 es un borde vertical y 1 es un borde horizontal. (Realmente calculo 7 menos la separación, ya que parece ser más fácil de hacer).
Si la extrusión se superpone en tres direcciones, entonces esta es una esquina interna en el caso de que una de las extrusiones sea cero y necesitemos generar a
+
.Si la extrusión se superpone en cuatro direcciones, entonces hay dos casos: caras (cualquier dirección) y esquinas internas en el caso con tres extrusiones positivas. En el último caso, hay un número impar de superposiciones hacia el espectador.
Si la extrusión se superpone en seis direcciones, entonces este es un borde interno. Funciona como el complemento de un borde exterior, excepto que solo nos interesa cuando uno de los dos espacios vacíos es la dirección hacia el punto del ojo (la última entrada en la matriz).
fuente
K (ngn / k) , 172 bytes
Pruébalo en línea!
obligatorio reescribir k de mi solucion apl
mismo algoritmo, excepto que el renderizado 3d-> 2d se realiza con (el k equivalente de) la asignación del índice de dispersión en lugar de crear matrices 2d para cada elemento 3d y mezclarlos
fuente
ngn/apl
desempeño en comparación con suDyalog APL
solución?⍤
) y stencil (⌺
)