summary refs log tree commit diff stats
path: root/raku/anagram
diff options
context:
space:
mode:
authorAndinus <andinus@nand.sh>2021-08-11 15:26:15 +0530
committerAndinus <andinus@nand.sh>2021-08-11 15:26:15 +0530
commit321825828ac918bad28d0597a8616c6dc9802c3c (patch)
tree0b8e9cb1012197750eb58e972736319b2a6abac2 /raku/anagram
parent2979ef790ac5b8f58495e0dd08cafd6a3a2e30a5 (diff)
downloadexercism-321825828ac918bad28d0597a8616c6dc9802c3c.tar.gz
Add solved exercises
Diffstat (limited to 'raku/anagram')
-rw-r--r--raku/anagram/Anagram.rakumod8
-rw-r--r--raku/anagram/README.md31
-rw-r--r--raku/anagram/anagram.rakutest223
3 files changed, 262 insertions, 0 deletions
diff --git a/raku/anagram/Anagram.rakumod b/raku/anagram/Anagram.rakumod
new file mode 100644
index 0000000..5f67e65
--- /dev/null
+++ b/raku/anagram/Anagram.rakumod
@@ -0,0 +1,8 @@
+unit module Anagram;
+
+sub match-anagrams (Str :$subject!, :@candidates!) is export {
+    gather for @candidates {
+        next if .fc eq $subject.fc;
+        take $_ if .fc.comb.Bag eqv $subject.fc.comb.Bag;
+    }
+}
diff --git a/raku/anagram/README.md b/raku/anagram/README.md
new file mode 100644
index 0000000..ca11115
--- /dev/null
+++ b/raku/anagram/README.md
@@ -0,0 +1,31 @@
+# Anagram
+
+An anagram is a rearrangement of letters to form a new word.
+Given a word and a list of candidates, select the sublist of anagrams of the given word.
+
+Given `"listen"` and a list of candidates like `"enlists" "google"
+"inlets" "banana"` the program should return a list containing
+`"inlets"`.
+
+## Resources
+
+Remember to check out the Raku [documentation](https://docs.raku.org/) and
+[resources](https://raku.org/resources/) pages for information, tips, and
+examples if you get stuck.
+
+## Running the tests
+
+There is a test suite and module included with the exercise.
+The test suite (a file with the extension `.rakutest`) will attempt to run routines
+from the module (a file with the extension `.rakumod`).
+Add/modify routines in the module so that the tests will pass! You can view the
+test data by executing the command `raku --doc *.rakutest` (\* being the name of the
+test suite), and run the test suite for the exercise by executing the command
+`prove6 .` in the exercise directory.
+
+## Source
+
+Inspired by the Extreme Startup game [https://github.com/rchatley/extreme_startup](https://github.com/rchatley/extreme_startup)
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/raku/anagram/anagram.rakutest b/raku/anagram/anagram.rakutest
new file mode 100644
index 0000000..6aa62c6
--- /dev/null
+++ b/raku/anagram/anagram.rakutest
@@ -0,0 +1,223 @@
+#!/usr/bin/env raku
+use Test;
+use JSON::Fast;
+use lib $?FILE.IO.dirname;
+use Anagram;
+plan 14;
+
+my @test-cases = from-json($=pod.pop.contents).List;
+for @test-cases -> %case {
+  cmp-ok match-anagrams( |%case<input>:p ),
+    '~~', %case<expected>.Set, %case<description>;
+}
+
+=head2 Test Cases
+=begin code
+[
+  {
+    "description": "no matches",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "hello",
+        "world",
+        "zombies",
+        "pants"
+      ],
+      "subject": "diaper"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects two anagrams",
+    "expected": [
+      "stream",
+      "maters"
+    ],
+    "input": {
+      "candidates": [
+        "stream",
+        "pigeon",
+        "maters"
+      ],
+      "subject": "master"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "does not detect anagram subsets",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "dog",
+        "goody"
+      ],
+      "subject": "good"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects anagram",
+    "expected": [
+      "inlets"
+    ],
+    "input": {
+      "candidates": [
+        "enlists",
+        "google",
+        "inlets",
+        "banana"
+      ],
+      "subject": "listen"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects three anagrams",
+    "expected": [
+      "gallery",
+      "regally",
+      "largely"
+    ],
+    "input": {
+      "candidates": [
+        "gallery",
+        "ballerina",
+        "regally",
+        "clergy",
+        "largely",
+        "leading"
+      ],
+      "subject": "allergy"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects multiple anagrams with different case",
+    "expected": [
+      "Eons",
+      "ONES"
+    ],
+    "input": {
+      "candidates": [
+        "Eons",
+        "ONES"
+      ],
+      "subject": "nose"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "does not detect non-anagrams with identical checksum",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "last"
+      ],
+      "subject": "mass"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects anagrams case-insensitively",
+    "expected": [
+      "Carthorse"
+    ],
+    "input": {
+      "candidates": [
+        "cashregister",
+        "Carthorse",
+        "radishes"
+      ],
+      "subject": "Orchestra"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects anagrams using case-insensitive subject",
+    "expected": [
+      "carthorse"
+    ],
+    "input": {
+      "candidates": [
+        "cashregister",
+        "carthorse",
+        "radishes"
+      ],
+      "subject": "Orchestra"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "detects anagrams using case-insensitive possible matches",
+    "expected": [
+      "Carthorse"
+    ],
+    "input": {
+      "candidates": [
+        "cashregister",
+        "Carthorse",
+        "radishes"
+      ],
+      "subject": "orchestra"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "does not detect an anagram if the original word is repeated",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "go Go GO"
+      ],
+      "subject": "go"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "anagrams must use all letters exactly once",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "patter"
+      ],
+      "subject": "tapper"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "words are not anagrams of themselves (case-insensitive)",
+    "expected": [
+    ],
+    "input": {
+      "candidates": [
+        "BANANA",
+        "Banana",
+        "banana"
+      ],
+      "subject": "BANANA"
+    },
+    "property": "findAnagrams"
+  },
+  {
+    "description": "words other than themselves can be anagrams",
+    "expected": [
+      "Silent"
+    ],
+    "input": {
+      "candidates": [
+        "Listen",
+        "Silent",
+        "LISTEN"
+      ],
+      "subject": "LISTEN"
+    },
+    "property": "findAnagrams"
+  }
+]
+=end code