Ejecutar un sistema Lindenmayer
Un sistema Lindenmayer (o sistema L) está relacionado con los sistemas Thue y Post , y se utiliza en el modelado botánico y la generación fractal .
Un sistema L se describe mediante la reescritura de cadenas donde un símbolo del alfabeto de símbolos se asigna a una secuencia de símbolos de reemplazo . Una colección de estas asignaciones constituye el sistema L propiamente dicho.
El método de salida gráfica ideado por Prusinkiewicz interpreta la secuencia resultante después de que las asignaciones se hayan aplicado a una secuencia inicial para un número específico de iteraciones , como comandos de Dibujo de tortuga: adelante, atrás, izquierda, derecha, ese tipo de cosas. Esto puede requerir un código adicional para controlar la escala del dibujo, ya que diferentes recuentos de iteraciones pueden producir imágenes de tamaños drásticamente diferentes.
Su tarea es ejecutar un sistema L en la menor cantidad de caracteres. Su programa debe ser capaz de representar tanto la Curva del Dragón como los Tallos de Ramificación desde la página de Wikipedia proporcionando la entrada adecuada (archivo, línea de comando, pero externa a la fuente, por favor).
Este es el código de golf.
Editar: Aquí hay algunos ejemplos que he publicado en la ciudad. responda a SO / rotate-to-north { Donde descubrí por primera vez el sistema L } , responda a SO / how-to-program-a-fractal , responda a SO / recursion-in-postscript , discusión de comp.lang.postscript / recital , postscript l-system collection , codegolf.SE/draw-a-sierpinski-triangle {origen de la competencia entre yo y thomasW} .
fuente
Respuestas:
Mathematica
200198188171168Espacios añadidos para mayor claridad:
Dónde:
Gramática de reglas de producción:
La secuencia {2,4,6,8} está ahí porque estoy usando
I^n
(I
= unidad imaginaria) para hacer turnos.Ejemplos:
fuente
Graphics@k
porGraphics@Flatten@k
si va a utilizar muchas iteraciones. De lo contrario, un límite de recursión lo morderá y su sesión de MMA se cancelará.Python,
369294No soy un ganador, pero publicaré lo que he intentado de todos modos.
No es bueno jugando al golf en Python ... Tal vez alguien más pueda hacerlo.
Entrada
La entrada es de un archivo externo llamado "l" (sin extensión), con el siguiente formato:
Línea 1 : Estado inicial (Axiom)
Línea 2 : Reglas separadas por comas
Símbolos
f
yF
: avance+
: gire a la derecha 5 grados-
: gire a la izquierda 5 grados[
: guarde la posición y el encabezado]
: posición y encabezado pop Lafunción de dibujo ignora otros símbolos.
Reglas
Una regla tiene el formato
"predecessor":"successor(s)"
Tenga en cuenta que las comillas son necesarias, ya sean simples o dobles.
predecessor
debe ser un solo personaje.Además, no hay constantes implícitas: debe especificar explícitamente una regla de no cambio para ellas.
Ejemplos
Tallos ramificados
Salida
Tenga en cuenta que la fuente se modifica para sacar esto puesto SOLO PARA ESCALAR ABAJO EL GRÁFICO AL ÁREA VISIBLE. La consola también se usa para ocultar la "tortuga".
Curva del dragón
Salida
De nuevo, la consola se utiliza para ocultar la "tortuga".
Triángulo Sierpinski
Generaciones de salida reducidas a 5 aquí.
fuente
f
,r
,l
; agregando un parámetro ficticio ao
yc
; y luego cambiando el pseudo-cambio a{'f':fd,'F':fd,'+':rt,'-':lt,'[':o,']':c}[k](5)
g
, y creoo
yc
valen la eliminación de la líneaif
declaraciones (más barato que laglobal
declaración)o
yc
directamente en el pseudointerruptor) dieron errores de sintaxis, pero otras no t.s,R,*p=input().split()
. 3. Genere el valor final des
byexec('s="".join(map(eval(R).get,s));'*8)
. 4. Dejar de ladocontinue
. 5. Sangría solo 1 espacio. 6. Ahorre espacio despuésif
de cambiar los lados de la prueba. 7. Pongak:int
ladict
(primera entrada) y luego no la necesitaexcept: try:
. (Obtengo 215 caracteres.)Javascript (179 bytes)
No estoy completamente seguro de que esto califique, ya que el objeto de reglas hace todo el dibujo real.
Demostración (Dragón, animación):
- Ampliado: http://jsfiddle.net/SVkMR/9/show/light
- Con Código: http://jsfiddle.net/SVkMR/9/
Minified:
Legible (ish):
Entrada:
Uso:
Bono: Golden Spiral http://jsfiddle.net/SVkMR/35/show/light/
fuente
Posdata
264298295255Aquí está mi intento de hacerlo de manera diferente. En lugar de la macroexpansión que utilizo habitualmente, esta comprueba el tamaño de la pila de ejecución para vincular la recursividad. Si se supera el límite, deja de examinar el procedimiento de forma recursiva e intenta interpretar los comandos de tortuga (y descarta lo
pop pop
contrario). Una ventaja de este método es que no requiere enormes cantidades de memoria. Una desventaja es que el control de recursión es bastante torpe, ya que el tamaño de la pila crece en más de 1 de un nivel de recursión al siguiente.Editar: +34 caracteres para ramificación.
Editar: -3 caracteres. Rediseñado para usar la pila de operandos para el control de recursividad. Esto hace que el sistema básico sea mucho más simple. Pero los paréntesis necesitan una pila independiente, así que puse la posición guardada en la pila del diccionario y casi pagué todos los ahorros.
Además, rediseñado para usar cadenas y enteros en lugar de matrices y nombres.
Editar: -40 caracteres. Se agregaron dos procedimientos para llamar a los nombres del sistema por número (parece que no puedo hacer que funcionen los tokens binarios en bruto . Pero este modismo funciona para mí).
Binario semi-comentado.
Un- "binario".
Requiere que el sistema L se defina en un diccionario en el dictstack, con la cadena inicial y la posición inicial de la tortuga en la pila de operandos (antepuesta a la fuente, por ejemplo
gs dragon.sys lsys.ps
).Curva del Dragón
Tallos ramificados.
Ungolfed y comentó.
Para ejecutarlo, estos 3 bloques se pueden guardar como 3 archivos: dragon.ps, stems.ps, lsys.ps (cualquiera de los bloques de programa anteriores funcionará de manera idéntica). Luego corre con gs:
gs dragon.ps lsys.ps
ogs stems.ps lsys.ps
. También se pueden concatenar primero, si se desea:cat dragon.ps lsys.ps | gs -
ocat stems.ps lsys.ps | gs -
.No hay imagen de tallos. No se vuelve más interesante a mayores profundidades.
fuente
Mathematica 290
Esta implementación básica se centra en el resultado en lugar del procesamiento. No utiliza reglas de producción. Por lo tanto, puede que no sea una respuesta adecuada al desafío.
Tallos ramificados adaptados de la demostración de Theo Gray .
Código
Uso
El primer parámetro determina si se mostrarán Dragon Curve o Branch Stems. El segundo término se refiere a la generación.
Más ejemplos
fuente
A->F[+A][-A]
dóndeF
se mueve,+
gira a la izquierda 30,-
gira a la derecha 30 y[
/]
son push / pop