-
Notifications
You must be signed in to change notification settings - Fork 0
/
adventOfCode2020day5part2.linq
142 lines (114 loc) · 2.65 KB
/
adventOfCode2020day5part2.linq
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<Query Kind="Program" />
const char Front = 'F'; //lower half
const char Back = 'B'; // upper half
const char Left = 'L'; // lower half
const char Right = 'R'; // upper half
void Main()
{
var input = ReadMyFile(@"input5.txt");
var tickets = CreateTickets(input);
var highestTicketId = tickets.OrderByDescending(w => w.SeatId).ToList();
highestTicketId.First().Dump();
var missingId = FindMissingId(highestTicketId.OrderBy(w => w.SeatId).ToList());
missingId.Dump();
PassToSeatId("BBFBBBFLRR").Dump(); // it was just a fucking binary SeatId! WTF!
}
public int PassToSeatId(string pass)
{
pass = pass.Replace('F', '0').Replace('B', '1').Replace('L', '0').Replace('R', '1');
pass.Dump();
return Convert.ToInt32(pass, 2);
}
private int FindMissingId(List<Ticket> tickets)
{
var next = tickets.First().SeatId;
for (int i = 0; i < tickets.Count; i++)
{
if (tickets[i].SeatId != next)
{
return next;
}
next++;
}
return -1;
}
private List<Ticket> CreateTickets(List<string> inputs)
{
var list = new List<Ticket>();
foreach (var input in inputs)
{
var ticket = new Ticket(input);
list.Add(ticket);
}
return list;
}
class Ticket
{
public string Code { get; set; }
private List<int> Rows { get; set; }
private List<int> Columns { get; set; }
public int Row { get; set; }
public int Column { get; set; }
public int SeatId { get; set; }
public Ticket(string code)
{
Code = code;
Rows = new List<int>();
Columns = new List<int>();
for (int i = 0; i < 128; i++)
{
Rows.Add(i);
}
for (int i = 0; i < 8; i++)
{
Columns.Add(i);
}
foreach (var letter in Code)
{
ParseCode(letter);
}
}
public void ParseCode(char letter)
{
int breakPoint = 0;
if (letter == Front || letter == Back)
breakPoint = Rows[Rows.Count / 2];
else
breakPoint = Columns[Columns.Count / 2];
switch (letter)
{
case Front:
Rows = Rows.Where(w => w < breakPoint).ToList();
break;
case Back:
Rows = Rows.Where(w => w >= breakPoint).ToList();
break;
case Left:
Columns = Columns.Where(w => w < breakPoint).ToList();
break;
case Right:
Columns = Columns.Where(w => w >= breakPoint).ToList();
break;
}
if (Columns.Count == 1)
Column = Columns.FirstOrDefault();
if (Rows.Count == 1)
Row = Rows.FirstOrDefault();
CalculateSeatId();
}
private void CalculateSeatId(){
SeatId = Row * 8 + Column;
}
}
private List<string> ReadMyFile(string uri)
{
var newList = new List<string>();
string line;
System.IO.StreamReader reader = new StreamReader(uri);
while ((line = reader.ReadLine()) != null)
{
newList.Add(line);
}
return newList;
}
// Define other methods and classes here