Deal cards for FreeCell: Difference between revisions

Content added Content deleted
(added ocaml)
Line 197: Line 197:
4♠ T♠ 2♥ 5♦ J♣ 6♣ J♥ Q♥
4♠ T♠ 2♥ 5♦ J♣ 6♣ J♥ Q♥
J♦ K♠ K♣ 4♥ </lang>
J♦ K♠ K♣ 4♥ </lang>

=={{header|OCaml}}==
{{trans|C}}

<lang ocaml>let srnd =
let ( + ) = Int32.add
and ( * ) = Int32.mul
and ( & ) = Int32.logand
and ( >> ) = Int32.shift_right
and rmax32 = Int32.max_int in
function x ->
let seed = ref (Int32.of_int x) in
function () ->
seed := (!seed * 214013l + 2531011l) & rmax32;
Int32.to_int (!seed >> 16)
let show cards =
let suits = "CDHS"
and nums = "A23456789TJQK" in
for i = 0 to pred 52 do
Printf.printf "%c%c%c"
nums.[cards.(i) / 4]
suits.[cards.(i) mod 4]
(if (i mod 8) = 7 then '\n' else ' ')
done;
print_newline()
let deal s =
let rnd = srnd s in
let t = Array.init 52 (fun i -> i) in
let cards =
Array.init 52 (fun j ->
let n = 52 - j in
let i = rnd() mod n in
let this = t.(i) in
t.(i) <- t.(pred n);
this)
in
(cards)
let () =
let s =
try int_of_string Sys.argv.(1)
with _ -> 11982
in
Printf.printf "Deal %d:\n" s;
let cards = deal s in
show cards</lang>

Execution:

<pre>$ ocaml freecell.ml 617
Deal 617:
7D AD 5C 3S 5S 8C 2D AH
TD 7S QD AC 6D 8H AS KH
TH QC 3H 9D 6S 8D 3D TC
KD 5H 9S 3C 8S 7H 4D JS
4C QS 9C 9H 7C 6H 2C 2S
4S TS 2H 5D JC 6C JH QH
JD KS KC 4H</pre>


=={{header|Perl}}==
=={{header|Perl}}==