Skip to content

Commit

Permalink
Add isogram exercise (#366)
Browse files Browse the repository at this point in the history
  • Loading branch information
keiravillekode authored May 5, 2024
1 parent 8836787 commit 122c82e
Show file tree
Hide file tree
Showing 7 changed files with 205 additions and 0 deletions.
12 changes: 12 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,18 @@
"strings"
]
},
{
"slug": "isogram",
"name": "Isogram",
"uuid": "63fc7e59-2448-487b-9b66-06c72ab8d6b0",
"practices": [],
"prerequisites": [],
"difficulty": 2,
"topics": [
"control_flow_loops",
"strings"
]
},
{
"slug": "leap",
"name": "Leap",
Expand Down
14 changes: 14 additions & 0 deletions exercises/practice/isogram/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Instructions

Determine if a word or phrase is an isogram.

An isogram (also known as a "non-pattern word") is a word or phrase without a repeating letter, however spaces and hyphens are allowed to appear multiple times.

Examples of isograms:

- lumberjacks
- background
- downstream
- six-year-old

The word _isograms_, however, is not an isogram, because the s repeats.
19 changes: 19 additions & 0 deletions exercises/practice/isogram/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"keiravillekode"
],
"files": {
"solution": [
"isogram.el"
],
"test": [
"isogram-test.el"
],
"example": [
".meta/example.el"
]
},
"blurb": "Determine if a word or phrase is an isogram.",
"source": "Wikipedia",
"source_url": "https://en.wikipedia.org/wiki/Isogram"
}
27 changes: 27 additions & 0 deletions exercises/practice/isogram/.meta/example.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
;;; isogram.el --- isogram (exercism) -*- lexical-binding: t; -*-

;;; Commentary:

;;; Code:

(require 'cl-lib)

(defun upper-char-p (c)
"Determine if char C is alphabetic and upper case."
(and
(>= c ?A)
(<= c ?Z)))

(defun isogramp (phrase)
"Determine if a given phrase is an isogram."
(let* ((bitset 0)
(updated 0)
(characters (cl-coerce (upcase phrase) 'list))
(letters (cl-remove-if-not 'upper-char-p characters)))
(cl-loop for c in letters
do (setq updated (logior bitset (lsh 1 (- c ?A))))
always (> updated bitset)
do (setq bitset updated))))

(provide 'isogram)
;;; isogram.el ends here
52 changes: 52 additions & 0 deletions exercises/practice/isogram/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# 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.

[a0e97d2d-669e-47c7-8134-518a1e2c4555]
description = "empty string"

[9a001b50-f194-4143-bc29-2af5ec1ef652]
description = "isogram with only lower case characters"

[8ddb0ca3-276e-4f8b-89da-d95d5bae78a4]
description = "word with one duplicated character"

[6450b333-cbc2-4b24-a723-0b459b34fe18]
description = "word with one duplicated character from the end of the alphabet"

[a15ff557-dd04-4764-99e7-02cc1a385863]
description = "longest reported english isogram"

[f1a7f6c7-a42f-4915-91d7-35b2ea11c92e]
description = "word with duplicated character in mixed case"

[14a4f3c1-3b47-4695-b645-53d328298942]
description = "word with duplicated character in mixed case, lowercase first"

[423b850c-7090-4a8a-b057-97f1cadd7c42]
description = "hypothetical isogrammic word with hyphen"

[93dbeaa0-3c5a-45c2-8b25-428b8eacd4f2]
description = "hypothetical word with duplicated character following hyphen"

[36b30e5c-173f-49c6-a515-93a3e825553f]
description = "isogram with duplicated hyphen"

[cdabafa0-c9f4-4c1f-b142-689c6ee17d93]
description = "made-up name that is an isogram"

[5fc61048-d74e-48fd-bc34-abfc21552d4d]
description = "duplicated character in the middle"

[310ac53d-8932-47bc-bbb4-b2b94f25a83e]
description = "same first and last characters"

[0d0b8644-0a1e-4a31-a432-2b3ee270d847]
description = "word with duplicated character and with two hyphens"
68 changes: 68 additions & 0 deletions exercises/practice/isogram/isogram-test.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
;;; isogram-test.el --- Tests for Isogram (exercism) -*- lexical-binding: t; -*-

;;; Commentary:

;;; Code:

(load-file "isogram.el")
(declare-function isogramp "isogram.el" (phrase))


(ert-deftest empty-string ()
(should (isogramp "")))


(ert-deftest isogram-with-only-lower-case-characters ()
(should (isogramp "isogram")))


(ert-deftest word-with-one-duplicated-character ()
(should-not (isogramp "eleven")))


(ert-deftest word-with-one-duplicated-character-from-the-end-of-the-alphabet ()
(should-not (isogramp "zzyzx")))


(ert-deftest longest-reported-english-isogram ()
(should (isogramp "subdermatoglyphic")))


(ert-deftest word-with-duplicated-character-in-mixed-case ()
(should-not (isogramp "Alphabet")))


(ert-deftest word-with-duplicated-character-in-mixed-case-lowercase-first ()
(should-not (isogramp "alphAbet")))


(ert-deftest hypothetical-isogrammic-word-with-hyphen ()
(should (isogramp "thumbscrew-japingly")))


(ert-deftest hypothetical-word-with-duplicated-character-following-hyphen ()
(should-not (isogramp "thumbscrew-jappingly")))


(ert-deftest isogram-with-duplicated-hyphen ()
(should (isogramp "six-year-old")))


(ert-deftest made-up-name-that-is-an-isogram ()
(should (isogramp "Emily Jung Schwartzkopf")))


(ert-deftest duplicated-character-in-the-middle ()
(should-not (isogramp "accentor")))


(ert-deftest same-first-and-last-characters ()
(should-not (isogramp "angola")))


(ert-deftest word-with-duplicated-character-and-with-two-hyphens ()
(should-not (isogramp "up-to-date")))


(provide 'isogram-test)
;;; isogram-test.el ends here
13 changes: 13 additions & 0 deletions exercises/practice/isogram/isogram.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
;;; isogram.el --- isogram (exercism) -*- lexical-binding: t; -*-

;;; Commentary:

;;; Code:


(defun isogramp (phrase)
(error "Delete this S-Expression and write your own implementation"))


(provide 'isogram)
;;; isogram.el ends here

0 comments on commit 122c82e

Please sign in to comment.