Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into add-approach-bob
Browse files Browse the repository at this point in the history
jagdish-15 authored Dec 31, 2024
2 parents eaa5cdf + 7b9ad75 commit 1802823
Showing 12 changed files with 298 additions and 224 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/markdown.yml
Original file line number Diff line number Diff line change
@@ -19,4 +19,4 @@ jobs:
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- name: Lint markdown
uses: DavidAnson/markdownlint-cli2-action@db43aef879112c3119a410d69f66701e0d530809
uses: DavidAnson/markdownlint-cli2-action@eb5ca3ab411449c66620fe7f1b3c9e10547144b0
Original file line number Diff line number Diff line change
@@ -94,7 +94,7 @@ public void aValueSmallerThanTheArraysSmallestValueIsNotFound() {

@Disabled("Remove to run test")
@Test
public void aValueLargerThanTheArraysSmallestValueIsNotFound() throws ValueNotFoundException {
public void aValueLargerThanTheArraysLargestValueIsNotFound() throws ValueNotFoundException {
List<Integer> sortedList = List.of(1, 3, 4, 6, 8, 9, 11);

BinarySearch search = new BinarySearch(sortedList);
12 changes: 6 additions & 6 deletions exercises/practice/darts/.approaches/introduction.md
Original file line number Diff line number Diff line change
@@ -39,19 +39,19 @@ import java.util.function.DoublePredicate;

class Darts {

final private static double innerRing = 1.0;
final private static double middleRing = 5.0;
final private static double outerRing = 10.0;
private static final double INNER_RING = 1.0;
private static final double MIDDLE_RING = 5.0;
private static final double OUTER_RING = 10.0;

int score(double x, double y) {
var pointRadius = (Math.sqrt((x * x) + (y * y)));
DoublePredicate thrownOutside = ring -> pointRadius > ring;

if (thrownOutside.test(outerRing))
if (thrownOutside.test(OUTER_RING))
return 0;
if (thrownOutside.test(middleRing))
if (thrownOutside.test(MIDDLE_RING))
return 1;
if (thrownOutside.test(innerRing))
if (thrownOutside.test(INNER_RING))
return 5;
return 10;
}
1 change: 1 addition & 0 deletions exercises/practice/palindrome-products/.meta/config.json
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@
],
"contributors": [
"FridaTveit",
"jagdish-15",
"jmrunkle",
"jssander",
"kytrinyx",
24 changes: 17 additions & 7 deletions exercises/practice/palindrome-products/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
# This is an auto-generated file. Regular comments will be removed when this
# file is regenerated. Regenerating will not touch any manually added keys,
# so comments can be added in a "comment" key.
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[5cff78fe-cf02-459d-85c2-ce584679f887]
description = "finds the smallest palindrome from single digit factors"
description = "find the smallest palindrome from single digit factors"

[0853f82c-5fc4-44ae-be38-fadb2cced92d]
description = "finds the largest palindrome from single digit factors"
description = "find the largest palindrome from single digit factors"

[66c3b496-bdec-4103-9129-3fcb5a9063e1]
description = "find the smallest palindrome from double digit factors"
@@ -15,13 +22,13 @@ description = "find the smallest palindrome from double digit factors"
description = "find the largest palindrome from double digit factors"

[cecb5a35-46d1-4666-9719-fa2c3af7499d]
description = "find smallest palindrome from triple digit factors"
description = "find the smallest palindrome from triple digit factors"

[edab43e1-c35f-4ea3-8c55-2f31dddd92e5]
description = "find the largest palindrome from triple digit factors"

[4f802b5a-9d74-4026-a70f-b53ff9234e4e]
description = "find smallest palindrome from four digit factors"
description = "find the smallest palindrome from four digit factors"

[787525e0-a5f9-40f3-8cb2-23b52cf5d0be]
description = "find the largest palindrome from four digit factors"
@@ -37,3 +44,6 @@ description = "error result for smallest if min is more than max"

[eeeb5bff-3f47-4b1e-892f-05829277bd74]
description = "error result for largest if min is more than max"

[16481711-26c4-42e0-9180-e2e4e8b29c23]
description = "smallest product does not use the smallest factor"
Original file line number Diff line number Diff line change
@@ -176,6 +176,22 @@ public void errorLargestMinIsMoreThanMax() {
.withMessage("invalid input: min must be <= max");
}

@Disabled("Remove to run test")
@Test
public void smallestProductDoesNotUseTheSmallestFactor() {
List<List<Integer>> expected = Collections.unmodifiableList(
Arrays.asList(
Arrays.asList(3297, 3333)
)
);
long expectedValue = 10988901L;

SortedMap<Long, List<List<Integer>>> palindromes = palindromeCalculator.getPalindromeProductsWithFactors(3215,
4000);

checkPalindromeWithFactorsMatchesExpected(expected, expectedValue, palindromes, palindromes.firstKey());
}


private void checkPalindromeWithFactorsMatchesExpected(List<List<Integer>> expectedPalindromeFactors,
long expectedValueOfPalindrome,
4 changes: 2 additions & 2 deletions exercises/practice/poker/.meta/config.json
Original file line number Diff line number Diff line change
@@ -6,10 +6,12 @@
"aadityakulkarni",
"FridaTveit",
"hgvanpariya",
"jagdish-15",
"jmrunkle",
"katmpatz",
"kytrinyx",
"lemoncurry",
"MartinDekanovsky",
"mirkoperillo",
"msomji",
"muzimuzhi",
@@ -27,8 +29,6 @@
"src/test/java/PokerTest.java"
],
"example": [
".meta/src/reference/java/Card.java",
".meta/src/reference/java/Hand.java",
".meta/src/reference/java/Poker.java"
],
"invalidator": [
28 changes: 0 additions & 28 deletions exercises/practice/poker/.meta/src/reference/java/Card.java

This file was deleted.

148 changes: 0 additions & 148 deletions exercises/practice/poker/.meta/src/reference/java/Hand.java

This file was deleted.

140 changes: 119 additions & 21 deletions exercises/practice/poker/.meta/src/reference/java/Poker.java
Original file line number Diff line number Diff line change
@@ -1,34 +1,132 @@
import java.util.*;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Poker {
private final List<String> bestHands;

Poker(final List<String> hands) {
bestHands = bestHands(hands);
private List<String> hands;
private List<Integer> numericalValues;
private List<Integer> counts;

public Poker(List<String> hands) {
this.hands = hands;
}

List<String> getBestHands() {
public List<String> getBestHands() {
List<String> bestHands = new ArrayList<>();
bestHands.add(hands.get(0));

for (int i = 1; i < hands.size(); i++) {
if (getHandRank(hands.get(i)) > getHandRank(bestHands.get(0))) {
bestHands.set(0, hands.get(i));
} else if (getHandRank(hands.get(i)) == getHandRank(bestHands.get(0))) {
getHandRank(bestHands.get(0));
List<Integer> firstHand = counts;

getHandRank(hands.get(i));
List<Integer> secondHand = counts;

if (firstHand.equals(secondHand)) {
bestHands.add(hands.get(i));
} else {
for (int j = 4; j >= 2; j--) {
if (firstHand.contains(j) && secondHand.contains(j)) {
if (firstHand.lastIndexOf(j) < secondHand.lastIndexOf(j)) {
bestHands.set(0, hands.get(i));
break;
} else if (firstHand.lastIndexOf(j) > secondHand.lastIndexOf(j)) {
break;
} else if (firstHand.lastIndexOf(j) == secondHand.lastIndexOf(j) && j == 2) {
if (firstHand.indexOf(j) < secondHand.indexOf(j)) {
bestHands.set(0, hands.get(i));
}
}
}
}
for (int k = firstHand.size() - 1; k >= 0; k--) {
if (firstHand.get(k) <= 1 && secondHand.get(k) <= 1) {
if (firstHand.get(k) < secondHand.get(k)) {
bestHands.set(0, hands.get(i));
break;
} else if (firstHand.get(k) > secondHand.get(k)) {
break;
}
}
}
}
}
}
return bestHands;
}

private List<String> bestHands(final List<String> hands) {
ArrayList<Hand> scoredHands = new ArrayList<>();
public int getHandRank(String hand) {
String[] cards = hand.split(" ");
List<String> values = new ArrayList<>();
List<String> suits = new ArrayList<>();
for (String card : cards) {
if (card.length() == 2) {
values.add(card.substring(0, 1));
suits.add(card.substring(1));
} else {
values.add(card.substring(0, 2));
suits.add(card.substring(2));
}
}

for (int i = 0; i < values.size(); i++) {
switch (values.get(i)) {
case "J" -> values.set(i, "11");
case "Q" -> values.set(i, "12");
case "K" -> values.set(i, "13");
case "A" -> {
if (values.contains("2") && values.contains("3") && values.contains("4") && values.contains("5")) {
values.set(i, "1");
} else {
values.set(i, "14");
}
}
}
}

numericalValues = new ArrayList<>();
for (String value : values) {
numericalValues.add(Integer.valueOf(value));
}
Collections.sort(numericalValues);

for (String s : hands) {
scoredHands.add(new Hand(s));
List<Integer> possibleValues = new ArrayList<>();
counts = new ArrayList<>();
for (int i = 1; i <= 14; i++) {
counts.add(i - 1, countOccurrences(i));
possibleValues.add(i);
}
Optional<Integer> maxScoreIfAny = scoredHands
.stream()
.map(Hand::getScore)
.max(Comparator.naturalOrder());
return maxScoreIfAny
.map(maxScore -> scoredHands
.stream()
.filter(h -> h.getScore() == maxScore)
.map(Hand::getInput)
.collect(Collectors.toList()))
.orElseGet(Collections::emptyList);

boolean isStraight = Collections.indexOfSubList(possibleValues, numericalValues) != -1;

boolean isFlush = suits.stream().distinct().count() == 1;

if (isStraight & isFlush) {
return 8; // straight flush
} else if (counts.contains(4)) {
return 7; // four of a kind
} else if (counts.contains(3) && counts.contains(2)) {
return 6; // full house
} else if (isFlush) {
return 5; // flush
} else if (isStraight) {
return 4; // straight
} else if (counts.contains(3)) {
return 3; // three of a kind
} else if (counts.stream().filter(value -> value == 2).count() == 2) {
return 2; // two pair
} else if (counts.contains(2)) {
return 1; // pair
} else {
return 0; // high card
}
}

public int countOccurrences(int valueToFind) {
return (int) numericalValues.stream().filter(value -> value.equals(valueToFind)).count();
}
}
52 changes: 48 additions & 4 deletions exercises/practice/poker/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# This is an auto-generated file. Regular comments will be removed when this
# file is regenerated. Regenerating will not touch any manually added keys,
# so comments can be added in a "comment" key.
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[161f485e-39c2-4012-84cf-bec0c755b66c]
description = "single hand always wins"
@@ -14,12 +21,18 @@ description = "a tie has multiple winners"
[61ed83a9-cfaa-40a5-942a-51f52f0a8725]
description = "multiple hands with the same high cards, tie compares next highest ranked, down to last card"

[da01becd-f5b0-4342-b7f3-1318191d0580]
description = "winning high card hand also has the lowest card"

[f7175a89-34ff-44de-b3d7-f6fd97d1fca4]
description = "one pair beats high card"

[e114fd41-a301-4111-a9e7-5a7f72a76561]
description = "highest pair wins"

[b3acd3a7-f9fa-4647-85ab-e0a9e07d1365]
description = "both hands have the same pair, high card wins"

[935bb4dc-a622-4400-97fa-86e7d06b1f76]
description = "two pairs beats one pair"

@@ -32,6 +45,12 @@ description = "both hands have two pairs, with the same highest ranked pair, tie
[15a7a315-0577-47a3-9981-d6cf8e6f387b]
description = "both hands have two identically ranked pairs, tie goes to remaining card (kicker)"

[f761e21b-2560-4774-a02a-b3e9366a51ce]
description = "both hands have two pairs that add to the same value, win goes to highest pair"

[fc6277ac-94ac-4078-8d39-9d441bc7a79e]
description = "two pairs first ranked by largest pair"

[21e9f1e6-2d72-49a1-a930-228e5e0195dc]
description = "three of a kind beats two pair"

@@ -40,6 +59,11 @@ description = "both hands have three of a kind, tie goes to highest ranked tripl

[eb856cc2-481c-4b0d-9835-4d75d07a5d9d]
description = "with multiple decks, two players can have same three of a kind, ties go to highest remaining cards"
include = false

[26a4a7d4-34a2-4f18-90b4-4a8dd35d2bb1]
description = "with multiple decks, two players can have same three of a kind, ties go to highest remaining cards"
reimplements = "eb856cc2-481c-4b0d-9835-4d75d07a5d9d"

[a858c5d9-2f28-48e7-9980-b7fa04060a60]
description = "a straight beats three of a kind"
@@ -50,6 +74,9 @@ description = "aces can end a straight (10 J Q K A)"
[76856b0d-35cd-49ce-a492-fe5db53abc02]
description = "aces can start a straight (A 2 3 4 5)"

[e214b7df-dcba-45d3-a2e5-342d8c46c286]
description = "aces cannot be in the middle of a straight (Q K A 2 3)"

[6980c612-bbff-4914-b17a-b044e4e69ea1]
description = "both hands with a straight, tie goes to highest ranked card"

@@ -61,6 +88,11 @@ description = "flush beats a straight"

[4d90261d-251c-49bd-a468-896bf10133de]
description = "both hands have a flush, tie goes to high card, down to the last one if necessary"
include = false

[e04137c5-c19a-4dfc-97a1-9dfe9baaa2ff]
description = "both hands have a flush, tie goes to high card, down to the last one if necessary"
reimplements = "4d90261d-251c-49bd-a468-896bf10133de"

[3a19361d-8974-455c-82e5-f7152f5dba7c]
description = "full house beats a flush"
@@ -83,5 +115,17 @@ description = "with multiple decks, both hands with identical four of a kind, ti
[923bd910-dc7b-4f7d-a330-8b42ec10a3ac]
description = "straight flush beats four of a kind"

[d9629e22-c943-460b-a951-2134d1b43346]
description = "aces can end a straight flush (10 J Q K A)"

[05d5ede9-64a5-4678-b8ae-cf4c595dc824]
description = "aces can start a straight flush (A 2 3 4 5)"

[ad655466-6d04-49e8-a50c-0043c3ac18ff]
description = "aces cannot be in the middle of a straight flush (Q K A 2 3)"

[d0927f70-5aec-43db-aed8-1cbd1b6ee9ad]
description = "both hands have straight flush, tie goes to highest-ranked card"
description = "both hands have a straight flush, tie goes to highest-ranked card"

[be620e09-0397-497b-ac37-d1d7a4464cfc]
description = "even though an ace is usually high, a 5-high straight flush is the lowest-scoring straight flush"
93 changes: 87 additions & 6 deletions exercises/practice/poker/src/test/java/PokerTest.java
Original file line number Diff line number Diff line change
@@ -44,6 +44,15 @@ public void sameHighCards() {
.containsExactly(nextHighest3);
}

@Disabled("Remove to run test")
@Test
public void winningWithLowestCard() {
String lowest2 = "2S 5H 6S 8D 7H";
String lowest3 = "3S 4D 6D 8C 7S";
assertThat(new Poker(Arrays.asList(lowest2, lowest3)).getBestHands())
.containsExactly(lowest2);
}

@Disabled("Remove to run test")
@Test
public void nothingVsOnePair() {
@@ -62,6 +71,15 @@ public void twoPairs() {
.containsExactly(pairOf4);
}

@Disabled("Remove to run test")
@Test
public void samePair() {
String pairOf4Lower = "4H 4S AH JC 3D";
String pairOf4Higher = "4C 4D AS 5D 6C";
assertThat(new Poker(Arrays.asList(pairOf4Lower, pairOf4Higher)).getBestHands())
.containsExactly(pairOf4Lower);
}

@Disabled("Remove to run test")
@Test
public void onePairVsDoublePair() {
@@ -98,6 +116,24 @@ public void identicallyRankedPairs() {
.containsExactly(kicker8);
}

@Disabled("Remove to run test")
@Test
public void twoPairsAddingToSameValue() {
String doublePair6And3 = "6S 6H 3S 3H AS";
String doublePair7And2 = "7H 7S 2H 2S AC";
assertThat(new Poker(Arrays.asList(doublePair6And3, doublePair7And2)).getBestHands())
.containsExactly(doublePair7And2);
}

@Disabled("Remove to run test")
@Test
public void rankedByLargestPair() {
String doublePairs5And4 = "5C 2S 5S 4H 4C";
String doublePairs6And2 = "6S 2S 6H 7C 2C";
assertThat(new Poker(Arrays.asList(doublePairs5And4, doublePairs6And2)).getBestHands())
.containsExactly(doublePairs6And2);
}

@Disabled("Remove to run test")
@Test
public void doublePairVsThree() {
@@ -119,7 +155,7 @@ public void twoThrees() {
@Disabled("Remove to run test")
@Test
public void sameThreesMultipleDecks() {
String remainingCard7 = "4S AH AS 7C AD";
String remainingCard7 = "5S AH AS 7C AD";
String remainingCard8 = "4S AH AS 8C AD";
assertThat(new Poker(Arrays.asList(remainingCard7, remainingCard8)).getBestHands())
.containsExactly(remainingCard8);
@@ -152,6 +188,15 @@ public void acesCanStartAStraight() {
.containsExactly(straightStartA);
}

@Disabled("Remove to run test")
@Test
public void acesCannotBeInMiddleOfStraight() {
String hand = "2C 3D 7H 5H 2S";
String straightMiddleA = "QS KH AC 2D 3S";
assertThat(new Poker(Arrays.asList(hand, straightMiddleA)).getBestHands())
.containsExactly(hand);
}

@Disabled("Remove to run test")
@Test
public void twoStraights() {
@@ -181,11 +226,11 @@ public void straightVsFlush() {

@Disabled("Remove to run test")
@Test
public void twoFlushes() {
String flushTo8 = "4H 7H 8H 9H 6H";
String flushTo7 = "2S 4S 5S 6S 7S";
assertThat(new Poker(Arrays.asList(flushTo8, flushTo7)).getBestHands())
.containsExactly(flushTo8);
public void twoFlushs() {
String flushTo9 = "2H 7H 8H 9H 6H";
String flushTo7 = "3S 5S 6S 7S 8S";
assertThat(new Poker(Arrays.asList(flushTo9, flushTo7)).getBestHands())
.containsExactly(flushTo9);
}

@Disabled("Remove to run test")
@@ -251,6 +296,33 @@ public void squareVsStraightFlush() {
.containsExactly(straightFlushTo9);
}

@Disabled("Remove to run test")
@Test
public void acesEndingStraightFlush() {
String hand = "KC AH AS AD AC";
String straightFlushEndingWithA = "10C JC QC KC AC";
assertThat(new Poker(Arrays.asList(hand, straightFlushEndingWithA)).getBestHands())
.containsExactly(straightFlushEndingWithA);
}

@Disabled("Remove to run test")
@Test
public void acesStartingStraightFlush() {
String straightFlushStartingWithA = "4H AH 3H 2H 5H";
String hand = "KS AH AS AD AC";
assertThat(new Poker(Arrays.asList(straightFlushStartingWithA, hand)).getBestHands())
.containsExactly(straightFlushStartingWithA);
}

@Disabled("Remove to run test")
@Test
public void acesCannotBeInMiddleOfStraightFlush() {
String straightFlushWithAInMiddle = "QH KH AH 2H 3H";
String hand = "2C AC QC 10C KC";
assertThat(new Poker(Arrays.asList(straightFlushWithAInMiddle, hand)).getBestHands())
.containsExactly(hand);
}

@Disabled("Remove to run test")
@Test
public void twoStraightFlushes() {
@@ -259,4 +331,13 @@ public void twoStraightFlushes() {
assertThat(new Poker(Arrays.asList(straightFlushTo8, straightFlushTo9)).getBestHands())
.containsExactly(straightFlushTo9);
}

@Disabled("Remove to run test")
@Test
public void straightFlushTo5IsTheLowestScoring() {
String straightFlushTo6 = "2H 3H 4H 5H 6H";
String straightFlushTo5 = "4D AD 3D 2D 5D";
assertThat(new Poker(Arrays.asList(straightFlushTo6, straightFlushTo5)).getBestHands())
.containsExactly(straightFlushTo6);
}
}

0 comments on commit 1802823

Please sign in to comment.