🌟 Advent of Code (AoC) 2020 🌟

PermalÀnk
Medlem
●

Dag 16, Scala. Jag tar det lite lugnare nu och koncentrerar mig pÄ att lÀra mig saker och fÄ till bra lösningar. Den hÀr blev ok tyckte jag, nöjd med "uniques" lösningen.

object Day16 { type Ticket = List[Int] case class Field(name: String, ranges: Array[Range.Inclusive]) { def matches(x: Int): Boolean = ranges.exists(_.contains(x)) def matches(l: Seq[Int]): Boolean = l.forall(matches) } def toField(in: String) = { val Array(name, rs) = in.split(": ") val ranges = rs.split(" or ").map(s => s.split("-") match { case Array(h, t) => Range.inclusive(h.toInt, t.toInt) }) Field(name, ranges) } class Categorizer(in: String) { val Array(fds, my, ticks) = in.split("\\n\\n").map(_.split("\\n")) val tickets: List[Ticket] = ticks.drop(1).map(_.split(",").map(_.toInt).toList).toList val myTicket = my.last.split(",").map(_.toInt).toList val fields = fds.map(toField).toList def included(in: Int, ranges: Seq[Range.Inclusive]) = { !ranges.forall(!_.contains(in)) } def validTickets = { val ranges = fields.flatMap(_.ranges) tickets.filter(_.forall(i => included(i, ranges))) } def possibleCategories: List[List[Field]] = validTickets.transpose.map(column => fields.filter(_.matches(column))) def uniques[A](in: List[List[A]]): List[A] = { for { l <- in l2 <- in if l.size - l2.size == 1 } yield l.diff(l2).head } def uppg1: Int = tickets.flatten.filter(!included(_, fields.flatMap(_.ranges))).sum def uppg2: BigInt = { val departureIndexes = uniques(possibleCategories).zipWithIndex.filter(_._1.name.startsWith("departure")).map(_._2) departureIndexes.map(myTicket(_)).foldLeft(BigInt(1))(_ * _) } }

Dold text
PermalÀnk
Medlem ★
●

Dag: 17
SprÄk: F#

Dagens tyckte jag var lÀtt, men F# kanske inte alltid Àr sÄ snabbt som man skulle önska. 13 sekunder pÄ min i7-8550U CPU - inte den frÀckaste men Yoshman's Swift-lösning kör ju pÄ under 1 sek

DÀremot var ju steget mellan uppgift ett och tvÄ vÀldigt enkel imho.

type Task1Position = {X: int; Y: int; Z: int} type Task2Position = {X : int; Y: int; Z: int; W: int} let availablePositionsTask1 ({X=x; Y=y; Z=z}:Task1Position) = [for i in (x-1)..(x+1) do for j in (y-1)..(y+1) do for k in (z-1)..(z+1) do yield {X=i; Y=j; Z=k; }] |> List.filter ((<>) {X=x; Y=y; Z=z;}) let availablePositionsTask2 {X=x; Y=y; Z=z; W=w} = [for i in (x-1)..(x+1) do for j in (y-1)..(y+1) do for k in (z-1)..(z+1) do for l in (w-1)..(w+1) do yield {X=i; Y=j; Z=k; W=l}] |> List.filter ((<>) {X=x; Y=y; Z=z; W=w}) let newState availablePositions oldState = let calculateNewCubes ((positionsToAdd: 'a Set), (positionsToRemove: 'a Set)) (position: 'a) = let activeNeighbors = availablePositions >> List.filter (fun pos -> (Set.contains pos oldState)) let inactiveNeighbors = availablePositions >> List.filter (fun pos -> not (Set.contains pos oldState)) let inactiveNeighborsThatShouldTurnActive = inactiveNeighbors >> List.filter (fun pos -> (activeNeighbors pos) |> List.length = 3) let activePositions = activeNeighbors position let addedNeighbors = (inactiveNeighborsThatShouldTurnActive position |> List.fold (fun set pos -> Set.add pos set) positionsToAdd) if activePositions.Length = 2 || activePositions.Length = 3 then (addedNeighbors, positionsToRemove) else (addedNeighbors, positionsToRemove.Add(position)) let (positionsToAdd, positionsToRemove) = oldState |> Set.fold calculateNewCubes (Set.empty, Set.empty) let removed = positionsToRemove |> Set.fold (fun p s -> Set.remove s p) oldState positionsToAdd |> Set.fold (fun p s -> Set.add s p) removed let parse = Seq.mapi (fun i row -> row |> Seq.mapi (fun j char -> ({X = j; Y = i; Z = 0},char)) |> Seq.choose (fun (pos,char) -> if char = '#' then Some pos else None)) >> Seq.concat >> Set.ofSeq [<EntryPoint>] let main argv = let input = System.IO.File.ReadAllLines "input.txt" |> parse printfn "Task 1: %i" ([0..5] |> List.fold (fun set _ -> newState availablePositionsTask1 set) input |> Set.count) printfn "Task 1: %i" ([0..5] |> List.fold (fun set _ -> newState availablePositionsTask2 set) (input |> Set.map (fun {X=x;Y=y;Z=z} -> {X=x;Y=y;Z=z;W=0;})) |> Set.count) 0 // return an integer exit code

Dold text
Visa signatur

Jag Àr en optimist; det Àr aldrig sÄ dÄligt sÄ att det inte kan bli sÀmre.

PermalÀnk
Medlem
●

Dag 17 Scala/jdk-16
Blev lite copy-paste programmering för att se hur bra fart man kunde fÄ pÄ jvm. Runt 20-30”s för del 1 och ~350”s för del tvÄ (uppvÀrmd). KrÀver 256 bitars register, versionen som fungerar pÄ alla storlekar blev lite lÄngsammare. Fulkod som förutsÀtter en massa saker angÄende storlekar osv. Inte det minsta ÄteranvÀndningsbar.

import jdk.incubator.vector.{ShortVector, VectorMask, VectorOperators, ByteVector => BV} import java.nio.file.{Files, Path} import scala.concurrent.duration.DurationLong import scala.util.chaining.scalaUtilChainingOps object Day17: val input = Files.readString(Path.of("17.txt")).split('\n') extension (left: BV) def + (right: BV) = left.add(right) val spec = BV.SPECIES_PREFERRED val inputHeight = input.length val inputWidth = input.head.length val cycles = 6 val xDim = (cycles * 2 + inputWidth + spec.length() - 1) / spec.length() * spec.length() + 2 val yDim = cycles * 2 + 2 + inputHeight val zDim = cycles * 2 + 2 + 1 val wDim = cycles * 2 + 2 + 1 def populate1(bs: Array[Byte]): Unit = for { y <- 0 until inputHeight x <- 0 until inputWidth if input(y)(x) == '#' } bs((cycles + 1) * xDim * yDim + (cycles + 1 + y) * xDim + (cycles + 1) + x) = 1 def populate2(bs: Array[Byte]): Unit = for { y <- 0 until inputHeight x <- 0 until inputWidth if input(y)(x) == '#' } bs((cycles + 1) * zDim * yDim * xDim + (cycles + 1) * xDim * yDim + (cycles + 1 + y) * xDim + (cycles + 1) + x) = 1 def loop1(board: Array[Byte], board2: Array[Byte], cycle: Int = 0): Unit = val start = cycles - cycle var z = start while (z < zDim - start) do val z1 = (z - 1) * xDim * yDim val z2 = z * xDim * yDim val z3 = (z + 1) * xDim * yDim var y = start while (y < yDim - start) do val y1 = (y - 1) * xDim val y2 = y * xDim val y3 = (y + 1) * xDim var x = 1 while x < xDim - spec.length() do val x1 = (x - 1) val x2 = x val x3 = (x + 1) val sum = BV.fromArray(spec, board, z1 + y1 + x1) + BV.fromArray(spec, board, z1 + y1 + x2) + BV.fromArray(spec, board, z1 + y1 + x3) + BV.fromArray(spec, board, z1 + y2 + x1) + BV.fromArray(spec, board, z1 + y2 + x2) + BV.fromArray(spec, board, z1 + y2 + x3) + BV.fromArray(spec, board, z1 + y3 + x1) + BV.fromArray(spec, board, z1 + y3 + x2) + BV.fromArray(spec, board, z1 + y3 + x3) + BV.fromArray(spec, board, z2 + y1 + x1) + BV.fromArray(spec, board, z2 + y1 + x2) + BV.fromArray(spec, board, z2 + y1 + x3) + BV.fromArray(spec, board, z2 + y2 + x1) + // BV.fromArray(spec, board, z2 + y2 + x3) + // BV.fromArray(spec, board, z2 + y3 + x1) + BV.fromArray(spec, board, z2 + y3 + x2) + BV.fromArray(spec, board, z2 + y3 + x3) + BV.fromArray(spec, board, z3 + y1 + x1) + BV.fromArray(spec, board, z3 + y1 + x2) + BV.fromArray(spec, board, z3 + y1 + x3) + BV.fromArray(spec, board, z3 + y2 + x1) + BV.fromArray(spec, board, z3 + y2 + x2) + BV.fromArray(spec, board, z3 + y2 + x3) + BV.fromArray(spec, board, z3 + y3 + x1) + BV.fromArray(spec, board, z3 + y3 + x2) + BV.fromArray(spec, board, z3 + y3 + x3) val act = BV.fromArray(spec, board, z2 + y2 + x2).eq(1.toByte) val m3 = sum.eq(3.toByte) val m23 = sum.eq(2.toByte).or(m3) val next = BV.broadcast(spec, 0).blend(BV.broadcast(spec, 1), (m23.and(act)).or(act.not.and(m3))) next.intoArray(board2, z2 + y2 + x) x += spec.length() y += 1 z += 1 if cycle < (cycles - 1) then loop1(board2, board, cycle + 1) def loop2(board: Array[Byte], board2: Array[Byte], cycle: Int = 0): Unit = val start = cycles - cycle var w = start while (w < wDim - start) do val w1 = (w - 1) * xDim * yDim * zDim val w2 = w * xDim * yDim * zDim val w3 = (w + 1) * xDim * yDim * zDim var z = start while (z < zDim - start) do val z1 = (z - 1) * xDim * yDim val z2 = z * xDim * yDim val z3 = (z + 1) * xDim * yDim var y = start while (y < yDim - start) do val y1 = (y - 1) * xDim val y2 = y * xDim val y3 = (y + 1) * xDim var x = 1 while x < xDim - spec.length() do val x1 = (x - 1) val x2 = x val x3 = (x + 1) val sum = BV.fromArray(spec, board, w1 + z1 + y1 + x1) + BV.fromArray(spec, board, w1 + z1 + y1 + x2) + BV.fromArray(spec, board, w1 + z1 + y1 + x3) + BV.fromArray(spec, board, w1 + z1 + y2 + x1) + BV.fromArray(spec, board, w1 + z1 + y2 + x2) + BV.fromArray(spec, board, w1 + z1 + y2 + x3) + BV.fromArray(spec, board, w1 + z1 + y3 + x1) + BV.fromArray(spec, board, w1 + z1 + y3 + x2) + BV.fromArray(spec, board, w1 + z1 + y3 + x3) + BV.fromArray(spec, board, w1 + z2 + y1 + x1) + BV.fromArray(spec, board, w1 + z2 + y1 + x2) + BV.fromArray(spec, board, w1 + z2 + y1 + x3) + BV.fromArray(spec, board, w1 + z2 + y2 + x1) + BV.fromArray(spec, board, w1 + z2 + y2 + x2) + BV.fromArray(spec, board, w1 + z2 + y2 + x3) + BV.fromArray(spec, board, w1 + z2 + y3 + x1) + BV.fromArray(spec, board, w1 + z2 + y3 + x2) + BV.fromArray(spec, board, w1 + z2 + y3 + x3) + BV.fromArray(spec, board, w1 + z3 + y1 + x1) + BV.fromArray(spec, board, w1 + z3 + y1 + x2) + BV.fromArray(spec, board, w1 + z3 + y1 + x3) + BV.fromArray(spec, board, w1 + z3 + y2 + x1) + BV.fromArray(spec, board, w1 + z3 + y2 + x2) + BV.fromArray(spec, board, w1 + z3 + y2 + x3) + BV.fromArray(spec, board, w1 + z3 + y3 + x1) + BV.fromArray(spec, board, w1 + z3 + y3 + x2) + BV.fromArray(spec, board, w1 + z3 + y3 + x3) + BV.fromArray(spec, board, w2 + z1 + y1 + x1) + // BV.fromArray(spec, board, w2 + z1 + y1 + x2) + BV.fromArray(spec, board, w2 + z1 + y1 + x3) + BV.fromArray(spec, board, w2 + z1 + y2 + x1) + BV.fromArray(spec, board, w2 + z1 + y2 + x2) + BV.fromArray(spec, board, w2 + z1 + y2 + x3) + BV.fromArray(spec, board, w2 + z1 + y3 + x1) + BV.fromArray(spec, board, w2 + z1 + y3 + x2) + BV.fromArray(spec, board, w2 + z1 + y3 + x3) + BV.fromArray(spec, board, w2 + z2 + y1 + x1) + BV.fromArray(spec, board, w2 + z2 + y1 + x2) + BV.fromArray(spec, board, w2 + z2 + y1 + x3) + BV.fromArray(spec, board, w2 + z2 + y2 + x1) + // BV.fromArray(spec, board, w2 + z2 + y2 + x3) + // BV.fromArray(spec, board, w2 + z2 + y3 + x1) + BV.fromArray(spec, board, w2 + z2 + y3 + x2) + BV.fromArray(spec, board, w2 + z2 + y3 + x3) + BV.fromArray(spec, board, w2 + z3 + y1 + x1) + BV.fromArray(spec, board, w2 + z3 + y1 + x2) + BV.fromArray(spec, board, w2 + z3 + y1 + x3) + BV.fromArray(spec, board, w2 + z3 + y2 + x1) + BV.fromArray(spec, board, w2 + z3 + y2 + x2) + BV.fromArray(spec, board, w2 + z3 + y2 + x3) + BV.fromArray(spec, board, w2 + z3 + y3 + x1) + BV.fromArray(spec, board, w2 + z3 + y3 + x2) + BV.fromArray(spec, board, w2 + z3 + y3 + x3) + BV.fromArray(spec, board, w3 + z1 + y1 + x1) + // BV.fromArray(spec, board, w3 + z1 + y1 + x2) + BV.fromArray(spec, board, w3 + z1 + y1 + x3) + BV.fromArray(spec, board, w3 + z1 + y2 + x1) + BV.fromArray(spec, board, w3 + z1 + y2 + x2) + BV.fromArray(spec, board, w3 + z1 + y2 + x3) + BV.fromArray(spec, board, w3 + z1 + y3 + x1) + BV.fromArray(spec, board, w3 + z1 + y3 + x2) + BV.fromArray(spec, board, w3 + z1 + y3 + x3) + BV.fromArray(spec, board, w3 + z2 + y1 + x1) + BV.fromArray(spec, board, w3 + z2 + y1 + x2) + BV.fromArray(spec, board, w3 + z2 + y1 + x3) + BV.fromArray(spec, board, w3 + z2 + y2 + x1) + BV.fromArray(spec, board, w3 + z2 + y2 + x2) + BV.fromArray(spec, board, w3 + z2 + y2 + x3) + BV.fromArray(spec, board, w3 + z2 + y3 + x1) + BV.fromArray(spec, board, w3 + z2 + y3 + x2) + BV.fromArray(spec, board, w3 + z2 + y3 + x3) + BV.fromArray(spec, board, w3 + z3 + y1 + x1) + BV.fromArray(spec, board, w3 + z3 + y1 + x2) + BV.fromArray(spec, board, w3 + z3 + y1 + x3) + BV.fromArray(spec, board, w3 + z3 + y2 + x1) + BV.fromArray(spec, board, w3 + z3 + y2 + x2) + BV.fromArray(spec, board, w3 + z3 + y2 + x3) + BV.fromArray(spec, board, w3 + z3 + y3 + x1) + BV.fromArray(spec, board, w3 + z3 + y3 + x2) + BV.fromArray(spec, board, w3 + z3 + y3 + x3) val act = BV.fromArray(spec, board, w2 + z2 + y2 + x2).eq(1.toByte) val m3 = sum.eq(3.toByte) val m23 = sum.eq(2.toByte).or(m3) val next = BV.broadcast(spec, 0).blend(BV.broadcast(spec, 1), (m23.and(act)).or(act.not.and(m3))) next.intoArray(board2, w2 + z2 + y2 + x2) x += spec.length() y += 1 z += 1 w += 1 if cycle < (cycles - 1) then loop2(board2, board, cycle + 1) def part1: Int = val board = Array.ofDim[Byte](zDim * yDim * xDim) val board2 = Array.ofDim[Byte](zDim * yDim * xDim) populate1(board) loop1(board, board2) sumBytes(board) def part2: Int = val board = Array.ofDim[Byte](wDim * zDim * yDim * xDim) val board2 = Array.ofDim[Byte](wDim * zDim * yDim * xDim) populate2(board) loop2(board, board2) sumBytes(board) def sumBytes(xs: Array[Byte]): Int = val specS = spec.withLanes(java.lang.Short.TYPE) val mask = ShortVector.broadcast(specS, 0x00FF) var acc = ShortVector.broadcast(specS, 0) var i = 0 while i < spec.loopBound(xs.length) do var bv = BV.fromArray(spec, xs, i) var sv = bv.reinterpretAsShorts() acc = acc.add(sv.and(mask)) acc = acc.add(sv.lanewise(VectorOperators.LSHR, 8).and(mask)) i += spec.length() var accTail = 0 while i < xs.length do accTail += xs(i) & 0xFF i += 1 acc.reduceLanes(VectorOperators.ADD) + accTail def main(args: Array[String]): Unit = part1.pipe(println) part2.pipe(println)

Dold text
PermalÀnk
Medlem ★
●

Sneglade nervöst pÄ awk nÀr jag insÄg att frÄgan idag handlade om parsing/evaluering av uttryck, men det gick ann.

Idag hade jag ett parsing-problem som inte manifesterade i exemplet, sÄ det var lite jobbigt att fÄ fel svar nÀr allt sÄg sÄ rÀtt ut..

part1$ <in awk -v p1=1 -f d18.awk part2$ <in awk -f d18.awk

d18.awk

{ expr = $0 while (expr ~ /\(/) { paren_start = match(expr, /\([0-9]+( [+*] [0-9]+)+\)/) sub_expr = substr(expr, paren_start + 1) paren_end = match(sub_expr, /\)/) sub_expr = substr(sub_expr, 1, paren_end - 1) val = p1 ? eval(sub_expr) : eval_with_precedence(sub_expr) expr = substr(expr, 1, paren_start - 1) val substr(expr, paren_start + paren_end + 1) } sum += p1 ? eval(expr) : eval_with_precedence(expr) } END { print sum } function eval(expr) { split(expr, e) res = e[1] for (i = 2; i <= length(e); i += 2) { res = e[i] == "+" ? res + e[i + 1] : res * e[i + 1] } return res } function eval_with_precedence(expr) { while (expr ~ /\+/ && expr ~ /\*/) { plus_start = match(expr, /[0-9]+( \+ [0-9]+)+/) sub_expr = substr(expr, plus_start) sub_expr = sub_expr ~ /\*/ ? substr(sub_expr, 1, match(sub_expr, /\*/) - 2) : sub_expr expr = substr(expr, 1, plus_start - 1) eval(sub_expr) substr(expr, plus_start + length(sub_expr)) } return eval(expr) }

Dag 18, awk
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 ★
●

Jag var fast besluten att anvÀnda min kompileringskunstruktionskunskaper, nyttja BNF, och implementera en RDP. Jag tyckte jag var pÄ rÀtt vÀg, men jag fick inte riktigt ihop det. Sen började arbetsdagen och nu har jag bordlagt dagens uppgift tills jag fÄr feeling.

Dold text
Visa signatur

:(){ :|:& };:

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

PermalÀnk
Datavetare ★
●

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

TÀnkte direkt dÀr jag sÄg detta: ett fall för shunting yard algoritm, körde den direkt pÄ del 1 för utgick nÀstan frÄn att de del 2 skulle göra nÄgot med operatorprioritet i del 2.

Shunting yard tar nÄgot som Àr i infix notation och konverterar det till i mitt fall reverse polish notation. NÀr man har det pÄ RPN Àr det trivialt att evaluera m.h.a. av en stack.

Dold text
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: 18
SprÄk: Nim
Lösning: Github

Precis som @Yoshman körde jag med Shunting Yard algorithm (Àven om jag först försökte mig pÄ att bara loopa genom uttrycket frÄn början till slut, vilket gick Ät skogen med alla parenteser).

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

Dag: 17
SprÄk: Go
Lösning: Main, Paket för Block

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

Jag fick ta hjÀlp av Internet för att lösa Del 1, men min slutliga lösning Àr vÀldigt inspirerad av Dag 11. Stora skillnaden frÄn Dag 11 Àr:

  1. jag anvÀnder en []Cube för att hÄlla koll pÄ aktiva koordinater

  2. jag anvÀnder map[Cube]int under sjÀlva simuleringen för att mappa koordinater till aktiva grannar

Den hÀr lösningen Àr utökbar till godtyckligt mÄnga dimensioner, vilket gjorde steget mellan Del 1 och Del 2 trivial.

Dold text

Dag: 18
SprÄk: Go
Lösning: Main, Special Sauce Algorithm

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

Tack @Yoshman, för att du nÀmnde Shunting-yard Algorithm!

Som jag skrev i min tidigare post var jag helt inne pÄ att parsea jÀrnet och gÄ full-out-kompileringskonstruktion pÄ det hÀr problemet. Sen lÀste jag Wikipedia-artikeln för Shunting-yard och insÄg att det mÄste vara EXAKT det hÀr författaren tÀnkte.

Jag Àr extremt nöjd med att jag lyckades fÄ till en lösning dÀr man skickar in sitt uttryck och sina aritmetikregler.

ShuntingYard(expression []string, precedence map[string]int) int

Enda skillnaden pÄ Del 1 och Del 2 blev alltsÄ ett tecken! En etta istÀllet för en nolla

func part1(input []string) int { res := 0 precedenceMap := make(map[string]int) precedenceMap["+"] = 0 precedenceMap["*"] = 0 for _, row := range input { elems := strings.Split(strings.ReplaceAll(row, " ", ""), "") res += util.ShuntingYard(elems, precedenceMap) } return res } func part2(input []string) int { res := 0 precedenceMap := make(map[string]int) precedenceMap["+"] = 1 precedenceMap["*"] = 0 for _, row := range input { elems := strings.Split(strings.ReplaceAll(row, " ", ""), "") res += util.ShuntingYard(elems, precedenceMap) } return res }

Dold text
Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●

Dag 18, Python: De var sÄ lika uppgifterna sÄ jag ville dela kod mellan dem och det gick, men det Àr inte helt lÀtt att förstÄ vad koden gör. Det blev en del parametrar.

from operator import add, mul oper = {'+': add, '*': mul} def term(s, f, acc, op): if s[0] == '(': v, s = ev(s[1:], f) return op(acc,v), s return op(acc, int(s[0])), s[1:] def factor(s, f, acc, op): v1, s = term(s, f, 0, add) while s[0] == '+': v1, s = term(s[1:], f, v1, add) return op(acc, v1), s def ev(s, f): acc, s = f(s, f, 0, add) while s[0] != '\n': if s[0] == ')': return acc, s[1:] acc, s = f(s[1:], f, acc, op[s[0]]) return acc print(sum([ev(line.replace(' ', ''), term) for line in open('input')]), sum([ev(line.replace(' ', ''), factor) for line in open('input')]))

Dold text
PermalÀnk
Medlem ★
●

Idag var inte rolig FÄr se om jag tar mig an den efter jul, men idag tror jag bestÀmt jag ska gÄ ut i vackra vÀdret istÀllet!

Visa signatur

:(){ :|:& };:

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

PermalÀnk
●
Skrivet av GLaDER:

Idag var inte rolig FÄr se om jag tar mig an den efter jul, men idag tror jag bestÀmt jag ska gÄ ut i vackra vÀdret istÀllet!

KÀnner lite samma. Efter mÄnga om och men klarade jag del 1 men del 2 har jag kört fast hÄrt pÄ nu. NÄgon sol har jag inte heller att njuta av hÀr

PermalÀnk
Datavetare ★
●

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

Fattade inte riktigt hur man skulle anvĂ€nda de tips man fick i del 2, gjorde en lösning som sĂ„ vitt jag kan se borde ta vilka regler som helst. Möjligen har min lösning exponentiell eller i alla fall >O(NÂČ) komplexitet, men det spelar ingen roll dĂ„ det faktiska problemet tog <1s att lösa.

I grunden gjorde jag detta: applicera reglerna, returnera alla (initialt för del 1 blev det bara ett fall) sekvenser av meddelanden dÀr applicering av regler inte passerat slutet av meddelandet. PÄ toppen, i match(), gÄr jag igenom alla returnerade fall, om nÄgot har noll tecken kvar har det matchat nÄgon kombination av regelverket.

$ swift run -c release 🌟 Part 1 : 139 ⌚ Elapsed : 71 ms 🌟 Part 2 : 289 ⌚ Elapsed : 570 ms

Edit: en optimering som antagen ger en hel del prestanda i detta fall Àr att jag lÀser in reglerna i en Dictionary<RuleId, Rule>, kollar sedan högsta RuleId och lÀgger över allt i en Array<Rule> dÀr index Àr RuleId.

Verkar som hash tabeller Àr en allt sÀmre idé ju mer CPUn Àr kapabel att utföra per cykel, sÄ Apples M1 Àr inte polare med hash-tabeller...

Dold text
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 GLaDER:

Dag: 18
SprÄk: Go
Lösning: Main, Special Sauce Algorithm

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

Tack @Yoshman, för att du nÀmnde Shunting-yard Algorithm!

Som jag skrev i min tidigare post var jag helt inne pÄ att parsea jÀrnet och gÄ full-out-kompileringskonstruktion pÄ det hÀr problemet. Sen lÀste jag Wikipedia-artikeln för Shunting-yard och insÄg att det mÄste vara EXAKT det hÀr författaren tÀnkte.

Jag Àr extremt nöjd med att jag lyckades fÄ till en lösning dÀr man skickar in sitt uttryck och sina aritmetikregler.

ShuntingYard(expression []string, precedence map[string]int) int

Enda skillnaden pÄ Del 1 och Del 2 blev alltsÄ ett tecken! En etta istÀllet för en nolla

func part1(input []string) int { res := 0 precedenceMap := make(map[string]int) precedenceMap["+"] = 0 precedenceMap["*"] = 0 for _, row := range input { elems := strings.Split(strings.ReplaceAll(row, " ", ""), "") res += util.ShuntingYard(elems, precedenceMap) } return res } func part2(input []string) int { res := 0 precedenceMap := make(map[string]int) precedenceMap["+"] = 1 precedenceMap["*"] = 0 for _, row := range input { elems := strings.Split(strings.ReplaceAll(row, " ", ""), "") res += util.ShuntingYard(elems, precedenceMap) } return res }

Dold text

Dag: 19
SprÄk: Go
Lösning: Main

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

Jag vet inte varför, men jag har ett agg gentemot regexp. NÄgon gÄng under universitet var det nÄgot som sa: "Regexp, pfft, det Àr ju bara en dÄlig FSM." eller nÄgot liknande. Sen dess sitter det fast: Regexp Àr fult.

Men idag fick jag svÀlja stoltheten. Jag la flera timmar pÄ att försöka göra en lösning som inte anvÀnde regexp. NÀr jag inte lyckats, trots nÄgra pauser, en löprunda, matlagning, PÄ SpÄret, och nÄgra koppar kaffe, fick jag nog. DÄ jag (av förklarliga skÀl) Àven Àr vÀldigt dÄlig pÄ regexp fick jag söka runt en hel del pÄ nÀtet innan jag förstod hur jag skulle göra.

Lösningen som Àr lÀnkad ovan kan jag dock bara ta delvis cred för. SÀrskilt part 2 Àr nÄgot jag fortfarande inte förstÄr 100%. Innan idag visste jag inte ens att rekursiv regexp Àr en grej Jag fick helt enkelt luslÀsa AoC-subredditen och dÀr snackade folk om rekursiv regexp och delade med sig av sina patterns.

NÀr tillfÀlle ges ska jag ge regexp en chans igen. Det Àr ju onekligen kraftfullt och inför nÀsta Ärs AoC kÀnns det som att det kan vara bra att ha bÀttre koll pÄ!

Dold text
Visa signatur

:(){ :|:& };:

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

PermalÀnk
Datavetare ★
●

Dag: 19
SprÄk: C++/OpenMP
Lösning: Github

HÄller pÄ att verkligen testa vad som fungerar och inte med ARM64 och MacOS. Apple stödjer inte officiellt OpenMP, men har lurat ut ett sÀtt runt detta p.g.a. att Apples kompilator faktist "bara" Àr LLVM/Clang med lite extra patchar för deras CPUer.

Man kan installera ner OpenMP biblioteken via MacPorts

$ sudo port install libomp

Sedan tvinga in kompilatordelen av OpenMP pÄ detta sÀtt (normalt rÀcker "-fopenmp" sÄ Àr det klart) samt lÀnka med libomp frÄn MacPorts sÄ hÀr

clang++ -Xpreprocessor -fopenmp -std=c++17 -O3 -flto -o day19 day19.cpp -L/opt/local/lib/libomp -lomp

Markerade delen Àr "icke-standard", man fÄr lÀnkfel om man inte explicit lÀnkar med en libomp pÄ detta sÀtt. Har alltsÄ MacPort sakerna under /opt/local/... sÄ lÀnkar med det OpenMP bibliotek jag installerat med MacPorts.

GÄr sÀker att fila ned tiderna mer, men ÀndÄ hyfsat speedup mot att bara kör med en CPU-kÀrna

$ ./day19 Part 1 : 139 Took : 16ms Part 2 : 289 Took : 17ms

Dold text
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 19 fastnade jag pÄ men efter sovit pÄ saken sÄ hittade jag en lösning. Hade turen denna gÄng och min första lösning fungerade med del2 ocksÄ. KÀnns som en fin lösning efter alla problem jag hade.

Det som tog tid att tÀnka ut var att resultatet frÄn en regel Ät upp olika lÀngder av tecken och resten meddelandet ska dÄ skickas till nÀsta steg.

Sen klurade jag Àven ut att returnera listor av meddelanden dÀr tom lista Àr att det inte fungerar. En tom strÀng Àr att det fungerar. En string med tecken betyder att dessa tecken kan skickas vidare till nÀsta.

InsÄg Àven att för att vara giltigt behöver en regel minst matas med ett tecken och om det Àr mindre tecken Àn regler kvar sÄ kan vi backa ur.

check_message(message, rule): if "|" in rule: # send both sides to check_message and return list of both sides return value if '"' in rule: #return empty list for false, empty string on exact match, match with remainders then return any remainders of message # list of other rules # 4 # 4 1 # 4 2 4 split = rule.split(" ") result = [message] for i in range(len(split)): new_result = [] one_rule = split[i] #minimum length of remaining message min_length = len(split) - i #remove results that are shorter than minimal result[:] = [x for x in result if len(x) >= min_length] # got all possible ways the first X, now loop through all the possible and send them further for one_result in result: new_result += check_message(one_result, rules[one_rule]) result = new_result return result

Dold text
PermalÀnk
●

Tror minsann att jag fÄr tacka för mig nu, dagens uppgift vÀcker inte mitt intresse det minsta sÄ kÀnner inte att det Àr vÀrt att lÀgga ner halva dagen pÄ den. God jul pÄ er allihopa!

PermalÀnk
Medlem ★
●
Skrivet av huggeMugg:

Tror minsann att jag fÄr tacka för mig nu, dagens uppgift vÀcker inte mitt intresse det minsta sÄ kÀnner inte att det Àr vÀrt att lÀgga ner halva dagen pÄ den. God jul pÄ er allihopa!

You and I both.

Jag la nÄgra timmar under morgonen pÄ att parsea fram datan jag tror jag behöver för Del 1 (lÀnk), men jag pallar inte jobba vidare med lösningen... Det Àr ju naturligt att problemen blir mer och mer invecklade, men hÀr gick grÀnsen för mig. Vi fÄr se om efterföljande dagar bjuder pÄ roligare uppgifter!

Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●

ÄndĂ„ trevligt att man klarat av bĂ„da delar, mot mina egna odds.

Dag: 16
SprÄk: Kotlin
Lösning: GitHub

Men jag hÄller med er, jag Àr ocksÄ trött pÄ att behöva göra miljontals iterations och returnera monstersiffror hela tiden. Det blir sÄ hÄrigt att debugga. Föredrar tex exercism.io som jag tipsat om tidigare i denna trÄd dÀr det Àr varierande uppgifter, en favorit Àr tex dÀr man ska generera tio tusen unika robotnamn. Just den uppgiften Àr ju inte gigantiskt svÄr, men ÀndÄ mer real-life scenario och mer tillfredsstÀllande att lösa.

Tror ocksÄ jag packar ihop, har i alla fall varit enormt lÀrorikt (framförallt hur man ska arbeta med en massa listor inne i en massa listor etc) och ni har varit superhjÀlpsamma. God jul!

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 19, Python.

@Yoshman Tipset i uppgiften var relevant om man gjorde en djupet först-lösning. Om man glatt returnerade nÀr man fick en trÀff missade lösningar.

import string rules, strings = {}, [] for line in open("input"): parts = line.strip().split(': ') if len(parts)== 1: strings.append(parts[0]) continue rules[int(parts[0])] = [[int(i) if i[0] in string.digits else i.replace('"', '') for i in part.split()] for part in parts[1].split(' | ')] def match_sequence(s, seq): if not seq: return [0] return [p + p2 for p in matches(s, seq[0]) for p2 in match_sequence(s[p:], seq[1:])] def matches(s, rule): if not s: return [] if isinstance(rule, str): return [ 1 ] if s[0] == rule else [] return [p for part in rules[rule] for p in match_sequence(s, part)] print(sum([l == len(s) for s in strings for l in matches(s, 0)]))

Dold text
PermalÀnk
Medlem ★
●

Dag 20, Python. Jag tÀnkte inte posta denna eftersom den Àr en imperativ lösning, men om jag Àr först sÄ...

De var snÀlla i uppgiften, pusselbitarna passar bara med en annan bit. Det gör att det Àr lÀtt att hitta hörnen.

LÀgga pusslet var lite pyssligare... Men startar man i hörnen sÄ passar bara en bit. Jag har nÄgon form av problem som gör att jag bara hittar 4 pussellösningar för det fulla input, men jag hade tur och hittade i nessie i en av de jag hittade.

from collections import Counter, defaultdict from numpy import prod import re def value(s): return int(s.translate({35:49,46:48}), 2) def values(s): return [value(s),value(s[::-1])] def readtile(s): lines = s.split('\n') nr = int(lines[0][5:9]) lines = lines[1:11] ledge = "".join([l[0] for l in lines]) hedge = "".join([l[9] for l in lines]) return (nr, lines, (values(lines[0]) + values(lines[9]) + values(ledge) + values(hedge))) tiles = [readtile(t) for t in open("input").read().split('\n\n')] c = Counter(i for t in tiles for i in t[2]) corners = [t[0] for t in tiles if Counter([c[e] for e in t[2]])[1] == 4] print(prod(corners)) def rotate(t): return ["".join([r[len(t) - i - 1] for r in t]) for i in range(len(t))] trimmed_tiles = {} north = defaultdict(list) west = defaultdict(list) def trim_tile(t, nr, index): trim = [l[1:-1] for l in t[1:-1]] n = value(t[0]) w = value("".join([l[0] for l in t])) s = value(t[9]) e = value("".join([l[9] for l in t])) north[n].append((nr, index)) west[w].append((nr, index)) return trim, (n,w,e,s) def rotate_and_flip(tile): trimmed = [] nr, t = tile[0], tile[1] for i in range(4): trimmed.append(trim_tile(t, nr, i)) t = rotate(t) t = t[::-1] for i in range(4): trimmed.append(trim_tile(t, nr, i + 4)) t = rotate(t) trimmed_tiles[nr] = trimmed for t in tiles: rotate_and_flip(t) def get_direction(prev, i, dir, dirdict): result = [] while True: t = trimmed_tiles[prev] result.append((prev,i)) next = t[i][1][dir] l = list(filter(lambda x: x[0] != prev, dirdict[next])) if not l: return result prev, i = l[0] def solve(corner): c = trimmed_tiles[corner] solutions =[] for rotation in range(8): edges = c[rotation][1] if len(north[edges[0]]) == 1 and len(west[edges[1]]) == 1: print() row = get_direction(corner, rotation, 3, north) solutions.append([get_direction(tile, index, 2, west) for tile, index in row]) return solutions def get_image(solution): return ["".join(z) for l in solution for z in zip(*[trimmed_tiles[t][i][0] for t,i in l])] def find_nessie(img, line, pos): m1 = re.search('#....##....##....###', img[line][pos:]) if m1: pos += m1.start() m2 = re.search('.#..#..#..#..#..#', img[line + 1][pos:]) m3 = re.search('..................#', img[line][pos:]) if m2 and m3 and m2.start() == 0 and m3.start() == 0: return 1 + find_nessie(img, line, pos + 1) return 0 for c in corners: solutions = solve(c) for s in solutions: img = get_image(s) monster = 0 for i in range(len(img) - 1): monster += find_nessie(img, i + 1, 0) if monster: print(sum([l.count('#') for l in img]) - monster * 15)

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

Dag 20, Python. Jag tÀnkte inte posta denna eftersom den Àr en imperativ lösning, men om jag Àr först sÄ...

De var snÀlla i uppgiften, pusselbitarna passar bara med en annan bit. Det gör att det Àr lÀtt att hitta hörnen.

LÀgga pusslet var lite pyssligare... Men startar man i hörnen sÄ passar bara en bit. Jag har nÄgon form av problem som gör att jag bara hittar 4 pussellösningar för det fulla input, men jag hade tur och hittade i nessie i en av de jag hittade.

from collections import Counter, defaultdict from numpy import prod import re def value(s): return int(s.translate({35:49,46:48}), 2) def values(s): return [value(s),value(s[::-1])] def readtile(s): lines = s.split('\n') nr = int(lines[0][5:9]) lines = lines[1:11] ledge = "".join([l[0] for l in lines]) hedge = "".join([l[9] for l in lines]) return (nr, lines, (values(lines[0]) + values(lines[9]) + values(ledge) + values(hedge))) tiles = [readtile(t) for t in open("input").read().split('\n\n')] c = Counter(i for t in tiles for i in t[2]) corners = [t[0] for t in tiles if Counter([c[e] for e in t[2]])[1] == 4] print(prod(corners)) def rotate(t): return ["".join([r[len(t) - i - 1] for r in t]) for i in range(len(t))] trimmed_tiles = {} north = defaultdict(list) west = defaultdict(list) def trim_tile(t, nr, index): trim = [l[1:-1] for l in t[1:-1]] n = value(t[0]) w = value("".join([l[0] for l in t])) s = value(t[9]) e = value("".join([l[9] for l in t])) north[n].append((nr, index)) west[w].append((nr, index)) return trim, (n,w,e,s) def rotate_and_flip(tile): trimmed = [] nr, t = tile[0], tile[1] for i in range(4): trimmed.append(trim_tile(t, nr, i)) t = rotate(t) t = t[::-1] for i in range(4): trimmed.append(trim_tile(t, nr, i + 4)) t = rotate(t) trimmed_tiles[nr] = trimmed for t in tiles: rotate_and_flip(t) def get_direction(prev, i, dir, dirdict): result = [] while True: t = trimmed_tiles[prev] result.append((prev,i)) next = t[i][1][dir] l = list(filter(lambda x: x[0] != prev, dirdict[next])) if not l: return result prev, i = l[0] def solve(corner): c = trimmed_tiles[corner] solutions =[] for rotation in range(8): edges = c[rotation][1] if len(north[edges[0]]) == 1 and len(west[edges[1]]) == 1: print() row = get_direction(corner, rotation, 3, north) solutions.append([get_direction(tile, index, 2, west) for tile, index in row]) return solutions def get_image(solution): return ["".join(z) for l in solution for z in zip(*[trimmed_tiles[t][i][0] for t,i in l])] def find_nessie(img, line, pos): m1 = re.search('#....##....##....###', img[line][pos:]) if m1: pos += m1.start() m2 = re.search('.#..#..#..#..#..#', img[line + 1][pos:]) m3 = re.search('..................#', img[line][pos:]) if m2 and m3 and m2.start() == 0 and m3.start() == 0: return 1 + find_nessie(img, line, pos + 1) return 0 for c in corners: solutions = solve(c) for s in solutions: img = get_image(s) monster = 0 for i in range(len(img) - 1): monster += find_nessie(img, i + 1, 0) if monster: print(sum([l.count('#') for l in img]) - monster * 15)

Dold text

Lite kortare Àn mina 1000 rader kod

PermalÀnk
Medlem ★
●

Dag 21. Del 1
Jag har provat radera alla ingredienser som har gemensam contains. FÄr det till 367 men det Àr fel.
Varför kan inte kfcds, nhms, sbzzf, och trh ha allergen?

PermalÀnk
Datavetare ★
●

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

Ingen vacker lösning... Började lite illa dÄ jag glömde att "struct" i Swift Àr "by-value", hÀnder inte sÄ mycket nÀr man modifierar kopior av saker nÀr man tÀnker pÄ dem som "by-ref".

Swift Àr helt rÀtt designat hÀr, att ha distinktionen "struct by-value" och "class by-ref" Àr vÀldigt anvÀndbar bara man har det hela klart för sig...

Vet inte riktigt varför jag fick för mig att spara innehÄllet i varje pusselbit som en "UInt64", missriktad initial optimering bara för det gick men kanske inte helt optimalt nÀr man skulle rotera och flippa bitarna. Löste sig ÀndÄ tillslut.

Första delen var enkel, tittar pÄ varje pusselbit och kollar vilka andra bitar som passar vÀnster, uppe, höger och nedtill. Hörnbitarna Àr sedan de som har tvÄ tomma samt tvÄ inpassade bitar intill varandra. Ramen Àr de som som har en tom del.

Andra delen löses genom att ta en hörbit och rotera den motsvarande övre vÀnstra hörnet. Sedan roteras/flippas resten av bitarna sÄ pusselbiten ovan/vÀnster endera Àr ramen alt. tvÄ pusselbitar man redan roterat/flippat rÀtt (dÄ man startar över/vÀnstra och gÄr rad för rad nedÄt).

Genererade alla tÀnkbara variationer (8 st) av monstret och kollade om alla punkter i monstret tÀcker punkter i bilden, om sÄ ta bort alla matchade punkter och fortsÀtt. RÀknat antalet punkter som Àr kvar i bilden -> svar del 2.

$ swift run -c release 🌟 Part 1 : 8425574315321 ⌚ Elapsed : 0 ms 🌟 Part 2 : 1841 ⌚ Elapsed : 3 ms

Dold text
Postade output frÄn debug-bygge
Visa signatur

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

PermalÀnk
Datavetare ★
●

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

Är det inte lite otydligt beskrivet i del 1? Antagandet man mĂ„ste göra Ă€r att varje allergen finns i exakt en ingrediens, annars vet jag inte riktigt hur man kan utesluta nĂ„got alls.

Antar man det kan man lÀgga in alla ingredienser som potentiella allergener första gÄngen man ser en allergen. Följande gÄnger tar man listan med ingredienser och tar snittet mellan den sparade mÀngden ingredienser för en viss allergen med listan med ingredienser i aktuellt matrÀtt.

Kvar fÄr man dÄ de ingredienser som innehÄller nÄgon allergen, komplementet till den mÀngden Àr de ingredienser man ska rÀkna antalet pÄ -> svar pÄ del 1.

I del 2 jobbar man vidare pÄ allergen->mÀngden ingredienser som kan innehÄlla den, pocka bort och spara i en annan lista de allergener som bara mappar mot en enda ingrediens. Gör detta tills alla har en unik allergen, sortera listan som skapades efter namnet pÄ allergen och skriv ut associerad matrÀtt -> svar pÄ del 2.

$ swift run -c release 🌟 Part 1 : 2826 ⌚ Elapsed : 0 ms 🌟 Part 2 : pbhthx,sqdsxhb,dgvqv,csnfnl,dnlsjr,xzb,lkdg,rsvlb ⌚ Elapsed : 0 ms

Dold text
Visa signatur

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

PermalÀnk
Datavetare ★
●
Skrivet av Larrxi:

Dag 21. Del 1
Jag har provat radera alla ingredienser som har gemensam contains. FÄr det till 367 men det Àr fel.
Varför kan inte kfcds, nhms, sbzzf, och trh ha allergen?

Funderade ocksÄ rÀtt lÀnge pÄ vad som faktiskt sÀgs i del 1. Om man antar att en viss allergen bara kan finnas i exakt en ingrediens sÄ kan man utesluta de du listar dÄ de 3 allergener man har i exemplet mÄste finnas i mxmxvkd, sqjhc eller fvjkl

Är detta jag hade i exemplet efter man kör beskrivningen hĂ€r

["fish": Set(["mxmxvkd", "sqjhc"]), "soy": Set(["fvjkl", "sqjhc"]), "dairy": Set(["mxmxvkd"])]

DÄ alla allergen har en icke tom mÀngd med potentiella ingrediens gissade jag att problemstÀllningen förutsÀtter att dessa inte kan finnas i mxmxvkd, sqjhc eller fvjkl.

Men som uppgiften Àr skriven skulle mxmxvkd, sqjhc eller fvjkl kunna innehÄlla andra allergener...

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 Yoshman:

Är det inte lite otydligt beskrivet i del 1? Antagandet man mĂ„ste göra Ă€r att varje allergen finns i exakt en ingrediens, annars vet jag inte riktigt hur man kan utesluta nĂ„got alls.

Skrivet av AoC:

Each allergen is found in exactly one ingredient.

Ganska tydligt ÀndÄ. Det Àr vÀldigt lÀtt att missa dessa detaljer dock. En hel ny uppsjö av dem varje dag.

---

Mina awk-lösningar frĂ„n dag 19 blev en rejĂ€l soppa, sĂ„ tordes inte posta hĂ€r. Är det nĂ„got jag visat för mig sjĂ€lv dock, sĂ„ Ă€r det att man kan lösa det mesta med awk i vĂ€g av "enkel" processing av text-input, om man Ă€r tĂ„lmodig och envis nog..

Mina tvÄ frÀmsta problem med awk Àn sÄ lÀnge har varit;
1) NÄgot jag var inne pÄ tidigare, allt Àr bara strÀngar och hasmaps. IgÄr tex. (dag 20) löste jag genom att serialisera tiles och dess transformationer och arbeta pÄ serialiserad data, och det gÄr vÀl ann, men det blir en del extra att hÄlla i huvudet.
2) Denna har slagit hĂ„rt pĂ„ sistonde, sĂ€rskilt dag 19.. bristen pĂ„ lokalt scope! Jag tror att funktions-argument Ă€r det enda som "fastnar", allt annat hamnar i globalt scope. Är det inte att jag glömmer att noll-sĂ€tta nĂ„gon variabel nĂ„gonstans, sĂ„ vĂ€rden inte blöder mellan anropen.. sĂ„ Ă€r det att jag rĂ„kar anvĂ€nda samma namn för nĂ„gon variabel pĂ„ tvĂ„ olika stĂ€llen, och plötsligt löper inte en loop som jag tĂ€nkt. Eller vĂ€rst av allt, rekursion! Hur kul Ă€r det nĂ€r man kommer tillbaka frĂ„n funktions-anropet till sig sjĂ€lv, och alla variabler man hade "lokalt" nu Ă€r överskrivna? Det finns sĂ„klart relativt enkla lösningar till dessa saker, men det Ă€r nĂ„got som biter mig nĂ€stan varje dag nu.

