🌟 Advent of Code (AoC) 2020 🌟

PermalÀnk
●
Skrivet av Dave1080:

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

Tror det kan ha att göra med att du inte tar hĂ€nsyn till att det Ă€r 0-indexerat nĂ€r du wrappar dina columner. Om Vi sĂ€ger att det finns 30 kolumner och du gĂ„r tre kolumner Ă„t höger per steg. DĂ„ kommer du hamna fĂ„ col = 33. Detta vill du ska bli 2 (sĂ„hĂ€r gĂ„r det om man loopar: 30, 0, 1 , 2). Men 33 % 30 = 3 ≠ 2 sĂ„ du mĂ„ste ta det du fĂ„r minus 1 ocksĂ„ för att det ska bli rĂ€tt. Hoppas det hĂ€r gick att förstĂ„ nĂ„gorlunda

PermalÀnk
Medlem ★
●
Skrivet av huggeMugg:

Tror det kan ha att göra med att du inte tar hĂ€nsyn till att det Ă€r 0-indexerat nĂ€r du wrappar dina columner. Om Vi sĂ€ger att det finns 30 kolumner och du gĂ„r tre kolumner Ă„t höger per steg. DĂ„ kommer du hamna fĂ„ col = 33. Detta vill du ska bli 2 (sĂ„hĂ€r gĂ„r det om man loopar: 30, 0, 1 , 2). Men 33 % 30 = 3 ≠ 2 sĂ„ du mĂ„ste ta det du fĂ„r minus 1 ocksĂ„ för att det ska bli rĂ€tt. Hoppas det hĂ€r gick att förstĂ„ nĂ„gorlunda

SjÀlvklart! Jag kanske inte borde hÄlla pÄ under en fredagskvÀll, detta var ju vÀldigt basic. Att jag inte fattade att det var lite bra för att vara sant nÀr column alltid slutade pÄ precis 30. Fick rÀtt nu direkt med ditt tips, tack för snabb hjÀlp.

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
●
Skrivet av Dave1080:

SjÀlvklart! Jag kanske inte borde hÄlla pÄ under en fredagskvÀll, detta var ju vÀldigt basic. Att jag inte fattade att det var lite bra för att vara sant nÀr column alltid slutade pÄ precis 30. Fick rÀtt nu direkt med ditt tips, tack för snabb hjÀlp.

Skönt att höra att det funkar nu
Ja sÄna dÀr "enkla" saker Àr sÄÄÄ irriterande nÀr man inser vad man gjort för fel och det slutar ju inte att hÀnda heller...

PermalÀnk
Datavetare ★
●

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

Bara för att C Àr sÄ fel för denna uppgift var jag tvungen att testa, blev inte sÄ fasligt illa.

------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C 1 26 0 156 -------------------------------------------------------------------------------

Visa signatur

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

PermalÀnk
Medlem
●

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

Jag kör nog en blandning emellan C# och Powershell

Visa signatur

Vad vore vÀrlden utan silvertejp?

PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: Kotlin
Lösning: GitHub
Speciellt tack till: @huggeMugg

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 ★
●

Dag 5, Python.
Hade varit lÀtt att göra en enradare av denna genom att om man gick igenom listan tvÄ gÄnger, men det tog emot. SÄ idag blev det tvÄ uttryck. För en van Python-programmerare skulle jag nog sÀga att det Àr lÀtt att förstÄ vad som görs.

seats = [int(line.translate({70:48,66:49,82:49,76:48}), 2) for line in open("input")] print(max(seats), *[i + 1 for i in range(128 * 8) if i in seats and i + 1 not in seats and i + 2 in seats])

Dold text
PermalÀnk
Medlem ★
●

Idag blev svaret lite löjligt..

part1$ <in sed 's/./& /g' | awk '{ for (i = 1; i < 11; i++) { if ($i ~ /[BR]/) { $1 += 2^(10 - i) } } print $1 }' | sort -n | tail -1 part2$ <in sed 's/./& /g' | awk '{ for (i = 1; i < 11; i++) { if ($i ~ /[BR]/) { $1 += 2^(10 - i) } } print $1 }' | sort -n | awk 'NR == 1 { n = $1 } n > $1 - NR' | tail -1 | xargs expr 1 +

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
Medlem ★
●
Skrivet av Yoshman:

Bara för att C Àr sÄ fel för denna uppgift var jag tvungen att testa, blev inte sÄ fasligt illa.

Men du fuskar ju

