diff --git a/.github/workflows/sorted.yml b/.github/workflows/sorted.yml new file mode 100644 index 00000000..0de38ff3 --- /dev/null +++ b/.github/workflows/sorted.yml @@ -0,0 +1,16 @@ +name: Exercise order + +on: + pull_request: + branches: + - main + +permissions: + contents: read + +jobs: + call-gha-workflow: + name: Check + uses: exercism/github-actions/.github/workflows/sorted.yml@main + with: + ordering: ".bucket, .lowercase_name" diff --git a/bin/sort-practice-exercises b/bin/sort-practice-exercises new file mode 100644 index 00000000..2ce7c227 --- /dev/null +++ b/bin/sort-practice-exercises @@ -0,0 +1,30 @@ +#!/bin/bash + +die () { echo "$*" >&2; exit 1; } + +(( $# == 2 )) || die "Usage: $0 " +[[ -r $2 ]] || die "$2 is not a readable file" + +tmp=$(mktemp) +jq -r ' + # Bucket by displayed difficulty. 0-3: easy; 4-7: medium; 8-10: hard. + def bucket(i): [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3][i]; + # Code injection to inject the sort literal expression. + def sort: sort_by('"$1"'); + .exercises.practice = ( + .exercises.practice | + # Add displayed difficulty + map(.lowercase_name = (.name | ascii_downcase)) | + map(.bucket = bucket(.difficulty)) | + # Leave hello-world at the top + if .[0].slug == "hello-world" then + [.[0]] + (.[1:] | sort) + else + sort + end | + map(del(.lowercase_name)) | + map(del(.bucket)) + ) +' "$2" > "$tmp" && \ +cat "$tmp" > "$2" +rm "$tmp" diff --git a/config.json b/config.json index 3b1e32a7..8c3f5999 100644 --- a/config.json +++ b/config.json @@ -51,6 +51,22 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "all-your-base", + "name": "All Your Base", + "uuid": "b3bfbbd9-a0f4-4cbf-848b-f889bb0241a0", + "practices": [], + "prerequisites": [], + "difficulty": 3 + }, + { + "slug": "allergies", + "name": "Allergies", + "uuid": "fd8a5055-deb0-4a06-a9d5-e6d2f7e2be23", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "anagram", "name": "Anagram", @@ -124,6 +140,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "circular-buffer", + "name": "Circular Buffer", + "uuid": "85672148-01f2-4c88-b859-5d9ecc5c1ada", + "practices": [], + "prerequisites": [], + "difficulty": 3 + }, { "slug": "clock", "name": "Clock", @@ -225,6 +249,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "hamming", + "name": "Hamming", + "uuid": "1bba0e52-fc79-40bc-9f5e-304ff5d86dc5", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "hello-world", "name": "Hello World", @@ -330,17 +362,17 @@ ] }, { - "slug": "matrix", - "name": "Matrix", - "uuid": "653ae967-32d2-4789-bb43-289ad1572191", + "slug": "matching-brackets", + "name": "Matching Brackets", + "uuid": "f4231888-c660-46d1-b05e-0dd4e223ea28", "practices": [], "prerequisites": [], "difficulty": 2 }, { - "slug": "matching-brackets", - "name": "Matching Brackets", - "uuid": "f4231888-c660-46d1-b05e-0dd4e223ea28", + "slug": "matrix", + "name": "Matrix", + "uuid": "653ae967-32d2-4789-bb43-289ad1572191", "practices": [], "prerequisites": [], "difficulty": 2 @@ -487,14 +519,6 @@ "prerequisites": [], "difficulty": 2 }, - { - "slug": "robot-simulator", - "name": "Robot Simulator", - "uuid": "23b8d924-3493-4bbc-8e7d-7fdef5234833", - "practices": [], - "prerequisites": [], - "difficulty": 2 - }, { "slug": "reverse-string", "name": "Reverse String", @@ -511,6 +535,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "robot-simulator", + "name": "Robot Simulator", + "uuid": "23b8d924-3493-4bbc-8e7d-7fdef5234833", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "roman-numerals", "name": "Roman Numerals", @@ -544,9 +576,9 @@ "difficulty": 2 }, { - "slug": "state-of-tic-tac-toe", - "name": "State of Tic-Tac-Toe", - "uuid": "76cdad5e-de00-4c48-8532-8c28013d9ef8", + "slug": "secret-handshake", + "name": "Secret Handshake", + "uuid": "b66ba570-f586-4bf1-9cad-c2e7fdd24f65", "practices": [], "prerequisites": [], "difficulty": 2 @@ -559,6 +591,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "sieve", + "name": "Sieve", + "uuid": "254aeab6-31e2-482b-9eb1-cca454e13705", + "practices": [], + "prerequisites": [], + "difficulty": 3 + }, { "slug": "space-age", "name": "Space Age", @@ -575,6 +615,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "state-of-tic-tac-toe", + "name": "State of Tic-Tac-Toe", + "uuid": "76cdad5e-de00-4c48-8532-8c28013d9ef8", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "strain", "name": "Strain", @@ -641,14 +689,6 @@ "prerequisites": [], "difficulty": 1 }, - { - "slug": "yacht", - "name": "Yacht", - "uuid": "e032aa32-6dd1-438b-9e74-d6d957d043e9", - "practices": [], - "prerequisites": [], - "difficulty": 2 - }, { "slug": "word-count", "name": "Word Count", @@ -664,6 +704,14 @@ "variables" ] }, + { + "slug": "yacht", + "name": "Yacht", + "uuid": "e032aa32-6dd1-438b-9e74-d6d957d043e9", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "atbash-cipher", "name": "Atbash Cipher", @@ -705,6 +753,14 @@ "text_formatting" ] }, + { + "slug": "camicia", + "name": "Camicia", + "uuid": "3d899e5f-27eb-45bc-aa5e-4a844105f462", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "custom-set", "name": "Custom Set", @@ -721,6 +777,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "grade-school", + "name": "Grade School", + "uuid": "98f925a2-bc1c-4dc1-b2f4-d06941114250", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "house", "name": "House", @@ -737,6 +801,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "knapsack", + "name": "Knapsack", + "uuid": "a385b861-22a5-4319-9fc0-c0228640ce26", + "practices": [], + "prerequisites": [], + "difficulty": 6 + }, { "slug": "largest-series-product", "name": "Largest Series Product", @@ -745,6 +817,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "meetup", + "name": "Meetup", + "uuid": "398c1590-2e8f-445e-83cb-2b762be63b2b", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "nth-prime", "name": "Nth Prime", @@ -776,6 +856,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "relative-distance", + "name": "Relative Distance", + "uuid": "4060784f-e4ce-44dc-985a-328d190d4f94", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "run-length-encoding", "name": "Run-Length Encoding", @@ -784,6 +872,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "satellite", + "name": "Satellite", + "uuid": "b09b1106-6ca1-49e2-8cb6-8dcf86f37675", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "say", "name": "Say", @@ -800,6 +896,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "split-second-stopwatch", + "name": "Split-Second Stopwatch", + "uuid": "f35052c7-02ff-4786-91d6-e1065a90847e", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "transpose", "name": "Transpose", @@ -808,6 +912,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "two-bucket", + "name": "Two Bucket", + "uuid": "fa32f8ae-1032-4981-9fa6-5895a549f6a1", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "wordy", "name": "Wordy", @@ -822,70 +934,6 @@ "strings" ] }, - { - "slug": "allergies", - "name": "Allergies", - "uuid": "fd8a5055-deb0-4a06-a9d5-e6d2f7e2be23", - "practices": [], - "prerequisites": [], - "difficulty": 2 - }, - { - "slug": "circular-buffer", - "name": "Circular Buffer", - "uuid": "85672148-01f2-4c88-b859-5d9ecc5c1ada", - "practices": [], - "prerequisites": [], - "difficulty": 3 - }, - { - "slug": "sieve", - "name": "Sieve", - "uuid": "254aeab6-31e2-482b-9eb1-cca454e13705", - "practices": [], - "prerequisites": [], - "difficulty": 3 - }, - { - "slug": "secret-handshake", - "name": "Secret Handshake", - "uuid": "b66ba570-f586-4bf1-9cad-c2e7fdd24f65", - "practices": [], - "prerequisites": [], - "difficulty": 2 - }, - { - "slug": "hamming", - "name": "Hamming", - "uuid": "1bba0e52-fc79-40bc-9f5e-304ff5d86dc5", - "practices": [], - "prerequisites": [], - "difficulty": 2 - }, - { - "slug": "camicia", - "name": "Camicia", - "uuid": "3d899e5f-27eb-45bc-aa5e-4a844105f462", - "practices": [], - "prerequisites": [], - "difficulty": 5 - }, - { - "slug": "grade-school", - "name": "Grade School", - "uuid": "98f925a2-bc1c-4dc1-b2f4-d06941114250", - "practices": [], - "prerequisites": [], - "difficulty": 5 - }, - { - "slug": "relative-distance", - "name": "Relative Distance", - "uuid": "4060784f-e4ce-44dc-985a-328d190d4f94", - "practices": [], - "prerequisites": [], - "difficulty": 5 - }, { "slug": "change", "name": "Change", @@ -902,14 +950,6 @@ "prerequisites": [], "difficulty": 8 }, - { - "slug": "parallel-letter-frequency", - "name": "Parallel Letter Frequency", - "uuid": "5b856b54-c8be-4d90-be7c-60a441625fd0", - "practices": [], - "prerequisites": [], - "difficulty": 8 - }, { "slug": "minesweeper", "name": "Minesweeper", @@ -920,60 +960,20 @@ "status": "deprecated" }, { - "slug": "simple-linked-list", - "name": "Simple Linked List", - "uuid": "1c96f455-f1d5-4aa1-950c-6e60fc2b09ae", + "slug": "parallel-letter-frequency", + "name": "Parallel Letter Frequency", + "uuid": "5b856b54-c8be-4d90-be7c-60a441625fd0", "practices": [], "prerequisites": [], "difficulty": 8 }, { - "slug": "two-bucket", - "name": "Two Bucket", - "uuid": "fa32f8ae-1032-4981-9fa6-5895a549f6a1", - "practices": [], - "prerequisites": [], - "difficulty": 5 - }, - { - "slug": "all-your-base", - "name": "All Your Base", - "uuid": "b3bfbbd9-a0f4-4cbf-848b-f889bb0241a0", - "practices": [], - "prerequisites": [], - "difficulty": 3 - }, - { - "slug": "meetup", - "name": "Meetup", - "uuid": "398c1590-2e8f-445e-83cb-2b762be63b2b", - "practices": [], - "prerequisites": [], - "difficulty": 5 - }, - { - "slug": "knapsack", - "name": "Knapsack", - "uuid": "a385b861-22a5-4319-9fc0-c0228640ce26", - "practices": [], - "prerequisites": [], - "difficulty": 6 - }, - { - "slug": "satellite", - "name": "Satellite", - "uuid": "b09b1106-6ca1-49e2-8cb6-8dcf86f37675", - "practices": [], - "prerequisites": [], - "difficulty": 5 - }, - { - "slug": "split-second-stopwatch", - "name": "Split-Second Stopwatch", - "uuid": "f35052c7-02ff-4786-91d6-e1065a90847e", + "slug": "simple-linked-list", + "name": "Simple Linked List", + "uuid": "1c96f455-f1d5-4aa1-950c-6e60fc2b09ae", "practices": [], "prerequisites": [], - "difficulty": 5 + "difficulty": 8 } ] },