This code is way obsolete - Junior has moved on to the more sophisticated indexing of points that will be needed for really large numbers of points.
I think 'gen' may be the verb that creates a point set. If you want to try to understand it, go ahead, but I posted it merely as an amazing example of a first J program. Henry Rich Yuvaraj Athur Raghuvir wrote: > 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 > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
