🌟 Advent of Code (AoC) 2021 🌟

PermalÀnk
●

Dag: 2
SprÄk: Rust
Lösning: Github

use std::fs; pub fn run() { let data = fs::read_to_string("dec_02.txt").expect("unable to read file"); println!("part1 {}", part1(&data)); println!("part2 {}", part2(&data)); } fn part1(data: &String) -> u32 { let mut distance = 0; let mut depth = 0; for line in data.lines() { let mut chars = line.chars(); let first = chars.next(); let num = chars.last().unwrap().to_digit(10).unwrap(); match first { Some('f') => distance += num, Some('d') => depth += num, Some('u') => depth -= num, _ => println!("Bad data"), } } distance * depth } fn part2(data: &String) -> u32 { let mut distance = 0; let mut depth = 0; let mut aim = 0; for line in data.lines() { let mut chars = line.chars(); let first = chars.next(); let num = chars.last().unwrap().to_digit(10).unwrap(); match first { Some('f') => { distance += num; depth += num * aim; }, Some('d') => aim += num, Some('u') => aim -= num, _ => println!("Bad data"), } } distance * depth }

Dold text
PermalÀnk
Medlem
●

Dag: 2
SprÄk: Dyalog APL & Scala

Dyalog APL:

input←⊃⎕nget'2.txt'1 h d←0 forward←{h+←⍔} up←{d-←⍔} down←{d+←⍔} ⍎šinput h×d h d a←0 forward←{h+←⍔ ⋄ d+←aĂ—â”} up←{a-←⍔} down←{a+←⍔} ⍎šinput h×d

Beskrivning:

Programmet tolkar textfilen som apl kod. (⍎šinput = execute each input)

f←{âș ⍔} Ă€r ett av sĂ€tten man kan skapa egna funktioner eller lambdas i apl. alpha âș = argumentet till vĂ€nster om funktionen och omega ⍔ = argumentet till höger.

⍝ Division som funktion Div←{âșĂ·â”} 10 Div 2 5 ⍝ Division som lambda 10 {âșĂ·â”} 2 5

⍝ Kommentar
⋄ Statement Separator - motsvarar ; i andra sprĂ„k

Dold text

Scala:

val input = Using.resource(Source.fromFile("2.txt"))(_.getLines().toList) input .foldLeft((0, 0)) { case ((h, d), s"forward $n") => (h + n.toInt, d) case ((h, d), s"up $n") => (h, d - n.toInt) case ((h, d), s"down $n") => (h, d + n.toInt) } .pipe(_ * _) input .foldLeft((0, 0, 0)) { case ((h, d, a), s"forward $n") => (h + n.toInt, d + a * n.toInt, a) case ((h, d, a), s"up $n") => (h, d, a - n.toInt) case ((h, d, a), s"down $n") => (h, d, a + n.toInt) } .pipe { case (h, d, _) => h * d }

Dold text
PermalÀnk
Medlem ★
●

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

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 2
SprÄk: Kotlin
Lösning:

import AoCUtils.test import java.io.File fun main() { data class Order(val order: String, val x: Int) fun part1(input: String): Int { val orders = input.lines().map { s -> s.split(" ") }.map { a -> Order(a[0], a[1].toInt()) } var position = 0 var depth = 0 for (order in orders) { when (order.order) { "forward" -> position += order.x "down" -> depth += order.x "up" -> depth -= order.x } } return position * depth } fun part2(input: String): Int { val orders = input.lines().map { s -> s.split(" ") }.map { a -> Order(a[0], a[1].toInt()) } var position = 0 var depth = 0 var aim = 0 for (order in orders) { when (order.order) { "forward" -> { position += order.x depth += aim * order.x } "down" -> aim += order.x "up" -> aim -= order.x } } return position * depth } val testInput = "forward 5\n" + "down 5\n" + "forward 8\n" + "up 3\n" + "down 8\n" + "forward 2" val input = File("src", "Day02.txt").readText() part1(testInput) test Pair(150, "test 1 part 1") part1(input) test Pair(1714950, "part 1") part2(testInput) test Pair(900, "test 2 part 2") part2(input) test Pair(1281977850, "part 2") }

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

Kamrater, nu har jag kikat pÄ massor med lösningar och jag blir lite besviken pÄ de flesta av er. Om uttrycket ser ut som

A + B + C > B + C + D

kan man dÄ förkorta bort nÄgra variabler?

Det dÀr Àr en bra observation som man kommer sÀkerligen behöva göra senare nÀr det blir svÄrare. Ta tex dag 22 för 2019 nÀr man ska blanda en kortlek. En "naiv" kodning klarar del 1 utan problem, men sen i del 2 nÀr man har en kortlek pÄ runt 10^11 kort som ska blandas ungefÀr lika mÄnga gÄnger sÄ inser man att man mÄste optimera

PermalÀnk
Medlem
●

Jag tror jag fick till det till slut.
Dyalog APL.

LĂ€s in och berĂ€kna koordinater: forward←{⍔ 0} down←{0 ⍔} up←{0 (-⍔)} dag2←⍉↑⍎¹⊃⎕NGET'data\2021_dag2.txt'1 Del1: ×/+/dag2 Del2: 1⌷dag2+.×+\2⌷dag2×+/1⌷dag2

Dold text
Klippte in prototypkoden istÀllet för slutliga versionen.
PermalÀnk
●

Dag: 2
SprÄk: Kotlin
Lösning:

Part one