4 dagar kvar! Kan inte ge upp pÄ awk nu.. Vet inte var jag lÀste det, men nÄgon sa en gÄng att awk Àr inte ett programmeringssprÄk eller verktyg, det Àr ett konstverk.. och jag tror jag mÄste hÄlla med Som ett sprÄk Àr det hemskt, men jag Àr ÀndÄ ganska fascinerad av det. Vanligtvis drar jag mig mer Ät striktare sprÄk som Rust och Haskell, men nu undrar jag om jag kanske bör titta lite pÄ Perl hÀr nÀst.

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

Ganska tydligt ÀndÄ. Det Àr vÀldigt lÀtt att missa dessa detaljer dock. En hel ny uppsjö av dem varje dag.

Haha, sÄ sant! Vet inte vad jag ska skylla pÄ, handla eventuellt om att jag brukar lÀsa problemen pÄ mobilen(!) i samband med frukost och sedan fÄr problemet ligga och snurra runt lite under hundpromenad och morgonens arbetsrelaterade sysslor, för att sedan kasta sig in i kodandet nÀr tillfÀlle ges.

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

Skrev de om problemet under dagen? Nu nÀr jag lÀser igen ser det tydligare ut Àn jag uppfattade det i morse.

Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Dag: 19
SprÄk: Go
Lösning: Main

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

