diff --git a/exercises/practice/reverse-string/.docs/instructions.append.md b/exercises/practice/reverse-string/.docs/instructions.append.md new file mode 100644 index 0000000..73cdbb6 --- /dev/null +++ b/exercises/practice/reverse-string/.docs/instructions.append.md @@ -0,0 +1,14 @@ +# Instructions append + +## Handling grapheme clusters + +- The [built-in `RegEx` class][regex] can be used to find grapheme clusters. +- The regular expression pattern `\X` matches grapheme clusters. +- Backslashes (`\` characters) need to be escaped in regular strings (`"\\X"`), but not in [raw strings][literals] (`r"\X"`). +- `RegEx` has a [method][search_all] that returns an array of `RegExMatch`es. +- Each match object has [a method][get_string] that returns the search result as a string. + +[regex]: https://docs.godotengine.org/en/stable/classes/class_regex.html +[literals]: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#literals +[search_all]: https://docs.godotengine.org/en/stable/classes/class_regex.html#class-regex-method-search-all +[get_string]: https://docs.godotengine.org/en/stable/classes/class_regexmatch.html#class-regexmatch-method-get-string \ No newline at end of file diff --git a/exercises/practice/reverse-string/.docs/instructions.md b/exercises/practice/reverse-string/.docs/instructions.md index 039ee33..0ff4198 100644 --- a/exercises/practice/reverse-string/.docs/instructions.md +++ b/exercises/practice/reverse-string/.docs/instructions.md @@ -1,7 +1,9 @@ # Instructions -Reverse a string +Your task is to reverse a given string. -For example: -input: "cool" -output: "looc" +Some examples: + +- Turn `"stressed"` into `"desserts"`. +- Turn `"strops"` into `"sports"`. +- Turn `"racecar"` into `"racecar"`. diff --git a/exercises/practice/reverse-string/.docs/introduction.md b/exercises/practice/reverse-string/.docs/introduction.md new file mode 100644 index 0000000..02233e0 --- /dev/null +++ b/exercises/practice/reverse-string/.docs/introduction.md @@ -0,0 +1,5 @@ +# Introduction + +Reversing strings (reading them from right to left, rather than from left to right) is a surprisingly common task in programming. + +For example, in bioinformatics, reversing the sequence of DNA or RNA strings is often important for various analyses, such as finding complementary strands or identifying palindromic sequences that have biological significance. diff --git a/exercises/practice/reverse-string/.meta/example.gd b/exercises/practice/reverse-string/.meta/example.gd index 1c56828..364b371 100644 --- a/exercises/practice/reverse-string/.meta/example.gd +++ b/exercises/practice/reverse-string/.meta/example.gd @@ -1,5 +1,5 @@ -func reverse(str): - var result = "" - for i in range(str.length() - 1, -1, -1): - result += str[i] - return result +func reverse(original): + var regex = RegEx.create_from_string("\\X") + var clusters = regex.search_all(original).map(func(m): return m.get_string()) + clusters.reverse() + return "".join(clusters) diff --git a/exercises/practice/reverse-string/.meta/tests.toml b/exercises/practice/reverse-string/.meta/tests.toml index 0b04c4c..0c313cc 100644 --- a/exercises/practice/reverse-string/.meta/tests.toml +++ b/exercises/practice/reverse-string/.meta/tests.toml @@ -26,3 +26,12 @@ description = "a palindrome" [b9e7dec1-c6df-40bd-9fa3-cd7ded010c4c] description = "an even-sized word" + +[1bed0f8a-13b0-4bd3-9d59-3d0593326fa2] +description = "wide characters" + +[93d7e1b8-f60f-4f3c-9559-4056e10d2ead] +description = "grapheme cluster with pre-combined form" + +[1028b2c1-6763-4459-8540-2da47ca512d9] +description = "grapheme clusters" diff --git a/exercises/practice/reverse-string/reverse_string_test.gd b/exercises/practice/reverse-string/reverse_string_test.gd index a5e98a2..7588e3c 100644 --- a/exercises/practice/reverse-string/reverse_string_test.gd +++ b/exercises/practice/reverse-string/reverse_string_test.gd @@ -1,34 +1,52 @@ -func test_empty_string(solution_script): - var str = "" +func test_empty_originaling(solution_script): + var original = "" var expected = "" - return [solution_script.reverse(str), expected] + return [solution_script.reverse(original), expected] func test_a_word(solution_script): - var str = "robot" + var original = "robot" var expected = "tobor" - return [solution_script.reverse(str), expected] + return [solution_script.reverse(original), expected] func test_a_capitalized_word(solution_script): - var str = "Ramen" + var original = "Ramen" var expected = "nemaR" - return [solution_script.reverse(str), expected] + return [solution_script.reverse(original), expected] func test_a_sentence_with_punctuation(solution_script): - var str = "I'm hungry!" + var original = "I'm hungry!" var expected = "!yrgnuh m'I" - return [solution_script.reverse(str), expected] + return [solution_script.reverse(original), expected] func test_a_palindrome(solution_script): - var str = "racecar" + var original = "racecar" var expected = "racecar" - return [solution_script.reverse(str), expected] + return [solution_script.reverse(original), expected] func test_an_even_sized_word(solution_script): - var str = "drawer" + var original = "drawer" var expected = "reward" - return [solution_script.reverse(str), expected] + return [solution_script.reverse(original), expected] + + +func test_wide_characters(solution_script): + var original = "子猫" + var expected = "猫子" + return [solution_script.reverse(original), expected] + + +func test_grapheme_cluster_with_pre_combined_form(solution_script): + var original = "Würstchenstand" + var expected = "dnatsnehctsrüW" + return [solution_script.reverse(original), expected] + + +func test_grapheme_clusters(solution_script): + var original = "ผู้เขียนโปรแกรม" + var expected = "มรกแรปโนยขีเผู้" + return [solution_script.reverse(original), expected]