private fun partOne() { val grouped = File("C:\\Users\\Benji\\Downloads\\input2.txt") .readLines() .groupBy { string -> string.split(" ").first() } val position = grouped["forward"].calculateAmount() val upTotalAmount = grouped["up"].calculateAmount() val downTotalAmount = grouped["down"].calculateAmount() val depth = downTotalAmount - upTotalAmount println("answer: " + position * depth) } fun List<String>?.calculateAmount(): Int = this?.let { list -> list.sumOf { string -> string.split(" ").last().toInt() } } ?: 0

Dold text

Part two

var aim = 0 var position = 0 var depth = 0 File("C:\\Users\\Benji\\Downloads\\input2.txt") .readLines() .map { string -> string .split(" ") .let { list -> Pair( first = list.first(), second = list.last().toInt() ) } } .forEach { (direction, value) -> when (direction) { "forward" -> { position += value depth += aim * value } "up" -> aim -= value "down" -> aim += value } } println("answer: " + position * depth)

Dold text
Dold text
Visa signatur

CPU:i5 4670k |GPU: Gigabyte gtx 760 windforce r2 | RAM: 8GB 1600 Mhz | PSU: Fractal Design Integra r2 650w | Moderkort: Asus z87-a | Chassi: Fractal design core 3000 USB 3.0

PermalÀnk
Medlem
●
Skrivet av Ingetledigtnamn:

Kamrater, nu har jag kikat pÄ massor med lösningar och jag blir lite besviken pÄ de flesta av er. Om uttrycket ser ut som

A + B + C > B + C + D

kan man dÄ förkorta bort nÄgra variabler?

OjdĂ„ 🙈

PermalÀnk
Medlem
●

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

public static void main(String[] args) throws FileNotFoundException { Scanner scan = new Scanner(new File("aocDag1.txt")); ArrayList<String> list = new ArrayList<>(); while (scan.hasNext()) { String s = scan.next(); list.add(s); } scan.close(); int counter = 0; for (int i = 0; i < list.size() - 3; i++) { int a = Integer.valueOf(list.get(i)); int b = Integer.valueOf(list.get(i + 3)); if (a < b) { counter++; } } System.out.println(counter); }

Dold text
PermalÀnk
Medlem
●

Dag: 2
SprÄk: Java
Lösning:

public static void main(String[] args) throws FileNotFoundException { Scanner scan = new Scanner(new File("aocDag2.txt")); int depth = 0; int horizontal = 0; int aim = 0; while (scan.hasNext()) { String s = scan.next(); if (s.equalsIgnoreCase("forward")) { System.out.println(s); int cp = scan.nextInt(); horizontal+=cp; depth+= (aim * cp); } else if (s.equalsIgnoreCase("down")) { System.out.println(s); aim+=scan.nextInt(); } else { System.out.println(s); aim-=scan.nextInt(); } } scan.close(); System.out.println("depth = " + depth); System.out.println("horizontal = " + horizontal); System.out.println("aim = " + aim); }}

Dold text
PermalÀnk
●

Dag 2
SprÄk : Python

Lösning

#Advent Of Code day 02 start_vert = 0 start_hori = 0 aim = 0 second_vert = 0 second_hort = 0 depth_num = [] splitted_num = [] with open('input.txt') as f: lines = f.read().splitlines() for i in lines: depth_num.append(i) for i in depth_num: splitted_num.append(i.split()) for i in splitted_num: if i[0] == "forward": #first part start_hori = start_hori + int(i[1]) #second part second_hort = second_hort + int(i[1]) second_vert = second_vert + (aim * int(i[1])) elif i[0] == "down": #first part start_vert = start_vert + int(i[1]) #second part aim = (aim + int(i[1])) elif i[0] == "up": # first part start_vert = start_vert - int(i[1]) # second part aim = aim - int(i[1]) print(start_hori * start_vert) print (second_hort * second_vert)

Dold text
Visa signatur

[ -- Gaming -- ]
{ i5-9600k - RTX 3070 OC - 16GB - 3 x 1TB m.2 }
[ -- Workstation --]
{ i7-5960X | GTX 1660 6GB / Quadro | 48GB corsair dominator platinum | 20TB }
{ Lenovo T480S | i7-8650U | 16 GB | 512 GB }

PermalÀnk
Medlem
●

NĂ„gon annan som lekt med constexpr funktioner?
Vinner man nÄgot för snabbast program

sprÄk: C++
https://godbolt.org/z/sfsG6aqKv

PermalÀnk
Skrivmaskin ★
●

Dag 2
C++
Lösning: https://github.com/wittwang98/Advent-of-Code-2021/tree/main/D...

Det blir att skriva om det hÀr helt och hÄllet i helgen, för det hÀr Àr nog det rörigaste och fulaste jag nÄgonsin skapat

PermalÀnk
Hedersmedlem ★
●

Dag: 1
SprÄk: TypeScript (med Node.JS)
Lösning:

import { Solution } from './solution.js'; import { arraySum, readLines } from './common.js'; function* slidingWindow(array: number[], windowSize: number) { for (let i = 0; i <= array.length - windowSize; i++) { yield array.slice(i, i + windowSize); } } class Day1 implements Solution { parseData(data: string) { let numbers = data.split("\n").map(s => parseInt(s)); for (let windowSize of [1, 3]) { let previous; let increases = 0; for (let window of slidingWindow(numbers, windowSize)) { let sum = arraySum(window); if (previous !== undefined && sum > previous) { increases++; } previous = sum; } console.log(`Day 1, window size ${windowSize}: ${increases}`) } } answer() { readLines('data/day1.txt', (data) => this.parseData(data)); } }

Solution Àr bara ett interface med metoden answer(), och huvudprogrammet gör inget mer Àn att instantiera klassen och anropa answer.

