🌟 Advent of Code (AoC) 2020 🌟

PermalÀnk
Medlem ★
●

🌟 Advent of Code (AoC) 2020 🌟

TrÄd frÄn 2018.
TrÄd frÄn 2019.

DĂ„ var det den hĂ€r tiden pĂ„ Ă„ret igen! ☃ Snön lyser med sin frĂ„nvaro hĂ€r i södra Sverige, men inget skriker julstĂ€mning som Advent of Code. Jag gillade @drwlz's upplĂ€gg frĂ„n förra Ă„ret, sĂ„ vi kör vidare pĂ„ det tycker jag.

INSTRUKTIONER

Vi fortsÀtter nyttja samma leaderboard som förr.
Leaderboard: 115994-59705230

InlÀggsform
Dag:
SprÄk:
Lösning:

Om du vill dela med dig av kod, anvÀnd [spoiler]-taggar.

Vi kan vÀl börja med att ge lite tips och rÄd till eventuella nytillkomna?

Mitt bÀsta rÄd, som man bör göra redan innan 1a december, Àr att kolla pÄ föregÄende Ärs AoC (2019, 2018) och skriva boiler-plate-kod för inlÀsning/parsning av data. MÄnga ovÀrderliga minuter per dag kommer Àgnas detta, om man inte har en hyffsat flexibel mall att följa.

PermalÀnk
Medlem ♄ ★
●

Ser fram emot att ge upp dag 4-5 i Ă„r igen!

PermalÀnk
Medlem ♄ ★
●
Skrivet av drwlz:

Ser fram emot att ge upp dag 4-5 i Ă„r igen!

Wow, tryhard. Kom till dag 3 förra Äret

Ribban Àr lÄg sÄ jag borde ju kunna slÄ mitt personliga rekort, haha.

PermalÀnk
Datavetare ♄ ★
●

@GLaDER satt precis och tÀnkte skapa samma trÄd, tack för att du tog dig tid!

Blir inte mycket till leaderboard för mig i Är, allt för mycket som hopat sig frÄn jobbet. Kommer hÀnga med sÄ gott det gÄr, kan egentligen bara sÀnka nivÄn nu dÄ alla 25 dagarna klarades av med Rust förra Äret.

Advent of Code 2019 var det första mer komplicerat Àn "hello world" jag gjort i Rust innan det men under 2020 har Rust verkligen blivit storfavorit som jag hoppas i slutÀndan tar över efter C++ (körde C++17 i Advent of Code 2018, men dÄ jag anvÀnt C++ sedan 1992 lÀrde man sig kanske inte jÀttemycket nytt i just sprÄket).

TÀnkte köra samma modell i Är, d.v.s. vÀlja ett sprÄk jag inte anvÀnt innan mer Àn sporadiskt. Valet i Är stod frÄn början mellan Go, Kotlin och TypeScript. Lutade rÀtt mycket mot TypeScript dÄ det Àr nÄgot jag har anvÀndning av pÄ jobbet dÄ NodeJS allt oftare letar sig in i saker nÀr man jobbar "cloud-native".

Sedan blev jag med Mac igen för första gÄngen pÄ ett par Är, det p.g.a. Apples övergÄng till ARM64. KÀnns fel att köra MacOS utan att ha lite koll pÄ Swift, sÄ Ärets Advent of Code kommer utföras i just Swift!

SÄ samma nivÄ som med Rust, har typ skrivit "hello world" i Swift innan, lÀr bli lite kÀmpigt initialt... Positiva Àr att Rust och Swift liknar varandra i flera av de grundlÀggande sakerna, i alla fall till syntax för Swift (likt allt annat) verkar sakna Rusts borrow-checker vilket Àr vad som gör Rust sÄ brutalt vÀrdefullt.

För andra som tÀnkte delta: vilket sprÄk som helst fungerar, men det kan vara bra att kolla upp

  • regulgĂ€ra uttryck, inget krav men det brukar underlĂ€tta, Ă„r 2018 fick lite kritik för att vara lite vĂ€l regexp tungt, 2019 var betydligt mer nedtonat pĂ„ den punkten

  • BigInt/BigNum, inte sĂ€kert att de behövs men ett problem förra Ă„ret var i praktiken rĂ€tt hopplöst utan att man hade stöd för detta. För de som kör Python och andra sprĂ„k som har det inbyggt kvittar det, var lite segt med Rust dĂ„ det tog ett bra tag att hitta ett vettigt bibliotek. Om samma hĂ€nder i Ă„r Ă€r jag förberedd, detta bibliotek verkar fungera pĂ„ ARM64 MacOS

