diff --git a/2017/README.md b/2017/README.md index ec2e206..359c83f 100644 --- a/2017/README.md +++ b/2017/README.md @@ -4,7 +4,7 @@ Previously, I have been moderately successful in learning Rust and Python from doing these challegnes. For this year, I'm upping the ante and using 25 different programming languages. -The current plan, in no particular order: +These are the languages that I have used, in alphabetical order: - [x] AWK - [Day 04](./day-04/solution.awk) - [x] Bash/shell script - [Day 02](./day-02/solution.sh) @@ -23,14 +23,11 @@ The current plan, in no particular order: - [x] Lua - [Day 18](./day-18/solution.lua) - [x] Matlab - [Day 06](./day-06) - [x] Node.js - [Day 12](./day-12/solution.js) -- [ ] Objective C - [x] Perl - [Day 05](./day-05/solution.pl) - [x] PHP - [Day 19](./day-19/solution.php) -- [ ] Python +- [x] Python - [Day 25](./day-25/solution.py) - [x] R - [Day 20](./day-20/solution.r) - [x] Ruby - [Day 08](./day-08/solution.rb) - [x] Rust - [Day 14](./day-14/solution.rs) - [x] Scala - [Day 11](./day-11/solution.scala) - [x] Swift - [Day 17](./day-17/solution.swift) - -… and then I will be done! diff --git a/2017/day-25/input.txt b/2017/day-25/input.txt new file mode 100644 index 0000000..e2e4d56 --- /dev/null +++ b/2017/day-25/input.txt @@ -0,0 +1,62 @@ +Begin in state A. +Perform a diagnostic checksum after 12399302 steps. + +In state A: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state B. + If the current value is 1: + - Write the value 0. + - Move one slot to the right. + - Continue with state C. + +In state B: + If the current value is 0: + - Write the value 0. + - Move one slot to the left. + - Continue with state A. + If the current value is 1: + - Write the value 0. + - Move one slot to the right. + - Continue with state D. + +In state C: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state D. + If the current value is 1: + - Write the value 1. + - Move one slot to the right. + - Continue with state A. + +In state D: + If the current value is 0: + - Write the value 1. + - Move one slot to the left. + - Continue with state E. + If the current value is 1: + - Write the value 0. + - Move one slot to the left. + - Continue with state D. + +In state E: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state F. + If the current value is 1: + - Write the value 1. + - Move one slot to the left. + - Continue with state B. + +In state F: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state A. + If the current value is 1: + - Write the value 1. + - Move one slot to the right. + - Continue with state E. diff --git a/2017/day-25/solution.py b/2017/day-25/solution.py new file mode 100755 index 0000000..e75b29c --- /dev/null +++ b/2017/day-25/solution.py @@ -0,0 +1,56 @@ +#!/usr/bin/python +import fileinput +import re + +def read_action(it): + to_write = 1 if "1" in next(it) else 0 + offset = 1 if "right" in next(it) else -1 + goto = next(it).strip()[-2] + + return (to_write, offset, goto) + +def read_input(): + in_iter = fileinput.input() + + initial = next(in_iter).strip()[-2] + runs = int(next(in_iter).split(" ")[-2]) + states = {} + + for line in in_iter: + line = line.strip() + + if not line: + continue + + state = line[-2] + next(in_iter) + + if_0 = read_action(in_iter) + next(in_iter) + + if_1 = read_action(in_iter) + + states[state] = (if_0, if_1) + + return initial, runs, states + +state, steps, states = read_input() + +ones = set() +pos = 0 + +for _ in range(steps): + if pos in ones: + instr = states[state][1] + else: + instr = states[state][0] + + if instr[0] == 1: + ones.add(pos) + else: + ones.discard(pos) + + pos += instr[1] + state = instr[2] + +print(len(ones))