Actually, another caution here: it might be that other people's puzzle
inputs used a different block structure from my block structure.

Probably not -- it's probably the case that only my A, B and C values
differed for different people. But .. that's just "probably" because I
haven't looked at other people's puzzle input.

FYI,

-- 
Raul

On Sat, Jan 15, 2022 at 1:10 PM Raul Miller <rauldmil...@gmail.com> wrote:
>
> I've got this solved now,
>
> Eugene Nonko put me on the right path here.
>
> The trick, from my perspective, was to convert the machine code into
> executable J.  And, to ensure that I could use J's dimensionality to
> manage multiple tests at the same time.
>
> Specifically, I parameterized the three "block specific" values as C,
> B and A (I initially used D for digits, but later spelled that out).
>
> parse=: {{
>   blks=: _18]\];._2 input
>   C=: ". 6}."1]4 {"_1 blks
>   B=: ". 6}."1]5 {"_1 blks
>   A=: ". 6}."1]_3{"_1 blks
> }}
>
> digits=:14#<1+i.9
>
> BLOCK=: {{
>   W=: x{::digits
>   X7=: W~:/(x{B)+26|y
>   if.X7 -:&$ y do.
>     ((W+x{A)*X7)+(1+25*X7)*<.y%x{C
>   else.
>     ((W+x{A)*X7)+(1+25*X7)*"_1 _<.y%x{C
>   end.
> }}
>
> Here, x indicated the digit number (0 for the leftmost digit, 13 for
> the right most digit), and y indicated the result from the previous
> block (0 initially).
>
> The if statement was because I could not figure out how to build a
> rank statement that worked consistently for all of my example cases.
> I'm not sure if this was due to my limited imagination, or if it's an
> artifact of J's rank conjunction. Maybe I'll circle back on that
> later...
>
> With this in place, the ALU became:
>
> ALU=: BLOCK/@((i.-14),0)
>
> Except, of course, my laptop is not powerful enough to handle this
> expression because there's too many possible digits.
>
> But it's rather quick to run through all the possibilities to
> constrain the search space:
>
> plausible=: {{
>   hist=:<need=:,0
>   for_k.i.-14 do.
>     try=. ~.(<.need%26),,(26*need)+/i.26
>     need=. ~.;((k BLOCK try)e.need)<@#try
>     assert.1e8>#need assert.0<#need
>     hist=:(<need),hist
>   end.
>   trial=: {{(y BLOCK y{::hist) <@(#&(y{::digits))@:(+./"1)@:e. (y+1){::hist}}
>   ref=:digits=:trial"0 i.14
> }}
>
> And, once I had that, it was straightforward to find the largest
> viable serial number:
>
> a24=: {{
>   digits=:14#<1+i.9
>   plausible''
>   i=. #@>digits
>   k1=.+/7>10^.*/\.i
>   k0=.14-k1
>   for_j.(k0{.i)#:i.-*/k0{.i do.
>      NB. echo ;j {&.> k0{.ref
>      digits=: (j {&.> k0{.ref) (i.k0)} digits
>      t=: |:ALU''
>      if.0 e.,t do.
>        ' '-.~":;(k0{.digits),(($t)#:>./I.,0=t){each k0}.digits return.
>      end.
>   end.
> }}
>
>    timespacex 'a24 0'
> 2.26213 1.59913e8
>
> Part b was to find the smallest viable serial number, and for that, I
> got rid of the negative in the for loop:
>
>   for_j.(k0{.i)#:i.*/k0{.i do.
>
> And changed the max reduce to a min reduce in the result line:
>
>        ' '-.~":;(k0{.digits),(($t)#:<./I.,0=t){each k0}.digits return.
>
> And that also ran quickly for me:
>
>    timespacex 'b24 0'
> 0.252415 1.59913e8
>
> (But... caution: actual running time will depend on the puzzle input
> you're working with. I am not sure how much of my running time here is
> luck and how much is decent approach.)
>
> I am somewhat disappointed that it took me so long to see some of the
> (now) obvious features of this puzzle. But... I have to admit some of
> my other efforts were at least kind of fun.
>
> Thanks,
>
> --
> Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to