Om nÄgon annan funderar pÄ Swift kan det vara bra att kÀnna till att sprÄket numera Àr helt open source och finns Àven för Windows och Linux. Finns stöd för sprÄket i VS Code. Har inte bestÀmt mig om jag ska försöka anvÀnda XCode eller hÄlla mig till VS Code, lutar Ät det senare.

PermalÀnk
Medlem ★
●

Jag fÄr se om jag tar mig tid att ge mig pÄ leaderboarden. I vanliga fall hÀnger jag morgonens första 30/45 minuter Ät att lÀsa, men jag tror jag ska ge den tiden till AoC istÀllet. Emellertid brukar senare problem ta mer Àn 45 minuter att lösa, och dÄ kommer jag sannolikt antingen skippa de problemen eller ta dem pÄ kvÀllen.

SprÄk har jag Ànnu inte valt. Python Àr mitt goto-sprÄk, men det hade varit roligt att prova nÄgot annat. Jag har lÀnge velat prova Go...

PermalÀnk
Datavetare ♄ ★
●

För er som har konto pÄ GitHub eller liknande, ni kan med fördel göra en lÀnk till koden under "Lösning: Rust dag 10" delen i mallen.

Om ni vill ha syntax-highlight pÄ koden hÀr pÄ forumet, likt detta, finns det verktyg som översÀtter kÀllkoden till BBCode med syntax-highligh som man bara klipper in i inlÀgget. Ett exempel Àr detta, borde rimligen finnas webbsidor dÀr man kan fixa detta online (nÄgon har kanske tips?).

PermalÀnk
Medlem ♄
●
Skrivet av BrutalSwede:

Wow, tryhard. Kom till dag 3 förra Äret

Ribban Àr lÄg sÄ jag borde ju kunna slÄ mitt personliga rekort, haha.

Samma hÀr. Dock sÄ har ju ens arbets och familje liv kommit mellan datorn och en sjÀlv förra Äret.

Nu sitter man mest hemma i dessa Corona tider.

PermalÀnk
Medlem ♄ ★
●

Är ju lite sugen pĂ„ att testa i Clojure, det vore kul att lĂ€ra sig mer av. Annars blir det F#

PermalÀnk
Medlem ♄ ★
●

Kommer troligen köra i .NET i Är. Har suttit med Java/Groovy en del de senaste mÄnaderna och jag saknar C#/.NET allt mer

PermalÀnk
Datavetare ♄ ★
●
Skrivet av BrutalSwede:

Kommer troligen köra i .NET i Är. Har suttit med Java/Groovy en del de senaste mÄnaderna och jag saknar C#/.NET allt mer

Groovy... Jobbar du med Jenkins? Har ocksÄ pillat en del med Groovy under Äret, det enbart i kontext av just CI/CD + Jenkins.

Groovy Àr inversen av TypeScript pÄ sÀtt och vis. TypeScript adderar statisk typning till dynamiskt typade JavaScript medan Groovy adderar dynamiskt typning till statiskt typade Java. De Àr i.o.f.s. lika i att bÄda Àr ett övermÀngd av underliggande sprÄk (Java Àr giltig Groovy och JS Àr giltig TS).

PermalÀnk
Medlem ♄ ★
●
Skrivet av Yoshman:

Groovy... Jobbar du med Jenkins? Har ocksÄ pillat en del med Groovy under Äret, det enbart i kontext av just CI/CD + Jenkins.

Groovy Àr inversen av TypeScript pÄ sÀtt och vis. TypeScript adderar statisk typning till dynamiskt typade JavaScript medan Groovy adderar dynamiskt typning till statiskt typade Java. De Àr i.o.f.s. lika i att bÄda Àr ett övermÀngd av underliggande sprÄk (Java Àr giltig Groovy och JS Àr giltig TS).

TyvÀrr inte. Kodbasen jag jobbar med Àr en legacy frÄn en annan applikation som köptes upp och byggdes om till nuvarande "produkt". Ligger och snurrar pÄ en gammal verison av Grails, som vi försöker uppgradera till nytt, samtidigt som man ska arbeta in ny funktionalitet som kunden vill ha

Sitter som konsult som tur Àr, sÄ man vet att förr eller senare sÄ kommer man undan frÄn detta.

FörstÄr inte riktigt poÀngen med Groovy. NÀr man har allt det goda med att ha statisk typning, sÄ inför man anarki och kalabalik genom att slÀppa loss det löst typade monstret

PermalÀnk
Medlem ★
●

