trackler 2.2.1.47 → 2.2.1.48
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/pangram/canonical-data.json +3 -3
- data/tracks/common-lisp/.travis.yml +2 -9
- data/tracks/common-lisp/docs/TESTS.md +43 -9
- data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +2 -2
- data/tracks/elixir/.travis.yml +4 -7
- data/tracks/elixir/README.md +2 -6
- data/tracks/elixir/bin/dialyzer_check.sh +2 -13
- data/tracks/elixir/exercises/allergies/example.exs +3 -2
- data/tracks/elixir/exercises/atbash-cipher/example.exs +5 -5
- data/tracks/elixir/exercises/bank-account/example.exs +11 -11
- data/tracks/elixir/exercises/bob/example.exs +4 -4
- data/tracks/elixir/exercises/forth/example.exs +66 -48
- data/tracks/elixir/exercises/minesweeper/example.exs +31 -18
- data/tracks/elixir/exercises/pangram/example.exs +4 -4
- data/tracks/elixir/exercises/queen-attack/queen_attack_test.exs +68 -53
- data/tracks/elixir/exercises/say/example.exs +33 -31
- data/tracks/elixir/exercises/scrabble-score/example.exs +12 -11
- data/tracks/elixir/mix.exs +10 -7
- data/tracks/elixir/mix.lock +4 -1
- data/tracks/erlang/README.md +2 -0
- data/tracks/fsharp/exercises/nth-prime/Example.fs +4 -1
- data/tracks/fsharp/exercises/nth-prime/NthPrime.fs +1 -1
- data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +12 -32
- data/tracks/fsharp/exercises/pangram/PangramTest.fs +3 -3
- data/tracks/fsharp/exercises/perfect-numbers/Example.fs +9 -6
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fs +1 -1
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbersTest.fs +55 -21
- data/tracks/fsharp/generators/Generators.fs +18 -0
- data/tracks/gnu-apl/config.json +21 -0
- data/tracks/gnu-apl/exercises/hamming/README.md +42 -0
- data/tracks/gnu-apl/exercises/hamming/hamming-example.apl +5 -0
- data/tracks/gnu-apl/exercises/hamming/hamming.tc +75 -0
- data/tracks/gnu-apl/exercises/hello-world/README.md +17 -1
- data/tracks/gnu-apl/exercises/leap/README.md +33 -0
- data/tracks/gnu-apl/exercises/raindrops/README.md +24 -0
- data/tracks/gnu-apl/exercises/raindrops/raindrops-example.apl +8 -0
- data/tracks/gnu-apl/exercises/raindrops/raindrops.tc +60 -0
- data/tracks/gnu-apl/exercises/rna-transcription/README.md +25 -0
- data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription-example.apl +7 -0
- data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription.tc +41 -0
- data/tracks/gnu-apl/test.apl +13 -0
- data/tracks/haskell/config.json +9 -0
- data/tracks/haskell/exercises/rotational-cipher/README.md +91 -0
- data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/src/RotationalCipher.hs +9 -0
- data/tracks/haskell/exercises/rotational-cipher/package.yaml +20 -0
- data/tracks/haskell/exercises/rotational-cipher/src/RotationalCipher.hs +4 -0
- data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -0
- data/tracks/haskell/exercises/rotational-cipher/test/Tests.hs +77 -0
- data/tracks/java/config.json +23 -14
- data/tracks/java/config/exercise-readme-insert.md +3 -3
- data/tracks/java/config/exercise_readme.go.tmpl +3 -0
- data/tracks/java/exercises/accumulate/README.md +4 -3
- data/tracks/java/exercises/acronym/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/acronym/README.md +4 -3
- data/tracks/java/exercises/all-your-base/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/all-your-base/README.md +4 -3
- data/tracks/java/exercises/allergies/README.md +4 -3
- data/tracks/java/exercises/anagram/README.md +4 -3
- data/tracks/java/exercises/atbash-cipher/README.md +4 -3
- data/tracks/java/exercises/bank-account/README.md +6 -3
- data/tracks/java/exercises/beer-song/README.md +4 -3
- data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/BinarySearchTree.java +38 -44
- data/tracks/java/exercises/binary-search-tree/README.md +4 -3
- data/tracks/java/exercises/binary-search-tree/src/main/java/BinarySearchTree.java +35 -0
- data/tracks/java/exercises/binary-search-tree/src/test/java/BinarySearchTreeTest.java +46 -40
- data/tracks/java/exercises/binary-search/.meta/hints.md +25 -0
- data/tracks/java/exercises/binary-search/.meta/src/reference/java/BinarySearch.java +3 -7
- data/tracks/java/exercises/binary-search/README.md +33 -3
- data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +11 -11
- data/tracks/java/exercises/binary/README.md +4 -3
- data/tracks/java/exercises/bob/README.md +4 -3
- data/tracks/java/exercises/book-store/README.md +4 -3
- data/tracks/java/exercises/bowling/README.md +4 -3
- data/tracks/java/exercises/bracket-push/README.md +4 -3
- data/tracks/java/exercises/change/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/change/README.md +4 -3
- data/tracks/java/exercises/circular-buffer/README.md +4 -3
- data/tracks/java/exercises/clock/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/clock/README.md +6 -3
- data/tracks/java/exercises/collatz-conjecture/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/collatz-conjecture/README.md +4 -3
- data/tracks/java/exercises/complex-numbers/README.md +4 -3
- data/tracks/java/exercises/crypto-square/README.md +4 -3
- data/tracks/java/exercises/{rna-transcription/.meta/.version → custom-set/.meta/version} +0 -0
- data/tracks/java/exercises/custom-set/README.md +4 -3
- data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +103 -251
- data/tracks/java/exercises/diamond/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/diamond/README.md +4 -3
- data/tracks/java/exercises/difference-of-squares/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/difference-of-squares/README.md +4 -3
- data/tracks/java/exercises/etl/README.md +4 -3
- data/tracks/java/exercises/flatten-array/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/flatten-array/README.md +4 -3
- data/tracks/java/exercises/food-chain/README.md +4 -3
- data/tracks/java/exercises/forth/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/forth/README.md +3 -3
- data/tracks/java/exercises/gigasecond/README.md +4 -3
- data/tracks/java/exercises/grade-school/README.md +4 -3
- data/tracks/java/exercises/hamming/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/hamming/README.md +6 -3
- data/tracks/java/exercises/hello-world/README.md +6 -3
- data/tracks/java/exercises/hexadecimal/README.md +4 -3
- data/tracks/java/exercises/house/README.md +4 -3
- data/tracks/java/exercises/isogram/README.md +6 -3
- data/tracks/java/exercises/kindergarten-garden/README.md +4 -3
- data/tracks/java/exercises/largest-series-product/README.md +4 -3
- data/tracks/java/exercises/linked-list/README.md +4 -3
- data/tracks/java/exercises/list-ops/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/list-ops/README.md +6 -3
- data/tracks/java/exercises/luhn/README.md +4 -3
- data/tracks/java/exercises/matrix/README.md +4 -3
- data/tracks/java/exercises/meetup/README.md +4 -3
- data/tracks/java/exercises/minesweeper/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/minesweeper/README.md +4 -3
- data/tracks/java/exercises/nth-prime/README.md +4 -3
- data/tracks/java/exercises/nucleotide-count/README.md +4 -3
- data/tracks/java/exercises/ocr-numbers/README.md +4 -3
- data/tracks/java/exercises/octal/README.md +4 -3
- data/tracks/java/exercises/palindrome-products/README.md +4 -3
- data/tracks/java/exercises/pangram/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/pangram/README.md +4 -3
- data/tracks/java/exercises/pascals-triangle/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/pascals-triangle/README.md +4 -3
- data/tracks/java/exercises/perfect-numbers/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/perfect-numbers/README.md +4 -3
- data/tracks/java/exercises/phone-number/README.md +4 -3
- data/tracks/java/exercises/pig-latin/README.md +4 -3
- data/tracks/java/exercises/poker/README.md +4 -3
- data/tracks/java/exercises/prime-factors/README.md +4 -3
- data/tracks/java/exercises/pythagorean-triplet/README.md +4 -3
- data/tracks/java/exercises/queen-attack/README.md +4 -3
- data/tracks/java/exercises/raindrops/README.md +4 -3
- data/tracks/java/exercises/rectangles/README.md +4 -3
- data/tracks/java/exercises/rna-transcription/.meta/version +1 -0
- data/tracks/java/exercises/rna-transcription/README.md +4 -3
- data/tracks/java/exercises/robot-name/README.md +4 -3
- data/tracks/java/exercises/robot-simulator/README.md +4 -3
- data/tracks/java/exercises/roman-numerals/README.md +4 -3
- data/tracks/java/exercises/rotational-cipher/README.md +4 -3
- data/tracks/java/exercises/run-length-encoding/README.md +4 -3
- data/tracks/java/exercises/saddle-points/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/saddle-points/README.md +4 -3
- data/tracks/java/exercises/scrabble-score/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/scrabble-score/README.md +4 -3
- data/tracks/java/exercises/secret-handshake/README.md +4 -3
- data/tracks/java/exercises/series/README.md +4 -3
- data/tracks/java/exercises/sieve/README.md +4 -3
- data/tracks/java/exercises/simple-cipher/README.md +6 -3
- data/tracks/java/exercises/simple-linked-list/README.md +4 -3
- data/tracks/java/exercises/space-age/README.md +4 -3
- data/tracks/java/exercises/spiral-matrix/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/spiral-matrix/README.md +4 -3
- data/tracks/java/exercises/strain/README.md +4 -3
- data/tracks/java/exercises/sublist/README.md +4 -3
- data/tracks/java/exercises/sum-of-multiples/README.md +4 -3
- data/tracks/java/exercises/tournament/README.md +4 -3
- data/tracks/java/exercises/transpose/README.md +4 -3
- data/tracks/java/exercises/triangle/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/triangle/README.md +4 -3
- data/tracks/java/exercises/trinary/README.md +4 -3
- data/tracks/java/exercises/twelve-days/README.md +4 -3
- data/tracks/java/exercises/two-fer/README.md +6 -3
- data/tracks/java/exercises/word-count/README.md +4 -3
- data/tracks/java/exercises/word-search/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/word-search/README.md +4 -3
- data/tracks/java/exercises/wordy/README.md +4 -3
- data/tracks/julia/config.json +13 -0
- data/tracks/julia/exercises/phone-number/README.md +36 -0
- data/tracks/julia/exercises/phone-number/example.jl +18 -0
- data/tracks/julia/exercises/phone-number/phone-number.jl +3 -0
- data/tracks/julia/exercises/phone-number/runtests.jl +49 -0
- data/tracks/lua/config.json +505 -494
- data/tracks/lua/config/maintainers.json +16 -16
- data/tracks/lua/exercises/acronym/README.md +0 -1
- data/tracks/lua/exercises/all-your-base/README.md +1 -1
- data/tracks/lua/exercises/allergies/README.md +0 -1
- data/tracks/lua/exercises/alphametics/README.md +2 -2
- data/tracks/lua/exercises/atbash-cipher/README.md +2 -1
- data/tracks/lua/exercises/beer-song/README.md +1 -1
- data/tracks/lua/exercises/binary/README.md +2 -0
- data/tracks/lua/exercises/bowling/README.md +20 -6
- data/tracks/lua/exercises/change/README.md +1 -1
- data/tracks/lua/exercises/circular-buffer/README.md +13 -6
- data/tracks/lua/exercises/crypto-square/README.md +4 -4
- data/tracks/lua/exercises/diamond/README.md +6 -6
- data/tracks/lua/exercises/etl/README.md +2 -0
- data/tracks/lua/exercises/flatten-array/README.md +1 -2
- data/tracks/lua/exercises/food-chain/README.md +1 -1
- data/tracks/lua/exercises/grade-school/README.md +0 -1
- data/tracks/lua/exercises/grains/README.md +0 -1
- data/tracks/lua/exercises/house/README.md +1 -2
- data/tracks/lua/exercises/isogram/README.md +2 -1
- data/tracks/lua/exercises/kindergarten-garden/README.md +13 -13
- data/tracks/lua/exercises/leap/README.md +1 -1
- data/tracks/lua/exercises/linked-list/README.md +10 -10
- data/tracks/lua/exercises/luhn/README.md +7 -7
- data/tracks/lua/exercises/matrix/README.md +6 -4
- data/tracks/lua/exercises/meetup/README.md +1 -2
- data/tracks/lua/exercises/nucleotide-count/README.md +8 -22
- data/tracks/lua/exercises/ocr-numbers/README.md +5 -5
- data/tracks/lua/exercises/octal/README.md +6 -2
- data/tracks/lua/exercises/pangram/README.md +1 -1
- data/tracks/lua/exercises/pascals-triangle/README.md +1 -1
- data/tracks/lua/exercises/perfect-numbers/README.md +2 -2
- data/tracks/lua/exercises/phone-number/README.md +3 -2
- data/tracks/lua/exercises/pov/README.md +2 -2
- data/tracks/lua/exercises/protein-translation/README.md +4 -5
- data/tracks/lua/exercises/pythagorean-triplet/README.md +3 -3
- data/tracks/lua/exercises/rail-fence-cipher/README.md +12 -7
- data/tracks/lua/exercises/react/README.md +29 -0
- data/tracks/lua/exercises/react/example.lua +108 -0
- data/tracks/lua/exercises/react/react_spec.lua +160 -0
- data/tracks/lua/exercises/rectangles/README.md +7 -7
- data/tracks/lua/exercises/roman-numerals/README.md +1 -1
- data/tracks/lua/exercises/run-length-encoding/README.md +4 -4
- data/tracks/lua/exercises/scrabble-score/README.md +3 -1
- data/tracks/lua/exercises/secret-handshake/README.md +1 -1
- data/tracks/lua/exercises/space-age/README.md +2 -1
- data/tracks/lua/exercises/sum-of-multiples/README.md +0 -3
- data/tracks/lua/exercises/tournament/README.md +5 -5
- data/tracks/lua/exercises/transpose/README.md +7 -7
- data/tracks/lua/exercises/triangle/README.md +9 -6
- data/tracks/lua/exercises/variable-length-quantity/README.md +6 -7
- data/tracks/lua/exercises/word-count/README.md +1 -2
- data/tracks/lua/exercises/word-search/README.md +1 -1
- data/tracks/perl6/exercises/leap/Example.pm6 +1 -1
- data/tracks/perl6/exercises/leap/Leap.pm6 +1 -1
- data/tracks/perl6/exercises/leap/example.yaml +1 -1
- data/tracks/perl6/exercises/leap/leap.t +3 -3
- data/tracks/php/exercises/transpose/example.php +37 -15
- data/tracks/php/exercises/transpose/transpose_test.php +205 -45
- data/tracks/purescript/config.json +11 -0
- data/tracks/purescript/exercises/collatz-conjecture/README.md +33 -0
- data/tracks/purescript/exercises/collatz-conjecture/bower.json +26 -0
- data/tracks/purescript/exercises/collatz-conjecture/examples/src/CollatzConjecture.purs +15 -0
- data/tracks/purescript/exercises/collatz-conjecture/src/CollatzConjecture.purs +3 -0
- data/tracks/purescript/exercises/collatz-conjecture/test/Main.purs +43 -0
- data/tracks/python/config.json +10 -2
- data/tracks/racket/README.md +38 -33
- data/tracks/racket/config.json +10 -0
- data/tracks/racket/exercises/collatz-conjecture/README.md +58 -0
- data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture-test.rkt +34 -0
- data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture.rkt +6 -0
- data/tracks/racket/exercises/collatz-conjecture/example.rkt +20 -0
- data/tracks/ruby/exercises/allergies/.meta/.version +1 -0
- data/tracks/ruby/exercises/allergies/.meta/generator/allergies_case.rb +33 -0
- data/tracks/ruby/exercises/allergies/.meta/solutions/allergies.rb +4 -0
- data/tracks/ruby/exercises/allergies/allergies_test.rb +42 -9
- data/tracks/typescript/config.json +46 -0
- data/tracks/typescript/exercises/circular-buffer/README.md +74 -0
- data/tracks/typescript/exercises/circular-buffer/circular-buffer.example.ts +51 -0
- data/tracks/typescript/exercises/circular-buffer/circular-buffer.test.ts +103 -0
- data/tracks/typescript/exercises/circular-buffer/circular-buffer.ts +0 -0
- data/tracks/typescript/exercises/circular-buffer/package.json +36 -0
- data/tracks/typescript/exercises/circular-buffer/tsconfig.json +22 -0
- data/tracks/typescript/exercises/circular-buffer/tslint.json +127 -0
- data/tracks/typescript/exercises/circular-buffer/yarn.lock +2305 -0
- data/tracks/typescript/exercises/largest-series-product/README.md +51 -0
- data/tracks/typescript/exercises/largest-series-product/largest-series-product.example.ts +52 -0
- data/tracks/typescript/exercises/largest-series-product/largest-series-product.test.ts +68 -0
- data/tracks/typescript/exercises/largest-series-product/largest-series-product.ts +0 -0
- data/tracks/typescript/exercises/largest-series-product/package.json +36 -0
- data/tracks/typescript/exercises/largest-series-product/tsconfig.json +22 -0
- data/tracks/typescript/exercises/largest-series-product/tslint.json +127 -0
- data/tracks/typescript/exercises/largest-series-product/yarn.lock +2305 -0
- data/tracks/typescript/exercises/robot-simulator/README.md +58 -0
- data/tracks/typescript/exercises/robot-simulator/package.json +36 -0
- data/tracks/typescript/exercises/robot-simulator/robot-simulator.example.ts +74 -0
- data/tracks/typescript/exercises/robot-simulator/robot-simulator.test.ts +150 -0
- data/tracks/typescript/exercises/robot-simulator/robot-simulator.ts +0 -0
- data/tracks/typescript/exercises/robot-simulator/tsconfig.json +22 -0
- data/tracks/typescript/exercises/robot-simulator/tslint.json +127 -0
- data/tracks/typescript/exercises/robot-simulator/yarn.lock +2305 -0
- metadata +85 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec68899acf97545d543c40f4bef852453e55c1e1
|
4
|
+
data.tar.gz: 829b5be04375b44cb89e7575d0d8116805d70d48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12372ce3823eb15f1203cebb8164ea17ed425491ce7bcd0958c57769b393ac4b83bb54eb1a732542b3110ba2b9e113c0a9bf3524de352729b4e27b94949359d2
|
7
|
+
data.tar.gz: '09d000ded12e61b97617d0a59fc7d1b8933a4091905e9e9455ddcc60756767f282a1d1ab7c18c0a2e1104dc1aba01ba2be2f7e35e1eea26af73d77ead9f5426f'
|
data/lib/trackler/version.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
"comments": [
|
4
4
|
"A pangram is a sentence using every letter of the alphabet at least once."
|
5
5
|
],
|
6
|
-
"version": "1.
|
6
|
+
"version": "1.3.0",
|
7
7
|
"cases": [
|
8
8
|
{
|
9
9
|
"description": "Check if the given string is an pangram",
|
@@ -36,9 +36,9 @@
|
|
36
36
|
"expected": false
|
37
37
|
},
|
38
38
|
{
|
39
|
-
"description": "another missing character '
|
39
|
+
"description": "another missing character, e.g. 'h'",
|
40
40
|
"property": "isPangram",
|
41
|
-
"input": "
|
41
|
+
"input": "five boxing wizards jump quickly at it",
|
42
42
|
"expected": false
|
43
43
|
},
|
44
44
|
{
|
@@ -13,22 +13,15 @@ env:
|
|
13
13
|
- PATH=~/.roswell/bin:$PATH
|
14
14
|
- ROSWELL_INSTALL_DIR=$HOME/.roswell
|
15
15
|
matrix:
|
16
|
-
- LISP=sbcl
|
16
|
+
- LISP=sbcl-bin
|
17
17
|
- LISP=abcl-bin
|
18
|
-
- LISP=allegro
|
19
18
|
- LISP=ccl-bin
|
20
19
|
- LISP=ecl
|
21
|
-
- LISP=clasp
|
22
20
|
- LISP=clisp
|
23
|
-
- LISP=cmu-bin
|
24
|
-
#- LISP=sbcl-bin
|
25
21
|
|
26
22
|
matrix:
|
27
23
|
fast_finish: true
|
28
|
-
|
29
|
-
- env: LISP=clasp
|
30
|
-
- env: LISP=clisp
|
31
|
-
- env: LISP=cmu-bin
|
24
|
+
|
32
25
|
|
33
26
|
install:
|
34
27
|
- curl -L 'https://raw.githubusercontent.com/snmsts/roswell/release/scripts/install-for-ci.sh' | sh
|
@@ -9,18 +9,52 @@ with `(lisp-unit:run-tests :all :point-mutations-test)`.
|
|
9
9
|
|
10
10
|
## Making your first Common Lisp solution
|
11
11
|
|
12
|
-
To create lisp code that can be loaded with `(load "
|
13
|
-
for the first exercise, put this code in `
|
12
|
+
To create lisp code that can be loaded with `(load "hamming")`
|
13
|
+
for the first exercise, put this code in `hamming.lisp`:
|
14
14
|
|
15
15
|
```lisp
|
16
|
-
(
|
17
|
-
(
|
18
|
-
(:
|
19
|
-
(:export #:hamming-distance))
|
16
|
+
(defpackage #:hamming
|
17
|
+
(:use #:cl)
|
18
|
+
(:export #:distance))
|
20
19
|
|
21
|
-
(in-package #:
|
20
|
+
(in-package #:hamming)
|
22
21
|
|
23
|
-
(defun
|
24
|
-
"
|
22
|
+
(defun distance (dna1 dna2)
|
23
|
+
"Number of positional differences in two equal length dna strands."
|
24
|
+
;;; your solution here
|
25
25
|
)
|
26
26
|
```
|
27
|
+
|
28
|
+
## How to run the tests
|
29
|
+
|
30
|
+
If you have a running Lisp implementation you can load the test file
|
31
|
+
with the command: `(load "hamming-tests")`.
|
32
|
+
|
33
|
+
If instead you'd like to do it from the command line the command you
|
34
|
+
need to run depends upon the implementation. Please refer to the
|
35
|
+
documentation for your implementation. Here we'll give examples of how
|
36
|
+
to do it in two common implementations:
|
37
|
+
[Clisp](https://clisp.sourceforge.io) & [SBCL](http://www.sbcl.org).
|
38
|
+
|
39
|
+
It is important to make sure that the command you run will load the
|
40
|
+
implementation's init file, which is needed to ensure QuickLisp is
|
41
|
+
loaded, then loads the test file, then exits back the command line.
|
42
|
+
|
43
|
+
### Clisp
|
44
|
+
|
45
|
+
Either of the following commands will work:
|
46
|
+
|
47
|
+
```
|
48
|
+
clisp -i ~/.clisprc.lisp hamming-test.lisp
|
49
|
+
```
|
50
|
+
|
51
|
+
```
|
52
|
+
clisp -i hamming-test.lisp -x '(ext:exit)'
|
53
|
+
```
|
54
|
+
|
55
|
+
### SBCL
|
56
|
+
|
57
|
+
```
|
58
|
+
sbcl --load hamming-test.lisp --quit
|
59
|
+
```
|
60
|
+
|
@@ -18,11 +18,11 @@ type
|
|
18
18
|
|
19
19
|
[Test]
|
20
20
|
[Ignore]
|
21
|
-
procedure
|
21
|
+
procedure can_count_one_nucleotide_in_single_character_input;
|
22
22
|
|
23
23
|
[Test]
|
24
24
|
[Ignore]
|
25
|
-
procedure
|
25
|
+
procedure strand_with_repeated_nucleotide;
|
26
26
|
|
27
27
|
[Test]
|
28
28
|
[Ignore]
|
data/tracks/elixir/.travis.yml
CHANGED
data/tracks/elixir/README.md
CHANGED
@@ -6,7 +6,7 @@ Exercism Exercises in Elixir
|
|
6
6
|
|
7
7
|
## Setup
|
8
8
|
|
9
|
-
The exercises currently target Elixir 1.
|
9
|
+
The exercises currently target Elixir 1.5.2 and Erlang/OTP 20. Detailed
|
10
10
|
installation instructions can be found at
|
11
11
|
[http://elixir-lang.org/install.html](http://elixir-lang.org/install.html).
|
12
12
|
|
@@ -32,7 +32,7 @@ Please keep the following in mind:
|
|
32
32
|
best to discuss these changes before doing the work.
|
33
33
|
|
34
34
|
- Follow the coding standards found in
|
35
|
-
[The Elixir Style Guide](https://github.com/
|
35
|
+
[The Elixir Style Guide](https://github.com/lexmag/elixir-style-guide).
|
36
36
|
|
37
37
|
- Watch out for trailing spaces, extra blank lines, and spaces in blank lines.
|
38
38
|
|
@@ -40,10 +40,6 @@ Please keep the following in mind:
|
|
40
40
|
exercise directory. They will not be included when the user fetches the
|
41
41
|
exercise.
|
42
42
|
|
43
|
-
- Please do not add a README or README.md file to the exercise directory. The
|
44
|
-
READMEs are constructed using shared metadata, which lives in the
|
45
|
-
[exercism/x-common](https://github.com/exercism/x-common) repository.
|
46
|
-
|
47
43
|
- Each problem should have a test suite, an example solution, and a template
|
48
44
|
file for the real implementation. The example solution should be named
|
49
45
|
`example.exs`.
|
@@ -10,19 +10,8 @@ do
|
|
10
10
|
done
|
11
11
|
|
12
12
|
elixirc -o ./tmp/build ./tmp/src/*.exs
|
13
|
-
|
14
|
-
|
15
|
-
export PLT_FILENAME=elixir-${TRAVIS_ELIXIR_VERSION:=1.3.2}_${TRAVIS_OTP_RELEASE:=19.0}.plt
|
16
|
-
export PLT_LOCATION=./tmp/$PLT_FILENAME
|
17
|
-
wget -O $PLT_LOCATION https://github.com/danielberkompas/travis_elixir_plts/blob/master/elixir-${TRAVIS_ELIXIR_VERSION}_${TRAVIS_OTP_RELEASE}.plt?raw=true
|
18
|
-
|
19
|
-
dialyzer --no_check_plt --plt $PLT_LOCATION --no_native ./tmp/build;
|
20
|
-
RESULT=$?
|
21
|
-
else
|
22
|
-
dialyzer ./tmp/build;
|
23
|
-
RESULT=$?
|
24
|
-
fi
|
25
|
-
|
13
|
+
mix dialyzer
|
14
|
+
RESULT=$?
|
26
15
|
rm -rf ./tmp
|
27
16
|
|
28
17
|
exit $RESULT
|
@@ -14,7 +14,8 @@ defmodule Allergies do
|
|
14
14
|
|
15
15
|
def list(flags) do
|
16
16
|
Enum.with_index(@allergens)
|
17
|
-
|> Enum.
|
17
|
+
|> Enum.filter(&flagged?(flags, &1))
|
18
|
+
|> Enum.map(fn {item, _} -> item end)
|
18
19
|
end
|
19
20
|
|
20
21
|
def allergic_to?(flags, item) do
|
@@ -22,6 +23,6 @@ defmodule Allergies do
|
|
22
23
|
end
|
23
24
|
|
24
25
|
defp flagged?(flags, {_, index}) do
|
25
|
-
(flags &&&
|
26
|
+
(flags &&& 1 <<< index) > 0
|
26
27
|
end
|
27
28
|
end
|
@@ -9,12 +9,12 @@ defmodule Atbash do
|
|
9
9
|
iex> Atbash.encode("completely insecure")
|
10
10
|
"xlnko vgvob rmhvx fiv"
|
11
11
|
"""
|
12
|
-
@spec encode(String.t) :: String.t
|
12
|
+
@spec encode(String.t()) :: String.t()
|
13
13
|
def encode(plaintext) do
|
14
14
|
plaintext |> normalize |> transpose |> chunk |> Enum.join(" ")
|
15
15
|
end
|
16
16
|
|
17
|
-
@spec decode(String.t) :: String.t
|
17
|
+
@spec decode(String.t()) :: String.t()
|
18
18
|
def decode(cipher) do
|
19
19
|
cipher |> normalize |> transpose
|
20
20
|
end
|
@@ -25,9 +25,9 @@ defmodule Atbash do
|
|
25
25
|
|
26
26
|
defp transpose(text) do
|
27
27
|
text
|
28
|
-
|> String.
|
28
|
+
|> String.to_charlist()
|
29
29
|
|> Enum.map(&convert/1)
|
30
|
-
|> List.to_string
|
30
|
+
|> List.to_string()
|
31
31
|
end
|
32
32
|
|
33
33
|
defp convert(character) do
|
@@ -35,6 +35,6 @@ defmodule Atbash do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
defp chunk(input) do
|
38
|
-
Regex.scan(~r(.{1,5}), input) |> List.flatten
|
38
|
+
Regex.scan(~r(.{1,5}), input) |> List.flatten()
|
39
39
|
end
|
40
40
|
end
|
@@ -8,20 +8,20 @@ defmodule BankAccount do
|
|
8
8
|
## Callbacks
|
9
9
|
|
10
10
|
def init(_args) do
|
11
|
-
{
|
11
|
+
{:ok, 0}
|
12
12
|
end
|
13
13
|
|
14
14
|
def handle_call(:balance, _from, balance) do
|
15
|
-
{
|
15
|
+
{:reply, balance, balance}
|
16
16
|
end
|
17
17
|
|
18
|
-
def handle_call({
|
19
|
-
{
|
18
|
+
def handle_call({:update, amount}, _from, balance) do
|
19
|
+
{:reply, :ok, balance + amount}
|
20
20
|
end
|
21
21
|
|
22
22
|
def handle_call(:close, _from, balance) do
|
23
23
|
# We stop normally and return :stopped to the caller.
|
24
|
-
{
|
24
|
+
{:stop, :normal, :stopped, balance}
|
25
25
|
end
|
26
26
|
|
27
27
|
## Interface for tests
|
@@ -36,7 +36,7 @@ defmodule BankAccount do
|
|
36
36
|
"""
|
37
37
|
@spec open_bank() :: account
|
38
38
|
def open_bank() do
|
39
|
-
{
|
39
|
+
{:ok, pid} = GenServer.start_link(__MODULE__, [], [])
|
40
40
|
pid
|
41
41
|
end
|
42
42
|
|
@@ -45,7 +45,7 @@ defmodule BankAccount do
|
|
45
45
|
"""
|
46
46
|
@spec close_bank(account) :: any
|
47
47
|
def close_bank(account) do
|
48
|
-
|
48
|
+
GenServer.stop(account)
|
49
49
|
end
|
50
50
|
|
51
51
|
@doc """
|
@@ -54,9 +54,9 @@ defmodule BankAccount do
|
|
54
54
|
@spec balance(account) :: integer
|
55
55
|
def balance(account) do
|
56
56
|
if Process.alive?(account) do
|
57
|
-
|
57
|
+
GenServer.call(account, :balance)
|
58
58
|
else
|
59
|
-
{
|
59
|
+
{:error, :account_closed}
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -65,9 +65,9 @@ defmodule BankAccount do
|
|
65
65
|
"""
|
66
66
|
def update(account, amount) do
|
67
67
|
if Process.alive?(account) do
|
68
|
-
|
68
|
+
GenServer.call(account, {:update, amount})
|
69
69
|
else
|
70
|
-
{
|
70
|
+
{:error, :account_closed}
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
@@ -19,17 +19,17 @@ defmodule Bob do
|
|
19
19
|
|
20
20
|
def hey(input) do
|
21
21
|
cond do
|
22
|
-
silent?(input)
|
22
|
+
silent?(input) -> "Fine. Be that way!"
|
23
23
|
question?(input) -> "Sure."
|
24
24
|
shouting?(input) -> "Whoa, chill out!"
|
25
|
-
true
|
25
|
+
true -> "Whatever."
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
defp silent?(input),
|
29
|
+
defp silent?(input), do: "" == String.trim(input)
|
30
30
|
defp shouting?(input), do: input == String.upcase(input) && letters?(input)
|
31
31
|
defp question?(input), do: String.ends_with?(input, "?")
|
32
|
-
defp letters?(input),
|
32
|
+
defp letters?(input), do: Regex.match?(~r/\p{L}+/, input)
|
33
33
|
end
|
34
34
|
|
35
35
|
# Another approach which abstracts knowing about string categories
|
@@ -1,70 +1,75 @@
|
|
1
1
|
defmodule Forth do
|
2
2
|
defmodule State do
|
3
|
+
@type t :: %__MODULE__{}
|
4
|
+
|
3
5
|
defstruct stack: [], defs: %{}, input: []
|
4
6
|
end
|
5
7
|
|
6
|
-
@opaque evaluator :: State.t
|
8
|
+
@opaque evaluator :: State.t()
|
7
9
|
|
8
10
|
defmodule Primitives do
|
9
11
|
def defs do
|
10
12
|
%{
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
"+" => &math_op(&1, :+),
|
14
|
+
"-" => &math_op(&1, :-),
|
15
|
+
"*" => &math_op(&1, :*),
|
16
|
+
"/" => &math_op(&1, :/),
|
17
|
+
"DUP" => &dup/1,
|
18
|
+
"DROP" => &drop/1,
|
19
|
+
"SWAP" => &swap/1,
|
20
|
+
"OVER" => &over/1
|
21
|
+
}
|
20
22
|
end
|
21
23
|
|
22
24
|
defp math_op(s, op) do
|
23
|
-
{
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
{s, [a, b]} = pop(s, 2)
|
26
|
+
|
27
|
+
res =
|
28
|
+
case op do
|
29
|
+
:+ -> a + b
|
30
|
+
:- -> a - b
|
31
|
+
:* -> a * b
|
32
|
+
:/ when b == 0 -> raise Forth.DivisionByZero
|
33
|
+
:/ -> div(a, b)
|
34
|
+
end
|
35
|
+
|
31
36
|
push(s, res)
|
32
37
|
end
|
33
38
|
|
34
39
|
defp dup(s) do
|
35
|
-
{
|
36
|
-
%{s | stack: [x,x|s.stack]}
|
40
|
+
{s, [x]} = pop(s, 1)
|
41
|
+
%{s | stack: [x, x | s.stack]}
|
37
42
|
end
|
38
43
|
|
39
44
|
defp drop(s) do
|
40
|
-
{
|
45
|
+
{s, _} = pop(s, 1)
|
41
46
|
s
|
42
47
|
end
|
43
48
|
|
44
49
|
defp swap(s) do
|
45
|
-
{
|
46
|
-
%{s | stack: [a,b|s.stack]}
|
50
|
+
{s, [a, b]} = pop(s, 2)
|
51
|
+
%{s | stack: [a, b | s.stack]}
|
47
52
|
end
|
48
53
|
|
49
54
|
defp over(s) do
|
50
55
|
case s.stack do
|
51
56
|
[b, a | t] -> %{s | stack: [a, b, a | t]}
|
52
|
-
_
|
57
|
+
_ -> raise Forth.StackUnderflow
|
53
58
|
end
|
54
59
|
end
|
55
60
|
|
56
61
|
# Pops and returns in reverse order (so the patterns catching those args can
|
57
62
|
# be written in the way you'd think about them in Forth).
|
58
63
|
defp pop(s, n) do
|
59
|
-
{
|
60
|
-
{
|
64
|
+
{stack, acc} = do_pop(s.stack, n, [])
|
65
|
+
{%{s | stack: stack}, acc}
|
61
66
|
end
|
62
67
|
|
63
|
-
defp do_pop(stack, 0, acc), do: {
|
64
|
-
defp do_pop([h|t], n, acc), do: do_pop(t, n-1, [h|acc])
|
65
|
-
defp do_pop([], _, _), do: raise
|
68
|
+
defp do_pop(stack, 0, acc), do: {stack, acc}
|
69
|
+
defp do_pop([h | t], n, acc), do: do_pop(t, n - 1, [h | acc])
|
70
|
+
defp do_pop([], _, _), do: raise(Forth.StackUnderflow)
|
66
71
|
|
67
|
-
defp push(s, x), do: %{s | stack: [x|s.stack]}
|
72
|
+
defp push(s, x), do: %{s | stack: [x | s.stack]}
|
68
73
|
end
|
69
74
|
|
70
75
|
@doc """
|
@@ -72,29 +77,34 @@ defmodule Forth do
|
|
72
77
|
"""
|
73
78
|
@spec new() :: evaluator
|
74
79
|
def new() do
|
75
|
-
%State{defs: Primitives.defs}
|
80
|
+
%State{defs: Primitives.defs()}
|
76
81
|
end
|
77
82
|
|
78
83
|
@doc """
|
79
84
|
Evaluate an input string, updating the evaluator state.
|
80
85
|
"""
|
81
|
-
@spec eval(evaluator, String.t) :: evaluator
|
86
|
+
@spec eval(evaluator, String.t()) :: evaluator
|
82
87
|
def eval(ev, s) do
|
83
88
|
do_eval(%{ev | input: ev.input ++ tokenize(s)})
|
84
89
|
end
|
85
90
|
|
86
91
|
defp do_eval(s = %State{input: []}), do: s
|
87
|
-
|
88
|
-
|
92
|
+
|
93
|
+
defp do_eval(s = %State{stack: stack, input: [h | t]}) when is_integer(h) do
|
94
|
+
do_eval(%{s | stack: [h | stack], input: t})
|
89
95
|
end
|
90
|
-
|
96
|
+
|
97
|
+
defp do_eval(s = %State{input: [":", h | t]}) do
|
91
98
|
if is_binary(h) do
|
92
99
|
w = String.upcase(h)
|
93
100
|
# Find the ";", otherwise just return the current state and wait for the
|
94
101
|
# user to finish the definition.
|
95
102
|
case Enum.split_while(t, &(&1 != ";")) do
|
96
|
-
|
97
|
-
{
|
103
|
+
# ";" not found
|
104
|
+
{_, []} ->
|
105
|
+
s
|
106
|
+
|
107
|
+
{ws, [";" | r]} ->
|
98
108
|
do_eval(%{s | defs: Map.put(s.defs, w, ws), input: r})
|
99
109
|
end
|
100
110
|
else
|
@@ -102,14 +112,22 @@ defmodule Forth do
|
|
102
112
|
raise Forth.InvalidWord, word: h
|
103
113
|
end
|
104
114
|
end
|
105
|
-
|
115
|
+
|
116
|
+
defp do_eval(s = %State{defs: defs, input: [h | t]}) when is_binary(h) do
|
106
117
|
w = String.upcase(h)
|
118
|
+
|
107
119
|
case defs[w] do
|
108
|
-
nil
|
109
|
-
|
120
|
+
nil ->
|
121
|
+
raise Forth.UnknownWord, word: w
|
122
|
+
|
123
|
+
d when is_function(d) ->
|
124
|
+
do_eval(d.(%{s | input: t}))
|
125
|
+
|
110
126
|
# To evaluate a user defined function we'll just put the function
|
111
127
|
# definition in the input list. That should do the trick.
|
112
|
-
d
|
128
|
+
d
|
129
|
+
when is_list(d) ->
|
130
|
+
do_eval(%{s | input: d ++ t})
|
113
131
|
end
|
114
132
|
end
|
115
133
|
|
@@ -118,8 +136,8 @@ defmodule Forth do
|
|
118
136
|
|> Stream.map(&hd/1)
|
119
137
|
|> Enum.map(fn t ->
|
120
138
|
case Integer.parse(t) do
|
121
|
-
{
|
122
|
-
_
|
139
|
+
{i, ""} -> i
|
140
|
+
_ -> t
|
123
141
|
end
|
124
142
|
end)
|
125
143
|
end
|
@@ -128,7 +146,7 @@ defmodule Forth do
|
|
128
146
|
Return the current stack as a string with the element on top of the stack
|
129
147
|
being the rightmost element in the string.
|
130
148
|
"""
|
131
|
-
@spec format_stack(evaluator) :: String.t
|
149
|
+
@spec format_stack(evaluator) :: String.t()
|
132
150
|
def format_stack(%State{stack: stack}) do
|
133
151
|
# Enum.join calls to_string on each element, no need to do that ourselves.
|
134
152
|
Enum.reverse(stack) |> Enum.join(" ")
|
@@ -141,13 +159,13 @@ defmodule Forth.StackUnderflow do
|
|
141
159
|
end
|
142
160
|
|
143
161
|
defmodule Forth.InvalidWord do
|
144
|
-
defexception
|
145
|
-
def message(e), do: "invalid word: #{inspect
|
162
|
+
defexception word: nil
|
163
|
+
def message(e), do: "invalid word: #{inspect(e.word)}"
|
146
164
|
end
|
147
165
|
|
148
166
|
defmodule Forth.UnknownWord do
|
149
|
-
defexception
|
150
|
-
def message(e), do: "unknown word: #{inspect
|
167
|
+
defexception word: nil
|
168
|
+
def message(e), do: "unknown word: #{inspect(e.word)}"
|
151
169
|
end
|
152
170
|
|
153
171
|
defmodule Forth.DivisionByZero do
|