Jag vet inte varför, men jag har ett agg gentemot regexp. NÄgon gÄng under universitet var det nÄgot som sa: "Regexp, pfft, det Àr ju bara en dÄlig FSM." eller nÄgot liknande. Sen dess sitter det fast: Regexp Àr fult.

Men idag fick jag svÀlja stoltheten. Jag la flera timmar pÄ att försöka göra en lösning som inte anvÀnde regexp. NÀr jag inte lyckats, trots nÄgra pauser, en löprunda, matlagning, PÄ SpÄret, och nÄgra koppar kaffe, fick jag nog. DÄ jag (av förklarliga skÀl) Àven Àr vÀldigt dÄlig pÄ regexp fick jag söka runt en hel del pÄ nÀtet innan jag förstod hur jag skulle göra.

Lösningen som Àr lÀnkad ovan kan jag dock bara ta delvis cred för. SÀrskilt part 2 Àr nÄgot jag fortfarande inte förstÄr 100%. Innan idag visste jag inte ens att rekursiv regexp Àr en grej Jag fick helt enkelt luslÀsa AoC-subredditen och dÀr snackade folk om rekursiv regexp och delade med sig av sina patterns.

NÀr tillfÀlle ges ska jag ge regexp en chans igen. Det Àr ju onekligen kraftfullt och inför nÀsta Ärs AoC kÀnns det som att det kan vara bra att ha bÀttre koll pÄ!

Dold text

Dag: 21
SprÄk: Go
Lösning: Main

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

See @Yoshmans beskrivning. Jag följde den

Dold text
Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Dag: 21
SprÄk: Go
Lösning: Main

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

See @Yoshmans beskrivning. Jag följde den

Dold text

Dag: 22
SprÄk: Go
Lösning: Main

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

Idag var det straight forward och kul En av mina bÀttre placeringar pÄ Del 1, trots att jag klantade mig lite med summeringen av slutresultatet. DÀremot Àr jag kass pÄ rekursion sÄ det tog lite för lÄng tid att lösa Del 2, Àven om tanken var rÀtt frÄn början.

Dold text
Visa signatur

:(){ :|:& };:

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