Hmm...

I like your use of reference rotations R. And, your approach to
combining what were a bunch of different steps in mine looks nice. (It
takes a bit longer this way, but for this puzzle the extra time I
needed to code up my approach is far more of a problem.)

But how did you come up with 12 as the number of overlapping scanners?
(I guess I used 34 overlapping scanners for that part.)

Also, a really minor reminder, you could have written

ol=: ~. #~ 12 <: #/.~

(I think that that syntactic mechanism was introduced in J version 6.)

Thanks,

-- 
Raul

On Mon, Jan 10, 2022 at 12:10 PM Stefan Baumann <ste...@bstr.at> wrote:
>
> Main insight here was that with any beacon being scanned from scanners 0
> and s it holds that b₀ = Tₛ + bₛ*Rₛ with b₀,  bₛ being the beacons
> coordinates relative to 0, s resp.,  Tₛ is s' translation vector and Rₛ the
> cube rotation matrix belonging to s.
> This means Tₛ = b₀ - bₛ*Rₛ and we can calculate all combinations of 0's and
> s' beacons for all 24 cube rotations and identify the rotation Rₛ  with
> translation Tₛ which appears at least 12 times (if this is the case).
> This logic is implemented in the verb tx below. J Session follows - note
> that after reading in the data, first the 24 cube rotations are constructed:
>
>    rd=: {{ ([: ".&.:> }.);._2 ,&a: <;._2 rplc&('-';'_') y }}
>    ]d=: rd 0 : 0
> --- scanner 0 ---
> 404,-588,-901
> 528,-643,409
> -838,591,734
> 390,-675,-793
> -537,-823,-458
> -485,-357,347
> -345,-311,381
> -661,-816,-575
> -876,649,763
> -618,-824,-621
> 553,345,-567
> 474,580,667
> -447,-329,318
> -584,868,-557
> 544,-627,-890
> 564,392,-477
> 455,729,728
> -892,524,684
> -689,845,-530
> 423,-701,434
> 7,-33,-71
> 630,319,-379
> 443,580,662
> -789,900,-551
> 459,-707,401
>
> --- scanner 1 ---
> 686,422,578
> 605,423,415
> 515,917,-361
> -336,658,858
> 95,138,22
> -476,619,847
> -340,-569,-846
> 567,-361,727
> -460,603,-452
> 669,-402,600
> 729,430,532
> -500,-761,534
> -322,571,750
> -466,-666,-811
> -429,-592,574
> -355,545,-477
> 703,-491,-529
> -328,-685,520
> 413,935,-424
> -391,539,-444
> 586,-435,557
> -364,-763,-893
> 807,-499,-711
> 755,-354,-619
> 553,889,-390
>
> --- scanner 2 ---
> 649,640,665
> 682,-795,504
> -784,533,-524
> -644,584,-595
> -588,-843,648
> -30,6,44
> -674,560,763
> 500,723,-460
> 609,671,-379
> -555,-800,653
> -675,-892,-343
> 697,-426,-610
> 578,704,681
> 493,664,-388
> -671,-858,530
> -667,343,800
> 571,-461,-707
> -138,-166,112
> -889,563,-600
> 646,-828,498
> 640,759,510
> -630,509,768
> -681,-892,-333
> 673,-379,-804
> -742,-814,-386
> 577,-820,562
>
> --- scanner 3 ---
> -589,542,597
> 605,-692,669
> -500,565,-823
> -660,373,557
> -458,-679,-417
> -488,449,543
> -626,468,-788
> 338,-750,-386
> 528,-832,-391
> 562,-778,733
> -938,-730,414
> 543,643,-506
> -524,371,-870
> 407,773,750
> -104,29,83
> 378,-903,-323
> -778,-728,485
> 426,699,580
> -438,-605,-362
> -469,-447,-387
> 509,732,623
> 647,635,-688
> -868,-804,481
> 614,-800,639
> 595,780,-596
>
> --- scanner 4 ---
> 727,592,562
> -293,-554,779
> 441,611,-461
> -714,465,-776
> -743,427,-804
> -660,-479,-426
> 832,-632,460
> 927,-485,-438
> 408,393,-506
> 466,436,-512
> 110,16,151
> -258,-428,682
> -393,719,612
> -211,-452,876
> 808,-476,-593
> -575,615,604
> -485,667,467
> -680,325,-822
> -627,-443,-432
> 872,-547,-609
> 833,512,582
> 807,604,487
> 839,-516,451
> 891,-625,532
> -652,-548,-490
> 30,-46,-14
> )
> +--------------+--------------+--------------+--------------+--------------+
> | 404 _588 _901| 686  422  578| 649  640  665|_589  542  597| 727  592  562|
> | 528 _643  409| 605  423  415| 682 _795  504| 605 _692  669|_293 _554  779|
> |_838  591  734| 515  917 _361|_784  533 _524|_500  565 _823| 441  611 _461|
> | 390 _675 _793|_336  658  858|_644  584 _595|_660  373  557|_714  465 _776|
> |_537 _823 _458|  95  138   22|_588 _843  648|_458 _679 _417|_743  427 _804|
> |_485 _357  347|_476  619  847| _30    6   44|_488  449  543|_660 _479 _426|
> |_345 _311  381|_340 _569 _846|_674  560  763|_626  468 _788| 832 _632  460|
> |_661 _816 _575| 567 _361  727| 500  723 _460| 338 _750 _386| 927 _485 _438|
> |_876  649  763|_460  603 _452| 609  671 _379| 528 _832 _391| 408  393 _506|
> |_618 _824 _621| 669 _402  600|_555 _800  653| 562 _778  733| 466  436 _512|
> | 553  345 _567| 729  430  532|_675 _892 _343|_938 _730  414| 110   16  151|
> | 474  580  667|_500 _761  534| 697 _426 _610| 543  643 _506|_258 _428  682|
> |_447 _329  318|_322  571  750| 578  704  681|_524  371 _870|_393  719  612|
> |_584  868 _557|_466 _666 _811| 493  664 _388| 407  773  750|_211 _452  876|
> | 544 _627 _890|_429 _592  574|_671 _858  530|_104   29   83| 808 _476 _593|
> | 564  392 _477|_355  545 _477|_667  343  800| 378 _903 _323|_575  615  604|
> | 455  729  728| 703 _491 _529| 571 _461 _707|_778 _728  485|_485  667  467|
> |_892  524  684|_328 _685  520|_138 _166  112| 426  699  580|_680  325 _822|
> |_689  845 _530| 413  935 _424|_889  563 _600|_438 _605 _362|_627 _443 _432|
> | 423 _701  434|_391  539 _444| 646 _828  498|_469 _447 _387| 872 _547 _609|
> |   7  _33  _71| 586 _435  557| 640  759  510| 509  732  623| 833  512  582|
> | 630  319 _379|_364 _763 _893|_630  509  768| 647  635 _688| 807  604  487|
> | 443  580  662| 807 _499 _711|_681 _892 _333|_868 _804  481| 839 _516  451|
> |_789  900 _551| 755 _354 _619| 673 _379 _804| 614 _800  639| 891 _625  532|
> | 459 _707  401| 553  889 _390|_742 _814 _386| 595  780 _596|_652 _548 _490|
> |              |              | 577 _820  562|              |  30  _46  _14|
> +--------------+--------------+--------------+--------------+--------------+
>    mm=: +/ .*                  NB. Matrix multiplication
>    'x y z'=: I=: e.@i. 3       NB. Unit vectors
>    Z=: (y,(-x),:z) mm^:(i.4) I NB. 4 rotations around z-axis
>    NB. R ~ Matrix representations of all 24 cube rotations
>    $R=: ,/ ((z,y,:-x) mm^:(i.4) I) mm"2/ Z
> 16 3 3
>    $R=: R, ,/ ((x,z,:-y) mm^:(1 3) I) mm"2/ Z
> 24 3 3
>    B=: 0{::d                NB. Beacons relative to scanner 0
>    S=: }. i. #d             NB. Remaining scanners' indices
>    T=: 0 0 0 $~ 3,~ #d      NB. Scanners' translation vectors
>    ol=: ~. #~ [: 12&<: #/.~ NB. Check for 12 overlapping beacons
>    NB. tx ~ for scanner y=s calculate all possible translations Tₛ
>    NB.      with b₀ = Tₛ + bₛ*Rₛ => Tₛ = b₀ - bₛ*Rₛ and identify
>    NB.      the one with 12 overlapping beacons - if available
>    tx=: {{ ol&.> ;/ ,/"3 B -"1/"2 (y{::d) mm"1/"2 R }}"0
>    3 : 0 ''        NB. Apply tx to all remaining scanners S and identify
> those
> while. 0<$S do. NB. with 12 overlaps - s is the 1st and has rotation r{R
>   s=. {&S {. 'i r'=. {. ($ #: I.@,) 1&= #&>X=. tx S
>   T=: (,(<i,r){::X) s} T                   NB. Store translation vector Tₛ
>   B=: ~. B, (s{T) +"1 (r{R) mm"1/"2~ s{::d NB. Update B with s' beacons
>   S=: S -. s                               NB. Drop s from scanners S
> end.
> )
>
>    # B                    NB. (*)
> 79
>    >./ ,([: +/ |@-)"1/~ T NB. (**)
> 3621
> ----------------------------------------------------------------------
> 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