🌟 Advent of Code (AoC) 2020 🌟

PermalÀnk
Medlem ★
●

Dag: 4
SprÄk: Javascript.

FortsÀtter pÄ temat C i Javascript. Dagens övning var inte svÄr men en aning omstÀndig. Hade nog egentligen föredragit en aning mer komplicerade, men kortare, övningar. Typ https://www.codewars.com/. FortsÀtter det sÄhÀr lÀr snart uppgifterna ta lite mer tid Àn jag har möjlighet att lÀgga, tyvÀrr.

Vore vÀldigt intressant att se koden frÄn de som löst den hÀr uppgiften pÄ sex minuter...

(function () { startCode(); function startCode() { fetchInput(); } async function fetchInput() { var response = await fetch('input.txt'); var text = await response.text(); calculatePartOne(text); calculatePartTwo(text); } function containsKey(passport, key) { for (var i = 0; i < passport.length; i++) { if (passport[i].startsWith(key)) { return true; } } return false; } function containsValidKey(passport, key) { for (var i = 0; i < passport.length; i++) { if (passport[i].startsWith(key)) { var data = passport[i].split(":"); if (key == "byr:" && parseInt(data[1]) >= 1920 && parseInt(data[1]) <= 2002) { return true; } else if (key == "iyr:" && parseInt(data[1]) >= 2010 && parseInt(data[1]) <= 2020) { return true; } else if (key == "eyr:" && parseInt(data[1]) >= 2020 && parseInt(data[1]) <= 2030) { return true; } else if (key == "hgt:") { var number = data[1].substring(0, data[1].length - 2); var unit = data[1].substring(data[1].length - 2); if (unit == "cm") { if (parseInt(number) >= 150 && parseInt(number) <= 193) { return true; } } else if (unit == "in") { if (parseInt(number) >= 59 && parseInt(number) <= 76) { return true; } } } else if (key == "hcl:") { var regex = /^#[0-9a-f]{6}$/g; if (regex.test(data[1])) { return true; } } else if (key == "ecl:" && (data[1] == "amb" || data[1] == "blu" || data[1] == "brn" || data[1] == "gry" || data[1] == "grn" || data[1] == "hzl" || data[1] == "oth")) { return true; } else if (key == "pid:") { var regex = /^[0-9]{9}$/g; if (regex.test(data[1])) { return true; } } } } return false; } function calculatePartOne(text) { var sequence = text.split('\n\n'); var passport = []; var okPassports = 0; for (var i = 0; i < sequence.length; i++) { if (sequence[i].length > 0) { passport[i] = sequence[i].split(/[\s]+/); if (containsKey(passport[i], "byr:") && containsKey(passport[i], "iyr:") && containsKey(passport[i], "eyr:") && containsKey(passport[i], "hgt:") && containsKey(passport[i], "hcl:") && containsKey(passport[i], "ecl:") && containsKey(passport[i], "pid:")) { okPassports++; } } } console.log("Part one ok passports: " + okPassports); } function calculatePartTwo(text) { var sequence = text.split('\n\n'); var passport = []; var okPassports = 0; for (var i = 0; i < sequence.length; i++) { if (sequence[i].length > 0) { passport[i] = sequence[i].split(/[\s]+/); if (containsValidKey(passport[i], "byr:") && containsValidKey(passport[i], "iyr:") && containsValidKey(passport[i], "eyr:") && containsValidKey(passport[i], "hgt:") && containsValidKey(passport[i], "hcl:") && containsValidKey(passport[i], "ecl:") && containsValidKey(passport[i], "pid:")) { okPassports++; } } } console.log("Part two valid passports: " + okPassports); } } )();

Dold text
PermalÀnk
Medlem ★
●
Skrivet av jaqob:

Dag: 4
SprÄk: Javascript.

FortsÀtter pÄ temat C i Javascript. Dagens övning var inte svÄr men en aning omstÀndig. Hade nog egentligen föredragit en aning mer komplicerade, men kortare, övningar. Typ https://www.codewars.com/. FortsÀtter det sÄhÀr lÀr snart uppgifterna ta lite mer tid Àn jag har möjlighet att lÀgga, tyvÀrr.

Jag kan varmt rekommendera exercism.io. Stöd för en massa olika sprÄk, till och med Assembly. Du clonar hem uppgifterna med hjÀlp av terminalen. Varje uppgift har en jÀdrans massa tester och ditt mÄl Àr fÄ alla passed. Du submittar din lösning med hjÀlp av terminalen och sen kan du jÀmföra den med lösningarna frÄn communityn. Brukar vara snopet att kolla pÄ den mest top-rated lösningen.

Det borde kosta pengar att anvÀnda sidan, men det gör det inte. Makalöst bra.

Visa signatur

| Mobo: Gigabyte X570 GAMING X | CPU: AMD Ryzen 9 3900X + Dark Rock 4 | RAM: 32GB @ 3000MHz | GPU: Gigabyte RTX 3080 OC | PSU: Seasonic GX 850W | Chassi: NZXT S340 Elite Matte Black | M.2: Samsung 970 Evo 500GB & 1000GB | HDD: 4TB | Monitors: Acer Predator X34 GS & Acer XB270HU |

PermalÀnk
Medlem ★
●

Idag kom sed lite i center stage.

part1$ <in sed 's/^$/@/' | tr '\n' ' ' | tr '@' '\n' | sed -E '/(([bie]yr|hgt|[he]cl|pid).*){7}/!d' | wc -l part2$ <in sed 's/^$/@/' | tr '\n' ' ' | tr '@' '\n' | sed -E '/(([bie]yr|hgt|ecl:(amb|blu|brn|gry|grn|hzl|oth)|hcl:#([a-f]|[0-9]){6}|pid:[0-9]{9} ).*){7}/!d' | awk '{ for (i = 1; i <= NF; i++) { split($i, a, ":"); { f[a[1]] = a[2] } } print f["byr"], f["iyr"], f["eyr"], f["hgt"] }' | sed -E 's/cm/ 150 193/;s/in/ 59 76/' | awk '$1 >= 1920 && $1 <= 2002 && $2 >= 2010 && $2 <= 2020 && $3 >= 2020 && $3 <= 2030 && $4 >= $5 && $4 <= $6' | wc -l

Dold text
Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

PermalÀnk
Datavetare ★
●

Dag: 4
SprÄk: Swift
Lösning: GitHub

Denna underlÀttades en del av Swifts möjlighet att definierar enum-typer som strÀngar, parsning av de tillÄtna vÀrdena genereras dÄ av kompilatorn. Har inte satt mig in i reguljÀra uttryck i kontext av Swift Àn, i detta fall fanns egentligen lika enkla sÀtt dÄ man kan t.ex. försöka konvertera PID till ett heltal med radix=16. Misslyckas det innehÄller det nÄgot annat Àn 0-9a-f.

FÄr kanske kolla in regex ÀndÄ, har skippat det dÄ det verkar vara en av fÄ saker man inte riktigt helt konverterat frÄn ObjC till Swift, sÄ Àr lite bökigt att anvÀnda alt. sÄ fÄr ma skriva lite egna hjÀlpfunktioner/extensioner.

Edit: har lagt till metoderna match(re:) och groups(re:) till String typen via mitt hjÀlpbibliotek. Implementerat via NSRegularExpression, d.v.s. via Foundation paketet. Uppdaterat dagens lösning, tror den blev lite enklare att begripa nu.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

PermalÀnk
●

Dag: 4
SprÄk: Nim
Lösning: Github

Den hÀr tog mig alldeles för lÄng tid att lösa. Och det var huvudsakligen för att jag missförstod hur funktionerna jag anvÀnde för matchningen funkade (:

PermalÀnk
Medlem
●

Älskar sprĂ„k med stark pattern matching, Elixir, Kotlin och TypeScript kan göra liknande vet jag, TS till och med matcha pĂ„ strukturella typer vilket Ă€r snyggt. Jag tror nyaste Java versionen har matchining liknande Scala/Kotlin? Om inte sĂ„ Ă€r det pĂ„ vĂ€g.

Dag 4 i Scala:

// Skapa regexes. Kunde gjort regex inline i Scala match-clausen, men regex Pattern instanser kompileras // pĂ„ JVMen till Matchers. SĂ„ Matchers blir snabba, men kompileringen Ă€r en dyr operation och tvivlar // pĂ„ att kompilatorn har en regel för att kolla om regex strĂ€ngen Ă€r statisk och isf hoistar ut och bara // kompilerar en gĂ„ng. val DIG_4 = "(\\d{4})".r val CM = "(\\d+)cm".r val IN = "(\\d+)in".r // Filteringsfunktionen. Eftersom regexarna har match group i sig sĂ„ kan jag assigna en variabel // (exvis birthYear) till match groupen och sen anvĂ€nda variabeln i case kropparna. // Är inte konsekvent, anvĂ€nder in-line regex pĂ„ dom 3 sista, skulle kunna gjort dom statiska som dom // ovan och Ă€ven anvĂ€nt dom i case matchen och sen bara returnera "true" i kroppen men tyckte det blev // mer lĂ€sbart sĂ„ hĂ€r. Om det var riktig produktionskod med kritisk performance skulle jag gjort val Patterns // utanför funktionen hĂ€r med. def validator(s: String): Boolean = { s.split(":") match { case Array("byr", DIG_4(birthYear)) => (1920 to 2002 contains birthYear.toInt) case Array("iyr", DIG_4(issueYear)) => (2010 to 2020 contains issueYear.toInt) case Array("eyr", DIG_4(expireYear)) => (2020 to 2030 contains expireYear.toInt) case Array("hgt", CM(height)) => (150 to 193 contains height.toInt) case Array("hgt", IN(height)) => (59 to 76 contains height.toInt) case Array("hcl", color) => color.matches("^\\#((\\d|[a-f]){6})") case Array("ecl", eye) => eye.matches("(amb)|(blu)|(brn)|(gry)|(grn)|(hzl)|(oth)") case Array("pid", pid) => pid.matches("\\d{9}") case _ => false } } val passports = inputFile.split("\\n\\n") //Tokenisera och validera val validValues = testPassports.map(_.split("\\s+").filter(validator) //Inte kollat om det finns duplicate keys i nĂ„gra passports, men för att vara sĂ€ker validValues.map(a => a.distinctBy(_.take(3))).filter(_.size == 7).size

Jag dock borde ha castat till int först och sen gjort (if x < foo && x > bar) ocksÄ sÄ det blev typsÀkert Àven om det blir mera svÄrlÀst. Slösade en halvtimme pÄ att jag först missat att skriva birthYear.toInt sÄ det blev bara (1920 to 2002 contains birthYear) och en strÀng kan ju aldrig finnas i en Int range sÄ dÄ blev ju inget passport giltigt. Hade jag anvÀnt den mer typsÀkra varianten hade den kastat exception "no operator '<' on String" om jag missat att skriva toInt sÄ dÄ hade jag hittat buggen direkt. Alternativt hade jag kunnat skriva unit tester men jag Àr alltid sÄ noga med det i produktionskod sÄ det kÀnns befriande att slarva lite för en gÄngs skull

Dold text
BÀttre kommentar till koden. Lade till "code" tag för indentering.
PermalÀnk
Medlem ★
●
Skrivet av Dave1080:

Jag kan varmt rekommendera exercism.io. Stöd för en massa olika sprÄk, till och med Assembly. Du clonar hem uppgifterna med hjÀlp av terminalen. Varje uppgift har en jÀdrans massa tester och ditt mÄl Àr fÄ alla passed. Du submittar din lösning med hjÀlp av terminalen och sen kan du jÀmföra den med lösningarna frÄn communityn. Brukar vara snopet att kolla pÄ den mest top-rated lösningen.

Det borde kosta pengar att anvÀnda sidan, men det gör det inte. Makalöst bra.

Tack för tipset, ska absolut testa. Vore kul att komma igÄng lite med Rust, och detta kan ju vara en bra anledning.

PermalÀnk
Medlem ★
●

Dagens (4e) uppgift var rolig (framförallt B-uppgiften) men blev ocksÄ mer tidskrÀvande Àn vad den behövde ha varit. I slutÀndan hade jag missat ett "=" pÄ en komperator sÄ det stod "<" istÀllet för "<=" samt att jag skrev "nzl" istÀllet för "hzl" i min ögonfÀrgstabell Spenderade Àven nÄgra för mÄnga minuter med att felsöka innan jag insÄg att det sista passet i input-listan aldrig rÀknas med dÄ det inte Àr en tom rad efter den.

PermalÀnk
Medlem
●

Lösning för dag 4, var rÀtt sÄ brötig att fÄ rÀtt. Av nÄn mystisk anledning gav den mig en fÀrre i resultatet Àn vad det skulle vara.
Blev en fruktansvÀrt massa iffar i andra delen

C#

class Program { static List<string> lines = File.ReadAllLines("input.csv").ToList(); static List<string> valid = new List<string>(); static void Main(string[] args) { PartOne(); PartTwo(); Console.ReadLine(); } static void PartOne() { string entries = ""; int check = 0; int count = 1; int totalPasswords = 0; for (int i = 0; i < lines.Count; i++) { check = 0; if (!string.IsNullOrWhiteSpace(lines[i])) entries = entries + lines[i] + " "; if (string.IsNullOrWhiteSpace(lines[i])) { totalPasswords++; if (entries.Contains("byr") & entries.Contains("iyr") & entries.Contains("eyr") & entries.Contains("hgt") & entries.Contains("hcl") & entries.Contains("ecl") & entries.Contains("pid")) { check+= 7; } if (check == 7) { count++; valid.Add(entries); } entries = ""; } } Console.WriteLine("First Count " + count); } static void PartTwo() { int totalCount = 1; int count = 0; int check = 0; string sCheck = ""; foreach (var v in valid) { count = 0; string[] entries = v.Split(':', ' '); for (int i = 0; i < entries.Length - 1; i++) { if (entries[i] == "byr") { check = int.Parse(entries[i + 1]); if (check >= 1920 & check <= 2002) count++; } if (entries[i] == "iyr") { check = int.Parse(entries[i + 1]); if (check >= 2010 & check <= 2020) count++; } if (entries[i] == "eyr") { check = int.Parse(entries[i + 1]); if (check >= 2020 & check <= 2030) count++; } if (entries[i] == "hgt") { sCheck = entries[i + 1]; string sLenght = ""; for (int j = 0; j < sCheck.Length - 2; j++) sLenght = sLenght + sCheck[j]; int lenght = sCheck.Length; if (sCheck[lenght - 2] == 'c' & sCheck[lenght - 1] == 'm') { if (int.Parse(sLenght) >= 150 & int.Parse(sLenght) <= 193) count++; } if (sCheck[lenght - 2] == 'i' & sCheck[lenght - 1] == 'n') { if (int.Parse(sLenght) >= 59 & int.Parse(sLenght) <= 76) count++; } } if (entries[i] == "hcl") { sCheck = entries[i + 1]; string num = ""; char hash = sCheck[0]; if (hash == '#') { for (int j = 1; j < sCheck.Length; j++) num = num + sCheck[j]; int lenght = num.Length; if (lenght == 6) { int countOne = Regex.Matches(num, @[a-f]).Count; int countTwo = Regex.Matches(num, @[0-9]).Count; if (countOne + countTwo == 6) count++; } } } if (entries[i] == "ecl") { string ecl = entries[i + 1]; if (ecl.Contains("amb") || ecl.Contains("blu") || ecl.Contains("brn") || ecl.Contains("gry") || ecl.Contains("grn") || ecl.Contains("hzl") || ecl.Contains("oth")) { count++; } } if (entries[i] == "pid") { string pid = entries[i + 1]; int countPID = Regex.Matches(pid, @[0-9]).Count; if (countPID == 9) count++; } } if (count == 7) totalCount = totalCount + 1; } Console.WriteLine("Second Count " + totalCount); } }

Dold text
PermalÀnk
Medlem ★
●

Dag: 4
SprÄk: C#
Lösning: Github

Tror att jag eventuellt vÀger in pÄ den lÀngsta lösningen för dagen med 240 rader.

Första delen kÀndes simpel och jag tÀnkte att nu har det Àntligen lossnat. Andra delen slog mig som en blixt frÄn klar himmel och det gÄr helt klart att göra mycket kortare. Som nybörjare utan insikt i alla fina verktyg som finns kÀnns det dock bra att ha lyckats, idag utan att titta pÄ andras lösningar sÄ det tÀnker jag göra nu för att se vad jag kan lÀra mig.

Ska Àven försöka koppla VS mot Github nu, tycker hela VS kÀnns lite bökigt att jobba med men antar att det Àr en vanesak.

Visa signatur

PrimÀr: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

PermalÀnk
Medlem ★
●
Skrivet av Daz:

Dag: 4
SprÄk: C#
Lösning: Github

Tror att jag eventuellt vÀger in pÄ den lÀngsta lösningen för dagen med 240 rader.

Första delen kÀndes simpel och jag tÀnkte att nu har det Àntligen lossnat. Andra delen slog mig som en blixt frÄn klar himmel och det gÄr helt klart att göra mycket kortare. Som nybörjare utan insikt i alla fina verktyg som finns kÀnns det dock bra att ha lyckats, idag utan att titta pÄ andras lösningar sÄ det tÀnker jag göra nu för att se vad jag kan lÀra mig.

Ska Àven försöka koppla VS mot Github nu, tycker hela VS kÀnns lite bökigt att jobba med men antar att det Àr en vanesak.

Jag slÄr dig i radantal!

using System; using CommonCode; using System.Collections.Generic; namespace Day04 { public class Main { public static string Run1(bool test = false) { int _Day = 4; int validcount=0; string inputData = InputData.GetInput(_Day, test); inputData = inputData.Replace("\r", ""); //inputData = inputData.Replace("\n\n", "€"); string[] stringpassports = inputData.Split("\n\n", StringSplitOptions.RemoveEmptyEntries); List<Passport> passports = new List<Passport>(); foreach (string item in stringpassports) { Passport curPP = new Passport(item); if (curPP.Valid) { validcount++; } passports.Add(curPP); } return validcount.ToString(); } public static string Run2(bool test = false) { int _Day = 4; int validcount = 0; string inputData = InputData.GetInput(_Day, test); inputData = inputData.Replace("\r", ""); //inputData = inputData.Replace("\n\n", "€"); string[] stringpassports = inputData.Split("\n\n", StringSplitOptions.RemoveEmptyEntries); List<Passport> passports = new List<Passport>(); foreach (string item in stringpassports) { Passport curPP = new Passport(item); if (curPP.Valid2) { validcount++; } passports.Add(curPP); } return validcount.ToString(); } } } using System; using System.Collections.Generic; using System.Globalization; using System.Linq; namespace Day04 { class Passport { public enum ppDataPart { byr, iyr, eyr, hgt, hcl, ecl, pid, cid } public enum EyeColor { amb, blu , brn, gry, grn, hzl, oth } private List<ppDataPart> validFields = Enum.GetValues(typeof(ppDataPart)).Cast<ppDataPart>().ToList(); private List<EyeColor> validEyeColors = Enum.GetValues(typeof(EyeColor)).Cast<EyeColor>().ToList(); private Dictionary<ppDataPart, string> _passportData=new Dictionary<ppDataPart, string>(); private List<ppDataPart> required = new List<ppDataPart>(); private bool _Valid = false; private bool _Valid2 = false; public Passport(string data) { char[] whitespace = "\n ".ToCharArray(); string[] keyvalues = data.Split(whitespace, StringSplitOptions.RemoveEmptyEntries); foreach (string item in keyvalues) { string[] pair = item.Split(":", StringSplitOptions.TrimEntries); if (pair.Length==2 && !String.IsNullOrEmpty(pair[0]) && !String.IsNullOrEmpty(pair[1])) { bool test =Enum.TryParse(pair[0], out ppDataPart enumKey); if (test) { setvalue(enumKey, pair[1]); } } } foreach (ppDataPart item in validFields) { if (item!=ppDataPart.cid) { required.Add(item); } } checkvalid(); if (_Valid) { checkvalid2(); } } private void setvalue(ppDataPart key,string value) { if (_passportData.ContainsKey(key)) { _passportData[key] = value; } else { _passportData.Add(key, value); } } private void checkvalid() { List<ppDataPart> missing = new List<ppDataPart>(required); foreach (KeyValuePair<ppDataPart,string> item in _passportData) { if (missing.Contains(item.Key)) { missing.Remove(item.Key); } } _Valid = (missing.Count == 0); } private void checkvalid2() { List<ppDataPart> missing = new List<ppDataPart>(required); foreach (KeyValuePair<ppDataPart,string> item in _passportData) { switch (item.Key) { case ppDataPart.byr: bool testbyr = int.TryParse(item.Value, out int ibyr); if (testbyr && ibyr>1919 && ibyr<2003 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.iyr: bool testiyr = int.TryParse(item.Value, out int iiyr); if (testiyr && iiyr > 2009 && iiyr < 2021 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.eyr: bool testeyr = int.TryParse(item.Value, out int ieyr); if (testeyr && ieyr > 2019 && ieyr < 2031 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.hgt: if (item.Value.Length>3 && (item.Value.Contains("cm") || item.Value.Contains("in"))) { string unit = item.Value.Substring(item.Value.Length - 2, 2); string heightstr = item.Value.Replace(unit, ""); bool testhgt = int.TryParse(heightstr, out int height); if (testhgt) { if (unit.Trim() == "cm") { if (height > 149 && height < 194 && missing.Contains(item.Key)) { missing.Remove(item.Key); } } else { if (unit.Trim() == "in") { if (height > 59 && height < 76 && missing.Contains(item.Key)) { missing.Remove(item.Key); } } } } } break; case ppDataPart.hcl: if (item.Value.Substring(0,1)=="#" && item.Value.Length==7) { bool testhcl = UInt32.TryParse(item.Value.Substring(1,6),System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out UInt32 hclhex); if (testhcl && missing.Contains(item.Key)) { missing.Remove(item.Key); } } break; case ppDataPart.ecl: bool testecl = Enum.TryParse(item.Value, out EyeColor enumEyeColor); if (testecl && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.pid: if (!String.IsNullOrEmpty(item.Value) && item.Value.Length==9) { bool testpid = UInt32.TryParse(item.Value, out UInt32 pidvalue); if (testpid && missing.Contains(item.Key)) { missing.Remove(item.Key); } } break; case ppDataPart.cid: //ignore break; default: break; } } _Valid2 = (missing.Count == 0); } public string getValue(ppDataPart key) { string retVal = String.Empty; if (_passportData.ContainsKey(key)) { retVal = _passportData[key]; } return retVal; } public bool Valid { get { return _Valid; } } public bool Valid2 { get { return _Valid2; } } } }

Dold text
PermalÀnk
Medlem
●
Skrivet av Mordekai:

Jag slÄr dig i radantal!

using System; using CommonCode; using System.Collections.Generic; namespace Day04 { public class Main { public static string Run1(bool test = false) { int _Day = 4; int validcount=0; string inputData = InputData.GetInput(_Day, test); inputData = inputData.Replace("\r", ""); //inputData = inputData.Replace("\n\n", "€"); string[] stringpassports = inputData.Split("\n\n", StringSplitOptions.RemoveEmptyEntries); List<Passport> passports = new List<Passport>(); foreach (string item in stringpassports) { Passport curPP = new Passport(item); if (curPP.Valid) { validcount++; } passports.Add(curPP); } return validcount.ToString(); } public static string Run2(bool test = false) { int _Day = 4; int validcount = 0; string inputData = InputData.GetInput(_Day, test); inputData = inputData.Replace("\r", ""); //inputData = inputData.Replace("\n\n", "€"); string[] stringpassports = inputData.Split("\n\n", StringSplitOptions.RemoveEmptyEntries); List<Passport> passports = new List<Passport>(); foreach (string item in stringpassports) { Passport curPP = new Passport(item); if (curPP.Valid2) { validcount++; } passports.Add(curPP); } return validcount.ToString(); } } } using System; using System.Collections.Generic; using System.Globalization; using System.Linq; namespace Day04 { class Passport { public enum ppDataPart { byr, iyr, eyr, hgt, hcl, ecl, pid, cid } public enum EyeColor { amb, blu , brn, gry, grn, hzl, oth } private List<ppDataPart> validFields = Enum.GetValues(typeof(ppDataPart)).Cast<ppDataPart>().ToList(); private List<EyeColor> validEyeColors = Enum.GetValues(typeof(EyeColor)).Cast<EyeColor>().ToList(); private Dictionary<ppDataPart, string> _passportData=new Dictionary<ppDataPart, string>(); private List<ppDataPart> required = new List<ppDataPart>(); private bool _Valid = false; private bool _Valid2 = false; public Passport(string data) { char[] whitespace = "\n ".ToCharArray(); string[] keyvalues = data.Split(whitespace, StringSplitOptions.RemoveEmptyEntries); foreach (string item in keyvalues) { string[] pair = item.Split(":", StringSplitOptions.TrimEntries); if (pair.Length==2 && !String.IsNullOrEmpty(pair[0]) && !String.IsNullOrEmpty(pair[1])) { bool test =Enum.TryParse(pair[0], out ppDataPart enumKey); if (test) { setvalue(enumKey, pair[1]); } } } foreach (ppDataPart item in validFields) { if (item!=ppDataPart.cid) { required.Add(item); } } checkvalid(); if (_Valid) { checkvalid2(); } } private void setvalue(ppDataPart key,string value) { if (_passportData.ContainsKey(key)) { _passportData[key] = value; } else { _passportData.Add(key, value); } } private void checkvalid() { List<ppDataPart> missing = new List<ppDataPart>(required); foreach (KeyValuePair<ppDataPart,string> item in _passportData) { if (missing.Contains(item.Key)) { missing.Remove(item.Key); } } _Valid = (missing.Count == 0); } private void checkvalid2() { List<ppDataPart> missing = new List<ppDataPart>(required); foreach (KeyValuePair<ppDataPart,string> item in _passportData) { switch (item.Key) { case ppDataPart.byr: bool testbyr = int.TryParse(item.Value, out int ibyr); if (testbyr && ibyr>1919 && ibyr<2003 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.iyr: bool testiyr = int.TryParse(item.Value, out int iiyr); if (testiyr && iiyr > 2009 && iiyr < 2021 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.eyr: bool testeyr = int.TryParse(item.Value, out int ieyr); if (testeyr && ieyr > 2019 && ieyr < 2031 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.hgt: if (item.Value.Length>3 && (item.Value.Contains("cm") || item.Value.Contains("in"))) { string unit = item.Value.Substring(item.Value.Length - 2, 2); string heightstr = item.Value.Replace(unit, ""); bool testhgt = int.TryParse(heightstr, out int height); if (testhgt) { if (unit.Trim() == "cm") { if (height > 149 && height < 194 && missing.Contains(item.Key)) { missing.Remove(item.Key); } } else { if (unit.Trim() == "in") { if (height > 59 && height < 76 && missing.Contains(item.Key)) { missing.Remove(item.Key); } } } } } break; case ppDataPart.hcl: if (item.Value.Substring(0,1)=="#" && item.Value.Length==7) { bool testhcl = UInt32.TryParse(item.Value.Substring(1,6),System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out UInt32 hclhex); if (testhcl && missing.Contains(item.Key)) { missing.Remove(item.Key); } } break; case ppDataPart.ecl: bool testecl = Enum.TryParse(item.Value, out EyeColor enumEyeColor); if (testecl && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.pid: if (!String.IsNullOrEmpty(item.Value) && item.Value.Length==9) { bool testpid = UInt32.TryParse(item.Value, out UInt32 pidvalue); if (testpid && missing.Contains(item.Key)) { missing.Remove(item.Key); } } break; case ppDataPart.cid: //ignore break; default: break; } } _Valid2 = (missing.Count == 0); } public string getValue(ppDataPart key) { string retVal = String.Empty; if (_passportData.ContainsKey(key)) { retVal = _passportData[key]; } return retVal; } public bool Valid { get { return _Valid; } } public bool Valid2 { get { return _Valid2; } } } }

Dold text

Om du skriver dina enumar pÄ samma rad sÄ sparar du lite plats iaf

PermalÀnk
Medlem ★
●

Jag mÄste Àndra mig. Det gick att fixa uppgift 4 i ett uttryck, men nu Àr definitivt inte uppenbart vad koden gör.

import re print([sum([all([k in d for k in ['byr', 'iyr', 'eyr', 'hgt', 'hcl', 'ecl', 'pid']]) and all([{'byr' : lambda v : int(v) in range(1920, 2003), 'iyr' : lambda v : int(v) in range(2010, 2021), 'eyr' : lambda v : int(v) in range(2020, 2031), 'hgt' : lambda v : ((v[-2:] == 'in' and int(v[:-2]) in range(59, 77)) or (v[-2:] == 'cm' and int(v[:-2]) in range(150, 194))), 'hcl' : lambda v : re.match('#[0-9a-fA-F]{6}',v), 'ecl' : lambda v : v in ['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'], 'pid' : lambda v : re.match('^\d{9}$', v)}[k](d[k]) for k in ['byr', 'iyr', 'eyr', 'hgt', 'hcl', 'ecl', 'pid']]) if v else True for d in [dict([x.split(':') for i in [p.replace('\n', ' ').split()] for x in i]) for p in open("input", "r").read().split('\n\n')]]) for v in [False, True]])

Dold text
PermalÀnk
Medlem ★
●
Skrivet av Mordekai:

Jag slÄr dig i radantal!

using System; using CommonCode; using System.Collections.Generic; namespace Day04 { public class Main { public static string Run1(bool test = false) { int _Day = 4; int validcount=0; string inputData = InputData.GetInput(_Day, test); inputData = inputData.Replace("\r", ""); //inputData = inputData.Replace("\n\n", "€"); string[] stringpassports = inputData.Split("\n\n", StringSplitOptions.RemoveEmptyEntries); List<Passport> passports = new List<Passport>(); foreach (string item in stringpassports) { Passport curPP = new Passport(item); if (curPP.Valid) { validcount++; } passports.Add(curPP); } return validcount.ToString(); } public static string Run2(bool test = false) { int _Day = 4; int validcount = 0; string inputData = InputData.GetInput(_Day, test); inputData = inputData.Replace("\r", ""); //inputData = inputData.Replace("\n\n", "€"); string[] stringpassports = inputData.Split("\n\n", StringSplitOptions.RemoveEmptyEntries); List<Passport> passports = new List<Passport>(); foreach (string item in stringpassports) { Passport curPP = new Passport(item); if (curPP.Valid2) { validcount++; } passports.Add(curPP); } return validcount.ToString(); } } } using System; using System.Collections.Generic; using System.Globalization; using System.Linq; namespace Day04 { class Passport { public enum ppDataPart { byr, iyr, eyr, hgt, hcl, ecl, pid, cid } public enum EyeColor { amb, blu , brn, gry, grn, hzl, oth } private List<ppDataPart> validFields = Enum.GetValues(typeof(ppDataPart)).Cast<ppDataPart>().ToList(); private List<EyeColor> validEyeColors = Enum.GetValues(typeof(EyeColor)).Cast<EyeColor>().ToList(); private Dictionary<ppDataPart, string> _passportData=new Dictionary<ppDataPart, string>(); private List<ppDataPart> required = new List<ppDataPart>(); private bool _Valid = false; private bool _Valid2 = false; public Passport(string data) { char[] whitespace = "\n ".ToCharArray(); string[] keyvalues = data.Split(whitespace, StringSplitOptions.RemoveEmptyEntries); foreach (string item in keyvalues) { string[] pair = item.Split(":", StringSplitOptions.TrimEntries); if (pair.Length==2 && !String.IsNullOrEmpty(pair[0]) && !String.IsNullOrEmpty(pair[1])) { bool test =Enum.TryParse(pair[0], out ppDataPart enumKey); if (test) { setvalue(enumKey, pair[1]); } } } foreach (ppDataPart item in validFields) { if (item!=ppDataPart.cid) { required.Add(item); } } checkvalid(); if (_Valid) { checkvalid2(); } } private void setvalue(ppDataPart key,string value) { if (_passportData.ContainsKey(key)) { _passportData[key] = value; } else { _passportData.Add(key, value); } } private void checkvalid() { List<ppDataPart> missing = new List<ppDataPart>(required); foreach (KeyValuePair<ppDataPart,string> item in _passportData) { if (missing.Contains(item.Key)) { missing.Remove(item.Key); } } _Valid = (missing.Count == 0); } private void checkvalid2() { List<ppDataPart> missing = new List<ppDataPart>(required); foreach (KeyValuePair<ppDataPart,string> item in _passportData) { switch (item.Key) { case ppDataPart.byr: bool testbyr = int.TryParse(item.Value, out int ibyr); if (testbyr && ibyr>1919 && ibyr<2003 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.iyr: bool testiyr = int.TryParse(item.Value, out int iiyr); if (testiyr && iiyr > 2009 && iiyr < 2021 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.eyr: bool testeyr = int.TryParse(item.Value, out int ieyr); if (testeyr && ieyr > 2019 && ieyr < 2031 && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.hgt: if (item.Value.Length>3 && (item.Value.Contains("cm") || item.Value.Contains("in"))) { string unit = item.Value.Substring(item.Value.Length - 2, 2); string heightstr = item.Value.Replace(unit, ""); bool testhgt = int.TryParse(heightstr, out int height); if (testhgt) { if (unit.Trim() == "cm") { if (height > 149 && height < 194 && missing.Contains(item.Key)) { missing.Remove(item.Key); } } else { if (unit.Trim() == "in") { if (height > 59 && height < 76 && missing.Contains(item.Key)) { missing.Remove(item.Key); } } } } } break; case ppDataPart.hcl: if (item.Value.Substring(0,1)=="#" && item.Value.Length==7) { bool testhcl = UInt32.TryParse(item.Value.Substring(1,6),System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out UInt32 hclhex); if (testhcl && missing.Contains(item.Key)) { missing.Remove(item.Key); } } break; case ppDataPart.ecl: bool testecl = Enum.TryParse(item.Value, out EyeColor enumEyeColor); if (testecl && missing.Contains(item.Key)) { missing.Remove(item.Key); } break; case ppDataPart.pid: if (!String.IsNullOrEmpty(item.Value) && item.Value.Length==9) { bool testpid = UInt32.TryParse(item.Value, out UInt32 pidvalue); if (testpid && missing.Contains(item.Key)) { missing.Remove(item.Key); } } break; case ppDataPart.cid: //ignore break; default: break; } } _Valid2 = (missing.Count == 0); } public string getValue(ppDataPart key) { string retVal = String.Empty; if (_passportData.ContainsKey(key)) { retVal = _passportData[key]; } return retVal; } public bool Valid { get { return _Valid; } } public bool Valid2 { get { return _Valid2; } } } }

Dold text

Jag funderade ocksÄ pÄ att bryta ut passen till en egen klass men det kÀndes overkill, hade nog varit snyggare dÀremot.

Dagens stora behÄllning för mig var att jag lyckades klura ut regex med bara nÄgon minut av googling, oftast tar det mycket lÀngre tid.

Visa signatur

PrimÀr: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

PermalÀnk
Hedersmedlem ★
●

Dag: 4
SprÄk: Powershell
Lösning: Github

Den hÀr dagen var betydligt mer intressant Àn nÄgra av de tidigare dagarna. VÀldigt belÄten med hur ideomatiskt Powershellig den hÀr lösningen Àr.

Jag blir dock lockad att göra den igen i C, utan regulÀra uttryck, bara för att.

PermalÀnk
Medlem ★
●
Skrivet av Daz:

Jag funderade ocksÄ pÄ att bryta ut passen till en egen klass men det kÀndes overkill, hade nog varit snyggare dÀremot.

Dagens stora behÄllning för mig var att jag lyckades klura ut regex med bara nÄgon minut av googling, oftast tar det mycket lÀngre tid.

Snyggt! FÄ se hur lÀnge det gÄr att skippa RegEx.

PermalÀnk
Medlem ★
●
Skrivet av Poss3:

Om du skriver dina enumar pÄ samma rad sÄ sparar du lite plats iaf

Jag Àr ju lite motvalskÀrring, vill ha luftig kod, finns rÀtt mycket att göra om just bara radantalet ske ner.

PermalÀnk
Medlem
●

Dag: 4
SprÄk: Rust

use crate::split_once; use std::io; pub fn run<R>(mut input: R) where R: io::BufRead, { let mut buffer = String::new(); let mut passport_fields = 0; let mut valid_passes = 0; loop { if input.read_line(&mut buffer).unwrap() == 0 { break; } // Samlar ihop alla fÀlt som finns tillgÀngliga för den inlÀsta raden let fields: Vec<_> = buffer .trim() .split(' ') .filter_map(|s| match split_once(s, ':') { Some((field, value)) => Some(field_value_check(field, value) as usize), _ => None, }) .collect(); // En tom vector indikerar att passet Àr klart. if fields.is_empty() { valid_passes += (passport_fields == 7) as usize; passport_fields = 0; } else { // Summerar de funna fÀlten passport_fields += fields.iter().fold(0, |acc, value| acc + value); } buffer.clear(); } println!("Svar: {}", valid_passes); } fn field_value_check(field: &str, value: &str) -> bool { match field { "byr" => match value.parse::<usize>() { Ok(1920..=2002) => true, _ => false, }, "iyr" => match value.parse::<usize>() { Ok(2010..=2020) => true, _ => false, }, "eyr" => match value.parse::<usize>() { Ok(2020..=2030) => true, _ => false, }, "hgt" => match value.strip_suffix("cm") { Some(x) => match x.parse::<usize>() { Ok(150..=193) => true, _ => false, }, _ => match value.strip_suffix("in") { Some(x) => match x.parse::<usize>() { Ok(59..=76) => true, _ => false, }, _ => false, }, }, "hcl" => match value { x if x.starts_with('#') && x.len() == 7 => { x.chars().all(|c| matches!(c, '#' | '0'..='9' | 'a'..='f')) } _ => false, }, "ecl" => match value { "amb" | "blu" | "brn" | "gry" | "grn" | "hzl" | "oth" => true, _ => false, }, "pid" => match value { x if x.len() == 9 => x.chars().all(char::is_numeric), _ => false, }, _ => false, } }

Dold text
Visa signatur

AMD Ryzen 3700X, Gigabyte Elite X570, 32GB Ballistix Sport, NH-D15S, SAPPHIRE NITRO+ RX 7900 XTX, Corsair AX760, LG OLED C2 42"

PermalÀnk
Medlem
●

Vart presenteras problemen?

Visa signatur

Är inte linux en billig kopia av ms-dos?

PermalÀnk
Medlem ★
●
Skrivet av akn3:

Vart presenteras problemen?

https://adventofcode.com/

Visa signatur

PrimÀr: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

PermalÀnk
Medlem
●
Skrivet av Daz:

Jag funderade ocksÄ pÄ att bryta ut passen till en egen klass men det kÀndes overkill, hade nog varit snyggare dÀremot.

Dagens stora behÄllning för mig var att jag lyckades klura ut regex med bara nÄgon minut av googling, oftast tar det mycket lÀngre tid.

Ja, regex Àr svart magi det dÀr

PermalÀnk
Medlem ★
●

Äntligen fick man lite tid över!
Blev mycket kod denna gÄng.

Är medveten om att jag kunde struntat i "cid" i Parse(...), men det kĂ€ndes oseriöst :).

Dag: 4
SprÄk: c#

static async Task Main(string[] args) { var lines = await File.ReadAllLinesAsync("input.txt"); var passports = Parse(lines); Console.WriteLine(passports.Count(x => x.Where(y => IsRequired(y.Key)).Count() == 7)); Console.WriteLine(passports.Count(x => x.Where(y => IsRequired(y.Key) && IsValid(y)).Count() == 7)); } static bool IsRequired(string s) { return s != "cid"; } static IEnumerable<SortedDictionary<string, string>> Parse(string[] lines) { var dict = new SortedDictionary<string, string>(); foreach (var line in lines) { if (string.IsNullOrWhiteSpace(line)) { yield return dict; dict = new SortedDictionary<string, string>(); } else { foreach (var s in line.Split(' ')) { var kvp = s.Split(':'); dict.Add(kvp[0], kvp[1]); } } } yield return dict; } static bool IsValid(KeyValuePair<string, string> kvp) { switch (kvp.Key) { case "byr": var byr = int.Parse(kvp.Value); return byr >= 1920 && byr <= 2002; case "iyr": var iyr = int.Parse(kvp.Value); return iyr >= 2010 && iyr <= 2020; case "eyr": var eyr = int.Parse(kvp.Value); return eyr >= 2020 && eyr <= 2030; case "hgt": var hgt_rgx = new Regex("([0-9]{1,})(in|cm)"); var match = hgt_rgx.Match(kvp.Value); if (match.Success) { var hgt = int.Parse(match.Groups[1].Value); return match.Groups[2].Value == "cm" && hgt >= 150 && hgt <= 193 || match.Groups[2].Value == "in" && hgt >= 59 && hgt <= 76; } else { return false; } case "hcl": var hcl_rgx = new Regex("#[a-f0-9]{6}"); return hcl_rgx.IsMatch(kvp.Value); case "ecl": var color = new[] { "amb", "blu", "brn", "gry", "grn", "hzl", "oth" }; return color.Contains(kvp.Value); case "pid": var pid_rgx = new Regex("^[0-9]{9}$"); return pid_rgx.IsMatch(kvp.Value); case "cid": return true; default: return false; } }

Dold text
PermalÀnk
Hedersmedlem ★
●

Dag: 4
SprÄk: C
KĂ€llkod: Gist

Ja, som utlovat tidigare sÄ har jag gett mig pÄ detta med C, utan att anvÀnda nÄgra regexar. Kan ju sÀga att det inte direkt var det mest lÀmpliga sprÄket att implementera detta i...

PermalÀnk
Hedersmedlem ★
●
Skrivet av Mordekai:

Jag slÄr dig i radantal!

Jisses, din C#-lösning blev till och med lÀngre Àn min lösning i C i inlÀgget ovan (som inte pÄ nÄgot sÀtt Àr golfad). Ska inte mer högnivÄsprÄk innebÀra kortare och enklare kod?

PermalÀnk
Medlem ★
●
Skrivet av pv2b:

Jisses, din C#-lösning blev till och med lÀngre Àn min lösning i C i inlÀgget ovan (som inte pÄ nÄgot sÀtt Àr golfad). Ska inte mer högnivÄsprÄk innebÀra kortare och enklare kod?

Den Àr kortare Àn min lösning ocksÄ. Gissar att det, i mitt fall, kan handla om erfarenhet. Har hittills mest följt fÀrdiga instruktioner nÀr det kommer till C# och aldrig kodat nÄgot eget, inte kursprojekt, lÀngre Àn typ vad jag gjorde pÄ AoC förra Äret

Visa signatur

PrimÀr: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

PermalÀnk
Medlem ★
●
Skrivet av pv2b:

Dag: 4
SprÄk: Powershell
Lösning: Github

Den hÀr dagen var betydligt mer intressant Àn nÄgra av de tidigare dagarna. VÀldigt belÄten med hur ideomatiskt Powershellig den hÀr lösningen Àr.

Jag blir dock lockad att göra den igen i C, utan regulÀra uttryck, bara för att.

Snygg lösning! Man blir nÀstan sugen pÄ att köra powershell nu.

PermalÀnk
Hedersmedlem ★
●
Skrivet av Daz:

Den Àr kortare Àn min lösning ocksÄ. Gissar att det, i mitt fall, kan handla om erfarenhet. Har hittills mest följt fÀrdiga instruktioner nÀr det kommer till C# och aldrig kodat nÄgot eget, inte kursprojekt, lÀngre Àn typ vad jag gjorde pÄ AoC förra Äret

Har nog ocksÄ en hel del att göra med kodstil.

JÀmför:

if (strcmp(key, "byr:") == 0) return BYR; if (strcmp(key, "iyr:") == 0) return IYR; if (strcmp(key, "eyr:") == 0) return EYR; if (strcmp(key, "hgt:") == 0) return HGT; if (strcmp(key, "hcl:") == 0) return HCL; if (strcmp(key, "ecl:") == 0) return ECL; if (strcmp(key, "pid:") == 0) return PID; if (strcmp(key, "cid:") == 0) return CID;

Med om jag hade istÀllet hade skrivit:

int ret; ret = strcmp(key, "byr:"); if (ret == 0) { return BYR; } ret = strcmp(key, "iyr:"); if (ret == 0) { return IYR; } ret = strcmp(key, "eyr:"); if (ret == 0) { return EYR; } ret = strcmp(key, "hgt:"); if (ret == 0) { return HGT; } ret = strcmp(key, "hcl:"); if (ret == 0) { return HCL; } ret = strcmp(key, "ecl:"); if (ret == 0) { return ECL; } ret = strcmp(key, "pid:"); if (ret == 0) { return PID; } ret = strcmp(key, "cid:"); if (ret == 0) { return CID; }

Ganska exakt samma kod, men typ 6 ggr sÄ lÄng och svÄrare att lÀsa ocksÄ!

PermalÀnk
Hedersmedlem ★
●
Skrivet av akn3:

Vart presenteras problemen?

https://adventofcode.com/

Det borde ju egentligen stÄ i första inlÀgget tycker man?

PermalÀnk
Medlem
●

Dag: 4
SprÄk: Golang
Lösning:

VÄga vÀgra regex!

package main import ( "bufio" "fmt" "os" "strconv" "strings" ) type Passport struct { BirthYear int IssueYear int ExpirationYear int HeightVal int HeightSuffix string HairColor string EyeColor string ID string CountryID string } func getPassports(rows []string) []Passport { var passports []Passport var passport Passport for _, row := range rows { if len(row) == 0 { passports = append(passports, passport) passport = Passport{} } exist, intVal := getIntValue(row, "byr") if exist { passport.BirthYear = intVal } exist, intVal = getIntValue(row, "iyr") if exist { passport.IssueYear = intVal } exist, intVal = getIntValue(row, "eyr") if exist { passport.ExpirationYear = intVal } exist, intVal, suffix := getHeight(row, "hgt") if exist { passport.HeightVal = intVal passport.HeightSuffix = suffix } exist, val := getValue(row, "hcl") if exist { passport.HairColor = val } exist, val = getValue(row, "ecl") if exist { passport.EyeColor = val } exist, val = getValue(row, "pid") if exist { passport.ID = val } exist, val = getValue(row, "cid") if exist { passport.CountryID = val } } passports = append(passports, passport) return passports } func getValidPartOne(passports []Passport) int { count := 0 for _, passport := range passports { if passport.BirthYear != 0 && passport.IssueYear != 0 && passport.ExpirationYear != 0 && passport.HeightVal != 0 && len(passport.HairColor) > 0 && len(passport.EyeColor) > 0 && len(passport.ID) > 0 { count++ } } return count } func getValidPartTwo(passports []Passport) int { count := 0 for _, passport := range passports { if isValidBirthYear(passport.BirthYear) && isValidIssueYear(passport.IssueYear) && isValidExpirationYear(passport.ExpirationYear) && isValidHeight(passport.HeightVal, passport.HeightSuffix) && isValidHairColor(passport.HairColor) && isValidEyeColor(passport.EyeColor) && isValidPassportID(passport.ID) { count++ } } return count } func isValidBirthYear(birthYear int) bool { return birthYear >= 1920 && birthYear <= 2002 } func isValidIssueYear(issueYear int) bool { return issueYear >= 2010 && issueYear <= 2020 } func isValidExpirationYear(expirationYear int) bool { return expirationYear >= 2020 && expirationYear <= 2030 } func isValidHeight(heightVal int, heightSuffix string) bool { return ((heightSuffix == "cm" && heightVal >= 150 && heightVal <= 193) || (heightSuffix == "in" && heightVal >= 59 && heightVal <= 76)) } func isValidHairColor(haircolor string) bool { validCharacter := map[string]int{"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "a": 0, "b": 0, "c": 0, "d": 0, "e": 0, "f": 0} if len(haircolor) == 7 && haircolor[:1] == "#" { for _, char := range haircolor[1:] { _, isCharValid := validCharacter[string(char)] if !isCharValid { return false } } return true } return false } func isValidEyeColor(eyecolor string) bool { validEyeColors := map[string]int{"amb": 0, "blu": 0, "brn": 0, "gry": 0, "grn": 0, "hzl": 0, "oth": 0} _, isValidEyeColor := validEyeColors[eyecolor] return isValidEyeColor } func isValidPassportID(pid string) bool { if len(pid) == 9 { _, err := strconv.Atoi(pid) if err == nil { return true } } return false } func getHeight(row string, prefix string) (bool, int, string) { exist, val := getValue(row, prefix) if exist { for _, suffix := range []string{"cm", "in"} { suffixIndex := strings.Index(val, suffix) if suffixIndex != -1 { heightVal, _ := strconv.Atoi(val[:suffixIndex]) return exist, heightVal, suffix } } } return exist, 0, "" } func getIntValue(row string, prefix string) (bool, int) { exist, val := getValue(row, prefix) if exist { result, _ := strconv.Atoi(val) return exist, result } return exist, 0 } func getValue(row string, prefix string) (bool, string) { if strings.Contains(row, prefix) { prefixWithColon := prefix + ":" beginIndex := strings.Index(row, prefixWithColon) val := row[beginIndex+len(prefixWithColon):] if strings.Contains(val, " ") { endIndex := strings.Index(val, " ") val = val[:endIndex] } return true, val } return false, "" } func getRows() []string { file, _ := os.Open("../input.txt") defer file.Close() scanner := bufio.NewScanner(file) var rows []string for scanner.Scan() { rows = append(rows, scanner.Text()) } return rows } func main() { rows := getRows() fmt.Println("PartOne", getValidPartOne(getPassports(rows))) fmt.Println("PartOne", getValidPartTwo(getPassports(rows))) }

Dold text
Tog bort en onödig if
PermalÀnk
Medlem ★
●

Kan nÄgon hjÀlpa mig med dag 3, första delen? Jag fÄr fram 101 trÀd och det Àr fel, jag fattar ingenting. Enligt loggen gÄr det till exakt som jag tÀnkt mig, men tydligen Àr det fel. Har jag missförstÄtt uppgiften?

fun solveFirstPart(): Int { val entries: List<List<Char>> = entriesFromDay(3).map { it.toList() } val rowMaxIndex = entries.size - 1 val columnMaxIndex = entries.first().size - 1 val stepRight = 3 val stepDown = 1 var row = 0 var column = 0 var treeCount = 0 while (true) { row += stepDown column += stepRight if (row > rowMaxIndex) break if (column > columnMaxIndex) column %= columnMaxIndex println("row: $row, column: $column") if (entries[row][column] == '#') treeCount++ } return treeCount }

Dold text

HĂ€r nedan ser ni loggen av row och column som jag just skrev om.

row: 1, column: 3 row: 2, column: 6 row: 3, column: 9 row: 4, column: 12 row: 5, column: 15 row: 6, column: 18 row: 7, column: 21 row: 8, column: 24 row: 9, column: 27 row: 10, column: 30 row: 11, column: 3 row: 12, column: 6 row: 13, column: 9 row: 14, column: 12 row: 15, column: 15 row: 16, column: 18 row: 17, column: 21 row: 18, column: 24 row: 19, column: 27 row: 20, column: 30 row: 21, column: 3 row: 22, column: 6 row: 23, column: 9 row: 24, column: 12 row: 25, column: 15 row: 26, column: 18 row: 27, column: 21 row: 28, column: 24 row: 29, column: 27 row: 30, column: 30 row: 31, column: 3 row: 32, column: 6 row: 33, column: 9 row: 34, column: 12 row: 35, column: 15 row: 36, column: 18 row: 37, column: 21 row: 38, column: 24 row: 39, column: 27 row: 40, column: 30 row: 41, column: 3 row: 42, column: 6 row: 43, column: 9 row: 44, column: 12 row: 45, column: 15 row: 46, column: 18 row: 47, column: 21 row: 48, column: 24 row: 49, column: 27 row: 50, column: 30 row: 51, column: 3 row: 52, column: 6 row: 53, column: 9 row: 54, column: 12 row: 55, column: 15 row: 56, column: 18 row: 57, column: 21 row: 58, column: 24 row: 59, column: 27 row: 60, column: 30 row: 61, column: 3 row: 62, column: 6 row: 63, column: 9 row: 64, column: 12 row: 65, column: 15 row: 66, column: 18 row: 67, column: 21 row: 68, column: 24 row: 69, column: 27 row: 70, column: 30 row: 71, column: 3 row: 72, column: 6 row: 73, column: 9 row: 74, column: 12 row: 75, column: 15 row: 76, column: 18 row: 77, column: 21 row: 78, column: 24 row: 79, column: 27 row: 80, column: 30 row: 81, column: 3 row: 82, column: 6 row: 83, column: 9 row: 84, column: 12 row: 85, column: 15 row: 86, column: 18 row: 87, column: 21 row: 88, column: 24 row: 89, column: 27 row: 90, column: 30 row: 91, column: 3 row: 92, column: 6 row: 93, column: 9 row: 94, column: 12 row: 95, column: 15 row: 96, column: 18 row: 97, column: 21 row: 98, column: 24 row: 99, column: 27 row: 100, column: 30 row: 101, column: 3 row: 102, column: 6 row: 103, column: 9 row: 104, column: 12 row: 105, column: 15 row: 106, column: 18 row: 107, column: 21 row: 108, column: 24 row: 109, column: 27 row: 110, column: 30 row: 111, column: 3 row: 112, column: 6 row: 113, column: 9 row: 114, column: 12 row: 115, column: 15 row: 116, column: 18 row: 117, column: 21 row: 118, column: 24 row: 119, column: 27 row: 120, column: 30 row: 121, column: 3 row: 122, column: 6 row: 123, column: 9 row: 124, column: 12 row: 125, column: 15 row: 126, column: 18 row: 127, column: 21 row: 128, column: 24 row: 129, column: 27 row: 130, column: 30 row: 131, column: 3 row: 132, column: 6 row: 133, column: 9 row: 134, column: 12 row: 135, column: 15 row: 136, column: 18 row: 137, column: 21 row: 138, column: 24 row: 139, column: 27 row: 140, column: 30 row: 141, column: 3 row: 142, column: 6 row: 143, column: 9 row: 144, column: 12 row: 145, column: 15 row: 146, column: 18 row: 147, column: 21 row: 148, column: 24 row: 149, column: 27 row: 150, column: 30 row: 151, column: 3 row: 152, column: 6 row: 153, column: 9 row: 154, column: 12 row: 155, column: 15 row: 156, column: 18 row: 157, column: 21 row: 158, column: 24 row: 159, column: 27 row: 160, column: 30 row: 161, column: 3 row: 162, column: 6 row: 163, column: 9 row: 164, column: 12 row: 165, column: 15 row: 166, column: 18 row: 167, column: 21 row: 168, column: 24 row: 169, column: 27 row: 170, column: 30 row: 171, column: 3 row: 172, column: 6 row: 173, column: 9 row: 174, column: 12 row: 175, column: 15 row: 176, column: 18 row: 177, column: 21 row: 178, column: 24 row: 179, column: 27 row: 180, column: 30 row: 181, column: 3 row: 182, column: 6 row: 183, column: 9 row: 184, column: 12 row: 185, column: 15 row: 186, column: 18 row: 187, column: 21 row: 188, column: 24 row: 189, column: 27 row: 190, column: 30 row: 191, column: 3 row: 192, column: 6 row: 193, column: 9 row: 194, column: 12 row: 195, column: 15 row: 196, column: 18 row: 197, column: 21 row: 198, column: 24 row: 199, column: 27 row: 200, column: 30 row: 201, column: 3 row: 202, column: 6 row: 203, column: 9 row: 204, column: 12 row: 205, column: 15 row: 206, column: 18 row: 207, column: 21 row: 208, column: 24 row: 209, column: 27 row: 210, column: 30 row: 211, column: 3 row: 212, column: 6 row: 213, column: 9 row: 214, column: 12 row: 215, column: 15 row: 216, column: 18 row: 217, column: 21 row: 218, column: 24 row: 219, column: 27 row: 220, column: 30 row: 221, column: 3 row: 222, column: 6 row: 223, column: 9 row: 224, column: 12 row: 225, column: 15 row: 226, column: 18 row: 227, column: 21 row: 228, column: 24 row: 229, column: 27 row: 230, column: 30 row: 231, column: 3 row: 232, column: 6 row: 233, column: 9 row: 234, column: 12 row: 235, column: 15 row: 236, column: 18 row: 237, column: 21 row: 238, column: 24 row: 239, column: 27 row: 240, column: 30 row: 241, column: 3 row: 242, column: 6 row: 243, column: 9 row: 244, column: 12 row: 245, column: 15 row: 246, column: 18 row: 247, column: 21 row: 248, column: 24 row: 249, column: 27 row: 250, column: 30 row: 251, column: 3 row: 252, column: 6 row: 253, column: 9 row: 254, column: 12 row: 255, column: 15 row: 256, column: 18 row: 257, column: 21 row: 258, column: 24 row: 259, column: 27 row: 260, column: 30 row: 261, column: 3 row: 262, column: 6 row: 263, column: 9 row: 264, column: 12 row: 265, column: 15 row: 266, column: 18 row: 267, column: 21 row: 268, column: 24 row: 269, column: 27 row: 270, column: 30 row: 271, column: 3 row: 272, column: 6 row: 273, column: 9 row: 274, column: 12 row: 275, column: 15 row: 276, column: 18 row: 277, column: 21 row: 278, column: 24 row: 279, column: 27 row: 280, column: 30 row: 281, column: 3 row: 282, column: 6 row: 283, column: 9 row: 284, column: 12 row: 285, column: 15 row: 286, column: 18 row: 287, column: 21 row: 288, column: 24 row: 289, column: 27 row: 290, column: 30 row: 291, column: 3 row: 292, column: 6 row: 293, column: 9 row: 294, column: 12 row: 295, column: 15 row: 296, column: 18 row: 297, column: 21 row: 298, column: 24 row: 299, column: 27 row: 300, column: 30 row: 301, column: 3 row: 302, column: 6 row: 303, column: 9 row: 304, column: 12 row: 305, column: 15 row: 306, column: 18 row: 307, column: 21 row: 308, column: 24 row: 309, column: 27 row: 310, column: 30 row: 311, column: 3 row: 312, column: 6 row: 313, column: 9 row: 314, column: 12 row: 315, column: 15 row: 316, column: 18 row: 317, column: 21 row: 318, column: 24 row: 319, column: 27 row: 320, column: 30 row: 321, column: 3 row: 322, column: 6 Day 3 Part 1: 101

Dold text
Visa signatur

| Mobo: Gigabyte X570 GAMING X | CPU: AMD Ryzen 9 3900X + Dark Rock 4 | RAM: 32GB @ 3000MHz | GPU: Gigabyte RTX 3080 OC | PSU: Seasonic GX 850W | Chassi: NZXT S340 Elite Matte Black | M.2: Samsung 970 Evo 500GB & 1000GB | HDD: 4TB | Monitors: Acer Predator X34 GS & Acer XB270HU |