From 4b86bebf49339bdcbdce5521eea1fe1959cd49f4 Mon Sep 17 00:00:00 2001 From: DiamondNether90 Date: Thu, 9 Jul 2026 17:11:55 +1000 Subject: [PATCH] Initial Commit --- .gitignore | 2 + src/card.comet | 18 +++++++++ src/hands.comet | 97 +++++++++++++++++++++++++++++++++++++++++++++++++ src/main.comet | 19 ++++++++++ 4 files changed, 136 insertions(+) create mode 100644 .gitignore create mode 100644 src/card.comet create mode 100644 src/hands.comet create mode 100644 src/main.comet diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b89fe4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +main.cmt +test.comet \ No newline at end of file diff --git a/src/card.comet b/src/card.comet new file mode 100644 index 0000000..fcdd292 --- /dev/null +++ b/src/card.comet @@ -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 + } +} \ No newline at end of file diff --git a/src/hands.comet b/src/hands.comet new file mode 100644 index 0000000..9302ea9 --- /dev/null +++ b/src/hands.comet @@ -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 +} \ No newline at end of file diff --git a/src/main.comet b/src/main.comet new file mode 100644 index 0000000..835cc3d --- /dev/null +++ b/src/main.comet @@ -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) +} \ No newline at end of file