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