Last active
December 4, 2016 18:55
-
-
Save gingemonster/2f15affee1dd5808012d85a96fff07d5 to your computer and use it in GitHub Desktop.
Adventofcode Day 2 - Challenge 2
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
/* | |
The document goes on to explain that each button to be pressed can be found by starting on the previous button | |
and moving to adjacent buttons on the keypad: U moves up, D moves down, L moves left, and R moves right. | |
Each line of instructions corresponds to one button, starting at the previous button | |
(or, for the first line, the "5" button); press whatever button you're on at the end of each line. | |
If a move doesn't lead to a button, ignore it. | |
*/ | |
using System; | |
using System.Collections.Generic; | |
namespace ConsoleApplication | |
{ | |
public class Program | |
{ | |
private static string keyinstructions = @"LRULLRLDUUUDUDDDRLUDRDLDDLUUDLDDLRDRLDRLLURRULURLDRLDUDURLURRULLDDDUDDRRRDLRRDDLDURDULLRDLLLDRDLLDULDUDLLDLDRUDLLDLDDRRRDRLUDRDDLUDRRDUDUDLLDDUUDLRDUDRRUDUDRULRULUDRUUDLDLULLRLDLDDRULLRLLLULUULDURURLUUULDURLDDDURRUUDURDDDULDLURLRDRURDRUDRLLDLDRUURLLLRDRURUDLRLUDULLDDURLRURDLRDUUURRLULRRLDDULUUURLRRRLLLLLURDDRUULUDRRRUDDLLULRRUULDRDDULRLDDDRRUULUDRLRUDURUUULDLDULUUDURLLLRRDDRDLURDDDLDDDLRDRLDDURLRLLRUDRRLLDDDDDURDURRDDULDULLRULDRUURDRRDUDDUDDDDRRDULDUURDRUDRLDULRULURLLRRDRDRDLUUDRRLRLDULDDLUUUUUURRLRRRULLDDDRLRDRRRRRRRDUUDLLUDURUDDLURRUDL | |
UDUUURRLRLLDDRRDRRRLDDDLURURLLUDDRLUUDRRRDURRLLRURDLLRRDUUDDDDRDRURRLLLLURDLRRRULLLDLLLUDDLDRRRDLDUUDDRDUDDUURDDLULULDURDURDRUULURURRURDUURUDRRUDRLLLLRRDLLDRDDRLLURDDDUDUDUDRUURDDRUURDLRUUDDRDUURUDDLLUURDLUDRUUDRRDLLUUURDULUULDUUDLLULUUDLUDRUUDUUURLDDDRLRURDDULLRDRULULUDLUUDDDUUDLDUUDRULLDUURDDRUDURULDRDDLRUULRRRDLDLRDULRDDRLLRRLURDLDRUDLRLUDLRLDLDURRUULRLUURDULDRRULLRULRDLLDLDUDRUDDUDLDDURDDDRDLUDRULRUULLRURLDDDRDLRRDRULURULDULRDLDULDURDRDRDRDURDRLUURLRDDLDDRLDDRURLLLURURDULDUDDLLUURDUUUDRUDDRDLDRLRLDURRULDULUUDDLRULDLRRRRDLLDRUUDRLLDLUDUULRDRDLRUUDLRRDDLUULDUULRUDRURLDDDURLRRULURR | |
LDURLLLRLLLUURLLULDLRLLDLURULRULRDUDLDDUDRLRRDLULLDDULUUULDRLDURURLURLDLRUDULLLULDUURLLRDLUULRULLLULRDRULUDLUUULDDURLUDDUDDRDLDRDRUDLUURDDLULDUULURLUULRDRDLURUDRUDLDRLUUUUULUDUDRRURUDRULDLDRDRLRURUUDRDLULLUDLLRUUDUUDUDLLRRRLDUDDDRDUDLDLLULRDURULLLUDLLRUDDUUDRLDUULLDLUUDUULURURLLULDUULLDLUDUURLURDLUULRRLLRUDRDLLLRRRLDDLUULUURLLDRDLUUULLDUDLLLLURDULLRUDUUULLDLRLDRLLULDUDUDRULLRRLULURUURLRLURRLRRRDDRLUDULURUDRRDLUDDRRDRUDRUDLDDRLRDRRLDDRLLDDDULDLRLDURRRRRULRULLUUULUUUDRRDRDRLLURRRRUULUDDUDDDLDURDRLDLLLLLRDUDLRDRUULU | |
URURRUUULLLLUURDULULLDLLULRUURRDRRLUULRDDRUDRRDUURDUDRUDDRUULURULDRLDRDDDLDLRLUDDRURULRLRLLLDLRRUDLLLLRLULDLUUDUUDRDLRRULLRDRLRLUUDDRRLLDDRULLLRLLURDLRRRRRLLDDRRDLDULDULLDLULLURURRLULRLRLLLLURDDRDDDUUDRRRDUUDDLRDLDRRLLRURUDUUUDLDUULLLRLURULRULRDRLLLDLDLRDRDLLLRUURDDUDDLULRULDLRULUURLLLRRLLLLLLRUURRLULRUUUDLDUDLLRRDDRUUUURRRDRRDULRDUUDULRRRDUUUUURRDUURRRRLDUDDRURULDDURDDRDLLLRDDURUDLLRURLRRRUDDLULULDUULURLUULRDLRDUDDRUULLLRURLDLRRLUDLULDRLUDDDRURUULLDLRLLLDULUDDRLRULURLRDRRDDLDLURUDDUUURRDDLUDDRDUULRRDLDRLLLULLRULRURULRLULULRDUD | |
RUDLLUDRRDRRLRURRULRLRDUDLRRLRDDUDRDLRRLLRURRDDLRLLRRURULRUULDUDUULDULDLRLRDLRDLRUURLDRLUDRRDDDRDRRRDDLLLRRLULLRRDDUDULRDRDUURLDLRULULUDLLDRUDUURRUDLLRDRLRRUUUDLDUDRRULLDURRDUDDLRURDLDRLULDDURRLULLRDDDRLURLULDLRUDLURDURRUDULDUUDLLLDDDUUURRRDLLDURRDLULRULULLRDURULLURDRLLRUUDDRRUDRDRRRURUUDLDDRLDRURULDDLLULULURDLDLDULLRLRDLLUUDDUDUDDDDRURLUDUDDDRRUDDLUDULLRDLDLURDDUURDLRLUUDRRULLRDLDDDLDULDUDRDUUULULDULUDLULRLRUULLDURLDULDRDLLDULLLULRLRD"; | |
public static void Main(string[] args) | |
{ | |
var keypad = new string[,]{ | |
{"","","1","",""}, | |
{"","2","3","4",""}, | |
{"5","6","7","8","9"}, | |
{"","A","B","C",""}, | |
{"","","D","",""}, | |
}; | |
var currentPosition = new int[]{1,1}; | |
var buttonPresses = new List<string>(); | |
foreach (var line in keyinstructions.Split(new string[] { Environment.NewLine }, StringSplitOptions.None)) | |
{ | |
var passingThroughPosition = new [] { currentPosition[0], currentPosition[1] }; | |
foreach(var instruction in line){ | |
passingThroughPosition = CalculateMove(instruction, keypad, passingThroughPosition); | |
} | |
// take last passingThroughPosition as the final button on this line of instructions | |
currentPosition = passingThroughPosition; | |
// record for use later | |
buttonPresses.Add(IdentifyButtonFromPosition(currentPosition, keypad)); | |
} | |
// write out instructions | |
Console.WriteLine(String.Join(", ", buttonPresses.ToArray())); | |
} | |
private static string IdentifyButtonFromPosition(int[] position, string[,] keypad){ | |
return keypad[position[0], position[1]]; | |
} | |
private static int[] CalculateMove(char instruction, string[,] keypad, int[] currentPosition){ | |
var newPosition = new [] { currentPosition[0], currentPosition[1] }; | |
switch (instruction.ToString()) | |
{ | |
case "U": | |
newPosition[0] = newPosition[0] - 1; | |
break; | |
case "D": | |
newPosition[0] = newPosition[0] + 1; | |
break; | |
case "L": | |
newPosition[1] = newPosition[1] - 1; | |
break; | |
case "R": | |
newPosition[1] = newPosition[1] + 1; | |
break; | |
default: | |
break; | |
} | |
if(IsValidPosition(newPosition, keypad)){ | |
return newPosition; | |
} | |
return currentPosition; | |
} | |
private static bool IsValidPosition(int[] newPosition, string[,] keypad){ | |
if(newPosition[0] < 0 || newPosition[1] < 0) return false; | |
if(newPosition[0] >= keypad.GetLength(0)) return false; | |
if(newPosition[1] >= keypad.GetLength(1)) return false; | |
if(IdentifyButtonFromPosition(newPosition,keypad).Length==0) return false; | |
return true; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment