Forget about the part not working... it lacked a 0, it had to be 4 million,
not 4 hundred thousand.

The part about improving it.. yeah, that could be interesting, not in a
rush though.

Missatge de Jaume <greenni...@gmail.com> del dia dj., 15 de des. 2022 a les
15:22:

> Hello all
>
> Once again with questions, now more on the performance side, mostly
> because it's taking too long, and giving me a wrong answer some of the time.
>
> Talking about part 2. I'll share all of the code, so if you see anything
> glaringly wrong please let me know.
> read=:{{cutopen 1!:1 <y}}
> filter=: 0". 'Sensoratx=,y:clbi'-.~]
> init=: 3 : 0
> map=:>filter each read y
> sensors=:0 1 {"1 map
> beacons=: 2 3{"1 map
> $map
> )
> With init 'filename' we set up the rest.
> In case you don't know we have to find the point thats outside the range
> of all the sensors and still inside 0...4000000 in both coordinates.
> Let's go to the last approach I took.
> sol2=: 4 : 0
> NB. range occ sensor,beacon
> cx=:x
> cy=:y
> sensors= 0 1 {"1 y
> beacons= 2 3 {"1 y
> distances=:1+sensors d"1 beacons
> param=:sensors,.((#distances), 1)$distances
> digs=:x diag"1 param
> dg=:digs
> for_i. i.#digs do.
> here=:testdiag dg
> if. here do.
> ccx=:{.here
> ccy=:{:here
> ccx,ccy,ccy+ccx*400000 return.
> end.
> dg=:}.dg
> end.
> 'none'
> )
> d=:[:+/[:|-
> union=: ~.@,
> unboxedunion=:([: > [) union [: > ]
> intersect=: e. # [
> remx=:([ >: [: {."1 ]) *. [ >: [: {:"1 ]
> rem0=:(0 <: {."1) (*.) 0 <: {:"1
> remove=: 4 : 0
> mask=:rem0 y
> mask=:mask*.x remx y
> (>mask)#y
> )
> diag=: 4 : 0
> cx=:x
> cy=:y
> range=:i.>:{:y NB. [2]->3->0 1 2
> egnar=:i.->:{:y NB. [2]->-3->2 1 0
> px=:0{y
> py=:1{y
> NB. (x-d,y)->(x,y+d)
> NB. (x,y+d)->(x+d,y)
> NB. (x+d,y)->(x,y-d)
> NB. (x,y-d)->(x-d,y)
> d1=:(px-egnar),.(py+range)
> d2=:(px+range),.(py+egnar)
> d3=:(px+egnar),.(py-range)
> d4=:(px-range),.(py-egnar)
> <~.x remove d1,d2,d3,d4
> )
> testpoint=: 3 : 0
> dc=:1 y&d"1\sensors
> *./dc>:distances
> )
> testdiag=: 3 : 0
> excl=: }.y
> rest=:]F.:unboxedunion excl
> interest=:rest intersect > {.y
> for_i. i.#interest do.
> val=:testpoint i{interest
> if.val do.
> i{interest return.
> end.
> end.
> 0
> )
>
> So I create the limits that are just outside the range of each sensor,
> intersect those, examine if the points have all the distances greater than
> the distance each sensor reaches, and if so that's the point.
> On the test it's blazingly fast:
>
> 20 sol2 map
>
> 14 11 5600011
>
> But on the real data it's amazingly slow... and according to AoC also
> wrong.
>
> 4000000 sol2 map
>
> 3270298 2638237 1308121838237 NB. too low!!!!
> But.. AFAIK this answers checks the marks:
>
> |: dc
>
> 4298885 1215898 1684048 845656 3691920 1327934 1042406 682945 599242
> 3471784 3639831 841599 1106070 4582032 3552311 2682122 967943 845585
> 1809437 1835842 1806964 962164 663951 532696 2570491 706217 654163 1476664
> 2198682 1669886 4144166 985137 1181113 4234...
>
> distances N.B. 1+ real distance
>
> 1595477 33564 434944 166994 803986 656108 285496 682945 599242 1465583
> 700194 171415 143036 1694098 1742449 1433018 121373 226445 1150021 945766
> 479064 383562 663951 429356 453359 185151 654163 455680 1350302 860094
> 178581 92581 67993 126159 1178851 325282...
>
> |: dc>:distances
>
> 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
> 1 1 1
>
>
> So now I'm lost. I can't see the error and it's too slow to try new
> alternatives.
>
>
> I'm attaching my input, but do not give me the numeric answer please, that
> would be trivial using any already working solution.
>
> Can you spot the error and or help me make this go faster?
>
> Thanks.
>
>

-- 
The fact that an opinion has been widely held is no evidence whatever that
it is not utterly absurd. -- Bertrand Russell
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to