From 2672c3e3d6d997e14215f516e27fa9b47c439dd0 Mon Sep 17 00:00:00 2001 From: Tim Stallard Date: Tue, 13 Dec 2016 23:23:30 +0000 Subject: [PATCH] Added other version --- day11/parallel_rewrite2.js | 148 +++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 day11/parallel_rewrite2.js diff --git a/day11/parallel_rewrite2.js b/day11/parallel_rewrite2.js new file mode 100644 index 0000000..0ae5106 --- /dev/null +++ b/day11/parallel_rewrite2.js @@ -0,0 +1,148 @@ +var initialFloors = []; +var initialLift = 0; +var minFloor = 0; +var _ = require("underscore"); +var previous = []; +var Parallel = require("paralleljs"); + +var scenarios = [ + { + floors: initialFloors, + lift: initialLift + } +]; + +var input = require("fs").readFileSync("input_2.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 combinatorics = require("js-combinatorics"); + + 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 > 0)){ + 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(scenarios, callback){ + var p = new Parallel(scenarios); + + merge = ([a, b])=>(a.concat(b)); + forceMerge = (data)=>((data.length == 1) ? (data[0]) : (data)); + checkScenarioFloors = (scenario) + + p.map(possibleScenarios).reduce(merge).spawn(forceMerge).then(callback); + + /* + for(var scenario of scenarios){ + newScenarios = newScenarios.concat(possibleScenarios(scenario)); + } + + console.log("removing invalid"); + newScenarios = newScenarios.filter((scenario)=>(checkFloors(scenario.floors))); + console.log("newLength", newScenarios.length); + console.log("calc min"); + localMinFloor = newScenarios.map((scenario)=>(getMinFloors(scenario.floors))).reduce((a, b)=>(Math.max(a, b))) + console.log("sorting"); + newScenarios.forEach((scenario)=>{scenario.floors.forEach((a)=>(a.sort()));}) + console.log("to JSON"); + newScenarios = newScenarios.map((scenario)=>(JSON.stringify(scenario))); + console.log("dedupe"); + newScenarios = _.uniq(newScenarios, (scenario)=>(JSON.stringify(scenario))); + console.log("removing previous"); + newScenarios = _.difference(newScenarios, previous); + console.log("adding to previous"); + newScenarios.forEach((scenario)=>(previous.push(scenario))); + console.log("from JSON"); + newScenarios = newScenarios.map((scenario)=>(JSON.parse(scenario))); + + console.log("MIN", localMinFloor); + if(localMinFloor == 3){ + console.log("SOLVED"); + } + scenarios = newScenarios; + */ +} +/* +var i = 0; + +while(minFloor < 3){ + i++; + nextSetOfScenarios(); + console.log("it", i); + console.log(scenarios.length); +} +console.log(i); +*/ +nextSetOfScenarios(scenarios, (possibilities)=>{ + //console.log(possibilities); + nextSetOfScenarios(possibilities, (possibilities)=>{ + //console.log(JSON.stringify(possibilities)); + nextSetOfScenarios(possibilities, (possibilities)=>{ + console.log("three"); + }); + }); +});