Many weeks later, I have this obfuscation to show for it:
use Tk ; ($ "= q \$ +; W) i(s 9o ),B )$,} n$ p90)=2+$ m$sdnr 0,;/)$,=w uo,ix+((; E,s)bw$ n3&" ())h=N ot/9x?$} ?i(A>,fg 0"[xp (f"{n$"; ,e0,u$t" meP#$4q$ s1,yw," J5$9yheJ( ;$ .=,Z])@q3 ($ $O"~9)+=B" ;1fM,%s0&)(,*@,,$0/ :&($H"F4$>k2#2n[v()=)t a)xp4e:,$?@))f="/0xx $b$A;=t@x1,t]I,2Rm@e$3 0;?)$:Ga_r_,09i)} B1Vp;(;A,0f(},/;{$1$(2 :($$$@(f0V041" ?Me2F"+0,02.[,:="r=>2 ,0"0>$1sea>d 5 7,euF;pqnse52q9p,$l$dul ):3$]d1liW(b e,20Z+a)=t)${tA8:))t;("otd e(04{?e($&r o(0,0p/($U"$${$,,u;)b=,W f$k 27s(;,~".) V)5 26h"$$/9=}=;5x0@:HB^0"s$f)4 :B";)(,,uMo,/6,e p=[3" brAg0Hqu(a6;N>((;,($s$0 $PC$0$$shez,W {aj,J6 b) @,]9.mn=2 =0,aS$+0=yv05~ :$n,F):s(a;5s 4B d$)/6p $s$ )/0,(H}i0 rq (j;#,$$;(), i,<@hcPp0?n$h@_/3,,u.09 treA=80$$s.:0f ),;s0 :Cd h@$:"=6$p,7,)@UU6%@4jl301=I;0d_0+i2,)(,1$ ,*;,+t0 9;1 $)r9%()",0n,A}=0.$w{,6:e$}(s:3ri$"01xP@0 q1f*, Z,:4t)F.r2"c6=$20};;.t0,o4$J4,$$p@(,Js0A;0 +sPrA$9($,[$,&=is00q$x3$n1*:,,bj=66c= t)$63$g]$001$}s06r=;Xx,$;/@+,0*>$=54bw; $$)s"bs/5;h&HS9,ib=hg,$i_;*0Anl$i;9Sl( $$:($anf$0=e2MS6.qc+tT:$())02)k(;=2C$;> ;,,}"$$J4Pmu$.s)jy(0$apq95u/=1,Bp d=0)b>@$ ,;){aa:}NpAz59@{$tt1(Ha )= )0U$Yea81{c*6;:=g=(n0.$k (4@6s+s)2,.Q;$0r0p=h;($=mP =,l$i$$9wpasmiufHS0)op$ha9 t;t=,:;p{nip0((@[$6$;()f {: "$C@s0W[$;t$8,D;B),.@J$ ;_0",$]; =_,B$},,$H}$9",$=H(9$E=}G0,$A$=00Z)s@= :+V)o[.:)=hI$6"=+].8;Pi;q0;>s(;$0m(f@* ,$cp$$T,a(tS59grljg9p1@=70[ei/=10{8S@.: $at@0):$0;I21pt"A;;8U+$=98]e=)f@0=$h(50 =L"*og,$g=)7,$i;(r=U)$;i+Wn$$((9[/_&f&}eJO @"0$5;_!3((=_.:_7$($51@~$)"6].K3_0._so{)0; 2=);,. ,/)ix,i9$;$3J#;f$f5m$G6(ft$(T9(7;V01i /c" ;0",w =,,l8=+$:+$h>$7$l0$"L2"dipl5L=,ne=4e)la;:) >1+ q(0q;e c(2)$7($5,$((k $5;Y6(_>U$$FD0$,,$)$9)vK o,,A6j{T0 {, r$w0+p ):( $gE7 i: 1u?6$I)e)5=d4) s$0e){t=:jt8/h T,,=&}P9oh 0@ @:$(_ w(0i=,A$59F$(h$ ,n>)H;0)x.iG"$1*,m:=5l/ 7!Q2( Ha8($)e55")0$(p0 $D;+7:,]xP${,c,@1.2@}2x$9 ,$ A}25gs/$,p0 $y = )90;ugn$=:C+s;5,wb;)ys8)$pM 7 aN$;,p0}El a,1r_J$$l,e)ii$0n{=CXi9l; tnI5"s~=,c0s p(L*:Aes$$e:eu"o$4ll/oz(8{ s! or5ge#+,@0$ h"p),=cs(2r,I@,;;$t/( ),+=$$s(7A$1$; J"(Hhu$5$a3jl(i$,)be: /,0+a1fUH;N,9"$,1s ,!=(mJ$0;a1)t@@~$y{F,p, 3/}rFsx@i)7u$0@();, , Bn=5sa,A$$($=t(:h,9)u 1M[y(($8@$0*,,=*,)A b0C _:($ 1M/ $;(+,,[3 $s )a]vm@$7$0 8O,;i),a _D5Y]0$( n ($p),:=} , $P$W.I{\ )=~s"[ $/ ]""g ;map{$h{$_} .=substr $",0 ,1,""} split//, crypt(qw/ FRaCtal: /, q+rp +)x160; $_=join //,map {$h {$_ }} sort keys %h ;s /N / /xg; eval #l iv er po le
The purpose of the program (if peek you must) is ...
... to calculate fractals, using Perl/Tk. By default it will "fractalize" the word "JAPH", but one can instruct it to use one or more shapes, as well as a fractal algorithm for each shape.
My inspiration for this was the Koch snowflake.
When passed two or more arguments, the first specifies how many "generations" to evolve each fractal. The second argument(and any remaining arguments) specify what shape to draw, and how to evolve it.
You can either use give the coordinates of the shape, or use a shorthand ('#t' for triangle, '#s' for square, '#p' for pentagon', and '#h' for hexagon), followed by an optional algorithm. If no algorithm is given, an algorithm will be generated randomly.
For example, to draw a square (and evolve it with a random algorithm for 4 generations) you could do either of:
fractal.pl 4 #s or fractal.pl 4 100,100,90:400,90:400,90:400,90:400
The second form specifies to start at location (x,y) = (100,100) (in the lower left corner of the Tk window), and draw the first line at an angle of 90 degrees for 400 pixels. The next 3 lines are then drawn with 90 degree angles, also for 400 pixels each.
The algorithm should given by putting '=' immediately after the shape definition, followed by the algorithm. Each line segment of the current shape is permuted according to the algorithm, where the following symbols are used:
. => don't permute this portion of the line segment ! => go to next portion of line segment (next rule) A*B => specify next angle/distance for this portion , => go on to next angle/distance + => complete journey to next point in line segment
So, for example, to draw a Koch snowflake with 5 iterations:
fractal.pl 5 #t=.!60*1,+!.
In the above example, the algorithm divides each line segment into 3 portions with the following rules:
. # Do not change the first portion 60*1,+ # Rotate 60 degrees away from the current # heading, for a distance equal to 1 times # the length of the current portion of the # line segment. (The '*1' can be omitted, # without changing the effect). Then, # draw a final line completing the trip # to the next point beginning the next # portion of the line segment. . # Do not change the last portion
One more example:
fractal.pl 4 #s=.!90,90*.5,90*1.5!.
which will create a square, and then replace the middle third of each line segment with a 90 degree angle going the length of that portion, followed by a 90 degree angle for half the length, followed by another 90 degree angle for 1.5 times the length. In this case, there is no '+', so the resulting shape will be discontinuous each time.
I hope you have as much fun watching it as I do!
Update: Can you figure out why the plaintext "FRaCtal:" and salt "rp" were used as arguments to the crypt function?


Replies are listed 'Best First'.  

Re: Fractal Japh
by BrowserUk (Pope) on Jul 29, 2007 at 11:50 UTC  
Re: Fractal Japh
by dbw (Beadle) on Jul 30, 2007 at 01:14 UTC  
Re: Fractal Japh
by chargrill (Parson) on Jul 29, 2007 at 17:22 UTC  
Re: Fractal Japh
by zentara (Archbishop) on Jul 29, 2007 at 12:14 UTC  
Re: Fractal Japh
by tweetiepooh (Hermit) on Jul 30, 2007 at 10:08 UTC  
by liverpole (Monsignor) on Jul 30, 2007 at 13:17 UTC  
Re: Fractal Japh
by wolfger (Deacon) on Jul 30, 2007 at 19:10 UTC  
Re: Fractal Japh
by wulvrine (Friar) on Aug 01, 2007 at 14:37 UTC  
Re: Fractal Japh
by Ray Smith (Beadle) on Aug 01, 2007 at 14:50 UTC  
Re: Fractal Japh
by Argel (Prior) on Jul 31, 2007 at 20:34 UTC 