A few months ago, I was in the middle of another Perl project, and on an impulse took time out to try something new.  As is often the case, I didn't expect it would take more than a few days to finish it.

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$9yhe|J( ;$ .=,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,e-uF;pqnse52-q9p,$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 27-s(;,~".) V)5 26h"$$/9=}=;5x0@:HB^0"s$f)4 :B";)(,,uMo,/6,e p=[3" b-rAg0Hqu(a6;N>((;,($s$-0 $PC$0$-$shez,W {aj,J6 b) @,] =0,aS$+0=yv05~ :$n,F):s(a;5s 4B d$)/6p $s$ )/0,(H}i0 rq (j;#,$$;(), i,-<@h-cPp0?-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($,[$,&=|i-s00q-$x-3$|n1*:,,bj=66c= t)$63$g]$00-1$}s06r=;Xx,$;/@+,0*>$=54bw; $$-)s"bs/5;h&HS9,ib=hg,$i_;*0Anl$i;9Sl( $$:($anf$0=e2MS6.qc+tT:$()-)02)k(;=2C$;> ;,,}"$$J4-Pmu$-.s)jy(0$-apq95u-/=1,B-p d=0)b>@$ ,-;){aa:}NpAz59@{$tt1(Ha )= )0U$Yea81{c*6;:=g=(n0.$k (4@6s+s)2,.Q;$0r0p=h;(-$=mP- =,l$i$$9wpa-sm-iufHS0)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(tS59grljg-9p1@=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;V-01i /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,,A-6j{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@}2-x$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: 4 #s -or- 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: 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: 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 (Patriarch) on Jul 29, 2007 at 11:50 UTC
Re: Fractal Japh
by dbw (Beadle) on Jul 30, 2007 at 01:14 UTC
    This is the best thing I've ever seen. I'd have been impressed if that code did anything at all, or if you provided 5 pages of code to do what your program does. This left me speechless. (Well, I spoke, but I only said NSFW words...)

    I'm going to put this on the wall of my office...

Re: Fractal Japh
by chargrill (Parson) on Jul 29, 2007 at 17:22 UTC


    Brilliant! (no pun intended, but I do like the bright color scheme(s) you've selected ;-)

    s**lil*; $*=join'',sort split q**; s;.*;grr; &&s+(.(.)).+$2$1+; $; = qq-$_-;s,.*,ahc,;$,.=chop for split q,,,reverse;print for($,,$;,$*,$/)
Re: Fractal Japh
by zentara (Archbishop) on Jul 29, 2007 at 12:14 UTC
    It's nice to look at, but gains memory quite quickly.

    I'm not really a human, but I play one on earth. Cogito ergo sum a bum
Re: Fractal Japh
by tweetiepooh (Hermit) on Jul 30, 2007 at 10:08 UTC
    So how did you find that the output of crypt contained those magic letters?
      Hi tweetiepooh,

      Just by writing a Perl script to randomly choose plaintext strings, using upper or lower case for each letter of "fractal:" at random, and then test those with every legal salt value, until the output of crypt gave me the desired result!

Re: Fractal Japh
by wolfger (Deacon) on Jul 30, 2007 at 19:10 UTC

    Very nice! As others have said, it would be an impressive obfu if it did anything at all, and what it does is impressive all on its own. But, as much as I'd like to just let it run all day, it does have a memory leak somewhat akin to the "leak" at the Hoover dam. Still incredibly impressive.

Re: Fractal Japh
by wulvrine (Friar) on Aug 01, 2007 at 14:37 UTC
    Way to do it YET again! ++liverpole!!
    Your obfus are always brilliant and very entertaining.
    But this one is warping my mind! Hell of a job! I love that
    you can run it over and over for different warpings
    Hell of a job!!

    s&&VALKYRIE &&& print $_^q|!4 =+;' *|
Re: Fractal Japh
by Ray Smith (Beadle) on Aug 01, 2007 at 14:50 UTC
    Quite pretty!
Re: Fractal Japh
by Argel (Prior) on Jul 31, 2007 at 20:34 UTC
    I'd just like to echo the ++ from several others. I love fractals, making this possibly the best JAPH I have ever seen. I bow in awe!