🌟 Advent of Code (AoC) 2021 🌟

PermalÀnk
Datavetare ★
●

Dag: 3
SprÄk: Rust

use crate::solution::Solution; type ReportEntry = u32; struct Day3 { report: Vec<ReportEntry>, zeros: Vec<u32>, bit_width: usize, } impl Solution for Day3 { fn part1(&self) -> String { power_consumption(&self.zeros, self.report.len(), self.bit_width) .to_string() } fn part2(&self) -> String { life_support_rating(&self.report, self.bit_width) .to_string() } } fn power_consumption(zeros: &[u32], num_reports: usize, bit_width: usize) -> ReportEntry { let thresh = (num_reports / 2) as ReportEntry; let gamma = zeros .iter() .map(|&num_zeros| (num_zeros <= thresh) as ReportEntry) .fold(0, |gamma, bit_value| (gamma << 1) + bit_value); let epsilon = !gamma & ((1 << bit_width) - 1); gamma * epsilon } fn life_support_rating(report: &[ReportEntry], bit_width: usize) -> ReportEntry { oxygen_generator_rating(report, bit_width) * co_scrubber_rating(report, bit_width) } fn oxygen_generator_rating(report: &[ReportEntry], bit_width: usize) -> ReportEntry { rating(report, bit_width, |num_ones, report_len| 2 * num_ones >= report_len) } fn co_scrubber_rating(report: &[ReportEntry], bit_width: usize) -> ReportEntry { rating(report, bit_width, |num_ones, report_len| 2 * num_ones < report_len) } fn rating(report: &[ReportEntry], bit_width: usize, cmp_fn: fn(usize, usize) -> bool) -> ReportEntry { let should_be_set_fn = |numbers: &[u32], bit: usize| { let num_ones = numbers .iter() .fold(0, |num_set, &number| num_set + is_bit_set(number, bit) as usize); cmp_fn(num_ones, numbers.len()) }; let mut numbers = report.to_vec(); for bit in (0..bit_width).rev() { let should_be_set = should_be_set_fn(&numbers, bit); numbers = numbers .into_iter() .filter(|&number| !(is_bit_set(number, bit) ^ should_be_set)) .collect(); if numbers.len() == 1 { break } } numbers[0] } fn is_bit_set(number: u32, bit: usize) -> bool { ((number >> bit) & 1) != 0 } pub fn new(input: &str) -> Box<dyn Solution> { let (report, zeros, bit_width) = input_parser(input); Box::new(Day3{ report, zeros, bit_width, }) } fn input_parser(input: &str) -> (Vec<ReportEntry>, Vec<u32>, usize) { let bit_width = input.find('\n').expect("Invalid input"); let numbers = input .lines() .map(|num_str| ReportEntry::from_str_radix(num_str, 2).expect("Not a binary number")); let mut report = Vec::new(); let mut zeros = vec![0; bit_width]; for number in numbers { report.push(number); for i in 0..bit_width { // First bit in input is used as LSB in gamma/epsilon zeros[bit_width - i - 1] += is_bit_set(number, i) as u32; } } (report, zeros, bit_width) }

Dold text

Ingen strÀnghantering, hÀr Àr det bit-twiddel

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

Lite dÄligt med tid idag sÄ fÄr se om jag hinner skriva en APL version senare ikvÀll eller i helgen.

val input = Using.resource(Source.fromFile("3.txt"))(_.getLines().toVector) input.transpose .map(bits => 2 * bits.count(_ == '0') <= bits.length) .foldLeft((0, 0)) { case ((g, e), true) => ((g << 1) + 1, e << 1) case ((g, e), false) => (g << 1, (e << 1) + 1) } .pipe(_ * _) input.head.indices .foldLeft((input, input)) { case ((xs, ys), idx) => val xs0 = if xs.length == 1 then xs else val b = if 2 * xs.count(_(idx) == '0') <= xs.length then '1' else '0' xs.filter(_(idx) == b) val ys0 = if ys.length == 1 then ys else val b = if 2 * ys.count(_(idx) == '0') <= ys.length then '1' else '0' ys.filter(_(idx) != b) (xs0, ys0) } .pipe((xs, ys) => Integer.parseInt(xs.head, 2) * Integer.parseInt(ys.head, 2))

Dold text
PermalÀnk
●

Dag: 3 (edit: hoppsan skrev en 4 först)
SprÄk: Rust
Lösning: Github

use std::fs; pub fn run() { let data = fs::read_to_string("dec_03.txt").expect("unable to read file"); part1(&data); //part2(&data); } fn part1(data: &String) { let mut number = vec![0; 12]; for line in data.lines() { let mut i = 0; for char in line.chars() { match char { '0' => number[i] -= 1, '1' => number[i] += 1, _ => println!("Bad data"), } i += 1; } } let mut gamma = 0; let mut epsilon = 0; let mut digit = 0; for n in number.iter().rev() { match n { n if n < &0 => { epsilon += u32::pow(2, digit); } n if n > &0 => { gamma += u32::pow(2, digit); } _ => println!("Bad data"), } digit += 1; } println!("{}", gamma * epsilon); }

Dold text

Herregud idag sket d sig ordentligt :P. Harvade med att försöka fÄ in bitvec craten, men kompilatorn tokvÀgrade vilket kÀndes mÀrkligt eftersome vscode tyckte alt va som d skulle. Fick ihop en kass lösning av del 1 iaf. Kanske ger mig pÄ elÀndet en runda till efter jag har sneglat pÄ andras lösningar.

PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: go
mindre snygg snabb lunchlösning

func main() { fileName := "" if len(os.Args) == 1 { fileName = "input.txt" } else { fileName = os.Args[1] } input, err := helpers.ReadLines(fileName) if err != nil { panic(err) } gamma, epsilon, oxygen, co2 := Calculate(input) fmt.Printf("Gamma rate: %v, Epsilon rate: %v, Power Consumption: %v, Oxygen rate: %v, co2 rate: %v, Life rate: %v\n", gamma, epsilon, gamma*epsilon, oxygen, co2, oxygen*co2) } func Calculate(input []string) (int, int, int, int) { wordLength := len(input[0]) count := make([]int, wordLength) for i := 0; i < wordLength; i++ { count[i], _ = calculateMostCommonBit(input, i) } gammaString := "" epsilonString := "" oxygenString := "" scrubberString := "" var err error for _, val := range count { if val < 0 { gammaString += "0" epsilonString += "1" } else { gammaString += "1" epsilonString += "0" } } oxygenString, err = calculateOxygenCo2(input, true) if err != nil { panic(err) } scrubberString, err = calculateOxygenCo2(input, false) if err != nil { panic(err) } var gamma, epsilon, oxygen, co2 int64 = 0, 0, 0, 0 if gamma, err = strconv.ParseInt(gammaString, 2, 64); err != nil { panic(err) } if epsilon, err = strconv.ParseInt(epsilonString, 2, 64); err != nil { panic(err) } if oxygen, err = strconv.ParseInt(oxygenString, 2, 64); err != nil { panic(err) } if co2, err = strconv.ParseInt(scrubberString, 2, 64); err != nil { panic(err) } return int(gamma), int(epsilon), int(oxygen), int(co2) } func calculateMostCommonBit(input []string, index int) (int, rune) { count := 0 for _, num := range input { if num[index] == '0' { count -= 1 } else { count += 1 } } if count < 0 { return count, '0' } else if count > 0 { return count, '1' } return count, ' ' } func Filter(input []string, filter func(s string) bool) (result []string) { for _, num := range input { if filter(num) { result = append(result, num) } } return result } func calculateOxygenCo2(input []string, oxygen bool) (string, error) { var filter func(s string) bool length := len(input[0]) for i := 0; i < length; i++ { mostCommon, char := calculateMostCommonBit(input, i) if oxygen { filter = func(s string) bool { return rune(s[i]) == char || (mostCommon == 0 && s[i] == '1') } } else { filter = func(s string) bool { return (rune(s[i]) != char && mostCommon != 0) || (mostCommon == 0 && s[i] == '0') } } input = Filter(input, filter) if len(input) == 1 { return input[0], nil } } return "", fmt.Errorf("could not get result from input: %s", input) }

Dold text
PermalÀnk
●

Jag hoppar med hÀr ocksÄ eftersom min andra leaderboard Àr sÄ tom. Kör med haskell i Är och lÀgger koden pÄ github. Hoppas komma halvvÀgs Ätminstone!

Dag 3
SprÄk: haskell

import Data.List main = interact solve solve input = "Problem 1: " ++ show (solution1 measurements) ++ "\n" ++ "Problem 2: " ++ show (solution2 measurements) ++ "\n" where measurements = map parseLine (lines input) parseLine [] = [] parseLine (x:xs) = (if x=='1' then 1 else 0):(parseLine xs) solution1 measurements = gamma*epsilon where (gamma,epsilon) = foldl ratios (0,0) bitSums ratios (x,y) bitSum | 2*bitSum >= length measurements = (2*x+1,2*y ) | otherwise = (2*x ,2*y+1) bitSums = foldr (zipWith (+)) accInit measurements accInit = (take.length.head) measurements (repeat 0) solution2 m = (getRating m mostCommonBit) * (getRating m leastCommonBit) where mostCommonBit xs = if 2*sum xs >= length xs then 1 else 0 leastCommonBit xs = 1 - (mostCommonBit xs) getRating measurements searchStrategy = toDecimal (getRatingHelper [] searchStrategy) where getRatingHelper prefix searchStrategy = if length matches == 1 then head matches else getRatingHelper (prefix ++ [searchStrategy nextColumn]) searchStrategy where matches = filter (prefix `isPrefixOf`) measurements nextColumn = map (head.(drop (length prefix))) matches toDecimal bits = foldr (\x acc -> 2*acc + x) 0 (reverse bits)

Dold text
LĂ€gger till kodsnutt
PermalÀnk
Medlem
●

Dag: 3
SprÄk: Golang

Fick aldrig nÄgon ordning pÄ bit operationerna, sÄ det blev strÀnglösning..

package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func getPartOne(rows []string) int { var gammaBitVal, epsilonBitVal string for x := 0; x < len(rows[0]); x++ { var oneCount int var zeroCount int for y := 0; y < len(rows); y++ { if rows[y][x] == 49 { oneCount++ } else { zeroCount++ } } if oneCount > zeroCount { gammaBitVal += "1" epsilonBitVal += "0" } else { gammaBitVal += "0" epsilonBitVal += "1" } } return parseBitInt(gammaBitVal) * parseBitInt(epsilonBitVal) } func parseBitInt(val string) int { result, err := strconv.ParseInt(val, 2, 16) if err != nil { panic(err) } return int(result) } func getPartTwo(rows []string) int { var oxygenPattern string var oxygenBitVal string for x := 0; x < len(rows[0]); x++ { var oneCount int var zeroCount int for y := 0; y < len(rows); y++ { if !strings.HasPrefix(rows[y], oxygenPattern) { continue } oxygenBitVal = rows[y] if rows[y][x] == 49 { oneCount++ } else { zeroCount++ } } if oneCount >= zeroCount { oxygenPattern += "1" } else { oxygenPattern += "0" } } var co2Pattern string var co2BitVal string for x := 0; x < len(rows[0]); x++ { var oneCount int var zeroCount int for y := 0; y < len(rows); y++ { if !strings.HasPrefix(rows[y], co2Pattern) { continue } co2BitVal = rows[y] if rows[y][x] == 49 { oneCount++ } else { zeroCount++ } } if oneCount >= zeroCount { co2Pattern += "0" } else { co2Pattern += "1" } } return parseBitInt(co2BitVal) * parseBitInt(oxygenBitVal) } func getRows(filename string) []string { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close() scanner := bufio.NewScanner(file) var rows []string for scanner.Scan() { row := scanner.Text() rows = append(rows, 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 filosofis:

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

use std::fs; pub fn run() { let data = fs::read_to_string("dec_03.txt").expect("unable to read file"); part1(&data); //part2(&data); } fn part1(data: &String) { let mut number = vec![0; 12]; for line in data.lines() { let mut i = 0; for char in line.chars() { match char { '0' => number[i] -= 1, '1' => number[i] += 1, _ => println!("Bad data"), } i += 1; } } let mut gamma = 0; let mut epsilon = 0; let mut digit = 0; for n in number.iter().rev() { match n { n if n < &0 => { epsilon += u32::pow(2, digit); } n if n > &0 => { gamma += u32::pow(2, digit); } _ => println!("Bad data"), } digit += 1; } println!("{}", gamma * epsilon); }

Dold text

Herregud idag sket d sig ordentligt :P. Harvade med att försöka fÄ in bitvec craten, men kompilatorn tokvÀgrade vilket kÀndes mÀrkligt eftersome vscode tyckte alt va som d skulle. Fick ihop en kass lösning av del 1 iaf. Kanske ger mig pÄ elÀndet en runda till efter jag har sneglat pÄ andras lösningar.

Redan dag 4, kÀnner igen det dÀr utbrÀnningsymptomet

PermalÀnk
Medlem ★
●

Dag: 3
SprÄk: C#
Lösning: Github

public class Day3 { private string[] logbook = File.ReadAllLines("./input/day3.txt"); private int BinaryToInt(string b) => Convert.ToInt32(b, 2); private enum Rating { OxygenRating, Co2Rating } public int Part1() { var gamma = string.Empty; var epsilon = string.Empty; for (var i = 0; i < 12; i++) { var ones = 0; var zeroes = 0; foreach (var log in logbook) { ones += log[i] == '1' ? 1 : 0; zeroes += log[i] == '0' ? 1 : 0; } gamma += ones > zeroes ? "1" : "0"; epsilon += zeroes > ones ? "1" : "0"; } return BinaryToInt(gamma) * BinaryToInt(epsilon); } public int Part2() => Search(Rating.OxygenRating) * Search(Rating.Co2Rating); private int Search(Rating rating) { var oxygenOrCO2 = rating == Rating.OxygenRating ? true : false; var logs = logbook.ToList(); foreach (var i in Enumerable.Range(0, logbook[0].Length)) { var logCount = logs.Count(log => log[i] == '1'); var searchFor = (2 * logCount >= logs.Count) == oxygenOrCO2 ? '1' : '0'; logs = logs.Where(log => log[i] == searchFor).ToList(); if (logs.Count == 1) { return BinaryToInt(logs[0]); } } return 0; } }

Jag kan erkÀnna att jag inte löste denna utan att snegla pÄ andras lösningar först ifall nÄgon tycker koden ser bekant ut :)
Visa signatur

EndeavourOS: Your search for the best Arch distro ends here
7800X3D » RX6950XT » G.SKILL 32GB » LG OLED42C35LA

PermalÀnk
Skrivmaskin ★
●

Dag 3
SprÄk: C++
Lösning (del 1):

Med facit i hand borde jag ha tagit tillfÀllet i akt för att lÀra mig bit-funktionaliteten Tog alldeles för lÄng tid att identifiera den hemliga char-konverteringen som jag stÀllde till med. Sparar del tvÄ till lite senare!

#include <vector> #include <fstream> #include <iostream> #include "readfile.h" #include <math.h> using namespace std; int main() { vector<string> logdata = readfile("input.txt"); string allData{}; for (string x : logdata) allData += x; int spacing{logdata[0].size()}; int gammaNumber{0}; int epsilonNumber{0}; int bitPos{0}; for (bitPos; bitPos< spacing; bitPos++) { int temp{0}; for (int specificIndex{0}; specificIndex < allData.size(); specificIndex += spacing) { temp += (allData.at(specificIndex+bitPos)-48); } if (temp < 0.5*logdata.size()) { epsilonNumber += pow(2, (spacing-bitPos-1)); } else { gammaNumber += pow(2, (spacing-bitPos-1)); } } cout << "Epsilon: " << epsilonNumber << endl << "Gamma: " << gammaNumber << endl << "Power consumption: " << (epsilonNumber*gammaNumber) << endl; return 0; }

Eller https://github.com/wittwang98/Advent-of-Code-2021/tree/main/D...

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

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

Dag: 4
SprÄk: Python 3
Lösning: GitHub, men mycket av spelandet sker i Utils.

Bra dag, men det var lÀngesedan jag anvÀnde numpy sÄ en hel del tid gick Ät till att söka i dokumentationen. Detta till trots fick jag ihop en lösning jag tycker Àr lÀttlÀst och vÀlfungerande. Det gÄr sÀkerligen att hitta svaret snabbare eller pÄ fÀrre rader kod, men jag ser inte riktigt vitsen med att skriva den sortens kod.

SÀrskilt nöjd blev jag med Del 2.

Det enda som skiljer min Del 1 frÄn min Del 2 Àr:

bingos[mx] = True if all(bingos):

pÄ raderna 30 och 31.

Dold text
Visa signatur

:(){ :|:& };:

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

PermalÀnk
●

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

Idag var första dagen jag anvÀnde ett externt bibliotek for sjÀlva gridden. MÄste ta och skriva en egen gridutils, kÀnns som det kommer bli vÀldigt anvÀndbart i Är. Blev inte den mest eleganta lösningen idag, men men...

Dold text
PermalÀnk
●

Dag: 4
SprÄk: Scala

Idag körde jag lite brute-force för att jag var lite lat..
Tar man sovmorgon pÄ helgen sÄ Äker man direkt ner pÄ leader-boarden har jag ocksÄ lÀrt mig.

object Day4 { val test = readLines("4/test.txt") val lines = readLines("4/data.txt") case class Board(idx: Int, lines: Seq[String]) { private val rowsSeq = lines.map { line => val sc = new Scanner(line) (0 until 5).map(_ => sc.nextInt()) } private val rows = rowsSeq.map(_.toSet) private val cols = (0 until 5).map { col => rowsSeq.map(_(col)).toSet } private val boardNumbers = rows.flatten.toSet def hasSolution(numbers: Seq[Int]): Boolean = { val numSet = numbers.toSet (rows ++ cols).exists(_ subsetOf numSet) } def score(numbers: Seq[Int]): Int = { val numSet = numbers.toSet boardNumbers.diff(numSet).sum * numbers.last } } val numbers = lines(0).split(",").map(_.toInt) val boards = lines.slice(2, lines.length) .splitBetween((_, s) => s.isEmpty) .zip(Iterator.from(0)) .map { case (lines, idx) => Board(idx, lines) } def main(args: Array[String]): Unit = { part1() part2() } def part1(): Unit = { for(i <- 5 until numbers.length) { val soFar = numbers.slice(0, i) boards.find(_.hasSolution(soFar)) match { case Some(board) => println(board.score(soFar)) return case None => // keep going } } } def part2(): Unit = { def lastBoard(boards: Seq[Board], count: Int): Unit = { val soFar = numbers.slice(0, count) if(boards.length == 1) { println(boards.head.score(soFar)) } else { lastBoard(boards.filterNot(_.hasSolution(soFar)), count + 1) } } lastBoard(boards, 5) } }

Dold text
Fixade lite i koden...
PermalÀnk
Medlem ★
●

Dag: 4
SprÄk: Python, eller rÀttare sagt list comprehensions och numpy. Under 20 rader, inklusive whitespace och en kommentar

NÀr jag sÄg uppgift tvÄ skrotade jag min första lösning och löste bÄda pÄ en gÄng.

import numpy as np l = [l.strip() for l in open("input04").readlines()] numbers = [int(n) for n in l[0].split(",")] lines = [[int(i) for i in line.split()] for line in l[2:] if line] boards = [np.array(lines[i:i + 5]) for i in range(0, len(lines), 5)] def turns_to_win_and_score(board): for i, n in enumerate(numbers): board[np.where(board == n)] = -n # any line or column where all the numbers are negative? if any([line.all() for x in [board < 0, board.transpose() < 0] for line in x]): return i, sum(board[board >= 0]) * n bingos = list(map(turns_to_win_and_score, boards)) print(min(bingos)[1], max(bingos)[1])

Dold text
Fixade stavfel i kommentaren :)
PermalÀnk
Medlem
●

Dag: 4
SprÄk: Rust

#[derive(Debug, Clone)] struct Board { board: Vec<(u32, bool)>, size: usize, bingo: bool, last_number: Option<u32>, } impl Board { pub fn new(board: &[u32], size: usize) -> Self { let board = board.iter().map(|v| (*v, false)).collect(); Self { board, size, bingo: false, last_number: None, } } pub fn mark(&mut self, number: u32) { if self .board .iter_mut() .find(|p| p.0 == number) .map(|p| p.1 = true) .is_some() { self.last_number = Some(number); } } pub fn row_bingo(&self) -> bool { let size = self.size; self.board .chunks(size) .any(|chunk| chunk.iter().all(|item| item.1)) } pub fn column_bingo(&self) -> bool { let size = self.size; 'outer: for col in 0..size { for row in 0..size { if !self.board[row * size + col].1 { continue 'outer; } } return true; } false } // Immutable för att kunna filtrera pub fn bingo(&self) -> bool { self.bingo } pub fn bingo_mut(&mut self) -> bool { if !self.bingo { self.bingo = self.row_bingo() || self.column_bingo() } self.bingo } pub fn score(&self) -> u32 { let sum: u32 = self.board.iter().filter(|p| !p.1).map(|p| p.0).sum(); sum * self.last_number.unwrap_or(0) } } fn create_game() -> Option<(Vec<Board>, Vec<u32>)> { let input = std::fs::read_to_string("input.txt").ok()?; let mut lines = input.lines(); let numbers_to_draw: Vec<_> = lines .next()? .split(',') .filter_map(|s| s.parse::<u32>().ok()) .collect(); let mut temp = vec![]; let mut boards = vec![]; for line in lines.filter(|p| !p.is_empty()) { let mut line = line .split(' ') .filter_map(|s| s.parse::<u32>().ok()) .collect::<Vec<_>>(); let size = line.len(); temp.append(&mut line); if temp.len() == size.pow(2) { boards.push(Board::new(&temp, size)); temp.clear(); } } Some((boards, numbers_to_draw)) } fn play(mut filter: impl FnMut(&mut Board) -> bool) { let (mut boards, nums) = create_game().unwrap(); 'outer: for num in nums { for board in boards.iter_mut().filter(|board| !board.bingo()) { board.mark(num); if filter(board) { break 'outer; } } } } fn main() { // Part 1 score 89001 play(|board: &mut Board| { if board.bingo_mut() { println!("{}", board.score()); return true; } false }); // Part 2 score 7296 let mut board_snapshot = None; play(|board: &mut Board| { if board.bingo_mut() { board_snapshot = Some(board.clone()); } false }); if let Some(board) = board_snapshot { println!("{}", board.score()); } }

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
●

Dag: 4
SprÄk Python

Det var en stund sen numpy anvÀndes mÀrker jag, har en kÀnsla av att det gÄr att göra betydligt snyggare lösningar.

import numpy as np with open("4.in") as f: nums, *boards = f.read().split("\n\n") nums = [int(x) for x in nums.split(",")] boards = np.array([[[int(x) for x in row.split()] for row in board.rstrip().split("\n")] for board in boards]) board_states = np.ones_like(boards) def bingos(board_states): return np.any((np.sum(board_states, axis=1) == 0) | (np.sum(board_states, axis=2) == 0), axis=1) p1 = None p2 = None previous_bingos = bingos(board_states) for num in nums: board_states[boards == num] = 0 current_bingos = bingos(board_states) new_bingos = previous_bingos ^ current_bingos if np.any(new_bingos): bingo_id = np.where(new_bingos) score = np.sum(boards[bingo_id] * board_states[bingo_id]) p2 = score * num if p1 is None: p1 = p2 previous_bingos = current_bingos print(p1, p2)

Dold text
PermalÀnk
●
Skrivet av Ingetledigtnamn:

Dag: 4
SprÄk: Python, eller rÀttare sagt list comprehensions och numpy. Under 20 rader, inklusive whitespace och en kommentar

NÀr jag sÄg uppgift tvÄ skrotade jag min första lösning och löste bÄda pÄ en gÄng.

import numpy as np l = [l.strip() for l in open("input04").readlines()] numbers = [int(n) for n in l[0].split(",")] lines = [[int(i) for i in line.split()] for line in l[2:] if line] boards = [np.array(lines[i:i + 5]) for i in range(0, len(lines), 5)] def turns_to_win_and_score(board): for i, n in enumerate(numbers): board[np.where(board == n)] = -n # any line or column where all the numbers are negative? if any([line.all() for x in [board < 0, board.transpose() < 0] for line in x]): return i, sum(board[board >= 0]) * n bingos = list(map(turns_to_win_and_score, boards)) print(min(bingos)[1], max(bingos)[1])

Dold text

Snyggt! Mycket enklare Àn sÄ hÀr gÄr det nog inte göra :). Det verkar som att det smygit med en typo för dina villkor dock, 0 mÄste inkluderas i jÀmförelsen för att det ska bli rÀtt, dvs

board < 0, board.transpose() < 0

blir

board <= 0, board.transpose() <= 0

Dold text
PermalÀnk
Medlem ★
●

Du har rÀtt.

Jag vet att jag fuskade lite dÀr. Nollan kom efter att alla brickor "gÄtt i mÄl" sÄ jag struntade i det problemet. Att sÀtta vÀrdet till -0 funkar ju inte, men man kan sÀtta till -1 istÀllet för -n och dÄ borde det bete sig bÀttre om nollan kommer innan man fÄtt bingo pÄ alla brickor.

PermalÀnk
Hedersmedlem ★
●

Dag: 4
SprÄk: TypeScript (med Node.JS)
Lösning: https://github.com/exscape/AOC2021/blob/main/src/day4.ts

Edit 17:26: Gammalt nedan -- bestÀmde mig för att anvÀnda Github till detta ÀndÄ, sÄ drygt att inte ha syntax highlighting nÀr man ska lÀsa, och jag har ju ÀndÄ kört Git hela tiden.

import { Solution } from './solution.js'; import { readFile, arraySum } from './common.js'; class Square { value: number; drawn: boolean; constructor(value: number, drawn: boolean) { this.value = value; this.drawn = drawn; } } class Board { board: Square[][]; hasWon: boolean; constructor(lines: string[]) { this.board = []; this.hasWon = false; for (let line of lines) { let row = line.trim() .split(new RegExp("\\s+")) .map(s => new Square(parseInt(s), false)); this.board.push(row); } } mark(draw: number) { for (let row = 0; row < 5; row++) { for (let col = 0; col < 5; col++) { if (this.board[row][col].value == draw) this.board[row][col].drawn = true; } } } hasBingo(): boolean { if (this.board.some(row => this.lineHasBingo(row)) || this.boardColumns().some(col => this.lineHasBingo(col))) { this.hasWon = true; return true; } return false; } score(lastDraw: number): number { // Find the sum of all unmarked numbers, then multiply by lastDraw return lastDraw * arraySum(this.board .flat() .filter(sq => !sq.drawn) .map(sq => sq.value)); } lineHasBingo(line: Square[]): boolean { return line.every(square => square.drawn); } boardColumns(): Square[][] { // Transpose the matrix to make the columns into rows (and vice versa) return this.board[0].map((_,i) => this.board.map(x => x[i])); } print(draw?: number) { for (let row = 0; row < 5; row++) { for (let col = 0; col < 5; col++) { if (this.board[row][col].drawn) process.stdout.write('\u001b[' + 41 + 'm'); process.stdout.write(`${this.board[row][col].value}`); if (this.board[row][col].drawn) process.stdout.write('\u001b[0m'); process.stdout.write(" "); } process.stdout.write("\n"); } if (draw !== undefined) console.log(`Score is: ${this.score(draw)}\n`); } } class Day4 implements Solution { answer() { readFile("data/day4.txt", (data) => { let [numbers, ...board_data] = data.split("\r\n\r\n"); let boards = []; for (let data of board_data) { boards.push(new Board(data.split("\r\n"))); } let winners = new Array<[Board, number]>(); for (let drawnStr of numbers.split(",")) { let draw = parseInt(drawnStr); for (let board of boards) { if (board.hasWon) continue; board.mark(draw); if (board.hasBingo()) winners.push([board, draw]); } if (boards.every(b => b.hasWon)) break } console.log("---------- DAY 4 ----------"); // Part 1 console.log("First winner:"); let [board, draw] = winners[0]; board.print(draw); // Part 2 [board, draw] = winners[winners.length - 1]; console.log("Last winner:"); board.print(draw); console.log("---------------------------"); }); } } export { Day4 }

Dold text

Mycket kod idag. Ville försöka göra det relativt snyggt, och mÄlet för mig Àr ju att lÀra mig TypeScript, sÄ jag körde pÄ med klasser och grejer istÀllet för att bara med med arrayer.
Kanske snyggar till lite senare (lagra "draw" i Board istÀllet för i winners-arrayen, t ex). "print()" kanske ryker ocksÄ eftersom koden Àr sÄ ful och den frÀmst var tÀnkt till felsökning, men den behövdes typ aldrig.

Version 2 med Àndringarna ovan:

import { Solution } from './solution.js'; import { readFile, arraySum } from './common.js'; class Square { value: number; drawn: boolean; constructor(value: number, drawn: boolean) { this.value = value; this.drawn = drawn; } } class Board { board: Square[][]; hasWon: boolean; lastDraw: number; constructor(lines: string[]) { this.board = []; this.hasWon = false; this.lastDraw = -1; for (let line of lines) { let row = line.trim() .split(new RegExp("\\s+")) .map(s => new Square(parseInt(s), false)); this.board.push(row); } } mark(draw: number) { this.lastDraw = draw; for (let row = 0; row < 5; row++) { for (let col = 0; col < 5; col++) { if (this.board[row][col].value == draw) this.board[row][col].drawn = true; } } } hasBingo(): boolean { if (this.board.some(row => this.lineHasBingo(row)) || this.boardColumns().some(col => this.lineHasBingo(col))) { this.hasWon = true; return true; } return false; } score(): number { // Find the sum of all unmarked numbers, then multiply by lastDraw return this.lastDraw * arraySum(this.board .flat() .filter(sq => !sq.drawn) .map(sq => sq.value)); } lineHasBingo(line: Square[]): boolean { return line.every(square => square.drawn); } boardColumns(): Square[][] { // Transpose the matrix to make the columns into rows (and vice versa) return this.board[0].map((_,i) => this.board.map(x => x[i])); } } class Day4 implements Solution { answer() { readFile("data/day4.txt", (data) => { let [numbers, ...board_data] = data.split("\r\n\r\n"); let boards: Board[] = []; for (let data of board_data) { boards.push(new Board(data.split("\r\n"))); } for (let drawnStr of numbers.split(",")) { let draw = parseInt(drawnStr); for (let board of boards) { board.mark(draw); if (board.hasBingo()) { if (boards.length == board_data.length) { // True if this is the first winner, as no boards have been removed from the game yet console.log(`Day 4 Part 1: ${board.score()}`); } else if (boards.length == 1) { console.log(`Day 4 Part 2: ${board.score()}`); } boards = boards.filter((b: Board) => b != board); } } } }); } } export { Day4 }

Dold text

Edit: Ändrade lösning 2 ocksĂ„.
Tog bort firstWinner-boolean och löste det ÀndÄ. Oklart om detta Àr snyggare dock.

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: 4
SprÄk: F#

Även i Ă„r försöker jag ta mig igen AoC med F#. Jag har inte skrivit F# sen förra AoC (och innan dess hade jag aldrig skrivit F#)...

Lösningsförslag:

open System open System.IO type Marking = MARKED | UNMARKED type Cell = Marking*int type BoardId = int type Board = BoardId*list<list<Cell>> let hasMarking marking (cell:Cell) = let (mark, _) = cell marking = mark let hasBingo (board:Board) = let _, cells = board let allRowRotations = cells@(List.transpose cells) allRowRotations |> List.exists (List.forall (hasMarking MARKED)) let markCell value (board:Board) : Board = let markCell' cell = match cell with | UNMARKED, int when int = value -> (MARKED, int) | _ -> cell let id, cells = board let newCells = cells |> List.map (List.map markCell') (id, newCells) let rec playGame_1 draws boards = match draws with | [] -> None | draw::rest -> let newBoards = boards |> List.map (markCell draw) let boardWithBingo = List.tryFind hasBingo newBoards match boardWithBingo with | Some board -> Some(draw,board) | None -> (playGame_1 rest newBoards) let rec playGame_2 draws boards = match draws with | [] -> None | draw::rest -> let newBoards = boards |> List.map (markCell draw) let boardsWithoutBingo = newBoards |> List.filter (hasBingo >> not) if (boardsWithoutBingo = []) then Some (draw, newBoards.Head) //assume we only have one board left when winning last else playGame_2 rest boardsWithoutBingo let CalculateScore (winnerDraw:int) (winnerBoard:Board) = let _, cells = winnerBoard let unmarkedSum = cells |> List.concat |> List.filter (hasMarking UNMARKED) |> List.sumBy snd winnerDraw*unmarkedSum let parseInput file = let lines = File.ReadLines file let draws = (lines |> Seq.head).Split (",", StringSplitOptions.TrimEntries) |> Seq.map int |> Seq.toList let rec parseBoards (lines: seq<string>) boards id = let parserSingleBoard (lines: seq<string>) id : Board = let intLines = lines |> List.ofSeq |> List.map (fun x -> (x.Split (" ", (StringSplitOptions.TrimEntries ||| StringSplitOptions.RemoveEmptyEntries)) |> Seq.toList |> List.map int)) (id, intLines |> List.map (List.map (fun x -> (UNMARKED, x)))) let linesToInspect = lines |> Seq.truncate 5 if (linesToInspect |> Seq.length <> 5) then boards |> List.rev else parseBoards (lines |> Seq.skip 6) ((parserSingleBoard linesToInspect id)::boards) (id+1) let boards = parseBoards (Seq.skip 2 lines) [] 0 (draws, boards) let draws, boards = parseInput "day4.txt" let res task = match (task draws boards) with | Some(winnerDraw, board) -> CalculateScore winnerDraw board | None -> -1 printfn "task 1: %i" (res playGame_1) printfn "task 2: %i" (res playGame_2)

Dold text

Parsningen Àr inte snygg för fem öre.

Visa signatur

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

PermalÀnk
Medlem ★
●

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

Var tydligen pÄ humör för extensions idag.

PermalÀnk
Medlem
●

Dag: 4
SprÄk: Carth

Utnyttjade sortering pÄ ett stÀlle för att lösa denna uppgiften, sÄ nu har man fÄtt lÀgga till en Merge Sort i standardbiblioteket

(import std) (define main (do io/bind (<- input (io/map unwrap! (read-file "inputs/day4.txt"))) (let (([draws boards] (map-two parse-draws parse-boards (unwrap! (string/split-first-line input)))) (scores (play draws (array/iter boards))))) (display (str-append "Part 1: first to win = " (show-int (array/first! scores)))) (display (str-append "Part 1: last to win = " (show-int (array/last! scores)))))) (define (parse-draws s) (map (<o unwrap! parse-int) (string/splits-on "," s))) (define: (parse-boards s) (Fun Str (Array (Array (Maybe Int)))) (array/collect (map (fun (c) (array/collect (map parse-int (flat-map words (skip (to-nat 1) (array/iter c)))))) (iter/chunks (to-nat 6) (lines s))))) (define (play draws boards) (car (foldl (fun ([scores1 boards] draw) (let1 [scores2 boards'] (mark-boards draw boards) [(array/append scores1 scores2) (list/iter boards')])) [array/nil boards] draws))) (define (mark-boards x bs) (map-car (<o (merge-sort int/cmp) array/collect-list) (partition-eithers (map (mark-board x) bs)))) (define (mark-board x b) (match (array/find-by (maybe/= = (Some x)) b) (case (Some i) (let1 b' (array/set! i None b) (if (bingo? (to-int i) b') (Left (score x b')) (Right b')))) (case None (Right b)))) (define (bingo? i b) (define (winning-line? is) (all none? (map (fun (i) (array/lookup! (to-nat i) b)) is))) (let ((row-is (take 5 (range-from (* (/ i 5) 5)))) (col-is (map (fun (j) (+ (rem i 5) (* 5 j))) (range 0 4)))) (or (winning-line? row-is) (winning-line? col-is)))) (define (score x b) (* x (sum (cat-maybes (array/iter b)))))

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

Dag 4
SprÄk: C#
Lösning: github

Ganska rÀttframt ÀndÄ, antar jag. Större delen av tiden lades pÄ att avkoda input-datat pÄ ett korrekt sÀtt, dÀrefter pÄ att fixa slarvfel vid avgörande av vinst (missade t.ex. att diagonaler inte skulle rÀknas, och dÄ blir det ju inte rÀtt brÀde som vinner). Kunde nog kört lite mer LINQ, men men.

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

Kan nog delta med Java dÄ det Àr sprÄket som primÀrt anvÀnds pÄ jobbet.
Första gÄngen för mig att delta Hur Àr upplÀgget?

Jag kollade pÄ första uppgiften frÄn 2020, det verkade som att man skulle iterera igenom en lista med x antal vÀrden, plocka ut och summera x och y sÄ att summan blev 2020 dÀrefter multiplicera x och y och resultatet Àr svaret, korrekt?

Är junior inom programmering men vill gĂ€rna lĂ€ra mig mer. Vad har ni för tips? Hur Ă€r svĂ„righetsgraden?

Hur fungerar det om man kopplar sitt Github konto?

Naj

PermalÀnk
Medlem
●

Mer constexpr! mer problem med msvc! mer skoj!

MSVC vÀgrar kompilera nu sÄ kör clang-cl. TyvÀrr finns inte constexpr-vector i clang Àn sÄ fÄr handkoda med arrayer.
FÄr se om jag klarar en hel vecka eller om jag fÄr slut pÄ c++ kompilatorer.

https://godbolt.org/z/3vhzMx71Y

PermalÀnk
Medlem
●

Om man som jag Àr van med mer matrisvÀnliga alternativ som MATLAB och Numpy sÄ tog det emot lite att göra dagens problem i C++. LÀste lite om xtensor, nÄgon som har ris eller ros att ge? Andra alternativ?

PermalÀnk
Datavetare ★
●

Dag: 4
SprÄk: Rust

use crate::solution::Solution; use std::{ cell::{Cell, RefCell}, collections::HashMap, }; struct Day4 { numbers: Vec<u32>, boards: RefCell<Vec<BingoBoard>>, score_last_board: Cell<u32>, } #[derive(Default)] struct BingoBoard { board: HashMap<u32, Tile>, called_in_row: [u8; 5], called_in_col: [u8; 5], done: bool, } struct Tile { col: usize, row: usize, is_called: bool, } impl BingoBoard { fn add_row(&mut self, line: &str, row: usize) { let numbers = line .split_ascii_whitespace() .map(|num_str| num_str.parse().expect("Not a number")) .enumerate(); for (col, number) in numbers { self.board.insert( number, Tile { col, row, is_called: false, }, ); } } fn call_number(&mut self, number: u32) -> Option<u32> { if self.done { return None; } if let Some(mut tile) = self.board.get_mut(&number) { tile.is_called = true; self.called_in_col[tile.col] += 1; self.called_in_row[tile.row] += 1; if self.called_in_col[tile.col] == 5 || self.called_in_row[tile.row] == 5 { self.done = true; return Some(self.score(number)); } } None } fn score(&self, number: u32) -> u32 { let sum = self.board.iter().fold(0, |sum, (&num, tile)| { if tile.is_called { sum } else { sum + num } }); sum * number } } impl Solution for Day4 { fn part1(&self) -> String { self.play().to_string() } fn part2(&self) -> String { self.score_last_board.get().to_string() } } impl Day4 { fn play(&self) -> u32 { let mut scores = Vec::new(); for &number in &self.numbers { for board in self.boards.borrow_mut().iter_mut() { if let Some(score) = board.call_number(number) { scores.push(score); } } } self.score_last_board.set(*scores.last().unwrap()); scores[0] } } pub fn new(input: &str) -> Box<dyn Solution> { let mut lines = input.lines(); let numbers = lines.next().map(numbers_parse).expect("Missing numbers"); let mut boards = Vec::new(); let mut board = BingoBoard::default(); let mut row = 0; for line in lines { if !line.is_empty() { board.add_row(line, row); row += 1; if row == 5 { boards.push(board); board = BingoBoard::default(); row = 0; } } } Box::new(Day4 { numbers, boards: RefCell::new(boards), score_last_board: Cell::new(0), }) } fn numbers_parse(line: &str) -> Vec<u32> { line.split(',') .map(|num_str| num_str.parse().expect("Not a number")) .collect() }

Dold text

Denna tog lite mer CPU Àn tidigare, men fortfarande gÄr det att lösa dag 1-4 pÄ totalt ~300 ”s pÄ en M1 MBA.

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
●

Tog betydligt lÀngre tid idag men eftersom jag Àr nybörjare pÄ APL Àr det rÀtt kul att försöka förstÄ möjligheterna.
Detta Àr lösningen för gÄrdagens problem, har inte börjat titta pÄ dagens problem Ànnu.
SprÄk Dyalog APL.

dag3←⍎¹↑⊃⎕NGET'data/2021_dag3.txt'1 colmid←2Ă·âšâ‰ą gamma←2⊄~(colmid dag3)<+⌿dag3 epsilon←2⊄~(colmid dag3)≄+⌿dag3 ⎕←'Power consumption:',gamma×epsilon ]dinput rating←{ âș←1 column←âș⌷⍉⍔ filter←(âșâș column)=column remain←filterâŒżâ” 1=⍹≱remain:remain (âș+1)∇ remain } oxygen←+2⊄,(+/≄(colmid⊱))rating dag3 co2←+2⊄,(+/<(colmid⊱))rating dag3 ⎕←'Life support rating:',oxygen×co2

Dold text
PermalÀnk
Medlem
●
Skrivet av Yoshman:

Dag: 4
SprÄk: Rust

use std::{ cell::{Cell, RefCell}, collections::HashMap }; use crate::solution::Solution; struct Day4 { numbers: Vec<u32>, boards: RefCell<Vec<BingoBoard>>, score_last_board: Cell<u32>, } #[derive(Default)] struct BingoBoard { board: HashMap<u32, Tile>, called_in_row: [u8; 5], called_in_col: [u8; 5], done: bool, } struct Tile { col: usize, row: usize, is_called: bool, } impl BingoBoard { fn add_row(&mut self, line: &str, row: usize) { let numbers = line .split_ascii_whitespace() .map(|num_str| num_str.parse().expect("Not a number")) .enumerate(); for (col, number) in numbers { self.board.insert( number, Tile { col, row, is_called: false, }, ); } } fn call_number(&mut self, number: u32) -> Option<u32> { if self.done { return None } if let Some(mut tile) = self.board.get_mut(&number) { tile.is_called = true; self.called_in_col[tile.col] += 1; self.called_in_row[tile.row] += 1; if self.called_in_col[tile.col] == 5 || self.called_in_row[tile.row] == 5 { return Some(self.score(number)) } } None } fn score(&mut self, number: u32) -> u32 { self.done = true; let score = self.board.iter().fold(0, |score, (&number, tile)| { if tile.is_called { score } else { score + number } }); score * number } } impl Solution for Day4 { fn part1(&self) -> String { self.play().to_string() } fn part2(&self) -> String { self.score_last_board.get().to_string() } } impl Day4 { fn play(&self) -> u32 { let mut scores = Vec::new(); for &number in &self.numbers { for board in self.boards.borrow_mut().iter_mut() { if let Some(score) = board.call_number(number) { scores.push(score); } } } self.score_last_board.set(*scores.last().unwrap()); scores[0] } } pub fn new(input: &str) -> Box<dyn Solution> { let mut numbers = Vec::new(); let mut boards = Vec::new(); let mut board = BingoBoard::default(); let mut row = 5; for line in input.lines() { if line.is_empty() { continue; } if row == 5 { numbers = numbers_parse(line); row = 0; } else { board.add_row(line, row); row += 1; if row == 5 { boards.push(board); board = BingoBoard::default(); row = 0; } } } Box::new(Day4 { numbers, boards: RefCell::new(boards), score_last_board: Cell::new(0), }) } fn numbers_parse(line: &str) -> Vec<u32> { line.split(',') .map(|num_str| num_str.parse().expect("Not a number")) .collect() }

Dold text

Denna tog lite mer CPU Àn tidigare, men fortfarande gÄr det att lösa dag 1-4 pÄ totalt ~300 ”s pÄ en M1 MBA.

I new() skulle du kunna spara iteratorn i en variabel och anropa .next() manuellt en gÄng för att flytta ut undantagsfallet med den första raden frÄn innuti loopen. Lite oombett tips sÄhÀr pÄ kvÀllskvisten

let mut lines = input.lines(); let numbers = numbers_parse(lines.next().unwrap()); for line in lines { ...

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

Dag: 4
SprÄk: Carth

Utnyttjade sortering pÄ ett stÀlle för att lösa denna uppgiften, sÄ nu har man fÄtt lÀgga till en Merge Sort i standardbiblioteket

(import std) (define main (do io/bind (<- input (io/map unwrap! (read-file "inputs/day4.txt"))) (let (([draws boards] (map-two parse-draws parse-boards (unwrap! (string/split-first-line input)))) (scores (play draws (array/iter boards))))) (display (str-append "Part 1: first to win = " (show-int (array/first! scores)))) (display (str-append "Part 1: last to win = " (show-int (array/last! scores)))))) (define (parse-draws s) (map (<o unwrap! parse-int) (string/splits-on "," s))) (define: (parse-boards s) (Fun Str (Array (Array (Maybe Int)))) (array/collect (map (fun (c) (array/collect (map parse-int (flat-map words (skip (to-nat 1) (array/iter c)))))) (iter/chunks (to-nat 6) (lines s))))) (define (play draws boards) (car (foldl (fun ([scores1 boards] draw) (let1 [scores2 boards'] (mark-boards draw boards) [(array/append scores1 scores2) (list/iter boards')])) [array/nil boards] draws))) (define (mark-boards x bs) (map-car (<o (merge-sort int/cmp) array/collect-list) (partition-eithers (map (mark-board x) bs)))) (define (mark-board x b) (match (array/find-by (maybe/= = (Some x)) b) (case (Some i) (let1 b' (array/set! i None b) (if (bingo? (to-int i) b') (Left (score x b')) (Right b')))) (case None (Right b)))) (define (bingo? i b) (define (winning-line? is) (all none? (map (fun (i) (array/lookup! (to-nat i) b)) is))) (let ((row-is (take 5 (range-from (* (/ i 5) 5)))) (col-is (map (fun (j) (+ (rem i 5) (* 5 j))) (range 0 4)))) (or (winning-line? row-is) (winning-line? col-is)))) (define (score x b) (* x (sum (cat-maybes (array/iter b)))))

Dold text

Jag fÄr lite vibbar av Objective-C och Rust ihopsmetat dÄ jag försöker förstÄ syntaxen.

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

Jag fÄr lite vibbar av Objective-C och Rust ihopsmetat dÄ jag försöker förstÄ syntaxen.

... och Lisp antar jag? Ser ut att vara huvudsaklingen frÄn relaterade sprÄk.

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