Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C++ (Circle)
CIRCT
Clean
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Nim
Objective-C
Objective-C++
OCaml
OpenCL C
Pascal
Pony
Python
Racket
Ruby
Rust
Snowball
Scala
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
TypeScript Native
V
Vala
Visual Basic
WASM
Zig
Javascript
GIMPLE
Ygen
rust source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
mrustc (master)
rustc 1.0.0
rustc 1.1.0
rustc 1.10.0
rustc 1.11.0
rustc 1.12.0
rustc 1.13.0
rustc 1.14.0
rustc 1.15.1
rustc 1.16.0
rustc 1.17.0
rustc 1.18.0
rustc 1.19.0
rustc 1.2.0
rustc 1.20.0
rustc 1.21.0
rustc 1.22.0
rustc 1.23.0
rustc 1.24.0
rustc 1.25.0
rustc 1.26.0
rustc 1.27.0
rustc 1.27.1
rustc 1.28.0
rustc 1.29.0
rustc 1.3.0
rustc 1.30.0
rustc 1.31.0
rustc 1.32.0
rustc 1.33.0
rustc 1.34.0
rustc 1.35.0
rustc 1.36.0
rustc 1.37.0
rustc 1.38.0
rustc 1.39.0
rustc 1.4.0
rustc 1.40.0
rustc 1.41.0
rustc 1.42.0
rustc 1.43.0
rustc 1.44.0
rustc 1.45.0
rustc 1.45.2
rustc 1.46.0
rustc 1.47.0
rustc 1.48.0
rustc 1.49.0
rustc 1.5.0
rustc 1.50.0
rustc 1.51.0
rustc 1.52.0
rustc 1.53.0
rustc 1.54.0
rustc 1.55.0
rustc 1.56.0
rustc 1.57.0
rustc 1.58.0
rustc 1.59.0
rustc 1.6.0
rustc 1.60.0
rustc 1.61.0
rustc 1.62.0
rustc 1.63.0
rustc 1.64.0
rustc 1.65.0
rustc 1.66.0
rustc 1.67.0
rustc 1.68.0
rustc 1.69.0
rustc 1.7.0
rustc 1.70.0
rustc 1.71.0
rustc 1.72.0
rustc 1.73.0
rustc 1.74.0
rustc 1.75.0
rustc 1.76.0
rustc 1.77.0
rustc 1.78.0
rustc 1.79.0
rustc 1.8.0
rustc 1.80.0
rustc 1.81.0
rustc 1.82.0
rustc 1.9.0
rustc beta
rustc nightly
rustc-cg-gcc (master)
x86-64 GCCRS (GCC master)
x86-64 GCCRS (GCCRS master)
x86-64 GCCRS 14.1 (GCC)
x86-64 GCCRS 14.2 (GCC)
Options
Source code
use std::{cmp::{max, min}, ops::RangeInclusive}; pub fn input_generator(input: &str) -> (isize, isize, isize, isize) { let (_, coords) = input.split_once(": ").expect("valid message"); let (xcoords, ycoords) = coords.split_once(", ").expect("valid message"); let xcoords = xcoords.strip_prefix("x=").expect("valid message"); let ycoords = ycoords.strip_prefix("y=").expect("valid message"); let (xmin, xmax) = xcoords.split_once("..").expect("valid message"); let (ymin, ymax) = ycoords.split_once("..").expect("valid message"); let xmin = xmin.parse().expect("valid message"); let xmax = xmax.parse().expect("valid message"); let ymin = ymin.parse().expect("valid message"); let ymax = ymax.parse().expect("valid message"); (xmin, xmax, ymin, ymax) } macro_rules! all_x { ($xmin:expr, $xmax:expr) => {{ let xmin = { $xmin }; let xmax = { $xmax }; assert!(xmin >= 0); assert!(xmin <= xmax); let mut startx = 0usize; let mut maxdistancex = 0usize; while maxdistancex < xmin as usize { startx += 1; maxdistancex += startx; } (startx..xmax as usize + 1) .filter_map(move |dx| { let mut distance = 0usize; let mut startstep = usize::MAX; let mut endstep = 0; for (step, moveamt) in (0..dx + 1).rev().enumerate() { if distance < xmin as usize { distance += moveamt; continue; } else if distance <= xmax as usize { distance += moveamt; startstep = min(startstep, step); endstep = max(endstep, step); } else { break; } } if startstep == usize::MAX { None } else if endstep == dx { Some((startstep..=usize::MAX, dx)) } else { Some((startstep..=endstep, dx)) } }) }}; } macro_rules! all_y { ($ymin:expr, $ymax:expr) => {{ let ymin = { $ymin }; let ymax = { $ymax }; assert!(ymin <= ymax); let targety = ymin..=ymax; let yrangemax = match (ymin < 0, ymax < 0) { (true, true) => -ymin, (true, false) => max(-ymin, ymax), (false, false) => ymax, (false, true) => unreachable!(), }; (-yrangemax..yrangemax + 1) .filter_map(move |dy| { let mut firstrange = None; let mut secondrange = None; let mut distance = 0; let mut prevhit = false; let mut hitfrom = 0; for (step, moveamt) in (isize::MIN..dy + 1).rev().enumerate() { let hit = targety.contains(&distance); if prevhit != hit { if hit { hitfrom = step; } else { firstrange = Some(hitfrom..=step - 1); if moveamt > 0 { let refect = dy as usize * 2 + 1; let hitfrom2 = refect - (step - 1); let step2 = refect - (hitfrom); secondrange = Some(hitfrom2..=step2); }; break; } prevhit = hit; } else if moveamt < 0 && distance < ymin { break; } distance += moveamt; } if let Some(firstrange) = firstrange { Some(((firstrange, secondrange), dy)) } else { None } }) }}; } macro_rules! all_velocity { ($all_x:expr, $all_y:expr) => {{ let all_x = { $all_x }; { $all_y } .map(|((range1, range2), dy)| { let minstart = *range1.start(); all_x.iter() .take_while(move |(rangex, _)| *rangex.end() >= minstart) .filter_map(move |(rangex, dx)| { get_first_step(rangex, (&range1, range2.as_ref())).map(|step| (*dx, dy, step)) }) }) .flatten() }}; } fn get_first_step(xrange: &RangeInclusive<usize>, (yrange1, yrange2): (&RangeInclusive<usize>, Option<&RangeInclusive<usize>>)) -> Option<usize> { if yrange1.start() <= xrange.end() && xrange.start() <= yrange1.end() { Some(max(*yrange1.start(), *xrange.start())) } else if let Some(yrange2) = &yrange2 { if yrange2.start() <= xrange.end() && xrange.start() <= yrange2.end() { Some(max(*yrange2.start(), *xrange.start())) } else { None } } else { None } } pub fn solve_part1(&(xmin, xmax, ymin, ymax): &(isize, isize, isize, isize)) -> Option<isize> { let possiblex: Vec<_> = all_x!(xmin, xmax).collect(); let possiblevelocity = all_velocity!(&possiblex, all_y!(ymin, ymax)); possiblevelocity .map(|(_dx, dy, step)| { if dy <= 0 { 0 } else if step >= dy as usize { (dy * dy + dy) / 2 } else { ((step * step + step) / 2) as isize } }) .max() } pub fn solve_part2(&(xmin, xmax, ymin, ymax): &(isize, isize, isize, isize)) -> Option<usize> { let possiblex: Vec<_> = all_x!(xmin, xmax).collect(); let possiblevelocity = all_velocity!(&possiblex, all_y!(ymin, ymax)); Some(possiblevelocity.count()) }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
About the author
Statistics
Changelog
Version tree