El Juego del Caos es un método simple para generar fractales. Dado un punto de partida, una relación de longitud r y un conjunto de puntos 2D, haga lo siguiente repetidamente:
- De su conjunto de puntos, elija uno al azar (uniformemente).
- Promedie ese punto y el último punto dibujado (o el punto de partida) usando r y 1 - r como los pesos (es decir, r = 0 significa que obtiene el punto de partida, r = 1 significa que obtiene el punto aleatorio y r = 0.5 significa que obtener el punto a medio camino.)
- Dibuja el punto resultante.
Por ejemplo, si seleccionó los vértices de un triángulo equilátero yr = 0.5 , los puntos trazados trazarían un triángulo de Sierpinski:
Imagen encontrada en Wikipedia
Debes escribir un programa o función que "juegue" el juego del caos para crear un fractal.
Entrada
Puede escribir un programa o una función, y tomar las siguientes entradas a través de ARGV, STDIN o argumento de función:
- El número de puntos para trazar.
- La coordenada de inicio (¡que también debe trazarse!).
- El peso promedio r en el intervalo [0,1] .
- Una lista de puntos para elegir.
Salida
Puede renderizar en pantalla o escribir un archivo de imagen. Si el resultado está rasterizado, debe tener al menos 600 píxeles en cada lado, todos los puntos deben estar en el lienzo y al menos el 75% de la extensión horizontal y vertical de la imagen debe usarse para los puntos (esto es para evitar responde con un solo píxel negro que dice "está muy alejado"). La x e y eje debe estar en la misma escala (es decir la línea a partir de (0,0) a (1,1) deben estar en un ángulo de 45 grados) y cada punto representado en el juego del caos debe ser representado como una sola píxel (si su método de trazado suaviza el punto, puede extenderse en 2x2 píxeles).
Los colores son su elección, pero necesita al menos dos colores distinguibles: uno para el fondo y otro para los puntos trazados durante el juego del caos. Puede pero no tiene que trazar los puntos de entrada.
Incluya tres resultados de ejemplo interesantes en su respuesta.
Tanteo
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Editar: ya no necesita trazar los puntos de entrada, ya que de todos modos no son realmente visibles como píxeles individuales.
fuente
Respuestas:
Mathematica, 89
Cómo funciona
En Mathematica, la
Graphics[]
función produce gráficos escalables, puede representarlos al tamaño que desee simplemente arrastrando las esquinas de la imagen. De hecho, el tamaño inicial de todos los gráficos mostrados es una configuración ".ini" que puede establecer en 600 o en cualquier otro valor que desee. Por lo tanto, no hay necesidad de hacer nada especial para el requisito de 600x600.La
AbsolutePointSize[]
cosa especifica que el tamaño en puntos no se modificará ampliando el tamaño de la imagen.La construcción central es
o en pseudocódigo no golfizado:
Está construyendo recursivamente una lista a partir de
(start point)
y aplicando la función (vectorial) en el primer argumento a cada punto sucesivo, finalmente devolviendo la lista de todos los puntos calculados para ser graficados porPoint[]
Algunos ejemplos de autorreplicación:
fuente
Instructions for testing this answer without Mathematica installed:
1) Descargue esto desde pastebin y guárdelo como * .CDF 2) Descargue e instale el entorno CDF gratuito de Wolfram Research en (no es un archivo pequeño). Disfrutar. ¡Dime si funciona!#r
parar#
salir de allí sin un espacio o*
en el medio.#
yr
.#key
. Estoy seguro de que será útil. :)Java: 246
253447Como una función
m()
:Saltos de línea (dentro de un programa para mostrar el uso):
Se eliminaron los puntos de entrada de dibujo de los requisitos (¡yay 80 bytes!). Todavía se muestran en las capturas de pantalla anteriores a continuación, pero no se mostrarán si lo ejecuta. Ver historial de revisiones si está interesado.
Las entradas se dan como una matriz de flotadores. La primera es iteraciones, las dos siguientes están comenzando
x y
. El cuarto esr
, y el último viene la lista de coordenadas, dex1 y1 x2 y2 ...
moda.Estrella ninja
Cruzar
Octocadenas
fuente
show
está en desusoshow()
está en desuso, pero aún funciona. Cuando dices "no funciona", ¿qué significa eso? Si no tiene Java 8, necesitará agregar unfinal
toString[]a
en main al menos.JavaScript (E6) + Html
173176193Editar: gran corte, gracias a William Barbosa
Editar: 3 bytes menos, gracias a DocMax
173 bytes contando la función y el elemento de lienzo necesarios para mostrar la salida.
Prueba guardar como archivo html y abrir en Firefox.
JSFiddle
fuente
<canvas id=C><script>F=(n,x,y,r,p)=>{t=C.getContext("2d"),C.width=C.height=600;for(;n--;)t.fillRect(x,y,1,1),i=Math.random()*p.length&~1,x-=(x-p[i])*r,y-=(y-p[i+1])*r}</script>
tiene 176 bytes de longitud, no entendí tu conteofor
llamada:for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
Python -
200189Toma la entrada como argumentos de función en a, escribe el resultado en stdout como archivo pgm.
n
es iteraciones,s
es el punto de partida,r
es r, yz
es una lista de puntos de entrada.Editar: ya no dibuja puntos de entrada en gris.
Resultados interesantes:
fuente
p=[255]*360000
pueden ir como parámetros opcionales a la función; el cuerpo de un bucle for puede ir en la misma línea si no tiene flujo de control; puedes afeitar a los pans de[1]*(n+1)
as[1]*-~n
; como no se usai
en el bucle for externo, es más corto ejecutar el código lasn
veces comoexec"code;"*n
); Creo que los padresfor i in(0,1)
pueden ser eliminados.SuperCollider - 106
SuperCollider es un lenguaje para generar música, pero puede hacer gráficos en caso de necesidad.
He usado algunos métodos abreviados de sintaxis oscuros para guardar unos pocos bytes; una versión más legible y más eficiente en memoria es
a 109 caracteres.
Al igual que con el ejemplo de Mathematica, debe cambiar el tamaño manualmente de la ventana para obtener 600x600 píxeles. Tienes que esperar a que se vuelva a dibujar cuando hagas esto.
Esto genera un triángulo básico de Sierpinsky (no se muestra porque lo has visto antes)
Esto hace una especie de cosa tipo pentágono Sierpinsky:
Lo mismo con 6 puntos deja un copo de nieve Koch invertido en el medio:
Finalmente, aquí hay un riff en las pirámides 3D de la respuesta de as. (Tenga en cuenta que he usado uno de los puntos dos veces, para obtener el efecto de sombreado).
fuente
Python,
189183175Editar: corrigió la relación r inversa y cambió a la imagen en blanco y negro para guardar algunos bytes.
Toma el número de puntos como
n
, primer punto comop
, relación comor
y lista de puntos comol
. Necesita el módulo Pillow.Ejemplos:
Estoy generando puntos en círculo alrededor del centro de la imagen.
Repeticiones XOXO, solo cambiando la relación de 0.4 a 0.6
Algún tipo de copo de nieve
fuente
n,p,r,l=input()
. También puede eliminar los corchetes de las*=
operaciones y el usoimport random as R
.*=
. :( Lainput
cosa sería bueno ser muy desagradable para trabajar, y la importación en la actualidad es la forma más concisa posible (o he perdido algo?).import random as R,PIL.Image as I
y luegorandom.choice
puede serR.choice
. Sí, el uso de la entrada es poco convincente, ¡pero puedes usar la versión de la función para probar y publicar la que tengainput()
una mejor puntuación! : Py=x*(1-r)+w
==y=x-x*r-w
.JavaScript
(407)(190)Estoy feliz de recibir cualquier comentario sobre mi script y sobre el golf, ya que no me siento cómodo con JS =) (¡Siéntase libre de usar esto / cambiarlo para su propio envío!)
Lectura de entrada (para ser comparable a la entrada de edc65 no cuento la entrada):
Configuración de lienzo y cálculo
Algo más descabellado (incluida una entrada de ejemplo donde las solicitudes de entrada reales solo se comentan, así que están listas para usar):
Ejemplos
fuente
Procesamiento, 153
Porté la respuesta Java de @Geobits a Processing e hicimos un poco más de golf, lo que resultó en una reducción de 100 caracteres. Originalmente tenía la intención de animar el proceso, pero las restricciones de entrada son demasiado duras en esto (Processing no tiene stdin o argv, lo que significa que debo escribir mi propia función en lugar de usar el
draw()
ciclo nativo de Processing ).Programa completo con saltos de línea:
El programa anterior da cruces:
Esto le da a las pirámides:
Esto le da al triángulo de Sierpinski:
fuente
"Implementación de referencia" sin golf, Python
Actualizar : mucho, mucho más rápido (por órdenes de magnitud)
¡Mira el shell interactivo!
Edite el archivo y configúrelo
interactive
enTrue
, a continuación, realice una de las siguientes:polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides
genera, guarda y muestra un polígono.points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ...
hace lo que pide la especificación.fuente
Python (202 caracteres)
Toma el número de puntos como
n
, el peso promedio comor
, el punto de partida como aytuple
s
la lista de puntos como una lista de XYtuple
s llamadal
.fuente