188 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| // title:  game title
 | |
| // author: game developer
 | |
| // desc:   short description
 | |
| // script: js
 | |
| 
 | |
| /// <reference path="./input.ts"/>
 | |
| 
 | |
| // Maps are [dest source range]
 | |
| const input = exampleInput;
 | |
| 
 | |
| let seeds = input[0].split(" ").map((o) => Number(o));
 | |
| seeds.shift();
 | |
| const seedsPairs: [number, number][] = [];
 | |
| for (let i = 0; i < seeds.length; i += 2) {
 | |
|   seedsPairs.push([seeds[i], seeds[i + 1]]);
 | |
| }
 | |
| trace(JSON.stringify(seedsPairs));
 | |
| 
 | |
| let seedToSoil: number[][] = [];
 | |
| let soilToFertilizer: number[][] = [];
 | |
| let fertilizerToWater: number[][] = [];
 | |
| let waterToLight: number[][] = [];
 | |
| let lightToTemp: number[][] = [];
 | |
| let tempToHumidity: number[][] = [];
 | |
| let humidityToLocation: number[][] = [];
 | |
| 
 | |
| let curr = seedToSoil;
 | |
| 
 | |
| // Roughly save input values
 | |
| for (const line of input) {
 | |
|   if (line === "seed-to-soil map:") {
 | |
|     curr = seedToSoil;
 | |
|   }
 | |
|   if (line === "soil-to-fertilizer map:") {
 | |
|     curr = soilToFertilizer;
 | |
|   }
 | |
|   if (line === "fertilizer-to-water map:") {
 | |
|     curr = fertilizerToWater;
 | |
|   }
 | |
|   if (line === "water-to-light map:") {
 | |
|     curr = waterToLight;
 | |
|   }
 | |
|   if (line === "light-to-temperature map:") {
 | |
|     curr = lightToTemp;
 | |
|   }
 | |
|   if (line === "temperature-to-humidity map:") {
 | |
|     curr = tempToHumidity;
 | |
|   }
 | |
|   if (line === "humidity-to-location map:") {
 | |
|     curr = humidityToLocation;
 | |
|   }
 | |
|   curr.push(line.split(" ").map((o) => Number(o)));
 | |
| }
 | |
| 
 | |
| // Clean and sort the maps
 | |
| 
 | |
| for (const map of [
 | |
|   seedToSoil,
 | |
|   soilToFertilizer,
 | |
|   fertilizerToWater,
 | |
|   waterToLight,
 | |
|   lightToTemp,
 | |
|   tempToHumidity,
 | |
|   humidityToLocation,
 | |
| ]) {
 | |
|   map.shift();
 | |
| }
 | |
| 
 | |
| function cleanInput(o: number[]): boolean {
 | |
|   return o.length === 3;
 | |
| }
 | |
| function orderBySource(a: number[], b: number[]): number {
 | |
|   return a[1] - b[1];
 | |
| }
 | |
| 
 | |
| seedToSoil = seedToSoil.filter(cleanInput);
 | |
| soilToFertilizer = soilToFertilizer.filter(cleanInput).sort(orderBySource);
 | |
| fertilizerToWater = fertilizerToWater.filter(cleanInput);
 | |
| waterToLight = waterToLight.filter(cleanInput);
 | |
| lightToTemp = lightToTemp.filter(cleanInput);
 | |
| tempToHumidity = tempToHumidity.filter(cleanInput);
 | |
| humidityToLocation = humidityToLocation.filter(cleanInput);
 | |
| 
 | |
| /**
 | |
|  * Given a source input and a sorted list of maps, calculate the destination value
 | |
|  * @param input
 | |
|  * @param maps
 | |
|  * @returns
 | |
|  */
 | |
