From f77b9923af6f16ebf3ff175eaa1791afde03f07b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jan 2026 14:33:13 +0530 Subject: [PATCH 01/13] Bump actions/checkout from 6.0.0 to 6.0.1 (#3072) Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.0 to 6.0.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/1af3b93b6815bc44a9784bd300feb67ff0d1eeb3...8e8c483db84b4bee98b60c0593521ed34d9990e8) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-deprecated-exercises.yml | 2 +- .github/workflows/java.yml | 8 ++++---- .github/workflows/markdown.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/check-deprecated-exercises.yml b/.github/workflows/check-deprecated-exercises.yml index 08e2bf0d4..0f011b79e 100644 --- a/.github/workflows/check-deprecated-exercises.yml +++ b/.github/workflows/check-deprecated-exercises.yml @@ -14,7 +14,7 @@ jobs: name: Check for deprecated exercises runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 with: fetch-depth: 0 - name: Test deprecated exercises using test-deprecated-exercises diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index 6740f95e9..0372772c5 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -15,7 +15,7 @@ jobs: name: Check if tests compile cleanly with starter sources runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Set up JDK 1.17 uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 with: @@ -29,7 +29,7 @@ jobs: name: Lint Java files using Checkstyle runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Set up JDK 1.17 uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 with: @@ -44,7 +44,7 @@ jobs: if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Test all exercises using java-test-runner run: bin/test-with-test-runner - name: Print summary @@ -71,7 +71,7 @@ jobs: if: github.event_name == 'pull_request' runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 with: fetch-depth: 0 - name: Test changed exercises using java-test-runner diff --git a/.github/workflows/markdown.yml b/.github/workflows/markdown.yml index 0e96910d9..45dde9ea5 100644 --- a/.github/workflows/markdown.yml +++ b/.github/workflows/markdown.yml @@ -17,6 +17,6 @@ jobs: name: Lint Markdown files runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Lint markdown uses: DavidAnson/markdownlint-cli2-action@30a0e04f1870d58f8d717450cc6134995f993c63 From 1d8fe97665ac4eae4dba3501c8278be4856a63f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jan 2026 14:33:38 +0530 Subject: [PATCH 02/13] Bump actions/upload-artifact from 5.0.0 to 6.0.0 (#3073) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5.0.0 to 6.0.0. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/330a01c490aca151604b8cf639adc76d48f6c5d4...b7c566a772e6b6bfb58ed0dc250532a479d7789f) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/java.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index 0372772c5..6dc57d7a0 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -60,7 +60,7 @@ jobs: fi if: always() - name: Archive test results - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f with: name: test-results path: exercises/**/build/results.json @@ -89,7 +89,7 @@ jobs: fi if: always() - name: Archive test results - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f with: name: test-results path: | From e144805f36be05747b27296f20a1fa8e51a49847 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jan 2026 14:35:49 +0530 Subject: [PATCH 03/13] Bump DavidAnson/markdownlint-cli2-action from 21.0.0 to 22.0.0 (#3070) Bumps [DavidAnson/markdownlint-cli2-action](https://github.com/davidanson/markdownlint-cli2-action) from 21.0.0 to 22.0.0. - [Release notes](https://github.com/davidanson/markdownlint-cli2-action/releases) - [Commits](https://github.com/davidanson/markdownlint-cli2-action/compare/30a0e04f1870d58f8d717450cc6134995f993c63...07035fd053f7be764496c0f8d8f9f41f98305101) --- updated-dependencies: - dependency-name: DavidAnson/markdownlint-cli2-action dependency-version: 22.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/markdown.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/markdown.yml b/.github/workflows/markdown.yml index 45dde9ea5..8339bd4db 100644 --- a/.github/workflows/markdown.yml +++ b/.github/workflows/markdown.yml @@ -19,4 +19,4 @@ jobs: steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Lint markdown - uses: DavidAnson/markdownlint-cli2-action@30a0e04f1870d58f8d717450cc6134995f993c63 + uses: DavidAnson/markdownlint-cli2-action@07035fd053f7be764496c0f8d8f9f41f98305101 From 22105a1c63f31f627185b4ea6d312de56188ae0f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Jan 2026 23:53:07 +0530 Subject: [PATCH 04/13] Bump actions/setup-java from 5.0.0 to 5.1.0 (#3071) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/dded0888837ed1f317902acf8a20df0ad188d165...f2beeb24e141e01a676f977032f5a29d81c9e27e) --- updated-dependencies: - dependency-name: actions/setup-java dependency-version: 5.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jagdish Prajapati --- .github/workflows/java.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index 6dc57d7a0..598a68e40 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Set up JDK 1.17 - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 + uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e with: java-version: 17 distribution: "temurin" @@ -31,7 +31,7 @@ jobs: steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Set up JDK 1.17 - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 + uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e with: java-version: 17 distribution: "temurin" From 184c18cbb6af236259fbc068d400a35e819076ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Mon, 5 Jan 2026 17:46:44 -0800 Subject: [PATCH 05/13] Remove erroneous references to an input map (#3074) --- .../international-calling-connoisseur/.docs/instructions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/concept/international-calling-connoisseur/.docs/instructions.md b/exercises/concept/international-calling-connoisseur/.docs/instructions.md index e8f728f0f..106844176 100644 --- a/exercises/concept/international-calling-connoisseur/.docs/instructions.md +++ b/exercises/concept/international-calling-connoisseur/.docs/instructions.md @@ -31,7 +31,7 @@ dialingCodes.setDialingCode(679, "Fiji"); ## 3. Lookup a dialing code's country -Implement the `getCountry` method that takes a map of dialing codes and a dialing code and returns the country name with the dialing code. +Implement the `getCountry` method that takes a dialing code and returns the country name with the dialing code. ```java DialingCodes dialingCodes = new DialingCodes(); @@ -63,7 +63,7 @@ dialingCodes.addNewDialingCode(39, "Vatican City"); Its rare, but mistakes can be made. To correct the mistake, we will need to know what dialing code the country is currently mapped to. -To find which dialing code needs to be corrected, implement the `findDialingCode` method that takes in a map of dialing codes and a country and returns the country's dialing code. +To find which dialing code needs to be corrected, implement the `findDialingCode` method that takes a country and returns the country's dialing code. Return `null` if the country is _not_ in the map. ```java From 36e31a6d1f9c778f4019c31c8acf0f1926e41e9e Mon Sep 17 00:00:00 2001 From: Kacper Olszewski <78431595+Baboushka@users.noreply.github.com> Date: Fri, 9 Jan 2026 01:36:13 +0100 Subject: [PATCH 06/13] Add baffling birthdays exercice (#3075) --- config.json | 14 + .../baffling-birthdays/.docs/instructions.md | 23 ++ .../baffling-birthdays/.docs/introduction.md | 25 ++ .../baffling-birthdays/.meta/config.json | 22 ++ .../src/reference/java/BafflingBirthdays.java | 50 ++++ .../baffling-birthdays/.meta/tests.toml | 61 +++++ .../practice/baffling-birthdays/build.gradle | 25 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45633 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + exercises/practice/baffling-birthdays/gradlew | 248 ++++++++++++++++++ .../practice/baffling-birthdays/gradlew.bat | 93 +++++++ .../src/main/java/BafflingBirthdays.java | 15 ++ .../src/test/java/BafflingBirthdaysTest.java | 160 +++++++++++ exercises/settings.gradle | 1 + 14 files changed, 743 insertions(+) create mode 100644 exercises/practice/baffling-birthdays/.docs/instructions.md create mode 100644 exercises/practice/baffling-birthdays/.docs/introduction.md create mode 100644 exercises/practice/baffling-birthdays/.meta/config.json create mode 100644 exercises/practice/baffling-birthdays/.meta/src/reference/java/BafflingBirthdays.java create mode 100644 exercises/practice/baffling-birthdays/.meta/tests.toml create mode 100644 exercises/practice/baffling-birthdays/build.gradle create mode 100644 exercises/practice/baffling-birthdays/gradle/wrapper/gradle-wrapper.jar create mode 100644 exercises/practice/baffling-birthdays/gradle/wrapper/gradle-wrapper.properties create mode 100644 exercises/practice/baffling-birthdays/gradlew create mode 100644 exercises/practice/baffling-birthdays/gradlew.bat create mode 100644 exercises/practice/baffling-birthdays/src/main/java/BafflingBirthdays.java create mode 100644 exercises/practice/baffling-birthdays/src/test/java/BafflingBirthdaysTest.java diff --git a/config.json b/config.json index 484d807d0..92dfd05b1 100644 --- a/config.json +++ b/config.json @@ -1211,6 +1211,20 @@ ], "difficulty": 6 }, + { + "slug": "baffling-birthdays", + "name": "Baffling Birthdays", + "uuid": "b534049a-5920-4906-9091-0fa6d81a3636", + "practices": [], + "prerequisites": [ + "for-loops", + "lists", + "sets", + "randomness", + "datetime" + ], + "difficulty": 6 + }, { "slug": "bank-account", "name": "Bank Account", diff --git a/exercises/practice/baffling-birthdays/.docs/instructions.md b/exercises/practice/baffling-birthdays/.docs/instructions.md new file mode 100644 index 000000000..a01ec8679 --- /dev/null +++ b/exercises/practice/baffling-birthdays/.docs/instructions.md @@ -0,0 +1,23 @@ +# Instructions + +Your task is to estimate the birthday paradox's probabilities. + +To do this, you need to: + +- Generate random birthdates. +- Check if a collection of randomly generated birthdates contains at least two with the same birthday. +- Estimate the probability that at least two people in a group share the same birthday for different group sizes. + +~~~~exercism/note +A birthdate includes the full date of birth (year, month, and day), whereas a birthday refers only to the month and day, which repeat each year. +Two birthdates with the same month and day correspond to the same birthday. +~~~~ + +~~~~exercism/caution +The birthday paradox assumes that: + +- There are 365 possible birthdays (no leap years). +- Each birthday is equally likely (uniform distribution). + +Your implementation must follow these assumptions. +~~~~ diff --git a/exercises/practice/baffling-birthdays/.docs/introduction.md b/exercises/practice/baffling-birthdays/.docs/introduction.md new file mode 100644 index 000000000..97dabd1e6 --- /dev/null +++ b/exercises/practice/baffling-birthdays/.docs/introduction.md @@ -0,0 +1,25 @@ +# Introduction + +Fresh out of college, you're throwing a huge party to celebrate with friends and family. +Over 70 people have shown up, including your mildly eccentric Uncle Ted. + +In one of his usual antics, he bets you £100 that at least two people in the room share the same birthday. +That sounds ridiculous — there are many more possible birthdays than there are guests, so you confidently accept. + +To your astonishment, after collecting the birthdays of just 32 guests, you've already found two guests that share the same birthday. +Accepting your loss, you hand Uncle Ted his £100, but something feels off. + +The next day, curiosity gets the better of you. +A quick web search leads you to the [birthday paradox][birthday-problem], which reveals that with just 23 people, the probability of a shared birthday exceeds 50%. + +Ah. So _that's_ why Uncle Ted was so confident. + +Determined to turn the tables, you start looking up other paradoxes; next time, _you'll_ be the one making the bets. + +~~~~exercism/note +The birthday paradox is a [veridical paradox][veridical-paradox]: even though it feels wrong, it is actually true. + +[veridical-paradox]: https://en.wikipedia.org/wiki/Paradox#Quine's_classification +~~~~ + +[birthday-problem]: https://en.wikipedia.org/wiki/Birthday_problem diff --git a/exercises/practice/baffling-birthdays/.meta/config.json b/exercises/practice/baffling-birthdays/.meta/config.json new file mode 100644 index 000000000..6e401cb62 --- /dev/null +++ b/exercises/practice/baffling-birthdays/.meta/config.json @@ -0,0 +1,22 @@ +{ + "authors": [ + "Baboushka" + ], + "files": { + "solution": [ + "src/main/java/BafflingBirthdays.java" + ], + "test": [ + "src/test/java/BafflingBirthdaysTest.java" + ], + "example": [ + ".meta/src/reference/java/BafflingBirthdays.java" + ], + "invalidator": [ + "build.gradle" + ] + }, + "blurb": "Estimate the birthday paradox's probabilities.", + "source": "Erik Schierboom", + "source_url": "https://github.com/exercism/problem-specifications/pull/2539" +} diff --git a/exercises/practice/baffling-birthdays/.meta/src/reference/java/BafflingBirthdays.java b/exercises/practice/baffling-birthdays/.meta/src/reference/java/BafflingBirthdays.java new file mode 100644 index 000000000..03cf1ae9a --- /dev/null +++ b/exercises/practice/baffling-birthdays/.meta/src/reference/java/BafflingBirthdays.java @@ -0,0 +1,50 @@ +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.concurrent.ThreadLocalRandom; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +class BafflingBirthdays { + private static final int nonLeapYear = 2001; + private static final int daysInYear = 365; + + boolean sharedBirthday(List birthdates) { + Set seen = new HashSet<>(); + for (String birthdate : birthdates) { + String monthDay = birthdate.substring(5); + if (!seen.add(monthDay)) { + return true; + } + } + return false; + } + + List randomBirthdates(int groupSize) { + if (groupSize <= 0) { + return List.of(); + } + List birthdates = new ArrayList<>(groupSize); + ThreadLocalRandom random = ThreadLocalRandom.current(); + for (int i = 0; i < groupSize; i++) { + int dayOfYear = random.nextInt(1, daysInYear + 1); + LocalDate date = LocalDate.ofYearDay(nonLeapYear, dayOfYear); + birthdates.add(date.toString()); + } + return birthdates; + } + + double estimatedProbabilityOfSharedBirthday(int groupSize) { + if (groupSize <= 1) { + return 0.0; + } + if (groupSize > daysInYear) { + return 100.0; + } + double probabilityNoSharedBirthday = 1.0; + for (int k = 0; k < groupSize; k++) { + probabilityNoSharedBirthday *= (daysInYear - k) / (double) daysInYear; + } + return (1 - probabilityNoSharedBirthday) * 100.0; + } +} diff --git a/exercises/practice/baffling-birthdays/.meta/tests.toml b/exercises/practice/baffling-birthdays/.meta/tests.toml new file mode 100644 index 000000000..c76afb466 --- /dev/null +++ b/exercises/practice/baffling-birthdays/.meta/tests.toml @@ -0,0 +1,61 @@ +# 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. + +[716dcc2b-8fe4-4fc9-8c48-cbe70d8e6b67] +description = "shared birthday -> one birthdate" + +[f7b3eb26-bcfc-4c1e-a2de-af07afc33f45] +description = "shared birthday -> two birthdates with same year, month, and day" + +[7193409a-6e16-4bcb-b4cc-9ffe55f79b25] +description = "shared birthday -> two birthdates with same year and month, but different day" + +[d04db648-121b-4b72-93e8-d7d2dced4495] +description = "shared birthday -> two birthdates with same month and day, but different year" + +[3c8bd0f0-14c6-4d4c-975a-4c636bfdc233] +description = "shared birthday -> two birthdates with same year, but different month and day" + +[df5daba6-0879-4480-883c-e855c99cdaa3] +description = "shared birthday -> two birthdates with different year, month, and day" + +[0c17b220-cbb9-4bd7-872f-373044c7b406] +description = "shared birthday -> multiple birthdates without shared birthday" + +[966d6b0b-5c0a-4b8c-bc2d-64939ada49f8] +description = "shared birthday -> multiple birthdates with one shared birthday" + +[b7937d28-403b-4500-acce-4d9fe3a9620d] +description = "shared birthday -> multiple birthdates with more than one shared birthday" + +[70b38cea-d234-4697-b146-7d130cd4ee12] +description = "random birthdates -> generate requested number of birthdates" + +[d9d5b7d3-5fea-4752-b9c1-3fcd176d1b03] +description = "random birthdates -> years are not leap years" + +[d1074327-f68c-4c8a-b0ff-e3730d0f0521] +description = "random birthdates -> months are random" + +[7df706b3-c3f5-471d-9563-23a4d0577940] +description = "random birthdates -> days are random" + +[89a462a4-4265-4912-9506-fb027913f221] +description = "estimated probability of at least one shared birthday -> for one person" + +[ec31c787-0ebb-4548-970c-5dcb4eadfb5f] +description = "estimated probability of at least one shared birthday -> among ten people" + +[b548afac-a451-46a3-9bb0-cb1f60c48e2f] +description = "estimated probability of at least one shared birthday -> among twenty-three people" + +[e43e6b9d-d77b-4f6c-a960-0fc0129a0bc5] +description = "estimated probability of at least one shared birthday -> among seventy people" diff --git a/exercises/practice/baffling-birthdays/build.gradle b/exercises/practice/baffling-birthdays/build.gradle new file mode 100644 index 000000000..d28f35dee --- /dev/null +++ b/exercises/practice/baffling-birthdays/build.gradle @@ -0,0 +1,25 @@ +plugins { + id "java" +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform("org.junit:junit-bom:5.10.0") + testImplementation "org.junit.jupiter:junit-jupiter" + testImplementation "org.assertj:assertj-core:3.25.1" + + testRuntimeOnly "org.junit.platform:junit-platform-launcher" +} + +test { + useJUnitPlatform() + + testLogging { + exceptionFormat = "full" + showStandardStreams = true + events = ["passed", "failed", "skipped"] + } +} diff --git a/exercises/practice/baffling-birthdays/gradle/wrapper/gradle-wrapper.jar b/exercises/practice/baffling-birthdays/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f8e1ee3125fe0768e9a76ee977ac089eb657005e GIT binary patch literal 45633 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�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 literal 0 HcmV?d00001 diff --git a/exercises/practice/baffling-birthdays/gradle/wrapper/gradle-wrapper.properties b/exercises/practice/baffling-birthdays/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..4d97ea344 --- /dev/null +++ b/exercises/practice/baffling-birthdays/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/exercises/practice/baffling-birthdays/gradlew b/exercises/practice/baffling-birthdays/gradlew new file mode 100644 index 000000000..adff685a0 --- /dev/null +++ b/exercises/practice/baffling-birthdays/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/exercises/practice/baffling-birthdays/gradlew.bat b/exercises/practice/baffling-birthdays/gradlew.bat new file mode 100644 index 000000000..c4bdd3ab8 --- /dev/null +++ b/exercises/practice/baffling-birthdays/gradlew.bat @@ -0,0 +1,93 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/exercises/practice/baffling-birthdays/src/main/java/BafflingBirthdays.java b/exercises/practice/baffling-birthdays/src/main/java/BafflingBirthdays.java new file mode 100644 index 000000000..273c6506c --- /dev/null +++ b/exercises/practice/baffling-birthdays/src/main/java/BafflingBirthdays.java @@ -0,0 +1,15 @@ +import java.util.List; + +class BafflingBirthdays { + boolean sharedBirthday(List birthdates) { + throw new UnsupportedOperationException("Delete this statement and write your own implementation."); + } + + List randomBirthdates(int groupSize) { + throw new UnsupportedOperationException("Delete this statement and write your own implementation."); + } + + double estimatedProbabilityOfSharedBirthday(int groupSize) { + throw new UnsupportedOperationException("Delete this statement and write your own implementation."); + } +} \ No newline at end of file diff --git a/exercises/practice/baffling-birthdays/src/test/java/BafflingBirthdaysTest.java b/exercises/practice/baffling-birthdays/src/test/java/BafflingBirthdaysTest.java new file mode 100644 index 000000000..9c9497a92 --- /dev/null +++ b/exercises/practice/baffling-birthdays/src/test/java/BafflingBirthdaysTest.java @@ -0,0 +1,160 @@ +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.data.Offset.offset; + +import java.time.LocalDate; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class BafflingBirthdaysTest { + private BafflingBirthdays birthdays = new BafflingBirthdays(); + + @Test + @DisplayName("one birthdate") + public void oneBirthdateTest() { + assertThat(birthdays.sharedBirthday(List.of("2000-01-01"))).isFalse(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("two birthdates with same year, month, and day") + public void twoBirthdatesWithSameYearMonthAndDayTest() { + assertThat(birthdays.sharedBirthday(List.of("2000-01-01", "2000-01-01"))).isTrue(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("two birthdates with same year and month, but different day") + public void twoBirthdatesWithSameYearAndMonthButDifferentDayTest() { + assertThat(birthdays.sharedBirthday(List.of("2012-05-09", "2012-05-17"))).isFalse(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("two birthdates with same month and day, but different year") + public void twoBirthdatesWithSameMonthAndDayButDifferentYearTest() { + assertThat(birthdays.sharedBirthday(List.of("1999-10-23", "1988-10-23"))).isTrue(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("two birthdates with same year, but different month and day") + public void twoBirthdatesWithSameYearButDifferentMonthAndDayTest() { + assertThat(birthdays.sharedBirthday(List.of("2007-12-19", "2007-04-27"))).isFalse(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("two birthdates with different year, month, and day") + public void twoBirthdatesWithDifferentYearMonthAndDayTest() { + assertThat(birthdays.sharedBirthday(List.of("1997-08-04", "1963-11-23"))).isFalse(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("multiple birthdates without shared birthday") + public void multipleBirthdatesWithoutSharedBirthdayTest() { + assertThat(birthdays.sharedBirthday(List.of("1966-07-29", "1977-02-12", "2001-12-25", "1980-11-10"))).isFalse(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("multiple birthdates with one shared birthday") + public void multipleBirthdatesWithOneSharedBirthdayTest() { + assertThat(birthdays.sharedBirthday(List.of("1966-07-29", "1977-02-12", "2001-07-29", "1980-11-10"))).isTrue(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("multiple birthdates with more than one shared birthday") + public void multipleBirthdatesWithMoreThanOneSharedBirthdayTest() { + assertThat(birthdays.sharedBirthday(List.of( + "1966-07-29", + "1977-02-12", + "2001-12-25", + "1980-07-29", + "2019-02-12" + ))).isTrue(); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("generate requested number of birthdates") + public void generateRequestedNumberOfBirthdatesTest() { + int groupSize = 50; + assertThat(birthdays.randomBirthdates(groupSize).size()).isEqualTo(groupSize); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("years are not leap years") + public void yearsAreNotLeapYearsTest() { + for (String birthdate : birthdays.randomBirthdates(100)) { + LocalDate date = LocalDate.parse(birthdate); + assertThat(date.isLeapYear()).isFalse(); + assertThat(date.getMonthValue() == 2 && date.getDayOfMonth() == 29).isFalse(); + } + } + + @Disabled("Remove to run test") + @Test + @DisplayName("months are random") + public void monthsAreRandomTest() { + Set months = new HashSet<>(); + for (String birthdate : birthdays.randomBirthdates(500)) { + LocalDate date = LocalDate.parse(birthdate); + months.add(date.getMonthValue()); + if (months.size() >= 7) { + break; + } + } + assertThat(months).hasSizeGreaterThanOrEqualTo(7); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("days are random") + public void daysAreRandomTest() { + Set days = new HashSet<>(); + for (String birthdate : birthdays.randomBirthdates(500)) { + LocalDate date = LocalDate.parse(birthdate); + days.add(date.getDayOfMonth()); + if (days.size() >= 11) { + break; + } + } + assertThat(days).hasSizeGreaterThanOrEqualTo(11); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("estimated probability of at least one shared birthday case for one person") + public void estimatedProbabilityOfAtLeastOneSharedBirthdayForOnePersonTest() { + assertThat(birthdays.estimatedProbabilityOfSharedBirthday(1)).isEqualTo(0.0); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("estimated probability of at least one shared birthday case among ten people") + public void estimatedProbabilityOfAtLeastOneSharedBirthdayAmongTenPeopleTest() { + assertThat(birthdays.estimatedProbabilityOfSharedBirthday(10)).isCloseTo(11.694818, offset(1.0)); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("estimated probability of at least one shared birthday case among twenty-three people") + public void estimatedProbabilityOfAtLeastOneSharedBirthdayAmongTwentyThreePeopleTest() { + assertThat(birthdays.estimatedProbabilityOfSharedBirthday(23)).isCloseTo(50.729723, offset(1.0)); + } + + @Disabled("Remove to run test") + @Test + @DisplayName("estimated probability of at least one shared birthday case among seventy people") + public void estimatedProbabilityOfAtLeastOneSharedBirthdayAmongSeventyPeopleTest() { + assertThat(birthdays.estimatedProbabilityOfSharedBirthday(70)).isCloseTo(99.915958, offset(1.0)); + } +} diff --git a/exercises/settings.gradle b/exercises/settings.gradle index 1119f4b98..6bf710357 100644 --- a/exercises/settings.gradle +++ b/exercises/settings.gradle @@ -40,6 +40,7 @@ include 'practice:bank-account' // include 'practice:binary' // deprecated include 'practice:binary-search' include 'practice:binary-search-tree' +include 'practice:baffling-birthdays' include 'practice:bob' include 'practice:book-store' include 'practice:bottle-song' From 9a9ff665f7513402e51eed9817020f1bb472f9fd Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Sat, 10 Jan 2026 14:18:07 +0530 Subject: [PATCH 07/13] Update to gradle 9.2.1 in exercise template (#3076) --- .../gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 45633 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- resources/exercise-template/gradlew | 15 +++++------ resources/exercise-template/gradlew.bat | 25 +++++++++--------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/resources/exercise-template/gradle/wrapper/gradle-wrapper.jar b/resources/exercise-template/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch delta 37512 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 CtuMp? delta 35365 zcmXV%RahKd)2V|9ebMmXT>1MV66n;`d~O3dlH`|#m|@P~xDM4|*b zG!d{2EGv3;V^dX={wHP<7nRj>l~bcCa;a%mMMe+BhFK1-5vCD)jDDd|hi&PrE!an; z9R?acSlG?UzrKE5;19p>&)7Yd?JY*I3=rBRQf^pNWH%1k8rrz>r_v&9lgY11P{Myw zREve~A?@=ea$Q}kr2h2Ht{4s%n3)IY>SlsVA}~CCZ&rI4qR7ZA#W*S%6s$synpFGk zr#`QU`>+8~;%Np@!1k~vQ)w1ODIO&#Y)5AL1EUdhh73{B)M-t9MXKqpyXsccI4v=l zwM7j!V|n;-`g2#O@vSS5XNxSndF>SH2R%!u{b!viqba7; zDN>do;sA9P8I`ghh{WHbFmpXuyaT%yNhPzaQBF4hJGKNvFD!E2`MlgGNx(!6P}hlbNU&RwTuZ1bk$!m&z|vfnh28eGO4e*=EHnklPL4 zDRgBgKs|%H(!hGrp@}F2QzYxO0i(aEh(3r}FQdMr4^1lKrYP+xE#5v%@BI7&5LABB zX{SPw|fdrT+;s@HUpIe$dOKh9e1DHk5B@dz#) zTs-3$XZvGp+h;vCedWgajX~JL0I|JrwJWUuxf&<{fk&-j3C3oX z^`qf$gunc=W?uG{`$49|u24%gN!g zGHQ zJ2%G5uKoVkP6&}Ao2VJ1xRU|~EU9_Uvei4$%recFNnCwjwr0wdit%*CMaL@_jq{ob z!mgx1!cb8~nN`~%0bBxje71Wqeo$|zuGCZj|KUs}D?sSJ5Kq`Bb^HN>_XGHRJBiG% zeKdSB#gaLIK4S$i3^L-_3Q7LLOK1Q787kIYKZNEnayY|iHzYl|fYbqi=KcNLvI@5t z?5Vu7pWKL*Z3B4Sl~G)rAz2_z$H~${eD)ftqUhg_b&WuX}qbeLwNjb~Ov!!zV_KR&dENP9C!-=a?!rZrgEK zq7I`CZjH6X76^N2GBF%~r+snP*!rq!Jna;A?&a65 zVOuF{X~ctP1@^8W=;v?iTZfN-Xk(^mWNUoJfu0JF=T3;VjbOZV8WFyULrw#y?|Sgv zS{tKN2-7vEAooAc0`k8N+T&y1v$*nb(Yn4WaYOsIet+%$JxkRxcHBu?$kl?6AD%cT z)!$B}B)5WE)u%_{%HHo@Y#|hCl@m#F$JU?U9OwAc2wbDOIhNst$!BzgNWAC+mD}9X zH%r!ZK|04)}qAr1l4$NDUQTFiGE*Kt$6GP6`ty@>s$M3S4$d{6-?9_jK{ zD?a*%Gs;!%I?$SlAu^JJ(HA9L3t)`g8T<=M7H@y;_jl-Kz96@ILI8!z`J4zr;8MA0 z97#SQ*wXhj=#TuE)XxdUo6Y6~`!;jL)t+Z9yeRBwHrF>jcti`}GXZZHXa1s`Gdgky zIj->jK*%afbMK?Of%&n=OlU37ysuBh)uqEG5=wFa;+|>bt^nu~SHCZpd31PdMnPh7 z9E|M|zwLGhSa!T?rdJ$(QKZaHW(}qXFwSy-uZ|<(_uA6cu`l%WIp8EL{iN?!jI#84 zc?!VthX0bm$ z3d+!wdh&W$UWn7ghzWecE;uQW?l>}iQndz#GdN9=7;~JO9UHXA+;e1o`h(SV-`a&B zWqdXgvXo)&f8=wq7LWP9$sCJ|(Ph+z+_}wO_+m?Ex<;x9m^8M3Bhpyh2s$wM@A5?K zvf?qoe)ypG`G3t;8wF)Tb_pdoOT)??+YHxFe)``~3(gvCg_T2!vWG9{izneeDFDZ!11!(Nb)x!Rsac8t(M+#a!KSM^ zuf0&9t>;c5eJxx6j^^pga?{6*Lz5TfhTbcvZZBu@7h}_^NvKPXEH8jVtDWTW>urmse3b)z=>2x- z2p9PYzuVL%@Q@`{$~VVgc{F#n6*)dGWFv(yBd6q$=6;} zmK#&o{llWE=E6rMx&jKr%PL*5M-$$`lmx_IoMG2_KNSkBNBNQ~N<%Wt$7My`iTV!k z$UNx*L&D%GvF?*LN2`i(;OBs&A;C|a&~<)wi{i8$!G+7=Shn&GX!u}OW0m*J4@KQT zSil%lNgI6)Awdh}8ezY$mWWA9e{5c!$_B|#x_0Z>(Qo7XmfzXL=$l`0n7-l>w6;2g z<_$K56Ph`x4zS@vm|W4O8C?jvFafOX2sXIpPfB1~!Ujxdz~ZwQpPq@hT7--SjF|;b z-T^`)N(nAnK)jm44+f*4@QC=4+PoP@8oUvnfVwXd*XU`#Aq_k*qJ z#M$6M7Y-@nS2CtuMPoLmq1z^&aP@(>Q|;%~14;;SSm*W$2U5xDin2u8c#YS6rzlQA z$C`%Tn7NitCGawN9gbK0FM&Ru(nc;4lW@uvE~|)vgE7@GkH4>*2jQg>5fvg+4fGhh zD?}K%tA}OI+?GCvFqbRgnmcFcVGOBv_Xcc=Uh*lNpd8+TRymyMT7ON=!jUU<^_tAd z;kJ@f)b$O-5Uct~&3YWsxM6%FbdU8M#!~`^byTbXSx`oT0oaj7+VmzNQlfZeabfLGS~Y{|*jZKq0N$vXkAoWX@;>Bg*YzC4@? z3RHEzhL|l`9Y3qFt*Vx>9+~YG2P*nTApAOSQ60sxkM(`p4%d;L?3pE-@Sl#NT5}00 z)s%HV_SNI@BWYn$nB3_agqzX6Y72tHy0K!JbA@rTMNf3Kex?2BNEAhnrgZN3sau&3 zwhfmhv(ugN{5^ua8Dpwe4sFfK-JXS>FcBMD))XQ*J;CEhf$dHKi z@gOHX#UR&r1D*k9xT2-?dFGr?se7q@$GV6_EYi~@E6@)kO--}2iP)|zi$o2Tfel*wUsbDeW3{@#vO&)JoLWHtfEV7 zC6_hy@=iB}Xd9Iq*Ep<^m{x2{Dx=ez9Dx?^iSSnT76ppwz4Af?1m*2Nz^Dp1>GnDf zp`Eo8JC5PF&AOeOb{{%fafaPxe$GQM&*3$a8XmXTeJ=QAFD`(I1i`l+0uPd;a*&V3 z{=q_mI^QlW1qOv6RA7TQ;}q_GZddyeeDjPj(gN#js3`x``5C~9!@GA2?BxMX?>ejo z6pA#aE%26cZ(a%NySFu-R?%FXTYF}ROp`*)OuEyd+Tkyn`G)ZnBr%qXARJX197hs7 z;GoYFp5F_?UkpUW#ma#Muq17(-0ik({0}{hX`i))_pdM8opja4#Xsp=i+9MG2ILoj z625KQW4#VF#PjnBMbe{%R%f1~5_I;)OcS0FTwlxl(4Vw)0QiE-k8XUNfZaOpg2N{9 ztN0c@f4CK&;0Y$Em;iDkL7v;kg1gF@RctmOIlqo)))Rz%zJ|t6SHeerN>4_dogz$J zrpdKB<~RniMq-jdJGr(Dzsw^&6u;giiJ9i!sY~Z{cd#UpH=<3AD~;{8u5u+rC^k{~ z>1)_>S&&o>DxC?UA41yyI1Px}CtvR0Xq=Kzn@F6{Mj;DU`~QOrVPX_nWX8`@B@yms zHv7?5gtSj6h^R1P0S3d`-Za6@UrUHZBmbg<14-u`r8%xY|2Mbb)1*+^BxKJX`feO{ zWwyM&9u6^oC`dJV^zrFTe=Wsr?WWcRWvTqJlk|8DRN*G19vU%_K=+)c7bP`ubeZpRB)Fmt2 zPY)tNI96upYXF&mw8zmupOkp9K#p|kDBP}B>fxYb%IWy3&QM(Z^=7tP@uBVNIx!h~ zT`$pl=F88#heD2?VU@cRZmtCNtH-Nuba70mKKakhUE|0CX8aX$TdvN+rWP792YFF=Zx!2-iMQd z+4Ue90P3??s%K=a7MJeB-eQ~L!(aS1-4BZ}q6?RvLJU4UR<*E1l6#6*MR(4^v&Fb5 zC{sNOQ4RE93Hs(Dkg6&wYPh#4HJNg^5XeGiO0u>lmz7WJ8l8McyV6b8x?^Q2IYfEO zYBfJqUZ}%2d3A+shi`tYEotL8bR8;Xc7qfKzxUQVj@6iD_{9w}H;9+qGfQQ0{w=uW>MK`#;O8TmhLZA|=Lu=p?GW#IldV!+bK zgAY6WAxbj5PDkY-g~r-n1Pg!0>QIOk(c~77=5b$MnC@=9N@kshX?$3U@+$5FZfRM4Fv;|8K`{iR7gSDRWFv+FP}#CRg&oxOe~BmO8J|h4 z@c5>XqDwgEz~sDmyE!!M9N|{VVmbMk`8mFVq7}gcxXd>PoQn>|ybls-nex%>b+W2vEqOw87z_@>?KyQ9!eJsMt*al})tHs63>+_Ki+2`0}lx|ip;70Jj zn7MuT63+hzlYL?S7qe_E%7hIH_yl1(AozbY8D#VQ#M&$8y9(F)Z*;;Zctk#_Iykgx?#yE|Y2AlN+SMJ$|3B zfbh_v+1bT$_x6!0tnJn3V*92)?e=i`G(p`*YkhH&`fipMz+?PLqQ{ldBnaa<{t+B;)-L$t-vMccUqpJ@kH;Q)p)zIy4n$=nv9?8C zx!ZKr`*8zqD7n(`I3`QeD=sAs(DF-r|7f} zO5}>M!?=oTxxu~iGhtX39V2Go0QC~$Hdcp@KCj%KCj4i@Le8d|+wthcL@Av$y#`Di z#9+&yaGF)|1SQ7NMGbBZ8~aebL%&bJKv9sp+)qhS^1yPgI6Qn3nL8NTPFUh0-C#Fo zzFjJjhQEkWi6yBa41qJ8m(GgLIG!bMobXm8&H(2Q(J6>A9eTAeYdw{_WC5=pS{k4(UzR zpw{tCS|N2UdXIY7Np5_mr3fpEH4IfAH;Z#U4+^{B{F!^Ov4bLbGOG_z z1&V$8U-)82M#4%G;+WjQxT8qP4mjAFbIqhNslAIt7{Qr$~C-@NgGH7 zkC@wbw_a9>uC`FG!=hje(KITzxw_0&t3Ub-3en94GQKk7O^WPoQN2-w@2d+p5M(Y` zDJv`BB-mSvE;Hmx(IRN1lWkKS)IAB?Au7k*8X1)7MSKRg{bE>ETuAz|U_uhX5f5-7 z-ag!7Vl5`2es5vsG$e7RlP69;DX=b7r^<+}|9Q ztM^yOO;hVy#ZMOWaTfodb7WRI#czD1Nv?6~r#`INd4l+RhGyn29c#E;Z;H0!ey*{R zvYs~9_zpbVBGw|^PCbH(!?j7}XK4704jKSO0z-f=s2on3PE|?klF4!BGJbXg)h3-d zW6j28eHiwBHo??R6^v_cTmsixBb-7EjY;dp?e*l=PiUzFY zO@!IiBFfN+Nd1NTugu6!Cg-~RQ;wle|BYPvDGYs_;GLq8Fran!VI>xWnK2~OezpHyOH@!1OggEj$VZ1^AU0l-BLco zw1t7s74@TVzb{qSGV+*!>BQM>mhb)B{l@0s>&bu8k|~~Lbi56%%YM1WTr>|Z8hY7T zk?UlyUY<`ka-Ia&R;kS|z%3ISAzdJ?R624OsRwbLE>zfeIzTe2k0KXG%jjx~0LP$2 zugT*g`#wHFn?s9}Vrlr6K2-~femcTr^k}1`5k6|7lnZiiMNM~2MHxJo>(68?5XatX z{`6M!)BusDEa&z!$8~J0agG`74xRmEA-Qacwp}Diky!BdmY&eiKLkH|>~mZ_B>?vV zMBSGh`h44VtZQy+=*7VXqo7?O5r@=M>(try9Sd }= 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 diff --git a/resources/exercise-template/gradle/wrapper/gradle-wrapper.properties b/resources/exercise-template/gradle/wrapper/gradle-wrapper.properties index b82aa23a4..23449a2b5 100644 --- a/resources/exercise-template/gradle/wrapper/gradle-wrapper.properties +++ b/resources/exercise-template/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/resources/exercise-template/gradlew b/resources/exercise-template/gradlew index 1aa94a426..adff685a0 100755 --- a/resources/exercise-template/gradlew +++ b/resources/exercise-template/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -170,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -203,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/resources/exercise-template/gradlew.bat b/resources/exercise-template/gradlew.bat index 93e3f59f1..c4bdd3ab8 100644 --- a/resources/exercise-template/gradlew.bat +++ b/resources/exercise-template/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,22 +59,21 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From 65b3242d489417f6836b109985bc335a84f79e9d Mon Sep 17 00:00:00 2001 From: Kah Goh Date: Wed, 14 Jan 2026 22:01:25 +0800 Subject: [PATCH 08/13] Use LocalDate in baffling birthdays (#3079) LocalData is a more idiomatic way of representing dates in Java. --- .../src/reference/java/BafflingBirthdays.java | 14 ++- .../src/main/java/BafflingBirthdays.java | 5 +- .../src/test/java/BafflingBirthdaysTest.java | 98 +++++++++++-------- 3 files changed, 66 insertions(+), 51 deletions(-) diff --git a/exercises/practice/baffling-birthdays/.meta/src/reference/java/BafflingBirthdays.java b/exercises/practice/baffling-birthdays/.meta/src/reference/java/BafflingBirthdays.java index 03cf1ae9a..ef58bc2c0 100644 --- a/exercises/practice/baffling-birthdays/.meta/src/reference/java/BafflingBirthdays.java +++ b/exercises/practice/baffling-birthdays/.meta/src/reference/java/BafflingBirthdays.java @@ -9,27 +9,25 @@ class BafflingBirthdays { private static final int nonLeapYear = 2001; private static final int daysInYear = 365; - boolean sharedBirthday(List birthdates) { + boolean sharedBirthday(List birthdates) { Set seen = new HashSet<>(); - for (String birthdate : birthdates) { - String monthDay = birthdate.substring(5); - if (!seen.add(monthDay)) { + for (LocalDate birthdate : birthdates) { + if (!seen.add(birthdate.getMonth().toString() + birthdate.getDayOfMonth())) { return true; } } return false; } - List randomBirthdates(int groupSize) { + List randomBirthdates(int groupSize) { if (groupSize <= 0) { return List.of(); } - List birthdates = new ArrayList<>(groupSize); + List birthdates = new ArrayList<>(groupSize); ThreadLocalRandom random = ThreadLocalRandom.current(); for (int i = 0; i < groupSize; i++) { int dayOfYear = random.nextInt(1, daysInYear + 1); - LocalDate date = LocalDate.ofYearDay(nonLeapYear, dayOfYear); - birthdates.add(date.toString()); + birthdates.add(LocalDate.ofYearDay(nonLeapYear, dayOfYear)); } return birthdates; } diff --git a/exercises/practice/baffling-birthdays/src/main/java/BafflingBirthdays.java b/exercises/practice/baffling-birthdays/src/main/java/BafflingBirthdays.java index 273c6506c..5e1925081 100644 --- a/exercises/practice/baffling-birthdays/src/main/java/BafflingBirthdays.java +++ b/exercises/practice/baffling-birthdays/src/main/java/BafflingBirthdays.java @@ -1,11 +1,12 @@ +import java.time.LocalDate; import java.util.List; class BafflingBirthdays { - boolean sharedBirthday(List birthdates) { + boolean sharedBirthday(List birthdates) { throw new UnsupportedOperationException("Delete this statement and write your own implementation."); } - List randomBirthdates(int groupSize) { + List randomBirthdates(int groupSize) { throw new UnsupportedOperationException("Delete this statement and write your own implementation."); } diff --git a/exercises/practice/baffling-birthdays/src/test/java/BafflingBirthdaysTest.java b/exercises/practice/baffling-birthdays/src/test/java/BafflingBirthdaysTest.java index 9c9497a92..0726301dc 100644 --- a/exercises/practice/baffling-birthdays/src/test/java/BafflingBirthdaysTest.java +++ b/exercises/practice/baffling-birthdays/src/test/java/BafflingBirthdaysTest.java @@ -1,71 +1,105 @@ +import java.time.LocalDate; +import java.util.List; + import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static java.time.Month.APRIL; +import static java.time.Month.AUGUST; +import static java.time.Month.DECEMBER; +import static java.time.Month.FEBRUARY; +import static java.time.Month.JANUARY; +import static java.time.Month.JULY; +import static java.time.Month.MAY; +import static java.time.Month.NOVEMBER; +import static java.time.Month.OCTOBER; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.data.Offset.offset; -import java.time.LocalDate; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - public class BafflingBirthdaysTest { private BafflingBirthdays birthdays = new BafflingBirthdays(); @Test @DisplayName("one birthdate") public void oneBirthdateTest() { - assertThat(birthdays.sharedBirthday(List.of("2000-01-01"))).isFalse(); + assertThat(birthdays.sharedBirthday(List.of( + LocalDate.of(2000, JANUARY, 1) + ))).isFalse(); } @Disabled("Remove to run test") @Test @DisplayName("two birthdates with same year, month, and day") public void twoBirthdatesWithSameYearMonthAndDayTest() { - assertThat(birthdays.sharedBirthday(List.of("2000-01-01", "2000-01-01"))).isTrue(); + assertThat(birthdays.sharedBirthday(List.of( + LocalDate.of(2000, JANUARY, 1), + LocalDate.of(2000, JANUARY, 1) + ))).isTrue(); } @Disabled("Remove to run test") @Test @DisplayName("two birthdates with same year and month, but different day") public void twoBirthdatesWithSameYearAndMonthButDifferentDayTest() { - assertThat(birthdays.sharedBirthday(List.of("2012-05-09", "2012-05-17"))).isFalse(); + assertThat(birthdays.sharedBirthday(List.of( + LocalDate.of(2012, MAY, 9), + LocalDate.of(2012, MAY, 17) + ))).isFalse(); } @Disabled("Remove to run test") @Test @DisplayName("two birthdates with same month and day, but different year") public void twoBirthdatesWithSameMonthAndDayButDifferentYearTest() { - assertThat(birthdays.sharedBirthday(List.of("1999-10-23", "1988-10-23"))).isTrue(); + assertThat(birthdays.sharedBirthday(List.of( + LocalDate.of(1999, OCTOBER, 23), + LocalDate.of(1988, OCTOBER, 23) + ))).isTrue(); } @Disabled("Remove to run test") @Test @DisplayName("two birthdates with same year, but different month and day") public void twoBirthdatesWithSameYearButDifferentMonthAndDayTest() { - assertThat(birthdays.sharedBirthday(List.of("2007-12-19", "2007-04-27"))).isFalse(); + assertThat(birthdays.sharedBirthday(List.of( + LocalDate.of(2007, DECEMBER, 19), + LocalDate.of(2007, APRIL, 27) + ))).isFalse(); } @Disabled("Remove to run test") @Test @DisplayName("two birthdates with different year, month, and day") public void twoBirthdatesWithDifferentYearMonthAndDayTest() { - assertThat(birthdays.sharedBirthday(List.of("1997-08-04", "1963-11-23"))).isFalse(); + assertThat(birthdays.sharedBirthday(List.of( + LocalDate.of(1997, AUGUST, 4), + LocalDate.of(1963, NOVEMBER, 23) + ))).isFalse(); } @Disabled("Remove to run test") @Test @DisplayName("multiple birthdates without shared birthday") public void multipleBirthdatesWithoutSharedBirthdayTest() { - assertThat(birthdays.sharedBirthday(List.of("1966-07-29", "1977-02-12", "2001-12-25", "1980-11-10"))).isFalse(); + assertThat(birthdays.sharedBirthday(List.of( + LocalDate.of(1966, AUGUST, 29), + LocalDate.of(1977, FEBRUARY, 12), + LocalDate.of(2001, DECEMBER, 25), + LocalDate.of(1980, NOVEMBER, 10) + ))).isFalse(); } @Disabled("Remove to run test") @Test @DisplayName("multiple birthdates with one shared birthday") public void multipleBirthdatesWithOneSharedBirthdayTest() { - assertThat(birthdays.sharedBirthday(List.of("1966-07-29", "1977-02-12", "2001-07-29", "1980-11-10"))).isTrue(); + assertThat(birthdays.sharedBirthday(List.of( + LocalDate.of(1966, AUGUST, 29), + LocalDate.of(1977, FEBRUARY, 12), + LocalDate.of(2001, AUGUST, 29), + LocalDate.of(1980, NOVEMBER, 10) + ))).isTrue(); } @Disabled("Remove to run test") @@ -73,11 +107,11 @@ public void multipleBirthdatesWithOneSharedBirthdayTest() { @DisplayName("multiple birthdates with more than one shared birthday") public void multipleBirthdatesWithMoreThanOneSharedBirthdayTest() { assertThat(birthdays.sharedBirthday(List.of( - "1966-07-29", - "1977-02-12", - "2001-12-25", - "1980-07-29", - "2019-02-12" + LocalDate.of(1966, JULY, 29), + LocalDate.of(1977, FEBRUARY, 12), + LocalDate.of(2001, DECEMBER, 25), + LocalDate.of(1980, JULY, 29), + LocalDate.of(2019, FEBRUARY, 12) ))).isTrue(); } @@ -93,41 +127,23 @@ public void generateRequestedNumberOfBirthdatesTest() { @Test @DisplayName("years are not leap years") public void yearsAreNotLeapYearsTest() { - for (String birthdate : birthdays.randomBirthdates(100)) { - LocalDate date = LocalDate.parse(birthdate); - assertThat(date.isLeapYear()).isFalse(); - assertThat(date.getMonthValue() == 2 && date.getDayOfMonth() == 29).isFalse(); - } + assertThat(birthdays.randomBirthdates(100)).noneMatch(LocalDate::isLeapYear); } @Disabled("Remove to run test") @Test @DisplayName("months are random") public void monthsAreRandomTest() { - Set months = new HashSet<>(); - for (String birthdate : birthdays.randomBirthdates(500)) { - LocalDate date = LocalDate.parse(birthdate); - months.add(date.getMonthValue()); - if (months.size() >= 7) { - break; - } - } - assertThat(months).hasSizeGreaterThanOrEqualTo(7); + assertThat(birthdays.randomBirthdates(500).stream().map(LocalDate::getMonth).distinct()) + .hasSizeGreaterThanOrEqualTo(7); } @Disabled("Remove to run test") @Test @DisplayName("days are random") public void daysAreRandomTest() { - Set days = new HashSet<>(); - for (String birthdate : birthdays.randomBirthdates(500)) { - LocalDate date = LocalDate.parse(birthdate); - days.add(date.getDayOfMonth()); - if (days.size() >= 11) { - break; - } - } - assertThat(days).hasSizeGreaterThanOrEqualTo(11); + assertThat(birthdays.randomBirthdates(500).stream().map(LocalDate::getDayOfMonth).distinct()) + .hasSizeGreaterThanOrEqualTo(11); } @Disabled("Remove to run test") From ed77afeac682def22ca40b54afae57b88eab6320 Mon Sep 17 00:00:00 2001 From: Kah Goh Date: Sat, 17 Jan 2026 22:49:35 +0800 Subject: [PATCH 09/13] Add missing JUnit launcher (#3081) For some reason, this was missing only from the hangman and rest-api exercises. It is required to run the tests from Gradle. See https://docs.gradle.org/current/userguide/upgrading_version_8.html#test_framework_implementation_dependencies [no important files changed] --- exercises/practice/hangman/build.gradle | 2 ++ exercises/practice/rest-api/build.gradle | 2 ++ 2 files changed, 4 insertions(+) diff --git a/exercises/practice/hangman/build.gradle b/exercises/practice/hangman/build.gradle index 15df104cc..a55dc26f3 100644 --- a/exercises/practice/hangman/build.gradle +++ b/exercises/practice/hangman/build.gradle @@ -12,6 +12,8 @@ dependencies { testImplementation platform("org.junit:junit-bom:5.10.0") testImplementation "org.junit.jupiter:junit-jupiter" testImplementation "org.assertj:assertj-core:3.25.1" + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } test { diff --git a/exercises/practice/rest-api/build.gradle b/exercises/practice/rest-api/build.gradle index 7b2a81d33..b5866449e 100644 --- a/exercises/practice/rest-api/build.gradle +++ b/exercises/practice/rest-api/build.gradle @@ -12,6 +12,8 @@ dependencies { testImplementation platform("org.junit:junit-bom:5.10.0") testImplementation "org.junit.jupiter:junit-jupiter" testImplementation "org.assertj:assertj-core:3.25.1" + + testRuntimeOnly "org.junit.platform:junit-platform-launcher" } test { From 108b0b16f061b1a44c7b90c227db9f6d59670ff9 Mon Sep 17 00:00:00 2001 From: Kah Goh Date: Sun, 18 Jan 2026 23:04:03 +0800 Subject: [PATCH 10/13] Update setup JDK to use JDK 21 (#3082) Updates the action to use a newer release. The action does not yet support Java 25. --- .github/workflows/java.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index 598a68e40..5d4af4494 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -16,10 +16,10 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - - name: Set up JDK 1.17 + - name: Set up JDK 21 uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e with: - java-version: 17 + java-version: 21 distribution: "temurin" - name: Check if tests compile cleanly with starter sources run: ./gradlew compileStarterTestJava --continue @@ -30,10 +30,10 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - - name: Set up JDK 1.17 + - name: Set up JDK 21 uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e with: - java-version: 17 + java-version: 21 distribution: "temurin" - name: Run checkstyle run: ./gradlew check --exclude-task test --continue From f66228e0de5dba803694654c84732983b8ea578e Mon Sep 17 00:00:00 2001 From: Kah Goh Date: Sun, 18 Jan 2026 23:05:31 +0800 Subject: [PATCH 11/13] Fix unchecked warnings (#3083) This change fixes "unchecked or unsafe operations" from the build. Example of warning: ``` Note: /home/runner/work/java/java/exercises/concept/lasagna/src/test/java/utils/ReflectionProxy.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. ``` See https://github.com/exercism/java/actions/runs/21096072319/job/60673664241#step:4:129 [no important files changed] --- .../lasagna/src/test/java/utils/Lasagna.java | 9 +++--- .../src/test/java/utils/ReflectionProxy.java | 14 ++++---- .../src/test/java/GameMasterProxy.java | 12 ++++--- .../src/test/java/ReflectionProxy.java | 30 +++++++---------- .../src/test/java/ReflectionProxy.java | 15 +++++---- .../src/test/java/WarriorProxy.java | 6 ++-- .../src/test/java/WizardProxy.java | 8 ++--- .../hangman/src/test/java/HangmanTest.java | 32 ++++++++++++------- 8 files changed, 68 insertions(+), 58 deletions(-) diff --git a/exercises/concept/lasagna/src/test/java/utils/Lasagna.java b/exercises/concept/lasagna/src/test/java/utils/Lasagna.java index 6cd32882c..ba2ac0aeb 100644 --- a/exercises/concept/lasagna/src/test/java/utils/Lasagna.java +++ b/exercises/concept/lasagna/src/test/java/utils/Lasagna.java @@ -8,18 +8,19 @@ public String getTargetClassName() { } public int expectedMinutesInOven() { - return invokeMethod("expectedMinutesInOven", new Class[]{}); + return invokeMethod("expectedMinutesInOven", Integer.class, new Class[]{}); } public int remainingMinutesInOven(int actualMinutes) { - return invokeMethod("remainingMinutesInOven", new Class[]{int.class}, actualMinutes); + return invokeMethod("remainingMinutesInOven", Integer.class, new Class[]{int.class}, actualMinutes); } public int preparationTimeInMinutes(int amountLayers) { - return invokeMethod("preparationTimeInMinutes", new Class[]{int.class}, amountLayers); + return invokeMethod("preparationTimeInMinutes", Integer.class, new Class[]{int.class}, amountLayers); } public int totalTimeInMinutes(int amountLayers, int actualMinutes) { - return invokeMethod("totalTimeInMinutes", new Class[]{int.class, int.class}, amountLayers, actualMinutes); + return invokeMethod("totalTimeInMinutes", Integer.class, new Class[]{int.class, int.class}, + amountLayers, actualMinutes); } } diff --git a/exercises/concept/lasagna/src/test/java/utils/ReflectionProxy.java b/exercises/concept/lasagna/src/test/java/utils/ReflectionProxy.java index 6405b525c..14810c9ef 100644 --- a/exercises/concept/lasagna/src/test/java/utils/ReflectionProxy.java +++ b/exercises/concept/lasagna/src/test/java/utils/ReflectionProxy.java @@ -101,12 +101,14 @@ public boolean isMethodReturnType(Class returnType, String name, Class... /** * Invokes a method from the target instance * @param methodName The name of the method + * @param returnType The class representing the expected return type * @param parameterTypes The list of parameter types * @param parameterValues The list with values for the method parameters * @param The result type we expect the method to be * @return The value returned by the method */ - protected T invokeMethod(String methodName, Class[] parameterTypes, Object... parameterValues) { + protected T invokeMethod(String methodName, Class returnType, Class[] parameterTypes, + Object... parameterValues) { if (target == null) { return null; } @@ -114,13 +116,13 @@ protected T invokeMethod(String methodName, Class[] parameterTypes, Obje // getDeclaredMethod is used to get protected/private methods Method method = target.getClass().getDeclaredMethod(methodName, parameterTypes); method.setAccessible(true); - return (T) method.invoke(target, parameterValues); + return returnType.cast(method.invoke(target, parameterValues)); } catch (NoSuchMethodException e) { try { // try getting it from parent class, but only public methods will work Method method = target.getClass().getMethod(methodName, parameterTypes); method.setAccessible(true); - return (T) method.invoke(target, parameterValues); + return returnType.cast(method.invoke(target, parameterValues)); } catch (Exception ex) { return null; } @@ -381,7 +383,7 @@ public int hashCode() { * @return The result of 'toString' from the target instance */ public String toString() { - return invokeMethod("toString", new Class[]{ }); + return invokeMethod("toString", String.class, new Class[]{ }); } /** @@ -390,14 +392,14 @@ public String toString() { * @param The type we are expecting it to be * @return The value of the property (if it exists) */ - protected T getPropertyValue(String propertyName) { + protected T getPropertyValue(String propertyName, Class propertyType) { if (target == null || !hasProperty(propertyName)) { return null; } try { Field field = target.getClass().getDeclaredField(propertyName); field.setAccessible(true); - return (T) field.get(target); + return propertyType.cast(field.get(target)); } catch (Exception e) { return null; } diff --git a/exercises/concept/wizards-and-warriors-2/src/test/java/GameMasterProxy.java b/exercises/concept/wizards-and-warriors-2/src/test/java/GameMasterProxy.java index c747a34d3..ca555b883 100644 --- a/exercises/concept/wizards-and-warriors-2/src/test/java/GameMasterProxy.java +++ b/exercises/concept/wizards-and-warriors-2/src/test/java/GameMasterProxy.java @@ -12,23 +12,25 @@ public String getTargetClassName() { } public String describe(Character character) { - return invokeMethod("describe", new Class[] { Character.class }, character); + return invokeMethod("describe", String.class, new Class[] { Character.class }, character); } public String describe(Destination character) { - return invokeMethod("describe", new Class[] { Destination.class }, character); + return invokeMethod("describe", String.class, new Class[] { Destination.class }, character); } public String describe(TravelMethod character) { - return invokeMethod("describe", new Class[] { TravelMethod.class }, character); + return invokeMethod("describe", String.class, new Class[] { TravelMethod.class }, character); } public String describe(Character character, Destination destination, TravelMethod travelMethod) { - return invokeMethod("describe", new Class[] { Character.class, Destination.class, TravelMethod.class }, + return invokeMethod("describe", String.class, + new Class[] { Character.class, Destination.class, TravelMethod.class }, character, destination, travelMethod); } public String describe(Character character, Destination destination) { - return invokeMethod("describe", new Class[] { Character.class, Destination.class }, character, destination); + return invokeMethod("describe", String.class, new Class[] { Character.class, Destination.class }, + character, destination); } } diff --git a/exercises/concept/wizards-and-warriors-2/src/test/java/ReflectionProxy.java b/exercises/concept/wizards-and-warriors-2/src/test/java/ReflectionProxy.java index 730f26fa0..ff21b5527 100644 --- a/exercises/concept/wizards-and-warriors-2/src/test/java/ReflectionProxy.java +++ b/exercises/concept/wizards-and-warriors-2/src/test/java/ReflectionProxy.java @@ -117,12 +117,14 @@ public boolean isMethodReturnType(Class returnType, String name, Class... * Invokes a method from the target instance * * @param methodName The name of the method + * @param returnType The class representing the expected return type * @param parameterTypes The list of parameter types * @param parameterValues The list with values for the method parameters * @param The result type we expect the method to be * @return The value returned by the method */ - protected T invokeMethod(String methodName, Class[] parameterTypes, Object... parameterValues) { + protected T invokeMethod(String methodName, Class returnType, Class[] parameterTypes, + Object... parameterValues) { if (target == null) { throw new UnsupportedOperationException(); } @@ -131,12 +133,12 @@ protected T invokeMethod(String methodName, Class[] parameterTypes, Objec // getDeclaredMethod is used to get protected/private methods Method method = target.getClass().getDeclaredMethod(methodName, parameterTypes); method.setAccessible(true); - return (T) method.invoke(target, parameterValues); + return returnType.cast(method.invoke(target, parameterValues)); } catch (NoSuchMethodException e) { // try getting it from parent class, but only public methods will work Method method = target.getClass().getMethod(methodName, parameterTypes); method.setAccessible(true); - return (T) method.invoke(target, parameterValues); + return returnType.cast(method.invoke(target, parameterValues)); } } catch (Exception e) { throw new UnsupportedOperationException(e); @@ -360,7 +362,6 @@ public boolean isConstructorPublic(Class... parameterTypes) { /** * Proxy for the 'equals' method - * * @param obj The ReflexionProxy object you want to compare against * @return True if both targets are equal, false otherwise */ @@ -379,7 +380,6 @@ public boolean equals(Object obj) { /** * Proxy for the 'hashCode' method - * * @return The hashCode from the target class */ public int hashCode() { @@ -397,28 +397,26 @@ public int hashCode() { /** * Proxy for the 'toString' method from the target class - * * @return The result of 'toString' from the target instance */ public String toString() { - return invokeMethod("toString", new Class[]{}); + return invokeMethod("toString", String.class, new Class[]{ }); } /** * Gets a property value from the target instance (if it exists) - * * @param propertyName The name of the property - * @param The type we are expecting it to be + * @param The type we are expecting it to be * @return The value of the property (if it exists) */ - protected T getPropertyValue(String propertyName) { + protected T getPropertyValue(String propertyName, Class propertyType) { if (target == null || !hasProperty(propertyName)) { return null; } try { Field field = target.getClass().getDeclaredField(propertyName); field.setAccessible(true); - return (T) field.get(target); + return propertyType.cast(field.get(target)); } catch (Exception e) { return null; } @@ -426,7 +424,6 @@ protected T getPropertyValue(String propertyName) { /** * Checks if the target class is abstract - * * @return True if the target class exists and is abstract, false otherwise */ public boolean isAbstract() { @@ -439,7 +436,6 @@ public boolean isAbstract() { /** * Checks if the target class extends another - * * @param className The fully qualified name of the class it should extend * @return True if the target class extends the specified one, false otherwise */ @@ -458,7 +454,6 @@ public boolean extendsClass(String className) { /** * Checks if the target class is an interface - * * @return True if the target class exists and is an interface, false otherwise */ public boolean isInterface() { @@ -471,8 +466,7 @@ public boolean isInterface() { /** * Checks if a method is abstract - * - * @param name The name of the method + * @param name The name of the method * @param parameterTypes The list of method parameter types * @return True if the method exists and is abstract, false otherwise */ @@ -491,8 +485,7 @@ public boolean isMethodAbstract(String name, Class... parameterTypes) { /** * Checks if a method is protected - * - * @param name The name of the method + * @param name The name of the method * @param parameterTypes The list of method parameter types * @return True if the method exists and is protected, false otherwise */ @@ -511,3 +504,4 @@ public boolean isMethodProtected(String name, Class... parameterTypes) { //endregion } + diff --git a/exercises/concept/wizards-and-warriors/src/test/java/ReflectionProxy.java b/exercises/concept/wizards-and-warriors/src/test/java/ReflectionProxy.java index a3183fc87..02a6460c7 100644 --- a/exercises/concept/wizards-and-warriors/src/test/java/ReflectionProxy.java +++ b/exercises/concept/wizards-and-warriors/src/test/java/ReflectionProxy.java @@ -99,12 +99,14 @@ public boolean isMethodReturnType(Class returnType, String name, Class... /** * Invokes a method from the target instance * @param methodName The name of the method + * @param returnType The class representing the expected return type * @param parameterTypes The list of parameter types * @param parameterValues The list with values for the method parameters * @param The result type we expect the method to be * @return The value returned by the method */ - protected T invokeMethod(String methodName, Class[] parameterTypes, Object... parameterValues) { + protected T invokeMethod(String methodName, Class returnType, Class[] parameterTypes, + Object... parameterValues) { if (target == null) { return null; } @@ -112,13 +114,13 @@ protected T invokeMethod(String methodName, Class[] parameterTypes, Obje // getDeclaredMethod is used to get protected/private methods Method method = target.getClass().getDeclaredMethod(methodName, parameterTypes); method.setAccessible(true); - return (T) method.invoke(target, parameterValues); + return returnType.cast(method.invoke(target, parameterValues)); } catch (NoSuchMethodException e) { try { // try getting it from parent class, but only public methods will work Method method = target.getClass().getMethod(methodName, parameterTypes); method.setAccessible(true); - return (T) method.invoke(target, parameterValues); + return returnType.cast(method.invoke(target, parameterValues)); } catch (Exception ex) { return null; } @@ -379,23 +381,24 @@ public int hashCode() { * @return The result of 'toString' from the target instance */ public String toString() { - return invokeMethod("toString", new Class[]{ }); + return invokeMethod("toString", String.class, new Class[]{ }); } /** * Gets a property value from the target instance (if it exists) * @param propertyName The name of the property + * @param propertyType The class representing the property's type * @param The type we are expecting it to be * @return The value of the property (if it exists) */ - protected T getPropertyValue(String propertyName) { + protected T getPropertyValue(String propertyName, Class propertyType) { if (target == null || !hasProperty(propertyName)) { return null; } try { Field field = target.getClass().getDeclaredField(propertyName); field.setAccessible(true); - return (T) field.get(target); + return propertyType.cast(field.get(target)); } catch (Exception e) { return null; } diff --git a/exercises/concept/wizards-and-warriors/src/test/java/WarriorProxy.java b/exercises/concept/wizards-and-warriors/src/test/java/WarriorProxy.java index 821ae9837..2b6540578 100644 --- a/exercises/concept/wizards-and-warriors/src/test/java/WarriorProxy.java +++ b/exercises/concept/wizards-and-warriors/src/test/java/WarriorProxy.java @@ -6,14 +6,14 @@ public String getTargetClassName() { } public String toString() { - return invokeMethod("toString", new Class[0]); + return invokeMethod("toString", String.class, new Class[0]); } boolean isVulnerable() { - return invokeMethod("isVulnerable", new Class[0]); + return invokeMethod("isVulnerable", Boolean.class, new Class[0]); } int getDamagePoints(Fighter target) { - return invokeMethod("getDamagePoints", new Class[]{Fighter.class}, target); + return invokeMethod("getDamagePoints", Integer.class, new Class[]{Fighter.class}, target); } } diff --git a/exercises/concept/wizards-and-warriors/src/test/java/WizardProxy.java b/exercises/concept/wizards-and-warriors/src/test/java/WizardProxy.java index 2069472c2..5e47bf0ea 100644 --- a/exercises/concept/wizards-and-warriors/src/test/java/WizardProxy.java +++ b/exercises/concept/wizards-and-warriors/src/test/java/WizardProxy.java @@ -6,18 +6,18 @@ public String getTargetClassName() { } public String toString() { - return invokeMethod("toString", new Class[0]); + return invokeMethod("toString", String.class, new Class[0]); } boolean isVulnerable() { - return invokeMethod("isVulnerable", new Class[0]); + return invokeMethod("isVulnerable", Boolean.class, new Class[0]); } int getDamagePoints(Fighter target) { - return invokeMethod("getDamagePoints", new Class[]{Fighter.class}, target); + return invokeMethod("getDamagePoints", Integer.class, new Class[]{Fighter.class}, target); } void prepareSpell() { - invokeMethod("prepareSpell", new Class[0]); + invokeMethod("prepareSpell", Void.class, new Class[0]); } } diff --git a/exercises/practice/hangman/src/test/java/HangmanTest.java b/exercises/practice/hangman/src/test/java/HangmanTest.java index d4bbe13da..6cecef282 100644 --- a/exercises/practice/hangman/src/test/java/HangmanTest.java +++ b/exercises/practice/hangman/src/test/java/HangmanTest.java @@ -16,6 +16,14 @@ public class HangmanTest { + /** + * Used in {@link #consecutiveGames()} to tell when both are subscribed too. + */ + private static class SubscribedEmitters { + private ObservableEmitter word; + private ObservableEmitter letter; + } + private Hangman hangman; @BeforeEach @@ -136,14 +144,14 @@ public void consecutiveGames() { // 4. Letter observable receiveds the letters for the second word // Emitters respectively for the word and letter observables - ObservableEmitter[] emitters = new ObservableEmitter[2]; + SubscribedEmitters emitters = new SubscribedEmitters(); Runnable emit = () -> { // Process sending the inputs in the right order - emitters[0].onNext("secret"); - Stream.of("a", "e", "o", "s", "c", "r", "g", "t").forEach(emitters[1]::onNext); - emitters[0].onNext("abba"); - Stream.of("a", "e", "s", "b").forEach(emitters[1]::onNext); - emitters[0].onComplete(); + emitters.word.onNext("secret"); + Stream.of("a", "e", "o", "s", "c", "r", "g", "t").forEach(emitters.letter::onNext); + emitters.word.onNext("abba"); + Stream.of("a", "e", "s", "b").forEach(emitters.letter::onNext); + emitters.word.onComplete(); }; Observable words = createWordObservable(emitters, emit); Observable letters = createLetterObservable(emitters, emit); @@ -172,24 +180,24 @@ public void consecutiveGames() { } } - Observable createWordObservable(ObservableEmitter[] emitters, Runnable emit) { + Observable createWordObservable(SubscribedEmitters emitters, Runnable emit) { return Observable.create( emitter -> { // A new subscription was created for words, record it. - emitters[0] = emitter; - if (emitters[1] != null) { + emitters.word = emitter; + if (emitters.letter != null) { // Start emitting only when both word and letter observable have subscriptions emit.run(); } }); } - Observable createLetterObservable(ObservableEmitter[] emitters, Runnable emit) { + Observable createLetterObservable(SubscribedEmitters emitters, Runnable emit) { return Observable.create( emitter -> { // A new subscription was created for letters, record it. - emitters[1] = emitter; - if (emitters[0] != null) { + emitters.letter = emitter; + if (emitters.word != null) { // Start emitting only when both word and letter observable have subscriptions emit.run(); } From 56b2398b6f7b7c456e8e8c275a8cef934d4fddc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 20:45:23 +0800 Subject: [PATCH 12/13] Bump actions/checkout from 6.0.1 to 6.0.2 (#3085) Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.1 to 6.0.2. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/8e8c483db84b4bee98b60c0593521ed34d9990e8...de0fac2e4500dabe0009e67214ff5f5447ce83dd) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-deprecated-exercises.yml | 2 +- .github/workflows/java.yml | 8 ++++---- .github/workflows/markdown.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/check-deprecated-exercises.yml b/.github/workflows/check-deprecated-exercises.yml index 0f011b79e..8defbd0cf 100644 --- a/.github/workflows/check-deprecated-exercises.yml +++ b/.github/workflows/check-deprecated-exercises.yml @@ -14,7 +14,7 @@ jobs: name: Check for deprecated exercises runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd with: fetch-depth: 0 - name: Test deprecated exercises using test-deprecated-exercises diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index 5d4af4494..8d43f8e60 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -15,7 +15,7 @@ jobs: name: Check if tests compile cleanly with starter sources runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up JDK 21 uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e with: @@ -29,7 +29,7 @@ jobs: name: Lint Java files using Checkstyle runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up JDK 21 uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e with: @@ -44,7 +44,7 @@ jobs: if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Test all exercises using java-test-runner run: bin/test-with-test-runner - name: Print summary @@ -71,7 +71,7 @@ jobs: if: github.event_name == 'pull_request' runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd with: fetch-depth: 0 - name: Test changed exercises using java-test-runner diff --git a/.github/workflows/markdown.yml b/.github/workflows/markdown.yml index 8339bd4db..a120524cd 100644 --- a/.github/workflows/markdown.yml +++ b/.github/workflows/markdown.yml @@ -17,6 +17,6 @@ jobs: name: Lint Markdown files runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Lint markdown uses: DavidAnson/markdownlint-cli2-action@07035fd053f7be764496c0f8d8f9f41f98305101 From ffa351e28bfab815d41a083793095faf95c2251d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 20:45:44 +0800 Subject: [PATCH 13/13] Bump actions/setup-java from 5.1.0 to 5.2.0 (#3084) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/f2beeb24e141e01a676f977032f5a29d81c9e27e...be666c2fcd27ec809703dec50e508c2fdc7f6654) --- updated-dependencies: - dependency-name: actions/setup-java dependency-version: 5.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/java.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index 8d43f8e60..be8b3684a 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up JDK 21 - uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 with: java-version: 21 distribution: "temurin" @@ -31,7 +31,7 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up JDK 21 - uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 with: java-version: 21 distribution: "temurin"