✅ haskell: pangram
This commit is contained in:
		
							
								
								
									
										88
									
								
								haskell/pangram/HELP.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								haskell/pangram/HELP.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
# Help
 | 
			
		||||
 | 
			
		||||
## 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
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
or
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
RedownloadInvalidResponse Request {
 | 
			
		||||
...
 | 
			
		||||
}
 | 
			
		||||
 "/home/username/.stack/build-plan/lts-xx.yy.yaml" (Response {responseStatus = Status {statusCode = 404, statusMessage = "Not Found"},
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You are probably running an old stack version and need
 | 
			
		||||
to upgrade it. Try running:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
stack upgrade
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Or see other options for upgrading at [Stack documentation](https://docs.haskellstack.org/en/stable/install_and_upgrade/#upgrade).
 | 
			
		||||
 | 
			
		||||
#### 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
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
If you want to play with your solution in GHCi, just run the command:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
stack ghci
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Submitting your solution
 | 
			
		||||
 | 
			
		||||
You can submit your solution using the `exercism submit src/Pangram.hs` command.
 | 
			
		||||
This command will upload your solution to the Exercism website and print the solution page's URL.
 | 
			
		||||
 | 
			
		||||
It's possible to submit an incomplete solution which allows you to:
 | 
			
		||||
 | 
			
		||||
- See how others have completed the exercise
 | 
			
		||||
- Request help from a mentor
 | 
			
		||||
 | 
			
		||||
## Need to get help?
 | 
			
		||||
 | 
			
		||||
If you'd like help solving the exercise, check the following pages:
 | 
			
		||||
 | 
			
		||||
- The [Haskell track's documentation](https://exercism.org/docs/tracks/haskell)
 | 
			
		||||
- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
 | 
			
		||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
 | 
			
		||||
 | 
			
		||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
 | 
			
		||||
 | 
			
		||||
## Getting Started
 | 
			
		||||
 | 
			
		||||
Please refer to the [installation](https://exercism.io/tracks/haskell/installation)
 | 
			
		||||
and [learning](https://exercism.io/tracks/haskell/learning) help pages.
 | 
			
		||||
 | 
			
		||||
## 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!
 | 
			
		||||
{{ with .Spec.Credits }}
 | 
			
		||||
							
								
								
									
										37
									
								
								haskell/pangram/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								haskell/pangram/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
# Pangram
 | 
			
		||||
 | 
			
		||||
Welcome to Pangram on Exercism's Haskell Track.
 | 
			
		||||
If you need help running the tests or submitting your code, check out `HELP.md`.
 | 
			
		||||
 | 
			
		||||
## Instructions
 | 
			
		||||
 | 
			
		||||
Determine if a sentence is a pangram. A pangram (Greek: παν γράμμα, pan gramma,
 | 
			
		||||
"every letter") is a sentence using every letter of the alphabet at least once.
 | 
			
		||||
The best known English pangram is:
 | 
			
		||||
> The quick brown fox jumps over the lazy dog.
 | 
			
		||||
 | 
			
		||||
The alphabet used consists of ASCII letters `a` to `z`, inclusive, and is case
 | 
			
		||||
insensitive. Input will not contain non-ASCII symbols.
 | 
			
		||||
 | 
			
		||||
## Source
 | 
			
		||||
 | 
			
		||||
### Created by
 | 
			
		||||
 | 
			
		||||
- @lpalma
 | 
			
		||||
 | 
			
		||||
### Contributed to by
 | 
			
		||||
 | 
			
		||||
- @chiroptical
 | 
			
		||||
- @iHiD
 | 
			
		||||
- @navossoc
 | 
			
		||||
- @petertseng
 | 
			
		||||
- @ppartarr
 | 
			
		||||
- @rbasso
 | 
			
		||||
- @rsslldnphy
 | 
			
		||||
- @Sir4ur0n
 | 
			
		||||
- @sshine
 | 
			
		||||
- @tejasbubane
 | 
			
		||||
 | 
			
		||||
### Based on
 | 
			
		||||
 | 
			
		||||
Wikipedia - https://en.wikipedia.org/wiki/Pangram
 | 
			
		||||
							
								
								
									
										16
									
								
								haskell/pangram/examples/success-standard/package.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								haskell/pangram/examples/success-standard/package.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
name: pangram
 | 
			
		||||
 | 
			
		||||
dependencies:
 | 
			
		||||
  - base
 | 
			
		||||
 | 
			
		||||
library:
 | 
			
		||||
  exposed-modules: Pangram
 | 
			
		||||
  source-dirs: src
 | 
			
		||||
 | 
			
		||||
tests:
 | 
			
		||||
  test:
 | 
			
		||||
    main: Tests.hs
 | 
			
		||||
    source-dirs: test
 | 
			
		||||
    dependencies:
 | 
			
		||||
      - pangram
 | 
			
		||||
      - hspec
 | 
			
		||||
							
								
								
									
										17
									
								
								haskell/pangram/examples/success-text/package.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								haskell/pangram/examples/success-text/package.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
name: pangram
 | 
			
		||||
 | 
			
		||||
dependencies:
 | 
			
		||||
  - base
 | 
			
		||||
  - text
 | 
			
		||||
 | 
			
		||||
library:
 | 
			
		||||
  exposed-modules: Pangram
 | 
			
		||||
  source-dirs: src
 | 
			
		||||
 | 
			
		||||
tests:
 | 
			
		||||
  test:
 | 
			
		||||
    main: Tests.hs
 | 
			
		||||
    source-dirs: test
 | 
			
		||||
    dependencies:
 | 
			
		||||
      - pangram
 | 
			
		||||
      - hspec
 | 
			
		||||
							
								
								
									
										8
									
								
								haskell/pangram/examples/success-text/src/Pangram.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								haskell/pangram/examples/success-text/src/Pangram.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
module Pangram (isPangram) where
 | 
			
		||||
 | 
			
		||||
import           Data.Text (Text)
 | 
			
		||||
import qualified Data.Text as T
 | 
			
		||||
 | 
			
		||||
isPangram :: Text -> Bool
 | 
			
		||||
isPangram s = all (`member` T.toLower s) ['a'..'z']
 | 
			
		||||
  where member = T.any . (==)
 | 
			
		||||
							
								
								
									
										21
									
								
								haskell/pangram/package.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								haskell/pangram/package.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
name: pangram
 | 
			
		||||
version: 2.0.0.12
 | 
			
		||||
 | 
			
		||||
dependencies:
 | 
			
		||||
  - base
 | 
			
		||||
 | 
			
		||||
library:
 | 
			
		||||
  exposed-modules: Pangram
 | 
			
		||||
  source-dirs: src
 | 
			
		||||
  ghc-options: -Wall
 | 
			
		||||
  # dependencies:
 | 
			
		||||
  # - foo       # List here the packages you
 | 
			
		||||
  # - bar       # want to use in your solution.
 | 
			
		||||
 | 
			
		||||
tests:
 | 
			
		||||
  test:
 | 
			
		||||
    main: Tests.hs
 | 
			
		||||
    source-dirs: test
 | 
			
		||||
    dependencies:
 | 
			
		||||
      - pangram
 | 
			
		||||
      - hspec
 | 
			
		||||
							
								
								
									
										7
									
								
								haskell/pangram/src/Pangram.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								haskell/pangram/src/Pangram.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
module Pangram (isPangram) where
 | 
			
		||||
 | 
			
		||||
import Data.Char
 | 
			
		||||
 | 
			
		||||
isPangram :: String -> Bool
 | 
			
		||||
isPangram text = all hasLetter ['a' .. 'z']
 | 
			
		||||
  where hasLetter l = any (== l) (map toLower text)
 | 
			
		||||
							
								
								
									
										1
									
								
								haskell/pangram/stack.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								haskell/pangram/stack.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
resolver: lts-16.21
 | 
			
		||||
							
								
								
									
										83
									
								
								haskell/pangram/test/Tests.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								haskell/pangram/test/Tests.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
{-# LANGUAGE RecordWildCards #-}
 | 
			
		||||
{-# LANGUAGE OverloadedStrings #-}
 | 
			
		||||
 | 
			
		||||
import Data.Foldable     (for_)
 | 
			
		||||
import Data.String       (fromString)
 | 
			
		||||
import Test.Hspec        (Spec, describe, it, shouldBe)
 | 
			
		||||
import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith)
 | 
			
		||||
 | 
			
		||||
import Pangram (isPangram)
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = hspecWith defaultConfig {configFastFail = True} specs
 | 
			
		||||
 | 
			
		||||
specs :: Spec
 | 
			
		||||
specs = describe "isPangram" $ for_ cases test
 | 
			
		||||
  where
 | 
			
		||||
    test Case{..} = it description $ isPangram (fromString input) `shouldBe` expected
 | 
			
		||||
 | 
			
		||||
data Case = Case { description :: String
 | 
			
		||||
                 , input       :: String
 | 
			
		||||
                 , expected    :: Bool
 | 
			
		||||
                 }
 | 
			
		||||
 | 
			
		||||
cases :: [Case]
 | 
			
		||||
cases = [ Case { description = "with empty sentence"
 | 
			
		||||
               , input       = ""
 | 
			
		||||
               , expected    = False
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with perfect lower case"
 | 
			
		||||
               , input       = "abcdefghijklmnopqrstuvwxyz"
 | 
			
		||||
               , expected    = True
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with only lower case"
 | 
			
		||||
               , input       = "the quick brown fox jumps over the lazy dog"
 | 
			
		||||
               , expected    = True
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with missing character 'x'"
 | 
			
		||||
               , input       = "a quick movement of the enemy will jeopardize five gunboats"
 | 
			
		||||
               , expected    = False
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with missing character 'h'"
 | 
			
		||||
               , input       = "five boxing wizards jump quickly at it"
 | 
			
		||||
               , expected    = False
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with underscores"
 | 
			
		||||
               , input       = "the_quick_brown_fox_jumps_over_the_lazy_dog"
 | 
			
		||||
               , expected    = True
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with numbers"
 | 
			
		||||
               , input       = "the 1 quick brown fox jumps over the 2 lazy dogs"
 | 
			
		||||
               , expected    = True
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with missing letters replaced by numbers"
 | 
			
		||||
               , input       = "7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"
 | 
			
		||||
               , expected    = False
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with mixed case and punctuation"
 | 
			
		||||
               , input       = "\"Five quacking Zephyrs jolt my wax bed.\""
 | 
			
		||||
               , expected    = True
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with mixed case"
 | 
			
		||||
               , input       = "the quick brown fox jumps over with lazy FX"
 | 
			
		||||
               , expected    = False
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with missing character and non-ascii letters"
 | 
			
		||||
               , input       = "abcdefghijklmnopqrstuvwxyÃ"
 | 
			
		||||
               , expected    = False
 | 
			
		||||
               }
 | 
			
		||||
        , Case { description = "with additional non-ascii letters"
 | 
			
		||||
               , input       = "abcdefghijklmnopqrstuvwxyzÃ"
 | 
			
		||||
               , expected    = True
 | 
			
		||||
               }
 | 
			
		||||
 | 
			
		||||
        {-
 | 
			
		||||
        -- The following test can be enabled for String-based solutions:
 | 
			
		||||
        , Case { description = "with termination as soon as all letters have occurred"
 | 
			
		||||
               , input       = "abcdefghijklmnopqrstuvwxyz" ++ [undefined]
 | 
			
		||||
               , expected    = True
 | 
			
		||||
               }
 | 
			
		||||
        -- -}
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
-- 73e37723b154f0c741d227c43af09d23dc7e5e44
 | 
			
		||||
		Reference in New Issue
	
	Block a user