a-conjecture-of-mine

An exercise on polyglossy: the same problem solved on multiple languages

main.rs (1428B)

      1 // The following program is a simple test for the following conjecture:
      2 
      3 // Let S: N -> N be the sum of the digits of a positive integer.
      4 // For all A and B in N, S(A + B) = S(A) + S(B) - 9k, where k is an integer.
      5 
      6 use std::{env, process};
      7 
      8 const SUCCESS: i32 = 0;
      9 const FAIL: i32 = 1;
     10 const INVALID_INPUT: i32 = 2;
     11 
     12 macro_rules! parse_arg {
     13     ($argv: expr) => {{
     14         match $argv.next().and_then(|s| s.trim().parse().ok()) {
     15             Some(n) => n,
     16             None    => process::exit(INVALID_INPUT)
     17         }
     18     }}
     19 }
     20 
     21 fn main() {
     22     let mut args = env::args();
     23     args.next();
     24 
     25     let max = parse_arg!(args);
     26 
     27     if counterexempl(max) {
     28         process::exit(FAIL);
     29     } else {
     30         process::exit(SUCCESS);
     31     }
     32 }
     33 
     34 fn counterexempl(max: usize) -> bool {
     35     let sums_cache = get_sums(max);
     36 
     37     for a in 0..max {
     38         for b in a..max {
     39             if (sums_cache[a + b] - sums_cache[a] - sums_cache[b]) % 9 != 0 {
     40                 return true;
     41             }
     42         }
     43     }
     44 
     45     false
     46 }
     47 
     48 fn sum_digits(n: usize) -> isize {
     49     let mut sum = 0;
     50     let mut part = n;
     51 
     52     while part != 0 {
     53         sum += part % 10;
     54         part /= 10;
     55     }
     56 
     57     sum as isize
     58 }
     59 
     60 fn get_sums(max: usize) -> Vec<isize> {
     61     let mut output = Vec::with_capacity(2 * max);
     62 
     63     for n in 0..max * 2 {
     64         output.push(sum_digits(n));
     65     }
     66 
     67     output
     68 }
     69