Last active
December 16, 2017 06:56
-
-
Save snarkbait/ab84b23c40d565c2b1b8c589bbdf7aca to your computer and use it in GitHub Desktop.
Advent of Code 2017 - Day 16
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package Advent2017; | |
import util.AdventOfCode; | |
import util.FileIO; | |
import java.util.*; | |
import java.util.function.Consumer; | |
public class Day16 extends AdventOfCode { | |
private String[] data; | |
private char[] array; | |
private List<String> seen; | |
private final Map<Character, Consumer<String>> commands = new HashMap<>(); | |
public Day16(List<String> input) { | |
super(input); | |
commands.put('s', this::spin); | |
commands.put('x', this::exchange); | |
commands.put('p', this::partner); | |
} | |
public void move(String command) { | |
commands.get(command.charAt(0)).accept(command.substring(1)); | |
} | |
private void dance() { | |
Arrays.stream(data) | |
.forEach(this::move); | |
} | |
private void exchange(String s) { | |
String[] nums = s.split("/"); | |
exchange(Integer.parseInt(nums[0]), Integer.parseInt(nums[1])); | |
} | |
private void exchange(int a, int b) { | |
char temp = array[a]; | |
array[a] = array[b]; | |
array[b] = temp; | |
} | |
private void partner(String s) { | |
int i = 0; | |
int j = 0; | |
for (int k = 0; k < array.length; k++) { | |
if (array[k] == s.charAt(0)) i = k; | |
if (array[k] == s.charAt(2)) j = k; | |
} | |
exchange(i, j); | |
} | |
private void spin(String s) { | |
int x = Integer.parseInt(s); | |
for (int i = 0; i < x; i++) { | |
char temp = array[array.length - 1]; | |
System.arraycopy(array, 0, array, 1, array.length - 1); | |
array[0] = temp; | |
} | |
} | |
@Override | |
public String part1() { | |
dance(); | |
return new String(array); | |
} | |
@Override | |
public Object part2() { | |
reset(); | |
int iterations = 1000000000; | |
for (int i = 0; i < iterations; i++) { | |
String s = new String(array); | |
if (seen.contains(s)) { | |
//found first cycle | |
return seen.get(iterations % i); | |
} | |
seen.add(s); | |
dance(); | |
} | |
return null; | |
} | |
@Override | |
public void parse() { | |
reset(); | |
data = input.get(0).split(","); | |
seen = new ArrayList<>(); | |
} | |
private void reset() { | |
array = "abcdefghijklmnop".toCharArray(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment