Right! 0 1 =/ '()' i. y is just '()' =/ y...

Yes, day 15/2 is unfortunately similarly slow for me, where I update a
length 3e7 array to track times. An equivalent scheme version manages
in <600ms. The gap in performance is odd...

Joseph

On 12/18/20, 'Michael Day' via Programming <programm...@jsoftware.com> wrote:
> Yes, I ended up indexing brackets with    I. '()' =/ y ,  assuming that
> the left & right brackets
> were balanced!
>
> Part 2 was long-winded, recursive,  but evaluated quickly, luckily.
>
> My slowest routine for any of these posers is for part 2 of Day 15; best
> I managed was
> ~ 40 seconds.
>
> Cheers,
>
> Mike
>
> On 18/12/2020 19:50, Joseph Novakovich wrote:
>> For part 1 I used pretty much the same approach, eval by way of
>> reversing (|.&.;:):
>>
>>     +/ {{".'('c}')'o}y['o c'=. I. 0 1=/'()'i.y=.|.&.;:y}}&> in
>>
>> Mine differs mostly in avoiding library definitions, amending parens
>> by index. For part 2 I used ;: to calculate a depth vector for the
>> tokens and then I evaluate the deepest nested subexpressions at each
>> iteration reaching fixpoint.
>>
>> https://github.com/jitwit/aoc/blob/a/J/20/18.ijs
>>
>> On 12/18/20, 'Michael Day' via Programming <programm...@jsoftware.com>
>> wrote:
>>> Unlike in the K forum,  the J-wires have been virtually silent on this
>>> year's Advent of Code...
>>>
>>> Anyway,  today's problem,  number 18,  might interest J & APLers as part
>>> 1 is ALMOST
>>> plug-it-in to J/APL;  there's just one twist,  so to speak,  namely we
>>> need to reverse an
>>> arithmetic expression,  eg
>>>      1 + (2 * 3) + (4 * (5 + 6))
>>> needs to be evaluated as
>>>      ((6 + 5) * 4) + (3 * 2) + 1
>>>
>>> But, even though all numbers are single-digit,  just reversing the
>>> string doesn't work,  fairly obviously:
>>>      |.'1 + (2 * 3) + (4 * (5 + 6))'
>>> ))6 + 5( * 4( + )3 * 2( + 1
>>>
>>> So the brackets need swapping.  The data is supplied as strings,  so I
>>> expected to use stringreplace,
>>> as found in strings.ijs
>>>
>>> But:
>>>      |.    (  ')[' , '()' , '[('  ) stringreplace '1 + (2 * 3) + (4 * (5
>>> + 6))'
>>> [[6 + 5) * 4) + [3 * 2) + 1
>>>
>>> Why don't the intermediate '[' get changed to the final ')'  ?
>>>
>>> The second action in stringreplace is on the left hand argument:
>>>      _2 [\ ,(')[' , '()' , '[(' )
>>> )[
>>> ()
>>> [(
>>>
>>> The first column should be items of old text and the second column
>>> their new replacements.  But the third pair seems to be ignored.
>>>
>>> I did of course get round this little difficulty,  but would have
>>> preferred
>>> not to reinvent the wheel.
>>>
>>> NB. Part 2 is a little more challenging,  as + is defined there as taking
>>> precedence over * .
>>>
>>> Thanks,
>>>
>>> Mike
>>>
>>> --
>>> This email has been checked for viruses by Avast antivirus software.
>>> https://www.avast.com/antivirus
>>>
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>
>
> --
> This email has been checked for viruses by Avast antivirus software.
> https://www.avast.com/antivirus
>
> ----------------------------------------------------------------------
> 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