This commit is contained in:
2021-04-16 10:14:44 +02:00
commit 0645ef2d2b
6 changed files with 77 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/target

5
Cargo.lock generated Normal file
View File

@@ -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"

9
Cargo.toml Normal file
View File

@@ -0,0 +1,9 @@
[package]
name = "stellenteilerraetsel"
version = "0.1.0"
authors = ["Tilman Hoffbauer <tilman.hoffbauer@juforum.de>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

11
README.md Normal file
View File

@@ -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.

29
output.txt Normal file
View File

@@ -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 --

22
src/main.rs Normal file
View File

@@ -0,0 +1,22 @@
fn main() {
for base in 2..=64 {
println!("Basis {}: {:?}", base, solve(base));
}
}
fn solve(base: u128) -> Vec<u128> {
let digits: Vec<u128> = (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<u128> = 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()
}