Jaha, hÀr tÀnkte jag vakna upp och hÄlla mig underhÄlld med AoC tillsammans med morgon-kaffet.. Verkar som jag fÄr vÀnta till kl.16 för min del.

PermalÀnk
Medlem ★
●

Glad första Advent of Code 🌟

Vilken start pÄ AoC. Det tog Ätminstone 5-6 minuter innan jag fick min input.

Dag: 1
SprÄk: Go
Lösning: GitHub

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Jag gjorde en ren brute-force-lösning, men misstolkade Part 2. LÀste det som:

"Det finns fler Àn tvÄ par av nummer som summerar till 2020, hitta alla dessa nummer och ta produkten av dem. I exemplet Àr det tre stycken..."

Men i sjÀlva verket var det ju bara att lÀgga till ett index till i min awesome for-loop. Gick sÀkert tvÄ/tre minuter till att fatta varför jag inte fick nÄgot svar.

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

Vilken start pÄ AoC. Det tog Ätminstone 5-6 minuter innan jag fick min input.

Galet.. har aldrig suttit och vÀntat pÄ en sÄn hÀr förrut. NÀr frÄgan vÀl kom sÄ knÄpade jag ner en lösning pÄ nÄgon minut, sen satt jag och pressade refresh pÄ inputten.. Fick score 650 eller nÄ globalt. Blev lite av-tÀnd pÄ att ens fortsÀtta imorgon tbh. Eller ja, kommer inte bry mig om att vara snabb i alla fall.

Globalt snabbaste fick in första svaret pÄ 35 sekunder, hmm.

PermalÀnk
Datavetare ♄ ★
●

Alltid kul med nytt sprĂ„k... Hur lĂ€ser man in en fil i Swift var den svĂ„raste delen 🌟

Dag: 1
SprÄk: Swift
Lösning: Github

GĂ„r att fĂ„ ned denna till N*log(N) (sortera input och binĂ€rsök efter rĂ€tt match) i stĂ€llet för NÂČ och NÂł, men dĂ„ input Ă€r sĂ„ liten blir det eventuellt lĂ„ngsammare (vilket jag nu mĂ„ste testa...).

PermalÀnk
Medlem ★
●
PermalÀnk
Medlem ♄ ★
●

Det Àr ju en enradslösning i Python, men med imports of file-I/O sÄ blir det lite fler rader.

from itertools import combinations from numpy import prod with open("input1") as f: values = [int(v) for v in f] print([prod(vs) for l in [2, 3] for vs in combinations(values, l) if sum(vs) == 2020])

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

Det Àr ju en enradslösning i Python, men med imports of file-I/O sÄ blir det lite fler rader.

För att alla andra hÀr skriver tvÄ for-loopar medans du anvÀnder combinations(...) som gör det Ät dig...

PermalÀnk
Datavetare ♄ ★
●

Lekt runt lite med Swift, "one-liner" lösning. Kortare Àr inte alltid bÀttre... GÄtt frÄn den initiala imperativa lösningen som Àr trivial att förstÄ till detta hÀrke...

func part1(expenseReport: [UInt64], requiredSum: UInt64) -> UInt64 { return input.enumerated().reduce(0) { (acc,x) in if let y = input[(x.0+1)...].first(where: { $0 + x.1 == requiredSum }) { return x.1 * y } else { return acc } } } print(part1(expenseReport: inputGet(), requiredSum: 2020))

Dold text
PermalÀnk
Medlem ★
●

HÀr Àr min awk-oneliner, nÀr vi ÀndÄ hÄller pÄ..

part1$ awk '{ l[$0] = 0 } NR > FNR && (2020 - $1) in l { print $1 * (2020 - $1) }' in in part2$ awk '{ l[$0] = k[$0] = 0 } NR > FNR { for (n in l) { i = 2020 - ($1 + n); if (i in k) { print $1 * n * i } } }' in in

Dold text

Sen om det egentligen kan rÀknas som en oneliner kan vÀl diskuteras.

Förskönade lite grann :)
PermalÀnk
Medlem ★
●

