Thanks for all the examples. I thought that the solution would be pretty
straightforward.

c1 gives the number of ones in an integer:
* c1=.{{+/1=10#.^:_1]y}}"0*


Test it:

* c1 211*

*2*


So the number of ones from 1 to 81 is:

* +/c1 i.>:81*

*19*

To develop the inverse verb F, we can get a running sum of ones:
 *  +/\c1 >:i.100*

* 1 1 1 1 1 1 1 1 1 2 4 5 6 7 8 9 10 11 12 12 13 13 13 13 13 13 13 13 13 13
14 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 16 16 16 16 16
16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18
19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 21*


So to find the integer where the sum of ones equals 19:

*F=.3 :'{.n#~y=+/\c1 n=.>:i.100'*

* F 19*

*81*

This works great, except that I need to make sure that the running sum
index n, is larger than the expected answer. In this case, the integers
from one to 100 were sufficient, but that was discovered by trial and error.


Ideally, the running sum could be defined as an iterative process that
terminates in an integer, when the running sum iteration reaches or exceeds
the required count. Then the output of F is that integer.


So I was mainly wanting to see how to define a verb F that iterates on a
running sum of one counts until the sum reaches the right argument of F,
then returns the integer that terminates the ones count.

So I just want to know how to modify:

*F=.3 :'{.n#~y=+/\c1 n=.>:i.100'*

to a running-sum iteration which terminates & returns the final integer
that matches the ones count input, and does not have to predefine the index
count.

Skip Cave
Cave Consulting LLC


On Tue, Jan 18, 2022 at 3:58 AM Raul Miller <rauldmil...@gmail.com> wrote:

> I should have removed from 'seno' the line that says:
>      assert. hi<1000
>
> The purpose of that line was to save me from having to use jbrk if I
> hit an infinite loop from getting my conditions backwards. It's not a
> useful mechanism, and should have been removed before I posted the
> implementation.
>
> FYI,
>
> --
> Raul
>
> On Tue, Jan 18, 2022 at 2:27 AM Hauke Rehr <hauke.r...@uni-jena.de> wrote:
> >
> > I didn’t do it much differently, conceptually.
> > But instead of binary search (bisection)
> > I split it up in ten buckets (dekasect).
> > Apologies for the bad naming:
> > another greek-latin hybrid, oh my …
> >
> > I split that way because I wanted to evaluate
> > ones more often on small inputs than large.
> > Didn’t measure if it atcually helps, though.
> > And maybe I should have added an M. in order
> > to memoize?
> >
> > But seno definitively reads better.
> >
> > Am 18.01.22 um 02:54 schrieb Raul Miller:
> > > Your 'ones' is a bit more efficient than the routine I had come up
> > > with, so I'll stick with your implementation here.
> > >
> > > Meanwhile, it's perhaps worth noting
> > >
> > >     I.213=ones i.1000
> > > 521 522 523 524 525 526 527 528 529 530
> > >
> > > So, building the inverse... it's typical for there to be ten numbers
> > > who had n "one digits in the sequence". But, for example, there's no
> > > number which has exactly 3 "one digits in the sequence". Ten has 2,
> > > eleven has four. But we can find the minimum value which had at least
> > > n preceding one digits.
> > >
> > > Personally, I'd use a binary search here:
> > >
> > > seno=:{{
> > >     if.y=ones y do.y return.end.hi=.2*lo=.y
> > >     while.y>ones hi do. hi=.2*lo=.hi end.
> > >     while.hi>lo do.
> > >       assert. hi<1000
> > >       select.*y-ones mid=.<.-:lo+hi+1
> > >         case._1 do.if.hi=mid do.lo=.hi break.end.hi=.mid
> > >         case.0 do.lo=.hi=.mid break.
> > >         case.1 do.lo=.mid
> > >      end.
> > >    end.
> > >    while.y <: ones lo do.lo=.<:hi=.lo end. NB.  maybe too crude...
> > >    hi
> > > }}
> > >
> > >     seno 213
> > > 521
> > >     ones 521
> > > 213
> > >
> > > FYI,
> > >
> >
> > --
> > ----------------------
> > mail written using NEO
> > neo-layout.org
> >
> > ----------------------------------------------------------------------
> > 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