Du kan dina funktioner i standardbiblioteket.
Du vet att atoi bara tar siffrorna och att man inte behöver klippa bort "in" eller "cm" frÄn lÀngden.
Du vet att isxdigit kollar om det Àr en hexadecimalsiffra.
Och strtok, vad Àr det för mygel?
IstÀllet för ha namngivna medlemmar anvÀnder du tabeller och heltalsindexerar. Och kan göra tester genom bitmaskning!

DÄ blir det ju mycket lÀttare och mindre kod. Hur pÄverkar detta lÀsbarheten? HÀr gör du trade-offs mellan uppenbar kod för den oinvigde och kodstorlek. Det Àr ju inte i nÀrheten av de hemskheter jag producerar i Python, men hÀr gÄr du lite Ät samma hÄll.

TL;DR: Ett program skrivet av en erfaren programmerare som kan sina saker. Det innehÄller en del trix som Àr tillÀmpbara Àven i andra sprÄk sÄ Àven de som inte skriver i C borde kolla pÄ koden för att lÀra sig saker.

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

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

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

"NICE!", tÀnkte jag, "hÀr kan jag ju prova hur struct fungerar i Go!"

type Passport struct { byr int iyr int ... }

Men sen fattade jag inte alls hur jag skulle anvÀnda den Till exempel fungerade inte:

p := Passport{} p.key = value

DÀr key och value var variabler som jag parsade ut. Fick nÄgot felmeddelande om att p inte hade nÄgon metod key, vilket jag antar Àr att vÀnta sig; men ÀndÄ.

Jag tror det tog 45 minuter innan jag övergav min struct-idé och gjorde en enkel map istÀllet (lÀnk). Det tog ocksÄ pinsamt lÄng tid innan jag fattade att jag kunde splitta input pÄ "\n\n", och inte behövde göra en loop som appendade till en lista och bytte index vid blankrad.

Till syvende och sist Àr jag ganska nöjd med min lösning. Det finns saker att slipa pÄ, och lösningen Àr inte sÀrskilt Go:ig, men den fungerar

Dold text

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

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

Kul! Till skillnad frÄn igÄr var det hÀr en uppgift med lite parsande och mycket tÀnkande. Jag skÀms dock lite nÀr jag tÀnker pÄ vad min algoritmlÀrare frÄn universitetet skulle sÀga om han tittat över axeln pÄ mig medans jag trevade fram en lösning. Det hÀr var en uppgift i min smak, men Àndock klurig.

Dold text
Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem
●
Skrivet av Ingetledigtnamn:

Dag 5, Python.
Hade varit lÀtt att göra en enradare av denna genom att om man gick igenom listan tvÄ gÄnger, men det tog emot. SÄ idag blev det tvÄ uttryck. För en van Python-programmerare skulle jag nog sÀga att det Àr lÀtt att förstÄ vad som görs.

seats = [int(line.translate({70:48,66:49,82:49,76:48}), 2) for line in open("input")] print(max(seats), *[i + 1 for i in range(128 * 8) if i in seats and i + 1 not in seats and i + 2 in seats])

Dold text

Kört lite Python tidigare men fick titta ett tag innan jag förstod.

Translate gör strÀngen till binary, int parsar med base 2 sÄ du direkt fÄr stolsnumret?

Dold text

Snygg lösning.

Nu kÀnns min lösning tafflig i jÀmförelse, men det var kul att skriva lite rekursion.
Scala dag 5:

def reducer(s: String, range: List[Int], low: Char, high: Char): Int = { if (s.isEmpty) range.head else { val reducedRange = s.head match { case `high` => range.takeRight(range.size/2) case `low` => range.take(range.size/2) } reducer(s.tail, reducedRange, low, high) } } def row(s: String): Int = reducer(s.take(7), (0 to 127).toList, 'F', 'B') def columns(s: String): Int = reducer(s.drop(7), (0 to 7).toList, 'L', 'R') def seat(s: String) = row(s) * 8 + column(s) import ammonite.ops._ //Syntaktiskt socker för fillÀsning val seats = (read.lines! pwd/"input.txt").map(seat) // Uppgift 1 seats.max //Uppgift 2 val all = (seats.min+1 to seats.max-1).toList all.diff seats

Dold text

Edit: Jag var tvungen att se hur mycket jag kunde Pythonifera Scala koden.

import ammonite.ops._ //Syntaktiskt socker för fillÀsning def toSeat(s: String) = Integer.parseInt(s.map { case 'F' => '0'; case 'B' => '1'; case 'L' => '0'; case 'R' => '1' }, 2) val seats = (read.lines! pwd/"input.txt").map(toSeat) (seats.min+1 to seats.max-1).toList diff seats

Dold text
Förenklad Scala lösning.
PermalÀnk
Medlem
●

