 # EucherHands.py

Nov 6th, 2012
114
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. from random import *
2.
3. def rank(x):
4.     return x%6
5. def colour(x):
6.     return (x/12)
7. def suit(x):
8.     return (x/6)
9.
10. def jack(x):
11.     return (rank(x) == 2)
12. def sameSuit(x,y):
13.     return suit(x) == suit(y)
14. def sameColour(x,y):
15.     return colour(x) == colour(y)
16.
17. def s1(H):
18.     jacks = [0,0]
19.     non = [0,0,0,0]
20.     colours = [0,0]
21.     for h in H:
22.         if jack(h):
23.             jacks[colour(h)]+=1
24.         else:
25.             non[suit(h)]+=1
26.         colours[colour(h)]+=1
27.     if set(jacks) == set([0,2]) and set(non) == set([0,3]) and set(colours) == set([0,5]):
28.         return True
29.     return False
30.
31. def s2(H,D):
32.     if s1(H):
33.         return False
34.     for h in H:
35.         # Can we replace h with a card from D and get s1?
36.         partialHand = H.difference(set([h]))
37.         for d in D:
38.             hand = partialHand.union(set([d]))
39.             if s1(hand):
40.                 return True
41.     return False
42.
43. def s3(H):
44.     jacks = 0
45.     for h in H:
46.         if jack(h):
47.             jacks += 1
48.     if jacks == 4:
49.         return True
50.     return False
51.
52. repeats = 1000000
53. for z in range(10):
54.     s1Count = 0
55.     s2Count = 0
56.     s3Count = 0
57.     for j in range(repeats):
58.         D = set(range(24))
59.
60.         h = []
61.         for i in range(4):
62.             h.append(set(sample(D, 5)))
63.             D.difference_update(h[-1])
64.
65.         got1 = False
66.         got2 = False
67.         got3 = False
68.         #All hands tested per deal
69.         #for hand in h:
70.         #One hand tested per deal
71.         for hand in h[:1]:
72.             got1 = got1 or s1(hand)
73.             got2 = got2 or s2(hand, D)
74.             got3 = got3 or s3(hand)
75.         if got1:
76.             s1Count += 1
77.         if got2:
78.             s2Count += 1
79.         if got3:
80.             s3Count += 1
81.
82.     print s1Count*100.0/repeats, s2Count*100.0/repeats, s3Count*100.0/repeats
RAW Paste Data