Initial Commit

This commit is contained in:
2026-07-09 17:11:55 +10:00
commit 4b86bebf49
4 changed files with 136 additions and 0 deletions

18
src/card.comet Normal file
View 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
View 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
View 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)
}