Skip to content

Commit

Permalink
isogram: add exercise to track (#595)
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas Polymeris authored and petertseng committed Sep 23, 2017
1 parent 7dc8cf2 commit 53a2299
Show file tree
Hide file tree
Showing 8 changed files with 193 additions and 0 deletions.
9 changes: 9 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,15 @@
"Maybe"
]
},
{
"uuid": "6eba4eac-6665-4ad6-ac21-3651a11ab4b4",
"slug": "isogram",
"core": false,
"unlocked_by": null,
"difficulty": 1,
"topics": [
]
},
{
"uuid": "85d77b8e-9b87-4d02-9fba-81f843bd66f1",
"slug": "rna-transcription",
Expand Down
73 changes: 73 additions & 0 deletions exercises/isogram/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Isogram

Determine if a word or phrase is an isogram.

An isogram (also known as a "nonpattern word") is a word or phrase without a repeating letter.

Examples of isograms:

- lumberjacks
- background
- downstream

The word *isograms*, however, is not an isogram, because the s repeats.


## Getting Started

For installation and learning resources, refer to the
[exercism help page](http://exercism.io/languages/haskell).

## Running the tests

To run the test suite, execute the following command:

```bash
stack test
```

#### If you get an error message like this...

```
No .cabal file found in directory
```

You are probably running an old stack version and need
to upgrade it.

#### Otherwise, if you get an error message like this...

```
No compiler found, expected minor version match with...
Try running "stack setup" to install the correct GHC...
```

Just do as it says and it will download and install
the correct compiler version:

```bash
stack setup
```

## Running *GHCi*

If you want to play with your solution in GHCi, just run the command:

```bash
stack ghci
```

## Feedback, Issues, Pull Requests

The [exercism/haskell](https://github.com/exercism/haskell) repository on
GitHub is the home for all of the Haskell exercises.

If you have feedback about an exercise, or want to help implementing a new
one, head over there and create an issue. We'll do our best to help you!

## Source

Wikipedia [https://en.wikipedia.org/wiki/Isogram](https://en.wikipedia.org/wiki/Isogram)

## Submitting Incomplete Solutions
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
16 changes: 16 additions & 0 deletions exercises/isogram/examples/success-standard/package.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: isogram

dependencies:
- base

library:
exposed-modules: Isogram
source-dirs: src

tests:
test:
main: Tests.hs
source-dirs: test
dependencies:
- isogram
- hspec
7 changes: 7 additions & 0 deletions exercises/isogram/examples/success-standard/src/Isogram.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module Isogram (isIsogram) where

import Data.Char (toLower, isLetter)
import Data.List (sort, group)

isIsogram :: String -> Bool
isIsogram = all ((1==) . length) . group . sort . filter isLetter . map toLower
20 changes: 20 additions & 0 deletions exercises/isogram/package.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: isogram
version: 1.1.0.1

dependencies:
- base

library:
exposed-modules: Isogram
source-dirs: src
dependencies:
# - foo # List here the packages you
# - bar # want to use in your solution.

tests:
test:
main: Tests.hs
source-dirs: test
dependencies:
- isogram
- hspec
4 changes: 4 additions & 0 deletions exercises/isogram/src/Isogram.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Isogram (isIsogram) where

isIsogram :: String -> Bool
isIsogram = error "You need to implement this function!"
1 change: 1 addition & 0 deletions exercises/isogram/stack.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
resolver: lts-8.21
63 changes: 63 additions & 0 deletions exercises/isogram/test/Tests.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{-# LANGUAGE RecordWildCards #-}

import Data.Foldable (for_)
import Test.Hspec (Spec, describe, it, shouldBe)
import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith)

import Isogram (isIsogram)

main :: IO ()
main = hspecWith defaultConfig {configFastFail = True} specs

specs :: Spec
specs = describe "isIsogram" $ for_ cases test
where

test Case{..} = it description assertion
where
assertion = isIsogram input `shouldBe` expected


data Case = Case { description :: String
, input :: String
, expected :: Bool
}

cases :: [Case]
cases = [ Case { description = "empty string"
, input = ""
, expected = True
}
, Case { description = "isogram with only lower case characters"
, input = "isogram"
, expected = True
}
, Case { description = "word with one duplicated character"
, input = "eleven"
, expected = False
}
, Case { description = "longest reported english isogram"
, input = "subdermatoglyphic"
, expected = True
}
, Case { description = "word with duplicated character in mixed case"
, input = "Alphabet"
, expected = False
}
, Case { description = "hypothetical isogrammic word with hyphen"
, input = "thumbscrew-japingly"
, expected = True
}
, Case { description = "isogram with duplicated non letter character"
, input = "Hjelmqvist-Gryb-Zock-Pfund-Wax"
, expected = True
}
, Case { description = "made-up name that is an isogram"
, input = "Emily Jung Schwartzkopf"
, expected = True
}
, Case { description = "duplicated character in the middle"
, input = "accentor"
, expected = False
}
]

0 comments on commit 53a2299

Please sign in to comment.