ライブラリを使用してRustにConway's Game of Lifeという1つの反復を実装しようとしています。Rust ndarray内の移動ウィンドウの突然変異
私は、3x3ウィンドウが配列上をループすると、実際の更新を行うのに問題がありますが、居住者を数える簡単な方法だと思っていました。
配列は#
との生活を意味し、との生活の不在:
let mut world = Array2::<String>::from_elem((10, 10), " ".to_string());
for mut window in world.windows((3, 3)) {
let count_all = window.fold(0, |count, cell| if cell == "#" { count + 1 } else { count });
let count_neighbours = count_all - if window[(1, 1)] == "#" { 1 } else { 0 };
match count_neighbours {
0 | 1 => window[(1, 1)] = " ".to_string(), // Under-population
2 => {}, // Live if alive
3 => window[(1, 1)] = "#".to_string(), // Re-produce
_ => window[(1, 1)] = " ".to_string(), // Over-population
}
}
このコードはコンパイルされません!エラーはmatch
のブロック内にあります。「エラー:変更できません」および「エラー:不変のインデックスに割り当てることができません」。私はfor &mut window...
を試みたが、ライブラリはこれを実装していない(?)
私は錆に比較的新しいだと私はこのがライブラリによってウィンドウの実装に問題になる可能性がありと信じています。しかし、私は確信していませんし、私はこのアプローチを続けることを可能にするいくつかのバリエーション/修正があるかどうかわかりません。このアプローチを完全に廃止する必要がありますか?私は最良のアプローチがここにあるのかどうかはわかりません。
他の提案や改善があれば幸いです。
(このコードでは、私がループしているときに私は突然変異しているので、適切な規則を実装していませんし、外側の端を無視していますが、この場合は問題ありません。 )
隣接セルをカウントしながら、徐々にグリッドを変異されているので、十分おかしい、ライフゲームのあなたのアプローチは、正常に動作しない場合があります。ゲームでは、すべての隣接チェックが各セルで一度に実行され、すべてのセルが消滅または再現される前に実行されます。したがって、ゲームの状態を第2のオブジェクトに複製することは、あなたの質問には問題がなく、より一般的にはうまくいくでしょう。 –
私は適切なルールを実装していないといいますが、それは大丈夫です。主な理由は、私が "windows"への代替ループを実行できなかったのでコピーで動作するバージョンを作るのに苦労したことでした。 ! – QasimK
あなたが調べるのは良い挑戦のようです。 –