Följer vÀl trenden och kör olÀsbara one-liners (c#)

var _ = File.ReadAllLines("aoc-2020\day-01\input.txt").Select(int.Parse).ToArray(); var a = 2020; Console.WriteLine(_.Where(o=>_.Contains(a-o)).Aggregate(1,(o,c)=>o*c)); Console.WriteLine(_.Where(o=>0<_.FirstOrDefault(c=>_.Contains(a-o-c))).Aggregate(1,(o,c)=>o*c));

Dold text

Edit; FörbÀttrad olÀsbarhet

PermalÀnk
Medlem ♄ ★
●
Skrivet av gibbon_:

HÀr Àr min awk-oneliner, nÀr vi ÀndÄ hÄller pÄ..

<in awk 'BEGIN { while (getline < "in") { a[$0] = b[$0] = 0 } close("in") } { for (n in a) { for (m in b) { if ($1 + n + m == 2020) { print $1 * n * m } } } }'

Dold text

Sen om det egentligen kan rÀknas som en oneliner kan vÀl diskuteras.

Ja definitionen bör ju rimligtvis vara att man inte fÄr lÀgga saker som normalt radbryts pÄ samma rad. HÀr sitter jag med ett "minified" JavaScript pÄ 100 kilobyte, tÀnk att man kan fÄ in ett helt framework pÄ EN RAD!!

PermalÀnk
Medlem ★
●
Skrivet av Massy:

Ja definitionen bör ju rimligtvis vara att man inte fÄr lÀgga saker som normalt radbryts pÄ samma rad. HÀr sitter jag med ett "minified" JavaScript pÄ 100 kilobyte, tÀnk att man kan fÄ in ett helt framework pÄ EN RAD!!

Absolut. Fast mindre awk-skript skrivs vÀl ÀndÄ normalt i context av ett större bash-skript, och dÄ som oneliner.

PermalÀnk
Medlem ♄ ★
●
Skrivet av Massy:

Ja definitionen bör ju rimligtvis vara att man inte fÄr lÀgga saker som normalt radbryts pÄ samma rad. HÀr sitter jag med ett "minified" JavaScript pÄ 100 kilobyte, tÀnk att man kan fÄ in ett helt framework pÄ EN RAD!!

Nja, min tolkning av one-liner hÀr Àr att man löser hela uppgiften i ett uttryck, inte nödvÀndigtvis skriver det pÄ en rad. Att göra det olÀsligt Àr inte ett mÄste

PermalÀnk
Medlem ♄
●

Dag: 1
SprÄk: C#
Lösning:

Orkade inte tÀnka idag sÄ det blev en enklare lösning.

static void Main(string[] args) { Console.WriteLine("START"); var foo = File.ReadLines("inputday1.txt"); var bar = new List<int>(); bar = foo.Select(x => Int32.Parse(x)).ToList(); foreach (var item in bar) { foreach (var item2 in bar) { foreach (var item3 in bar) { if (item + item2 + item3 == 2020) { Console.WriteLine(item * item2 * item3); goto end_program; } } } } end_program: Console.WriteLine("FIN"); }

Dold text
PermalÀnk
Medlem ♄ ★
●

TĂ€nkte försöka med C# i Ă„r. Kom till dag 7 innan jag gav upp med Python förra Ă„ret och kan inte sĂ€ga att jag programmerat mycket sedan dess. SĂ„g dagens problem och tĂ€nkte att "aha, det dĂ€r löser jag enkelt i python". ÖvervĂ€gde sen att ge upp dag 1 i Ă„r nĂ€r jag insĂ„g att jag aldrig lĂ€st frĂ„n en fil i C#, aldrig anvĂ€nt mig av nĂ„got mer avancerat Ă€n int[] för att hantera flera vĂ€rden och inte hade en aning om hur man stegar sig genom en List efter att ha upptĂ€ckt att sĂ„dana existerar.

Detta till trots fick jag ihop nÄgot likt @brainlessbob bortsett frÄn att min Àr omstÀndigare, inte avslutar nÀr den hittar svaret och Àr fler rader.

Dag: 1
SprÄk: C#
Lösning:

static void Main(string[] args) { StreamReader reader = new StreamReader("C:\\Users\\willh\\AoC2020Input\\1.txt"); List<int> input = new List<int>(); string line; while ((line = reader.ReadLine()) != null) { input.Add(int.Parse(line)); } foreach (int candidate in input) { foreach (int factor in input) { foreach (int factor2 in input) { if (candidate + factor + factor2 == 2020) { Console.WriteLine(candidate * factor * factor2); } } } } Console.ReadKey(); } }

Dold text
PermalÀnk
Medlem
●

Inte optimalt, men löser problemet givet denna lilla mÀngden data.

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

