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 e51f5ed1..4e6708dc 100644 --- a/config.json +++ b/config.json @@ -150,14 +150,6 @@ "math" ] }, - { - "slug": "dnd-character", - "name": "D&D Character", - "uuid": "eb38bf54-c597-4856-bf1d-3867d75ae586", - "practices": [], - "prerequisites": [], - "difficulty": 4 - }, { "slug": "eliuds-eggs", "name": "Eliud's Eggs", @@ -188,17 +180,12 @@ "difficulty": 2 }, { - "slug": "grains", - "name": "Grains", - "uuid": "99408193-d0ce-4c68-8cab-e680f3ed56a4", + "slug": "food-chain", + "name": "Food Chain", + "uuid": "adf3945f-6735-471c-b02b-b3dac0aab1bc", "practices": [], "prerequisites": [], - "difficulty": 5, - "topics": [ - "math", - "strings", - "loops" - ] + "difficulty": 3 }, { "slug": "hello-world", @@ -279,14 +266,6 @@ "prerequisites": [], "difficulty": 2 }, - { - "slug": "luhn", - "name": "Luhn", - "uuid": "e2020329-442d-45da-ac89-ff15eade794e", - "practices": [], - "prerequisites": [], - "difficulty": 2 - }, { "slug": "list-ops", "name": "List Ops", @@ -295,6 +274,14 @@ "prerequisites": [], "difficulty": 3 }, + { + "slug": "luhn", + "name": "Luhn", + "uuid": "e2020329-442d-45da-ac89-ff15eade794e", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "matrix", "name": "Matrix", @@ -362,6 +349,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "protein-translation", + "name": "Protein Translation", + "uuid": "4d510ad3-4d37-491a-99c6-892fbe5bd095", + "practices": [], + "prerequisites": [], + "difficulty": 3 + }, { "slug": "proverb", "name": "Proverb", @@ -371,9 +366,9 @@ "difficulty": 2 }, { - "slug": "protein-translation", - "name": "Protein Translation", - "uuid": "4d510ad3-4d37-491a-99c6-892fbe5bd095", + "slug": "queen-attack", + "name": "Queen Attack", + "uuid": "c728a685-1b4e-4d77-9273-6ee42ca4fb0e", "practices": [], "prerequisites": [], "difficulty": 3 @@ -431,14 +426,6 @@ "prerequisites": [], "difficulty": 1 }, - { - "slug": "run-length-encoding", - "name": "Run-Length Encoding", - "uuid": "1024a826-2f71-4833-9e96-59e0b0156f26", - "practices": [], - "prerequisites": [], - "difficulty": 3 - }, { "slug": "robot-name", "name": "Robot Name", @@ -475,6 +462,14 @@ "prerequisites": [], "difficulty": 3 }, + { + "slug": "run-length-encoding", + "name": "Run-Length Encoding", + "uuid": "1024a826-2f71-4833-9e96-59e0b0156f26", + "practices": [], + "prerequisites": [], + "difficulty": 3 + }, { "slug": "saddle-points", "name": "Saddle Points", @@ -528,6 +523,14 @@ "prerequisites": [], "difficulty": 3 }, + { + "slug": "square-root", + "name": "Square Root", + "uuid": "5dc9081a-e537-471f-800b-5b0e0aab3742", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "state-of-tic-tac-toe", "name": "State of Tic-Tac-Toe", @@ -544,14 +547,6 @@ "prerequisites": [], "difficulty": 3 }, - { - "slug": "square-root", - "name": "Square Root", - "uuid": "5dc9081a-e537-471f-800b-5b0e0aab3742", - "practices": [], - "prerequisites": [], - "difficulty": 2 - }, { "slug": "sublist", "name": "Sublist", @@ -605,14 +600,6 @@ "prerequisites": [], "difficulty": 2 }, - { - "slug": "queen-attack", - "name": "Queen Attack", - "uuid": "c728a685-1b4e-4d77-9273-6ee42ca4fb0e", - "practices": [], - "prerequisites": [], - "difficulty": 3 - }, { "slug": "word-count", "name": "Word Count", @@ -633,6 +620,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "all-your-base", + "name": "All Your Base", + "uuid": "a489b452-cf01-4670-bfe4-ccfeac57b466", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "allergies", "name": "Allergies", @@ -645,14 +640,6 @@ "sorting" ] }, - { - "slug": "all-your-base", - "name": "All Your Base", - "uuid": "a489b452-cf01-4670-bfe4-ccfeac57b466", - "practices": [], - "prerequisites": [], - "difficulty": 5 - }, { "slug": "anagram", "name": "Anagram", @@ -699,6 +686,14 @@ "prerequisites": [], "difficulty": 4 }, + { + "slug": "dnd-character", + "name": "D&D Character", + "uuid": "eb38bf54-c597-4856-bf1d-3867d75ae586", + "practices": [], + "prerequisites": [], + "difficulty": 4 + }, { "slug": "diamond", "name": "Diamond", @@ -723,6 +718,19 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "grains", + "name": "Grains", + "uuid": "99408193-d0ce-4c68-8cab-e680f3ed56a4", + "practices": [], + "prerequisites": [], + "difficulty": 5, + "topics": [ + "math", + "strings", + "loops" + ] + }, { "slug": "hamming", "name": "Hamming", @@ -845,14 +853,6 @@ "practices": [], "prerequisites": [], "difficulty": 6 - }, - { - "slug": "food-chain", - "name": "Food Chain", - "uuid": "adf3945f-6735-471c-b02b-b3dac0aab1bc", - "practices": [], - "prerequisites": [], - "difficulty": 3 } ], "foregone": [