From 0645ef2d2b3087289fcf54bdcce5df3e0e1904d7 Mon Sep 17 00:00:00 2001 From: Tilman Hoffbauer Date: Fri, 16 Apr 2021 10:14:44 +0200 Subject: [PATCH] Add code --- .gitignore | 1 + Cargo.lock | 5 +++++ Cargo.toml | 9 +++++++++ README.md | 11 +++++++++++ output.txt | 29 +++++++++++++++++++++++++++++ src/main.rs | 22 ++++++++++++++++++++++ 6 files changed, 77 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 output.txt create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..228fb3a --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "stellenteilerraetsel" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..709a479 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "stellenteilerraetsel" +version = "0.1.0" +authors = ["Tilman Hoffbauer "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ffeac1 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Stellenteiler-Rätsel + +*Finde eine Zahl in einer Basis n, wo die erste Stelle sich durch 1, die erste und zweite Stelle durch 2, ..., die erste bis n-te Stelle sich durch n teilen lässt.* + +Lösung in Rust implementiert. Auf einem Ryzen 5 2700 mit 16 GB RAM getestet. Programmausführung per Cargo: + +``` +cargo run --release +``` + +Zur Installation von Rust siehe rustup. diff --git a/output.txt b/output.txt new file mode 100644 index 0000000..71b1a68 --- /dev/null +++ b/output.txt @@ -0,0 +1,29 @@ +Basis 2: [2] +Basis 3: [] +Basis 4: [108, 228] +Basis 5: [] +Basis 6: [13710, 44790] +Basis 7: [] +Basis 8: [6996920, 11128712, 12306056] +Basis 9: [] +Basis 10: [3816547290] +Basis 11: [] +Basis 12: [] +Basis 13: [] +Basis 14: [7838911147538198] +Basis 15: [] +Basis 16: [] +Basis 17: [] +Basis 18: [] +Basis 19: [] +Basis 20: [] +Basis 21: [] +Basis 22: [] +Basis 23: [] +Basis 24: [] +Basis 25: [] +Basis 26: [] +Basis 27: [] +Basis 28: [] + +-- out of memory -- diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f2fcfd2 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,22 @@ +fn main() { + for base in 2..=64 { + println!("Basis {}: {:?}", base, solve(base)); + } +} + +fn solve(base: u128) -> Vec { + let digits: Vec = (0..base).collect(); + let mut candidates = vec![(0, digits)]; + for _ in 0..base { + candidates = candidates + .into_iter() + .flat_map(|(stumb, left)| left.clone().into_iter().map(move |digit| { + let mut next_left: Vec = left.clone(); + next_left.retain(|d| *d != digit); + (stumb * base + digit, next_left) + })) + .filter(|(number, left)| number % (base - (left.len() as u128)) == 0) + .collect(); + } + candidates.into_iter().map(|(number, _)| number).collect() +}