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
<lang 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;
fn shuffle<T>(rng: &mut MsLcg, deck: &mut [T]) {
assert!(self.seed >> 16 < 32768);
(self.seed >> 16) & 0x7FFF
let len = deck.len() as u32;
for i in (1..len).rev() {
}
let j = rng.next_u32() % (i + 1);
fn max_rand(&mut self, mymax: u32) -> u32 {
self.rand() % mymax
deck.swap(i as usize, j as usize);
}
fn shuffle<T>(&mut self, deck: &mut [T]) {
if deck.len() > 0 {
let mut i = (deck.len() as u32) - 1;
while i > 0 {
let j = self.max_rand(i+1);
deck.swap(i as usize, j as usize);
i = i-1;
}
}
}
}
}
}


fn deal_ms_fc_board(seed: u32) -> String {
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 mut columns = vec![Vec::new(); num_cols];
let render_card = |card: usize| {
let (suit, rank) = (card % 4, card / 4);
let mut deck: Vec<_> = (0..4*13).collect();
format!("{}{}", RANKS[rank], SUITS[suit])
};


let rank_strings: Vec<char> = "A23456789TJQK".chars().collect();
(0..52).map(render_card).collect()
}
let suit_strings: Vec<char> = "CDHS".chars().collect();


fn deal_ms_fc_board(seed: u32) -> Vec<String> {
randomizer.shuffle(&mut deck);
let mut rng = MsLcg::from_seed(seed);
let mut deck = gen_deck();


shuffle(&mut rng, &mut deck);
deck.reverse();
deck.reverse();


deck.chunks(8).map(|row| row.join(" ")).collect::<Vec<_>>()
for i in 0..52 {
}
columns[i % num_cols].push(deck[i]);
}


fn main() {
let render_card = |card: usize| -> String {
let (suit, rank) = (card % 4, card / 4);
let seed = std::env::args()
.nth(1)
format!("{}{}", rank_strings[rank], suit_strings[suit])
.and_then(|n| n.parse().ok())
};
.expect("A 32-bit seed is required");


for row in deal_ms_fc_board(seed) {
let render_column = |col: Vec<usize>| -> String {
println!(": {}", row);
format!(": {}\n", col.into_iter().map(&render_card).collect::<Vec<String>>().join(" "))
};
}

columns.into_iter().map(render_column).collect::<Vec<_>>().join("")
}
}
</lang>

fn main() {
let arg: u32 = std::env::args().nth(1).and_then(|n| n.parse().ok()).expect("I need a number.");
print!("{}", deal_ms_fc_board(arg));
}</lang>


=={{header|Seed7}}==
=={{header|Seed7}}==