Advertisement
Guest User

AdventOfCode/19

a guest
Dec 19th, 2021
367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var transformations = [
  2.     p => [ p[0], p[1], p[2] ],
  3.     p => [ p[0], p[2], p[1] ],
  4.     p => [ p[1], p[0], p[2] ],
  5.     p => [ p[1], p[2], p[0] ],
  6.     p => [ p[2], p[0], p[1] ],
  7.     p => [ p[2], p[1], p[0] ],
  8.  
  9.     p => [ -p[0], p[1], p[2] ],
  10.     p => [ -p[0], p[2], p[1] ],
  11.     p => [ -p[1], p[0], p[2] ],
  12.     p => [ -p[1], p[2], p[0] ],
  13.     p => [ -p[2], p[0], p[1] ],
  14.     p => [ -p[2], p[1], p[0] ],
  15.  
  16.     p => [ p[0], -p[1], p[2] ],
  17.     p => [ p[0], -p[2], p[1] ],
  18.     p => [ p[1], -p[0], p[2] ],
  19.     p => [ p[1], -p[2], p[0] ],
  20.     p => [ p[2], -p[0], p[1] ],
  21.     p => [ p[2], -p[1], p[0] ],
  22.  
  23.     p => [ p[0], p[1], -p[2] ],
  24.     p => [ p[0], p[2], -p[1] ],
  25.     p => [ p[1], p[0], -p[2] ],
  26.     p => [ p[1], p[2], -p[0] ],
  27.     p => [ p[2], p[0], -p[1] ],
  28.     p => [ p[2], p[1], -p[0] ],
  29.  
  30.     p => [ -p[0], -p[1], p[2] ],
  31.     p => [ -p[0], -p[2], p[1] ],
  32.     p => [ -p[1], -p[0], p[2] ],
  33.     p => [ -p[1], -p[2], p[0] ],
  34.     p => [ -p[2], -p[0], p[1] ],
  35.     p => [ -p[2], -p[1], p[0] ],
  36.  
  37.     p => [ p[0], -p[1], -p[2] ],
  38.     p => [ p[0], -p[2], -p[1] ],
  39.     p => [ p[1], -p[0], -p[2] ],
  40.     p => [ p[1], -p[2], -p[0] ],
  41.     p => [ p[2], -p[0], -p[1] ],
  42.     p => [ p[2], -p[1], -p[0] ],
  43.  
  44.     p => [ -p[0], p[1], -p[2] ],
  45.     p => [ -p[0], p[2], -p[1] ],
  46.     p => [ -p[1], p[0], -p[2] ],
  47.     p => [ -p[1], p[2], -p[0] ],
  48.     p => [ -p[2], p[0], -p[1] ],
  49.     p => [ -p[2], p[1], -p[0] ],
  50.  
  51.     p => [ -p[0], -p[1], -p[2] ],
  52.     p => [ -p[0], -p[2], -p[1] ],
  53.     p => [ -p[1], -p[0], -p[2] ],
  54.     p => [ -p[1], -p[2], -p[0] ],
  55.     p => [ -p[2], -p[0], -p[1] ],
  56.     p => [ -p[2], -p[1], -p[0] ]
  57. ]
  58.  
  59. var pyt = (p1, p2) => {
  60.     var d = 0;
  61.     for (var i = 0; i < p1.length; i++) {
  62.         d += Math.pow(p2[i] - p1[i], 2)
  63.     }
  64.     return d;
  65. }
  66.  
  67. var fnFromStringToArray = str => str.split(',').map(v => parseInt(v));
  68.  
  69. var fnOverlap = (index_pos, index_map, i, j) =>
  70.     index_map[i].map((absolute_distances, absolute_index) => {
  71.         var relative_index;
  72.         index_map[j].forEach((e, i) => {
  73.             if (absolute_distances.filter(v => e.find(w => v.d === w.d)).length >= 11) relative_index = i;
  74.         });
  75.         if (relative_index === undefined) return undefined;
  76.         return ({
  77.             absolute_point: index_pos[i][absolute_index],
  78.             relative_point: index_pos[j][relative_index]
  79.         });
  80.     }).filter(m => m);
  81.  
  82. var offset_point = (p, o) => [ p[0] + o[0], p[1] + o[1], p[2] + o[2] ];
  83.  
  84. var equ = (arr1, arr2) => {
  85.     for (var i = 0; i < arr1.length; i++) {
  86.         if (arr1[i] !== arr2[i]) return false;
  87.     }
  88.     return true;
  89. }
  90.  
  91. export function execute(input_data) {
  92.     var input = input_data.split('\n\n').map(i => i.split('\n').slice(1).map(v => v.split(',').map(v => parseInt(v))));
  93.     var dist = [];
  94.     input.forEach((i, s) => i.forEach((from, index_from) => i.filter(to => to !== from).forEach((to, index_to) => {
  95.         if (!dist[s]) dist[s] = [];
  96.         if (!dist[s][index_from]) dist[s][index_from] = [];
  97.         dist[s][index_from].push({ d: pyt(from, to), to: index_to });
  98.     })));
  99.     var trans = [ 0 ];
  100.     var offsets = [ [0,0,0] ];
  101.     var beacons = {};
  102.     while (trans.length < input.length) {
  103.         trans.push(trans.shift());
  104.         var m = trans[0];
  105.         for (var n = 0; n < input.length; n++) {
  106.             if (n !== m && !trans.includes(n)) {
  107.                 var overlap = fnOverlap(input, dist, m, n);
  108.                 if (overlap.length > 0) {
  109.                     overlap.forEach(p => {
  110.                         transformations.forEach((t, i) => {
  111.                             if (trans.includes(n)) return;
  112.                             var offset = offset_point(p.absolute_point, t(p.relative_point).map(c => -c));
  113.                             if (overlap.filter(o => equ(offset_point(t(o.relative_point), offset), o.absolute_point)).length === overlap.length) {
  114.                                 trans.push(n);
  115.                                 input[n] = input[n].map(i => offset_point(t(i), offset));
  116.                                 offsets.push(offset);
  117.                             }
  118.                         });
  119.                     });
  120.                 }
  121.             }
  122.         }
  123.     }
  124.     console.log('Transforming ...');
  125.     input.forEach((s, d) => s.forEach(p => beacons[p] = true));
  126.     return [
  127.         Object.keys(beacons).length,
  128.         Math.max(...offsets.flatMap((o, i) => offsets.slice(i + 1).map(u => Math.abs(u[0] - o[0]) + Math.abs(u[1] - o[1]) + Math.abs(u[2] - o[2]))))
  129.     ]
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement