Deal cards for FreeCell: Difference between revisions
Content added Content deleted
m (→{{header|Ruby}}: Spell.) |
(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}}== |