-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path4-2.linq
59 lines (55 loc) · 1.78 KB
/
4-2.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
<Query Kind="Program" />
void Main()
{
Directory.SetCurrentDirectory(Path.GetDirectoryName(Util.CurrentQueryPath));
string[] inputLines = File.ReadAllLines("4.txt");
List<string> validRooms = new List<string>();
foreach (var inputLine in inputLines)
{
Dictionary<char, int> occurences = new Dictionary<char, int>();
int i = 0;
while (!char.IsNumber(inputLine[i]))
{
if (char.IsLetter(inputLine[i]))
{
char c = inputLine[i];
if (occurences.ContainsKey(c)) occurences[c] = occurences[c] + 1;
else occurences.Add(c, 1);
}
i++;
}
string sectorId = "";
while (char.IsNumber(inputLine[i]))
{
sectorId += inputLine[i];
i++;
}
string checksum = inputLine.Substring(i + 1, 5);
string actualChecksum = new string(occurences.OrderByDescending(o => o.Value).ThenBy(o => o.Key).Select(o => o.Key).Take(5).ToArray());
if (checksum == actualChecksum)
{
validRooms.Add(inputLine.Substring(0, i));
}
}
foreach (var room in validRooms)
{
StringBuilder decryptedRoomBuilder = new StringBuilder();
int sectorId = int.Parse(room.Substring(room.Length - 3, 3));
for (int i = 0; i < room.Length - 4; i++)
{
if (room[i] == '-') decryptedRoomBuilder.Append(' ');
else decryptedRoomBuilder.Append(Rotate(room[i], sectorId));
}
string decryptedRoom = decryptedRoomBuilder.ToString();
if (decryptedRoom.Contains("pole")) sectorId.Dump();
}
}
char Rotate(char c, int num)
{
for (int i = 1; i <= num; i++)
{
if (c == 'z') c = 'a';
else c++;
}
return c;
}