Sen har vi ju en del kod jag rÀknar med att ÄteranvÀnda och sparade separat i "common":

import fs from 'fs'; function arraySum(array: number[]): number { return array.reduce((a, b) => a + b, 0); } function readLines(path: string, callback: {(data: string): void}) { fs.readFile(path, "utf8", (err, data) => { if (err) { console.error("Fatal error, exiting: " + err); process.exit(1) } else callback(data); }) } export { arraySum, readLines };

Dold text

Fick Àntligen lite tid att faktiskt ta tag i detta. Första dagen i AoC, första dagen med TypeScript, och nÀst intill första dagen med JavaScript ocksÄ; har anvÀnt det extremt lite, nÄgra timmar totalt. Med det i Ätanke Àr jag relativt nöjd Àven om det kan göras mycket kortare.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: Python 3
Lösning:

from pathlib import Path input = Path(__file__).with_name('day3_test.txt') lines = input.open('r').readlines() counter = [0] * (len(lines[0])-1) gamma = '' epsilon = '' for line in lines: x = line.strip() for i in range(0, len(x)): counter[i] += int(x[i:i+1]) for x in counter: if x >= len(lines)/2: gamma += '1' epsilon += '0' else: gamma += '0' epsilon += '1' print(gamma + ' = ' + str(int(gamma, 2))) print(epsilon + ' = ' + str(int(epsilon, 2))) print('Power Consumption: ' + str(int(gamma, 2) * int(epsilon, 2)))

Dold text

Del ett i alla fall. Har varit vaken hela natten och kÀnner att det alldeles för mosigt i skallen för att ge sig pÄ del tvÄ just nu
SÀkert inte den bÀsta eller finaste lösningen men det fÄr duga för nu.

Tidigare dagar finns pÄ GitHub

Rensa bort lite skrÀp som lÄg kvar i koden...
Visa signatur

StationÀra | Define 7 Compact | RM750x White | X570S AERO G | Ryzen 5 5600x | NH-D15 Chromax | Flare X 4x8GB 3200MHz | RTX 4070 Super | MP600 1TB | 980 1TB | A2000 1TB | 970 EVO 500GB | 850 EVO 500GB |
Acer X34A + 2x Dell U2719D | Wave 1 | Arctis Nova Pro Wireless |
Laptop | Macbook Air M1 2020 | 16GB | 256GB |
3dkatten.se

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Dag: 2
SprÄk: Python 3
Lösning: GitHub, men logiken finns i Utils.

IgÄr hade jag nÄgot att skylla pÄ, men nÀr 5 minuter pÄ första och 7 minuter pÄ andra "bara" rÀcker till rank 2831/1541 börjar man förstÄ hur mÄnga som sitter och försöker göra snabba lösningar Wow.

Eric Wastl gick up pÄ Twitter igÄr och skrev att det nog kan komma vÀl till hands med en ubÄt i Ärets AoC. [LÀnk]. Vi spekulerade i Kodsnacks Slack om inte flera dagar det hÀr Äret kommer handla om att implementera de olika styrfunktionaliteterna en ubÄt har. (Varför jag la lite extra tid pÄ att faktiskt skriva en submarine.py.)

Kan bli spÀnnande. Jag minns en uppgift frÄn ett tidigare Är dÀr vi skulle styra en bÄt, jag tyckte det var kul.

Dold text

Dag: 3
SprÄk: Python 3
Lösning: GitHub

Än en gĂ„ng blir jag bedragen av testinput. (Eller sĂ„ kan man se det som att jag Ă€r lat och klantig, det Ă€r upp till lĂ€saren att avgöra.)

SÄg att det "bara" var fem-bitars-input, sÄ jag hÄrdkodade Del 1 Testet gick igenom sÄ jag körde med min riktiga input men fick fel resultat. Jag kunde verkligen inte förstÄ varför det inte fungerade! Till saken hör att jag har en fetch.py som hÀmtar datan Ät mig, sÄ jag tittar sÀllan pÄ min riktiga input utan utgÄr frÄn att den Àr "som test-inputen fast fler rader".

Detta bet mig 2018, nÀr uppgiften gick ut pÄ att berÀkna nÀr stjÀrnorna pÄ himlen bildade lÀsbar text (test-inputens bokstÀver var 8 tecken höga, riktiga inputen blev 10 tecken) och nu blev jag biten igen.... 12-bitars input, jo jag tackar...

Aja. LĂ€rdomen Ă€r Ă€n en gĂ„ng att TITTA PÅ INPUT, KÔTTHUVUD!

Gjorde en 12-bitars hÄrdkodad lösning för att jag var envis, men refaktorerade om till en "generiskt antal bitar" efter att jag fÄtt mina stjÀrnor.

Dold text
Visa signatur

:(){ :|:& };:

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

PermalÀnk
●

Dag: 3
SprÄk: Scala

Hua vad man lyckades röra till det idag. Fick fel pÄ del tvÄ flera gÄnger, innan jag gjorde testfall och hittad massor med fel i koden.
HjÀlper ju inte nÀr skallen inte vaknat riktigt heller.

