I am still at the stage where I enjoy the joke: that APL/ J is a write only language
Dick ----- Original Message ----- From: Henry Rich <[email protected]> Date: Friday, August 14, 2009 11:59 am Subject: Re: [Jgeneral] J as a first language WAS: Array Based Languages To: General forum <[email protected]> > 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 > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
