Hi Skip, When using n (or v) as names in a direct definition, it assumes you're defining a conjunction:
F=.{{{.n#~y=+/\c1 n=.>:i.100}} F 19 F(19) type <'F' ┌───────────┐ │conjunction│ └───────────┘ FF=:{{{.nn#~y+/\c1 nn=.>:i.100}} type<'FF' ┌────┐ │verb│ └────┘ or you can explicitly tell it to make a monad using )m (note, doesn't seem to work on a single line): FFF=:{{)m {.n#~y+/\c1 n=.>:i.100 }} type<'FFF' ┌────┐ │verb│ └────┘ I hope this helps, Jan-Pieter On Sun, Jan 23, 2022, 07:03 Skip Cave <s...@caveconsulting.com> wrote: > Also, > > Also, why doesn't this work: > > F=.{{{.n#~y=+/\c1 n=.>:i.100}} > > F 19 > > F(19) > > > > > Skip Cave > Cave Consulting LLC > > > On Sat, Jan 22, 2022 at 11:50 PM Skip Cave <s...@caveconsulting.com> > wrote: > > > 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 > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm