88 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import * as fs from "fs";
 | 
						|
 | 
						|
class File {
 | 
						|
	constructor(line) {
 | 
						|
		this.length = line.length;
 | 
						|
		this.data = line.map(v => ({value: v})); // index in data
 | 
						|
		this.data[0].left = this.data[this.length-1];
 | 
						|
		this.data[0].right = this.data[1];
 | 
						|
		this.data[this.length-1].left = this.data[this.length-2];
 | 
						|
		this.data[this.length-1].right = this.data[0];
 | 
						|
		for (let i=1; i<this.length-1; ++i) {
 | 
						|
			this.data[i].left = this.data[i-1];
 | 
						|
			this.data[i].right = this.data[i+1];
 | 
						|
		}
 | 
						|
		this.data.forEach(v => { if (v.value === 0) this.head = v; });
 | 
						|
	}
 | 
						|
	get(i) {
 | 
						|
		let it = this.head;
 | 
						|
		for (let offset = i % this.length; offset > 0; --offset) {
 | 
						|
			it = it.right;
 | 
						|
		}
 | 
						|
		return it.value;
 | 
						|
	}
 | 
						|
	mix() {
 | 
						|
		this.data.forEach(v => {
 | 
						|
			if (v.value !== 0) {
 | 
						|
				let it = v;
 | 
						|
				let offset; // javascript and modulo... what a nightmare!
 | 
						|
				if (v.value > 0) offset = v.value % (this.length - 1);
 | 
						|
				if (v.value < 0) offset = ((v.value * -1) % (this.length - 1)) * -1;
 | 
						|
				if (offset !==0) {
 | 
						|
					v.right.left = v.left;
 | 
						|
					v.left.right = v.right;
 | 
						|
					if (offset < 0) {
 | 
						|
						for (; offset < 0; ++offset) {
 | 
						|
							it = it.left;
 | 
						|
						}
 | 
						|
						v.right = it;
 | 
						|
						v.left = it.left;
 | 
						|
						v.left.right = v;
 | 
						|
						v.right.left = v;
 | 
						|
					} else {
 | 
						|
						for (; offset > 0; --offset) {
 | 
						|
							it = it.right;
 | 
						|
						}
 | 
						|
						v.right = it.right;
 | 
						|
						v.left = it;
 | 
						|
						v.left.right = v;
 | 
						|
						v.right.left = v;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		});
 | 
						|
	}
 | 
						|
	print() {
 | 
						|
		let it = this.head;
 | 
						|
		for (let offset = this.length; offset > 0; --offset) {
 | 
						|
			console.log(it.value);
 | 
						|
			it = it.right;
 | 
						|
		}
 | 
						|
		console.log("---");
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function load(filename) {
 | 
						|
	return new File(
 | 
						|
		fs.readFileSync(filename, "utf8")
 | 
						|
			.trim()
 | 
						|
			.split("\n")
 | 
						|
			.map(line => parseInt(line))
 | 
						|
	);
 | 
						|
}
 | 
						|
 | 
						|
let example = load("example");
 | 
						|
let input = load("input");
 | 
						|
 | 
						|
function solve(input) {
 | 
						|
	input.mix();
 | 
						|
	return input.get(1000) + input.get(2000) + input.get(3000);
 | 
						|
}
 | 
						|
 | 
						|
const exampleOutput = solve(example);
 | 
						|
if (exampleOutput !== 3) {
 | 
						|
	console.log("Example failed with " + exampleOutput);
 | 
						|
	process.exit(1); // eslint-disable-line
 | 
						|
}
 | 
						|
 | 
						|
console.log(solve(input));
 |