object Day3 { val lines = readLines("3/data.txt") def main(args: Array[String]): Unit = { part1() part2() } def part1() = { val halfTotal = lines.length / 2 val binStr = (0 until 12).map { col => val ones = lines.count(_.charAt(col) == '1') if (ones > halfTotal) '1' else '0' }.mkString("") val gamma = Integer.parseInt(binStr, 2) val epsilon = ~gamma & 0xfff println(gamma * epsilon) } def part2() { val oxyStr = findBits(lines.sorted, 0, keepMajority = true) val oxy = Integer.parseInt(oxyStr, 2) val co2Str = findBits(lines.sorted, 0, keepMajority = false) val co2 = Integer.parseInt(co2Str, 2) println(oxy * co2) } def findBits(lines: Seq[String], pos: Int, keepMajority: Boolean): String = { if(lines.length == 1) { lines.head.substring(pos) } else { val middle = lines.length / 2.0 val onesStartIndex = lines.indexWhere(_.charAt(pos) == '1') val onesAreMajority = onesStartIndex <= middle if(keepMajority == onesAreMajority) { "1" + findBits(lines.slice(onesStartIndex, lines.length), pos + 1, keepMajority) } else { "0" + findBits(lines.slice(0, onesStartIndex), pos + 1, keepMajority) } } } }

Dold text
PermalÀnk
●

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

Den hĂ€r var inte helt rĂ€tt, var till att hĂ„lla tungan rĂ€tt i mun. Var tvungen att anvĂ€nda exempeldatan innan jag fick den att fungera pĂ„ bĂ„da delar, sĂ„ nu bĂ€r det utför đŸ€Ł

import std/[strutils, math, sequtils, algorithm] proc getColumn(s: seq[string], col: int): seq[int] = for line in s: result.add parseInt($line[col]) proc parseBinNumber(bin: seq[int]): int = let bin = bin.reversed for i in 0 .. bin.high: result += 2 ^ i * bin[i] proc part1(lines: seq[string]): int = var gammaBin: seq[int] var epsilonBin: seq[int] for col in 0 .. lines[0].high: let nums = lines.getColumn(col) let gamma = round(sum(nums) / lines.len).toInt gammaBin.add gamma epsilonBin.add 1 - gamma let gamma = parseBinNumber(gammaBin) let epsilon = parseBinNumber(epsilonBin) result = gamma * epsilon proc part2(lines: seq[string]): int = var oxygenCandidates = lines var co2Candidates = lines for col in 0 .. lines[0].high: let nums = oxygenCandidates.getColumn(col) let mostCommon = round(sum(nums) / oxygenCandidates.len).toInt oxygenCandidates = oxygenCandidates.filterIt($it[col] == $mostCommon) if oxygenCandidates.len == 1: break for col in 0 .. lines[0].high: let nums = co2Candidates.getColumn(col) let leastCommon = 1 - round(sum(nums) / co2Candidates.len).toInt co2Candidates = co2Candidates.filterIt($it[col] == $leastCommon) if co2Candidates.len == 1: break doAssert co2Candidates.len == 1 and oxygenCandidates.len == 1 let oxygen = parseBinNumber(oxygenCandidates[0].mapIt(($it).parseInt)) let co2 = parseBinNumber(co2Candidates[0].mapIt(($it).parseInt)) result = oxygen * co2 let input = "input.txt".lines.toSeq echo "Part 1: ", part1(input) echo "Part 2: ", part2(input)

Dold text
PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: Python

Om svÄrighetsgraden ökar i denna takt kommer det bli riktigt knepigt framÄt jul...

from collections import Counter l = [l.strip() for l in open("input03").readlines()] ds = [Counter([x[i] for x in l]) for i in range(len(l[0]))] print( int("".join([max(d, key=d.get) for d in ds]), 2) * int("".join([min(d, key=d.get) for d in ds]), 2)) def crit(l, i, f): if len(l) == 1: return int(l[0], 2) d = Counter([x[i] for x in l]) digit = f(d, key=d.get) if d['0'] != d['1'] else f(d.keys()) return crit([x for x in l if x[i] == digit], i + 1, f) print(crit(l, 0, max) * crit(l, 0, min))

Dold text
Stavfel
PermalÀnk
Medlem ★
●

Dag: 1
SprÄk: #powershell

TyvÀrr har jag inte sÄ bra med tid men ska försöka hinna med nÄgra dagar i alla fall. Körde för nÄgot Är sedan med #PowerShell men dÄ gjorde jag stora funktioner. Denna gÄngen vill jag slimma ned radantalet sÄ mycket som möjligt.

## Part 1 $Input_D1 = Get-Content -Path .\Input.txt $increase = 0; $decrease = 0; $same = 0 for ($i = 0-1; $i -lt $Input_D1.Count; $i++) { switch( $Input_D1[$i] ){ { $Input_D1[$i] -gt $Input_D1[$i-1] } { $increase++; Write-Verbose "$($Input_D1[$i]) < $($Input_D1[$i-1])" } { $Input_D1[$i] -lt $Input_D1[$i-1] } { $decrease++; Write-Verbose "$($Input_D1[$i]) > $($Input_D1[$i-1])" } default { $same++; Write-Verbose "$($Input_D1[$i]) = $($Input_D1[$i-1])" } } } return $increase ## Part 2 $increase3 = 0; $decrease3 = 0; $same3 = 0 for ($i3 = 0; $i3 -lt $Input_D1.Count; $i3++) { if(-not [string]::IsNullOrEmpty($Input_D1[$i3+3])){ $curr3 = $null; $curr3 = ($(@($Input_D1[$i3,($i3+1),($i3+2)])) | Measure-Object -Sum).Sum $next3 = $null; $next3 = ($(@($Input_D1[($i3+1),($i3+2),($i3+3)])) | Measure-Object -Sum).Sum switch( $curr3 ){ { $curr3 -lt $next3 } { $increase3++; Write-Verbose "$curr3 < $next3" } { $curr3 -gt $next3 } { $decrease3++; Write-Verbose "$curr3 > $next3" } default { $same3++; Write-Verbose "$curr3 = $next3" } } } } return $increase3

