Dado solo una regla y una brújula, inscriba un rombo dentro del rectángulo dado, compartiendo dos puntos opuestos.
Entrada
La entrada es las dimensiones del rectángulo. En el ejemplo que se muestra, eso sería 125, 50
. Puede tomar la entrada de la forma más conveniente (como dos enteros, lista, cadenas, etc.).
La dimensión más grande será de un mínimo de 100, mientras que la más pequeña será de un mínimo de 25. Ambos tope a 200.
Salida
La salida será una imagen (mostrada en la pantalla o guardada como un archivo) que muestra
- El rectángulo de entrada
- Todas las líneas / círculos "de trabajo"
- El rombo inscrito
En distintos colores. En la imagen de arriba, El rectángulo es negro, las líneas de trabajo son azules y el rombo naranja. Las líneas deben dibujarse en el orden que se muestra en la lista (por ejemplo, el rombo sobrescribe las líneas de trabajo y el rectángulo).
La imagen de salida debe ser lo suficientemente grande como para contener todo. Por ejemplo, los círculos que se muestran no pueden salir de los límites.
Método
El método utilizado en la imagen de ejemplo anterior es:
- Dibuja un círculo usando la esquina inferior izquierda como centro y la superior derecha como un punto en el perímetro, dando un radio igual a la diagonal del rectángulo.
- Haga lo mismo, pero intercambiando puntos centrales y perimetrales.
- Dibuja una línea entre las intersecciones de los dos círculos, dando una bisectriz perpendicular a la diagonal del rectángulo.
- Usa las intersecciones de la nueva línea y rectángulo para dibujar el rombo.
Esto funciona porque las diagonales interiores de un rombo siempre se bisecan perpendicularmente entre sí. Sin embargo, no incluyo una prueba completa de esto aquí.
Este no es el único método para obtener tu rombo, y puedes usar otro, dado que explicas lo que estás haciendo. Sin embargo, creo que es probablemente la más fácil.
Reglas
Solo puede dibujar círculos y líneas (o más bien, segmentos de línea). Un círculo se define con un punto central y un punto perimetral. Una línea se define por dos puntos cualesquiera. Las líneas no tienen que tener una longitud específica, pero al menos deben cubrir los puntos de definición (tenga en cuenta la imagen de ejemplo: la línea pasa un poco más allá de las intersecciones del círculo, pero no hasta el borde). Para los círculos, el radio desde el centro hasta el punto del perímetro elegido se considera una línea de trabajo y debe mostrarse.
Para rasterizar las líneas, puede usar cualquier algoritmo reconocido (por ejemplo, el de Bresenham), o confiar en cualquier componente que pueda tener su idioma. Si su salida está basada en vectores, asegúrese de que se muestre con una resolución al menos tan grande como el rectángulo de entrada en píxeles. Además, dibujará en un lienzo plano, por lo tanto, elimine las marcas de cuadrícula o los resultados extraños.
No hacer trampa! Solo puede determinar la ubicación de puntos / líneas / círculos utilizando lo que ha establecido hasta ahora. Si no puede explicar cómo usar sus líneas / círculos de trabajo para mostrar que es un rombo, lo está haciendo mal.
Puede usar cualquier par de puntos opuestos que desee, y el rectángulo no necesita dibujarse alineado con el eje, siempre que la salida sea correcta.
La entrada siempre será un rectángulo no cuadrado, así que no te preocupes por una carcasa especial.
Por último, este es el código estándar de golf, por lo que gana el tamaño más bajo en bytes.
fuente
Respuestas:
HTML + JavaScript (ES6), 34 + 353 = 387 bytes
La entrada debe darse en el formato
[125,50]
.Solo muchas matemáticas y dibujos ... El rectángulo se dibuja de lado si la altura es mayor que el ancho, lo cual creo que está permitido.
fuente
444
: P400
;-)Mathematica,
157148158 bytes¡Gracias a Martin Ender por los comentarios con su alta calidad habitual! 9 bytes guardados en este caso.
Editado una vez que se aclaró que los argumentos pueden venir en cualquier orden; 10 bytes agregados para compensar.
Nuevamente, aquí es donde brilla Mathematica: salida de gráficos de alto nivel que involucra cómputo matemático. El mismo código con espacios y líneas nuevas para la legibilidad humana:
Función sin nombre de un argumento único que es un par ordenado de números positivos; el final
@@ Sort@# &
convierte ese par en dos argumentos numéricos donde el primer número es el más pequeño.Line
produce una ruta poligonal de punto a punto, que se convertirá en un polígono cerrado si el primer y el último punto son iguales;Circle
produce un círculo con centro y radio dados. Los puntos especialeso
yc
(las esquinas rectangulares inferior izquierda y superior derecha),p
(una tercera esquina rombo, dada por una fórmula matemática), yk
(ayudando a dibujar la bisectriz perpendicular) reciben nombres en el camino para guardar bytes cuando se les llama nuevamente , como es el par especial de puntosl = {o,c}
. Mathematica se complace en agregar puntos directamente, multiplicar ambas coordenadas por el mismo factor, tomar su producto de puntos, etc., todo lo cual simplifica el código.Salida de muestra, con argumentos
125
y50
:fuente
{0,0}
. Como no hay ningún requisito para usar azul y naranja, puede guardar bytes usando enRed
lugar deOrange
. Está usandoLine
cuatro veces, lo que es más que suficiente para guardar bytesi=Line;
(como regla general, si la expresión tienen
caracteres y la usa lasm
veces que necesita(m-1)*(n-1) > 4
, menos si puede asignar la variable durante el primer uso sin paréntesis).0{,}
truco es fantástico: D@@Sort@#&
e intercambiando#
y a lo#2
largo del código o, alternativamente, adaptándolo para que funcione con rectángulos de orientación vertical.MetaPost, 473 (con color) 353 (sin color)
Color (473 bytes):
Sin color (353 bytes):
Nunca he usado esto antes, y estoy seguro de que lo maté ...
Pero cuando lo ejecutas en este sitio web:
http://www.tlhiv.org/mppreview/
Utiliza la intersección de los círculos para dibujar el segundo eje, y luego usa la intersección del eje y el rectángulo para dibujar el rombo final. Aunque podría haber hecho trampa y dibujar una línea perpendicular al primer eje jaja.
Para cambiar las dimensiones, simplemente modifique A y B.
En cualquier caso, terminas con (para L = 170, H = 100):
fuente
Desmos, 375 (o 163) bytes
w
yh
son las entradas. Pruébalo en Desmos!Versión alternativa de 163 bytes:
Esta versión requiere que cada línea se copie y pegue en cada línea separada en Desmos. Meta aún necesita decidir si este es un método de conteo válido, pero el método anterior definitivamente está bien.
fuente
ImageMagick Versión 7.0.3 + bash + sed, 496 bytes
Resultado con "rombo.sh 180 120"
Más preciso (utilizando un lienzo de 6400x6400 en lugar de 800x800), 570 bytes
Las intersecciones no son exactas; La directiva "ancho de trazo" hace que las líneas sean lo suficientemente anchas para asegurarse de que al menos un píxel completo se mezcle solo con los colores de las dos líneas que se cruzan, pero en el peor de los casos (25x200 y 200x25) los cruces están en un ángulo pequeño para que la nube de píxeles mezclados tiene una longitud de varios píxeles, y dado que seleccionamos el primer y el último píxel mixto, hay un pequeño error. El uso de un lienzo 8x más grande con el mismo ancho de trazo y luego reducir el resultado reduce el error a menos de un píxel, pero con una penalización de tiempo de aproximadamente 64x.
Resultados de 800x800 normales versus 6400x6400 precisos:
Sin golf:
fuente
R, 290 bytes
Función anónima, la salida se muestra en la pantalla. Ligeramente descamados, con comentarios:
Ejemplo de salida para (120,100):
fuente
LibreLogo , 270 bytes
Código:
Resultado:
Explicación:
fuente
Python 3.5 + Tkinter, 433 o 515 bytes
Sin color (433 bytes):
Color (515 bytes):
Una función con nombre que toma la entrada como 2 números separados por comas. La salida se proporciona en una ventana separada que puede tener que cambiar de tamaño para ver la salida completa. Aquí hay una muestra de salida en color para
V(180,130)
:fuente
SmileBASIC, 280 bytes
(La captura de pantalla / explicación se publicará pronto) El color de fondo es negro, el rectángulo es rojo, los círculos y las líneas son blancos y el rombo es amarillo.
fuente