Skip to content

Instantly share code, notes, and snippets.

@devNoiseConsulting
Created January 3, 2018 03:31
Show Gist options
  • Select an option

  • Save devNoiseConsulting/f938990c45c176eb3fae98d72353874d to your computer and use it in GitHub Desktop.

Select an option

Save devNoiseConsulting/f938990c45c176eb3fae98d72353874d to your computer and use it in GitHub Desktop.
Electromagnetic Moat - Advent of Code - 20171224
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