User:RE Boss/Recurringproblems/Applyinggerunds

From J Wiki
Jump to: navigation, search

Gerund items applied to corresponding parameter items

Problem stated by Sherlock :

   fns=: ((-~ +/)"1)`((*~ +/)"1)`((+~ +/)"1)`((%~ +/)"1)
   rnge=. >: i. 5
   ]data=. (i.5 3);(i.5 2);(i.5 4);(i.5 3)
+--------+---+-----------+--------+
| 0  1  2|0 1| 0  1  2  3| 0  1  2|
| 3  4  5|2 3| 4  5  6  7| 3  4  5|
| 6  7  8|4 5| 8  9 10 11| 6  7  8|
| 9 10 11|6 7|12 13 14 15| 9 10 11|
|12 13 14|8 9|16 17 18 19|12 13 14|
+--------+---+-----------+--------+

Given the gerund "fns" (4 dyadic verbs) and the noun "data" (4 arrays which are the desired arguments for the corresponding verbs in the gerund), how can I apply the verbs to their respective arguments such that:

   rnge applyVerbs data
+-------------------+--------------+--------------+--------------+
| 3  1.5  1 0.75 0.6| 7  8  9 10 11| 1  2  3  4  5| 2  1  0 _1 _2|
|12    6  4    3 2.4|23 24 25 26 27| 5 10 15 20 25|11 10  9  8  7|
|21 10.5  7 5.25 4.2|39 40 41 42 43| 9 18 27 36 45|20 19 18 17 16|
|30   15 10  7.5   6|55 56 57 58 59|13 26 39 52 65|29 28 27 26 25|
|39 19.5 13 9.75 7.8|71 72 73 74 75|17 34 51 68 85|38 37 36 35 34|
+-------------------+--------------+--------------+--------------+

Here is a looping explicit solution, but I feel like should be a simpler/better way?

applyVerbs=: 3 : 0
  (>: i. 4) applyVerbs y
:
  res=. ''
  for_mod. y do.
    res=. res ;~ x fns@.mod_index >mod
  end.
  }:res
)

Excellent solution by Miller :

   fns 4 :'x@.0&.>/y'"_1 (<rnge),. data
+-------------------+--------------+--------------+--------------+
| 3  1.5  1 0.75 0.6| 7  8  9 10 11| 1  2  3  4  5| 2  1  0 _1 _2|
|12    6  4    3 2.4|23 24 25 26 27| 5 10 15 20 25|11 10  9  8  7|
|21 10.5  7 5.25 4.2|39 40 41 42 43| 9 18 27 36 45|20 19 18 17 16|
|30   15 10  7.5   6|55 56 57 58 59|13 26 39 52 65|29 28 27 26 25|
|39 19.5 13 9.75 7.8|71 72 73 74 75|17 34 51 68 85|38 37 36 35 34|
+-------------------+--------------+--------------+--------------+

which was "adverbed" by Sherlock :

eachv=: 1 : 0
  m 4 :'x @.0&.>y'"_1 y
:
  m 4 :'x @.0&.>/y'"_1 x,.y
)

and further by Rich

eachunderv=: 2 : 0
   m v 1 :(':';'x`:6&.u y')"_1 y
:
   m v 1 :(':';'x`:6&.u&>/ y')"_1 x ,&<"_1 y
)
eachv =: eachunderv >

I prefer `:6 to @.0, but it's a matter of taste.