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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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