Dold text

Dag: 2
SprÄk: #powershell

## Part 1 try{ $Input_D2 = Get-Content -Path .\Input.txt $forward = 0; $depth = 0 foreach($item in $Input_D2) { switch( ($item -split ' ')[0] ){ 'forward' { $forward = $forward + [int]$(($item -split ' ')[1]) } 'up' { $depth = $depth - [int]$(($item -split ' ')[1]) } 'down' { $depth = $depth + [int]$(($item -split ' ')[1]) } default { Write-Host "Unable to match direction!!" -ForegroundColor Red; throw "Check code!"} } } return $forward*$depth ## Part 2 $forward_2 = 0; $depth_2 = 0; $aim_2 = 0 foreach($item_2 in $Input_D2) { $p1 = ($item_2 -split ' ')[0] $p2 = ($item_2 -split ' ')[1] switch( $p1 ){ 'forward' { $forward_2 += [int]$p2 $depth_2 += [int]$p2*$aim_2 } 'up' { $aim_2 -= [int]$p2 } 'down' { $aim_2 += [int]$p2 } default { Write-Host "Unable to match direction!!" -ForegroundColor Red; throw "Check code!"} } } return $forward_2*$depth_2 } catch { Write-Host -ForegroundColor Red "Check code!" }

Dold text
Visa signatur

🟱 Main: Ryzen7 5800X | Strix x470-I | 32GB | RTX2070S | Samsung C49RG9
đŸ”” unRaid: Ryzen5 2700X | B450M DS3H | 32GB
🟠 Tfn: Google Pixel 7 Lime Green

-:| @ eller citera för svar |:-

PermalÀnk
Hedersmedlem ★
●

Dag: 2
SprÄk: TypeScript (med Node.JS)
Lösning:

