Part of the complexity is searching for index rather than "data". There are several convenience functions that can simplify the code
G0 =: 0 {:: ] G1 =: 1 {:: ] Z2 =: 2 : 'u`(_2 Z: 1:)@.v' NB. break when v is true. otherwise u. Funtil =: Z2 (] F..) NB. fold until v is true, otherwise apply u (of fold). Uses old/new (C A) train. Considering that we are using fold to replace dyadic scan, which it was not directly intended to do, it is not THAT complicated. There is a preprocessing step that can be separated into an adverb, and reduce parentheses as a benefit. 1 : '(4;~4{.]) u (4}.])' NB. instead of embedding the preprocessing step into "the fork" which impedes removing it or editing it. ((1>:@{::]),&<~[,~ _3{.0{::]) Funtil (4=0#@~.@{::]) {{(4;~4{.]) u (4}.])}} ex or (>:@G1,&<~ [,~ _3{.G0) Funtil (4 = #@~.@G0) {{(4;~4{.]) u (4}.])}} ex and it is easy to turn it all into an adverb that parameterizes part 1 and 2 5 {{ (>:@G1,&<~ [,~ (>: - m){.G0) Funtil (m = #@~.@G0) {{(n;~n{.]) u (n}.])}} m}} ex ┌─────┬─┐ │jpqmg│8│ └─────┴─┘ An alternative that maps the i. solution over preprocessed 4 ]\ ] scan (and then probably doesn't beat i. in performance?) It looks at only x, and increments a single integer y when it doesn't "break" 4 {{m >:@] Funtil (m = #@~.@[) m ]\ ]}} ex 7 or hard coded 4 >:@] Funtil (4 = #@~.@[) 4 ]\ ex NB. 4 is x arg to F.. 7 or the first string that matches ("better than i." if this is what you want as search result) [ Funtil (4 = #@~.@]) 4 ]\ ex jpqm so there is still a relatively short version of the F.. approach for processing scans, if you do the scan first. On Thursday, December 8, 2022 at 03:02:35 p.m. EST, 'Michael Day' via Programming <programm...@jsoftware.com> wrote: Thanks for your replies - I'll try to get round to understanding them. It's a pity the Fold approach to this problem appears to need to be verbose. Cheers, Mike On 08/12/2022 19:34, 'Pascal Jasmin' via Programming wrote: > mistake in Z definition found, > > Zl =: ] [ _3 Z: [ > > makes this work, > > ((4;~4{.]) ((1>:@{::]),&<~[,~ _3{.0{::])`(_2 Z:1:)@.(4=0#@~.@{::]) ((100 Zl > ]) F..) (4}.])) ex > > but still > > ((4;~4{.]) ((1>:@{::]),&<~[,~ _3{.0{::])`(_2 Z:1:)@.(4=0#@~.@{::]) ((100 Zl > ]) F.) (4}.])) ex > > |domain error > > > > > On Thursday, December 8, 2022 at 02:15:39 p.m. EST, 'Pascal Jasmin' via > Programming <programm...@jsoftware.com> wrote: > > > > > > The short circuit you are trying to avoid is to skip the full partitioning > part > > 4 #@~.\4 > > one approach is to separate into the simplest possible partition, then hope > that i. special code finds the short circuit. > > 4 + (1 i.~ 4 = #@~."1) 4 ]\ ex > > your power approach is completely reasonable. > > A fold approach is complicated by seeking the index rather than a "computed > result" > > There might be too much manipulated computation involved, but the general > approach would be: > > x parameter to fold is (a: ,< 0) NB. initial y. > if head cell of y is shorter than 4, then append x to last 3 chars. (better > to preprocess y such that x (to F.) has first 4 chars, and y omits first 4.) > if head is length 4, then apply test ((1 >:@{:: ] ) ,&<~ [,~ _3{.0{::])`(_2 > Z: 1:)@.(4 = #@~. 0 {:: ]) > > ((4;~4{.]) ((1>:@{::]),&<~[,~ _3{.0{::])`(_2 Z:1:)@.(4=0#@~.@{::]) (] F..) > (4}.])) ex > ┌────┬─┐ > │jpqm│7│ > └────┴─┘ > > I don't understand why this fails: (F. instead of F..) > > Z =: ] [ Z: > > > ((4;~4{.]) ((1>:@{::]),&<~[,~ _3{.0{::])`(_2 Z:1:)@.(4=0#@~.@{::]) ((100 >Z~ _3:) F.) (4}.])) ex > > |domain error > > or > > ((4;~4{.]) ((1>:@{::]),&<~[,~ _3{.0{::])`(_2 Z:1:)@.(4=0#@~.@{::]) (] F.) >(4}.])) ex > > |domain error > > > also it is not documented whether F. or F: are forward or reverse. > > On Thursday, December 8, 2022 at 11:28:12 a.m. EST, 'Michael Day' via > Programming <programm...@jsoftware.com> wrote: > > > > > > Having remarked recently (re Advent of Code day 6): > > Very easy today, in J at least, and probably in APL & K/Q. (Though it > suggests one should learn the new fold features, as it's inefficient to > examine all the data for something that might occur early. No problem > with 4kb, but ....) > > I've just had a look at the Jwiki entries about Fold, and wonder how it > would work > for day 6. > > The problem is so easy for J-ers that I don't think this will spoil it > for forum users: > ex > mjqjpqmgbljsphdztnvjfqwrcgsmlb > 4 + 4 i.~ 4 #@~.\ ex > 7 > > QED > > #data NB. the size of my data set > 4096 > ts'4 + 4 i.~ 4 #@~.\ data' NB. time & space > 0.0008555 67232 > > I didn't bother making a function for this! > > One way to stop early, rather than process the whole array, is this: > ts'4 + (# - #@:((}.`])@.(4&([ = #@:~.@:{.))^:_)) data' > 0.0007299 4736 > > (I know it's ugly, and non-optimal!) > > Similar time but with ca 14x space-saving. > > But there must be some sort of Fold to progressively examine 4-windows, > or 14-windows in part 2, until the first appropriate window is found, > when > it stops. That should save time as well as space. Not necessary > here, of > course, but if there was a real application with many megabytes of data... > > Cheers, > > Mike > > > > On 06/12/2022 19:46, Brian Schott wrote: >> I have successfully solved Day 5 using the following looping verb `tomove` >> but cannot craft a Fold version, and would like help. >> >> *[FYI I have included an attachment that seems to load and execute >> properly, but I could NOT get the email versions to load correctly, >> presumably because of some funny characters.]* >> >> tomove=: dyad define >> while. #y do. >> x=.x move {. y >> y =. }.y >> end. >> x >> ) >> >> >> NB. The verb `move` for part 1 is very simple: >> >> move =: dyad define >> 'n f t'=. _1 1 1*y - 0 1 1 >> take =. |.n{.>f{x >> left =. <n}.>f{x >> put =. <take,~>t{x >> (left,put) (f,t)}x >> ) >> >> NB. the inputs are produced as follows. >> >> top =: 0 :0 >> [D] >> [N] [C] >> [Z] [M] [P] >> 1 2 3 >> ) >> >> state=.deb each ;/ |:|.}:1 5 9&{;._2 top >> >> bottom =: 0 :0 >> move 1 from 2 to 1 >> move 3 from 1 to 3 >> move 2 from 2 to 1 >> move 1 from 1 to 2 >> ) >> alpha =. a. {~97+i.26 >> moves =. ".-.&alpha ;._2 bottom >> >> NB. finally the result is produced by the next phrase >> >> {:every state tomove moves >> >> >> ---------------------------------------------------------------------- >> For information about J forums seehttp://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 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm