diff --git a/config.json b/config.json index 88579567d..6fa1520c8 100644 --- a/config.json +++ b/config.json @@ -114,6 +114,14 @@ "difficulty": 2, "topics": null }, + { + "slug": "reverse-string", + "name": "Reverse String", + "uuid": "58c93fbe-5c57-41d0-9085-6007a488aaca", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "rna-transcription", "name": "RNA Transcription", diff --git a/exercises/practice/reverse-string/.docs/instructions.md b/exercises/practice/reverse-string/.docs/instructions.md new file mode 100644 index 000000000..039ee33ae --- /dev/null +++ b/exercises/practice/reverse-string/.docs/instructions.md @@ -0,0 +1,7 @@ +# Instructions + +Reverse a string + +For example: +input: "cool" +output: "looc" diff --git a/exercises/practice/reverse-string/.meta/config.json b/exercises/practice/reverse-string/.meta/config.json new file mode 100644 index 000000000..fb81362b1 --- /dev/null +++ b/exercises/practice/reverse-string/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "reverse_string.ml" + ], + "test": [ + "test.ml" + ], + "example": [ + ".meta/example.ml" + ] + }, + "blurb": "Reverse a string.", + "source": "Introductory challenge to reverse an input string", + "source_url": "https://medium.freecodecamp.org/how-to-reverse-a-string-in-javascript-in-3-different-ways-75e4763c68cb" +} diff --git a/exercises/practice/reverse-string/.meta/example.ml b/exercises/practice/reverse-string/.meta/example.ml new file mode 100644 index 000000000..ae7ca81b9 --- /dev/null +++ b/exercises/practice/reverse-string/.meta/example.ml @@ -0,0 +1,3 @@ +let reverse_string str = + let len = String.length str in + String.init len (fun i -> str.[len - 1 - i]) \ No newline at end of file diff --git a/exercises/practice/reverse-string/.meta/tests.toml b/exercises/practice/reverse-string/.meta/tests.toml new file mode 100644 index 000000000..0b04c4cd7 --- /dev/null +++ b/exercises/practice/reverse-string/.meta/tests.toml @@ -0,0 +1,28 @@ +# 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" + +[01ebf55b-bebb-414e-9dec-06f7bb0bee3c] +description = "a word" + +[0f7c07e4-efd1-4aaa-a07a-90b49ce0b746] +description = "a capitalized word" + +[71854b9c-f200-4469-9f5c-1e8e5eff5614] +description = "a sentence with punctuation" + +[1f8ed2f3-56f3-459b-8f3e-6d8d654a1f6c] +description = "a palindrome" + +[b9e7dec1-c6df-40bd-9fa3-cd7ded010c4c] +description = "an even-sized word" diff --git a/exercises/practice/reverse-string/Makefile b/exercises/practice/reverse-string/Makefile new file mode 100644 index 000000000..b71d6af2d --- /dev/null +++ b/exercises/practice/reverse-string/Makefile @@ -0,0 +1,9 @@ +default: clean test + +test: + dune runtest + +clean: + dune clean + +.PHONY: clean diff --git a/exercises/practice/reverse-string/dune b/exercises/practice/reverse-string/dune new file mode 100644 index 000000000..28aeac0a3 --- /dev/null +++ b/exercises/practice/reverse-string/dune @@ -0,0 +1,16 @@ +(executable + (name test) + (libraries base ounit2)) + +(alias + (name runtest) + (deps (:x test.exe)) + (action (run %{x}))) + +(alias + (name buildtest) + (deps (:x test.exe))) + +(env + (dev + (flags (:standard -warn-error -A)))) \ No newline at end of file diff --git a/exercises/practice/reverse-string/dune-project b/exercises/practice/reverse-string/dune-project new file mode 100644 index 000000000..7655de077 --- /dev/null +++ b/exercises/practice/reverse-string/dune-project @@ -0,0 +1 @@ +(lang dune 1.1) diff --git a/exercises/practice/reverse-string/reverse_string.ml b/exercises/practice/reverse-string/reverse_string.ml new file mode 100644 index 000000000..09001c42e --- /dev/null +++ b/exercises/practice/reverse-string/reverse_string.ml @@ -0,0 +1,2 @@ +let reverse_string _ = + failwith "'reverse_string' is missing" diff --git a/exercises/practice/reverse-string/reverse_string.mli b/exercises/practice/reverse-string/reverse_string.mli new file mode 100644 index 000000000..89c6a54f5 --- /dev/null +++ b/exercises/practice/reverse-string/reverse_string.mli @@ -0,0 +1 @@ +val reverse_string : string -> string \ No newline at end of file diff --git a/exercises/practice/reverse-string/test.ml b/exercises/practice/reverse-string/test.ml new file mode 100644 index 000000000..ecba01afc --- /dev/null +++ b/exercises/practice/reverse-string/test.ml @@ -0,0 +1,23 @@ +open Base +open OUnit2 +open Reverse_string + +let ae exp got _test_ctxt = assert_equal exp got ~printer:Fn.id + +let tests = [ + "an empty string" >:: + ae "" (reverse_string ""); + "a word" >:: + ae "tobor" (reverse_string "robot"); + "a capitalized word" >:: + ae "nemaR" (reverse_string "Ramen"); + "a sentence with punctuation" >:: + ae "!yrgnuh m'I" (reverse_string "I'm hungry!"); + "a palindrome" >:: + ae "racecar" (reverse_string "racecar"); + "an even-sized word" >:: + ae "reward" (reverse_string "drawer"); +] + +let () = + run_test_tt_main ("reverse-string tests" >::: tests) diff --git a/templates/reverse-string/dune-project.tpl b/templates/reverse-string/dune-project.tpl new file mode 100644 index 000000000..7655de077 --- /dev/null +++ b/templates/reverse-string/dune-project.tpl @@ -0,0 +1 @@ +(lang dune 1.1) diff --git a/templates/reverse-string/test.ml.tpl b/templates/reverse-string/test.ml.tpl new file mode 100644 index 000000000..ef8490296 --- /dev/null +++ b/templates/reverse-string/test.ml.tpl @@ -0,0 +1,15 @@ +open Base +open OUnit2 +open Reverse_string + +let ae exp got _test_ctxt = assert_equal exp got ~printer:Fn.id + +let tests = [ +{{#cases}} + "{{description}}" >:: + ae {{#input}}{{expected}} (reverse_string {{value}}){{/input}}; + {{/cases}} +] + +let () = + run_test_tt_main ("reverse-string tests" >::: tests)