class Day2 implements Solution { answer() { readLines("data/day2.txt", (data) => { // Index 0 = Part 1 solution, index 1 = Part 2 solution let position = [0, 0]; let depth = [0, 0]; let aim = 0; for (let line of data.split("\r\n")) { let [command, arg] = line.split(" "); let value = parseInt(arg); switch (command) { case "up": depth[0] -= value; aim -= value; break; case "down": depth[0] += value; aim += value; break; case "forward": position[0] += value; position[1] += value; depth[1] += aim * value; break; } } console.log(`Day 2 Part 1: ${position[0] * depth[0]} (pos=${position[0]}, depth=${depth[0]})`); console.log(`Day 2 Part 2: ${position[1] * depth[1]} (pos=${position[1]}, depth=${depth[1]}, aim=${aim})`); }) } }

Övrig kod orörd frĂ„n common.ts frĂ„n igĂ„r.
Simpelt men det kÀnns fortfarande som lite vÀl mÄnga rader. Valde att köra en ful-array istÀllet för att separera koden till tvÄ delar.

Dold text
Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: Powershell

Idag var det tuffare, del 1 tog jag sjÀlv men dÄ tiden tryter spanade jag pÄ nÄgra lösningar bÄde hÀr och pÄ reddit innan jag fick ihop min del 2 till nÄgot fungerande.

Del 1

[CmdletBinding()] param () $import = Get-Content .\input3.csv $gamma = "" $epsilon = "" for ($i = 0; $i -lt 12; $i++) { $ones = 0 $zeroes = 0 foreach ($line in $import) { if ($line.ToString()[$i] -eq "1") { $ones += 1 } else { $zeroes += 1 } } if ($ones -gt $zeroes) { $gamma += 1 $epsilon += 0 } else { $gamma += 0 $epsilon += 1 } } $part1 = [convert]::ToInt32($gamma,2) * [convert]::ToInt32($epsilon,2) "Value is: $part1"

Dold text

Del 2

[CmdletBinding()] param () $import = Get-Content .\input3.csv $co2rating = $import $orating = $import for ($i = 0; $i -lt $import[0].Length; $i++) { $col = $co2rating | foreach {$_[$i]} $zeroes = ($col | Where-Object {$_ -eq "0"} | Measure-Object).Count $ones = ($col | Where-Object {$_ -eq "1"} | Measure-Object).Count if ($ones -lt $zeroes) { $mostCommon = "1" } else { $mostCommon = "0" } Write-Verbose "mostCommon co2rating on run $i is $mostcommon" if ($co2rating.Count -ne 1) { $co2rating = $co2rating | Where-Object {$_[$i] -eq $mostCommon} } else { $co2rating = $co2rating } Write-Verbose "co2rating after run $i is $co2rating" $col = $orating | foreach {$_[$i]} $zeroes = ($col | Where-Object {$_ -eq "0"} | Measure-Object).Count $ones = ($col | Where-Object {$_ -eq "1"} | Measure-Object).Count if ($ones -ge $zeroes) { $mostCommon = "1" } else { $mostCommon = "0" } Write-Verbose "mostCommon orating on run $i is $mostcommon" if ($orating.Count -ne 1) { $orating = $orating | Where-Object {$_[$i] -eq $mostCommon} } Write-Verbose "orating after run $i is $orating" } $answer = [convert]::ToInt32($orating,2) * [convert]::ToInt32($co2rating,2) "Part 2 answer: $answer"

Dold text

KÀnner att mitt sprÄkval mÄhÀnda inte Àr optimalt för syftet men dÄ det Àr det enda jag anvÀnt för den lilla kodning jag gjort senaste Äret sÄ Àr det vÀl gamla hederliga "nÀr allt du har Àr en hammare..." som gÀller

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
●

Dag: 3
SprÄk: Carth

Inte helt nöjd med denna. Skrev ineleganta abstraktioner med dÄliga namn. KÀnns som att lösningarna i Carth börjar bli fula fort. Jag saknar Haskell.

(import std) (define main (do io/bind (<- inp (io/map unwrap! (read-file "inputs/day3.txt"))) (let ((ls (lines inp)) (width (string/length-bytes (iter/first! ls))) (mask (- (shift-l (cast 1) width) (cast 1))) (nums (map parse-binary ls)))) (display (str-append "Width: " (show-nat width))) (display (str-append "Mask: " (show-nat mask))) (let1 [gamma epsilon power] (part1 width mask nums)) (display (apps str-append "Part 1: gamma = " (show-nat gamma) ", epsilon = " (show-nat epsilon) ", power = " (show-nat (* gamma epsilon)))) (let1 [o2 co2] (part2 (cast width) nums)) (display (apps str-append "Part 2: o2 = " (show-nat o2) ", co2 = " (show-nat co2) ", life = " (show-nat (* o2 co2)))))) (define (part1 width mask nums) (let ((counts (foldl (fun (acc [num i]) (array/modify! (fun (n) (+ n (- (* 2 (index-bit i num)) 1))) (cast i) acc)) (array/collect (take (cast width) (repeat 0))) (iter/cartesian nums (xrange 0 (cast width))))) (gamma (foldl (fun (acc [i n]) (set-bit (cast i) (>= n 0) acc)) (to-nat 0) (enumerate (array/iter counts)))) (epsilon (bit-and mask (bit-not gamma)))) [gamma epsilon (* gamma epsilon)])) (define (part2 width nums) (define (determine-rating selector i nums) (if (= 1 (to-int (array/length nums))) (to-nat (array/lookup! (to-nat 0) nums)) (let ((nums (array/iter nums)) (balance (bit-balance i nums))) (determine-rating selector (- i 1) (array/collect (filter (fun (n) (= (index-bit i n) (selector balance))) nums)))))) [(determine-rating (fun (balance) (if (>= balance 0) 1 0)) (- width 1) (array/collect nums)) (determine-rating (fun (balance) (if (>= balance 0) 0 1)) (- width 1) (array/collect nums))]) ;; Negative => more zeroes, positive => more ones (define (bit-balance col-i nums) (sum (map (fun (n) (- (* 2 (index-bit col-i n)) 1)) nums)))

Dold text
Visa signatur

Arbets- / Spelstation: Arch Linux - Ryzen 5 3600 - RX 7900 XT - 32G DDR4
Server: Arch Linux - Core i5-10400F - 16G DDR4

PermalÀnk
Hedersmedlem ★
●

Dag: 3
SprÄk: TypeScript (med Node.JS)
Lösning:

import { Solution } from './solution.js'; import { readLines } from './common.js'; function mostCommon(lines: string[], position: number) { let ones = 0; for (let line of lines) { if (line[position] == "1") { ones++; } } return (ones >= lines.length / 2) ? 1 : 0; } class Day3 implements Solution { answer() { readLines("data/day3.txt", (data) => { let lines = data.split("\r\n").filter((s) => s.length > 0); // Part 1 let gammaRate = 0; for (let i = 0; i < 12; i++) { if (mostCommon(lines, i) == 1) gammaRate |= (1 << (11-i)); } let epsilonRate = ~gammaRate & 0xfff; console.log(`Day 3 Part 1: ${gammaRate * epsilonRate}`) // Part 2 let filteredLines = [...lines]; for (let i = 0; i < 12 && filteredLines.length > 1; i++) { filteredLines = filteredLines.filter((s) => parseInt(s[i]) == mostCommon(filteredLines, i)); } let oxygenGeneratorRating = parseInt(filteredLines[0], 2) filteredLines = [...lines]; for (let i = 0; i < 12 && filteredLines.length > 1; i++) { filteredLines = filteredLines.filter((s) => parseInt(s[i]) != mostCommon(filteredLines, i)); } let CO2ScrubberRating = parseInt(filteredLines[0], 2) console.log(`Day 3 Part 2: ${oxygenGeneratorRating! * CO2ScrubberRating!}`); }); } } export { Day3 }

Dold text

Jippi, nu Àr jag ikapp.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

PermalÀnk
Medlem ★
●

Lite efter som vanligt!

Dag 1
SprÄk: F#
Lösning

let inputAsInt = File.ReadAllLines(@H:\Dev\input.txt) |> Array.map Convert.ToInt32 let part1 (input: int[]) = let mutable counter = 0 for i in 0 .. input.Length - 2 do if input.[i+1] > input.[i] then counter <- counter + 1 counter part1 inputAsInt let part2 (input: int[]) = let mutable counter = 0 for i in 0 .. input.Length - 4 do let x = input.[i] let z = input.[i+1] let y = input.[i+2] let b = input.[i+3] let sum = x + z + y let sum2 = z + y + b if sum2 > sum then counter <- counter + 1 () counter part2 inputAsInt

Dold text
Visa signatur

Grubblare

PermalÀnk
Medlem
●

Dag: 3
SprÄk: Rust

const SIZE: usize = 12; fn main() { let input = std::fs::read_to_string("input.txt").unwrap(); let input: Vec<_> = input.lines().collect(); part1(&input); part2(input); } fn part1(data: &[&str]) { let gamma_rate = calc_gamma_rate(data); let epsilon_rate = gamma_rate ^ usize::from_str_radix(&"1".repeat(SIZE), 2).unwrap(); println!("Part 1: {}", gamma_rate * epsilon_rate); //2595824 } fn part2(data: Vec<&str>) { let oxygen_generator_rating = life_support(data.clone(), |lines, index, len| { let counted = count_ones(lines); if counted[index] >= len - counted[index] { '1' } else { '0' } }); let scrubber_rating = life_support(data.clone(), |lines, index, len| { let counted = count_ones(lines); if counted[index] >= len - counted[index] { '0' } else { '1' } }); println!("Part 2: {}", oxygen_generator_rating * scrubber_rating); //2135254 } fn count_ones(data: &[&str]) -> Vec<usize> { data.iter().fold(vec![0usize; SIZE], |mut acc, value| { for (i, s) in value.chars().enumerate() { acc[i] += matches!(s, '1') as usize; } acc }) } fn calc_gamma_rate(data: &[&str]) -> usize { count_ones(data).iter().fold(0usize, |mut acc, &s| { acc <<= 1; acc + (s > data.len() - s) as usize }) } fn life_support(mut lines: Vec<&str>, f: impl Fn(&[&str], usize, usize) -> char) -> usize { for i in 0.. { let keep_token = f(&lines, i, lines.len()); lines = lines .into_iter() .filter(|&c| c.chars().nth(i).unwrap() == keep_token) .collect(); if lines.len() == 1 { break; } } usize::from_str_radix(lines[0], 2).unwrap() }

Dold text
Visa signatur

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

PermalÀnk
Medlem
●

Dag: 3
SprÄk: C#

internal class Puzzle3 : Puzzle<int> { private readonly string[] _diagnosticReport = File.ReadAllLines("Inputs/Puzzle3.txt"); private const int BitLength = 12; public override int One() { var gamma = Enumerable.Range(0, BitLength) .Aggregate("", (str, x) => str + FindCommonBit(_diagnosticReport, x, true)); var gammaNumber = Convert.ToInt32(gamma, 2); var epsilon = ~gammaNumber & 0xfff; return gammaNumber * epsilon; } public override int Two() { var oxygenGeneratorRating = CalculateRating(true); var co2ScrubberRating = CalculateRating(false); return oxygenGeneratorRating * co2ScrubberRating; } private int CalculateRating(bool mostCommonValue) { var lines = _diagnosticReport.ToList(); foreach (var idx in Enumerable.Range(0, BitLength)) { var commonBit = FindCommonBit(lines, idx, mostCommonValue); lines = lines.Where(line => line[idx] == commonBit).ToList(); if (lines.Count == 1) { return Convert.ToInt32(lines[0], 2); } } return 0; } private static char FindCommonBit(IReadOnlyCollection<string> lines, int bitPosition, bool mostCommonValue) { var bitCount = lines.Count(line => line[bitPosition] == '1'); return (mostCommonValue == 2*bitCount >= lines.Count) ? '1' : '0'; } }

Dold text
PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: C# (.NET6)

För vÀl se hur lÀnge man hÀnger pÄ. Vi kör det lite pÄ skoj pÄ jobbet iofs, vilket vÀl kanske Àr en motivator.

Finns en hel hög finputsning man kan göra, förstÄs, men det Àr ju inte nÄt man orkar bry sig om nÀr det vÀl funkar.

BinaryPair.cs

namespace aoc03 { internal class BinaryPair { public BinaryPair() { Zero = 0; One = 0; } public BinaryPair(int val) { Zero = 0; One = 0; Add(val); } public int Zero { get; set; } public int One { get; set; } public void Add(int val) { if (val == 0) AddZero(); else if (val == 1) AddOne(); } public void AddZero() { Zero++; } public void AddOne() { One++; } override public string ToString() { return $"1:{One} 0:{Zero}"; } public int Max() { if (One >= Zero) return 1; else return 0; } public int Oxy() { return Max(); } public int Co2() { if (Zero <= One) return 0; else return 1; } public int Min() { return Max() ^ 1; } } }

Program.cs

using aoc03; int valuelength = 0; List<string> values = new(); using (var sr = new StreamReader("input.txt")) { while (!sr.EndOfStream) values.Add(sr.ReadLine()!); } var pairs = GetBinaryPairs(values); (var max, var min, var maxresult, var minresult) = GetMaxAndMin(pairs); Console.WriteLine("Part 1: " + max * min); var oxy = new List<string>(values); var oxypairs = new List<BinaryPair>(pairs); var co2 = new List<string>(values); var co2pairs = new List<BinaryPair>(pairs); (var oxyresult, var co2result) = getOxyAndCO(oxypairs, co2pairs); for (int i = 0; i < valuelength; i++) { if (oxy.Count != 1) oxy.RemoveAll(x => x[i] != oxyresult[i]); if (co2.Count != 1) co2.RemoveAll(x => x[i] != co2result[i]); oxypairs = GetBinaryPairs(oxy); co2pairs = GetBinaryPairs(co2); (oxyresult, co2result) = getOxyAndCO(oxypairs, co2pairs); } Console.WriteLine("Part 2: " + toBase10(oxy.First()) * toBase10(co2.First())); List<BinaryPair> GetBinaryPairs(List<string> values) { bool first = true; List<BinaryPair> pairs = new(); foreach (var item in values) { if (first) { valuelength = item.Length; for (int i = 0; i < valuelength; i++) { pairs.Add(new BinaryPair()); } first = false; } for (int i = 0; i < valuelength; i++) { pairs[i].Add(int.Parse((item.Substring(i, 1)))); } } return pairs; } (int, int, string, string) GetMaxAndMin(List<BinaryPair> pairs) { string maxresult = ""; string minresult = ""; foreach (var item in pairs) { maxresult += item.Max(); minresult += item.Min(); } int max = toBase10(maxresult); int min = toBase10(minresult); return (max, min, maxresult, minresult); } (string, string) getOxyAndCO(List<BinaryPair> oxypairs, List<BinaryPair> co2pairs) { string oxyresult = ""; string co2result = ""; foreach (var item in oxypairs) { oxyresult += item.Oxy(); } foreach (var item in co2pairs) { co2result += item.Co2(); } return (oxyresult, co2result); } int toBase10(string val) { return Convert.ToInt32(val, 2); }

Dold text
Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

PermalÀnk
●

Dag:3 - Part 2
SprÄk: Powershell

TÀnkte att det vore lite kul att skriva dag 3 - part 2 med hjÀlp av en funktion eftersom co2 och oxygen Àr sÄ lika.
SÄ hÀr Àr min Powershell kodning för lösning av problemet.

function Get-AdventOfCodeDay3_2 {
param (
[string[]]$data,
[string[]]$lifesupportdata
)
$list=(Get-Content $data)
$position=0
do{
$0=@()
$1=@()
$number=0
foreach ($_ in $list)
{
$list[$number] | Where-Object {($_)[[int]$position] -like "0"} | ForEach-Object {$0+=($list[$number])}
$list[$number] | Where-Object {($_)[[int]$position] -like "1"} | ForEach-Object {$1+=($list[$number])}
$number++
}
if($lifesupportdata -like "oxygen"){
if ($0.count -gt $1.count){$list=$0}
else{$list=$1}
}

if($lifesupportdata -eq "co2"){
if ($0.count -le $1.count){$list=$0}
else{$list=$1}
}
$position++
}until($list.count -eq 1)
return $list
}

$co2=Get-AdventOfCodeDay3_2 .\data.csv oxygen
$oxygen=Get-AdventOfCodeDay3_2 .\data.csv co2

$co2_decimal=[convert]::ToInt64($co2,2)
$oxygen_decimal=[convert]::ToInt64($oxygen,2)

Write-Host "Correct answer:" ($co2_decimal*$oxygen_decimal)

Dold text
PermalÀnk
Medlem
●

Dag: 3
SprÄk: C++

Det hĂ€r tog mig en bra stund idag (lĂ€ngre Ă€n jag vĂ„gar erkĂ€nna). Är inte direkt flytande i C++ och gick nog en ganska lĂ„ng omvĂ€g via bitset, bara för att jag ville nyttja bitwise NOT. Ville ocksĂ„ testa om jag kunde lösa det med rekursion. Onödigt kanske, men lĂ€rorikt. Kul uppgift!

(Om nÄgon vill lÀra mig om det pÄ nÄgot sÀtt gÄr att ha en (run-time) variabel bitset-storlek sÄ fÄr ni gÀrna skriva till mig. Lyckades ej.)

#include <iostream> #include <bitset> #include "../utils/file_reader.cpp" using namespace std; bitset<12> bit_mode(vector<string> data, bool default_bit = true) { bitset<12> output; string bin_str; int str_len; vector<int> sum_bits; int n_rows = data.size(); for (int i = 0; i < n_rows; i++) { bin_str = data[i]; if (i==0) { str_len = bin_str.length(); sum_bits.resize(str_len,0); } for (int j = 0; j < str_len; j++) { sum_bits[j]+=stoi(bin_str.substr(j,1)); } } //calculate if 0 or 1 has the highest prevalence //set corresponding bit in the bitset (note reverse ordering) for (int i = 0; i < str_len; i++) { int bit_pos = str_len-i-1; if (sum_bits[i]*2 == n_rows) { output.set(bit_pos, true); } else if (sum_bits[i] > n_rows/2.0) { output.set(bit_pos, true); } else { output.set(bit_pos, false); } } return default_bit == false? ~output : output; } bitset<12> recursive_solver(vector<string> data, bool default_bit, int bit_pos = 0) { int n_rows = data.size(); int n_bits = data[0].length(); //base case if (bit_pos == n_bits || n_rows == 1) { bitset<12> remaining_bits(data[0]); return remaining_bits; } vector<string> data_next; //get the most common bits bitset<12> bitset_ = bit_mode(data, default_bit); for (int i = 0; i < n_rows; i++) { bitset<12> temp(data[i]); int bit_pos_reversed = n_bits-1-bit_pos; //bit-order from right in bitset if (temp.test(bit_pos_reversed) == bitset_.test(bit_pos_reversed)) { data_next.push_back(data[i]); } } return recursive_solver(data_next, default_bit, ++bit_pos); } int solve_part1(vector<string> data) { bitset<12> gamma_rate_bits = bit_mode(data, true); bitset<12> epsilon_rate_bits = bit_mode(data, false); int gamma_rate = (int)gamma_rate_bits.to_ulong(); int epsilon_rate = (int) epsilon_rate_bits.to_ulong(); return gamma_rate * epsilon_rate; } int solve_part2(vector<string> data) { bitset<12> oxgen_rate_bits = recursive_solver(data,true); bitset<12> co2scrub_rate_bits = recursive_solver(data,false); int oxgen_rate = (int)oxgen_rate_bits.to_ulong(); int co2scrub_rate = (int) co2scrub_rate_bits.to_ulong(); return oxgen_rate * co2scrub_rate; } int main() { vector<string> data = read_file<string>("../../input/day_03.txt"); int part_1 = solve_part1(data); int part_2 = solve_part2(data); cout << "Day 1 Part 1 solution: " << part_1 << endl; cout << "Day 1 Part 2 solution: " << part_2 << endl; }

Dold text

https://github.com/gbroll/AoC-2021