Added other version
This commit is contained in:
		
							
								
								
									
										148
									
								
								day11/parallel_rewrite2.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								day11/parallel_rewrite2.js
									
									
									
									
									
										Normal file
									
								
							@@ -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");
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
		Reference in New Issue
	
	Block a user