Created
January 3, 2018 03:31
-
-
Save devNoiseConsulting/f938990c45c176eb3fae98d72353874d to your computer and use it in GitHub Desktop.
Electromagnetic Moat - Advent of Code - 20171224
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const ports = require('./ports'); | |
| let findCompatiblePorts = function(currentPort, portSize, ports, usedPorts) { | |
| ports = ports | |
| .filter(p => p !== currentPort) | |
| .filter(p => usedPorts.indexOf(p) == -1) | |
| .filter(port => { | |
| let [a, b] = port.split('/'); | |
| return a == portSize || b == portSize ? true : false; | |
| }); | |
| return ports; | |
| }; | |
| let strongestBridge = function(port, portSize, ports, usedPorts, strength) { | |
| usedPorts = usedPorts.slice(); | |
| let nextPorts = findCompatiblePorts(port, portSize, ports, usedPorts); | |
| /* | |
| console.log( | |
| 'strongestBridge', | |
| port, | |
| portSize, | |
| strength); | |
| */ | |
| if (nextPorts.length == 0) { | |
| return strength; | |
| } else { | |
| let strongest = strength; | |
| nextPorts.forEach(p => { | |
| let [portA, portB] = p.split('/'); | |
| let newPortSize = portSize !== portA ? portA : portB; | |
| let newStrength = strongestBridge( | |
| p, | |
| newPortSize, | |
| ports, | |
| [port, ...usedPorts], | |
| strength + parseInt(portA) + parseInt(portB) | |
| ); | |
| strongest = newStrength > strongest ? newStrength : strongest; | |
| }); | |
| return strongest; | |
| } | |
| }; | |
| let bridgeSize = []; | |
| let longestBridge = function(port, portSize, ports, usedPorts, length) { | |
| usedPorts = usedPorts.slice(); | |
| let nextPorts = findCompatiblePorts(port, portSize, ports, usedPorts); | |
| /* | |
| console.log( | |
| 'longestBridge', | |
| port, | |
| portSize, | |
| length, | |
| usedPorts, nextPorts); | |
| */ | |
| if (nextPorts.length == 0) { | |
| if (bridgeSize[length] == undefined) { | |
| bridgeSize[length] = [[port, ...usedPorts]]; | |
| } else { | |
| bridgeSize[length].push([port, ...usedPorts]); | |
| } | |
| return length; | |
| } else { | |
| let longest = length; | |
| nextPorts.forEach(p => { | |
| let [portA, portB] = p.split('/'); | |
| let newPortSize = portSize !== portA ? portA : portB; | |
| let newLength = longestBridge( | |
| p, | |
| newPortSize, | |
| ports, | |
| [port, ...usedPorts], | |
| length + 1 | |
| ); | |
| longest = newLength > longest ? newLength : longest; | |
| }); | |
| return longest; | |
| } | |
| }; | |
| let buildBridge_1 = function(ports) { | |
| let portSize = '0'; | |
| let startPorts = findCompatiblePorts('0/0', portSize, ports, []); | |
| let strongest = 0; | |
| let longest = 0; | |
| startPorts.forEach(p => { | |
| let [portA, portB] = p.split('/'); | |
| let newPortSize = portSize !== portA ? portA : portB; | |
| let strength = strongestBridge( | |
| p, | |
| newPortSize, | |
| ports, | |
| [p], | |
| parseInt(portA) + parseInt(portB) | |
| ); | |
| strongest = strongest > strength ? strongest : strength; | |
| }); | |
| return strongest; | |
| }; | |
| let buildBridge_2 = function(ports) { | |
| let portSize = '0'; | |
| let startPorts = findCompatiblePorts('0/0', portSize, ports, []); | |
| let strongest = 0; | |
| let longest = 0; | |
| startPorts.forEach(p => { | |
| let [portA, portB] = p.split('/'); | |
| let newPortSize = portSize !== portA ? portA : portB; | |
| let length = longestBridge( | |
| p, | |
| newPortSize, | |
| ports, | |
| [], | |
| 1 | |
| ); | |
| longest = longest > length ? longest : length; | |
| }); | |
| console.log(bridgeSize[longest]); | |
| return bridgeSize[longest].reduce((acc, chain) => { | |
| let strength = chain.reduce((acc, link) => { | |
| let [portA, portB] = link.split('/'); | |
| acc += parseInt(portA) + parseInt(portB); | |
| return acc; | |
| }, 0); | |
| return acc > strength ? acc : strength; | |
| }, 0); | |
| }; | |
| let buildBridge = buildBridge_2; | |
| let result = buildBridge(ports); | |
| console.log(result); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment