mirror of
https://github.com/GnoConsortium/gno.git
synced 2025-01-08 02:30:45 +00:00
ddb82cb2e0
Maybe someday I'll become adept at using cvs...
59 lines
2.4 KiB
Plaintext
59 lines
2.4 KiB
Plaintext
# bridge - generate random bridge hands
|
|
|
|
BEGIN { split(permute(52,52), deck) # generate a random deck
|
|
sort(1,13); sort(14,26); sort(27,39); sort(40,52) # sort hands
|
|
prhands() # format and print the four hands
|
|
}
|
|
|
|
function permute(k, n, i, p, r) { # generate a random permutation
|
|
srand(1); # leave out "1" for more randomness
|
|
p = " " # of k integers between 1 and n
|
|
for (i = n-k+1; i <= n; i++)
|
|
if (p ~ " " (r = int(i*rand())+1) " " )
|
|
sub(" " r " ", " " r " " i " ", p) # put i after r in p
|
|
else p = " " r p # put r at beginning of p
|
|
return p
|
|
}
|
|
|
|
function sort(left,right, i,j,t) { # sort hand in deck[left..right]
|
|
for (i = left+1; i <= right; i++)
|
|
for (j = i; j > left && deck[j-1] < deck[j]; j--) {
|
|
t = deck[j-1]; deck[j-1] = deck[j]; deck[j] = t
|
|
}
|
|
}
|
|
|
|
function prhands() { # print the four hands
|
|
b = sprintf("%20s", " "); b40 = sprintf("%40s", " ")
|
|
card = 1 # global index into deck
|
|
suits(13); print b " NORTH"
|
|
print b spds; print b hrts; print b dnds; print b clbs
|
|
suits(26) # create the west hand from deck[14..26]
|
|
ws = spds substr(b40, 1, 40 - length(spds))
|
|
wh = hrts substr(b40, 1, 40 - length(hrts))
|
|
wd = dnds substr(b40, 1, 40 - length(dnds))
|
|
wc = clbs substr(b40, 1, 40 - length(clbs))
|
|
suits(39); print " WEST" sprintf("%36s", " ") "EAST"
|
|
print ws spds; print wh hrts; print wd dnds; print wc clbs
|
|
suits(52); print b " SOUTH"
|
|
print b spds; print b hrts; print b dnds; print b clbs
|
|
}
|
|
|
|
function suits(j) { # collect suits of hand in deck[j-12..j]
|
|
for (spds = "S:"; deck[card] > 39 && card <= j; card++)
|
|
spds = spds " " fvcard(deck[card])
|
|
for (hrts = "H:"; deck[card] > 26 && card <= j; card++)
|
|
hrts = hrts " " fvcard(deck[card])
|
|
for (dnds = "D:"; deck[card] > 13 && card <= j; card++)
|
|
dnds = dnds " " fvcard(deck[card])
|
|
for (clbs = "C:"; card <= j; card++)
|
|
clbs = clbs " " fvcard(deck[card])
|
|
}
|
|
|
|
function fvcard(i) { # compute face value of card i
|
|
if (i % 13 == 0) return "A"
|
|
else if (i % 13 == 12) return "K"
|
|
else if (i % 13 == 11) return "Q"
|
|
else if (i % 13 == 10) return "J"
|
|
else return (i % 13) + 1
|
|
}
|