Un espirógrafo es un juguete que dibuja hipotrocoides y epitrocoides. Para este desafío, nos centraremos en los hipotrocoides.
De Wikipedia :
Un hipotrocoide es una ruleta trazada por un punto unido a un círculo de radio r que rueda alrededor del interior de un círculo fijo de radio R , donde el punto está a una distancia d del centro del círculo interior.
Las ecuaciones paramétricas para ellos se pueden definir como:
Donde θ es el ángulo formado por la horizontal y el centro del círculo rodante.
Su tarea es escribir un programa que dibuje el camino trazado por el punto definido anteriormente. Como entrada, se le dará R , r y d , todos los enteros entre 1 y 200 inclusive.
Puede recibir esta entrada de stdin, argumentos o entrada del usuario, pero no se puede codificar en el programa. Puede aceptarlo de la forma que le resulte más conveniente; como cadenas, enteros, etc.
Asumir:
- Las unidades de entrada se dan en píxeles.
- R > = r
La salida debe ser una representación gráfica del hipotrocoide definido por la entrada. No se permite ninguna salida ASCII u otra basada en texto. Esta imagen se puede guardar en un archivo o mostrarse en la pantalla. Incluya una captura de pantalla o imagen de la salida para una entrada de su elección.
Puede elegir cualquier color que desee para la ruta / fondo, sujeto a una restricción de contraste. Los dos colores deben tener el componente 'Valor' de HSV al menos a la mitad de la escala. Por ejemplo, si está midiendo HSV desde [0...1]
, debería haber al menos una 0.5
diferencia. Entre [0...255]
debería haber una mínima 128
diferencia.
Este es un código de golf, el tamaño mínimo del código fuente en bytes gana.
fuente
R > r
oR ≥ r
? (Lo mismo parar
yd
.)R>=r
, perod
no está limitado ar
, y puede estar en cualquier lugar en el rango de 1-200.R=200, r=1, d=200
. Puede ajustar el tamaño de la imagen a la entrada si lo desea, o mantenerla en un tamaño constante, siempre que esté visible.Respuestas:
Mathematica, 120 bytes
Código no protegido y salida de ejemplo:
Si puedo incluir los ejes en la trama, puedo guardar otros 9 caracteres.
fuente
JavaScript (ECMAScript 6) -
312314 caracteresJSFIDDLE
Salida de ejemplo
r = 1, R = 200, d = 30
fuente
Python: 579
Resumen
Esto no es competitivo en absoluto dada la respuesta de Mathematica, pero decidí publicarlo de todos modos porque las imágenes son bonitas y pueden inspirar a alguien o ser útiles para alguien. Debido a que es mucho más grande, lo dejé básicamente sin golf. El programa espera entrada de línea de comandos de R, r, d.
Captura de pantalla
Aquí hay dos ejemplos, uno para (5,3,5) y otro para (10,1,7)
Código
fuente
Perl / Tk -
239227R = 120, r = 20, d = 40:
R = 128, r = 90, d = 128:
R = 179, r = 86, d = 98:
fuente
Procesamiento, 270
La entrada se ingresa a través de la consola, un número por línea.
Captura de pantalla para R = 65, r = 15, d = 24:
fuente
GeoGebra, 87
Es decir, si considera que GeoGebra es un idioma válido.
Acepta la entrada de la barra de entrada de GeoGebra, en el formato
<variable>=<value>
, por ejemploR=1000
.Tenga en cuenta que es posible que deba cambiar manualmente el tamaño del zoom para ver la imagen completa.
(Lo que está en la parte inferior de la ventana es la barra de entrada de la que estaba hablando)
Pruébelo en línea aquí .
fuente
HTML + Javascript
256286303Editar Se eliminó la primera llamada a moveTo, funciona de todos modos. Podría ahorrar más corte beginPath, pero solo funciona la primera vez
Edit2 30 bytes guardados thx @ ӍѲꝆΛҐӍΛПҒЦꝆ
Prueba
Ponga la entrada en el cuadro de texto (separados por comas) y luego presione la pestaña
fuente
R, 80 bytes
Sin embargo, si uno quiere figuras 'limpias' (sin ejes, sin etiquetas, etc.), entonces el código tendrá que ser un poco más largo (88 caracteres):
Un ejemplo de código que usa la versión más larga de f:
Algunas salidas de ejemplo:
fuente
,
??C # 813, era 999
Necesita algo de trabajo para reducir el recuento de bytes. Logré reducirlo un poco. Acepta tres enteros separados por espacios de la consola.
Muestra de salida:
fuente
script de shell + gnuplot (153)
La mayor parte del esfuerzo es eliminar los ejes y tics, establecer el tamaño y el rango, y aumentar la precisión. Afortunadamente, gnuplot es natural para el golf, por lo que la mayoría de los comandos se pueden abreviar. Para guardar caracteres, la salida debe ser redirigida a un archivo de imagen manualmente.
Llamar al guión con
spiro.sh 175 35 25>i.png
dafuente
R, 169 caracteres
Sangrado:
Ejemplos:
fuente
SmileBASIC, 96 bytes
Entrada: 50,30,50:
fuente
Befunge-98, 113 bytes
Este código se basa en la huella dactilar de Matemáticas de punto fijo (FIXP) para algunos cálculos trigonométricos, y los gráficos de tortuga (TURT) huella dactilar para dibujar la trayectoria del espirógrafo.
Los gráficos de tortuga en Befunge son muy similares en comportamiento a los gráficos en el lenguaje de programación Logo . Dibujas con una 'tortuga' (que sirve como bolígrafo), que giras alrededor de la superficie de salida. Esto implica orientar a la tortuga en una dirección particular y luego indicarle que avance una cierta distancia.
Para trabajar con este sistema, necesitaba ajustar las ecuaciones del espirógrafo original en algo un poco más amigable para las tortugas. No estoy seguro de si este es el mejor enfoque, pero el algoritmo que se me ocurrió funciona de esta manera:
Tenga en cuenta que esto realmente dibuja el camino con una especie de patrón de zig-zag, pero realmente no se da cuenta a menos que acerque la imagen de cerca.
Aquí hay un ejemplo usando los parámetros R = 73, r = 51, d = 45.
He probado el código con CCBI y cfunge , que producen resultados en forma de imagen SVG. Dado que este es un formato vectorial escalable, la imagen resultante no tiene un tamaño de píxel como tal, solo se escala para adaptarse al tamaño de la pantalla (al menos cuando se ve en un navegador). El ejemplo anterior es una captura de pantalla que se ha recortado y escalado manualmente.
En teoría, el código también podría funcionar en Rc / Funge , pero en ese caso necesitaría ejecutarse en un sistema con XWindows, ya que intentará representar la salida en una ventana.
fuente
wxMaxima : 110
Esto se llama en la sesión interactiva a través de
f(#,#,#)
. Como muestra, consideref(3,2,1)
:fuente
Raqueta
Salida:
fuente