| function getMapResult(input: number, maps: number[][]): number {
 | |
|   // Get the map corresponding to number
 | |
|   let mapped = -1;
 | |
|   for (const map of maps) {
 | |
|     const sourceFrom = map[1];
 | |
|     const sourceTo = map[1] + map[2] - 1;
 | |
|     if (input >= sourceFrom && input <= sourceTo) {
 | |
|       mapped = map[0] + input - sourceFrom;
 | |
|     }
 | |
|   }
 | |
|   if (mapped > -1) return mapped;
 | |
|   return input;
 | |
| }
 | |
| 
 | |
| let minimalLocation = Number.MAX_VALUE;
 | |
| 
 | |
| for (const pair of seedsPairs) {
 | |
|   trace(JSON.stringify(pair));
 | |
|   const to = pair[0] + pair[1] - 1;
 | |
|   for (let seed = pair[0]; seed < to; seed++) {
 | |
|     const soil = getMapResult(seed, seedToSoil);
 | |
|     const fert = getMapResult(soil, soilToFertilizer);
 | |
|     const water = getMapResult(fert, fertilizerToWater);
 | |
|     const light = getMapResult(water, waterToLight);
 | |
|     const temp = getMapResult(light, lightToTemp);
 | |
|     const hum = getMapResult(temp, tempToHumidity);
 | |
|     const loc = getMapResult(hum, humidityToLocation);
 | |
|     if (loc < minimalLocation) minimalLocation = loc;
 | |
|   }
 | |
| }
 | |
| 
 | |
| trace(minimalLocation);
 | |
| 
 | |
| // VISUALIZATION
 | |
| trace("VISUALIZATION");
 | |
| const steps = [
 | |
|   { name: "Seeds", map: seedToSoil },
 | |
|   { name: "Soil", map: soilToFertilizer },
 | |
|   { name: "Fertilizer", map: fertilizerToWater },
 | |
|   { name: "Water", map: waterToLight },
 | |
|   { name: "Light", map: lightToTemp },
 | |
|   { name: "Temperature", map: tempToHumidity },
 | |
|   { name: "Humidity", map: humidityToLocation },
 | |
|   { name: "Location", map: [[0, 0, 0]] },
 | |
| ];
 | |
| 
 | |
| const seed = {
 | |
|   index: 0,
 | |
|   step: 0,
 | |
|   value: seeds[0],
 | |
| };
 | |
| 
 | |
| const x = 100;
 | |
| const speed = 10;
 | |
| let frames = 1;
 | |
| 
 | |
| cls();
 | |
| function TIC() {
 | |
|   ++frames;
 | |
|   const offset = 15;
 | |
|   const lineLen = 100;
 | |
|   let y = 1;
 | |
| 
 | |
|   if (frames % speed === 0) {
 | |
|     seed.value = getMapResult(seed.value, steps[seed.step].map);
 | |
|     ++seed.step;
 | |
|     if (seed.step >= steps.length) {
 | |
|       seed.step = 0;
 | |
|       if (++seed.index >= seeds.length) {
 | |
|         seed.index = 0;
 | |
|       }
 | |
|       seed.value = seeds[seed.index];
 | |
|     }
 | |
| 
 | |
|     for (let x=0;x<240;++x) {
 | |
|       for (let y=0;y<136;++y) {
 | |
|         const c = pix(x, y)
 | |
|         if (c >= 12) {
 | |
|           pix(x, y, c+1);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   rect(200, 0, 50, 136, 0)
 | |
| 
 | |
|   for (const [i, step] of steps.entries()) {
 | |
|     print(step.name, 1, y, i + 2);
 | |
|     line(100, y + 2, x + lineLen, y + 2, i + 2);
 | |
|     y += offset;
 | |
|   }
 | |
| 
 | |
| 
 | |
| 
 | |
|   const yOffset = ((frames % speed) / speed) * 12;
 | |
|   circ(seed.value + x, seed.step * offset + 2 + yOffset, 2, 12);
 | |
|   print(seed.value, x + lineLen + 5, seed.step * offset + yOffset, 12);
 | |
| }
 |