I'm looking for a cutesy way to express the following:

           (<. + 0 2 {~ 0 0.5 i. 1&|)

The input is a vector of non-negative real numbers, which are either integers 
or whose fractional part is one-half.  Equivalently, the input is  -: V  where  
V  is a vector of non-negative integers.

The output is a vector of non-negative integers, similar to the input, but 
where each non-integer scalar  S  has been replaced with  2+S  (the integer 
scalars have been left alone).


-Dan


PS:  The application is in the context of the iterated batrachion function  
(hcs n) - n%2  where  hcs  is the "Hofstadter-Conway $10,000 Sequence".  See 
the right graphic in the first figure at 

     http://mathworld.wolfram.com/Hofstadter-Conway10000-DollarSequence.html

You can plot it in J with:

           require 'plot'
           
           hcs        =:  1:`((] +&:$: -) $:@:<:)@.(2&<) M.               NB.  
Hofstadter-Conway $10,000 Sequence
           batrachion =:  hcs - -:

           plot batrachion"0 i. 1000

While investigating this function, I noticed that  hcs  was in the OEIS (it's 
A004001 [1]), but  (hcs n) - n%2  is not.  I decided to add it (and evangelize 
J a bit, because I think the verb  hcs  shows J off well), but then I realized 
why it wasn't in there in the first place:  it contains non-integers.

So I need to convert the non-integers to integers.  The first thing that popped 
into my head was to take the sum of the denominators of the egyptian fraction 
expansion of each scalar.  Adapting Roger's  ef  verb [2] a bit, I came up with:

           
           ef         =:  (  ((] , $:@:(- %)) >:)^:((~: %)~) <.@:% ) M.   NB.  
Egyptian fraction denominators
           ib         =:  +/@:ef@:batrachion"0                            NB.  
Integer batrachion

           plot _&=`(,:&0)} ib i. 1000

But then I realized this was overkill, because each scalar is either an integer 
(and  N = +/@:ef N  is a tautology for integer  N  ), or halfway between two 
integers, which means all the denominators but the last are  1  ,  and the last 
is always  2  .

So now we have:

           lef        =:  (<. + 0 2 {~ 0 0.5 i. 1&|)                      NB.  
"Limited" egyptian fraction
           ib2        =:  +/@:lef@:batrachion"0

           plot ib2"0 i. 1000

But I would really like to show off J, and I feel that  lef  is just too "brute 
force" (imperative).  Further, OEIS has a very mathematical emphasis, and  les  
has a programming bent.  So I would really like a cuter, more mathematical 
replacement.

If you provide one, the bonus is you get your name immortalized in the OEIS (as 
a reference and a link to your message).

[1]  http://www.research.att.com/~njas/sequences/A004001
[2]  http://www.jsoftware.com/pipermail/programming/2005-November/000064.html

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to