1 package joker
2
3 import (
4 "sort"
5 "strings"
6 )
7
8
9 type Cards []Card
10
11
12 var StandardCards = Cards{
13 Card{FaceAce, SuitHearts},
14 Card{Face2, SuitHearts},
15 Card{Face3, SuitHearts},
16 Card{Face4, SuitHearts},
17 Card{Face5, SuitHearts},
18 Card{Face6, SuitHearts},
19 Card{Face7, SuitHearts},
20 Card{Face8, SuitHearts},
21 Card{Face9, SuitHearts},
22 Card{Face10, SuitHearts},
23 Card{FaceJack, SuitHearts},
24 Card{FaceQueen, SuitHearts},
25 Card{FaceKing, SuitHearts},
26 Card{FaceAce, SuitDiamonds},
27 Card{Face2, SuitDiamonds},
28 Card{Face3, SuitDiamonds},
29 Card{Face4, SuitDiamonds},
30 Card{Face5, SuitDiamonds},
31 Card{Face6, SuitDiamonds},
32 Card{Face7, SuitDiamonds},
33 Card{Face8, SuitDiamonds},
34 Card{Face9, SuitDiamonds},
35 Card{Face10, SuitDiamonds},
36 Card{FaceJack, SuitDiamonds},
37 Card{FaceQueen, SuitDiamonds},
38 Card{FaceKing, SuitDiamonds},
39 Card{FaceAce, SuitClubs},
40 Card{Face2, SuitClubs},
41 Card{Face3, SuitClubs},
42 Card{Face4, SuitClubs},
43 Card{Face5, SuitClubs},
44 Card{Face6, SuitClubs},
45 Card{Face7, SuitClubs},
46 Card{Face8, SuitClubs},
47 Card{Face9, SuitClubs},
48 Card{Face10, SuitClubs},
49 Card{FaceJack, SuitClubs},
50 Card{FaceQueen, SuitClubs},
51 Card{FaceKing, SuitClubs},
52 Card{FaceAce, SuitSpades},
53 Card{Face2, SuitSpades},
54 Card{Face3, SuitSpades},
55 Card{Face4, SuitSpades},
56 Card{Face5, SuitSpades},
57 Card{Face6, SuitSpades},
58 Card{Face7, SuitSpades},
59 Card{Face8, SuitSpades},
60 Card{Face9, SuitSpades},
61 Card{Face10, SuitSpades},
62 Card{FaceJack, SuitSpades},
63 Card{FaceQueen, SuitSpades},
64 Card{FaceKing, SuitSpades},
65 }
66
67 func (c Cards) Len() int {
68 return len(c)
69 }
70
71 func (c Cards) Less(i, j int) bool {
72 return c[i].Value() < c[j].Value()
73 }
74
75 func (c Cards) Swap(i, j int) {
76 c[i], c[j] = c[j], c[i]
77 }
78
79 func (c Cards) String() string {
80 var s strings.Builder
81 for i := range c {
82 if i > 0 {
83 s.WriteRune(',')
84 }
85 s.WriteString(c[i].String())
86 }
87 return s.String()
88 }
89
90
91 func (c Cards) Copy() Cards {
92 cc := make(Cards, len(c))
93 copy(cc, c)
94 return cc
95 }
96
97
98 func (c Cards) Remove(card Card) Cards {
99 cc := c.Copy()
100 for i, searchCard := range c {
101 if searchCard == card {
102 return append(cc[:i], cc[i+1:]...)
103 }
104 }
105 return cc
106 }
107
108
109 func (c Cards) RemoveIndex(i int) Cards {
110 cc := c.Copy()
111 return append(cc[:i], cc[i+1:]...)
112 }
113
114
115 func (c Cards) Contains(card Card) bool {
116 for _, compcard := range c {
117 if compcard.Equal(card) {
118 return true
119 }
120 }
121
122 return false
123 }
124
125
126 func (c Cards) Count(card Card) int {
127 var n int
128 for _, compcard := range c {
129 if compcard.Equal(card) {
130 n++
131 }
132 }
133
134 return n
135 }
136
137
138 func (c Cards) Equal(cards Cards) bool {
139 if len(c) != len(cards) {
140 return false
141 }
142
143 for _, compcard := range c {
144 if c.Count(compcard) != cards.Count(compcard) {
145 return false
146 }
147 }
148
149 return true
150 }
151
152
153 func (c Cards) Sorted() Cards {
154 cc := c.Copy()
155 sort.Sort(cc)
156 return cc
157 }
158
159
160 func (c Cards) Reversed() Cards {
161 l := len(c)
162 cc := make(Cards, l)
163 for i := 0; i < l; i++ {
164 cc[i] = c[l-i-1]
165 }
166 return cc
167 }
168
169
170 func (c Cards) Permutations() []Cards {
171 var permute func(Cards, int)
172 var res []Cards
173 permute = func(c Cards, n int) {
174 if n == 1 {
175 res = append(res, c.Copy())
176 } else {
177 for i := 0; i < n; i++ {
178 permute(c, n-1)
179 if n%2 == 1 {
180 tmp := c[i]
181 c[i] = c[n-1]
182 c[n-1] = tmp
183 } else {
184 tmp := c[0]
185 c[0] = c[n-1]
186 c[n-1] = tmp
187 }
188 }
189 }
190 }
191 permute(c, len(c))
192 return res
193 }
194
195
196 func (c Cards) Low() Card {
197 if len(c) == 0 {
198 return Card{}
199 }
200
201 l := c[0]
202 for _, comp := range c[1:] {
203 if comp.Value() < l.Value() {
204 l = comp
205 }
206 }
207 return l
208 }
209
210
211 func (c Cards) High() Card {
212 if len(c) == 0 {
213 return Card{}
214 }
215
216 h := c[0]
217 for _, comp := range c[1:] {
218 if comp.Value() > h.Value() {
219 h = comp
220 }
221 }
222 return h
223 }
224
View as plain text