Skip to content

Commit

Permalink
Rust: Reverse string
Browse files Browse the repository at this point in the history
  • Loading branch information
Vourhey committed Dec 25, 2018
1 parent b0096f0 commit 27d464c
Show file tree
Hide file tree
Showing 6 changed files with 173 additions and 0 deletions.
1 change: 1 addition & 0 deletions rust/reverse-string/.exercism/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"track":"rust","exercise":"reverse-string","id":"82c52b61e787444bbf390a9725b2caf7","url":"https://exercism.io/my/solutions/82c52b61e787444bbf390a9725b2caf7","handle":"Vourhey","is_requester":true,"auto_approve":false}
8 changes: 8 additions & 0 deletions rust/reverse-string/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Generated by Cargo
# will have compiled files and executables
/target/
**/*.rs.bk

# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
Cargo.lock
11 changes: 11 additions & 0 deletions rust/reverse-string/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[dependencies]
unicode-segmentation = "0.1.2"

[features]
grapheme = []


[package]
edition = "2018"
name = "reverse_string"
version = "1.1.0"
79 changes: 79 additions & 0 deletions rust/reverse-string/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Reverse String

Reverse a string

For example:
input: "cool"
output: "looc"

## Bonus
Test your function on this string: `uüu` and see what happens. Try to write a function that properly
reverses this string. Hint: grapheme clusters

To get the bonus test to run, remove the ignore flag (`#[ignore]`) from the
last test, and execute the tests with:

```bash
$ cargo test --features grapheme
```


## Rust Installation

Refer to the [exercism help page][help-page] for Rust installation and learning
resources.

## Writing the Code

Execute the tests with:

```bash
$ cargo test
```

All but the first test have been ignored. After you get the first test to
pass, open the tests source file which is located in the `tests` directory
and remove the `#[ignore]` flag from the next test and get the tests to pass
again. Each separate test is a function with `#[test]` flag above it.
Continue, until you pass every test.

If you wish to run all tests without editing the tests source file, use:

```bash
$ cargo test -- --ignored
```

To run a specific test, for example `some_test`, you can use:

```bash
$ cargo test some_test
```

If the specific test is ignored use:

```bash
$ cargo test some_test -- --ignored
```

To learn more about Rust tests refer to the [online test documentation][rust-tests]

Make sure to read the [Modules](https://doc.rust-lang.org/book/ch07-02-modules-and-use-to-control-scope-and-privacy.html) chapter if you
haven't already, it will help you with organizing your files.

## Feedback, Issues, Pull Requests

The [exercism/rust](https://github.com/exercism/rust) repository on GitHub is the home for all of the Rust exercises. If you have feedback about an exercise, or want to help implement new exercises, head over there and create an issue. Members of the rust track team are happy to help!

If you want to know more about Exercism, take a look at the [contribution guide](https://github.com/exercism/docs/blob/master/contributing-to-language-tracks/README.md).

[help-page]: https://exercism.io/tracks/rust/learning
[modules]: https://doc.rust-lang.org/book/ch07-02-modules-and-use-to-control-scope-and-privacy.html
[cargo]: https://doc.rust-lang.org/book/ch14-00-more-about-cargo.html
[rust-tests]: https://doc.rust-lang.org/book/ch11-02-running-tests.html

## Source

Introductory challenge to reverse an input string [https://medium.freecodecamp.org/how-to-reverse-a-string-in-javascript-in-3-different-ways-75e4763c68cb](https://medium.freecodecamp.org/how-to-reverse-a-string-in-javascript-in-3-different-ways-75e4763c68cb)

## Submitting Incomplete Solutions
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
12 changes: 12 additions & 0 deletions rust/reverse-string/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
extern crate unicode_segmentation;
use unicode_segmentation::UnicodeSegmentation;

pub fn reverse(input: &str) -> String {
let drow: String = input
.graphemes(true)
.rev()
.flat_map(|g| g.chars())
.collect();

drow
}
62 changes: 62 additions & 0 deletions rust/reverse-string/tests/reverse-string.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//! Tests for reverse-string
//!
//! Generated by [script][script] using [canonical data][canonical-data]
//!
//! [script]: https://github.com/exercism/rust/blob/b829ce2/bin/init_exercise.py
//! [canonical-data]: https://raw.githubusercontent.com/exercism/problem-specifications/master/exercises/reverse-string/canonical_data.json
use reverse_string::*;

/// Process a single test case for the property `reverse`
fn process_reverse_case(input: &str, expected: &str) {
assert_eq!(&reverse(input), expected)
}

#[test]
/// empty string
fn test_an_empty_string() {
process_reverse_case("", "");
}

#[test]

/// a word
fn test_a_word() {
process_reverse_case("robot", "tobor");
}

#[test]

/// a capitalized word
fn test_a_capitalized_word() {
process_reverse_case("Ramen", "nemaR");
}

#[test]

/// a sentence with punctuation
fn test_a_sentence_with_punctuation() {
process_reverse_case("I'm hungry!", "!yrgnuh m'I");
}

#[test]

/// a palindrome
fn test_a_palindrome() {
process_reverse_case("racecar", "racecar");
}

#[test]

/// wide characters
fn test_wide_characters() {
process_reverse_case("子猫", "猫子");
}

#[test]

#[cfg(feature = "grapheme")]
/// grapheme clusters
fn test_grapheme_clusters() {
process_reverse_case("uüu", "uüu");
}

0 comments on commit 27d464c

Please sign in to comment.