Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Reverse String.

Reverse a string by iterating its Unicode codepoints in reverse order.

Algorithm — O(n) time and space.

  1. Collect all codepoints into a list.
  2. Iterate from the last index down to 0, appending each codepoint to a result String.

Example:

reverse("abc")  →  "cba"
reverse("")     →  ""
from std.testing import assert_equal, TestSuite


# ═══════════════════════════════════════════════════════════════
#  Implementation
# ═══════════════════════════════════════════════════════════════

def reverse(s: String) -> String:
    """Return `s` with its Unicode codepoints reversed.

    Works on full Unicode codepoints (not raw bytes), so multi-byte
    characters are preserved correctly.
    """
    var codepoints = List[Codepoint](capacity=s.count_codepoints())
    for code in s.codepoints():
        codepoints.append(code)

    if len(codepoints) == 0 or len(codepoints) == 1:
        return s

    var result = String()
    for i in range(len(codepoints) - 1, -1, -1):
        result.append(codepoints[i])

    return result


# ═══════════════════════════════════════════════════════════════
#  Tests
# ═══════════════════════════════════════════════════════════════

def test_empty_string() raises:
    assert_equal(reverse(""), "")


def test_single_char() raises:
    assert_equal(reverse("a"), "a")


def test_two_chars() raises:
    assert_equal(reverse("ab"), "ba")


def test_three_chars() raises:
    assert_equal(reverse("abc"), "cba")


def test_palindrome() raises:
    assert_equal(reverse("racecar"), "racecar")


def test_with_spaces() raises:
    assert_equal(reverse("hello world"), "dlrow olleh")


def test_unicode_multi_byte() raises:
    assert_equal(reverse("café"), "éfac")


def test_unicode_emoji() raises:
    assert_equal(reverse("a😊b"), "b😊a")


def test_numbers_and_symbols() raises:
    assert_equal(reverse("123!@#"), "#@!321")


def test_reverse_twice_returns_original() raises:
    var original = "Hello, 世界! 😊"
    assert_equal(reverse(reverse(original)), original)


def main() raises:
    TestSuite.discover_tests[__functions_in_module()]().run()

View source on GitHub