one minor improvement:
getCtCol =: (0 ".  _1 {:: {) :: 0:

If you are going to hardcode tables to the application rather than making an 
"inference engine" where the tables are a variable set of parameters of 
"fallback lookups", then getval is quite sensible as is.
I just see a dyad opportunity if you wanted to pass tables along with the key 
columns as (#t),2 boxed table.  Then you could recursively walk through the x 
table comparing with the first item, and then recursing with beheaded x if not 
found.  Or the same approach with a for loop is reasonable too.
This all depends on whether this is intended as a generic algorithm or not, and 
I don't understand quality very well.
If its about showcasing J, data driven programming is a cool paradigm:
getVal =: single param test recursive or for.
citySportVal =: ((9{a.) cut 0 : 0) & getValtables TAB fields to look at from 
tables )       From: Joe Bogner <[email protected]>
 To: [email protected] 
 Sent: Saturday, October 3, 2015 8:45 AM
 Subject: [Jprogramming] comparing languages - input to show J's strength on a 
lookup/match function
   
I'm working on an app that needs a function to return a value based upon
matching to 4 different sources and returns the most specific match that
meets a quality threshold.

Here is an example:

The last column of every table (e.g. city_sport) indicates the quality
threshold and the column before that is the value I'd like if the quality
threshold is above 3

The logic in words:

Search city_sport
if not found or quality not sufficient, search city
if not found or quality not sufficient search sport
if not found or quality not sufficient search item

The logic works. I wrote it quickly in J using my natural imperative
mindset. I then was able to very quickly translate it into C# (probably
demonstrating how imperative my mindset was)

J version: https://gist.github.com/joebo/381552e6ad106391e128
C# version: https://gist.github.com/joebo/a0ff7eb57ee15ea96c61

I'm looking for input on how to rewrite getVal to show improved
maintenance, conciseness over the C# version (subjective, I know)

Some half-baked thoughts:

1. Instead of using the if., at each step build up all the possible results
and find the result in the final step

Note: this will be searching a table of 180,000 rows so performance may
matter. The current J version doesn't short circuit, but it could fairly
easily

2. Some trick with agenda


Thanks for any input

Code below:

city_sport=: ' ' cut every <;._2 (0 : 0)
hat chicago baseball 1 5
hat chicago football 2 5
hat atlanta baseball 3 2
hat orlando football 3 3
glove orlando baseball 3 3
)

city=: ' ' cut every <;._2 (0 : 0)
hat chicago 1 5
hat atlanta 3 2
hat orlando 3 3
glove orlando 3 3
)

sport=: ' ' cut every <;._2 (0 : 0)
hat baseball 1 5
hat football 3 2
jersey soccer 3 4
)

item=: ' ' cut every <;._2 (0 : 0)
hat 1 5
jersey 2 4
)

NB. gets the count which is always the last column
getCtCol =: ([: ". [: > _1 { {) :: 0:

NB. gets the value which is always 2nd to last column
getValCol =: ([: ". [: > _2 { {) :: 0:

getVal =: 3 : 0
  NB. search for the full key in city_sport (e.g. hat;chicago;baseball
  idx =: 0 { (3{."1 city_sport) i. (,: y)
  ret=:''
  if. (idx getCtCol city_sport) > 3 do.
      ret =: 'city_sport';(idx getValCol city_sport)
  end.
  NB. search for city
  idx =: 0 { (2{."1 city) i. (,: 2{."1 y)
  if. (0 = (#ret)) *. (idx getCtCol city) > 3 do.
      ret =: 'city';(idx getValCol city)
  end.
  NB. search for sport, meaning we need the 1st and 3rd value from the key
  idx =: 0 { (2{."1 sport) i. (,: 0 2 { y)
  if. (0 = (#ret)) *. (idx getCtCol sport) > 3 do.
      ret =: 'sport';(idx getValCol sport)
  end.
  NB. search for item overall
  idx =: 0 { (1{."1 item) i. (,: 0 { y)
  if. (0 = (#ret)) *. (idx getCtCol item) > 3 do.
      ret =: 'item';(idx getValCol item)
  end.
  ret
)

smoutput getVal 'hat';'chicago';'baseball'
smoutput getVal 'hat';'chicago';'hockey'
smoutput getVal 'jersey';'chicago';'soccer'
smoutput getVal 'jersey';'chicago';'badmitton'

NB. not enough hats in the city/sport match or city match
smoutput getVal 'hat';'atlanta';'baseball'


Outputs:

  smoutput getVal 'hat';'chicago';'baseball'

┌──────────┬─┐

│city_sport│1│

└──────────┴─┘

smoutput getVal 'hat';'chicago';'hockey'

┌────┬─┐

│city│1│

└────┴─┘

smoutput getVal 'jersey';'chicago';'soccer'

┌─────┬─┐

│sport│3│

└─────┴─┘

smoutput getVal 'jersey';'chicago';'badmitton'

┌────┬─┐

│item│2│

└────┴─┘
----------------------------------------------------------------------
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