🌟 Advent of Code (AoC) 2022 🌟

PermalÀnk
Datavetare ★
●

Dag: 2
SprÄk: Go

package main import ( "fmt" ) const ( rock = 1 paper = 2 scissors = 3 ) const ( loss = 0 draw = 3 win = 6 ) func init() { Solutions[2] = day2 } func tournamentScorePart1(rounds []string) int { roundScore := map[string]int{ // opponent: rock "A X": draw + rock, "A Y": win + paper, "A Z": loss + scissors, // opponent: paper "B X": loss + rock, "B Y": draw + paper, "B Z": win + scissors, // opponent: scissors "C X": win + rock, "C Y": loss + paper, "C Z": draw + scissors, } score := 0 for _, round := range rounds { score += roundScore[round] } return score } func tournamentScorePart2(rounds []string) int { roundScore := map[string]int{ // opponent: rock "A X": loss + scissors, "A Y": draw + rock, "A Z": win + paper, // opponent: paper "B X": loss + rock, "B Y": draw + paper, "B Z": win + scissors, // opponent: scissors "C X": loss + paper, "C Y": draw + scissors, "C Z": win + rock, } score := 0 for _, round := range rounds { score += roundScore[round] } return score } func day2(input []string) { fmt.Println(tournamentScorePart1(input)) fmt.Println(tournamentScorePart2(input)) }

Lösning

Har ett lite ramverk runt sÄ alla dagar kan byggas ihop till ett enda program med lite argument dÀr man kan vÀlja saker som dag etc. Det lÀser Àven in input rad-för-rad och lÀgger det i argumentet till "dayX()" funktionen för respektive dag.

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

NÀr man ser en one-liner nÀr man gjort det i Java pÄ 194 rader isch (iofs kommentarer inkluderat) sÄ förstÄr man hur mycket lÀttare allt gÄr att göra :')

Dag 2 gÄr att lösa pÄ ett löjligt och löjligt lÀtt sÀtt, det Àr bara 9 fall per del
(Kotlin)

val instructions = listOf("A X", "A Y", "A Z", "B X", "B Y", "B Z", "C X", "C Y", "C Z") fun count(values: List<Int>) = input.lines().sumOf { instructions.zip(values).toMap()[it]!!} println("Del 1: ${count(listOf(4,8,3,1,5,9,7,2,6))}. Del 2: ${count(listOf(3,4,8,1,5,9,2,6,7))}")

Dold text
Visa signatur

i5-7600k . GTX 1080 . 16 GB

PermalÀnk
●

Va lite osÀker pÄ om jag ville köra AOC i Är. Men sen nÀr jag lÀste nyheten igÄrkv tÀntke jag att jo, d e endÄ rÀtt trevligt ett par stycken ska man vÀll kunna hÀnga med pÄ iaf.

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

use std::fs; pub fn run() { let data = fs::read_to_string("dec_01.txt").expect("unable to read file"); let mut big_sum_one = 0; let mut big_sum_two = 0; let mut big_sum_three = 0; let mut sum = 0; for line in data.lines(){ if !line.is_empty(){ sum += line.parse::<i32>().unwrap(); } else { if sum > big_sum_one{ big_sum_three = big_sum_two; big_sum_two = big_sum_one; big_sum_one = sum; }else if sum > big_sum_two{ big_sum_three = big_sum_two; big_sum_two = sum }else if sum > big_sum_three{ big_sum_three = sum } sum = 0; } } println!("Part1: {}", big_sum_one); println!("Part2: {}", (big_sum_one + big_sum_two + big_sum_three)); }

Dold text

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"); part1(&data); part2(&data); } fn part1(data: &String){ let mut total_score = 0; for line in data.lines(){ let mut round = line.split_whitespace(); let p1 = round.next(); let p2 = round.next(); let mut score = 0; match p1{ Some("A") => { match p2{ Some("X") => score += 4, //+1 for X +3 for draw Some("Y") => score += 8, //+2 for Y +6 for win Some("Z") => score += 3, //+3 for Z +0 for loss _ => print!("Bad data") } } Some("B") => { match p2{ Some("X") => score += 1, //+1 for X +0 for loss Some("Y") => score += 5, //+2 for Y +3 for draw Some("Z") => score += 9, //+3 for Z +6 for win _ => print!("Bad data") } } Some("C") => { match p2{ Some("X") => score += 7, //+1 for X +6 for win Some("Y") => score += 2, //+2 for Y +0 for loss Some("Z") => score += 6, //+3 for Z +3 for draw _ => print!("Bad data") } } _ => print!("Bad data") } total_score += score; } println!("{}", total_score); } fn part2(data: &String){ let mut total_score = 0; for line in data.lines(){ let mut round = line.split_whitespace(); let p1 = round.next(); let p2 = round.next(); let mut score = 0; match p1{ Some("A") => { match p2{ Some("X") => score += 3, //+3 lose via Scissors Some("Y") => score += 4, //+4 draw via Rock Some("Z") => score += 8, //+8 win via Paper _ => print!("Bad data") } } Some("B") => { match p2{ Some("X") => score += 1, //+1 lose via Rock Some("Y") => score += 5, //+5 draw via Paper Some("Z") => score += 9, //+9 win via Scissors _ => print!("Bad data") } } Some("C") => { match p2{ Some("X") => score += 2, //+2 lose via Paper Some("Y") => score += 6, //+6 draw via Scissors Some("Z") => score += 7, //+7 win via Rock _ => print!("Bad data") } } _ => print!("Bad data") } total_score += score; } println!("{}", total_score); }

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

Jag har testat det lite, men ska det gÄ att anvÀnda för assignment pÄ samma fina sÀtt?

Det tror jag inte.

PermalÀnk
Medlem
●

Dag 2
SprÄk: C#

Bulkigt men löser problemet, för första lösningen fÄr man flytta 4 kommentarer, hade kanske gÄtt att fixa snyggare man jag Àr rÀtt nöjd!

using System.Diagnostics; using System.Globalization; namespace AdventOfCodeDay2 { internal class Program { static void Main(string[] args) { string[] opponentWinCombinations = new string[] { "A Z", "B X", "C Y" }; string[] IWinCombinations = new string[] { "A Y", "B Z", "C X" }; string[] drawCombinations = new string[] { "A X", "B Y", "C Z" }; string[] rounds = Input().Trim().Split("\r\n"); int score = 0; int counter = 0; foreach (string round in rounds) { //bool oppoWin = CheckForMatch(round, opponentWinCombinations); //bool IWin = CheckForMatch(round, IWinCombinations); //bool draw = CheckForMatch(round, drawCombinations); string cheatRound = CheatRound(round); bool oppoWin = CheckForMatch(cheatRound, opponentWinCombinations); bool IWin = CheckForMatch(cheatRound, IWinCombinations); bool draw = CheckForMatch(cheatRound, drawCombinations); if (draw) { score += 3; } else if(IWin) { score += 6; } //score += ScoreCounter(round); score += ScoreCounter(cheatRound); counter++; } Console.WriteLine(score); } public static string CheatRound(string round) { if (round[2] == 'Y') { //Draw game return DrawGame(round); } else if(round[2] == 'X') { //Opponent win game return OppoWinGame(round); } else { //I win game return IWinGame(round); } } public static string DrawGame(string round) { if (round[0] == 'A') { round = "A X"; } else if (round[0] == 'B') { round = "B Y"; } else { round = "C Z"; } return round; } public static string OppoWinGame(string round) { if (round[0] == 'A') { round = "A Z"; } else if (round[0] == 'B') { round = "B X"; } else { round = "C Y"; } return round; } public static string IWinGame(string round) { if (round[0] == 'A') { round = "A Y"; } else if (round[0] == 'B') { round = "B Z"; } else { round = "C X"; } return round; } public static int ScoreCounter(string round) { char XYZ = round[2]; if (XYZ == 'X') { return 1; } else if (XYZ == 'Y') { return 2; } else { return 3; } } public static bool CheckForMatch(string round, string[] combinations) { bool foundMatch = false; foreach (var combination in combinations) { if (round == combination) { foundMatch = true; } } return foundMatch; } public static string Input() { return "input hÀr"; } }

Dold text
PermalÀnk
Medlem
●

Dag:2
SprÄk: Dyalog APL

A B C X Y Z←6⍎1-⍹⍳3 d←↑⍎¹⊃⎕NGET'2.txt'1 +/{⍔+1+3×3|1+⍔-âș}/d ⍝ del1 +/{(â”Ă—3)+1+3|2+⍔+âș}/d ⍝ del2

Dold text
PermalÀnk
Medlem ★
●

Dag: 2
SprÄk: VB.Net

Imports System.IO Module Program Sub Main(args As String()) Dim scoreMap1 As New Dictionary(Of String, Integer) From { {"A X", 1 + 3}, {"A Y", 2 + 6}, {"A Z", 3 + 0}, {"B X", 1 + 0}, {"B Y", 2 + 3}, {"B Z", 3 + 6}, {"C X", 1 + 6}, {"C Y", 2 + 0}, {"C Z", 3 + 3} } Dim scoreMap2 As New Dictionary(Of String, Integer) From { {"A X", 3 + 0}, {"A Y", 1 + 3}, {"A Z", 2 + 6}, {"B X", 1 + 0}, {"B Y", 2 + 3}, {"B Z", 3 + 6}, {"C X", 2 + 0}, {"C Y", 3 + 3}, {"C Z", 1 + 6} } Dim score1 As Integer = 0 Dim score2 As Integer = 0 Using reader As New StreamReader("input.txt") While Not reader.EndOfStream Dim round = reader.ReadLine() score1 += scoreMap1(round) score2 += scoreMap2(round) End While End Using Console.WriteLine("Part1: " & score1) Console.WriteLine("Part2: " & score2) End Sub End Module

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

Dag:2
SprÄk: Dyalog APL

A B C X Y Z←6⍎1-⍹⍳3 d←↑⍎¹⊃⎕NGET'2.txt'1 +/{⍔+1+3×3|1+⍔-âș}/d ⍝ del1 +/{(â”Ă—3)+1+3|2+⍔+âș}/d ⍝ del2

Dold text

Kan du berÀtta vad det gör? Jag tyckte mitt pythonhack skulle vara svÄrt tyda för den som inte skrivit det, men detta...

PermalÀnk
●

Dag: 2
SprÄk: C++

Kunde nog snyggat till berÀkningarna lite men den verkar göra jobbet

#include <iostream> using namespace std; int main() { int score1{}, score2{}; char c1{}, c2{}; while(cin >> c1 >> c2) { int opp{c1 - 'A' + 1}; int resp{c2 - 'X' + 1}; score1 += (resp - opp + 4)%3*3 + resp; score2 += (opp + resp)%3 + resp*3 - 2; } cout << score1 << " " << score2 << endl; return 0; }

Dold text
PermalÀnk
Medlem ★
●

Jag tycker det Àr intressant att se hur folk vÀljer mellan kort kod, effektiv kod och ren galenskap. Blir en lÀrorik mÄnad det hÀr!

Visa signatur

CPU: 7950X 5GHz@1.1v | RAM: 32GB 6000MHz CL36 | GPU: KFAÂČ 3090 SG w/ AlphaCool Eisblock Aurora
Ljudkort: Modius + Magnius | Lurar: GoldPlanar GL2000 / Sennheiser HD 650 / Philips Fidelio X3 / Supreme CD-99

PermalÀnk
Medlem
●

Dag: 2
SprÄk: Go

Tog alldeles för lÄng tid att knÀcka modulo. FrÄgan Àr om det kommer nÄgon liknande lÀngre fram med fler pjÀser?

package main import ( "bufio" "fmt" "os" "strings" ) // A - 0 - ROCK // B - 1 - PAPER // C - 2 - SCISSOR // X - 0 - ROCK // Y - 1 - PAPER // Z - 2 - SCISSOR const ArraySize = 3 type Move struct { Player1 int Player2 int } func calcSum(m Move) int { sum := 0 diff := (m.Player2 - m.Player1 + ArraySize) % ArraySize if diff == 0 { sum += 3 } else if diff == 1 { sum += 6 } sum += m.Player2 + 1 return sum } func getPartOne(moves []Move) int { sum := 0 for i := range moves { m := moves[i] sum += calcSum(m) } return sum } func getPartTwo(moves []Move) int { sum := 0 for i := range moves { m := moves[i] // adjust if m.Player2 == 1 { m.Player2 = m.Player1 } else if m.Player2 == 0 { // prev m.Player2 = (m.Player1 + ArraySize - 1) % ArraySize } else if m.Player2 == 2 { // next m.Player2 = (m.Player1 + 1) % ArraySize } // calc sum += calcSum(m) } return sum } func getMoves(filename string) []Move { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close() scanner := bufio.NewScanner(file) moves := make([]Move, 0) for scanner.Scan() { row := scanner.Text() fields := strings.Fields(row) moves = append(moves, Move{Player1: int([]rune(fields[0])[0]) - 65, Player2: int([]rune(fields[1])[0]) - 88}) } return moves } func main() { fmt.Println("Part one:", getPartOne(getMoves("../input.txt"))) fmt.Println("Part two:", getPartTwo(getMoves("../input.txt"))) }

Dold text
PermalÀnk
Medlem ★
●

Dag: 2
SprÄk: Go

var outcomeValues = map[string]int{ "X": 0, "Y": 3, "Z": 6, } func main() { input, err := helpers.ReadLines(os.Args[1]) if err != nil { panic(err) } ps1, ps2 := 0, 0 for _, line := range input { values := strings.Split(line, " ") v1, v2 := int(values[0][0])-65, (int(values[1][0]) - 88) ps1 += roundPoints(v1, v2) + v2 + 1 ps2 += correspondingMoveValue(v1, values[1]) + 1 + outcomeValues[values[1]] } fmt.Printf("%v\n", ps1) fmt.Printf("%v\n", ps2) } func correspondingMoveValue(oponentMove int, mission string) (result int) { if mission == "X" { result = (oponentMove - 1) % 3 if result < 0 { return result + 3 } return result } else if mission == "Y" { return oponentMove } else { return (oponentMove + 1) % 3 } } func roundPoints(v1, v2 int) (result int) { if math.Abs(float64(v1-v2)) == 2 { if v1 > v2 { return 6 } else { return 0 } } if math.Abs(float64(v1-v2)) == 1 { if v1 > v2 { return 0 } else { return 6 } } return 3 }

Dold text
PermalÀnk
Medlem ★
●

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

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

PermalÀnk
Medlem
●
Skrivet av huggeMugg:

Är mest en plojgrej men bestĂ€mde mig för att visualisera alla matcherna man fick i inputen med hjĂ€lp av emojis och en wrapper för P5.js i Nim. Om nĂ„gon Ă€r intresserad kan dom se den hĂ€r. Den animerar varje match separat pĂ„ ett stort grid och visar emojis som representerar dom olika valen (sten, sax, pĂ„se) samt utfallet i matchen (grön bock för vinst, streck för oavgjort, rött kryss för förlust).

LĂ€ckert!

PermalÀnk
Medlem ★
●

Dag: 1
SprÄk: Pwsh (Powershell 7)
Lösning:

function start-day1 { $day1InputData = @(Get-Content -Path "day_01_input.txt" -Delimiter "`n`n") [array]$addedUpData = foreach($item in $day1InputData){ $convertedstringitem = @() foreach( $stringitem in $( $item-split [System.Environment]::NewLine) ){ $convertedstringitem += $stringitem.ToInt32($null) } ($convertedstringitem | Measure-Object -Sum).Sum } $day1b = $(( $addedUpData | Sort-Object -Descending )[0..2]) Write-Host "Day 1a: $(( $addedUpData | Sort-Object -Descending )[0])" Write-Host "Day 1b: $(( $day1b | Measure-Object -Sum ).Sum)" }

Dold text

Dag: 2
SprÄk: Pwsh (Powershell 7)
Lösning:

function start-day2 { $day1InputData = @(Get-Content -Path "day_02_input.txt" -Delimiter "`n") $totalPointsPart1 = @() $totalPointsPart2 = @() # A / X / 1 = Rock -> Loose # B / Y / 2 = Paper -> Draw # C / Z / 3 = Sissors -> Win $day1InputData | ForEach-Object { switch( $PSItem ){ 'A X' { $totalPointsPart1 += ( 1 + 3 ) } 'B Y' { $totalPointsPart1 += ( 2 + 3 ) } 'C Z' { $totalPointsPart1 += ( 3 + 3 ) } 'A Y' { $totalPointsPart1 += ( 2 + 6 ) } 'B Z' { $totalPointsPart1 += ( 3 + 6 ) } 'C X' { $totalPointsPart1 += ( 1 + 6 ) } 'A Z' { $totalPointsPart1 += ( 3 + 0 ) } 'B X' { $totalPointsPart1 += ( 1 + 0 ) } 'C Y' { $totalPointsPart1 += ( 2 + 0 ) } default { Write-host "WTF!"; break } } #break } $infoTable = [pscustomobject] @{ A = [pscustomobject]@{ X = 3 # Loose with Sissors Y = 1 # Draw with Rock Z = 2 # Win with Paper } B = [pscustomobject]@{ X = 1 # Loose with Rock Y = 2 # Draw with Paper Z = 3 # Win with Sissors } C = [pscustomobject]@{ X = 2 # Loose with Paper Y = 3 # Draw with Sissors Z = 1 # Win with Rock } } $day1InputData | ForEach-Object { $matchValue = $PSItem[0] $switchValue = $PSItem[2] switch( $switchValue ){ 'X' { $totalPointsPart2 += ( [int]$($infoTable.$matchValue.$switchValue) + 0 ) } 'Y' { $totalPointsPart2 += ( [int]$($infoTable.$matchValue.$switchValue) + 3 ) } 'Z' { $totalPointsPart2 += ( [int]$($infoTable.$matchValue.$switchValue) + 6 ) } default { Write-host "WTF! [2]"; break } } } Write-Host "Day 2a: $( ($totalPointsPart1 | Measure-Object -Sum).Sum )" Write-Host "Day 2b: $( ($totalPointsPart2 | Measure-Object -Sum).Sum )" }

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

Dag 2, uppgift 1
SprÄk: Python

import numpy as np with open("2.txt") as f: r = np.array([ [ord((s := e.split())[0]) - 65, ord(s[1]) - 88] for e in f.read().splitlines() ]) s = (3 + r[:, 0] - r[:, 1]) % 3 np.sum(1 + r[:, 1] + 3 * np.where(s < 2, s ^ 1, s))

Dold text

Uppgift 2:

if else if else if else

Dold text
Visa signatur

1

PermalÀnk
●

Dag 2
SprÄk: C#

Part 1

string[] strategy = File.ReadAllLines(@Files/day2.txt); var dict = new Dictionary<char, int>() { { 'X', 1 }, { 'Y', 2 }, { 'Z', 3 }, { 'A', 1 }, { 'B', 2 }, { 'C', 3 } }; int score = 0; for (int i = 0; i < strategy.Length; i++) { int user = dict[strategy[i].ToCharArray()[2]]; int elf = dict[strategy[i].ToCharArray()[0]]; if (elf % 3 + 1 == user) score += 6 + user; else if (user % 3 + 1 == elf) score += user; else score += 3 + user; } Console.WriteLine(score);

Part 2

string[] strategy = File.ReadAllLines(@Files/day2.txt); var dict = new Dictionary<char, int>() { { 'A', 1 }, { 'B', 2 }, { 'C', 3 }, { 'X', 1 }, { 'Y', 2 }, { 'Z', 3 } }; var toWin = new Dictionary<int, int>() { { 1, 2 }, { 2, 3 }, { 3, 1 } }; var toLose = new Dictionary<int, int>() { { 1, 3 }, { 2, 1 }, { 3, 2 } }; int score = 0; for (int i = 0; i < strategy.Length; i++) { int outcome = dict[strategy[i].ToCharArray()[2]]; int elf = dict[strategy[i].ToCharArray()[0]]; switch (outcome) { case 3: score += 6 + toWin[elf]; break; case 2: score += 3 + elf; break; default: score += toLose[elf]; break; } } Console.WriteLine(score);

Dold text
PermalÀnk
Skrivmaskin ★
●

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

letters = open("input.txt", 'r').readlines() #part 1 comparison = [] vals = { 'X': 1,#rock 'Y': 2,#paper 'Z': 3,#scissor } wins = { 'A': 'Y', #paper wins over rock 'B': 'Z', #scissor wins over paper 'C': 'X' #rock wins over scissor } translation = { 'A': 'X', 'B': 'Y', 'C': 'Z' } score = 0 for i in letters: if translation[i.strip('\n')[0]] == i.strip('\n')[2]: score += 3 + vals[i.strip('\n')[2]] elif wins[i.strip('\n')[0]] == i.strip('\n')[2]: score += 6 + vals[i.strip('\n')[2]] else: score += vals[i.strip('\n')[2]] print(i.strip('\n')[0], i.strip('\n')[2], score, '\n') #part 2 vals = { 'A': 1,#rock 'B': 2,#paper 'C': 3,#scissor } wins = { 'A': 'B', #paper wins over rock 'B': 'C', #scissor wins over paper 'C': 'A' #rock wins over scissor } loss = { 'A': 'C', 'B': 'A', 'C': 'B' } score = 0 for i in letters: if i.strip('\n')[2] == 'Z': #must win score += 6 + vals[wins[i.strip('\n')[0]]] elif i.strip('\n')[2] == 'Y': #draw score += 3 + vals[i.strip('\n')[0]] else: score += vals[loss[i.strip('\n')[0]]] print(i.strip('\n')[0], i.strip('\n')[2], score, '\n')

Dold text

Klockan sprang ivÀg och C++ krÄnglade nÀr jag hoppade över till laptopen, sÄ det fick bli en snabbare och halvful Python-variant... men ett bra tillfÀlle att pÄminna mig om hur dictionaries funkar.

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

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

Ganska rak och enkel uppgift, men det gÀllde att hÄlla tungan i rÀtt mun.

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

Idag var rolig, men det var tydligen fler Àn jag som tyckte det för inte blev det nÄgon framskjuten plats pÄ leaderboarden

Nyckeln till dagens uppgift -- för mig -- Àr att anvÀnda set för att hitta icke unika bokstÀver i de olika strÀngarna.

Var det nÄgon som gjorde pÄ nÄgot annat sÀtt?

Dold text
Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: C#
Kvalité: Kompilerar och ger rÀtt svar! Extremt snabbt ihopslÀngt sÄ Àr inte vackert Àn!

Console.WriteLine("Mickur's Advent of Code 2022 - Day 3!"); // Setup var wrongList = new List<int>(); // Part One: ... foreach (var line in File.ReadLines("input.txt")) { var firstCompartment = new List<int>(); var secondCompartment = new List<int>(); int compartmentlength = line.Length / 2; for (int i = 0; i < line.Length; i++) { int characterValue = Char.IsLower(line[i]) ? line[i] - 'a' + 1 : line[i] - 'A' + 27; if (i < compartmentlength) { firstCompartment.Add(characterValue); } else { secondCompartment.Add(characterValue); } } var intersect = firstCompartment.Intersect(secondCompartment); foreach (var value in intersect) { wrongList.Add(value); } } Console.WriteLine(wrongList.Sum()); // Part Two: ... var badgeList = new List<int>(); var firstElfList = new List<int>(); var secondElfList = new List<int>(); var thirdElfList = new List<int>(); var currentLine = 0; foreach (var line in File.ReadLines("input.txt")) { var currentElf = currentLine % 3; for (int i = 0; i < line.Length; i++) { var characterValue = char.IsLower(line[i]) ? line[i] - 'a' + 1 : line[i] - 'A' + 27; switch (currentElf) { case 0: firstElfList.Add(characterValue); break; case 1: secondElfList.Add(characterValue); break; case 2: thirdElfList.Add(characterValue); break; } } if (currentElf == 2) { // Find intersections var intersectOne = firstElfList.Intersect(secondElfList).ToList(); var intersectTwo = intersectOne.Intersect(thirdElfList).ToList(); foreach (var value in intersectTwo) { badgeList.Add(value); } // Prepare for a new set of elves firstElfList = new List<int>(); secondElfList = new List<int>(); thirdElfList = new List<int>(); } currentLine++; } Console.WriteLine(badgeList.Sum());

Dold text

Jag satt pinsamt lÀnge och försökte peta in fel svar för att jag missat den sista gruppen med alver i del tvÄ. Hoppsan! Men det verkar ha gÄtt bra ÀndÄ!

BĂ€ttre kod!

Console.WriteLine("Mickur's Advent of Code 2022 - Day 3!"); // Setup var input = File.ReadAllLines("input.txt"); // Part One: ... var wrongList = new List<int>(); foreach (var line in input) { var found = false; var compartmentLength = line.Length / 2; for (var i = 0; i < compartmentLength; i++) { if (found) break; for (var j = 0; j < compartmentLength; j++) { if (found) break; if (line[i] == line[j + compartmentLength]) { var characterValue = char.IsLower(line[i]) ? line[i] - 'a' + 1 : line[i] - 'A' + 27; wrongList.Add(characterValue); found = true; } } } } Console.WriteLine($"Part 1: {wrongList.Sum()}"); // Part Two: ... var badgeList = new List<int>(); for (var i = 0; i < input.Length; i+=3) { foreach (var character in input[i]) if (input[i+1].Contains(character) && input[i+2].Contains(character)) { var characterValue = char.IsLower(character) ? character - 'a' + 1 : character - 'A' + 27; badgeList.Add(characterValue); break; } } Console.WriteLine($"Part 2: {badgeList.Sum()}");

Dold text

Edit: Det Àr inte dag tvÄ lÀngre...
Edit 2: BĂ€ttre kod!

Visa signatur

CPU: 7950X 5GHz@1.1v | RAM: 32GB 6000MHz CL36 | GPU: KFAÂČ 3090 SG w/ AlphaCool Eisblock Aurora
Ljudkort: Modius + Magnius | Lurar: GoldPlanar GL2000 / Sennheiser HD 650 / Philips Fidelio X3 / Supreme CD-99

PermalÀnk
Medlem
●

Dag: 3
SprÄk: Go

Inga stilpoÀng hÀr

package main import ( "bufio" "fmt" "os" "strings" ) func getValue(match []rune) int { sum := 0 for i := range match { m := match[i] sub := 0 if int(m) > 96 { sub = 96 } else { sub = 38 } sum += int(m) - sub } return sum } func getPartOne(rows [][]rune) int { match := make([]rune, 0) for i := range rows { row := rows[i] rowLen := len(row) first := row[:rowLen/2] second := row[rowLen/2:] for j := range first { if strings.ContainsRune(string(second), first[j]) { match = append(match, first[j]) break } } } return getValue(match) } func getPartTwo(rows [][]rune) int { match := make([]rune, 0) i := 0 for range rows { row := rows[i] next := rows[i+1] nextNext := rows[i+2] for j := range row { if strings.ContainsRune(string(next), row[j]) && strings.ContainsRune(string(nextNext), row[j]) { match = append(match, row[j]) break } } i += 3 if i == len(rows) { break } } return getValue(match) } func getRows(filename string) [][]rune { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close() scanner := bufio.NewScanner(file) rows := make([][]rune, 0) for scanner.Scan() { row := scanner.Text() rows = append(rows, []rune(row)) } return rows } func main() { fmt.Println("Part one:", getPartOne(getRows("../input.txt"))) fmt.Println("Part two:", getPartTwo(getRows("../input.txt"))) }

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

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

Idag var rolig, men det var tydligen fler Àn jag som tyckte det för inte blev det nÄgon framskjuten plats pÄ leaderboarden

Nyckeln till dagens uppgift -- för mig -- Àr att anvÀnda set för att hitta icke unika bokstÀver i de olika strÀngarna.

Var det nÄgon som gjorde pÄ nÄgot annat sÀtt?

Dold text

Vi löste den pÄ typ samma sÀtt men jag som lÀr mig Python visste inte att det gick att göra sÄ med list funktionen. Googlade fram och anvÀnde intersect.

Andra skillnaden Àr att jag anvÀnde

string.ascii_lowercase.index(char)

som bas för prioriteten istÀllet för ord(char)

Visa signatur

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

PermalÀnk
●

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

Är hyffsat nöjd med dagens lösning Ă€ndĂ„, anvĂ€nda set sĂ„ det var bara att ta intersection mellan dom för att hitta dubletterna.

include prelude import sugar proc readInput(input: string): seq[tuple[left, right: string]] = for line in input.splitLines: let splitIndex= line.len div 2 result.add (left: line[0 ..< splitIndex], right: line[splitIndex .. ^1]) var charValue: Table[char, int] for x in 'a' .. 'z': charValue[x] = ord(x) - ord('a') + 1 for x in 'A' .. 'Z': charValue[x] = ord(x) - ord('A') + 27 proc part1(input: string) = let splitInput = readInput(input) var duplicated = collect: for (left, right) in splitInput: left.toHashSet * right.toHashSet var result = 0 for d in duplicated.mitems: assert d.len == 1 result += charValue[d.pop()] echo "Part 1: ", result proc part2(input: string) = let splitInput = readInput(input) var duplicated = collect: for i in countup(0, splitInput.high, 3): var temp: HashSet[char] = splitInput[i].left.toHashSet + splitInput[i].right.toHashSet for j in 1 .. 2: temp = temp * (splitInput[i+j].left.toHashSet + splitInput[i+j].right.toHashSet) temp echo duplicated var result = 0 for d in duplicated.mitems: assert d.len == 1, $d result += charValue[d.pop()] echo "Part 2: ", result when isMainModule: let input = readFile("input.txt") part1(input) part2(input)

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

Vi löste den pÄ typ samma sÀtt men jag som lÀr mig Python visste inte att det gick att göra sÄ med list funktionen. Googlade fram och anvÀnde intersect.

Andra skillnaden Àr att jag anvÀnde

string.ascii_lowercase.index(char)

som bas för prioriteten istÀllet för ord(char)

Dold text

Ah. Snyggt. Det Àr ju klart smidigare att göra:

string.ascii_lowercase + string.ascii_uppercase

Dold text

Àn att göra som jag gjorde.

Ps. AnvÀnd [spoiler]-taggar runt tips ;)

Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Nyckeln till dagens uppgift -- för mig -- Àr att anvÀnda set för att hitta icke unika bokstÀver i de olika strÀngarna.

Var det nÄgon som gjorde pÄ nÄgot annat sÀtt?

Dold text

Min lösning tidigare i trÄden var vektoriserad med hjÀlp av NumPy (förutom sjÀlva inlÀsningen dÄ förstÄs).

Innan jag orkade tÀnka sÄ gjorde jag en lösning genom att anpassa en RandomForest-klassificerare till alla möjliga utfall och sen lÄta den berÀkna resultatet:

Citat:

from sklearn.ensemble import RandomForestClassifier
import numpy as np

classifier = RandomForestClassifier().fit([[a, b] for a in [0, 1, 2] for b in [0, 1, 2]], [1, 2, 0, 0, 1, 2, 2, 0, 1])

with open("2.txt") as f:
rounds = np.array([[ord((s := e.split())[0]) - 65, ord(s[1]) - 88] for e in f.read().splitlines()])

np.sum(np.c_[rounds[:, 1] + 1, 3 * classifier.predict(rounds)])

Dold text
Visa signatur

1

PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: VB.Net

Imports System.IO Module Program Sub Main(args As String()) Dim part1 As Integer = 0 Dim part2 As Integer = 0 Dim rucksacks = File.ReadAllLines("input.txt") For Each rucksack In rucksacks Dim compartment1 = rucksack.Substring(0, rucksack.Length / 2) Dim compartment2 = rucksack.Substring(rucksack.Length / 2) For Each item In compartment1 If compartment2.Contains(item) Then If Char.IsUpper(item) Then part1 += Asc(item) - Asc("A") + 27 Else part1 += Asc(item) - Asc("a") + 1 End If Exit For End If Next Next For i = 0 To rucksacks.Length - 1 Step 3 For Each item In rucksacks(i) If rucksacks(i + 1).Contains(item) And rucksacks(i + 2).Contains(item) Then If Char.IsUpper(item) Then part2 += Asc(item) - Asc("A") + 27 Else part2 += Asc(item) - Asc("a") + 1 End If Exit For End If Next Next Console.WriteLine("Part1:" & part1) Console.WriteLine("Part2:" & part2) End Sub End Module

Dold text
PermalÀnk
Medlem ★
●
Skrivet av Mats Myntsamlare:

Min lösning tidigare i trÄden var vektoriserad med hjÀlp av NumPy (förutom sjÀlva inlÀsningen dÄ förstÄs).

Innan jag orkade tÀnka sÄ gjorde jag en lösning genom att anpassa en RandomForest-klassificerare till alla möjliga utfall och sen lÄta den berÀkna resultatet:

Dold text

Oj. Förklara! Hur tÀnkte du? Varför fungerar det hÀr?

Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: C#

Koden i min del tvÄ Àr nÀstintill olaglig. Spyr

internal async Task<int> PT1() { var backPacks = (await File.ReadAllTextAsync(InputPath)).Split(Environment.NewLine); int sum = 0; foreach (var backPack in backPacks) { HashSet<char> c1 = backPack.Take(backPack.Length / 2).ToHashSet(); HashSet<char> c2 = new HashSet<char>(); HashSet<char> seen = new HashSet<char>(); for (int i = backPack.Length / 2; i < backPack.Length; i++) { if (c1.Contains(backPack[i]) && !seen.Contains(backPack[i])) { char item = backPack[i]; seen.Add(item); if (item < 97) sum += 27 + (item - 65); else sum += 1 + (item - 97) } } } return sum; } internal async Task<int> PT2() { return (await File.ReadAllTextAsync(InputPath)) .Split(Environment.NewLine) .Chunk(3) .Sum(group => group[0] .GroupJoin(group[1], g0 => g0, g1 => g1, (g0, g1) => new { g0, g1 }).Where(grp => grp.g1.Any()) .GroupJoin(group[2], first => first.g0, g1 => g1, (first, second) => new { first, second }) .Where(grp => grp.first.g1.Any() && grp.second.Any()) .DistinctBy(grp => grp.first.g0) .Select(i => i.first.g0 < 97 ? (27 + (i.first.g0 - 65)) : (1 + (i.first.g0 - 97))) .First() // should only be one ); }

Dold text

Kom pÄ nu i efterhand att intersect hade varit vÀldigt mycket enklare Àn groupjoin

Gjorde del 2 Ànnu vidrigare
PermalÀnk
Datavetare ★
●

Dag: 3
SprÄk: Go

package main import ( "fmt" "math/bits" "unicode" ) type bitset uint64 type rucksack struct { compartments [2]bitset } func makeBitset(desc string) bitset { bset := bitset(0) for _, content := range desc { if unicode.IsLower(content) { bset |= (1 << (content - 'a')) } else { bset |= (1 << (content - 'A' + 26)) } } return bset } func (b bitset) priority() int { return 1 + bits.TrailingZeros64(uint64(b)) } func (r rucksack) priority() int { return (r.compartments[0] & r.compartments[1]).priority() } func (r rucksack) items() bitset { return r.compartments[0] | r.compartments[1] } func sumOfDuplicateItems(rs []rucksack) int { sum := 0 for _, r := range rs { sum += r.priority() } return sum } func groupPriority(group []rucksack) int { grpItems := group[0].items() for _, rcksck := range group[1:] { grpItems &= rcksck.items() } return grpItems.priority() } func chunks(rs []rucksack, sz int) chan []rucksack { ch := make(chan []rucksack) go func() { for i := 0; i < len(rs); i += sz { chk := []rucksack{} for j := i; j < i+sz; j++ { chk = append(chk, rs[j]) } ch <- chk } close(ch) }() return ch } func sumOfGroupItems(rs []rucksack) int { sum := 0 for group := range chunks(rs, 3) { sum += groupPriority(group) } return sum } func parseRucksacks(input []string) []rucksack { rs := []rucksack{} for _, row := range input { mid := len(row) / 2 a := makeBitset(row[:mid]) b := makeBitset(row[mid:]) rs = append(rs, rucksack{[2]bitset{a, b}}) } return rs } func day3(input []string) { rs := parseRucksacks(input) fmt.Println(sumOfDuplicateItems(rs)) fmt.Println(sumOfGroupItems(rs)) } func init() { Solutions[3] = day3 }

Lösning

Finns bibliotek till Go för att addera saker som Filter(), Map(), Reduce() etc. T.ex. funk. Men kör nog AoC med standardbiblioteket.

AnvÀnde 64-bits heltal + bitoperationer för att lösa problemet, bara för att

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: 3
SprÄk: Python (Det hade gÄtt att göra en oneliner av denna ocksÄ, men jag bröt ut en funktion för lÀsbarhetens skull )

from functools import reduce def prio(s): return x - 96 if (x := ord(next(iter(s)))) > 96 else x - 38 packs = open("input03").read().split('\n') print(sum([prio([set(bp[:l]) & set(bp[l:]) for l in [len(bp) // 2]][0]) for bp in packs]), sum([prio(reduce(set.intersection, map(set,x))) for x in zip(packs[::3],packs[1::3],packs[2::3])]))

Dold text