Quest 4: Teeth of the Wind
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
Link to participate: https://everybody.codes/
You must log in or # to comment.
I liked this one!
import Control.Arrow import Control.Monad import Data.List import Data.Ratio simpleTrain = uncurry (%) . (head &&& last) . map read compoundTrain input = let a = read $ head input z = read $ last input gs = map ( uncurry (%) . (read *** read . tail) . break (== '|') ) $ (tail . init) input in foldl' (/) (a % z) gs part1, part2, part3 :: [String] -> Integer part1 = floor . (2025 *) . simpleTrain part2 = ceiling . (10000000000000 /) . simpleTrain part3 = floor . (100 *) . compoundTrain main = forM_ [ ("everybody_codes_e2025_q04_p1.txt", part1), ("everybody_codes_e2025_q04_p2.txt", part2), ("everybody_codes_e2025_q04_p3.txt", part3) ] $ \(input, solve) -> readFile input >>= print . solve . linesNim
For part 3 I parse gears as tuples, with regular gears having same value on both ends e.g.
3|5 -> (3, 5) 3 -> (3, 3)proc parseGears(input: string): seq[int] = for line in input.splitLines(): result.add parseInt(line) proc parseNestedGears(input: string): seq[(int, int)] = for line in input.splitLines(): let nested = line.split('|').mapIt(it.parseInt) result.add: if nested.len == 1: (nested[0], nested[0]) else: (nested[0], nested[1]) proc solve_part1*(input: string): Solution = let gears = parseGears(input) result := 2025 * gears[0] div gears[^1] proc solve_part2*(input: string): Solution = let gears = parseGears(input) result := ceil(10000000000000'f64 / (gears[0] / gears[^1])).int proc solve_part3*(input: string): Solution = let gears = parseNestedGears(input) let ratios = (0..gears.high-1).mapIt(gears[it][1] / gears[it+1][0]) result := int(100 * ratios.prod)Full solution at Codeberg: solution.nim
Rust
use num::{BigInt, Integer}; pub fn solve_part_1(input: &str) -> String { let gears: Vec<i64> = input.trim().lines().map(|g| g.parse().unwrap()).collect(); (2025 * gears[0] / gears.last().unwrap()).to_string() } pub fn solve_part_2(input: &str) -> String { let gears: Vec<i64> = input.trim().lines().map(|g| g.parse().unwrap()).collect(); let res = (BigInt::parse_bytes(b"10000000000000", 10).unwrap() * gears.last().unwrap()) .div_ceil(&(BigInt::ZERO + gears[0])); res.to_string() } pub fn solve_part_3(input: &str) -> String { let mut lines = input.trim().lines(); let first_gear = BigInt::parse_bytes(lines.next().unwrap().as_bytes(), 10).unwrap(); let mut nominator: BigInt = first_gear * 100; let mut denominator: BigInt = BigInt::ZERO + 1; for line in lines { let mut split = line.split("|"); denominator *= BigInt::parse_bytes(split.next().unwrap().as_bytes(), 10).unwrap(); match split.next() { Some(size) => { nominator *= BigInt::parse_bytes(size.as_bytes(), 10).unwrap(); } None => { break; } } } (nominator / denominator).to_string() }



