mirror of
https://github.com/correl/elm.git
synced 2024-12-22 19:17:27 +00:00
Elm: isograms
This commit is contained in:
parent
b4c2346263
commit
3c93d1f54c
8 changed files with 219 additions and 0 deletions
10
config.json
10
config.json
|
@ -332,6 +332,16 @@
|
|||
"Lists",
|
||||
"Control-flow"
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": "5f540090-061e-2f80-40a8-d9782700ed2efdf8965",
|
||||
"slug": "isogram",
|
||||
"core": false,
|
||||
"unlocked_by": null,
|
||||
"difficulty": 3,
|
||||
"topics": [
|
||||
"Lists"
|
||||
]
|
||||
}
|
||||
],
|
||||
"foregone": [
|
||||
|
|
1
exercises/isogram/Isogram.elm
Normal file
1
exercises/isogram/Isogram.elm
Normal file
|
@ -0,0 +1 @@
|
|||
module Isogram exposing (..)
|
76
exercises/isogram/Isogram.example.elm
Normal file
76
exercises/isogram/Isogram.example.elm
Normal file
|
@ -0,0 +1,76 @@
|
|||
module Isogram exposing (isIsogram)
|
||||
|
||||
import String
|
||||
import List
|
||||
import Char
|
||||
|
||||
|
||||
isLetter : Char -> Bool
|
||||
isLetter c =
|
||||
Char.isHexDigit c && (not <| Char.isDigit c)
|
||||
|
||||
|
||||
isIsogram : String -> Bool
|
||||
isIsogram sentence =
|
||||
let
|
||||
sanitized =
|
||||
String.filter isLetter sentence
|
||||
|> String.toLower
|
||||
|> String.toList
|
||||
|> List.sort
|
||||
|> group
|
||||
in
|
||||
List.all (\x -> List.length x == 1) sanitized
|
||||
|
||||
|
||||
|
||||
-- Adapted from https://github.com/elm-community/list-extra
|
||||
|
||||
|
||||
group : List a -> List (List a)
|
||||
group list =
|
||||
case list of
|
||||
[] ->
|
||||
[]
|
||||
|
||||
x :: xs ->
|
||||
let
|
||||
( ys, zs ) =
|
||||
span ((==) x) xs
|
||||
in
|
||||
(x :: ys) :: group zs
|
||||
|
||||
|
||||
span : (a -> Bool) -> List a -> ( List a, List a )
|
||||
span p xs =
|
||||
( takeWhile p xs, dropWhile p xs )
|
||||
|
||||
|
||||
takeWhile : (a -> Bool) -> List a -> List a
|
||||
takeWhile predicate =
|
||||
let
|
||||
takeWhileHelper acc list =
|
||||
case list of
|
||||
[] ->
|
||||
List.reverse acc
|
||||
|
||||
x :: xs ->
|
||||
if (predicate x) then
|
||||
takeWhileHelper (x :: acc) xs
|
||||
else
|
||||
List.reverse acc
|
||||
in
|
||||
takeWhileHelper []
|
||||
|
||||
|
||||
dropWhile : (a -> Bool) -> List a -> List a
|
||||
dropWhile predicate list =
|
||||
case list of
|
||||
[] ->
|
||||
[]
|
||||
|
||||
x :: xs ->
|
||||
if (predicate x) then
|
||||
dropWhile predicate xs
|
||||
else
|
||||
list
|
50
exercises/isogram/README.md
Normal file
50
exercises/isogram/README.md
Normal file
|
@ -0,0 +1,50 @@
|
|||
# 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, 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.
|
||||
|
||||
## Elm Installation
|
||||
|
||||
Refer to the [Exercism help page](http://exercism.io/languages/elm) for Elm
|
||||
installation and learning resources.
|
||||
|
||||
## Writing the Code
|
||||
|
||||
The first time you start an exercise, you'll need to ensure you have the
|
||||
appropriate dependencies installed.
|
||||
|
||||
```bash
|
||||
$ npm install
|
||||
```
|
||||
|
||||
Execute the tests with:
|
||||
|
||||
```bash
|
||||
$ npm test
|
||||
```
|
||||
|
||||
Automatically run tests again when you save changes:
|
||||
|
||||
```bash
|
||||
$ npm run watch
|
||||
```
|
||||
|
||||
As you work your way through the test suite, be sure to remove the `skip <|`
|
||||
calls from each test until you get them all passing!
|
||||
|
||||
## 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.
|
14
exercises/isogram/elm-package.json
Normal file
14
exercises/isogram/elm-package.json
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"version": "3.0.0",
|
||||
"summary": "Exercism problems in Elm.",
|
||||
"repository": "https://github.com/exercism/elm.git",
|
||||
"license": "BSD3",
|
||||
"source-directories": [
|
||||
"."
|
||||
],
|
||||
"exposed-modules": [],
|
||||
"dependencies": {
|
||||
"elm-lang/core": "5.0.0 <= v < 6.0.0"
|
||||
},
|
||||
"elm-version": "0.18.0 <= v < 0.19.0"
|
||||
}
|
14
exercises/isogram/package.json
Normal file
14
exercises/isogram/package.json
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"description": "Exercism/Elm",
|
||||
"repository": "https://github.com/exercism/elm.git",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"postinstall": "elm-package install -y",
|
||||
"watch": "elm-test --watch",
|
||||
"test": "elm-test"
|
||||
},
|
||||
"dependencies": {
|
||||
"elm": "0.18.0",
|
||||
"elm-test": "0.18.3"
|
||||
}
|
||||
}
|
38
exercises/isogram/tests/Tests.elm
Normal file
38
exercises/isogram/tests/Tests.elm
Normal file
|
@ -0,0 +1,38 @@
|
|||
module Tests exposing (..)
|
||||
|
||||
import Test exposing (..)
|
||||
import Expect
|
||||
import Isogram exposing (isIsogram)
|
||||
|
||||
|
||||
tests : Test
|
||||
tests =
|
||||
describe "Isogram"
|
||||
[ test "empty string" <|
|
||||
\() ->
|
||||
Expect.equal True <| isIsogram ""
|
||||
, test "isogram with only lower case characters" <|
|
||||
\() ->
|
||||
Expect.equal True <| isIsogram "isogram"
|
||||
, test "word with one duplicated character" <|
|
||||
\() ->
|
||||
Expect.equal False <| isIsogram "eleven"
|
||||
, test "longest reported english isogram" <|
|
||||
\() ->
|
||||
Expect.equal True <| isIsogram "subdermatoglyphic"
|
||||
, test "word with duplicated character in mixed case" <|
|
||||
\() ->
|
||||
Expect.equal False <| isIsogram "Alphabet"
|
||||
, test "hypothetical isogrammic word with hyphen" <|
|
||||
\() ->
|
||||
Expect.equal True <| isIsogram "thumbscrew-japingly"
|
||||
, test "isogram with duplicated non letter character" <|
|
||||
\() ->
|
||||
Expect.equal True <| isIsogram "Hjelmqvist-Gryb-Zock-Pfund-Wax"
|
||||
, test "made-up name that is an isogram" <|
|
||||
\() ->
|
||||
Expect.equal True <| isIsogram "Emily Jung Schwartzkopf"
|
||||
, test "duplicated character in the middle" <|
|
||||
\() ->
|
||||
Expect.equal False <| isIsogram "accentor"
|
||||
]
|
16
exercises/isogram/tests/elm-package.json
Normal file
16
exercises/isogram/tests/elm-package.json
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"version": "3.0.0",
|
||||
"summary": "Exercism problems in Elm.",
|
||||
"repository": "https://github.com/exercism/elm.git",
|
||||
"license": "BSD3",
|
||||
"source-directories": [
|
||||
".",
|
||||
".."
|
||||
],
|
||||
"exposed-modules": [],
|
||||
"dependencies": {
|
||||
"elm-lang/core": "5.0.0 <= v < 6.0.0",
|
||||
"elm-community/elm-test": "4.0.0 <= v < 5.0.0"
|
||||
},
|
||||
"elm-version": "0.18.0 <= v < 0.19.0"
|
||||
}
|
Loading…
Reference in a new issue