44 lines
1.0 KiB
TypeScript
44 lines
1.0 KiB
TypeScript
const input = Deno.readTextFileSync('./input.txt').split('\n');
|
|
|
|
type OP = 'A' | 'B' | 'C';
|
|
type ME = 'X' | 'Y' | 'Z';
|
|
type RPC = 0 | 1 | 2;
|
|
|
|
const signVal: Record<OP | ME, RPC> = {
|
|
A: 0,
|
|
X: 0,
|
|
B: 1,
|
|
Y: 1,
|
|
C: 2,
|
|
Z: 2,
|
|
};
|
|
|
|
function rpcPlay(op: RPC, me: RPC): number {
|
|
if (op === me) return me + 4;
|
|
if (me - op === 1 || me - op === -2) return me + 7;
|
|
return me + 1;
|
|
}
|
|
|
|
function getSign(op: RPC, winType: ME): RPC {
|
|
if (winType === 'Y') return op;
|
|
if (winType === 'X') return ((op + 2) % 3) as RPC;
|
|
return ((op + 1) % 3) as RPC;
|
|
}
|
|
|
|
function calcScore(firstPuzzle = true): number {
|
|
let myScore = 0;
|
|
for (const line of input) {
|
|
if (line === '') continue;
|
|
const [op, me] = line.split(' ') as [OP, ME];
|
|
if (firstPuzzle) myScore += rpcPlay(signVal[op], signVal[me]);
|
|
else {
|
|
const ops = signVal[op];
|
|
myScore += rpcPlay(ops, getSign(ops, me));
|
|
}
|
|
}
|
|
return myScore;
|
|
}
|
|
|
|
console.log('Solution first Puzzle:\t', calcScore());
|
|
console.log('Solution second Puzzle:\t', calcScore(false));
|