#![no_std] use common::{format_str, print, read}; fn main() { let buf = [0u8; 65000]; read(buf.as_ptr(), buf.len()); let mut input = str::from_utf8(&buf).unwrap(); input = input.trim_end_matches(char::MIN); let result_one = one(input); let result_two = two(input); print!(64, "one: {}\ntwo: {}\n", result_one, result_two); } fn one(input: &str) -> usize { input .split(",") .map(|mut range| { range = range.trim(); let (first, last) = range .split_once("-") .map(|(first, last)| (first.parse::().unwrap(), last.parse::().unwrap())) .unwrap(); let mut ret = 0; for i in first..=last { let mut buf = [0; 20]; let mut i_s = format_str(&mut buf, format_args!("{}", i)); i_s = i_s.trim_end_matches(char::MIN); for j in 0..i_s.len() { let mut amount = 0; let a = i_s .matches(&i_s[0..j]) .map(|a| { amount += 1; a.len() }) .sum::(); // remove amount check to do those that repeat more times if a == i_s.len() && amount == 2 { //print!(30, "found {}\n", i); ret += i as usize; break; } } } ret }) .sum::() } fn two(input: &str) -> usize { input .split(",") .map(|mut range| { range = range.trim(); let (first, last) = range .split_once("-") .map(|(first, last)| (first.parse::().unwrap(), last.parse::().unwrap())) .unwrap(); let mut ret = 0; for i in first..=last { let mut buf = [0; 20]; let mut i_s = format_str(&mut buf, format_args!("{}", i)); i_s = i_s.trim_end_matches(char::MIN); for j in 0..i_s.len() { let a = i_s.matches(&i_s[0..j]).map(|a| a.len()).sum::(); if a == i_s.len() { ret += i as usize; break; } } } ret }) .sum::() } #[cfg(test)] mod test { use super::*; const EXAMPLE_INPUT: &str = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124"; #[test] fn example() { assert_eq!(one(EXAMPLE_INPUT), 1227775554); assert_eq!(two(EXAMPLE_INPUT), 4174379265); } #[test] fn one_a() { assert_eq!(one("3131219357-3131417388\n"), 6262562625); } }