diff --git a/src/main.rs b/src/main.rs index 2741dabbc2..bdbfff0830 100644 --- a/src/main.rs +++ b/src/main.rs @@ -67,13 +67,13 @@ fn name(mut n: u64) -> String { name.chars().rev().collect() } -fn pop(mut n: u64) -> u64 { - let mut pop = 0; +fn population(mut n: u64) -> u64 { + let mut population = 0; while n > 0 { - pop += n & 1; + population += n & 1; n >>= 1; } - pop + population } #[cfg(test)] @@ -115,9 +115,9 @@ mod tests { } #[test] - fn pops() { - assert_eq!(pop(0), 0); - assert_eq!(pop(1), 1); - assert_eq!(pop(u64::max_value()), 64); + fn populations() { + assert_eq!(population(0), 0); + assert_eq!(population(1), 1); + assert_eq!(population(u64::max_value()), 64); } } diff --git a/src/traits.rs b/src/traits.rs index c3bc836363..94590ffb59 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -1,8 +1,8 @@ use super::*; pub(crate) fn run(n: u64) -> Result { - if n < subsidy(0) { - println!("genesis"); + if n > 2099999997689999 { + return Err("Invalid satoshi".into()); } if n % 2 == 0 { @@ -38,34 +38,33 @@ pub(crate) fn run(n: u64) -> Result { } println!( - "luck:{}/{}", + "luck: {}/{}", digits.iter().filter(|c| **c == '8').count() as i64 - digits.iter().filter(|c| **c == '4').count() as i64, digits.len() ); - println!("population:{}", pop(n),); + println!("population: {}", population(n)); - println!("name:{}", name(n)); + println!("name: {}", name(n)); + + if let Some(character) = char::from_u32((n % 0x110000) as u32) { + println!("character: {:?}", character); + } let mut block = 0; - let mut mined = 0; + let mut remaining = SUPPLY; loop { - if n == mined { + if n == remaining - 1 { println!("shiny"); } let subsidy = subsidy(block); - if subsidy == 0 { - println!("block:∞"); - break; - } - - mined += subsidy; + remaining -= subsidy; - if mined > n { - println!("block:{}", block); + if remaining <= n { + println!("block: {}", block); break; } diff --git a/tests/traits.rs b/tests/traits.rs index a700ca2e4c..a05c1be963 100644 --- a/tests/traits.rs +++ b/tests/traits.rs @@ -6,20 +6,12 @@ fn traits(n: u64) -> Result> { .args(&["traits", &n.to_string()]) .ignore_stdout() .run_with_stdout()? - .split_whitespace() + .lines() .map(str::to_owned) .collect(), ) } -#[test] -fn genesis() -> Result { - assert!(traits(0)?.contains("genesis")); - assert!(traits(50 * COIN_VALUE - 1)?.contains("genesis")); - assert!(!traits(50 * COIN_VALUE)?.contains("genesis")); - Ok(()) -} - #[test] fn even() -> Result { assert!(traits(0)?.contains("even")); @@ -69,53 +61,52 @@ fn divine() -> Result { #[test] fn name() -> Result { - assert!(traits(0)?.contains("name:")); - assert!(traits(1)?.contains("name:a")); - assert!(traits(26)?.contains("name:z")); - assert!(traits(27)?.contains("name:aa")); + assert!(traits(0)?.contains("name: ")); + assert!(traits(1)?.contains("name: a")); + assert!(traits(26)?.contains("name: z")); + assert!(traits(27)?.contains("name: aa")); Ok(()) } #[test] fn block() -> Result { - assert!(traits(0)?.contains("block:0")); - assert!(traits(1)?.contains("block:0")); - assert!(traits(50 * 100_000_000 - 1)?.contains("block:0")); - assert!(traits(50 * 100_000_000)?.contains("block:1")); - assert!(traits(50 * 100_000_000 + 1)?.contains("block:1")); - assert!(traits(2099999997689999)?.contains("block:6929999")); - assert!(traits(2099999997690000)?.contains("block:∞")); + assert!(traits(2099999997689999)?.contains("block: 0")); + assert!(traits(2099999997689998)?.contains("block: 0")); + assert!(traits(2099999997689999 - 50 * 100_000_000)?.contains("block: 1")); + assert!(traits(0)?.contains("block: 6929999")); + assert!(traits(1)?.contains("block: 6929998")); Ok(()) } #[test] fn lucky() -> Result { - assert!(traits(0)?.contains("luck:0/1")); - assert!(traits(8)?.contains("luck:1/1")); - assert!(traits(88)?.contains("luck:2/2")); - assert!(traits(89)?.contains("luck:1/2")); - assert!(traits(84)?.contains("luck:0/2")); - assert!(traits(4)?.contains("luck:-1/1")); + assert!(traits(0)?.contains("luck: 0/1")); + assert!(traits(8)?.contains("luck: 1/1")); + assert!(traits(88)?.contains("luck: 2/2")); + assert!(traits(89)?.contains("luck: 1/2")); + assert!(traits(84)?.contains("luck: 0/2")); + assert!(traits(4)?.contains("luck: -1/1")); Ok(()) } #[test] fn shiny() -> Result { assert!(traits(0)?.contains("shiny")); - assert!(!traits(1)?.contains("shiny")); - assert!(!traits(50 * 100_000_000 - 1)?.contains("shiny")); - assert!(traits(50 * 100_000_000)?.contains("shiny")); - assert!(!traits(50 * 100_000_000 + 1)?.contains("shiny")); + assert!(traits(1)?.contains("shiny")); + assert!(traits(2099999997689999)?.contains("shiny")); + assert!(!traits(2099999997689998)?.contains("shiny")); + assert!(traits(2099999997689999 - 50 * 100_000_000)?.contains("shiny")); + assert!(!traits(2099999997689999 - 50 * 100_000_000 - 1)?.contains("shiny")); Ok(()) } #[test] fn population() -> Result { - assert!(traits(0)?.contains("population:0")); - assert!(traits(1)?.contains("population:1")); - assert!(traits(2)?.contains("population:1")); - assert!(traits(3)?.contains("population:2")); - assert!(traits(4)?.contains("population:1")); + assert!(traits(0)?.contains("population: 0")); + assert!(traits(1)?.contains("population: 1")); + assert!(traits(2)?.contains("population: 1")); + assert!(traits(3)?.contains("population: 2")); + assert!(traits(4)?.contains("population: 1")); Ok(()) } @@ -140,3 +131,13 @@ fn cube() -> Result { assert!(traits(27)?.contains("cube")); Ok(()) } + +#[test] +fn character() -> Result { + assert!(traits(0x000000)?.contains("character: '\\u{0}'")); + assert!(traits(0x000041)?.contains("character: 'A'")); + assert!(traits(0x01F602)?.contains("character: '😂'")); + assert!(traits(0x110000)?.contains("character: '\\u{0}'")); + assert!(traits(0x110041)?.contains("character: 'A'")); + Ok(()) +}