That's a really good insight.

Conceptually, this would be
   1 (<0 6)}(=/1|.])i.9
0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0

But we want to multiply on the right (for ^:) instead of on the left.
So, instead
   M=: |:1 (<0 6)}(=/1|.])i.9
or
   M=: 1 (<6 0)}(=/~1|.])i.9

   +/M+/ .*^:256 <:#/.~(i.9),3,4,3,1,2
26984457539

Or, squaring M, 8 times:
   +/(+/ .*~^:8 M)+/ .*<:#/.~(i.9),3,4,3,1,2
26984457539

Actually, the squaring technique would have allowed us to left
multiply our representation of the updates:

   +/(<:#/.~(i.9),3,4,3,1,2)+/ .*+/ .*~^:8]1(<0 6)}(=/1|.])i.9
26984457539

Pretty concepts.

Thanks,

-- 
Raul

On Mon, Dec 27, 2021 at 4:08 AM 'Mike Day' via Programming
<[email protected]> wrote:
>
> Yes,  a 9x9 Boolean matrix with an offset 1s diagonal and an extra 1.  It 
> might have been worth using the high-power squaring technique,  if the power 
> were really large, but for 256 I just took the direct 256th power.
>
> Cheers,
>
> Mike
>
> Sent from my iPad
>
> > On 27 Dec 2021, at 06:17, Raul Miller <[email protected]> wrote:
> >
> > https://adventofcode.com/2021/day/6
> >
> > For day 6, we had a list of numbers which represented a school of fish.
> >
> > sample=: 3,4,3,1,2
> >
> > Because this was just a comma separated list of digits, no special
> > parsing routines were necessary.
> >
> > The task was conceptually to generate a step function which would
> > decrease each non-zero fish's number by 1. For fish represented by the
> > value 0, we replace them with a 6 and also append an 8 to the end of
> > the list. (And then we would run that step function the specified
> > number of times and find the length of the result.)
> >
> > So, the complication here is that we could not use modulo arithmetic,
> > because that would interfere with fish represented by the number 7.
> > (Though if we limited modulo to a prefix which did not include any
> > values greater than 6...).
> >
> > For this, I did not bother to create a step function. If I had, it
> > might have looked like this:
> >
> >   #((8#~0=]),<: |~ 7+]*7<])^:18] 3,4,3,1,2
> > 26
> >   #((8#~0=]),<: |~ 7+]*7<])^:80] 3,4,3,1,2
> > 5934
> >
> > But I did not feel like implementing that at the time, so instead I wrote 
> > this:
> >
> > aoc6a=: {{
> >  l=. y
> >  for.i.x do.
> >    l=. ((7>.l)|<:l),(0=l)#8
> >  end.
> >  #l
> > }}
> >
> > What can I say? ... It worked.
> >
> > For the second part, instead of 80 days, we needed to run for 256
> > days. So, simulating individual fish, we simulate the count of each
> > fish with each given value. And, I wanted to be able to quickly spot
> > any problems, so I threw an echo statement into my code, for
> > intermediate results:
> >
> > aoc6=: {{
> >  echo l=. _1 +#/.~(i.9),y
> >  echo b=.6=i.9
> >  for.i.x do.
> >    echo l=.(1|.l)+b*{.l
> >  end.
> > +/l
> > }}
> >
> > Clearly, I could have instead used a step function here.
> >
> > (Did I mention that AoC was sort of a bad habit for me?)
> >
> > --
> > Raul
> > ----------------------------------------------------------------------
> > 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

Reply via email to