En una entrada reciente de Thehardmenpath, descubrí la regla 30 de Stephen Wolfram. Modificando el código Logo de el juego de la vida que habíamos publicado antes queda un sencillo código (que incluyo al final). En la imagen superior puede verse la salida de la regla 30. Otros patrones que se pueden formar son estos dos fractales:
El primero sale programando que la celda se dibuja si en la anterior hay solo una dibujada o bien las tres, y el segundo programando que solo haya una celda dibujada en la anterior.
El código para usar en UCBLogo es el siguiente:
;
; Juego wolfram
; raultecnologia
; https://raultecnologia.wordpress.com
; para empezar el juego teclea el procedimiento inicio
;
make «sizea 35 ;definimos una tabla de sizea filas y sizeb columnas
make «sizeb 68
make «tablaactual (mdarray (list :sizea :sizeb) 1)
make «medio sizeb/2
to inicio
cs
hideturtle
setpensize 1
penup
setxy -200 140
setpencolor 4
label «|Juego wolfram|
make «tecla rc
clearscreen
setpencolor 7
comienzo
end
to comienzo
borraactual
mdsetitem (list 2 :medio) :tablaactual 1
regla
mostrar
end
; procedimiento para poner a 0 la tabla actual
to borraactual
for [i 1 sizea 1] [for [j 1 sizeb 1] [mdsetitem (list :i :j) :tablaactual 0]]
end
;procedimiento para mostrar la tablaactual
to mostrar
make «posx -350
make «posy -240
penup
for [i 1 sizea 1] [for [j 1 sizeb 1] [make «dentro mditem (list :i :j) :tablaactual ~
setxy posx posy if [dentro = 1][label «#] make «posx posx+12] make «posx -350 make «posy posy+12]
end
;
;el procedimiento regla definimos condiciones aa bb cc etc y ahi es donde preparamos
;las diferentes reglas de wolfram
;
to regla
for [i 2 sizea-1 1] [for [j 2 sizeb-1 1] [aa bb]]
end
to aa
make «dentrox mditem (list :i-1 :j-1) :tablaactual
make «dentroy mditem (list :i-1 :j) :tablaactual
make «dentroz mditem (list :i-1 :j+1) :tablaactual
if dentrox+dentroy+dentroz = 1 [mdsetitem (list :i :j) :tablaactual 1]
end
to bb
if [dentrox = 0] [if [dentroy = 1] [if dentroz = 1 [mdsetitem (list :i :j) :tablaactual 1]]]
;if dentrox+dentroy+dentroz = 3 [mdsetitem (list :i :j) :tablaactual 1]
end