-
Notifications
You must be signed in to change notification settings - Fork 0
/
d12.1.csx
64 lines (60 loc) · 1.79 KB
/
d12.1.csx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.IO;
struct Point {
public int X { get; set;}
public int Y { get; set; }
public Point(int x, int y){
X = x; Y = y;
}
}
class ShipStatus {
char[] directions = new char[]{'N', 'E', 'S', 'W'};
public char Direction { get; set; }
private Point _point;
public ShipStatus(char direction, int x, int y)
{
Direction = direction;
_point = new Point(x,y);
}
public ShipStatus SetDirection(int scale)
{
int index = Array.IndexOf(directions, Direction);
Direction = directions[(index+scale+4)%4];
return this;
}
public ShipStatus MoveX(int x)
{
_point.X += x;
return this;
}
public ShipStatus MoveY(int y)
{
_point.Y += y;
return this;
}
public override string ToString()
{
return $"To the {Direction} : {_point.X}, {_point.Y}";
}
public int GetResult() =>
Math.Abs(_point.X)+Math.Abs(_point.Y);
}
ShipStatus ChangeStatus(char direction, int scale, ShipStatus status) => direction switch {
'E' => status.MoveX(1*scale),
'W' => status.MoveX(-1*scale),
'N' => status.MoveY(1*scale),
'S' => status.MoveY(-1*scale),
'F' => ChangeStatus(status.Direction, scale, status),
'L' => status.SetDirection(-scale/90),
'R' => status.SetDirection(scale/90),
_ => throw new ArgumentException()
};
var str = new StreamReader("d12.txt");
ShipStatus status = new ShipStatus('E', 0, 0);
while(!str.EndOfStream){
(char c, int i) = Parse(str.ReadLine());
ChangeStatus(c, i, status);
//Console.WriteLine(status.ToString());
}
Console.WriteLine(status.GetResult());
(char, int) Parse(string str) => (str[0], int.Parse(str.Substring(1)));