Add solution day 22

This commit is contained in:
monoid 2024-12-23 04:15:12 +09:00
parent 881a530b8c
commit f7a3f19b9b
5 changed files with 2568 additions and 0 deletions

4
day_22/example.txt Normal file
View File

@ -0,0 +1,4 @@
1
10
100
2024

4
day_22/example2.txt Normal file
View File

@ -0,0 +1,4 @@
1
2
3
2024

2452
day_22/input.txt Normal file

File diff suppressed because it is too large Load Diff

33
day_22/solve_1.ts Normal file
View File

@ -0,0 +1,33 @@
export function mix(a: bigint, b: bigint): bigint {
return a ^ b;
}
export function prune(a: bigint): bigint {
// return a % 16777216n; // 2^24
return a & 0xFFFFFFn;
}
export function generate(secret: bigint): bigint {
let r = secret;
r = mix(r, r << 6n); // multiply by 64
r = prune(r);
r = mix(r, r >> 5n); // shift right 5
r = prune(r);
r = mix(r, r << 11n);
r = prune(r);
return r;
}
export function advance(secret: bigint, n: number): bigint {
let r = secret;
for (let i = 0; i < n; i++) {
r = generate(r);
}
return r;
}
if (import.meta.main) {
const initialNumbers = (await Deno.readTextFile("input.txt")).replaceAll("\r","").split("\n").map(x => BigInt(parseInt(x)));
const sum = initialNumbers.map(x => (advance(x, 2000))).reduce((a, b) => a + b, 0n);
console.log(sum);
}

75
day_22/solve_2.ts Normal file
View File

@ -0,0 +1,75 @@
import { generate } from "./solve_1.ts";
/// 2000 개 이전 값에서 가장 많은 바나나를 얻을 수 있는 패턴 한개 찾기.
/// 초기 4개 값은 버려짐.
export type Pattern = [number, number, number, number];
export function patternToKey(p: Pattern): string {
return p.join(",");
}
function getPatternMap(
secret: bigint,
n: number
): Map<string, number> {
let r = secret;
const patternMap = new Map<string, number>();
let p = [Infinity, Infinity, Infinity, Number(r) % 10];
for (let i = 0; i < n; i++) {
r = generate(r);
const newValue = Number(r) % 10;
const diff = [
(p[1] - p[0] ),
(p[2] - p[1] ),
(p[3] - p[2] ),
(newValue - p[3] ),
] as Pattern;
// if NaN or Infinity, skip
if (diff.some(x => !Number.isFinite(x))) {
p = [p[1], p[2], p[3], newValue];
continue;
}
const key = patternToKey(diff);
if (!patternMap.has(key)) {
patternMap.set(patternToKey(diff), newValue);
}
p = [p[1], p[2], p[3], newValue];
}
return patternMap;
}
if (import.meta.main) {
const initialNumbers = (await Deno.readTextFile("input.txt")).replaceAll("\r","").split("\n").map(x => BigInt(parseInt(x)));
const resultMap = new Map<string, number>();
const mapArr = initialNumbers.map(x => {
const map = getPatternMap(x, 2000);
return map;
});
mapArr.forEach(map => {
map.forEach((v, k) => {
const x = resultMap.get(k) ?? 0;
resultMap.set(k, x + v);
});
});
const reversedMap = new Map<number, string[]>();
resultMap.forEach((v, k) => {
const x = reversedMap.get(v) ?? [];
x.push(k);
reversedMap.set(v,x)
});
const keys = [...reversedMap.keys()];
keys.sort((a,b)=> b-a);
const maximum = keys[0];
console.log("max:", maximum);
const p = reversedMap.get(maximum)!;
const pk = p[0]
console.log("pattern:", p);
// mapArr.forEach(mp => {
// const p = mp.get(pk);
// console.log(p);
// })
}