What is the score of my Scopa hand?Score a Cribbage HandCompare two poker handsProbability to win a hand of poker (Texas hold 'em)Simple Pazaak (Star Wars Card Game from Knights of the Old Republic)Evaluate a Skat-HandCalculate Doppelkopf ScoreBridge Hand ScoringDetermine the winner of a game of WarScore a hand of HeartsGolf (6-card) Golf!
Can I cast Death Ward on additional creatures without causing previous castings to end?
How dangerous is a very out-of-true disc brake wheel?
Does the US Armed Forces refuse to recruit anyone with an IQ less than 83?
Re-entering the UK after overstaying in 2008
How to "Start as close to the end as possible", and why to do so?
What is the difference between increasing volume and increasing gain?
How important is knowledge of trig identities for use in Calculus
How closely correlated is culture to geography?
Is there an in-universe explanation of how Frodo's arrival in Valinor was recorded in the Red Book?
How deep is the liquid in a half-full hemisphere?
Drawing Maps; flat distortion
Is there a pattern for handling conflicting function parameters?
Why most footers have a background color as a divider of section?
Do jackscrews suffer from blowdown?
SOQL injection vulnerability issue
How to identify whether a publisher is genuine or not?
Lighthouse Alternatives
Did the Soviet army intentionally send troops (e.g. penal battalions) running over minefields?
Why not add cuspidal curves in the moduli space of stable curves?
How can Germany increase investments in Russia while EU economic sanctions against Russia are still in place?
Wondering why they used ultrafast diodes in a 50 or 60Hz bridge?
Parent asking for money after moving out
Why do Russians sometimes spell "жирный" (fatty) as "жырный"?
Would a horse be sufficient buffer to prevent injury when falling from a great height?
What is the score of my Scopa hand?
Score a Cribbage HandCompare two poker handsProbability to win a hand of poker (Texas hold 'em)Simple Pazaak (Star Wars Card Game from Knights of the Old Republic)Evaluate a Skat-HandCalculate Doppelkopf ScoreBridge Hand ScoringDetermine the winner of a game of WarScore a hand of HeartsGolf (6-card) Golf!
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty
margin-bottom:0;
$begingroup$
I like card game challenges so I made this one for the Italian card game Scopa. My family has been playing this game since time immemorial. It has a very interesting scoring system that should be fun to golf. I will post an answer in R to get the fun started, that I am sure people will improve upon.
The challenge: figure out the number of points scored in a round of Scopa, given the cards the player captured during the round as input.
There are 40 cards in a Scopa deck. If you are using an international deck you remove the 8s, 9s, and 10s, leaving A,2,3,4,5,6,7,Q,J,K in each suit.1 There are two players or partnerships, and after every round, all cards end up captured by one or the other of the two players. The score is counted as follows (more information here):
- The player with the most cards scores 1 point.
- The player with the most diamonds (or coins if using the Italian deck) scores 1 point.
- The player with the 7 of diamonds (or coins), known as the sette bello or beautiful seven, scores 1 point.
- The player with the highest primiera scores 1 point. A player's primiera score is the sum of the scores of the highest-value card that the player captured in each suit (see table below). If you do not have at least one card in every suit, you lose by default even if your score would exceed your opponent's score. In the exceedingly rare case that neither player has at least one card in every suit, the player with the higher primiera total scores the point.2
Table of primiera scores
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
So a player can score at most 4 points in a round.3 If there is a tie, which is possible for cards, diamonds, or primiera, no one scores the point.
It's important to realize that since each card must be captured by one of the two players, you can infer what cards the other player must have taken even if you only know what cards one player took. You will need to do this to correctly score primiera.
Challenge rules
Input
Your code should take as input the cards captured by a single player during a round of Scopa.
Input must be in string format, in which one character represents the rank of each card and one character its suit. This removes the potential loophole of passing the primiera scores in directly as input. Conversion of card ranks to primiera scores must be done in the program. However you may choose to use a single string separated by spaces or commas, an array of strings, or any other format. For example if you choose to encode ranks as 76A5432QJK
and suits as DCHS
you could use inputs such as ['7D', '6H', 'QD', 'JS']
or '7D,6H,QD,JS'
.
Output
An integer from 0 to 4 representing the player's score.
Winning
Shortest answer in bytes wins!
Test cases
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Scores 4: 1 point for >20 cards, 1 point for >5 diamonds, 1 point for the 7 of diamonds, and 1 point for scoring 78 in primiera (7,7,7,5 where opponent has 7,6,6,6 for 75)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Scores 0: <=20 cards, <=5 diamonds, no 7 of diamonds, and only scores 69 in primiera (7,7,4,3 where opponent has 7,7,6,K for 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Scores 3: 1 point for >20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. The primiera would be 63 (7,7,7) and the opponent can only score 51 (7,Q,Q,Q) but since this hand has no spades it loses the point by default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Scores 3: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. The primiera only scores 51 (7,Q,Q,Q) and the opponent can score 63 (7,7,7) but since the opponent's hand has no diamonds this hand wins the primiera point by default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Scores 3: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. Even though this hand has no spades, it still wins primiera by a score of 63 to 57 (7,7,7 versus 7,6,6) because the opponent's hand has no diamonds.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Scores 2: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. This hand has no spades, and opponent's hand has no diamonds. Opponent wins primiera by a score of 63 to 41 (7,7,7 versus 7,Q,Q).
[]
(empty array)
Scores 0
1: At least in our family, Jack outranks Queen in Scopa but this is irrelevant for scoring purposes.
2: I've been playing this game since childhood and have never seen that happen but your code had better be able to handle that case!
3: There are bonus points for "sweeps" scored during the round which I am ignoring for the purpose of this challenge.
code-golf card-games
$endgroup$
add a comment
|
$begingroup$
I like card game challenges so I made this one for the Italian card game Scopa. My family has been playing this game since time immemorial. It has a very interesting scoring system that should be fun to golf. I will post an answer in R to get the fun started, that I am sure people will improve upon.
The challenge: figure out the number of points scored in a round of Scopa, given the cards the player captured during the round as input.
There are 40 cards in a Scopa deck. If you are using an international deck you remove the 8s, 9s, and 10s, leaving A,2,3,4,5,6,7,Q,J,K in each suit.1 There are two players or partnerships, and after every round, all cards end up captured by one or the other of the two players. The score is counted as follows (more information here):
- The player with the most cards scores 1 point.
- The player with the most diamonds (or coins if using the Italian deck) scores 1 point.
- The player with the 7 of diamonds (or coins), known as the sette bello or beautiful seven, scores 1 point.
- The player with the highest primiera scores 1 point. A player's primiera score is the sum of the scores of the highest-value card that the player captured in each suit (see table below). If you do not have at least one card in every suit, you lose by default even if your score would exceed your opponent's score. In the exceedingly rare case that neither player has at least one card in every suit, the player with the higher primiera total scores the point.2
Table of primiera scores
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
So a player can score at most 4 points in a round.3 If there is a tie, which is possible for cards, diamonds, or primiera, no one scores the point.
It's important to realize that since each card must be captured by one of the two players, you can infer what cards the other player must have taken even if you only know what cards one player took. You will need to do this to correctly score primiera.
Challenge rules
Input
Your code should take as input the cards captured by a single player during a round of Scopa.
Input must be in string format, in which one character represents the rank of each card and one character its suit. This removes the potential loophole of passing the primiera scores in directly as input. Conversion of card ranks to primiera scores must be done in the program. However you may choose to use a single string separated by spaces or commas, an array of strings, or any other format. For example if you choose to encode ranks as 76A5432QJK
and suits as DCHS
you could use inputs such as ['7D', '6H', 'QD', 'JS']
or '7D,6H,QD,JS'
.
Output
An integer from 0 to 4 representing the player's score.
Winning
Shortest answer in bytes wins!
Test cases
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Scores 4: 1 point for >20 cards, 1 point for >5 diamonds, 1 point for the 7 of diamonds, and 1 point for scoring 78 in primiera (7,7,7,5 where opponent has 7,6,6,6 for 75)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Scores 0: <=20 cards, <=5 diamonds, no 7 of diamonds, and only scores 69 in primiera (7,7,4,3 where opponent has 7,7,6,K for 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Scores 3: 1 point for >20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. The primiera would be 63 (7,7,7) and the opponent can only score 51 (7,Q,Q,Q) but since this hand has no spades it loses the point by default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Scores 3: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. The primiera only scores 51 (7,Q,Q,Q) and the opponent can score 63 (7,7,7) but since the opponent's hand has no diamonds this hand wins the primiera point by default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Scores 3: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. Even though this hand has no spades, it still wins primiera by a score of 63 to 57 (7,7,7 versus 7,6,6) because the opponent's hand has no diamonds.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Scores 2: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. This hand has no spades, and opponent's hand has no diamonds. Opponent wins primiera by a score of 63 to 41 (7,7,7 versus 7,Q,Q).
[]
(empty array)
Scores 0
1: At least in our family, Jack outranks Queen in Scopa but this is irrelevant for scoring purposes.
2: I've been playing this game since childhood and have never seen that happen but your code had better be able to handle that case!
3: There are bonus points for "sweeps" scored during the round which I am ignoring for the purpose of this challenge.
code-golf card-games
$endgroup$
$begingroup$
Does each rank have to be represented by a distinct character?
$endgroup$
– Doorknob♦
8 hours ago
$begingroup$
@Doorknob No not necessarily, but at least in the solution I am working on I found it necessary to have a unique character for each rank to get all the test cases right.
$endgroup$
– qdread
8 hours ago
add a comment
|
$begingroup$
I like card game challenges so I made this one for the Italian card game Scopa. My family has been playing this game since time immemorial. It has a very interesting scoring system that should be fun to golf. I will post an answer in R to get the fun started, that I am sure people will improve upon.
The challenge: figure out the number of points scored in a round of Scopa, given the cards the player captured during the round as input.
There are 40 cards in a Scopa deck. If you are using an international deck you remove the 8s, 9s, and 10s, leaving A,2,3,4,5,6,7,Q,J,K in each suit.1 There are two players or partnerships, and after every round, all cards end up captured by one or the other of the two players. The score is counted as follows (more information here):
- The player with the most cards scores 1 point.
- The player with the most diamonds (or coins if using the Italian deck) scores 1 point.
- The player with the 7 of diamonds (or coins), known as the sette bello or beautiful seven, scores 1 point.
- The player with the highest primiera scores 1 point. A player's primiera score is the sum of the scores of the highest-value card that the player captured in each suit (see table below). If you do not have at least one card in every suit, you lose by default even if your score would exceed your opponent's score. In the exceedingly rare case that neither player has at least one card in every suit, the player with the higher primiera total scores the point.2
Table of primiera scores
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
So a player can score at most 4 points in a round.3 If there is a tie, which is possible for cards, diamonds, or primiera, no one scores the point.
It's important to realize that since each card must be captured by one of the two players, you can infer what cards the other player must have taken even if you only know what cards one player took. You will need to do this to correctly score primiera.
Challenge rules
Input
Your code should take as input the cards captured by a single player during a round of Scopa.
Input must be in string format, in which one character represents the rank of each card and one character its suit. This removes the potential loophole of passing the primiera scores in directly as input. Conversion of card ranks to primiera scores must be done in the program. However you may choose to use a single string separated by spaces or commas, an array of strings, or any other format. For example if you choose to encode ranks as 76A5432QJK
and suits as DCHS
you could use inputs such as ['7D', '6H', 'QD', 'JS']
or '7D,6H,QD,JS'
.
Output
An integer from 0 to 4 representing the player's score.
Winning
Shortest answer in bytes wins!
Test cases
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Scores 4: 1 point for >20 cards, 1 point for >5 diamonds, 1 point for the 7 of diamonds, and 1 point for scoring 78 in primiera (7,7,7,5 where opponent has 7,6,6,6 for 75)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Scores 0: <=20 cards, <=5 diamonds, no 7 of diamonds, and only scores 69 in primiera (7,7,4,3 where opponent has 7,7,6,K for 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Scores 3: 1 point for >20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. The primiera would be 63 (7,7,7) and the opponent can only score 51 (7,Q,Q,Q) but since this hand has no spades it loses the point by default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Scores 3: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. The primiera only scores 51 (7,Q,Q,Q) and the opponent can score 63 (7,7,7) but since the opponent's hand has no diamonds this hand wins the primiera point by default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Scores 3: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. Even though this hand has no spades, it still wins primiera by a score of 63 to 57 (7,7,7 versus 7,6,6) because the opponent's hand has no diamonds.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Scores 2: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. This hand has no spades, and opponent's hand has no diamonds. Opponent wins primiera by a score of 63 to 41 (7,7,7 versus 7,Q,Q).
[]
(empty array)
Scores 0
1: At least in our family, Jack outranks Queen in Scopa but this is irrelevant for scoring purposes.
2: I've been playing this game since childhood and have never seen that happen but your code had better be able to handle that case!
3: There are bonus points for "sweeps" scored during the round which I am ignoring for the purpose of this challenge.
code-golf card-games
$endgroup$
I like card game challenges so I made this one for the Italian card game Scopa. My family has been playing this game since time immemorial. It has a very interesting scoring system that should be fun to golf. I will post an answer in R to get the fun started, that I am sure people will improve upon.
The challenge: figure out the number of points scored in a round of Scopa, given the cards the player captured during the round as input.
There are 40 cards in a Scopa deck. If you are using an international deck you remove the 8s, 9s, and 10s, leaving A,2,3,4,5,6,7,Q,J,K in each suit.1 There are two players or partnerships, and after every round, all cards end up captured by one or the other of the two players. The score is counted as follows (more information here):
- The player with the most cards scores 1 point.
- The player with the most diamonds (or coins if using the Italian deck) scores 1 point.
- The player with the 7 of diamonds (or coins), known as the sette bello or beautiful seven, scores 1 point.
- The player with the highest primiera scores 1 point. A player's primiera score is the sum of the scores of the highest-value card that the player captured in each suit (see table below). If you do not have at least one card in every suit, you lose by default even if your score would exceed your opponent's score. In the exceedingly rare case that neither player has at least one card in every suit, the player with the higher primiera total scores the point.2
Table of primiera scores
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
So a player can score at most 4 points in a round.3 If there is a tie, which is possible for cards, diamonds, or primiera, no one scores the point.
It's important to realize that since each card must be captured by one of the two players, you can infer what cards the other player must have taken even if you only know what cards one player took. You will need to do this to correctly score primiera.
Challenge rules
Input
Your code should take as input the cards captured by a single player during a round of Scopa.
Input must be in string format, in which one character represents the rank of each card and one character its suit. This removes the potential loophole of passing the primiera scores in directly as input. Conversion of card ranks to primiera scores must be done in the program. However you may choose to use a single string separated by spaces or commas, an array of strings, or any other format. For example if you choose to encode ranks as 76A5432QJK
and suits as DCHS
you could use inputs such as ['7D', '6H', 'QD', 'JS']
or '7D,6H,QD,JS'
.
Output
An integer from 0 to 4 representing the player's score.
Winning
Shortest answer in bytes wins!
Test cases
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Scores 4: 1 point for >20 cards, 1 point for >5 diamonds, 1 point for the 7 of diamonds, and 1 point for scoring 78 in primiera (7,7,7,5 where opponent has 7,6,6,6 for 75)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Scores 0: <=20 cards, <=5 diamonds, no 7 of diamonds, and only scores 69 in primiera (7,7,4,3 where opponent has 7,7,6,K for 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Scores 3: 1 point for >20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. The primiera would be 63 (7,7,7) and the opponent can only score 51 (7,Q,Q,Q) but since this hand has no spades it loses the point by default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Scores 3: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. The primiera only scores 51 (7,Q,Q,Q) and the opponent can score 63 (7,7,7) but since the opponent's hand has no diamonds this hand wins the primiera point by default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Scores 3: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. Even though this hand has no spades, it still wins primiera by a score of 63 to 57 (7,7,7 versus 7,6,6) because the opponent's hand has no diamonds.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Scores 2: <=20 cards, 1 point for >5 diamonds, 1 point for 7 of diamonds. This hand has no spades, and opponent's hand has no diamonds. Opponent wins primiera by a score of 63 to 41 (7,7,7 versus 7,Q,Q).
[]
(empty array)
Scores 0
1: At least in our family, Jack outranks Queen in Scopa but this is irrelevant for scoring purposes.
2: I've been playing this game since childhood and have never seen that happen but your code had better be able to handle that case!
3: There are bonus points for "sweeps" scored during the round which I am ignoring for the purpose of this challenge.
code-golf card-games
code-golf card-games
asked 8 hours ago
qdreadqdread
1845 bronze badges
1845 bronze badges
$begingroup$
Does each rank have to be represented by a distinct character?
$endgroup$
– Doorknob♦
8 hours ago
$begingroup$
@Doorknob No not necessarily, but at least in the solution I am working on I found it necessary to have a unique character for each rank to get all the test cases right.
$endgroup$
– qdread
8 hours ago
add a comment
|
$begingroup$
Does each rank have to be represented by a distinct character?
$endgroup$
– Doorknob♦
8 hours ago
$begingroup$
@Doorknob No not necessarily, but at least in the solution I am working on I found it necessary to have a unique character for each rank to get all the test cases right.
$endgroup$
– qdread
8 hours ago
$begingroup$
Does each rank have to be represented by a distinct character?
$endgroup$
– Doorknob♦
8 hours ago
$begingroup$
Does each rank have to be represented by a distinct character?
$endgroup$
– Doorknob♦
8 hours ago
$begingroup$
@Doorknob No not necessarily, but at least in the solution I am working on I found it necessary to have a unique character for each rank to get all the test cases right.
$endgroup$
– qdread
8 hours ago
$begingroup$
@Doorknob No not necessarily, but at least in the solution I am working on I found it necessary to have a unique character for each rank to get all the test cases right.
$endgroup$
– qdread
8 hours ago
add a comment
|
5 Answers
5
active
oldest
votes
$begingroup$
Ruby, 156 153 bytes
->a
Try it online!
->a # count how many are left
This uses ;865432000
to represent 76A5432QJK
respectively, and suits are in lowercase. (The choice of characters is because subtracting 38 from each gives their primiera value, but we never actually do so because only the relative difference matters.)
We don't check whether either player is missing a suit because it is unnecessary -- since all cards are counted as 38 plus their actual value, if someone is missing a suit, the highest score they can get is (21+38)*3 = 177, which is less than (10+38)*3 + 21+38 = 203, the lowest score the other player can get. We cannot have the two players missing an unequal nonzero number of suits, because a player can only be missing 0, 1, or 2 suits, and if someone is missing 2 suits they have all the cards of the other 2 suits.
$endgroup$
add a comment
|
$begingroup$
JavaScript (ES6), 171 bytes
Takes input as a set.
a=>(x=(g=o=>[..."CHSD"].map(s=>[..."JQK2345A67"].map((v,i)=>(S=o^a.has(v+s))?m="111345679"[++n,i]||12:0,n=m=0)|(T|=!n,t-=m),T=t=0)|t*(T||99))``,a.size>20)+S+(n>5)+(x<g(1))
Try it online!
$endgroup$
add a comment
|
$begingroup$
Retina 0.8.2, 334 bytes
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
+`((ww).*¶.*)2
$1
T`67AJQK`8960
%O$`(w)(w)
$2$1
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
m`^(?=(9D))?...;
$#1;
(;(?!.*10).* 0.*;).*
$1
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
1
Try it online! Link includes test cases. Explanation:
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
Create a list of all 40 cards.
+`((ww).*¶.*)2
$1
Remove the cards the player holds.
T`67AJQK`8960
Replace each rank by its sort order, which is 9 for 7
and 10 less than its value for other cards.
%O$`(w)(w)
$2$1
Sort the cards by suit and rank.
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
Count the number of cards in each suit and also capture the highest ranked card in each suit, capturing the highest diamond twice.
m`^(?=(9D))?...;
$#1;
Check whether the highest diamond was the 7.
(;(?!.*10).* 0.*;).*
$1
Delete all of the highest cards if one of the suits has no cards.
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
Convert the highest cards to their unary score and sum them together. Also convert the total number of cards and suit lengths to unary.
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
Score points if the total, diamonds, or primiera, is higher.
1
Total the score.
$endgroup$
add a comment
|
$begingroup$
Python 3, 249 bytes
lambda a:sum([len(a)>20,'7D'in a,len([x for x in a if x[1]<'E'])>5,p(a)>p(x+y for x in'9876543210'for y in S-a)])
p=lambda a:[all(x in''.join(a)for x in S),sum(max([[0,7,3,4,5,6,9,12,0,0][int(x[0])]for x in a if x[1]==y]+[-9])for y in S)]
S='DcHS'
Uses 1
for Ace, 0
for Queen, 9
for Jack and 8
for King. The sets are D
(Diamond), c
(Club), H
(Heart) and S
(Spade).
Try it online!
$endgroup$
add a comment
|
$begingroup$
R, 320 298 bytes
edit: golfed down by aliasing some functions.
I am terrible at this, so I'm sure someone can improve on this if they care to take the time.
h=scan(,'');b=substr;z=length;r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)));s=match(b(h,2,2),c('D','C','H','S'));l=c(11,8,6:2,0);p=0;for(i in 1:4)m=r[s==i];d=l[min(m)]-l[!1:8%in%m][1];if(!is.na(d))p=p+d;u=table(s);x=max(u)==10;(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
with newlines:
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
l=c(11,8,6:2,0)
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
u=table(s)
x=max(u)==10
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
explanation
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
Takes user input as a character vector, where face cards are all F
, aliases some functions, splits each element of the vector into its first and second character, and maps them to r
anks and s
uits respectively.
l=c(11,8,6:2,0)
Lookup table for primiera, with 10 subtracted from each value to save bytes since all cards score at least 10.
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
Sets p=0
and loops through the four suits to calculate the score for each suit. First we call m=r[s==i]
to find m
y cards, or the ranks held in suit i
.
Next we find our score for suit i
with l[min(m)]
and the opponent's with l[!1:8%in%m][1]
, finding the highest-scoring rank not in m
. We take the difference d
between them.
We increment the variable p
by d
if d
is an integer. If the input has no cards in suit i
, d
will have the value NA
. In the end p>0
means the player has a higher score than the opponent, ignoring missing suits for now.
u=table(s)
tabulates the number of cards in each suit.
x=max(u)==10
is whether the opponent is missing a suit (if the player holds at least 10 cards in one suit).
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
The final line adds up logicals for each of the four points which R converts to an integer. (z(h)>20)
is for cards, (sum(s==1)>5)
is for diamonds, (2%in%(r+s))
is for the 7 of diamonds which I encoded as having rank and suit values of 1.
The last term on the final line outputs a logical for primiera which accounts for all possible cases of either the player or opponent, or both, missing a suit. If z(u)==4
the player holds at least one card in each suit.
$endgroup$
add a comment
|
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "200"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f193547%2fwhat-is-the-score-of-my-scopa-hand%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
Ruby, 156 153 bytes
->a
Try it online!
->a # count how many are left
This uses ;865432000
to represent 76A5432QJK
respectively, and suits are in lowercase. (The choice of characters is because subtracting 38 from each gives their primiera value, but we never actually do so because only the relative difference matters.)
We don't check whether either player is missing a suit because it is unnecessary -- since all cards are counted as 38 plus their actual value, if someone is missing a suit, the highest score they can get is (21+38)*3 = 177, which is less than (10+38)*3 + 21+38 = 203, the lowest score the other player can get. We cannot have the two players missing an unequal nonzero number of suits, because a player can only be missing 0, 1, or 2 suits, and if someone is missing 2 suits they have all the cards of the other 2 suits.
$endgroup$
add a comment
|
$begingroup$
Ruby, 156 153 bytes
->a
Try it online!
->a # count how many are left
This uses ;865432000
to represent 76A5432QJK
respectively, and suits are in lowercase. (The choice of characters is because subtracting 38 from each gives their primiera value, but we never actually do so because only the relative difference matters.)
We don't check whether either player is missing a suit because it is unnecessary -- since all cards are counted as 38 plus their actual value, if someone is missing a suit, the highest score they can get is (21+38)*3 = 177, which is less than (10+38)*3 + 21+38 = 203, the lowest score the other player can get. We cannot have the two players missing an unequal nonzero number of suits, because a player can only be missing 0, 1, or 2 suits, and if someone is missing 2 suits they have all the cards of the other 2 suits.
$endgroup$
add a comment
|
$begingroup$
Ruby, 156 153 bytes
->a
Try it online!
->a # count how many are left
This uses ;865432000
to represent 76A5432QJK
respectively, and suits are in lowercase. (The choice of characters is because subtracting 38 from each gives their primiera value, but we never actually do so because only the relative difference matters.)
We don't check whether either player is missing a suit because it is unnecessary -- since all cards are counted as 38 plus their actual value, if someone is missing a suit, the highest score they can get is (21+38)*3 = 177, which is less than (10+38)*3 + 21+38 = 203, the lowest score the other player can get. We cannot have the two players missing an unequal nonzero number of suits, because a player can only be missing 0, 1, or 2 suits, and if someone is missing 2 suits they have all the cards of the other 2 suits.
$endgroup$
Ruby, 156 153 bytes
->a
Try it online!
->a # count how many are left
This uses ;865432000
to represent 76A5432QJK
respectively, and suits are in lowercase. (The choice of characters is because subtracting 38 from each gives their primiera value, but we never actually do so because only the relative difference matters.)
We don't check whether either player is missing a suit because it is unnecessary -- since all cards are counted as 38 plus their actual value, if someone is missing a suit, the highest score they can get is (21+38)*3 = 177, which is less than (10+38)*3 + 21+38 = 203, the lowest score the other player can get. We cannot have the two players missing an unequal nonzero number of suits, because a player can only be missing 0, 1, or 2 suits, and if someone is missing 2 suits they have all the cards of the other 2 suits.
edited 3 hours ago
answered 7 hours ago
Doorknob♦Doorknob
56.3k17 gold badges121 silver badges362 bronze badges
56.3k17 gold badges121 silver badges362 bronze badges
add a comment
|
add a comment
|
$begingroup$
JavaScript (ES6), 171 bytes
Takes input as a set.
a=>(x=(g=o=>[..."CHSD"].map(s=>[..."JQK2345A67"].map((v,i)=>(S=o^a.has(v+s))?m="111345679"[++n,i]||12:0,n=m=0)|(T|=!n,t-=m),T=t=0)|t*(T||99))``,a.size>20)+S+(n>5)+(x<g(1))
Try it online!
$endgroup$
add a comment
|
$begingroup$
JavaScript (ES6), 171 bytes
Takes input as a set.
a=>(x=(g=o=>[..."CHSD"].map(s=>[..."JQK2345A67"].map((v,i)=>(S=o^a.has(v+s))?m="111345679"[++n,i]||12:0,n=m=0)|(T|=!n,t-=m),T=t=0)|t*(T||99))``,a.size>20)+S+(n>5)+(x<g(1))
Try it online!
$endgroup$
add a comment
|
$begingroup$
JavaScript (ES6), 171 bytes
Takes input as a set.
a=>(x=(g=o=>[..."CHSD"].map(s=>[..."JQK2345A67"].map((v,i)=>(S=o^a.has(v+s))?m="111345679"[++n,i]||12:0,n=m=0)|(T|=!n,t-=m),T=t=0)|t*(T||99))``,a.size>20)+S+(n>5)+(x<g(1))
Try it online!
$endgroup$
JavaScript (ES6), 171 bytes
Takes input as a set.
a=>(x=(g=o=>[..."CHSD"].map(s=>[..."JQK2345A67"].map((v,i)=>(S=o^a.has(v+s))?m="111345679"[++n,i]||12:0,n=m=0)|(T|=!n,t-=m),T=t=0)|t*(T||99))``,a.size>20)+S+(n>5)+(x<g(1))
Try it online!
answered 5 hours ago
ArnauldArnauld
93.4k7 gold badges110 silver badges380 bronze badges
93.4k7 gold badges110 silver badges380 bronze badges
add a comment
|
add a comment
|
$begingroup$
Retina 0.8.2, 334 bytes
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
+`((ww).*¶.*)2
$1
T`67AJQK`8960
%O$`(w)(w)
$2$1
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
m`^(?=(9D))?...;
$#1;
(;(?!.*10).* 0.*;).*
$1
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
1
Try it online! Link includes test cases. Explanation:
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
Create a list of all 40 cards.
+`((ww).*¶.*)2
$1
Remove the cards the player holds.
T`67AJQK`8960
Replace each rank by its sort order, which is 9 for 7
and 10 less than its value for other cards.
%O$`(w)(w)
$2$1
Sort the cards by suit and rank.
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
Count the number of cards in each suit and also capture the highest ranked card in each suit, capturing the highest diamond twice.
m`^(?=(9D))?...;
$#1;
Check whether the highest diamond was the 7.
(;(?!.*10).* 0.*;).*
$1
Delete all of the highest cards if one of the suits has no cards.
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
Convert the highest cards to their unary score and sum them together. Also convert the total number of cards and suit lengths to unary.
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
Score points if the total, diamonds, or primiera, is higher.
1
Total the score.
$endgroup$
add a comment
|
$begingroup$
Retina 0.8.2, 334 bytes
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
+`((ww).*¶.*)2
$1
T`67AJQK`8960
%O$`(w)(w)
$2$1
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
m`^(?=(9D))?...;
$#1;
(;(?!.*10).* 0.*;).*
$1
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
1
Try it online! Link includes test cases. Explanation:
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
Create a list of all 40 cards.
+`((ww).*¶.*)2
$1
Remove the cards the player holds.
T`67AJQK`8960
Replace each rank by its sort order, which is 9 for 7
and 10 less than its value for other cards.
%O$`(w)(w)
$2$1
Sort the cards by suit and rank.
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
Count the number of cards in each suit and also capture the highest ranked card in each suit, capturing the highest diamond twice.
m`^(?=(9D))?...;
$#1;
Check whether the highest diamond was the 7.
(;(?!.*10).* 0.*;).*
$1
Delete all of the highest cards if one of the suits has no cards.
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
Convert the highest cards to their unary score and sum them together. Also convert the total number of cards and suit lengths to unary.
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
Score points if the total, diamonds, or primiera, is higher.
1
Total the score.
$endgroup$
add a comment
|
$begingroup$
Retina 0.8.2, 334 bytes
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
+`((ww).*¶.*)2
$1
T`67AJQK`8960
%O$`(w)(w)
$2$1
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
m`^(?=(9D))?...;
$#1;
(;(?!.*10).* 0.*;).*
$1
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
1
Try it online! Link includes test cases. Explanation:
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
Create a list of all 40 cards.
+`((ww).*¶.*)2
$1
Remove the cards the player holds.
T`67AJQK`8960
Replace each rank by its sort order, which is 9 for 7
and 10 less than its value for other cards.
%O$`(w)(w)
$2$1
Sort the cards by suit and rank.
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
Count the number of cards in each suit and also capture the highest ranked card in each suit, capturing the highest diamond twice.
m`^(?=(9D))?...;
$#1;
Check whether the highest diamond was the 7.
(;(?!.*10).* 0.*;).*
$1
Delete all of the highest cards if one of the suits has no cards.
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
Convert the highest cards to their unary score and sum them together. Also convert the total number of cards and suit lengths to unary.
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
Score points if the total, diamonds, or primiera, is higher.
1
Total the score.
$endgroup$
Retina 0.8.2, 334 bytes
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
+`((ww).*¶.*)2
$1
T`67AJQK`8960
%O$`(w)(w)
$2$1
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
m`^(?=(9D))?...;
$#1;
(;(?!.*10).* 0.*;).*
$1
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
1
Try it online! Link includes test cases. Explanation:
$
¶234567JQKA
r`.G
$&C $&D $&H $&S
Create a list of all 40 cards.
+`((ww).*¶.*)2
$1
Remove the cards the player holds.
T`67AJQK`8960
Replace each rank by its sort order, which is 9 for 7
and 10 less than its value for other cards.
%O$`(w)(w)
$2$1
Sort the cards by suit and rank.
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;$2$3$4$5
Count the number of cards in each suit and also capture the highest ranked card in each suit, capturing the highest diamond twice.
m`^(?=(9D))?...;
$#1;
Check whether the highest diamond was the 7.
(;(?!.*10).* 0.*;).*
$1
Delete all of the highest cards if one of the suits has no cards.
d[C-S]
1$&
19w
21$*@
d+(w )?
$*@
Convert the highest cards to their unary score and sum them together. Also convert the total number of cards and suit lengths to unary.
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!2))?@* @* ((?!3))?.*;((?!4))?.*
$#1$#5$#6$#7
Score points if the total, diamonds, or primiera, is higher.
1
Total the score.
answered 4 hours ago
NeilNeil
89.3k8 gold badges46 silver badges188 bronze badges
89.3k8 gold badges46 silver badges188 bronze badges
add a comment
|
add a comment
|
$begingroup$
Python 3, 249 bytes
lambda a:sum([len(a)>20,'7D'in a,len([x for x in a if x[1]<'E'])>5,p(a)>p(x+y for x in'9876543210'for y in S-a)])
p=lambda a:[all(x in''.join(a)for x in S),sum(max([[0,7,3,4,5,6,9,12,0,0][int(x[0])]for x in a if x[1]==y]+[-9])for y in S)]
S='DcHS'
Uses 1
for Ace, 0
for Queen, 9
for Jack and 8
for King. The sets are D
(Diamond), c
(Club), H
(Heart) and S
(Spade).
Try it online!
$endgroup$
add a comment
|
$begingroup$
Python 3, 249 bytes
lambda a:sum([len(a)>20,'7D'in a,len([x for x in a if x[1]<'E'])>5,p(a)>p(x+y for x in'9876543210'for y in S-a)])
p=lambda a:[all(x in''.join(a)for x in S),sum(max([[0,7,3,4,5,6,9,12,0,0][int(x[0])]for x in a if x[1]==y]+[-9])for y in S)]
S='DcHS'
Uses 1
for Ace, 0
for Queen, 9
for Jack and 8
for King. The sets are D
(Diamond), c
(Club), H
(Heart) and S
(Spade).
Try it online!
$endgroup$
add a comment
|
$begingroup$
Python 3, 249 bytes
lambda a:sum([len(a)>20,'7D'in a,len([x for x in a if x[1]<'E'])>5,p(a)>p(x+y for x in'9876543210'for y in S-a)])
p=lambda a:[all(x in''.join(a)for x in S),sum(max([[0,7,3,4,5,6,9,12,0,0][int(x[0])]for x in a if x[1]==y]+[-9])for y in S)]
S='DcHS'
Uses 1
for Ace, 0
for Queen, 9
for Jack and 8
for King. The sets are D
(Diamond), c
(Club), H
(Heart) and S
(Spade).
Try it online!
$endgroup$
Python 3, 249 bytes
lambda a:sum([len(a)>20,'7D'in a,len([x for x in a if x[1]<'E'])>5,p(a)>p(x+y for x in'9876543210'for y in S-a)])
p=lambda a:[all(x in''.join(a)for x in S),sum(max([[0,7,3,4,5,6,9,12,0,0][int(x[0])]for x in a if x[1]==y]+[-9])for y in S)]
S='DcHS'
Uses 1
for Ace, 0
for Queen, 9
for Jack and 8
for King. The sets are D
(Diamond), c
(Club), H
(Heart) and S
(Spade).
Try it online!
answered 3 hours ago
Black Owl KaiBlack Owl Kai
8001 silver badge12 bronze badges
8001 silver badge12 bronze badges
add a comment
|
add a comment
|
$begingroup$
R, 320 298 bytes
edit: golfed down by aliasing some functions.
I am terrible at this, so I'm sure someone can improve on this if they care to take the time.
h=scan(,'');b=substr;z=length;r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)));s=match(b(h,2,2),c('D','C','H','S'));l=c(11,8,6:2,0);p=0;for(i in 1:4)m=r[s==i];d=l[min(m)]-l[!1:8%in%m][1];if(!is.na(d))p=p+d;u=table(s);x=max(u)==10;(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
with newlines:
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
l=c(11,8,6:2,0)
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
u=table(s)
x=max(u)==10
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
explanation
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
Takes user input as a character vector, where face cards are all F
, aliases some functions, splits each element of the vector into its first and second character, and maps them to r
anks and s
uits respectively.
l=c(11,8,6:2,0)
Lookup table for primiera, with 10 subtracted from each value to save bytes since all cards score at least 10.
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
Sets p=0
and loops through the four suits to calculate the score for each suit. First we call m=r[s==i]
to find m
y cards, or the ranks held in suit i
.
Next we find our score for suit i
with l[min(m)]
and the opponent's with l[!1:8%in%m][1]
, finding the highest-scoring rank not in m
. We take the difference d
between them.
We increment the variable p
by d
if d
is an integer. If the input has no cards in suit i
, d
will have the value NA
. In the end p>0
means the player has a higher score than the opponent, ignoring missing suits for now.
u=table(s)
tabulates the number of cards in each suit.
x=max(u)==10
is whether the opponent is missing a suit (if the player holds at least 10 cards in one suit).
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
The final line adds up logicals for each of the four points which R converts to an integer. (z(h)>20)
is for cards, (sum(s==1)>5)
is for diamonds, (2%in%(r+s))
is for the 7 of diamonds which I encoded as having rank and suit values of 1.
The last term on the final line outputs a logical for primiera which accounts for all possible cases of either the player or opponent, or both, missing a suit. If z(u)==4
the player holds at least one card in each suit.
$endgroup$
add a comment
|
$begingroup$
R, 320 298 bytes
edit: golfed down by aliasing some functions.
I am terrible at this, so I'm sure someone can improve on this if they care to take the time.
h=scan(,'');b=substr;z=length;r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)));s=match(b(h,2,2),c('D','C','H','S'));l=c(11,8,6:2,0);p=0;for(i in 1:4)m=r[s==i];d=l[min(m)]-l[!1:8%in%m][1];if(!is.na(d))p=p+d;u=table(s);x=max(u)==10;(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
with newlines:
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
l=c(11,8,6:2,0)
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
u=table(s)
x=max(u)==10
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
explanation
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
Takes user input as a character vector, where face cards are all F
, aliases some functions, splits each element of the vector into its first and second character, and maps them to r
anks and s
uits respectively.
l=c(11,8,6:2,0)
Lookup table for primiera, with 10 subtracted from each value to save bytes since all cards score at least 10.
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
Sets p=0
and loops through the four suits to calculate the score for each suit. First we call m=r[s==i]
to find m
y cards, or the ranks held in suit i
.
Next we find our score for suit i
with l[min(m)]
and the opponent's with l[!1:8%in%m][1]
, finding the highest-scoring rank not in m
. We take the difference d
between them.
We increment the variable p
by d
if d
is an integer. If the input has no cards in suit i
, d
will have the value NA
. In the end p>0
means the player has a higher score than the opponent, ignoring missing suits for now.
u=table(s)
tabulates the number of cards in each suit.
x=max(u)==10
is whether the opponent is missing a suit (if the player holds at least 10 cards in one suit).
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
The final line adds up logicals for each of the four points which R converts to an integer. (z(h)>20)
is for cards, (sum(s==1)>5)
is for diamonds, (2%in%(r+s))
is for the 7 of diamonds which I encoded as having rank and suit values of 1.
The last term on the final line outputs a logical for primiera which accounts for all possible cases of either the player or opponent, or both, missing a suit. If z(u)==4
the player holds at least one card in each suit.
$endgroup$
add a comment
|
$begingroup$
R, 320 298 bytes
edit: golfed down by aliasing some functions.
I am terrible at this, so I'm sure someone can improve on this if they care to take the time.
h=scan(,'');b=substr;z=length;r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)));s=match(b(h,2,2),c('D','C','H','S'));l=c(11,8,6:2,0);p=0;for(i in 1:4)m=r[s==i];d=l[min(m)]-l[!1:8%in%m][1];if(!is.na(d))p=p+d;u=table(s);x=max(u)==10;(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
with newlines:
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
l=c(11,8,6:2,0)
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
u=table(s)
x=max(u)==10
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
explanation
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
Takes user input as a character vector, where face cards are all F
, aliases some functions, splits each element of the vector into its first and second character, and maps them to r
anks and s
uits respectively.
l=c(11,8,6:2,0)
Lookup table for primiera, with 10 subtracted from each value to save bytes since all cards score at least 10.
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
Sets p=0
and loops through the four suits to calculate the score for each suit. First we call m=r[s==i]
to find m
y cards, or the ranks held in suit i
.
Next we find our score for suit i
with l[min(m)]
and the opponent's with l[!1:8%in%m][1]
, finding the highest-scoring rank not in m
. We take the difference d
between them.
We increment the variable p
by d
if d
is an integer. If the input has no cards in suit i
, d
will have the value NA
. In the end p>0
means the player has a higher score than the opponent, ignoring missing suits for now.
u=table(s)
tabulates the number of cards in each suit.
x=max(u)==10
is whether the opponent is missing a suit (if the player holds at least 10 cards in one suit).
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
The final line adds up logicals for each of the four points which R converts to an integer. (z(h)>20)
is for cards, (sum(s==1)>5)
is for diamonds, (2%in%(r+s))
is for the 7 of diamonds which I encoded as having rank and suit values of 1.
The last term on the final line outputs a logical for primiera which accounts for all possible cases of either the player or opponent, or both, missing a suit. If z(u)==4
the player holds at least one card in each suit.
$endgroup$
R, 320 298 bytes
edit: golfed down by aliasing some functions.
I am terrible at this, so I'm sure someone can improve on this if they care to take the time.
h=scan(,'');b=substr;z=length;r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)));s=match(b(h,2,2),c('D','C','H','S'));l=c(11,8,6:2,0);p=0;for(i in 1:4)m=r[s==i];d=l[min(m)]-l[!1:8%in%m][1];if(!is.na(d))p=p+d;u=table(s);x=max(u)==10;(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
with newlines:
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
l=c(11,8,6:2,0)
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
u=table(s)
x=max(u)==10
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
explanation
h=scan(,'')
b=substr
z=length
r=match(b(h,1,1),c(7:6,'A',5:2,rep('F',3)))
s=match(b(h,2,2),c('D','C','H','S'))
Takes user input as a character vector, where face cards are all F
, aliases some functions, splits each element of the vector into its first and second character, and maps them to r
anks and s
uits respectively.
l=c(11,8,6:2,0)
Lookup table for primiera, with 10 subtracted from each value to save bytes since all cards score at least 10.
p=0
for(i in 1:4)m=r[s==i]
d=l[min(m)]-l[!1:8%in%m][1]
if(!is.na(d))p=p+d
Sets p=0
and loops through the four suits to calculate the score for each suit. First we call m=r[s==i]
to find m
y cards, or the ranks held in suit i
.
Next we find our score for suit i
with l[min(m)]
and the opponent's with l[!1:8%in%m][1]
, finding the highest-scoring rank not in m
. We take the difference d
between them.
We increment the variable p
by d
if d
is an integer. If the input has no cards in suit i
, d
will have the value NA
. In the end p>0
means the player has a higher score than the opponent, ignoring missing suits for now.
u=table(s)
tabulates the number of cards in each suit.
x=max(u)==10
is whether the opponent is missing a suit (if the player holds at least 10 cards in one suit).
(z(h)>20)+(sum(s==1)>5)+(2%in%(r+s))+((z(u)==4&(p>0|x))|(z(u)<4&x&p>0))
The final line adds up logicals for each of the four points which R converts to an integer. (z(h)>20)
is for cards, (sum(s==1)>5)
is for diamonds, (2%in%(r+s))
is for the 7 of diamonds which I encoded as having rank and suit values of 1.
The last term on the final line outputs a logical for primiera which accounts for all possible cases of either the player or opponent, or both, missing a suit. If z(u)==4
the player holds at least one card in each suit.
edited 1 hour ago
answered 8 hours ago
qdreadqdread
1845 bronze badges
1845 bronze badges
add a comment
|
add a comment
|
If this is an answer to a challenge…
…Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.
…Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one.
Explanations of your answer make it more interesting to read and are very much encouraged.…Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.
More generally…
…Please make sure to answer the question and provide sufficient detail.
…Avoid asking for help, clarification or responding to other answers (use comments instead).
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f193547%2fwhat-is-the-score-of-my-scopa-hand%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
Does each rank have to be represented by a distinct character?
$endgroup$
– Doorknob♦
8 hours ago
$begingroup$
@Doorknob No not necessarily, but at least in the solution I am working on I found it necessary to have a unique character for each rank to get all the test cases right.
$endgroup$
– qdread
8 hours ago