Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- using System.Text.RegularExpressions;
- namespace D4_2
- {
- class Program
- {
- // enum używany do maski bitowej, chodzi o to, żeby zamienić tekst na liczbę (cid = 0, pid = 1 itd.)
- enum FieldType
- {
- cid, pid, ecl, hcl, hgt, eyr, iyr, byr
- }
- static void Main()
- {
- var lines = System.IO.File.ReadAllLines(@"../../../input"); // wczytywanie pliki do tablicy stringów
- int validPassports = 0; // tu będziemy dodawać gdy znajdziemy poprawny paszport
- string regex = @"(.+?):(.+?)\s"; // regex do wyszukowania w postaci słowo:słowo[spacja], nawiasy tworzą grupy, dzięki czemu będzie łatwo podzielić znaleziony tekst na kilka stringów
- byte fields = 0b00000000; // pole bitowe gdzie każdy bit oznacza pole w paszporcie (pierwszy bit to byr, drugi to iyr itd.) (0 – nie ma pola, 1 – jest pole), 0b to przedrostek oznaczający liczbę binarną
- foreach (var line in lines) // iterujemy po każdej linijce tekstu
- {
- if (line == "") // jeśli linijka jest pusta to znaczy, że skończył się paszport, weryfikujemy go i przygotowujemy się fo szukania następnego
- {
- if ((fields | 1) == 255)
- validPassports++; // jeśli wszystkie bity są 1 to znaczy, że wszystko jest i paszport jest poprawny, stosujemy najpierw maskę OR (|) z 00000001, żeby ostatni bit zawsze był 1 (bo to cid i go ignorujemy)
- Console.WriteLine($"{Convert.ToString(fields,2).PadLeft(8,'0')} {validPassports}"); // wypisuje pole bitowe paszportu do konsoli (dla debugowania)
- fields = 0b00000000; // resetuje pole bitowe, żeby kolejny paszport był "czysty"
- continue;
- }
- string preparedLine = line + " ";
- var matches = Regex.Matches(preparedLine, regex); // szuka w linijce według stworzenego wcześniej regexu, najpierw na koniec do linijki dodajemy spację, bo środowisko ma problemy z wyszukiwaniem nowej linii (spacię jest łatwiej znaleźć)
- for (int i = 0; i < matches.Count; i++)
- {
- // tu się dzieje czarna magia, ale tak w skrócie sprawdzamy, które pole znaleźliśmy i weryfikujemy według ustalonych warunków
- FieldType fieldType = (FieldType) Enum.Parse(typeof(FieldType), matches[i].Groups[1].Value);
- bool valid = false;
- string value = matches[i].Groups[2].Value;
- switch (fieldType)
- {
- case FieldType.byr:
- valid = int.Parse(value) >= 1920 && int.Parse(value) <= 2002;
- break;
- case FieldType.iyr:
- valid = int.Parse(value) >= 2010 && int.Parse(value) <= 2020;
- break;
- case FieldType.eyr:
- valid = int.Parse(value) >= 2020 && int.Parse(value) <= 2030;
- break;
- case FieldType.hgt:
- valid = Regex.IsMatch(value, @"\d+cm") ? int.Parse(Regex.Match(value, @"\d+").Value) >= 150 && int.Parse(Regex.Match(value, @"\d+").Value) <= 193 : (Regex.IsMatch(value, @"\d+in") ? int.Parse(Regex.Match(value, @"\d+").Value) >= 59 && int.Parse(Regex.Match(value, @"\d+").Value) <= 76 : false);
- break;
- case FieldType.hcl:
- valid = value.Length == 7 && Regex.IsMatch(value, @"#[0-9a-f]+");
- break;
- case FieldType.ecl:
- valid = new[]{"amb", "blu", "brn", "gry", "grn", "hzl", "oth"}.Contains(value);
- break;
- case FieldType.pid:
- valid = value.Length == 9 && !Regex.IsMatch(value, @"\D");
- break;
- }
- if (valid)
- fields ^= (byte) (1 << (byte) fieldType); // jeśli warunek jest spełniony to ustawiamy odpowiedni bit na 1 (sztuczka z XORem i przusuwaniem bitów w masce)
- }
- }
- Console.WriteLine($"There are {validPassports} valid passports"); // wypisujemy ile jest ostatecznie poprawnych paszportów
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment