trackler 2.2.1.47 → 2.2.1.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|