A version focused on reduced typing of parens, uses this file,

https://github.com/Pascal-J/multiline-tacit-and-macros---J/blob/master/multiline2.ijs

multiline tacit basically inserts parens around each line in a definition


Y =: (&{::)(@:])
X =: (&{::)(@:[)
amenD =: 2 : '([ u"_ v{ ])`(v"_)`]} ]'
reduce =: 1 : '<"_1@[ ([: u &.>/(>@:) ,) <@:]'

coinsert 'multiline'

p3 =: ,@:(<"1)@(0 Tacify)

4 Y (] + i.@>:@-) 2 Y
,.~"0 1
3 Y (] + i.@>:@-) 1 Y)

p2 =: 0 Tacify"1 _
(2 + ]) amenD  (p3@[)
`
>:@] amenD (p3@[)
`
(0 >. <:@])  amenD (p3@[)
@. 
0 X
)

b =. (2 , 0 ". every  3 5 7 9 { ])`(1 , 0 ". every  3 5 7 9 { ])@.('on' -: 2 
Y)`(0 , 0 ". every  2 4 6 8 { ])@.(0 Y)"1( ],~ [: < 0:`1:@.('toggle' -: 0 Y))"1 
;:"1 > cutLF a =. wd 'clippaste'

+/@, ( |. b) p2 reduce 1000 1000 $ 0

slow because of boxing in reduce

Henry's was quite fast.


----- Original Message -----
From: Ric Sherlock <tikk...@gmail.com>
To: Programming JForum <programm...@jsoftware.com>
Sent: Sunday, December 6, 2015 10:14 PM
Subject: Re: [Jprogramming] adventofcode 6

I struggled with an efficient tacit implementation too and went with a for
loop to sequentially update the array.
I love Henry's take on the problem!

parseInstructs=: 3 :0

  tmp=. y rplc 'turn ';'';'through ';''

  action=. <@(' '&taketo);._2 tmp

  coords=. ". ' '&takeafter;._2 tmp

  action=. ('off';'on';'toggle') i. action

  action ,. coords

)


getIdx=: [: < ([ + i.@>:@-~)&.>/@(_2 ]\ ])

on=: 1:`(getIdx@[)`]}

off=: 0:`(getIdx@[)`]}

toggle=: ([: -. getIdx@[ { ])`(getIdx@[)`]}


applyActions=: 4 :0

   actions=. {."1 x

   coords=. }."1 x

   for_action. actions do.

      coord=. action_index { coords

      y=. coord off`on`toggle@.action"_ y

   end.

)


Lights=: 1000 1000 $ 0

Instructions=: parseInstructs freads '~temp/advent6_input.txt'

Lights=: Instructions applyActions Lights

echo +/ , Lights


Part 2:
on=: (1 + getIdx@[ { ])`(getIdx@[)`]}

off=: (0 >. _1 + getIdx@[ { ])`(getIdx@[)`]}

toggle=: (2 + getIdx@[ { ])`(getIdx@[)`]}

Lights=: 1000 1000 $ 0

Instructions=: parseInstructs freads '~temp/advent6_input.txt'

Lights=: Instructions applyActions Lights

echo +/ , Lights


On Mon, Dec 7, 2015 at 1:46 PM, Ryan Eckbo <ec...@cim.mcgill.ca> wrote:

> Wow.
>
> These problems are great, I'm learning a lot seeing people's solutions.
>
>
> On 7 Dec 2015, at 10:37, Henry Rich wrote:
>
> Part 1:
>>
>> i =. <@('y =. y ' , ;@(<@('(' , ,&')');._2)@:(,&' '));._2 wd 'clippaste'
>>
>> through =: (1000 1000 {. ({. ($&1)))/@(-~/\)@:-@(,:~ >:)
>>
>> turn =: 1 : 'u'
>>
>> '`off on toggle' =: >`+.`~:
>>
>> +/@, 3 : i 1000 1000 $ 0
>>
>>
>> For part 2, use
>>
>> '`off on toggle' =: (0 >. -)`+`(+ +:)
>>
>>
>>
>>
>> On 12/6/2015 6:03 PM, David Lambert wrote:
>>
>>> Ryan made a mask shape 1000 1000 and applied it appropriately to a
>>> cumulative array.  Pascal updated the accumulation array in place. I did so
>>> likewise but used the dyadic form of amend with gerund m. Pascal computed
>>> the index in one place, which I prefer to my 3 sites.
>>>
>>> g
>>> [: r/ [: _&". {::"0 1
>>>
>>> r   NB. absolute value not required
>>> ([ + i.@:|@:(-/)) >:
>>>
>>>
>>> NB. noun L is the array of lights.
>>>
>>> identify  NB. whoops!  returns a vector
>>> 0 1 2 #~ 'turn on'&({.@E.) , 'turn off'&({.@E.) , 'toggle'&({.@E.)
>>>
>>> on
>>> 3 : 0
>>> I=:([: < 2 6&g ; 4 8&g)@;:y
>>> NB. L=:I (1:)`([)`(])}L
>>> L=:I (>:@:{)`([)`(])}L
>>> EMPTY
>>> )
>>>
>>> off
>>> 3 : 0
>>> I=:([: < 2 6&g ; 4 8&g)@;:y
>>> NB.I (0:)`([)`(])}L
>>> L=:I ((0>.<:)@:{)`([)`(])}L
>>> EMPTY
>>> )
>>>
>>> toggle
>>> 3 : 0
>>> I=:([: < (<:2 6)&g ; (<:4 8)&g)@;:y
>>> NB. L=:  I (-.@:{)`([)`(])}L
>>> L=:I (2+{)`([)`(])}L
>>> EMPTY
>>> )
>>>
>>>
>>> NB. what the heck???  Why is this zero?
>>>
>>> +/, L [ on`off`toggle@.({.@identify)@,;._2(1!:1)<'/tmp/a' [ L=:1000
>>> 1000$0
>>> 0
>>> +/,L
>>> 14110788
>>>
>>>
>>>
>>>
>>> Date: Mon, 07 Dec 2015 08:46:59 +1100
>>>> From: "Ryan Eckbo"<ec...@cim.mcgill.ca>
>>>> To: programming<programm...@jsoftware.com>
>>>> Subject: Re: [Jprogramming] adventofcode 6
>>>> Message-ID:<b4007f86-91ad-409c-95d6-ba6d6966c...@cim.mcgill.ca>
>>>> Content-Type: text/plain; format=flowed
>>>>
>>>> How do your on/off/toggle functions work?  My solution also updates a
>>>> global matrix,
>>>> but my implementation doesn't feel good.  Looking forward to seeing
>>>> nicer solutions.
>>>>
>>>> xind=: 3 : 0&{ + [: i. >:@:(-/)@:(2 0&{)
>>>> yind=: 3 : 1&{ + [: i. >:@:(-/)@:(3 1&{)
>>>> mkmask=: 3 : '1 inds} 1000 1000 $ 0 [ inds=: < (xind y);(yind y)'
>>>> on=: 3 : 'lights=: lights + mkmask y'
>>>> off=: 3 : 'lights=: 0 >. lights - mkmask y'
>>>> toggle=: 3 : 'lights=: lights + +: mkmask y'
>>>> instructions=: <;._2 (' through ';',';'turn ';'') stringreplace
>>>> fread'/tmp/input.txt'
>>>>
>>>> lights=: 1000 1000$0
>>>> do each instructions
>>>> +/, lights
>>>>
>>>>
>>> ----------------------------------------------------------------------
>>> 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

Reply via email to