Hur noggrann tycker ni man ska vara? TÀnker typ pÄ första dagen om listan skulle varit ett element som var 1010 sÄ borde detta felhanteras, men det krÀvs inte för att lösa uppgiften.

PermalÀnk
Medlem
●
Skrivet av Texaco:

Hur noggrann tycker ni man ska vara? TÀnker typ pÄ första dagen om listan skulle varit ett element som var 1010 sÄ borde detta felhanteras, men det krÀvs inte för att lösa uppgiften.

Det Àr ju inte produktionskod som mÄste framtidssÀkras direkt, du har kompletta listan med input just nu.

Men som en heads-up sÄ har jag hört frÄn kollegor som kört det hÀr tidigare att det mot slutet av kalendern ofta kommer uppgifter som bygger pÄ varandra, exvis att man först fÄr att man ska skriva en op decoder, och sen ska byggs det vidare pÄ den efterföljande dagar tills man tillslut har en grundlÀggande CPU emulator. SÄ det kan vara vÀrt att fÄ igÄng vanan att skriva ordentliga unit-tester sÄ man kan fÄnga eventuella edge cases.

En kollega fastnade ordentligt pÄ dag x+5 och slet hela helgen med felsökning för han trodde han hade bugg i den dagens kod, och sÄ var det en bugg i op-decodern som han skrev dag x, som inte detekterades med tÀvlingsinput frÄn den dagen...

Edit: Men om det hade varit produktionskod sÄ absolut, Àven för dag 1, man vet aldrig vad för skrÀp man fÄr in Àven frÄn klienter som sÀger sig följa en standard. Ibland Àr det till och med deras egen standard som dom inte följer! En bra tumregel för publika APIer Àr "be liberal in what you accept and conservative in what you send". Jag tolkar det som att programmera defensivt mot all input du inte kontrollerar, men kasta inte exception för minsta fel. Men dÀremot nÀr du retunerar vÀrden eller sjÀlv anropar andra, se till att följa standarder till punkt och pricka.

PermalÀnk
Medlem
●

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

En riktig bruteforce lösning borde ha tÀnkt lite mer innan jag började..

package main import ( "bufio" "fmt" "os" "sort" ) type BoardingPass struct { Row int Column int SeatID int } func getBoardingPasses(rows []string) []BoardingPass { var result []BoardingPass allFlightRows := [128]int{} for i := 0; i < 128; i++ { allFlightRows[i] = i } allFlightCols := [8]int{} for i := 0; i < 8; i++ { allFlightCols[i] = i } for _, row := range rows { flightRows := allFlightRows[:] flightCols := allFlightCols[:] for _, char := range row { halfRowIndex := len(flightRows) / 2 halfColIndex := len(flightCols) / 2 if "F" == string(char) { flightRows = flightRows[:halfRowIndex] } if "B" == string(char) { flightRows = flightRows[halfRowIndex:] } if "L" == string(char) { flightCols = flightCols[:halfColIndex] } if "R" == string(char) { flightCols = flightCols[halfColIndex:] } } result = append(result, BoardingPass{ Row: flightRows[0], Column: flightCols[0], SeatID: flightRows[0]*8 + flightCols[0]}) } return result } type BySeatID []BoardingPass func (a BySeatID) Len() int { return len(a) } func (a BySeatID) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a BySeatID) Less(i, j int) bool { return a[i].SeatID < a[j].SeatID } func findHighestSeatID(boardingPasses []BoardingPass) int { sort.Sort(BySeatID(boardingPasses)) return boardingPasses[len(boardingPasses)-1].SeatID } func findMySeat(boardingPasses []BoardingPass) int { sort.Sort(BySeatID(boardingPasses)) prevSeatID := boardingPasses[0].SeatID for _, boardingPass := range boardingPasses { if (boardingPass.SeatID - prevSeatID) == 2 { return boardingPass.SeatID - 1 } prevSeatID = boardingPass.SeatID } return 0 } 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", findHighestSeatID(getBoardingPasses(rows))) fmt.Println("PartTwo", findMySeat(getBoardingPasses(rows))) }

Dold text
PermalÀnk
Medlem
●

Dag 5's lösning

C#

