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

Reply via email to