---Sherlock, Ric wrote
> --bill lam wrote:
> > Sherlock, Ric wrote:
> > > My solutions as follows:
> > >    textend=: {:@$&.>@[ {."1&.> ]
> > >    pplinv textend pinv
> > > +-------+------+
> > > |Joan   |Saxon |
> > > +-------+------+
> > > 
> > >    pplinv tindexof pplinv textend pinv
> > > 4
> > > 
> > 
> > A potential gotcha is that text in pinv is longer than pplinv, your 
> > solution will trim pinv to shorter length but there should 
> not be any 
> > match because pinv is longer than pplinv.  Of course if it is known 
> > before hand that pinv must be shorter than pplinv, there will be no 
> > problem.
> 
> Very true! 

I think this solves that problem:
tindexof2=: ([,&.>]) tindexof {:@$&.>@([,&.>]) {."1&.>]

  p3=: 'Josephine';'Saxon'
  p3inv=: ifa mfv p3

Basically I append the names to be looked up to the lookup table and
then extend the names to be looked up by the widths of the appended
lookup table. The lookup is done on the appended table.
  ppl i. p3
500
  pplinv tindexof2 p3inv
500

Of course if there are more than 1 names to be looked up, the result may
include indices greater than #ppl, but will still provide the correct
answer to the normal "is found" test i.e. the resulting index is not
less than #ppl
  (#ppl)>  ppl i. p,p3
1 0
  (ttally pplinv)> pplinv tindexof2 pinv ,each p3inv
1 0

Performance is only a bit worse:
   ts '(tolower each pplinv) tindexof1 (tolower each p2inv)'
0.000125434936563 8320
   ts '(tolower each pplinv) tindexof2 (tolower each p2inv)'
0.000133257159779 8320
 
The phrase [,&.>] is used twice so I wonder if it is possible to
simplify tindexof2 further?
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to