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
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
local function InputCell(value)
|
|
2
|
+
local children = {}
|
|
3
|
+
|
|
4
|
+
return {
|
|
5
|
+
get_value = function()
|
|
6
|
+
return value
|
|
7
|
+
end,
|
|
8
|
+
|
|
9
|
+
set_value = function(new_value)
|
|
10
|
+
value = new_value
|
|
11
|
+
for _, child in ipairs(children) do
|
|
12
|
+
child._propagate()
|
|
13
|
+
end
|
|
14
|
+
for _, child in ipairs(children) do
|
|
15
|
+
child._update()
|
|
16
|
+
end
|
|
17
|
+
end,
|
|
18
|
+
|
|
19
|
+
_add_child = function(child)
|
|
20
|
+
table.insert(children, child)
|
|
21
|
+
end
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
local function ComputeCell(...)
|
|
26
|
+
local callbacks = {}
|
|
27
|
+
local children = {}
|
|
28
|
+
local value
|
|
29
|
+
local previous_value
|
|
30
|
+
local cell = {}
|
|
31
|
+
|
|
32
|
+
local inputs, f do
|
|
33
|
+
local args = table.pack(...)
|
|
34
|
+
if args.n == 3 then
|
|
35
|
+
inputs = { args[1], args[2] }
|
|
36
|
+
f = args[3]
|
|
37
|
+
else
|
|
38
|
+
inputs = { args[1] }
|
|
39
|
+
f = args[2]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
local function calculate_value()
|
|
44
|
+
local args = {}
|
|
45
|
+
for _, input in ipairs(inputs) do
|
|
46
|
+
table.insert(args, input.get_value())
|
|
47
|
+
end
|
|
48
|
+
return f(table.unpack(args))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
function cell.get_value()
|
|
52
|
+
return value
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
function cell.watch(callback)
|
|
56
|
+
table.insert(callbacks, callback)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
function cell.unwatch(callback)
|
|
60
|
+
for i, _callback in ipairs(callbacks) do
|
|
61
|
+
if callback == _callback then
|
|
62
|
+
table.remove(callbacks, i)
|
|
63
|
+
return
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
function cell._propagate()
|
|
69
|
+
value = calculate_value()
|
|
70
|
+
for _, child in ipairs(children) do
|
|
71
|
+
child._propagate()
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
function cell._update()
|
|
76
|
+
if previous_value ~= value then
|
|
77
|
+
previous_value = value
|
|
78
|
+
for _, callback in ipairs(callbacks) do
|
|
79
|
+
callback(value)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
for _, child in ipairs(children) do
|
|
83
|
+
child._update()
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
function cell._add_child(child)
|
|
88
|
+
table.insert(children, child)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
value = calculate_value()
|
|
92
|
+
previous_value = value
|
|
93
|
+
|
|
94
|
+
for _, input in ipairs(inputs) do
|
|
95
|
+
input._add_child(cell)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
return cell
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
local function Reactor()
|
|
102
|
+
return {
|
|
103
|
+
InputCell = InputCell,
|
|
104
|
+
ComputeCell = ComputeCell
|
|
105
|
+
}
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
return { Reactor = Reactor }
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
local react = require 'react'
|
|
2
|
+
|
|
3
|
+
describe('react', function()
|
|
4
|
+
it('input cells have a value', function()
|
|
5
|
+
local r = react.Reactor()
|
|
6
|
+
local input = r.InputCell(2)
|
|
7
|
+
|
|
8
|
+
assert.are.equal(2, input.get_value())
|
|
9
|
+
end)
|
|
10
|
+
|
|
11
|
+
it("an input cell's value can be set", function()
|
|
12
|
+
local r = react.Reactor()
|
|
13
|
+
local input = r.InputCell(4)
|
|
14
|
+
|
|
15
|
+
input.set_value(20)
|
|
16
|
+
assert.are.equal(20, input.get_value())
|
|
17
|
+
end)
|
|
18
|
+
|
|
19
|
+
it('compute cells calculate initial value', function()
|
|
20
|
+
local r = react.Reactor()
|
|
21
|
+
local input = r.InputCell(1)
|
|
22
|
+
local output = r.ComputeCell(input, function(x) return x + 1 end)
|
|
23
|
+
|
|
24
|
+
assert.are.equal(2, output.get_value())
|
|
25
|
+
end)
|
|
26
|
+
|
|
27
|
+
it('compute cells take inputs in the right order', function()
|
|
28
|
+
local r = react.Reactor()
|
|
29
|
+
local one = r.InputCell(1)
|
|
30
|
+
local two = r.InputCell(2)
|
|
31
|
+
local output = r.ComputeCell(one, two, function(x, y) return x + y * 10 end)
|
|
32
|
+
|
|
33
|
+
assert.are.equal(21, output.get_value())
|
|
34
|
+
end)
|
|
35
|
+
|
|
36
|
+
it('compute cells update value when dependencies are changed', function()
|
|
37
|
+
local r = react.Reactor()
|
|
38
|
+
local input = r.InputCell(1)
|
|
39
|
+
local output = r.ComputeCell(input, function(x) return x + 1 end)
|
|
40
|
+
|
|
41
|
+
input.set_value(3)
|
|
42
|
+
assert.are.equal(4, output.get_value())
|
|
43
|
+
end)
|
|
44
|
+
|
|
45
|
+
it('compute cells can depend on other compute cells', function()
|
|
46
|
+
local r = react.Reactor()
|
|
47
|
+
local input = r.InputCell(1)
|
|
48
|
+
local times_two = r.ComputeCell(input, function(x) return x * 2 end)
|
|
49
|
+
local times_thirty = r.ComputeCell(input, function(x) return x * 30 end)
|
|
50
|
+
local output = r.ComputeCell(times_two, times_thirty, function(x, y) return x + y end)
|
|
51
|
+
|
|
52
|
+
assert.are.equal(32, output.get_value())
|
|
53
|
+
|
|
54
|
+
input.set_value(3)
|
|
55
|
+
assert.are.equal(96, output.get_value())
|
|
56
|
+
end)
|
|
57
|
+
|
|
58
|
+
it('compute cells fire callbacks', function()
|
|
59
|
+
local r = react.Reactor()
|
|
60
|
+
local input = r.InputCell(1)
|
|
61
|
+
local output = r.ComputeCell(input, function(x) return x + 1 end)
|
|
62
|
+
local callback = spy.new(function() end)
|
|
63
|
+
|
|
64
|
+
output.watch(callback)
|
|
65
|
+
input.set_value(3)
|
|
66
|
+
assert.spy(callback).was_called(1)
|
|
67
|
+
assert.spy(callback).was_called_with(4)
|
|
68
|
+
end)
|
|
69
|
+
|
|
70
|
+
it('callbacks only fire on change', function()
|
|
71
|
+
local r = react.Reactor()
|
|
72
|
+
local input = r.InputCell(1)
|
|
73
|
+
local output = r.ComputeCell(input, function(x)
|
|
74
|
+
if x < 3 then
|
|
75
|
+
return 111
|
|
76
|
+
else
|
|
77
|
+
return 222
|
|
78
|
+
end
|
|
79
|
+
end)
|
|
80
|
+
local callback = spy.new(function() end)
|
|
81
|
+
|
|
82
|
+
output.watch(callback)
|
|
83
|
+
|
|
84
|
+
input.set_value(2)
|
|
85
|
+
assert.spy(callback).was_called(0)
|
|
86
|
+
|
|
87
|
+
input.set_value(4)
|
|
88
|
+
assert.spy(callback).was_called(1)
|
|
89
|
+
assert.spy(callback).was_called_with(222)
|
|
90
|
+
end)
|
|
91
|
+
|
|
92
|
+
it('callbacks can be added and removed', function()
|
|
93
|
+
local r = react.Reactor()
|
|
94
|
+
local input = r.InputCell(11)
|
|
95
|
+
local output = r.ComputeCell(input, function(x) return x + 1 end)
|
|
96
|
+
local callback1 = spy.new(function() end)
|
|
97
|
+
local callback2 = spy.new(function() end)
|
|
98
|
+
local callback3 = spy.new(function() end)
|
|
99
|
+
|
|
100
|
+
output.watch(callback1)
|
|
101
|
+
output.watch(callback2)
|
|
102
|
+
input.set_value(31)
|
|
103
|
+
|
|
104
|
+
output.unwatch(callback1)
|
|
105
|
+
output.watch(callback3)
|
|
106
|
+
input.set_value(41)
|
|
107
|
+
|
|
108
|
+
assert.spy(callback1).was_called(1)
|
|
109
|
+
assert.spy(callback1).was_called_with(32)
|
|
110
|
+
assert.spy(callback2).was_called(2)
|
|
111
|
+
assert.spy(callback2).was_called_with(42)
|
|
112
|
+
assert.spy(callback3).was_called(1)
|
|
113
|
+
assert.spy(callback3).was_called_with(42)
|
|
114
|
+
end)
|
|
115
|
+
|
|
116
|
+
it("removing a callback multiple times doesn't interfere with other callbacks", function()
|
|
117
|
+
local r = react.Reactor()
|
|
118
|
+
local input = r.InputCell(1)
|
|
119
|
+
local output = r.ComputeCell(input, function(x) return x + 1 end)
|
|
120
|
+
local callback1 = spy.new(function() end)
|
|
121
|
+
local callback2 = spy.new(function() end)
|
|
122
|
+
|
|
123
|
+
output.watch(callback1)
|
|
124
|
+
output.watch(callback2)
|
|
125
|
+
for i = 1, 10 do output.unwatch(callback1) end
|
|
126
|
+
input.set_value(2)
|
|
127
|
+
|
|
128
|
+
assert.spy(callback1).was_called(0)
|
|
129
|
+
assert.spy(callback2).was_called(1)
|
|
130
|
+
assert.spy(callback2).was_called_with(3)
|
|
131
|
+
end)
|
|
132
|
+
|
|
133
|
+
it('callbacks only called once even if multiple inputs change', function()
|
|
134
|
+
local r = react.Reactor()
|
|
135
|
+
local input = r.InputCell(1)
|
|
136
|
+
local plus_one = r.ComputeCell(input, function(x) return x + 1 end)
|
|
137
|
+
local minus_one1 = r.ComputeCell(input, function(x) return x - 1 end)
|
|
138
|
+
local minus_one2 = r.ComputeCell(minus_one1, function(x) return x - 1 end)
|
|
139
|
+
local output = r.ComputeCell(plus_one, minus_one2, function(x, y) return x * y end)
|
|
140
|
+
local callback = spy.new(function() end)
|
|
141
|
+
|
|
142
|
+
output.watch(callback)
|
|
143
|
+
input.set_value(4)
|
|
144
|
+
assert.spy(callback).was_called(1)
|
|
145
|
+
assert.spy(callback).was_called_with(10)
|
|
146
|
+
end)
|
|
147
|
+
|
|
148
|
+
it("callbacks not called if inputs change but output doesn't", function()
|
|
149
|
+
local r = react.Reactor()
|
|
150
|
+
local input = r.InputCell(1)
|
|
151
|
+
local plus_one = r.ComputeCell(input, function(x) return x + 1 end)
|
|
152
|
+
local minus_one = r.ComputeCell(input, function(x) return x - 1 end)
|
|
153
|
+
local always_two = r.ComputeCell(plus_one, minus_one, function(x, y) return x - y end)
|
|
154
|
+
local callback = spy.new(function() end)
|
|
155
|
+
|
|
156
|
+
always_two.watch(callback)
|
|
157
|
+
for i = 1, 10 do input.set_value(i) end
|
|
158
|
+
assert.spy(callback).was_called(0)
|
|
159
|
+
end)
|
|
160
|
+
end)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Count the rectangles in an ASCII diagram like the one below.
|
|
4
4
|
|
|
5
|
-
```
|
|
5
|
+
```text
|
|
6
6
|
+--+
|
|
7
7
|
++ |
|
|
8
8
|
+-++--+
|
|
@@ -12,7 +12,7 @@ Count the rectangles in an ASCII diagram like the one below.
|
|
|
12
12
|
|
|
13
13
|
The above diagram contains 6 rectangles:
|
|
14
14
|
|
|
15
|
-
```
|
|
15
|
+
```text
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
+-----+
|
|
@@ -20,7 +20,7 @@ The above diagram contains 6 rectangles:
|
|
|
20
20
|
+-----+
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
```
|
|
23
|
+
```text
|
|
24
24
|
+--+
|
|
25
25
|
| |
|
|
26
26
|
| |
|
|
@@ -28,7 +28,7 @@ The above diagram contains 6 rectangles:
|
|
|
28
28
|
+--+
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
```
|
|
31
|
+
```text
|
|
32
32
|
+--+
|
|
33
33
|
| |
|
|
34
34
|
+--+
|
|
@@ -36,7 +36,7 @@ The above diagram contains 6 rectangles:
|
|
|
36
36
|
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
```
|
|
39
|
+
```text
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
+--+
|
|
@@ -44,7 +44,7 @@ The above diagram contains 6 rectangles:
|
|
|
44
44
|
+--+
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
```
|
|
47
|
+
```text
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
+--+
|
|
@@ -52,7 +52,7 @@ The above diagram contains 6 rectangles:
|
|
|
52
52
|
+--+
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
```
|
|
55
|
+
```text
|
|
56
56
|
|
|
57
57
|
++
|
|
58
58
|
++
|
|
@@ -7,20 +7,20 @@ Run-length encoding (RLE) is a simple form of data compression, where runs
|
|
|
7
7
|
|
|
8
8
|
For example we can represent the original 53 characters with only 13.
|
|
9
9
|
|
|
10
|
-
```
|
|
10
|
+
```text
|
|
11
11
|
"WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB" -> "12WB12W3B24WB"
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
RLE allows the original data to be perfectly reconstructed from
|
|
15
15
|
the compressed data, which makes it a lossless data compression.
|
|
16
16
|
|
|
17
|
-
```
|
|
17
|
+
```text
|
|
18
18
|
"AABCCCDEEEE" -> "2AB3CD4E" -> "AABCCCDEEEE"
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
For simplicity, you can assume that the unencoded string will only contain
|
|
22
|
-
the letters A through Z (either lower or upper case) and whitespace. This way
|
|
23
|
-
data to be encoded will never contain any numbers and numbers inside data to
|
|
22
|
+
the letters A through Z (either lower or upper case) and whitespace. This way
|
|
23
|
+
data to be encoded will never contain any numbers and numbers inside data to
|
|
24
24
|
be decoded always represent the count for the following character.
|
|
25
25
|
|
|
26
26
|
## Running the tests
|
|
@@ -6,7 +6,7 @@ Given a word, compute the scrabble score for that word.
|
|
|
6
6
|
|
|
7
7
|
You'll need these:
|
|
8
8
|
|
|
9
|
-
```
|
|
9
|
+
```text
|
|
10
10
|
Letter Value
|
|
11
11
|
A, E, I, O, U, L, N, R, S, T 1
|
|
12
12
|
D, G 2
|
|
@@ -18,6 +18,7 @@ Q, Z 10
|
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
## Examples
|
|
21
|
+
|
|
21
22
|
"cabbage" should be scored as worth 14 points:
|
|
22
23
|
|
|
23
24
|
- 3 points for C
|
|
@@ -34,6 +35,7 @@ And to total:
|
|
|
34
35
|
- = 14
|
|
35
36
|
|
|
36
37
|
## Extensions
|
|
38
|
+
|
|
37
39
|
- You can play a double or a triple letter.
|
|
38
40
|
- You can play a double or a triple word.
|
|
39
41
|
|
|
@@ -12,7 +12,8 @@ Given an age in seconds, calculate how old someone would be on:
|
|
|
12
12
|
- Neptune: orbital period 164.79132 Earth years
|
|
13
13
|
|
|
14
14
|
So if you were told someone were 1,000,000,000 seconds old, you should
|
|
15
|
-
be able to say that they're 31 Earth-years old.
|
|
15
|
+
be able to say that they're 31.69 Earth-years old. Round all ages to
|
|
16
|
+
the nearest hundredth of a year.
|
|
16
17
|
|
|
17
18
|
If you're wondering why Pluto didn't make the cut, go watch [this
|
|
18
19
|
youtube video](http://www.youtube.com/watch?v=Z_2gbGXzFbs).
|
|
@@ -8,9 +8,6 @@ multiples of either 3 or 5, we get 3, 5, 6 and 9, 10, 12, 15, and 18.
|
|
|
8
8
|
|
|
9
9
|
The sum of these multiples is 78.
|
|
10
10
|
|
|
11
|
-
Given a number, find the sum of the multiples of a given set of numbers,
|
|
12
|
-
up to but not including that number.
|
|
13
|
-
|
|
14
11
|
## Running the tests
|
|
15
12
|
|
|
16
13
|
To run the tests, run the command `busted .` from within the exercise directory.
|
|
@@ -5,7 +5,7 @@ Tally the results of a small football competition.
|
|
|
5
5
|
Based on an input file containing which team played against which and what the
|
|
6
6
|
outcome was, create a file with a table like this:
|
|
7
7
|
|
|
8
|
-
```
|
|
8
|
+
```text
|
|
9
9
|
Team | MP | W | D | L | P
|
|
10
10
|
Devastating Donkeys | 3 | 2 | 1 | 0 | 7
|
|
11
11
|
Allegoric Alaskans | 3 | 2 | 0 | 1 | 6
|
|
@@ -31,7 +31,7 @@ Input
|
|
|
31
31
|
|
|
32
32
|
Your tallying program will receive input that looks like:
|
|
33
33
|
|
|
34
|
-
```
|
|
34
|
+
```text
|
|
35
35
|
Allegoric Alaskans;Blithering Badgers;win
|
|
36
36
|
Devastating Donkeys;Courageous Californians;draw
|
|
37
37
|
Devastating Donkeys;Allegoric Alaskans;win
|
|
@@ -42,7 +42,7 @@ Allegoric Alaskans;Courageous Californians;win
|
|
|
42
42
|
|
|
43
43
|
The result of the match refers to the first team listed. So this line
|
|
44
44
|
|
|
45
|
-
```
|
|
45
|
+
```text
|
|
46
46
|
Allegoric Alaskans;Blithering Badgers;win
|
|
47
47
|
```
|
|
48
48
|
|
|
@@ -50,7 +50,7 @@ Means that the Allegoric Alaskans beat the Blithering Badgers.
|
|
|
50
50
|
|
|
51
51
|
This line:
|
|
52
52
|
|
|
53
|
-
```
|
|
53
|
+
```text
|
|
54
54
|
Courageous Californians;Blithering Badgers;loss
|
|
55
55
|
```
|
|
56
56
|
|
|
@@ -58,7 +58,7 @@ Means that the Blithering Badgers beat the Courageous Californians.
|
|
|
58
58
|
|
|
59
59
|
And this line:
|
|
60
60
|
|
|
61
|
-
```
|
|
61
|
+
```text
|
|
62
62
|
Devastating Donkeys;Courageous Californians;draw
|
|
63
63
|
```
|
|
64
64
|
|