package main import ( "bufio" "fmt" "os" "strconv" ) func calcPartTwo(expenses []int) int { for len(expenses) > 0 { first := expenses[:1][0] rest := expenses[1:] for len(rest) > 0 { second := rest[:1][0] innerRest := rest[1:] for _, val := range innerRest { if (first + second + val) == 2020 { return first * second * val } } rest = innerRest } expenses = expenses[1:] } return 0 } func main() { file, _ := os.Open("../input.txt") defer file.Close() scanner := bufio.NewScanner(file) var expenses []int for scanner.Scan() { val, err := strconv.Atoi(scanner.Text()) if err == nil { expenses = append(expenses, val) } } fmt.Println(calcPartTwo(expenses)) }

Dold text
PermalÀnk
Medlem ♄ ★
●

Är klockan alldeles för mycket och man har massa andra sysslor man borde ta tag i sĂ„ fĂ„r det bli JS och bruteforce.

Dag: 1
SprÄk: JavaScript
Lösning:

document.querySelector("#read-button").addEventListener('click', function() {
let file = document.querySelector("#file-input").files[0];
let reader = new FileReader();
reader.addEventListener('load', function(e) {
calculateDayOnePartOne(e.target.result);
calculateDayOnePartTwo(e.target.result);
});
reader.readAsText(file);
});

function calculateDayOnePartOne(text) {
var lines = text.split('\n');
for (var i = 0; i < lines.length; i++) {
for (var j = i; j < lines.length; j++) {
if (parseInt(lines[i]) + parseInt(lines[j]) == 2020) {
console.log(lines[i] + " + " + lines[j] + " = " + (parseInt(lines[i]) + parseInt(lines[j])));
console.log(lines[i] + " * " + lines[j] + " = " + (parseInt(lines[i]) * parseInt(lines[j])));
return;
}
}
}
}

function calculateDayOnePartTwo(text) {
var lines = text.split('\n');
for (var i = 0; i < lines.length; i++) {
for (var j = i; j < lines.length; j++) {
for (var k = j; k < lines.length; k++) {
if (parseInt(lines[i]) + parseInt(lines[j]) + parseInt(lines[k]) == 2020) {
console.log(lines[i] + " + " + lines[j] + " + " + lines[k] + " = " + (parseInt(lines[i]) + parseInt(lines[j]) + parseInt(lines[k])));
console.log(lines[i] + " * " + lines[j] + " * " + lines[k] + " = " + (parseInt(lines[i]) * parseInt(lines[j]) * parseInt(lines[k])));
return;
}
}
}
}
}

Dold text
PermalÀnk
Medlem ♄ ★
●

Jag hatar oneliners with a passion...
I princip det enda jag kodade som barn var kombinatorik, drömmen om den stora vinsten pÄ tipset (stryk och mÄl) mest för att reducera system pÄ en mer raffinerad nivÄ Àn normala reduceringar, tex inte spela rader som skulle ge medioker utdelning för att de hade för hög sannolikhet eller rader med för lÄg sannolikhet.

I Är blir det .Net 5 och lite mer basic strukturkunskap för mig, har ingen bildning sÄ saknar ju mycket grundlÀggande kunskap om projektstrukturer, kompilatorer etc, förlitar mig pÄ Visual Studio. Har fortfarande inte lyckas hitta en guide för idioter som mig hur man deployar/debuggar pÄ Raspberry Pi os frÄn Visual Studio, allt jag hittar Àr med Visual Studio Code.

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Glad första Advent of Code 🌟

Vilken start pÄ AoC. Det tog Ätminstone 5-6 minuter innan jag fick min input.

Dag: 1
SprÄk: Go
Lösning: GitHub

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Jag gjorde en ren brute-force-lösning, men misstolkade Part 2. LÀste det som:

"Det finns fler Àn tvÄ par av nummer som summerar till 2020, hitta alla dessa nummer och ta produkten av dem. I exemplet Àr det tre stycken..."

Men i sjÀlva verket var det ju bara att lÀgga till ett index till i min awesome for-loop. Gick sÀkert tvÄ/tre minuter till att fatta varför jag inte fick nÄgot svar.

Dold text

Dag: 2
SprÄk: Go
Lösning: GitHub

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Idag fick jag verkligen lida av att jag anvÀnder ett (för mig) nytt sprÄk.

Tydligen Àr bokstaven string[i] en byte, och den fÄr man inte jÀmföra med strÀngen "a". DÄ gav jag mig i kast med att anvÀnda strings.Compare(), men den returnerar ju int, sÄ dÄ fick jag skriva om andra delar av koden istÀllet...

Hua hua. Inte en svÄr uppgift i sig. FÄr vÀl helt enkelt förlika mig med tanken att jag inte kommer vara högst pÄ nÄgra leaderboards i Är.

Dold text