Card shuffles: Difference between revisions
Content added Content deleted
(→{{header|Tcl}}: added zkl) |
(Added Lua version) |
||
Line 326: | Line 326: | ||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] |
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] |
||
[18, 12, 13, 14, 2, 3, 15, 5, 9, 19, 7, 11, 1, 6, 4, 20, 16, 17, 10, 8]</pre> |
[18, 12, 13, 14, 2, 3, 15, 5, 9, 19, 7, 11, 1, 6, 4, 20, 16, 17, 10, 8]</pre> |
||
=={{header|Lua}}== |
|||
<lang lua>-- Return a table respresenting a standard deck of cards in order |
|||
function newDeck () |
|||
local cards, suits = {}, {"C", "D", "H", "S"} |
|||
for _, suit in pairs(suits) do |
|||
for value = 2, 14 do |
|||
if value == 10 then value = "T" end |
|||
if value == 11 then value = "J" end |
|||
if value == 12 then value = "Q" end |
|||
if value == 13 then value = "K" end |
|||
if value == 14 then value = "A" end |
|||
table.insert(cards, value .. suit) |
|||
end |
|||
end |
|||
return cards |
|||
end |
|||
-- Display all cards (strings) in a given deck (table) |
|||
function show (deck) |
|||
for _, card in pairs(deck) do io.write(card .. " ") end |
|||
print("\n") |
|||
end |
|||
-- Perform a riffle shuffle on deck and return it as a new table |
|||
function riffle (deck) |
|||
local pile1, pile2, pos = {}, {}, 1 |
|||
for i, card in ipairs(deck) do |
|||
if i < math.ceil(#deck / 2) + 1 then |
|||
table.insert(pile1, card) |
|||
else |
|||
table.insert(pile2, card) |
|||
end |
|||
end |
|||
deck = {} |
|||
while pile2[pos] do |
|||
table.insert(deck, pile1[pos]) |
|||
table.insert(deck, pile2[pos]) |
|||
pos = pos + 1 |
|||
end |
|||
return deck |
|||
end |
|||
-- Perform an overhand shuffle on a deck and return it as a new table |
|||
function overhand (deck) |
|||
local newDeck, twentyPercent, groupSize, pos = {}, math.floor(#deck / 5) |
|||
repeat |
|||
repeat |
|||
groupSize = math.random(twentyPercent) |
|||
until groupSize <= #deck |
|||
for pos = #deck - groupSize, #deck do |
|||
table.insert(newDeck, deck[pos]) |
|||
deck[pos] = nil |
|||
end |
|||
until #deck == 0 |
|||
return newDeck |
|||
end |
|||
-- Main procedure |
|||
math.randomseed(os.time()) |
|||
local deck1, deck2 = newDeck(), newDeck() |
|||
deck1 = riffle(deck1) |
|||
print("Sorted deck after one riffle shuffle:") |
|||
show(deck1) |
|||
deck2 = overhand(deck2) |
|||
print("Sorted deck after one overhand shuffle:") |
|||
show(deck2)</lang> |
|||
{{out}} |
|||
<pre>Sorted deck after one riffle shuffle: |
|||
2C 2H 3C 3H 4C 4H 5C 5H 6C 6H 7C 7H 8C 8H 9C 9H TC TH JC JH QC QH KC KH AC AH 2D |
|||
2S 3D 3S 4D 4S 5D 5S 6D 6S 7D 7S 8D 8S 9D 9S TD TS JD JS QD QS KD KS AD AS |
|||
Sorted deck after one overhand shuffle: |
|||
QS KS AS 3S 4S 5S 6S 7S 8S 9S TS JS JH QH KH AH 2S 4H 5H 6H 7H 8H 9H TH 2H 3H 4D |
|||
5D 6D 7D 8D 9D TD JD QD KD AD QC KC AC 2D 3D 4C 5C 6C 7C 8C 9C TC JC 2C 3C |
|||
</pre> |
|||
=={{header|PARI/GP}}== |
=={{header|PARI/GP}}== |