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

Reply via email to