How long did pt 2 take for you? I found something else do do, while I let J loop on trial delays, but it was several minutes, I think
Mike Please reply to [email protected]. Sent from my iPad > On 22 Dec 2017, at 18:37, Raul Miller <[email protected]> wrote: > > For what it's worth, here's what I did for day 13. s0 is the sample data set. > > s0=:|:".;._2]0 :0-.':' > 0: 3 > 1: 2 > 4: 4 > 6: 4 > ) > > ride=:*/ +/ .* 0 = (|~ _2 2&p.)/ > > safe=:3 :0 > 'when len'=: y > dur=. _2 2&p.len > lim=. *./dur NB. delays=: i.*./dur > bs=. >./ (* 1e5&>) */\q:lim > for_block. bs*i.lim%bs do. > delays=. block+i.bs > sol=. block+I. 0=(1>.*/y) +/ .* 0 = dur|when+/delays > if.#sol do.sol return.end. > end. > ) > > The verb ride was for part 1, and safe was for part 2. > > I apologize for not replying earlier, I've had a bit of work to do > this week and have been mostly ignoring aoc stuff. > > Good luck, > > -- > Raul > > > On Fri, Dec 22, 2017 at 1:24 PM, '[email protected]' via > Programming <[email protected]> wrote: >> That problem took a lot of reading! >> >> Like you, Brian, I started with the boustrophedon cycles: >> example NB. my data has 2 rows: depth,: range: >> 0 1 4 6 >> 3 2 4 4 >> >> (Brian forms the data into a simple vector of ranges >> 3 2 0 0 4 0 4 ) >> >> My verb, cycle, is used to assemble a look-up table of scan positions. >> >> (7$(delay |. cycle)) every <: 3 2 4 4 [ delay =. 0 NB. delay needed >> for part 2 >> 0 1 2 1 0 1 2 >> 0 1 0 1 0 1 0 >> 0 1 2 3 2 1 0 >> 0 1 2 3 2 1 0 >> Note that the period for a range of r is 2 * (r - 1), and that the >> third and fourth >> row (origin 1!) are identical. >> >> My problem data had 40 odd pairs, with depth between 0 and 92, but >> only 12 distinct values for range, so I set up 12 cycles of length >> 93, and >> looked up the one I needed for each depth used in a make-once use-often >> table. >> >> The function below does part 1 - and tries to do part 2 - with a >> negative >> left argument repesenting the trial delay - its right argument is the 2 >> row >> representation of the given input. (It grew rather more complicated >> than >> necessary for part 1 in order to try to solve part 2.) >> >> dostates=: 3 : 0 >> 0 dostates y >> : >> if. x > 0 do. e =. echo else. e =. ] end. NB. debugging stuff >> 'd r' =. y >> s =. 0#~#r >> l =. *./ +: <: r NB. lcm of >> cycle lengths >> if. x < 0 do. >> delay =. - 0 <. x >> else. >> delay =. 0 >> end. >> c =. ((l <. 2 + >./d) $ (delay |. cycle)) every <: ur =. ~.r NB. >> look-up table of range-positions >> e (;~$) c >> t =. 0 >> max =. >:>./d >> if. x > 0 do. max =. | x <. max end. >> for_layer. i.max do. >> if. layer e. d do. >> id =. d i. layer NB. >> rlayer =. id{r NB. which range >> rlu =. ur i. rlayer NB. where in nub of ranges >> scanid =. (<rlu, layer) { c NB. scan position >> if. scanid = 0 do. >> e 'caught'; layer, rlayer >> t =. t + (delay~:0) + layer * rlayer * delay = 0 >> end. >> end. >> if. x * x < >:>./d do. e layer; d,: (ur i.r) { (l|layer) {"1 c end. >> end. >> t >> ) >> >> It works ok, as does Brian's corrected function: >> ts'day13 datas' >> 0.0338706 8448 >> ts'dostates input13' >> 0.000846644 25728 >> >> But then I realised this does the job even better! :- >> 13 : '+/*/y{"1~ I. 0 =|~/({.,: (2*(<:@{:)))y' input13 >> 1580 >> >> That is, the probe is detected by "scanners" for those pairs >> where a range's cycle period divides the corresponding depth. >> It is faster than both the above loopy functions, uses >> more space than Brian's, less than mine. >> ts '13 : ''+/*/y{"1~ I. 0 =|~/({.,: (2*(<:@{:)))y'' input13' >> 5.18354e_5 12288 >> >> The following variant shows how I managed to do part 2, albeit >> very slowly! >> 10 (13 : '+/*/y{"1~ I. 0 =|~/(0,~x) + ({.,: (2*(<:@{:)))y') example >> 0 >> ie, you add the delay to the cycle period, so that now >> (a range's cycle-period plus the delay) divides the corresponding >> depth. >> We seek the lowest delay such that for none of these modified pairs >> is the period-plus-delay a divisor of the depth. >> >> I suspect there's a better way for part 2, but haven't looked! >> >> Cheers, >> >> Mike >> >> >> >>> On 21/12/2017 12:08, Brian Schott wrote: >>> I found my error. >>> ud =: i. , }:@}.@i.@- NB. added }:@ >>> >>> Also, the approach is very inefficient, but works, now. >>> >>> On Wed, Dec 20, 2017 at 6:29 PM, Brian Schott <schott.brian@gmail. >> com> >>> wrote: >>> >>>> I am getting the wrong answer for part 1 of day 13. >>>> Can someone give me a hint what I am misunderstanding? >>>> >>>> My main verb is day13, but it depends on the following simple verbs. >>>> >>>> ud =: i.,}.@i.@- >>>> spos =: [{.@:|."0 1 ud@] >>>> (i. 6) spos"0/ ]3 2 0 0 4 0 4 >>>> 0 0 0 0 0 0 0 >>>> 1 1 0 0 1 0 1 >>>> 2 0 0 0 2 0 2 >>>> 1 0 0 0 3 0 3 >>>> 0 1 0 0 2 0 2 >>>> 0 0 0 0 1 0 1 >>>> >>>> >>>> day13 =: verb define >>>> ranges =. y >>>> severity =. 0 >>>> for_secs. i. # ranges do. >>>> state =. secs spos"0 ranges >>>> if. 0 = secs { state do. >>>> if. secs{ ranges do. >>>> severity =. severity+secs*secs{ranges >>>> end. >>>> end. >>>> end. >>>> severity >>>> ) >>>> day13 3 2 0 0 4 0 4 >>>> 24 >>>> day13 $.^:_1 datas >>>> 2052 >>>> >>>> >>>> >>>> For more completeness, my data collection used the following ideas. >>>> >>>> datam =: data rplc ':';' ' >>>> datas =: ({:|: ". ;._2 datam)({.|: ". ;._2 datam)} 1 $. 99 >>>> >>>> TIA, >>>> >>>> -- >>>> (B=) >>>> >>> >> >> ---------------------------------------------------------------------- >> 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
