Advertisement
adapap

AoC 2017 - 21B

Dec 21st, 2017
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. let its = 0
  2. function solve(s, runs) {
  3.     let a = s.split('\n')
  4.     let rules = {}
  5.     for (let rule of a) {
  6.         first = rule.substring(0, rule.indexOf('=') - 1)
  7.         second = rule.substring(rule.indexOf('>') + 2).trim()
  8.         rules[first] = second
  9.     }
  10.     let pix_data = [[['.#.'],['..#'],['###']]]
  11.     //let pix_data = [[['#.'],['..']],[['.#'],['..']],[['..'],['#.']],[['..'],['.#']]]
  12.     let iterations = 0
  13.     let size_index = 3
  14.     let get_new_data = (data) => {
  15.         let m = data
  16.         for (let rot=0; rot<4; rot++) {
  17.             for (let fl=0; fl<2; fl++) {
  18.                 let pix_rule = m.join('/')
  19.                 if (rules[pix_rule] != undefined) {
  20.                     return rules[pix_rule].split('/')
  21.                 }
  22.                 m = flip(m)
  23.             }
  24.             m = rotate(m)
  25.         }
  26.     }
  27.     let condense = (data, size) => {
  28.         let len = data.length
  29.         let condensed = []
  30.         for (let i=0; i<size; i++) {
  31.             condensed.push('')
  32.         }
  33.         if (len == size) { return data }
  34.         switch(size%2==0) {
  35.             case true:
  36.                 let first_half = data.splice(0,len/2)
  37.                 let second_half = data.splice(0,len/2)
  38.                 for (let d in first_half) {
  39.                     condensed[d%(size/2)] += first_half[d]
  40.                 }
  41.                 for (let d in second_half) {
  42.                     condensed[(size/2) + d%(size/2)] += second_half[d]
  43.                 }
  44.                 return condensed
  45.                 break
  46.             case false:
  47.                 let first_third = data.splice(0,len/3)
  48.                 let second_third = data.splice(0,len/3)
  49.                 let third_third = data.splice(0,len/3)
  50.                 for (let d in first_third) {
  51.                     condensed[d%(size/3)] += first_third[d]
  52.                 }
  53.                 for (let d in second_third) {
  54.                     condensed[(size/3) + d%(size/3)] += second_third[d]
  55.                 }
  56.                 for (let d in third_third) {
  57.                     condensed[2*(size/3) + d%(size/3)] += third_third[d]
  58.                 }
  59.                 return condensed
  60.                 break
  61.         }
  62.     }
  63.     let groupify = (c) => {
  64.         let m = []
  65.         let l = c[0].length
  66.         switch(l%2==0) {
  67.             case true:
  68.                 for (let row=0; row<l; row+=2) {
  69.                     for (let col=0; col<l; col+=2) {
  70.                         let top = (c[row][col] + c[row][col+1])
  71.                         let bot = (c[row+1][col] + c[row+1][col+1])
  72.                         m.push([[top],[bot]])
  73.                     }
  74.                 }
  75.                 return m
  76.                 break
  77.             case false:
  78.                 for (let row=0; row<l; row+=3) {
  79.                     for (let col=0; col<l; col+=3) {
  80.                         let top = (c[row][col] + c[row][col+1] + c[row][col+2])
  81.                         let mid = (c[row+1][col] + c[row+1][col+1] + c[row+1][col+2])
  82.                         let bot = (c[row+2][col] + c[row+2][col+1] + c[row+2][col+2])
  83.                         m.push([[top],[mid],[bot]])
  84.                     }
  85.                 }
  86.                 return m
  87.                 break
  88.         }
  89.     }
  90.     let hash_count = 0
  91.     while (iterations < runs) {
  92.         iterations++
  93.         its = iterations
  94.         if (size_index % 2 == 0) {
  95.             size_index = (size_index / 2) * 3
  96.         }
  97.         else if (size_index % 3 == 0) {
  98.             size_index = (size_index / 3) * 4
  99.         }
  100.         let group_raw = []
  101.         if (its == 1) {
  102.             let raw_data = get_new_data(pix_data[0])
  103.             group_raw = group_raw.concat(raw_data)
  104.         }
  105.         else {
  106.             for (let group of pix_data) {
  107.                 let size = group.length
  108.                 if (size % 2 == 0) {
  109.                     let raw_data = get_new_data(group)
  110.                     group_raw = group_raw.concat(raw_data)
  111.                 }
  112.                 else if (size % 3 == 0) {
  113.                     let raw_data = get_new_data(group)
  114.                     group_raw = group_raw.concat(raw_data)
  115.                 }
  116.             }
  117.         }
  118.         //console.log('raws',group_raw)
  119.         let combined = condense(group_raw, size_index) //group_raw is all the individual squares
  120.         //we can convert these squares into one large square using different sizes
  121.         //console.log(size_index)
  122.         pix_data = groupify(combined)
  123.         //Log for display
  124.         console.log('\n[Iteration',its-1 + ']')
  125.         console.log(combined.join('\n'))
  126.         let counts = 0
  127.         for (let row in combined) {
  128.             let temp = combined[row].split('')
  129.             counts += temp.filter(e=>e=='#').length
  130.         }
  131.         hash_count = counts
  132.     }
  133.     console.log('Hash Count: ',hash_count)
  134. }
  135.  
  136. function flip(a) {
  137.     if (a.length % 2 == 0) {
  138.         let top = a.shift()
  139.         a.push(top)
  140.         return a
  141.     }
  142.     else {
  143.         let top = a.shift()
  144.         let bot = a.pop()
  145.         a.unshift(bot)
  146.         a.push(top)
  147.         return a
  148.     }
  149. }
  150.  
  151. function rotate(mat) {
  152.     var matrix = []
  153.     for (let i of mat) {
  154.         i = i[0].split('')
  155.         matrix.push(i)
  156.     }
  157.     matrix = matrix.reverse()
  158.     // swap the symmetric elements
  159.     for (var i = 0; i < matrix.length; i++) {
  160.       for (var j = 0; j < i; j++) {
  161.         var temp = matrix[i][j]
  162.         matrix[i][j] = matrix[j][i]
  163.         matrix[j][i] = temp
  164.       }
  165.     }
  166.     var remat = []
  167.     for (let i of matrix) {
  168.         i = i.join('')
  169.         remat.push([i])
  170.     }
  171.     return remat
  172. }
  173.  
  174. const fs = require('fs')
  175. const path = 'day21.txt'
  176. fs.readFile(path, 'utf8', (e, input) => {
  177.     solve(input,5)
  178.     //solve(input,18)
  179. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement