Interesting! Can you give a test set that I can use to understand this code? Also a reference to the problem description and its solution will help.
Thanks, ~Yuva On Fri, Aug 14, 2009 at 5:22 AM, Henry Rich <[email protected]> wrote: > I have long thought that J would be easier received by students who had > never learned a scalar programming language. > > Now that I teach highschool, I have had the chance to test that idea. > Last year I took two very strong students and had them work on > individual projects using J. One of them used the year to rewrite the > water-quality model that the State of North Carolina uses for approving > water projects - so now a J application is used for that. Cool! So far > I consider my hypothesis to be confirmed. > > For this upcoming year I will have one student, and he is a true genius. > A real mathematician through and through. We agreed at the end of the > last school year that we would work together this coming year. At the > beginning of July he downloaded J, and then, when he wasn't going off to > some camp or other, he worked at it a little off and on. A couple of > weeks ago he sent me what he had come up with. > > I was flabbergasted, and you will be too when you see the code at the > end of this message. The problem he chose to work on was collision of > moving spherical bodies in n-dimensional space. > > Not only is he a mathematician, he has the makings of a programmer. > When I sent him back a shorter version of his collision code, he replied, > > I think my coding is pretty comprehensible... > > So take that, those of you who say J is hard to read! > > Here it is, Junior's code, the code of a 16-year-old with no programming > experience and two months' self-study in J. This is what he sent me, > with no alterations or suggestions by me. You would have to undo the > line-wraps if you wanted to study it carefully. Note the sophisticated > ideas he uses. This shows, to me, what could happen if you approached > the language on its own terms without trying to make it seem like other > languages. And if you were as brilliant as Junior. > > Henry Rich > > > > NB. Points are rank 2 arrays formed by positions ,: velocities > NB. so the shape is 2 , number of dimensions. > NB. All verbs work for n dimensional points. > NB. Points are treated as the centers of radius 1 spheres. > > NB. Bounds are a rank 2 array formed by laminating the 2 element > NB. lists of max and min values for each dimension, so their axes > NB. must be reversed to correspond to points. > > sampbound=:3 2$0 30 10 40 20 50 NB. 0<x<30,10<y<40,20<z<50 > tb1=.(((- {.) % {:@])"1 |:)"2 > tb=:<./@:(#~ 0&<)"1...@tb1 f. NB. gives the times each point will hit > the bounds > > rp=:(({."1 + ?@:(0 $~ #) * -~/"1) ,: <:@+:@?@:(0 $~ #))"2 NB. > generates a random point within the given bounds (right argument) > gen=:rp@:($ ,:) NB. Generates x points within bounds y > which may or may not intersect > dist=:(+/&.:*:)@:({.@:-)"2 NB. Distance between two points x and y > test=:(0 = +/)@:((2 > dist/~) * </~@:(((<0 1) { ])"2)) # ] NB. > Removes all intersections between points > > pos=:(+/ ,: {:)"2 : (({...@] + (* {:)) ,: {:@])"2 NB. position of > point y at time x, default 1 > a=.+/@:*:@{: > b=.+/@:(*/) > c=.+/@:*:@{. NB. distance between two points at time t > is %:@:(+/)@:((t ^ (i._3)) * (a , +:@:b , c)) > NB. The following verbs operate on two points as right and left > arguments and give data pertaining to the right one. > t1=.((a %~ -@:b (+ , -) %:@:(*:@:b + a * 4 - c))@:-)"2 NB. times at > which two spheres will intersect-may be negative or complex > t=:<./@:(#~ 1 = *)@t1 f. NB. first positive real time of collision, > otherwise _ > col=:(((0 > b % a) * (0 <: *:@:b + a * 4 - c))@:-)"2 f. NB. > determines if two spheres will collide > t2=:_"[email protected] NB. gives the same result as t but is > faster for points that do not collide > pts=:{."2@(t pos ,:) NB. gives position of point x ,: position > of point y at time of collision > m=.(% {.)@:(-/@:pts) NB. vector with the same direction as the > line between both point at the time of collision > x1=.%/@:(+/@:(m * {:@] ,. m)) > a1=.x1 * m > colv=:({:@] - a1 - a1~) f. NB. velocity of point y after collision > collide=:(colv ,:~ {:@:pts + colv * -.@:t) f. NB. point y after 1 > time unit, taking into account collision with x > > cola=:({.@:(t pos ]) ,: colv)"2 NB. point y immediately after collision > colp=.(cola~ ,: cola)"2/ NB. operates on two points x,:y and > gives positions immediately after collision > NB. These verbs operate on a rank three array of points, possibly with > bounds as a left argument. > ttab=:t2/~ : (t2/~...@] ,. tb) NB. gives a table of collision > times, also with bounds if bounds are given. > tt=.<./@,@:ttab NB. gives time of the first collision > i=.I.@:(+/"1@:(tt = ttab)) NB. gives the indices of the points > that are colliding > ptt=.<@:(i , 1 , (tt i."1~ [ tb i { ])) NB. if a point is > colliding with the bounds, gives the position of the velocity that will > be reversed. > mcolb=:(ptt { -...@])`(ptt)`(tt pos ]) } f. NB. calculates the > positions of points up to the first collision with bounds, not > considering point collisions. > mcolp=:i (((colp@:{)`[`((pos~ tt)@])) }) ] f. NB. calculates the > position of its argument up to the next collision, does not consider > bounds. > mcol=:1e_10 pos ((mcolb`(mc...@]))@.(<:@#...@i.@:(+/@:(tt = ttab)))) > NB. calculates position of arguments to next collision, counting bounds, > with a small offset to avoid rounding error. > > > > DIETER ENSSLEN wrote: > > thanks > > > > I have never yet met a language as difficult as this, where I try to copy > a string of to me still totally meaningless symbols again and again and > again and still get errors > > > > I hope to find compensating rewards > > > > Dick > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