class Program { static List<string> input = File.ReadAllLines("input.csv").ToList(); static List<int> sID = new List<int>(); static void Main(string[] args) { Console.WriteLine(PartOne()); Console.WriteLine(PartTwo()); Console.ReadLine(); } static int PartOne() { int seatIDmax = 0; string entrie = ""; for (int i = 0; i < input.Count; i++) { int rowMin = 0; int rowMax = 127; int colMin = 0; int colMax = 7; int temp = 0; int rowResult = 0; int colResult = 0; int seatID = 0; entrie = input[i]; for (int j = 0; j < entrie.Length; j++) { if (entrie[j] == 'F') { if (rowMin > rowMax / 2) { temp = (rowMax - rowMin) /2; rowMax += - temp; rowMax += + rowMax - 1; } rowMax = rowMax / 2; } if (entrie[j] == 'B') { temp = (rowMax - rowMin) / 2; rowMin = temp + rowMin + 1; } if (rowMax == rowMin) rowResult = rowMax; if ( entrie[j] == 'L') { if (colMin > colMax / 2) { temp = (colMax - colMin) / 2; colMax +=- temp; colMax +=+ colMax - 1; } colMax = colMax / 2; } if (entrie[j] == 'R') { temp = (colMax - colMin) / 2; colMin = temp + colMin + 1; } if(colMax == colMin) colResult = colMax; } seatID = (rowResult * 8) + colResult; if (seatID > seatIDmax) seatIDmax = seatID; sID.Add(seatID); } return seatIDmax; } static int PartTwo() { int mySeatID = 0; sID.Sort(); int start = sID[0]; for(int i = 0; i < sID.Count; i++) { if(sID[i] != start) { mySeatID = start; return mySeatID; } start++; } return mySeatID; } }

Dold text
PermalÀnk
Medlem
●

Dag: 5
SpÄrk: Powershell
Lösning: GitHub

Jag fick tÀnka till kring hur jag skulle lösa delarna. Finns sÀkert 100ggr smartare sÀtt att lösa det pÄ.
Om nÄgon skulle vilja kommentera nÄgot enklare sÀtt sÄ Àr det vÀlkommet

