Deal cards for FreeCell: Difference between revisions
Content added Content deleted
(→{{header|Rust}}: refactor and switch to use LCG task) |
|||
Line 2,786: | Line 2,786: | ||
Based on JavaScript. |
Based on JavaScript. |
||
<lang rust>// Code available at https://rosettacode.org/wiki/Linear_congruential_generator#Rust |
|||
⚫ | |||
extern crate linear_congruential_generator; |
|||
struct MSVCRandGen { |
|||
seed: u32 |
|||
use linear_congruential_generator::{MsLcg, Rng, SeedableRng}; |
|||
⚫ | |||
// We can't use `rand::Rng::shuffle` because it uses the more uniform `rand::Rng::gen_range` |
|||
impl MSVCRandGen { |
|||
// (`% range` is subject to modulo bias). If an exact match of the old dealer is not needed, |
|||
fn rand(&mut self) -> u32 { |
|||
// `rand::Rng::shuffle` should be used. |
|||
self.seed = (self.seed.wrapping_mul(214013).wrapping_add(2531011)) % 0x80000000; |
|||
⚫ | |||
assert!(self.seed >> 16 < 32768); |
|||
let len = deck.len() as u32; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
fn max_rand(&mut self, mymax: u32) -> u32 { |
|||
deck.swap(i as usize, j as usize); |
|||
} |
|||
⚫ | |||
if deck.len() > 0 { |
|||
let mut i = (deck.len() as u32) - 1; |
|||
while i > 0 { |
|||
⚫ | |||
deck.swap(i as usize, j as usize); |
|||
i = i-1; |
|||
⚫ | |||
} |
|||
} |
} |
||
} |
} |
||
fn |
fn gen_deck() -> Vec<String> { |
||
const RANKS: [char; 13] = ['A','2','3','4','5','6','7','8','9','T','J','Q','K']; |
|||
let mut randomizer = MSVCRandGen { seed: seed, }; |
|||
const SUITS: [char; 4] = ['C', 'D', 'H', 'S']; |
|||
let num_cols = 8; |
|||
let |
let render_card = |card: usize| { |
||
let (suit, rank) = (card % 4, card / 4); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
(0..52).map(render_card).collect() |
|||
⚫ | |||
let suit_strings: Vec<char> = "CDHS".chars().collect(); |
|||
fn deal_ms_fc_board(seed: u32) -> Vec<String> { |
|||
⚫ | |||
let mut rng = MsLcg::from_seed(seed); |
|||
⚫ | |||
⚫ | |||
deck.reverse(); |
deck.reverse(); |
||
⚫ | |||
⚫ | |||
} |
|||
columns[i % num_cols].push(deck[i]); |
|||
} |
|||
⚫ | |||
let render_card = |card: usize| -> String { |
|||
let seed = std::env::args() |
|||
⚫ | |||
⚫ | |||
.and_then(|n| n.parse().ok()) |
|||
}; |
|||
.expect("A 32-bit seed is required"); |
|||
⚫ | |||
let render_column = |col: Vec<usize>| -> String { |
|||
println!(": {}", row); |
|||
format!(": {}\n", col.into_iter().map(&render_card).collect::<Vec<String>>().join(" ")) |
|||
} |
} |
||
⚫ | |||
} |
} |
||
⚫ | |||
⚫ | |||
let arg: u32 = std::env::args().nth(1).and_then(|n| n.parse().ok()).expect("I need a number."); |
|||
⚫ | |||
}</lang> |
|||
=={{header|Seed7}}== |
=={{header|Seed7}}== |