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