Initial Commit
This commit is contained in:
18
src/card.comet
Normal file
18
src/card.comet
Normal file
@@ -0,0 +1,18 @@
|
||||
enum Suit {
|
||||
HEARTS, DIAMONDS, SPADES, CLUBS, NONE
|
||||
}
|
||||
|
||||
enum Rank {
|
||||
ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN,
|
||||
JACK, QUEEN, KING, TOP, NONE
|
||||
}
|
||||
|
||||
struct Card {
|
||||
Suit suit
|
||||
Rank rank
|
||||
|
||||
init(Suit suit, Rank rank) {
|
||||
self.suit = suit
|
||||
self.rank = rank
|
||||
}
|
||||
}
|
||||
97
src/hands.comet
Normal file
97
src/hands.comet
Normal file
@@ -0,0 +1,97 @@
|
||||
import card
|
||||
|
||||
func isFlush(Card[5] cards) -> bool {
|
||||
Suit suit = cards:0.suit
|
||||
for int i in 0 .. #cards {
|
||||
if (cards:i.suit != suit) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func handContainsRank(Card[*] hand, Rank rank) -> int {
|
||||
mut int count = 0
|
||||
for int i in 0..#hand {
|
||||
if (hand:i.rank == rank) {
|
||||
count += 1
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
func rankVal(Card c) -> int => c.rank * 4 + c.suit
|
||||
|
||||
func sortByRank(Card[*] cards) -> Card[*] {
|
||||
int len = #cards
|
||||
for int i in (len-1)..0 step -1 {
|
||||
for int j in 0..i {
|
||||
mut Card left = cards:j
|
||||
mut Card right = cards:(j+1)
|
||||
if rankVal(left) > rankVal(right) {
|
||||
cards:j = right
|
||||
cards:(j+1) = left
|
||||
}
|
||||
}
|
||||
}
|
||||
return cards
|
||||
}
|
||||
|
||||
func isSortedStraight(Card[*] cards) -> bool {
|
||||
if #cards == 5 {
|
||||
for int i in 0..4 {
|
||||
if 1+cards:i.rank != cards:(i+1).rank {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func isStraight(Card[*] cards) -> int {
|
||||
mut Rank maxRank = cards:0.rank
|
||||
mut int numAces = handContainsRank(cards, card.Rank.ACE)
|
||||
|
||||
mut int duplicates = 0
|
||||
for int i in 0..card.Rank.NONE {
|
||||
mut bool dup = false
|
||||
for int j in 0..#cards {
|
||||
if cards:j.rank == i {
|
||||
if dup {
|
||||
cards:j = new Card(card.Suit.NONE, card.Rank.NONE)
|
||||
duplicates += 1
|
||||
} else {
|
||||
dup = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int len = #cards + numAces
|
||||
Card[*] processed = new Card[len]
|
||||
for int i in 0..numAces {
|
||||
processed:i = new Card(card.Suit.NONE, card.Rank.TOP)
|
||||
}
|
||||
for int i in 0..#cards {
|
||||
processed:(numAces+i) = cards:i
|
||||
}
|
||||
|
||||
Card[*] sortedWithDuplicates = sortByRank(processed)
|
||||
Card[*] sorted = new Card[#processed-duplicates]
|
||||
for int i in 0..(#processed-duplicates) {
|
||||
sorted:i = sortedWithDuplicates:i
|
||||
}
|
||||
|
||||
if #sorted < 5 {
|
||||
return false
|
||||
}
|
||||
|
||||
for int i in 0..(#sorted-4) {
|
||||
if isSortedStraight([sorted:i, sorted:(i+1), sorted:(i+2), sorted:(i+3), sorted:(i+4)]) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
19
src/main.comet
Normal file
19
src/main.comet
Normal file
@@ -0,0 +1,19 @@
|
||||
import hands
|
||||
import card
|
||||
|
||||
func main() -> int {
|
||||
mut Card[*] cards
|
||||
cards = [
|
||||
new Card(card.Suit.SPADES, card.Rank.ACE),
|
||||
new Card(card.Suit.SPADES, card.Rank.KING),
|
||||
new Card(card.Suit.SPADES, card.Rank.QUEEN),
|
||||
new Card(card.Suit.SPADES, card.Rank.JACK),
|
||||
new Card(card.Suit.SPADES, card.Rank.TWO),
|
||||
new Card(card.Suit.SPADES, card.Rank.THREE),
|
||||
new Card(card.Suit.SPADES, card.Rank.FOUR),
|
||||
new Card(card.Suit.SPADES, card.Rank.FIVE),
|
||||
new Card(card.Suit.SPADES, card.Rank.TEN),
|
||||
new Card(card.Suit.SPADES, card.Rank.ACE),
|
||||
]
|
||||
return !hands.isStraight(cards)
|
||||
}
|
||||
Reference in New Issue
Block a user