trackler 2.0.0.3 → 2.0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/common/CONTRIBUTING.md +1 -1
- data/common/README.md +4 -4
- data/common/exercises/bowling/canonical-data.json +8 -0
- data/common/exercises/hello-world/description.md +1 -1
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/.gitignore +1 -0
- data/tracks/c/bin/run-tests +3 -0
- data/tracks/c/config.json +9 -0
- data/tracks/c/exercises/clock/makefile +16 -0
- data/tracks/c/exercises/clock/src/clock.h +11 -0
- data/tracks/c/exercises/clock/src/example.c +31 -0
- data/tracks/c/exercises/clock/test/test_clock.c +489 -0
- data/tracks/c/exercises/clock/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/clock/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/clock/test/vendor/unity_internals.h +701 -0
- data/tracks/coldfusion/config.json +2 -1
- data/tracks/coldfusion/img/icon.png +0 -0
- data/tracks/crystal/Makefile +11 -15
- data/tracks/crystal/SETUP.md +1 -1
- data/tracks/crystal/docs/LEARNING.md +5 -3
- data/tracks/crystal/docs/TESTS.md +24 -3
- data/tracks/crystal/exercises/anagram/{anagram_spec.cr → spec/anagram_spec.cr} +1 -1
- data/tracks/crystal/exercises/anagram/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/atbash-cipher/{atbash_cipher_spec.cr → spec/atbash_cipher_spec.cr} +1 -1
- data/tracks/crystal/exercises/atbash-cipher/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/bob/{bob_spec.cr → spec/bob_spec.cr} +1 -1
- data/tracks/crystal/exercises/bob/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/bracket-push/{bracket_push_spec.cr → spec/bracket_push_spec.cr} +1 -1
- data/tracks/crystal/exercises/bracket-push/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/gigasecond/{gigasecond_spec.cr → spec/gigasecond_spec.cr} +1 -1
- data/tracks/crystal/exercises/gigasecond/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/hamming/{hamming_spec.cr → spec/hamming_spec.cr} +1 -1
- data/tracks/crystal/exercises/hamming/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/hello-world/HINTS.md +32 -0
- data/tracks/crystal/exercises/hello-world/{hello_world_spec.cr → spec/hello_world_spec.cr} +1 -1
- data/tracks/crystal/exercises/hello-world/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/largest-series-product/{largest_series_product_spec.cr → spec/largest_series_product_spec.cr} +1 -1
- data/tracks/crystal/exercises/largest-series-product/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/leap/{leap_spec.cr → spec/leap_spec.cr} +1 -1
- data/tracks/crystal/exercises/leap/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/pangram/{pangram_spec.cr → spec/pangram_spec.cr} +1 -1
- data/tracks/crystal/exercises/pangram/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/raindrops/{raindrops_spec.cr → spec/raindrops_spec.cr} +1 -1
- data/tracks/crystal/exercises/raindrops/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/react/{react_spec.cr → spec/react_spec.cr} +1 -1
- data/tracks/crystal/exercises/react/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/rna-transcription/{rna_transcription_spec.cr → spec/rna_transcription_spec.cr} +1 -1
- data/tracks/crystal/exercises/rna-transcription/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/roman-numerals/{roman_numerals_spec.cr → spec/roman_numerals_spec.cr} +1 -1
- data/tracks/crystal/exercises/roman-numerals/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/sieve/{sieve_spec.cr → spec/sieve_spec.cr} +1 -1
- data/tracks/crystal/exercises/sieve/{example.cr → src/example.cr} +0 -0
- data/tracks/haskell/.travis.yml +4 -2
- data/tracks/haskell/config.json +6 -6
- data/tracks/haskell/exercises/alphametics/package.yaml +0 -1
- data/tracks/haskell/exercises/atbash-cipher/package.yaml +0 -1
- data/tracks/haskell/exercises/bank-account/package.yaml +0 -1
- data/tracks/haskell/exercises/binary-search-tree/HINTS.md +3 -2
- data/tracks/haskell/exercises/binary-search-tree/src/BST.hs +2 -0
- data/tracks/haskell/exercises/change/test/Tests.hs +2 -1
- data/tracks/haskell/exercises/connect/package.yaml +0 -1
- data/tracks/haskell/exercises/crypto-square/package.yaml +0 -1
- data/tracks/haskell/exercises/custom-set/HINTS.md +3 -2
- data/tracks/haskell/exercises/custom-set/src/CustomSet.hs +3 -2
- data/tracks/haskell/exercises/food-chain/package.yaml +0 -1
- data/tracks/haskell/exercises/forth/HINTS.md +3 -2
- data/tracks/haskell/exercises/forth/src/Forth.hs +2 -0
- data/tracks/haskell/exercises/go-counting/package.yaml +0 -1
- data/tracks/haskell/exercises/grade-school/package.yaml +0 -1
- data/tracks/haskell/exercises/grains/src/Grains.hs +3 -1
- data/tracks/haskell/exercises/kindergarten-garden/package.yaml +0 -1
- data/tracks/haskell/exercises/largest-series-product/package.yaml +0 -1
- data/tracks/haskell/exercises/lens-person/package.yaml +0 -1
- data/tracks/haskell/exercises/linked-list/package.yaml +0 -1
- data/tracks/haskell/exercises/ocr-numbers/package.yaml +0 -2
- data/tracks/haskell/exercises/parallel-letter-frequency/package.yaml +0 -1
- data/tracks/haskell/exercises/rna-transcription/package.yaml +0 -1
- data/tracks/haskell/exercises/robot-name/package.yaml +0 -1
- data/tracks/haskell/exercises/saddle-points/package.yaml +0 -1
- data/tracks/haskell/exercises/say/package.yaml +0 -1
- data/tracks/haskell/exercises/scrabble-score/package.yaml +0 -1
- data/tracks/haskell/exercises/series/HINTS.md +23 -0
- data/tracks/haskell/exercises/series/examples/success-byteseqs/package.yaml +19 -0
- data/tracks/haskell/exercises/series/examples/success-byteseqs/src/Series.hs +26 -0
- data/tracks/haskell/exercises/series/src/Series.hs +2 -1
- data/tracks/haskell/exercises/series/test/Tests.hs +16 -11
- data/tracks/haskell/exercises/sgf-parsing/package.yaml +0 -1
- data/tracks/haskell/exercises/sieve/package.yaml +0 -1
- data/tracks/haskell/exercises/simple-cipher/package.yaml +0 -1
- data/tracks/haskell/exercises/triangle/package.yaml +0 -1
- data/tracks/haskell/exercises/word-count/examples/success-newtype/src/WordCount.hs +7 -4
- data/tracks/haskell/exercises/word-count/examples/success-simple/src/WordCount.hs +6 -2
- data/tracks/haskell/exercises/word-count/test/Tests.hs +30 -1
- data/tracks/haskell/exercises/wordy/package.yaml +0 -2
- data/tracks/java/docs/INSTALLATION.md +2 -0
- data/tracks/java/exercises/_template/build.gradle +1 -1
- data/tracks/java/exercises/accumulate/build.gradle +1 -1
- data/tracks/java/exercises/acronym/build.gradle +1 -1
- data/tracks/java/exercises/allergies/build.gradle +1 -1
- data/tracks/java/exercises/anagram/build.gradle +1 -1
- data/tracks/java/exercises/atbash-cipher/build.gradle +1 -1
- data/tracks/java/exercises/beer-song/build.gradle +1 -1
- data/tracks/java/exercises/binary/build.gradle +1 -1
- data/tracks/java/exercises/bob/build.gradle +1 -1
- data/tracks/java/exercises/crypto-square/build.gradle +1 -1
- data/tracks/java/exercises/etl/build.gradle +1 -1
- data/tracks/java/exercises/gigasecond/build.gradle +1 -1
- data/tracks/java/exercises/grade-school/build.gradle +1 -1
- data/tracks/java/exercises/hamming/build.gradle +1 -1
- data/tracks/java/exercises/hello-world/build.gradle +1 -1
- data/tracks/java/exercises/hexadecimal/build.gradle +1 -1
- data/tracks/java/exercises/linked-list/build.gradle +1 -1
- data/tracks/java/exercises/luhn/build.gradle +1 -1
- data/tracks/java/exercises/meetup/build.gradle +1 -1
- data/tracks/java/exercises/nth-prime/build.gradle +1 -1
- data/tracks/java/exercises/nucleotide-count/build.gradle +1 -1
- data/tracks/java/exercises/octal/build.gradle +1 -1
- data/tracks/java/exercises/pangram/build.gradle +1 -1
- data/tracks/java/exercises/pascals-triangle/build.gradle +1 -1
- data/tracks/java/exercises/phone-number/build.gradle +1 -1
- data/tracks/java/exercises/pig-latin/build.gradle +1 -1
- data/tracks/java/exercises/raindrops/build.gradle +1 -1
- data/tracks/java/exercises/rna-transcription/build.gradle +1 -1
- data/tracks/java/exercises/robot-name/build.gradle +1 -1
- data/tracks/java/exercises/roman-numerals/build.gradle +1 -1
- data/tracks/java/exercises/scrabble-score/build.gradle +1 -1
- data/tracks/java/exercises/sieve/build.gradle +1 -1
- data/tracks/java/exercises/simple-cipher/build.gradle +1 -1
- data/tracks/java/exercises/simple-linked-list/build.gradle +1 -1
- data/tracks/java/exercises/space-age/build.gradle +1 -1
- data/tracks/java/exercises/strain/build.gradle +1 -1
- data/tracks/java/exercises/triangle/build.gradle +1 -1
- data/tracks/java/exercises/trinary/build.gradle +1 -1
- data/tracks/java/exercises/word-count/build.gradle +1 -1
- data/tracks/ocaml/.travis-ci.sh +1 -1
- data/tracks/ocaml/.travis.yml +1 -1
- data/tracks/ocaml/README.md +1 -1
- data/tracks/ocaml/exercises/hamming/hamming.mli +1 -3
- data/tracks/ruby/exercises/leap/.version +1 -1
- data/tracks/ruby/exercises/leap/example.tt +3 -3
- data/tracks/ruby/exercises/leap/leap_test.rb +3 -4
- data/tracks/ruby/lib/leap_cases.rb +2 -2
- data/tracks/rust/exercises/bowling/tests/bowling.rs +29 -0
- data/tracks/swift/.gitignore +1 -0
- data/tracks/swift/.swift-version +1 -0
- data/tracks/swift/exercises/bowling/BowlingExample.swift +2 -2
- data/tracks/swift/exercises/bowling/BowlingTest.swift +84 -94
- data/tracks/swift/exercises/palindrome-products/PalindromeProductsExample.swift +19 -16
- data/tracks/tcl/README.md +3 -0
- data/tracks/tcl/config.json +2 -1
- data/tracks/tcl/img/icon.png +0 -0
- metadata +46 -33
- data/tracks/crystal/exercises/hello-world/GETTING_STARTED.md +0 -10
@@ -0,0 +1,23 @@
|
|
1
|
+
## Hints
|
2
|
+
|
3
|
+
To complete this exercise you need to implement the function `slices`,
|
4
|
+
that takes a *text* and returns the subsequences of digits with a
|
5
|
+
specified size:
|
6
|
+
|
7
|
+
If it is your first time solving this exercise, it is recommended that you
|
8
|
+
stick to the provided signature:
|
9
|
+
|
10
|
+
```haskell
|
11
|
+
slices :: Int -> String -> [[Int]]
|
12
|
+
```
|
13
|
+
|
14
|
+
Later, it may be a good idea to revisit this problem and play with other data
|
15
|
+
types and libraries:
|
16
|
+
|
17
|
+
- `ByteString`, from package *bytestring*.
|
18
|
+
- `Sequence`, from package *containers*.
|
19
|
+
- `Text`, from package *text*.
|
20
|
+
- `Vector`, from package *vector*.
|
21
|
+
|
22
|
+
The test suite was intentionally designed to accept almost any type signature
|
23
|
+
that makes sense, so you are encouraged to find the one you think is the best.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
name: series
|
2
|
+
|
3
|
+
dependencies:
|
4
|
+
- base
|
5
|
+
|
6
|
+
library:
|
7
|
+
exposed-modules: Series
|
8
|
+
source-dirs: src
|
9
|
+
dependencies:
|
10
|
+
- bytestring
|
11
|
+
- containers
|
12
|
+
|
13
|
+
tests:
|
14
|
+
test:
|
15
|
+
main: Tests.hs
|
16
|
+
source-dirs: test
|
17
|
+
dependencies:
|
18
|
+
- series
|
19
|
+
- hspec
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Series (slices) where
|
2
|
+
|
3
|
+
import Control.Applicative (liftA2)
|
4
|
+
import Control.Monad (guard)
|
5
|
+
import Data.ByteString.Char8 (ByteString, foldr, length, tails, take)
|
6
|
+
import Data.Function (on)
|
7
|
+
import Data.Maybe (mapMaybe)
|
8
|
+
import Data.Sequence (Seq, empty, fromList, singleton, (<|))
|
9
|
+
import Prelude hiding (foldr, length, take)
|
10
|
+
|
11
|
+
slices :: Num a => Int -> ByteString -> Seq (Seq a)
|
12
|
+
slices 0 _ = singleton empty
|
13
|
+
slices n bs = fromList
|
14
|
+
. mapMaybe toDigits
|
15
|
+
. takeWhile ((== n) . length)
|
16
|
+
. map (take n)
|
17
|
+
. tails
|
18
|
+
$ bs
|
19
|
+
|
20
|
+
toDigits :: Num a => ByteString -> Maybe (Seq a)
|
21
|
+
toDigits = foldr (liftA2 (<|) . toDigit) (Just empty)
|
22
|
+
|
23
|
+
toDigit :: Num a => Char -> Maybe a
|
24
|
+
toDigit x = guard (0 <= dec && dec <= 9) >> return (fromIntegral dec)
|
25
|
+
where
|
26
|
+
dec = ((-) `on` fromEnum) x '0'
|
@@ -1,5 +1,8 @@
|
|
1
1
|
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
|
2
|
+
{-# LANGUAGE FlexibleContexts #-}
|
3
|
+
{-# LANGUAGE OverloadedStrings #-}
|
2
4
|
|
5
|
+
import GHC.Exts (toList)
|
3
6
|
import Test.Hspec (Spec, describe, it, shouldBe)
|
4
7
|
import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith)
|
5
8
|
|
@@ -11,23 +14,25 @@ main = hspecWith defaultConfig {configFastFail = True} specs
|
|
11
14
|
specs :: Spec
|
12
15
|
specs = describe "series" $ do
|
13
16
|
|
14
|
-
-- As of 2016-
|
17
|
+
-- As of 2016-11-08, there was no reference file
|
15
18
|
-- for the test cases in `exercism/x-common`.
|
16
19
|
|
20
|
+
let x `shouldHaveSlices` yss = (map toList . toList) x `shouldBe` yss
|
21
|
+
|
17
22
|
it "slices of one" $ do
|
18
|
-
slices 1 "" `
|
19
|
-
slices 1 "01234" `
|
23
|
+
slices 1 "" `shouldHaveSlices` []
|
24
|
+
slices 1 "01234" `shouldHaveSlices` [[0], [1], [2], [3], [4]]
|
20
25
|
|
21
26
|
it "slices of two" $ do
|
22
|
-
slices 2 "" `
|
23
|
-
slices 2 "01" `
|
24
|
-
slices 2 "01234" `
|
27
|
+
slices 2 "" `shouldHaveSlices` []
|
28
|
+
slices 2 "01" `shouldHaveSlices` [[0,1]]
|
29
|
+
slices 2 "01234" `shouldHaveSlices` [[0,1], [1,2], [2,3], [3,4]]
|
25
30
|
|
26
31
|
it "slices of three" $ do
|
27
|
-
slices 3 "ab" `
|
28
|
-
slices 3 "012" `
|
29
|
-
slices 3 "0123" `
|
32
|
+
slices 3 "ab" `shouldHaveSlices` []
|
33
|
+
slices 3 "012" `shouldHaveSlices` [[0,1,2]]
|
34
|
+
slices 3 "0123" `shouldHaveSlices` [[0,1,2], [1,2,3]]
|
30
35
|
|
31
36
|
it "slices of zero" $ do
|
32
|
-
slices 0 "" `
|
33
|
-
slices 0 "012" `
|
37
|
+
slices 0 "" `shouldHaveSlices` [[]]
|
38
|
+
slices 0 "012" `shouldHaveSlices` [[]]
|
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
module WordCount (wordCount) where
|
4
4
|
|
5
|
-
import Prelude hiding (null)
|
5
|
+
import Prelude hiding (head, init, null, tail)
|
6
6
|
import Data.Char (isAlphaNum)
|
7
|
-
import Data.Text (Text, null, split, toLower)
|
7
|
+
import Data.Text (Text, head, init, null, split, tail, toLower)
|
8
8
|
import Data.MultiSet (MultiSet, Occur, fromList, fromOccurList, toOccurList)
|
9
9
|
|
10
10
|
import qualified GHC.Exts (IsList(..))
|
@@ -12,14 +12,17 @@ import qualified GHC.Exts (IsList(..))
|
|
12
12
|
wordCount :: Text -> Bag Text
|
13
13
|
wordCount = Bag
|
14
14
|
. fromList
|
15
|
-
. map toLower
|
16
|
-
. wordsBy (not
|
15
|
+
. map (stripQuote . toLower)
|
16
|
+
. wordsBy (\c -> not (isAlphaNum c) && c /= '\'')
|
17
17
|
|
18
18
|
-- The `text` package misses this function that
|
19
19
|
-- exists in package `split`, but works on lists.
|
20
20
|
wordsBy :: (Char -> Bool) -> Text -> [Text]
|
21
21
|
wordsBy p = filter (not . null) . split p
|
22
22
|
|
23
|
+
stripQuote :: Text -> Text
|
24
|
+
stripQuote t = if head t == '\'' then init (tail t) else t
|
25
|
+
|
23
26
|
-- MultiSet is not an instance of `IsList`, so we create
|
24
27
|
-- a newtype to wrap it, avoiding an orphan instance.
|
25
28
|
newtype Bag a = Bag { toMultiSet :: MultiSet a }
|
@@ -9,5 +9,9 @@ wordCount :: String -> [(String, Int)]
|
|
9
9
|
wordCount = map (head &&& length)
|
10
10
|
. group
|
11
11
|
. sort
|
12
|
-
. map (map toLower)
|
13
|
-
. wordsBy (not
|
12
|
+
. map (stripQuote . map toLower)
|
13
|
+
. wordsBy (\c -> not (isAlphaNum c) && c /= '\'')
|
14
|
+
|
15
|
+
stripQuote :: String -> String
|
16
|
+
stripQuote ('\'':t) = init t
|
17
|
+
stripQuote s = s
|
@@ -30,7 +30,7 @@ specs = describe "word-count" $
|
|
30
30
|
. fromList
|
31
31
|
$ input
|
32
32
|
|
33
|
-
-- Test cases adapted from `exercism/x-common/word-count
|
33
|
+
-- Test cases adapted from `exercism/x-common/word-count` on 2016-11-06.
|
34
34
|
|
35
35
|
data Case = Case { description :: String
|
36
36
|
, input :: String
|
@@ -56,6 +56,18 @@ cases = [ Case { description = "count one word"
|
|
56
56
|
, ("red" , 1)
|
57
57
|
, ("blue", 1) ]
|
58
58
|
}
|
59
|
+
, Case { description = "handles cramped lists"
|
60
|
+
, input = "one,two,three"
|
61
|
+
, expected = [ ("one" , 1)
|
62
|
+
, ("two" , 1)
|
63
|
+
, ("three", 1) ]
|
64
|
+
}
|
65
|
+
, Case { description = "handles expanded lists"
|
66
|
+
, input = "one,\ntwo,\nthree"
|
67
|
+
, expected = [ ("one" , 1)
|
68
|
+
, ("two" , 1)
|
69
|
+
, ("three", 1) ]
|
70
|
+
}
|
59
71
|
, Case { description = "ignore punctuation"
|
60
72
|
, input = "car : carpet as java : javascript!!&@$%^&"
|
61
73
|
, expected = [ ("car" , 1)
|
@@ -75,4 +87,21 @@ cases = [ Case { description = "count one word"
|
|
75
87
|
, expected = [ ("go" , 3)
|
76
88
|
, ("stop", 2) ]
|
77
89
|
}
|
90
|
+
, Case { description = "with apostrophes"
|
91
|
+
, input = "First: don't laugh. Then: don't cry."
|
92
|
+
, expected = [ ("first", 1)
|
93
|
+
, ("don't", 2)
|
94
|
+
, ("laugh", 1)
|
95
|
+
, ("then" , 1)
|
96
|
+
, ("cry" , 1) ]
|
97
|
+
}
|
98
|
+
, Case { description = "with quotations"
|
99
|
+
, input = "Joe can't tell between 'large' and large."
|
100
|
+
, expected = [ ("joe" , 1)
|
101
|
+
, ("can't" , 1)
|
102
|
+
, ("tell" , 1)
|
103
|
+
, ("between", 1)
|
104
|
+
, ("large" , 2)
|
105
|
+
, ("and" , 1) ]
|
106
|
+
}
|
78
107
|
]
|