[void] getrow() { #rows 128 #columns 8 [int32[]]$rows = 0..128 | % { $_ } [int32]$top = 128 [int32]$bot = 0 [char[]]$in = $this.rowdata for ($i = 0; $i -lt $in.Count; $i++) { if ($in[$i] -eq 'B') { $current = (($rows.count - 1) / 2) $rows = $rows[$current..$top] $top = $rows.count } else { $current = (($rows.count - 1) / 2) $rows = $rows[$bot..$current] $top = $rows.count } if (($rows.count -eq 2) -and ($in[$i] -eq 'B')) { $this.row = $rows[1]-1 } elseif (($rows.count -eq 2) -and ($in[$i] -eq 'F')) { $this.row = $rows[0] } } } [void] getseat() { [int32[]]$column = 0..8| % {$_} [int32]$top = 8 [int32]$bot = 0 [char[]]$in = $this.seatdata for ($i = 0; $i -lt $in.Count; $i++) { if ($in[$i] -eq 'R') { $current = (($column.count-1)/2) $column = $column[$current..$top] $top = $column.count } else { $current = (($column.count-1)/2) $column = $column[$bot..$current] $top = $column.count } if (($column.count -eq 2) -and ($in[$i] -eq 'R')) { $this.seat = $column[1]-1 } elseif (($column.count -eq 2) -and ($in[$i] -eq 'L')) {$this.seat = $column[0]} } }

Dold text
Visa signatur

Vad vore vÀrlden utan silvertejp?

PermalÀnk
Medlem ★
●

Dag 5
SprÄk: Kotlin

Del 1:

package main.java.dayfive import main.java.FileReader fun main() { val lines = FileReader().readFile("input.fifth") val max = lines.map { getSeatId(it) }.maxOrNull() println(max) } private fun getSeatId(definition: String): Int { val binaryDefinition = definition .replace('B', '1').replace('F', '0') .replace('R', '1').replace('L', '0') return binaryDefinition.toInt(2) }

Dold text

Del 2:

package main.java.dayfive import main.java.FileReader fun main() { val lines = FileReader().readFile("input.fifth") val sortedSeatIds = lines.map { getSeatId(it) }.sorted() for (i in sortedSeatIds.indices) { if (sortedSeatIds[i + 1] - sortedSeatIds[i] == 2) { println(sortedSeatIds[i] + 1) return } } } private fun getSeatId(definition: String): Int { val binaryDefinition = definition .replace('B', '1').replace('F', '0') .replace('R', '1').replace('L', '0') return binaryDefinition.toInt(2) }

Dold text
Visa signatur
PermalÀnk
Medlem ★
●
Skrivet av wgren:

Kört lite Python tidigare men fick titta ett tag innan jag förstod.

Translate gör strÀngen till binary, int parsar med base 2 sÄ du direkt fÄr stolsnumret?

Dold text

Snygg lösning.

Precis. Jag tycker det Àr konstigt att fler inte sett det sambandet.

Det blev ju riktigt elegant i Scala ocksÄ

PermalÀnk
Medlem ★
●
Skrivet av Talarion:

Om nÄgon skulle vilja kommentera nÄgot enklare sÀtt sÄ Àr det vÀlkommet

FET SPOILER, lÀs inte innan du löst uppgiften.

Titta pÄ platsstrÀngen och den binÀra representationen för platsnumret och se om du kan hitta nÄgra samband.

Dold text
PermalÀnk
Medlem ★
●

Dag: 5
SprÄk: c#

Kul uppgift, har ingen som helst erfarenhet av "binary space partitioning"...

static void Main(string[] args) { var seats = Parse(File.ReadAllLines("input.txt")).ToArray(); var part1 = seats.Max(); var part2 = seats.Single(x => !seats.Contains(x + 1) && seats.Contains(x + 2)) + 1; Console.WriteLine($"{part1}//{part2}"); } static IEnumerable<int> Parse(string[] d) { foreach (var s in d) { int f = 0, b = 127, l = 0, r = 7; foreach (var c in s) { if (c == 'F') { b = (f + b) / 2; } else if (c == 'B') { f = (f + b) / 2 + 1; } else if (c == 'L') { r = (l + r) / 2; } else if (c == 'R') { l = (l + r) / 2 + 1; } } yield return f * 8 + l; } }

Dold text
PermalÀnk
Medlem ★
●

Man kÀnner sig bra dum nÀr man kollar lösningarna och inser att det var sÄhÀr enkelt...

static void Main(string[] args) { var lines = File.ReadAllLines("input.txt"); var seats = lines.Select(x => Convert.ToInt32(x.Replace('B', '1').Replace('F', '0').Replace('R', '1').Replace('L', '0'), 2)).ToArray(); var part1 = seats.Max(); var part2 = seats.Single(x => !seats.Contains(x + 1) && seats.Contains(x + 2)) + 1; Console.WriteLine($"{part1}//{part2}"); }

Dold text
PermalÀnk
Hedersmedlem ★
●

Day: 5
SprÄk: Powershell
Lösning: GitHub.

Jag kÀnner mig rÀtt nöjd med min lösning idag, bÄde utifrÄn hur rent det blev och utifrÄn att jag tidigt sÄg ett sÀtt att lösa uppgiften pÄ ett enklare sÀtt Àn specifierat.

Hela grejen med att "dela upp kabinen pÄ tvÄ" Àr ju exakt ekvivalent med binÀra tal, vilket gjorde att den naturliga lösningen var att helt enkelt konvertera koderna till binÀra tal och sedan dekoda dem. Sedan i efterhand sÄ insÄg jag ju att man aldrig ens behöver veta rad eller kolumn, det rÀcker med SeatID, vilket ytterligare förenklade lösningen, men det gick ju inte att veta innan man sett Part 2.

Dold text

@Talarion om du ville se en enklare lösning i Powershell sÄ kan du kolla min lösning.

PermalÀnk
Medlem ★
●
Skrivet av pv2b:

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Ä!

Jag Àr en hemsk person som faktiskt föredragit den undre varianten. Men du fick mig att testa sÄ i dagens lösning har jag faktiskt gjort vissa saker pÄ en rad istÀllet för flera. Kan se fördelen i vissa scenarion, dÀr jag nu anvÀnder det. Har inte kodat sÄ lÀnge att jag riktigt skapat mig en vana för hur jag vill ha det Ànnu.

Dag: 5
SprÄk: C#

using System; using System.IO; using System.Collections.Generic; using System.Linq; namespace AoC5 { class Program { static void Main() { List<string> input = File.ReadAllLines("C:\\Users\\willh\\AdventOfCode2020\\AoC5\\input.txt").ToList(); int[] row = new int[128]; int[] col = new int[8]; for (int i = 0; i < row.Length; i++) { row[i] = i; } for (int i = 0; i < col.Length; i++) { col[i] = i; } //This gives a start, could set it to 0 and it would work but this will ALWAYS work even for negative seatIDs in some alternate reality int highestID = CalculateSeatID(row, col, input[0]); List<int> allSeats = new List<int>(); foreach (string instruction in input) { int candidate = CalculateSeatID(row, col, instruction); if (candidate > highestID) { highestID = candidate; } allSeats.Add(candidate); } int seatNumber = FindMissingSeat(allSeats); Console.WriteLine("Solution 1 = {0}", highestID); Console.WriteLine("Solution 2 = {0}", seatNumber); Console.ReadLine(); } static int FindMissingSeat(List<int> allSeats) { allSeats.Sort(); int seatNumber = allSeats[0]; for (int i = 0; i < allSeats.Count; i++) { if (!(seatNumber == allSeats[i])) { return seatNumber; } seatNumber += 1; } return 0; } static int CalculateSeatID(int[] row, int[] col, string instructions) { int rowLow = 0; int colLow = 0; int rowHigh = row.Length - 1; int colHigh = col.Length - 1; int colMid = (colLow + colHigh) / 2; int rowMid = (rowLow + rowHigh) / 2; foreach (char instruction in instructions) { switch (instruction) { case 'F': rowHigh = rowMid; rowMid = (rowLow + rowHigh) / 2; break; case 'B': rowLow = rowMid; rowMid = (rowLow + rowHigh) / 2; break; case 'L': colHigh = colMid; colMid = (colLow + colHigh) / 2; break; case 'R': colLow = colMid; colMid = (colLow + colHigh) / 2; break; } } return rowHigh * 8 + colHigh; } } }

Dold text

Lite roligt faktiskt att jag igÄr började titta i boken grooking algorithms vilken i princip börjar med ett sÄnt hÀr exempel. GÄr garanterat att göra mycket effektivare (ska titta pÄ andra svar nu) men jag Àr riktigt nöjd faktiskt. Under 90 rader idag

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 ★
●
Skrivet av Daz:

Jag Àr en hemsk person som faktiskt föredragit den undre varianten. Men du fick mig att testa sÄ i dagens lösning har jag faktiskt gjort vissa saker pÄ en rad istÀllet för flera. Kan se fördelen i vissa scenarion, dÀr jag nu anvÀnder det. Har inte kodat sÄ lÀnge att jag riktigt skapat mig en vana för hur jag vill ha det Ànnu.

Jag kodar ju lite grann för jobbet nÀr det behövs (jobbar som systemadministratör) sÄ jag Àr inte direkt programmerare pÄ heltid, men jag skulle nog sÀga att regel 1 för kodstil Àr att skita i att följa kodstilen om det gör koden svÄrare att lÀsa.

Kodstil Àr tÀnkt som en riktlinje, en serie regler som kan göra koden lÀttare att lÀsa om de följs, men det finns alltid undantag. Det Àr lÀsbarheten som Àr mÄlet, inte att följa kodstilen. Kodstil Àr bara ett verktyg för att göra koden mer lÀsbar, inte ett sjÀlvÀndamÄl.

PermalÀnk
Datavetare ★
●

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

Är gjort lite för att lĂ€ra mig Swifts standardbibliotek. Representerar planet som en matris av Range<Int> som smalnas av med information frĂ„n boardingkort till dessa att rad/kolumn bĂ„da Ă€r av lĂ€ngd 1.

Andra delen löses genom att skapa en mÀngd (Set<Int>) av alla tÀnkbara "seat IDs", för att sedan plocka bort alla IDs som Àr tagna samt dÀr ID-1 och ID+1 inte Àr tagna.

Börjar bli lite varm i Swift-klÀderna, nÀr första berÀkningstunga problemet dyker upp blir att att testa pÄ Metal-compute. En av huvudanledningarna till att jag vill lÀra mig Swift Àr att Metal-compute ser riktigt trevligt ut och det verkar klart enklast att jobba med frÄn Swift.

Visa signatur

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

PermalÀnk
Medlem ★
●
Skrivet av pv2b:

Jag kodar ju lite grann för jobbet nÀr det behövs (jobbar som systemadministratör) sÄ jag Àr inte direkt programmerare pÄ heltid, men jag skulle nog sÀga att regel 1 för kodstil Àr att skita i att följa kodstilen om det gör koden svÄrare att lÀsa.

Kodstil Àr tÀnkt som en riktlinje, en serie regler som kan göra koden lÀttare att lÀsa om de följs, men det finns alltid undantag. Det Àr lÀsbarheten som Àr mÄlet, inte att följa kodstilen. Kodstil Àr bara ett verktyg för att göra koden mer lÀsbar, inte ett sjÀlvÀndamÄl.

Jag har nyligen hamnat i en roll som systemförvaltare/systemadministratör (de visste inte riktigt vad de skulle kalla mig) och har nyss börjat experimentera med att bygga egna script/verktyg för processer vi gör hela tiden.

Min enda formella kunskap inom programmering Àr nÄgra kortare uppgifter om python pÄ grundnivÄ dÀr jag och lÀraren pratade oerhört mycket om just kodstil faktiskt. Jag Àr generellt ett stort fan av luftig kod med mycket whitespace men allteftersom jag bygger erfarenhet sÄ blir kompaktare kod mer intressant, kanske för att förstÄelse ökar? FÄr vÀl se hur det blir i framtiden, mÀrker ju redan att C# tar upp mÄnga fler rader Àn python för nÀra nog samma sak men eftersom jag anvÀnder powershell pÄ jobbet kÀnns C# som ett bra val just nu.

Med det sagt hÄller jag med om vad du sÀger om kodstil, minns att Àven lÀraren pÄ högskolan sa att man utvecklar sin egen kodstil över tid och att den ofta Àndras allteftersom man fÄr mer erfarenhet. Hoppas pÄ att hitta min egen framgent

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
●

@pv2b Jag har aldrigt gjort nÄgot sÄdant som din lösning i part 1. AnvÀnder med powershell i jobbet. Tycker dock min part2 var lite fiffigare. Det stod ju bara att det var en plats ledig

@Ingetledigtnamn Jag ska försöka förstÄ det! FÄr lÀsa lite om det.

$f,$l = $seats.seatid | sort | select -first 1 -last 1 [int32[]]$my = $f..$l |% {$_} Compare-Object -ReferenceObject $seats.seatid -DifferenceObject $my | Select-Object -ExpandProperty Inputobject

Dold text
Visa signatur

Vad vore vÀrlden utan silvertejp?

PermalÀnk
Hedersmedlem ★
●
Skrivet av Talarion:

@pv2b Jag har aldrigt gjort nÄgot sÄdant som din lösning i part 1. AnvÀnder med powershell i jobbet. Tycker dock min part2 var lite fiffigare. Det stod ju bara att det var en plats ledig

$f,$l = $seats.seatid | sort | select -first 1 -last 1 [int32[]]$my = $f..$l |% {$_} Compare-Object -ReferenceObject $seats.seatid -DifferenceObject $my | Select-Object -ExpandProperty Inputobject

Dold text

Jag var inne pÄ Compare-Object ocksÄ, men det bygger pÄ att man mÄste sortera, nÄgot som kostar O(n log n) för att initiera datastrukturen, och sedan O(n) för att jÀmföra mellan de tvÄ listorna, för en total komplexitet pÄ O(n log n).

Det bygger ocksÄ pÄ att man mÄste kolla igenom hela listan, Àven nÀr man hittat vad man Àr ute efter.

Genom att göra som jag gjorde med ett HashSet sparar man i komplexitet. Att skapa ett set med n vÀrden kostar O(n), och sedan O(n) för att iterera över set:et. PÄ mitt sÀtt genom att anvÀnda en for-loop som stannar nÀr man hittar en ledig stol sÄ slipper du kolla igenom resten av arrayen du inte Àr intresserad av.

PermalÀnk
Datavetare ★
●
Skrivet av Ingetledigtnamn:

Men du fuskar ju

Du kan dina funktioner i standardbiblioteket.
Du vet att atoi bara tar siffrorna och att man inte behöver klippa bort "in" eller "cm" frÄn lÀngden.
Du vet att isxdigit kollar om det Àr en hexadecimalsiffra.
Och strtok, vad Àr det för mygel?
IstÀllet för ha namngivna medlemmar anvÀnder du tabeller och heltalsindexerar. Och kan göra tester genom bitmaskning!

DÄ blir det ju mycket lÀttare och mindre kod. Hur pÄverkar detta lÀsbarheten? HÀr gör du trade-offs mellan uppenbar kod för den oinvigde och kodstorlek. Det Àr ju inte i nÀrheten av de hemskheter jag producerar i Python, men hÀr gÄr du lite Ät samma hÄll.

TL;DR: Ett program skrivet av en erfaren programmerare som kan sina saker. Det innehÄller en del trix som Àr tillÀmpbara Àven i andra sprÄk sÄ Àven de som inte skriver i C borde kolla pÄ koden för att lÀra sig saker.

C har inte mycket till standardbibliotek och kanske rÄkar kunna det ovanligt vÀl dÄ jag behövt implementera standardbiblioteket C99 som del av jobbet. Men oavsett sprÄk anvÀnder ju folk standardbiblioteket, vore rÀtt hopplöst att lösa nÄgot utan det. Alla de funktioner du nÀmner Àr ju del av C89, enda jag anvÀnder frÄn C99 Àr möjlighet att deklarera variabler nÀr de först anvÀnds i stÀllet för i toppen av funktionen.

Gick lite snabbt nÀr jag slÀngde ihop det hela igÄr, bitmasken Àr bara en totalt onödig hastighetsoptimering (programmet körs pÄ ~1 ms med eller utan optimering) och man kan ju enkelt namnge alla fÀlt genom att deklarera en enum. Det Àr nu gjort, vilket tog ned antalet rader till 141 (d.v.s. SLOC Àr 141). Det Àr fortfarande rÀtt mÄnga, Swift varianten har hÀlften (och Àr nybörjare i Swift, men anvÀnder sjÀlvklart standardbiblioteket Àn mer dÀr dÄ det innehÄller rÀtt mycket mer).

En trevlig egenskap med C Àr att allt Àr vÀldigt explicit, sÄ om man bara skippar att gömma saker i macros samt skriva flera satser pÄ samma rad Àr det alltid enkelt att följa flödet i en debugger. Nestlade högnivÄkonstruktioner i sprÄk som Clojure eller Python blir rÀtt snabbt hopplöst att debugga, sÄ dÀr har man ett OK lackmustest pÄ nÀr saker kanske borde brytas ned i mindre bitar.

I C lösningen var redan tidigare alla moment namngivna, nu Àr Àven tabellen med funktionspekare borta och den Àr vÀldigt nÀra min Swift-lösning. Man kan argumentera om fÀlten i passet Àr namngivna, det Àr fortfarande en array men nu kan man göra passport->fields[BYR] för att komma Ät fÀltet "birth year".

Det jag anvÀnder som definitivt inte Àr nybörjarvÀnligt Àr pekararitmetik, det kan man absolut peka ut som komplicerade hÀr. Jag tycker det Àr enkelt dÄ det Àr nÄgot som jag anvÀnder ofta p.g.a. effektiviteten (mÄnga CPUer har dedicerade instruktioner för sÄdant, x86 har det Àven för typer med storlekar frÄn 1 byte till 8 bytes).

Det som diskuterats innan var vÀl mer att överanvÀndning av anonyma funktioner leder till write-only kod dÄ enda sÀttet att fatta vad som hÀnder Àr att förstÄ effekten av hela harangen av högre nivÄ funktioner. Om man bra bryter ned det i de delsteg som faktiskt finns och namnger mellanresultaten gÄr det typiskt frÄn write-only till "ah det Àr sjÀlvklart".

Sen finns det en annat problem med sprÄk som Clojure och Python i att "normala" fallet av list-comprehension Àr "inside-out". Inget problem om man delar upp saker i distinkta delproblem, i det lÀget har bÄda dessa sprÄk vÀldigt kraftull och enkel syntax. NÀstlar man det, vilket jag gjorde i denna blir redan rÀtt enkla saker svÄra att greppa.

Fast finns inga regler som inte har undantag. Ibland kan man göra lÀnge haranger som ÀndÄ Àr lÀtta att förstÄ, man mÄste bara skriva det som "gör A, sedan B, sedan C" i stÀllet för "C(B(A()))". Clojure kan visualisera det vÀldigt vÀl

Write-only, men Àr extremt enkelt att skriva detta nÀr man har all kontext i skallen, inte lika lÀtt att fatta det hela en vecka senare...

(first (.split (.replace (.toUpperCase "a b c d") "A" "X") " "))

Exakt samma logik, men nu rÀtt enkelt att greppa direkt Àven om man inte kan Clojure

(-> "a b c d" .toUpperCase (.replace "A" "X") (.split " ") first)

Fast Àven denna blir rÀtt snabbt write-only om delmomenten blir minsta komplicerade, i det lÀget bör de brytas ut som funktioner och namnges.

BĂ„da ger svaret "X"

Visa signatur

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

PermalÀnk
Medlem
●
Skrivet av pv2b:

Jag var inne pÄ Compare-Object ocksÄ, men det bygger pÄ att man mÄste sortera, nÄgot som kostar O(n log n) för att initiera datastrukturen, och sedan O(n) för att jÀmföra mellan de tvÄ listorna, för en total komplexitet pÄ O(n log n).

Det bygger ocksÄ pÄ att man mÄste kolla igenom hela listan, Àven nÀr man hittat vad man Àr ute efter.

Genom att göra som jag gjorde med ett HashSet sparar man i komplexitet. Att skapa ett set med n vÀrden kostar O(n), och sedan O(n) för att iterera över set:et. PÄ mitt sÀtt genom att anvÀnda en for-loop som stannar nÀr man hittar en ledig stol sÄ slipper du kolla igenom resten av arrayen du inte Àr intresserad av.

Nu snackar vi optimering deluxe. Men hade du inte dÄ kunnat skippa din hashset och kolla i din seatid array ifall seatid+1 finns?
Eller det blir lÄngsammare Àn .contains() i hashsetet. TÀnkte att du itererar ÀndÄ igenom seatid.

Jag Àr nog inte lika avancerad som dig, dessa saker i AoC gör jag för att lÀra mig mer sÄ det Àr bra med feedback!

Visa signatur

Vad vore vÀrlden utan silvertejp?