Overkill VI: The Rust and the Overkill
OK, let’s do this one last time. This is a logic problem from my son’s math homework from middle school, which of course, I felt the need to write a brute force solver. I’ve done it in Perl, Raku, Python, Ruby, Javascript, C, and Go.
My first-pass code used loops and recursion to fill the nine spots in the Magic Box, but I was shown the magic of permutation in a suggestion to speed up my Raku code.
Last year, I played some with Rust, but got confused with how to pass arrays I wanted to modify. A part of my new organization is involved in an ongoing discussion for the next language to build our stuff on, and this is largely a Rust-vs-Go thing, and I hadn’t gotten past “Hello World” for Rust, so I decided to move forward.
One of the first things that I did was find a permute
library. Permuting A,B,C
would get you A,B,C
, A,C,B
, B,A,C
, B,C,A
, C,A,B
and C,B,A
. Giving it 3..11
gives us every variation we would want. Except, of course, that permute
gives us an iterator
, not array
, so we have to pull from the iterator
and place them into a mutable array, and then test from there.
It’s not great Rust, but it does the thing. I’ve done a Rust!
use permute::permutations_of;
fn main() {
// the basics of this: the numbers between 3 and 11
let numbers: [i32;9] = [3,4,5,6,7,8,9,10,11];
// permutations_of gives all the variations of
// that array, in an iterator form
for p in permutations_of( &numbers ) {
// a blank second array to shove this in
let mut arr2: [i32;9] = [0,0,0, 0,0,0, 0,0,0] ;
// for each entry in the permutations iterator,
// dereference and put into the array.
let mut i = 0;
for e in p {
arr2[i] = *e ;
i = i + 1;
}
// and we test
check_magic_box(arr2);
}
}
fn check_magic_box( array: [i32;9] ) -> bool {
let sum = 21;
// the rows
if sum != array[0] + array[1] + array[2] { return false }
if sum != array[3] + array[4] + array[5] { return false }
if sum != array[6] + array[7] + array[8] { return false }
// the columns
if sum != array[0] + array[3] + array[6] { return false }
if sum != array[1] + array[4] + array[7] { return false }
if sum != array[2] + array[5] + array[8] { return false }
// the diagonals
if sum != array[0] + array[4] + array[8] { return false }
if sum != array[2] + array[4] + array[6] { return false }
// display correct magic box
for x in 0..3 {
for y in 0..3 {
let i = ( x * 3 ) + y;
let j = array[i];
print!("\t{}",j)
}
println!("");
}
println!("");
true
}