From e532fa96f602dc39bae0007bedc0e6b6346ac6c6 Mon Sep 17 00:00:00 2001 From: Tim Stallard Date: Sun, 11 Dec 2016 23:54:03 +0000 Subject: [PATCH] Added day 11 mess (new2 works) --- .gitignore | 1 + day11/input.txt | 4 + day11/input_2.txt | 4 + day11/package.json | 15 ++++ day11/part1.js | 151 ++++++++++++++++++++++++++++++++++++++ day11/part1_new.js | 125 +++++++++++++++++++++++++++++++ day11/part1_new2.js | 118 +++++++++++++++++++++++++++++ day11/part1_new3.js | 130 ++++++++++++++++++++++++++++++++ day11/part1_new4_unopt.js | 126 +++++++++++++++++++++++++++++++ day11/part1_new5_unopt.js | 116 +++++++++++++++++++++++++++++ 10 files changed, 790 insertions(+) create mode 100644 .gitignore create mode 100644 day11/input.txt create mode 100644 day11/input_2.txt create mode 100644 day11/package.json create mode 100644 day11/part1.js create mode 100644 day11/part1_new.js create mode 100644 day11/part1_new2.js create mode 100644 day11/part1_new3.js create mode 100644 day11/part1_new4_unopt.js create mode 100644 day11/part1_new5_unopt.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/day11/input.txt b/day11/input.txt new file mode 100644 index 0000000..e82fca5 --- /dev/null +++ b/day11/input.txt @@ -0,0 +1,4 @@ +The first floor contains a polonium generator, a thulium generator, a thulium-compatible microchip, a promethium generator, a ruthenium generator, a ruthenium-compatible microchip, a cobalt generator, and a cobalt-compatible microchip. +The second floor contains a polonium-compatible microchip and a promethium-compatible microchip. +The third floor contains nothing relevant. +The fourth floor contains nothing relevant. diff --git a/day11/input_2.txt b/day11/input_2.txt new file mode 100644 index 0000000..e82fca5 --- /dev/null +++ b/day11/input_2.txt @@ -0,0 +1,4 @@ +The first floor contains a polonium generator, a thulium generator, a thulium-compatible microchip, a promethium generator, a ruthenium generator, a ruthenium-compatible microchip, a cobalt generator, and a cobalt-compatible microchip. +The second floor contains a polonium-compatible microchip and a promethium-compatible microchip. +The third floor contains nothing relevant. +The fourth floor contains nothing relevant. diff --git a/day11/package.json b/day11/package.json new file mode 100644 index 0000000..28410f3 --- /dev/null +++ b/day11/package.json @@ -0,0 +1,15 @@ +{ + "name": "day11", + "version": "1.0.0", + "description": "", + "main": "part1.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "UNLICENSED", + "dependencies": { + "js-combinatorics": "^0.5.2", + "underscore": "^1.8.3" + } +} diff --git a/day11/part1.js b/day11/part1.js new file mode 100644 index 0000000..7bc3a4d --- /dev/null +++ b/day11/part1.js @@ -0,0 +1,151 @@ +var initialFloors = []; +var initialLift = 0; +var minFloor = 0; +var _ = require("underscore"); + +var scenarios = [ + { + floors: initialFloors, + lift: initialLift + } +]; + +var input = require("fs").readFileSync("input.txt").toString().replace(/\r/g, ""); +input.split("\n").filter((a)=>(a)).forEach((line)=>{ + var floorNums = ["first", "second", "third", "fourth"]; + var lineParts = line.match(/The ([^ ]+) floor contains (.*)./); + var floorNum = floorNums.indexOf(lineParts[1]); + initialFloors[floorNum] = {chips: [], generators: []}; + var items = lineParts[2].replace("and ", ", ").split(", ").filter((a)=>(a)); + items.forEach((item)=>{ + if(item.indexOf("generator") != -1){ + var itemParts = item.match(/a ([^ ]+) generator/); + initialFloors[floorNum].generators.push(itemParts[1]); + } + else if(item.indexOf("microchip") != -1){ + var itemParts = item.match(/a ([^ ]+)-compatible microchip/); + initialFloors[floorNum].chips.push(itemParts[1]); + } + }); +}); + +function checkFloors(floors){ + for(var floor of floors){ + if(floor.generators.length > 0){ + for(var elem of floor.chips){ + if(floor.generators.indexOf(elem) == -1){ + return false; + } + } + } + } + return true; +} + +function possibleMoves(scenario){ + var newScenarios = []; + for(var chip of scenario.floors[scenario.lift].chips){ + if(scenario.lift > minFloor){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift].chips = floors[scenario.lift].chips.filter((a)=>(a != chip)); + floors[scenario.lift - 1].chips.push(chip); + newScenarios.push({lift: scenario.lift - 1, floors: floors}); + } + if(scenario.lift < 3){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift].chips = floors[scenario.lift].chips.filter((a)=>(a != chip)); + floors[scenario.lift + 1].chips.push(chip); + newScenarios.push({lift: scenario.lift + 1, floors: floors}); + } + + for(var generator of scenario.floors[scenario.lift].generators){ + /* + if(scenario.lift > 0){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift].chips = floors[scenario.lift].chips.filter((a)=>(a != chip)); + floors[scenario.lift].generators = floors[scenario.lift].generators.filter((a)=>(a != generator)); + floors[scenario.lift - 1].chips.push(chip); + floors[scenario.lift - 1].generators.push(generator); + newScenarios.push({lift: scenario.lift - 1, floors: floors}); + } + */ + if(scenario.lift < 3){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift].chips = floors[scenario.lift].chips.filter((a)=>(a != chip)); + floors[scenario.lift].generators = floors[scenario.lift].generators.filter((a)=>(a != generator)); + floors[scenario.lift + 1].chips.push(chip); + floors[scenario.lift + 1].generators.push(generator); + newScenarios.push({lift: scenario.lift + 1, floors: floors}); + } + } + for(var chip2 of scenario.floors[scenario.lift].chips.filter((a)=>(a != chip))){ + if(scenario.lift > minFloor){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift].chips = floors[scenario.lift].chips.filter((a)=>(a != chip)).filter((a)=>(a != chip2)); + floors[scenario.lift - 1].chips.push(chip); + floors[scenario.lift - 1].chips.push(chip2); + newScenarios.push({lift: scenario.lift - 1, floors: floors}); + } + if(scenario.lift < 3){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift].chips = floors[scenario.lift].chips.filter((a)=>(a != chip)).filter((a)=>(a != chip2)); + floors[scenario.lift + 1].chips.push(chip); + floors[scenario.lift + 1].chips.push(chip2); + newScenarios.push({lift: scenario.lift + 1, floors: floors}); + } + } + } + return newScenarios; +} + +function newPossibleScenarios(){ + allNewScenarios = []; + scenarios.forEach((scenario)=>{ + allNewScenarios = allNewScenarios.concat(possibleMoves(scenario).filter((a)=>(checkFloors(a.floors)))); + }); + return allNewScenarios; +} + +var i = 1; + +var solved = false; +/* +while(!solved){ + scenarios = newPossibleScenarios(); + console.log(JSON.stringify(scenarios)); + i++ + console.log(i); + minFloor = getMinFloor(); + console.log(minFloor); + if(minFloor == 3){ + console.log("SOLVED"); + solved = true; + } +} +*/ +function getMinFloor(){ + var min = 0; + for(var scenario of scenarios){ + var scenarioMin = 5; + for(var i in scenario.floors){ + if((scenario.floors[i].chips.length > 0) || (scenario.floors[i].generators.length > 0)){ + if(i < scenarioMin){ + scenarioMin = i; + } + } + } + if((scenarioMin > min) && (scenarioMin != 5)){ + min = scenarioMin + } + } + return min; +} + + +//console.log(JSON.stringify(possibleMoves(scenarios[0]))); +for(var i = 0; i < 8; i++){ + scenarios = newPossibleScenarios(); + console.log(JSON.stringify(scenarios)); + minFloor = getMinFloor() + console.log(minFloor); +} diff --git a/day11/part1_new.js b/day11/part1_new.js new file mode 100644 index 0000000..ac16af0 --- /dev/null +++ b/day11/part1_new.js @@ -0,0 +1,125 @@ +var initialFloors = []; +var initialLift = 0; +var minFloor = 0; +var _ = require("underscore"); +var combinatorics = require("js-combinatorics"); +var previous = []; + +var scenarios = [ + { + floors: initialFloors, + lift: initialLift + } +]; + +var input = require("fs").readFileSync("input.txt").toString().replace(/\r/g, ""); +input.split("\n").filter((a)=>(a)).forEach((line)=>{ + var floorNums = ["first", "second", "third", "fourth"]; + var lineParts = line.match(/The ([^ ]+) floor contains (.*)./); + var floorNum = floorNums.indexOf(lineParts[1]); + initialFloors[floorNum] = []; + var items = lineParts[2].replace("and ", ", ").split(", ").filter((a)=>(a)); + items.forEach((item)=>{ + if(item.indexOf("generator") != -1){ + var itemParts = item.match(/a ([^ ]+) generator/); + initialFloors[floorNum].push(["generator", itemParts[1]]) + } + else if(item.indexOf("microchip") != -1){ + var itemParts = item.match(/a ([^ ]+)-compatible microchip/); + initialFloors[floorNum].push(["microchip", itemParts[1]]) + } + }); +}); + +function checkFloors(floors){ + for(var floor of floors){ + if(floor.filter((a)=>(a[0] == "generator")).length > 0){ + for(var element of floor.filter((a)=>(a[0] == "microchip")).map((a)=>(a[1]))){ + if(floor.filter((a)=>(a[0] == "generator")).map((a)=>(a[1])).indexOf(element) == -1){ + return false; + } + } + } + } + return true; +} + +function getMinFloors(floors){ + return floors.map((a)=>(Boolean(a.length))).indexOf(true); +} + +function possibleScenarios(scenario){ + var newScenarios = []; + + var ids = scenario.floors[scenario.lift].map((a, i)=>(i)); + var arrangements = []; + if(ids.length >= 1){ + arrangements = arrangements.concat(combinatorics.combination(ids, 1).toArray()); + } + if(ids.length >= 2){ + arrangements = arrangements.concat(combinatorics.combination(ids, 2).toArray()); + } + arrangements.forEach((arrangement)=>{ + if(scenario.lift < 3){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios.push({lift: scenario.lift + 1, floors: floors}); + } + if((scenario.lift > minFloor)){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + if(floors[scenario.lift][arrangement[0]][0] == "microchip"){ + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + if(floors[scenario.lift][arrangement[1]][0] == "microchip"){ + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios.push({lift: scenario.lift - 1, floors: floors}); + } + } + else{ + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios.push({lift: scenario.lift - 1, floors: floors}); + } + } + } + }); + return newScenarios; +} + +function nextSetOfScenarios(){ + var newScenarios = []; + for(var scenario of scenarios){ + newScenarios = newScenarios.concat(possibleScenarios(scenario)); + } + newScenarios = newScenarios.filter((scenario)=>(checkFloors(scenario.floors))); + console.log("newLength", newScenarios.length); + minFloor = newScenarios.map((scenario)=>(getMinFloors(scenario.floors))).reduce((a, b)=>(Math.max(a, b))) + newScenarios = newScenarios.filter((scenario)=>(getMinFloors(scenario.floors) >= minFloor)); + scenario.floors.map((a)=>(a.sort())); + newScenarios = _.uniq(newScenarios, (scenario)=>(JSON.stringify(scenario))); + newScenarios = newScenarios.filter((scenario)=>(previous.indexOf(JSON.stringify(scenario)) == -1)); + newScenarios.map((scenario)=>(previous.push(JSON.stringify(scenario)))) + console.log("MIN", minFloor); + if(minFloor == 3){ + console.log("SOLVED"); + } + scenarios = newScenarios; + //console.log(JSON.stringify(scenarios)); +} + +var i = 0; + +while(minFloor < 3){ + i++; + nextSetOfScenarios(); + console.log(scenarios.length); +} +console.log(i); diff --git a/day11/part1_new2.js b/day11/part1_new2.js new file mode 100644 index 0000000..8281a9c --- /dev/null +++ b/day11/part1_new2.js @@ -0,0 +1,118 @@ +var initialFloors = []; +var initialLift = 0; +var minFloor = 0; +var _ = require("underscore"); +var combinatorics = require("js-combinatorics"); +var previous = []; + +var scenarios = [ + { + floors: initialFloors, + lift: initialLift + } +]; + +var input = require("fs").readFileSync("input.txt").toString().replace(/\r/g, ""); +input.split("\n").filter((a)=>(a)).forEach((line)=>{ + var floorNums = ["first", "second", "third", "fourth"]; + var lineParts = line.match(/The ([^ ]+) floor contains (.*)./); + var floorNum = floorNums.indexOf(lineParts[1]); + initialFloors[floorNum] = []; + var items = lineParts[2].replace("and ", ", ").split(", ").filter((a)=>(a)); + items.forEach((item)=>{ + if(item.indexOf("generator") != -1){ + var itemParts = item.match(/a ([^ ]+) generator/); + initialFloors[floorNum].push(["generator", itemParts[1]]) + } + else if(item.indexOf("microchip") != -1){ + var itemParts = item.match(/a ([^ ]+)-compatible microchip/); + initialFloors[floorNum].push(["microchip", itemParts[1]]) + } + }); +}); + +function checkFloors(floors){ + for(var floor of floors){ + if(floor.filter((a)=>(a[0] == "generator")).length > 0){ + for(var element of floor.filter((a)=>(a[0] == "microchip")).map((a)=>(a[1]))){ + if(floor.filter((a)=>(a[0] == "generator")).map((a)=>(a[1])).indexOf(element) == -1){ + return false; + } + } + } + } + return true; +} + +function getMinFloors(floors){ + return floors.map((a)=>(Boolean(a.length))).indexOf(true); +} + +function possibleScenarios(scenario){ + var newScenarios = []; + + var ids = scenario.floors[scenario.lift].map((a, i)=>(i)); + var arrangements = []; + if(ids.length >= 1){ + arrangements = arrangements.concat(combinatorics.combination(ids, 1).toArray()); + } + if(ids.length >= 2){ + arrangements = arrangements.concat(combinatorics.combination(ids, 2).toArray()); + } + arrangements.forEach((arrangement)=>{ + if(scenario.lift < 3){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios.push({lift: scenario.lift + 1, floors: floors}); + } + if((scenario.lift > minFloor)){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios.push({lift: scenario.lift - 1, floors: floors}); + } + }); + return newScenarios; +} + +function nextSetOfScenarios(){ + var newScenarios = []; + for(var scenario of scenarios){ + newScenarios = newScenarios.concat(possibleScenarios(scenario)); + } + newScenarios = newScenarios.filter((scenario)=>(checkFloors(scenario.floors))); + console.log("newLength", newScenarios.length); + localMinFloor = newScenarios.map((scenario)=>(getMinFloors(scenario.floors))).reduce((a, b)=>(Math.max(a, b))) + //console.log(newScenarios); + //newScenarios = newScenarios.filter((scenario)=>(getMinFloors(scenario.floors) == localMinFloor)); + newScenarios.forEach((scenario)=>{scenario.floors.forEach((a)=>(a.sort()));}) + newScenarios = _.uniq(newScenarios, (scenario)=>(JSON.stringify(scenario))); + newScenarios = newScenarios.filter((scenario)=>(previous.indexOf(JSON.stringify(scenario)) == -1)); + //previous = []; + newScenarios.map((scenario)=>(previous.push(JSON.stringify(scenario)))); + console.log("MIN", localMinFloor); + if(localMinFloor == 3){ + console.log("SOLVED"); + } + scenarios = newScenarios; +} + +var i = 0; + +while(minFloor < 3){ + i++; + nextSetOfScenarios(); + console.log(scenarios.length); +} +console.log(i); diff --git a/day11/part1_new3.js b/day11/part1_new3.js new file mode 100644 index 0000000..941d876 --- /dev/null +++ b/day11/part1_new3.js @@ -0,0 +1,130 @@ +var initialFloors = []; +var initialLift = 0; +var minFloor = 0; +var _ = require("underscore"); +var combinatorics = require("js-combinatorics"); +var previous = []; + +var scenarios = [ + { + floors: initialFloors, + lift: initialLift + } +]; + +var input = require("fs").readFileSync("input.txt").toString().replace(/\r/g, ""); +input.split("\n").filter((a)=>(a)).forEach((line)=>{ + var floorNums = ["first", "second", "third", "fourth"]; + var lineParts = line.match(/The ([^ ]+) floor contains (.*)./); + var floorNum = floorNums.indexOf(lineParts[1]); + initialFloors[floorNum] = []; + var items = lineParts[2].replace("and ", ", ").split(", ").filter((a)=>(a)); + items.forEach((item)=>{ + if(item.indexOf("generator") != -1){ + var itemParts = item.match(/a ([^ ]+) generator/); + initialFloors[floorNum].push(["generator", itemParts[1]]) + } + else if(item.indexOf("microchip") != -1){ + var itemParts = item.match(/a ([^ ]+)-compatible microchip/); + initialFloors[floorNum].push(["microchip", itemParts[1]]) + } + }); +}); + +function checkFloors(floors){ + for(var floor of floors){ + if(floor.filter((a)=>(a[0] == "generator")).length > 0){ + for(var element of floor.filter((a)=>(a[0] == "microchip")).map((a)=>(a[1]))){ + if(floor.filter((a)=>(a[0] == "generator")).map((a)=>(a[1])).indexOf(element) == -1){ + return false; + } + } + } + } + return true; +} + +function getMinFloors(floors){ + return floors.map((a)=>(Boolean(a.length))).indexOf(true); +} + +function possibleScenarios(scenario){ + var newScenarios = [[], []]; + + var ids = scenario.floors[scenario.lift].map((a, i)=>(i)); + var arrangements = []; + if(ids.length >= 1){ + arrangements = arrangements.concat(combinatorics.combination(ids, 1).toArray()); + } + if(ids.length >= 2){ + arrangements = arrangements.concat(combinatorics.combination(ids, 2).toArray()); + } + arrangements.forEach((arrangement)=>{ + if(scenario.lift < 3){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios[0].push({lift: scenario.lift + 1, floors: floors}); + } + if((scenario.lift > minFloor)){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + var generator = (arrangement.map((a)=>(floors[scenario.lift][a][0])).indexOf("generator") > -1); + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + if(generator){ + newScenarios[1].push({lift: scenario.lift - 1, floors: floors}); + } + else{ + newScenarios[0].push({lift: scenario.lift - 1, floors: floors}); + } + } + }); + return newScenarios; +} + +function nextSetOfScenarios(){ + var newScenariosSets = [[], []]; + for(var scenario of scenarios){ + var possibleScenariosSet = possibleScenarios(scenario); + newScenariosSets[0] = newScenariosSets[0].concat(possibleScenariosSet[0]); + newScenariosSets[1] = newScenariosSets[1].concat(possibleScenariosSet[1]); + } + if(newScenariosSets[0].length > 0){ + var newScenarios = newScenariosSets[0]; + } + else{ + console.log("falling back"); + var newScenarios = newScenariosSets[1]; + } + newScenarios = newScenarios.filter((scenario)=>(checkFloors(scenario.floors))); + console.log("newLength", newScenarios.length); + minFloor = newScenarios.map((scenario)=>(getMinFloors(scenario.floors))).reduce((a, b)=>(Math.max(a, b))) + newScenarios = newScenarios.filter((scenario)=>(getMinFloors(scenario.floors) >= minFloor)); + newScenarios = _.uniq(newScenarios, (scenario)=>(JSON.stringify(scenario))); + newScenarios = newScenarios.filter((scenario)=>(previous.indexOf(JSON.stringify(scenario)) == -1)); + newScenarios.map((scenario)=>(previous.push(JSON.stringify(scenario)))); + console.log("MIN", minFloor); + if(minFloor == 3){ + console.log("SOLVED"); + } + scenarios = newScenarios; +} + +var i = 0; + +while(minFloor < 3){ + i++; + nextSetOfScenarios(); + console.log(scenarios.length); +} +console.log(i); diff --git a/day11/part1_new4_unopt.js b/day11/part1_new4_unopt.js new file mode 100644 index 0000000..33d299a --- /dev/null +++ b/day11/part1_new4_unopt.js @@ -0,0 +1,126 @@ +var initialFloors = []; +var initialLift = 0; +var minFloor = 0; +var _ = require("underscore"); +var combinatorics = require("js-combinatorics"); +var previous = []; + +var scenarios = [ + { + floors: initialFloors, + lift: initialLift + } +]; + +var input = require("fs").readFileSync("input.txt").toString().replace(/\r/g, ""); +input.split("\n").filter((a)=>(a)).forEach((line)=>{ + var floorNums = ["first", "second", "third", "fourth"]; + var lineParts = line.match(/The ([^ ]+) floor contains (.*)./); + var floorNum = floorNums.indexOf(lineParts[1]); + initialFloors[floorNum] = []; + var items = lineParts[2].replace("and ", ", ").split(", ").filter((a)=>(a)); + items.forEach((item)=>{ + if(item.indexOf("generator") != -1){ + var itemParts = item.match(/a ([^ ]+) generator/); + initialFloors[floorNum].push(["generator", itemParts[1]]) + } + else if(item.indexOf("microchip") != -1){ + var itemParts = item.match(/a ([^ ]+)-compatible microchip/); + initialFloors[floorNum].push(["microchip", itemParts[1]]) + } + }); +}); + +function checkFloors(floors){ + for(var floor of floors){ + if(floor.filter((a)=>(a[0] == "generator")).length > 0){ + for(var element of floor.filter((a)=>(a[0] == "microchip")).map((a)=>(a[1]))){ + if(floor.filter((a)=>(a[0] == "generator")).map((a)=>(a[1])).indexOf(element) == -1){ + return false; + } + } + } + } + return true; +} + +function getMinFloors(floors){ + return floors.map((a)=>(Boolean(a.length))).indexOf(true); +} + +function possibleScenarios(scenario){ + var newScenarios = [[], []]; + + var ids = scenario.floors[scenario.lift].map((a, i)=>(i)); + var arrangements = []; + if(ids.length >= 1){ + arrangements = arrangements.concat(combinatorics.combination(ids, 1).toArray()); + } + if(ids.length >= 2){ + arrangements = arrangements.concat(combinatorics.combination(ids, 2).toArray()); + } + arrangements.forEach((arrangement)=>{ + if(scenario.lift < 3){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios[0].push({lift: scenario.lift + 1, floors: floors}); + } + if((scenario.lift > minFloor)){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + var generator = (arrangement.map((a)=>(floors[scenario.lift][a][0])).indexOf("generator") > -1); + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + if(generator){ + newScenarios[1].push({lift: scenario.lift - 1, floors: floors}); + } + else{ + newScenarios[0].push({lift: scenario.lift - 1, floors: floors}); + } + } + }); + return newScenarios; +} + +function nextSetOfScenarios(){ + var newScenarios = []; + for(var scenario of scenarios){ + var possibleScenariosSet = possibleScenarios(scenario); + newScenariosSets[0] = newScenariosSets[0].concat(possibleScenariosSet[0]); + newScenariosSets[1] = newScenariosSets[1].concat(possibleScenariosSet[1]); + } + if(newScenariosSets[0].length > 0){ + var newScenarios = newScenariosSets[0]; + } + else{ + console.log("falling back"); + var newScenarios = newScenariosSets[1]; + } + newScenarios = newScenarios.filter((scenario)=>(checkFloors(scenario.floors))); + console.log("newLength", newScenarios.length); + minFloor = newScenarios.map((scenario)=>(getMinFloors(scenario.floors))).reduce((a, b)=>(Math.max(a, b))) + console.log("MIN", minFloor); + if(minFloor == 3){ + console.log("SOLVED"); + } + scenarios = newScenarios; +} + +var i = 0; + +while(minFloor < 3){ + i++; + nextSetOfScenarios(); + console.log(scenarios.length); +} +console.log(i); diff --git a/day11/part1_new5_unopt.js b/day11/part1_new5_unopt.js new file mode 100644 index 0000000..9170018 --- /dev/null +++ b/day11/part1_new5_unopt.js @@ -0,0 +1,116 @@ +var initialFloors = []; +var initialLift = 0; +var minFloor = 0; +var _ = require("underscore"); +var combinatorics = require("js-combinatorics"); +var previous = []; + +var scenarios = [ + { + floors: initialFloors, + lift: initialLift + } +]; + +var input = require("fs").readFileSync("input.txt").toString().replace(/\r/g, ""); +input.split("\n").filter((a)=>(a)).forEach((line)=>{ + var floorNums = ["first", "second", "third", "fourth"]; + var lineParts = line.match(/The ([^ ]+) floor contains (.*)./); + var floorNum = floorNums.indexOf(lineParts[1]); + initialFloors[floorNum] = []; + var items = lineParts[2].replace("and ", ", ").split(", ").filter((a)=>(a)); + items.forEach((item)=>{ + if(item.indexOf("generator") != -1){ + var itemParts = item.match(/a ([^ ]+) generator/); + initialFloors[floorNum].push(["generator", itemParts[1]]) + } + else if(item.indexOf("microchip") != -1){ + var itemParts = item.match(/a ([^ ]+)-compatible microchip/); + initialFloors[floorNum].push(["microchip", itemParts[1]]) + } + }); +}); + +function checkFloors(floors){ + for(var floor of floors){ + if(floor.filter((a)=>(a[0] == "generator")).length > 0){ + for(var element of floor.filter((a)=>(a[0] == "microchip")).map((a)=>(a[1]))){ + if(floor.filter((a)=>(a[0] == "generator")).map((a)=>(a[1])).indexOf(element) == -1){ + return false; + } + } + } + } + return true; +} + +function getMinFloors(floors){ + return floors.map((a)=>(Boolean(a.length))).indexOf(true); +} + +function possibleScenarios(scenario){ + var newScenarios = []; + + var ids = scenario.floors[scenario.lift].map((a, i)=>(i)); + var arrangements = []; + if(ids.length >= 1){ + arrangements = arrangements.concat(combinatorics.combination(ids, 1).toArray()); + } + if(ids.length >= 2){ + arrangements = arrangements.concat(combinatorics.combination(ids, 2).toArray()); + } + arrangements.forEach((arrangement)=>{ + if(scenario.lift < 3){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift + 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios.push({lift: scenario.lift + 1, floors: floors}); + } + if((scenario.lift > minFloor)){ + var floors = JSON.parse(JSON.stringify(scenario.floors)); + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[0]]); + delete floors[scenario.lift][arrangement[0]]; + if(arrangement.length == 2){ + floors[scenario.lift - 1].push(floors[scenario.lift][arrangement[1]]); + delete floors[scenario.lift][arrangement[1]]; + } + floors[scenario.lift] = floors[scenario.lift].filter((a)=>(a)); + newScenarios.push({lift: scenario.lift - 1, floors: floors}); + } + }); + return newScenarios; +} + +function nextSetOfScenarios(){ + var newScenarios = []; + for(var scenario of scenarios){ + newScenarios = newScenarios.concat(possibleScenarios(scenario)); + } + console.log("new incorr", newScenarios.length); + newScenarios = newScenarios.filter((scenario)=>(checkFloors(scenario.floors))); + console.log("new corr", newScenarios.length); + minFloor = newScenarios.map((scenario)=>(getMinFloors(scenario.floors))).reduce((a, b)=>(Math.max(a, b))); + newScenarios.forEach((scenario)=>{scenario.floors.forEach((a)=>(a.sort()));}) + newScenarios = newScenarios.filter((scenario)=>(previous.indexOf(JSON.stringify(scenario)) == -1)); + newScenarios.map((scenario)=>(previous.push(JSON.stringify(scenario)))); + console.log("MIN", minFloor); + if(minFloor == 3){ + console.log("SOLVED"); + } + scenarios = newScenarios; + //console.log(JSON.stringify(scenarios)); +} + +var i = 0; + +while(minFloor < 3){ + i++; + nextSetOfScenarios(); + console.log(scenarios.length); +} +console.log(i);