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 0000000000..68688e11fa --- /dev/null +++ b/exercises/practice/reverse-string/.docs/instructions.append.md @@ -0,0 +1,6 @@ + +~~~exercism/advanced +If you solve this using the CLI, there are test cases that require you to deal with complex characters. +You can optionally enable these tests by removing `.skip` from the test. +~~~ + diff --git a/exercises/practice/reverse-string/.meta/config.json b/exercises/practice/reverse-string/.meta/config.json index a0e872621d..fe20dbd355 100644 --- a/exercises/practice/reverse-string/.meta/config.json +++ b/exercises/practice/reverse-string/.meta/config.json @@ -5,6 +5,7 @@ "contributors": [ "ankorGH", "d-vail", + "jagdish-15", "ovidiu141", "SleeplessByte" ], diff --git a/exercises/practice/reverse-string/.meta/proof.ci.js b/exercises/practice/reverse-string/.meta/proof.ci.js index 6cf696edca..68631c5aaa 100644 --- a/exercises/practice/reverse-string/.meta/proof.ci.js +++ b/exercises/practice/reverse-string/.meta/proof.ci.js @@ -1,7 +1,11 @@ export const reverseString = (string) => { let revString = ''; - for (let i = string.length - 1; i >= 0; i -= 1) { - revString += string[i]; + let characters = Array.from( + new Intl.Segmenter().segment(String(string)), + (x) => x.segment, + ); + for (let i = characters.length - 1; i >= 0; i--) { + revString += characters[i]; } return revString; }; diff --git a/exercises/practice/reverse-string/.meta/tests.toml b/exercises/practice/reverse-string/.meta/tests.toml index 2113a53364..0c313cc537 100644 --- a/exercises/practice/reverse-string/.meta/tests.toml +++ b/exercises/practice/reverse-string/.meta/tests.toml @@ -1,6 +1,13 @@ -# This is an auto-generated file. Regular comments will be removed when this -# file is regenerated. Regenerating will not touch any manually added keys, -# so comments can be added in a "comment" key. +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. [c3b7d806-dced-49ee-8543-933fd1719b1c] description = "an empty string" @@ -19,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.spec.js b/exercises/practice/reverse-string/reverse-string.spec.js index ae4e746827..55e5af912a 100644 --- a/exercises/practice/reverse-string/reverse-string.spec.js +++ b/exercises/practice/reverse-string/reverse-string.spec.js @@ -37,4 +37,22 @@ describe('ReverseString', () => { const actual = reverseString('drawer'); expect(actual).toEqual(expected); }); + + xtest('wide characters', () => { + const expected = '猫子'; + const actual = reverseString('子猫'); + expect(actual).toEqual(expected); + }); + + test.skip('grapheme cluster with pre-combined form', () => { + const expected = 'dnatsnehctsrüW'; + const actual = reverseString('Würstchenstand'); + expect(actual).toEqual(expected); + }); + + test.skip('grapheme clusters', () => { + const expected = 'มรกแรปโนยขีเผู้'; + const actual = reverseString('ผู้เขียนโปรแกรม'); + expect(actual).toEqual(expected); + }); });