trackler 2.2.1.54 → 2.2.1.55
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/dominoes/description.md +3 -3
- data/problem-specifications/exercises/two-fer/description.md +0 -28
- data/tracks/c/config.json +12 -0
- data/tracks/c/exercises/queen-attack/README.md +65 -0
- data/tracks/c/exercises/queen-attack/makefile +15 -0
- data/tracks/c/exercises/queen-attack/src/example.c +25 -0
- data/tracks/c/exercises/queen-attack/src/queen_attack.h +19 -0
- data/tracks/c/exercises/queen-attack/test/test_queen_attack.c +190 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity_internals.h +701 -0
- data/tracks/common-lisp/exercises/acronym/README.md +1 -1
- data/tracks/delphi/exercises/two-fer/README.md +0 -28
- data/tracks/ecmascript/config.json +41 -0
- data/tracks/ecmascript/exercises/accumulate/package.json +5 -3
- data/tracks/ecmascript/exercises/acronym/package.json +5 -3
- data/tracks/ecmascript/exercises/all-your-base/package.json +5 -3
- data/tracks/ecmascript/exercises/allergies/package.json +5 -3
- data/tracks/ecmascript/exercises/alphametics/package.json +5 -3
- data/tracks/ecmascript/exercises/anagram/package.json +5 -3
- data/tracks/ecmascript/exercises/atbash-cipher/package.json +5 -3
- data/tracks/ecmascript/exercises/beer-song/package.json +5 -3
- data/tracks/ecmascript/exercises/binary-search-tree/package.json +5 -3
- data/tracks/ecmascript/exercises/binary-search/package.json +5 -3
- data/tracks/ecmascript/exercises/binary/package.json +5 -3
- data/tracks/ecmascript/exercises/bob/package.json +5 -3
- data/tracks/ecmascript/exercises/bowling/package.json +2 -2
- data/tracks/ecmascript/exercises/bracket-push/package.json +5 -3
- data/tracks/ecmascript/exercises/change/README.md +44 -0
- data/tracks/ecmascript/exercises/change/change.spec.js +80 -0
- data/tracks/ecmascript/exercises/change/example.js +120 -0
- data/tracks/ecmascript/exercises/change/package.json +69 -0
- data/tracks/ecmascript/exercises/circular-buffer/package.json +5 -3
- data/tracks/ecmascript/exercises/clock/package.json +5 -3
- data/tracks/ecmascript/exercises/collatz-conjecture/package.json +6 -4
- data/tracks/ecmascript/exercises/connect/package.json +5 -3
- data/tracks/ecmascript/exercises/crypto-square/package.json +5 -3
- data/tracks/ecmascript/exercises/custom-set/package.json +5 -3
- data/tracks/ecmascript/exercises/diamond/package.json +5 -3
- data/tracks/ecmascript/exercises/difference-of-squares/package.json +5 -3
- data/tracks/ecmascript/exercises/diffie-hellman/package.json +5 -3
- data/tracks/ecmascript/exercises/etl/package.json +5 -3
- data/tracks/ecmascript/exercises/flatten-array/package.json +5 -3
- data/tracks/ecmascript/exercises/food-chain/package.json +5 -3
- data/tracks/ecmascript/exercises/gigasecond/package.json +5 -3
- data/tracks/ecmascript/exercises/grade-school/package.json +5 -3
- data/tracks/ecmascript/exercises/grains/package.json +5 -3
- data/tracks/ecmascript/exercises/hamming/package.json +5 -3
- data/tracks/ecmascript/exercises/hello-world/package.json +5 -3
- data/tracks/ecmascript/exercises/hexadecimal/package.json +5 -3
- data/tracks/ecmascript/exercises/isbn-verifier/README.md +62 -0
- data/tracks/ecmascript/exercises/isbn-verifier/example.js +17 -0
- data/tracks/ecmascript/exercises/isbn-verifier/isbn-verifier.spec.js +81 -0
- data/tracks/ecmascript/exercises/isbn-verifier/package.json +71 -0
- data/tracks/ecmascript/exercises/isogram/package.json +5 -3
- data/tracks/ecmascript/exercises/kindergarten-garden/package.json +5 -3
- data/tracks/ecmascript/exercises/largest-series-product/package.json +5 -3
- data/tracks/ecmascript/exercises/leap/package.json +5 -3
- data/tracks/ecmascript/exercises/linked-list/package.json +5 -3
- data/tracks/ecmascript/exercises/list-ops/package.json +5 -3
- data/tracks/ecmascript/exercises/luhn/package.json +5 -3
- data/tracks/ecmascript/exercises/matrix/package.json +5 -3
- data/tracks/ecmascript/exercises/meetup/package.json +5 -3
- data/tracks/ecmascript/exercises/minesweeper/package.json +5 -3
- data/tracks/ecmascript/exercises/nth-prime/package.json +5 -3
- data/tracks/ecmascript/exercises/ocr-numbers/package.json +5 -3
- data/tracks/ecmascript/exercises/octal/package.json +5 -3
- data/tracks/ecmascript/exercises/palindrome-products/package.json +5 -3
- data/tracks/ecmascript/exercises/pangram/package.json +5 -3
- data/tracks/ecmascript/exercises/pascals-triangle/package.json +5 -3
- data/tracks/ecmascript/exercises/perfect-numbers/package.json +5 -3
- data/tracks/ecmascript/exercises/phone-number/package.json +5 -3
- data/tracks/ecmascript/exercises/pig-latin/package.json +5 -3
- data/tracks/ecmascript/exercises/prime-factors/package.json +5 -3
- data/tracks/ecmascript/exercises/proverb/package.json +5 -3
- data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +5 -3
- data/tracks/ecmascript/exercises/queen-attack/package.json +5 -3
- data/tracks/ecmascript/exercises/raindrops/package.json +5 -3
- data/tracks/ecmascript/exercises/rna-transcription/package.json +5 -3
- data/tracks/ecmascript/exercises/robot-name/package.json +5 -3
- data/tracks/ecmascript/exercises/robot-simulator/package.json +5 -3
- data/tracks/ecmascript/exercises/roman-numerals/package.json +5 -3
- data/tracks/ecmascript/exercises/run-length-encoding/package.json +5 -3
- data/tracks/ecmascript/exercises/saddle-points/package.json +5 -3
- data/tracks/ecmascript/exercises/say/package.json +5 -3
- data/tracks/ecmascript/exercises/scrabble-score/package.json +5 -3
- data/tracks/ecmascript/exercises/secret-handshake/package.json +5 -3
- data/tracks/ecmascript/exercises/series/package.json +5 -3
- data/tracks/ecmascript/exercises/sieve/package.json +5 -3
- data/tracks/ecmascript/exercises/simple-cipher/package.json +5 -3
- data/tracks/ecmascript/exercises/simple-linked-list/package.json +5 -3
- data/tracks/ecmascript/exercises/space-age/package.json +5 -3
- data/tracks/ecmascript/exercises/strain/package.json +5 -3
- data/tracks/ecmascript/exercises/sublist/package.json +5 -3
- data/tracks/ecmascript/exercises/sum-of-multiples/package.json +5 -3
- data/tracks/ecmascript/exercises/transpose/README.md +94 -0
- data/tracks/ecmascript/exercises/transpose/example.js +12 -0
- data/tracks/ecmascript/exercises/transpose/package.json +71 -0
- data/tracks/ecmascript/exercises/transpose/transpose.spec.js +67 -0
- data/tracks/ecmascript/exercises/triangle/package.json +5 -3
- data/tracks/ecmascript/exercises/trinary/package.json +5 -3
- data/tracks/ecmascript/exercises/twelve-days/package.json +5 -3
- data/tracks/ecmascript/exercises/two-bucket/package.json +5 -3
- data/tracks/ecmascript/exercises/two-fer/package.json +5 -3
- data/tracks/ecmascript/exercises/word-count/package.json +5 -3
- data/tracks/ecmascript/exercises/word-search/package.json +5 -3
- data/tracks/ecmascript/exercises/wordy/package.json +5 -3
- data/tracks/ecmascript/package-lock.json +6219 -0
- data/tracks/ecmascript/package.json +5 -3
- data/tracks/erlang/exercises/collatz-conjecture/src/collatz_conjecture.erl +3 -4
- data/tracks/erlang/exercises/collatz-conjecture/src/example.erl +3 -3
- data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +13 -9
- data/tracks/erlang/exercises/hello-world/src/hello_world.erl +2 -2
- data/tracks/erlang/exercises/leap/src/example.erl +1 -1
- data/tracks/erlang/exercises/leap/src/leap.erl +3 -3
- data/tracks/erlang/exercises/leap/test/leap_tests.erl +9 -9
- data/tracks/erlang/testgen/src/testgen.erl +16 -13
- data/tracks/erlang/testgen/src/tgen.erl +65 -38
- data/tracks/erlang/testgen/src/tgen_collatz-conjecture.erl +38 -0
- data/tracks/erlang/testgen/src/tgen_hello-world.erl +11 -19
- data/tracks/erlang/testgen/src/tgen_leap.erl +31 -0
- data/tracks/erlang/testgen/src/tgs.erl +80 -0
- data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +78 -23
- data/tracks/fsharp/exercises/anagram/AnagramTest.fs +66 -34
- data/tracks/fsharp/exercises/connect/ConnectTest.fs +81 -68
- data/tracks/fsharp/exercises/connect/Example.fs +9 -5
- data/tracks/fsharp/exercises/food-chain/Example.fs +5 -9
- data/tracks/fsharp/exercises/food-chain/FoodChain.fs +2 -2
- data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +143 -75
- data/tracks/fsharp/exercises/hamming/Example.fs +8 -4
- data/tracks/fsharp/exercises/hamming/Hamming.fs +1 -1
- data/tracks/fsharp/exercises/hamming/HammingTest.fs +53 -13
- data/tracks/fsharp/exercises/house/Example.fs +5 -6
- data/tracks/fsharp/exercises/house/House.fs +3 -1
- data/tracks/fsharp/exercises/house/HouseTest.fs +272 -96
- data/tracks/fsharp/exercises/meetup/Example.fs +1 -1
- data/tracks/fsharp/exercises/meetup/Meetup.fs +1 -1
- data/tracks/fsharp/exercises/meetup/MeetupTest.fs +384 -73
- data/tracks/fsharp/exercises/ocr-numbers/Example.fs +43 -35
- data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +160 -125
- data/tracks/fsharp/exercises/two-fer/Example.fs +4 -2
- data/tracks/fsharp/exercises/two-fer/TwoFer.fs +1 -1
- data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +7 -4
- data/tracks/fsharp/generators/Common.fs +6 -2
- data/tracks/fsharp/generators/Exercise.fs +14 -13
- data/tracks/fsharp/generators/Generators.fs +145 -2
- data/tracks/fsharp/generators/Options.fs +4 -6
- data/tracks/fsharp/generators/Output.fs +2 -2
- data/tracks/fsharp/generators/Program.fs +4 -3
- data/tracks/java/exercises/saddle-points/README.md +1 -1
- data/tracks/java/exercises/two-fer/README.md +0 -28
- data/tracks/javascript/exercises/beer-song/example.js +18 -14
- data/tracks/kotlin/exercises/saddle-points/README.md +1 -1
- data/tracks/kotlin/exercises/two-fer/README.md +0 -28
- data/tracks/lua/config.json +12 -0
- data/tracks/lua/exercises/collatz-conjecture/README.md +43 -0
- data/tracks/lua/exercises/collatz-conjecture/collatz-conjecture_spec.lua +33 -0
- data/tracks/lua/exercises/collatz-conjecture/example.lua +16 -0
- data/tracks/python/config.json +4 -1
- data/tracks/python/exercises/binary-search/binary_search_test.py +2 -0
- data/tracks/python/exercises/change/change_test.py +2 -0
- data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +56 -50
- data/tracks/python/exercises/forth/example.py +3 -1
- data/tracks/python/exercises/forth/forth_test.py +43 -26
- data/tracks/python/exercises/nth-prime/nth_prime.py +1 -1
- data/tracks/python/exercises/rna-transcription/README.md +5 -0
- data/tracks/python/exercises/rna-transcription/example.py +1 -1
- data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +7 -4
- data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +9 -7
- data/tracks/python/exercises/saddle-points/saddle_points_test.py +15 -5
- data/tracks/python/exercises/simple-cipher/simple_cipher.py +7 -1
- data/tracks/python/exercises/word-count/example.py +6 -4
- data/tracks/python/exercises/word-count/word_count_test.py +49 -22
- data/tracks/python/exercises/word-search/word_search_test.py +104 -12
- data/tracks/rust/.travis.yml +2 -0
- data/tracks/rust/README.md +5 -0
- data/tracks/rust/_test/check-exercises.sh +0 -6
- data/tracks/rust/_test/ensure-lib-src-rs-exist.sh +19 -0
- data/tracks/rust/_test/ensure-stubs-compile.sh +26 -0
- data/tracks/rust/config.json +12 -0
- data/tracks/rust/config/exercise-readme-insert.md +3 -2
- data/tracks/rust/docs/ABOUT.md +2 -2
- data/tracks/rust/docs/LEARNING.md +1 -1
- data/tracks/rust/docs/RESOURCES.md +1 -1
- data/tracks/rust/docs/TESTS.md +2 -2
- data/tracks/rust/exercises/accumulate/README.md +3 -2
- data/tracks/rust/exercises/acronym/README.md +3 -2
- data/tracks/rust/exercises/all-your-base/README.md +3 -2
- data/tracks/rust/exercises/allergies/README.md +3 -2
- data/tracks/rust/exercises/alphametics/README.md +3 -2
- data/tracks/rust/exercises/anagram/README.md +3 -2
- data/tracks/rust/exercises/atbash-cipher/README.md +3 -2
- data/tracks/rust/exercises/beer-song/README.md +3 -2
- data/tracks/rust/exercises/beer-song/src/lib.rs +2 -2
- data/tracks/rust/exercises/binary-search/README.md +3 -2
- data/tracks/rust/exercises/bob/README.md +3 -2
- data/tracks/rust/exercises/bob/src/lib.rs +1 -1
- data/tracks/rust/exercises/bowling/README.md +3 -2
- data/tracks/rust/exercises/bracket-push/HINTS.md +1 -1
- data/tracks/rust/exercises/bracket-push/README.md +4 -3
- data/tracks/rust/exercises/circular-buffer/README.md +3 -2
- data/tracks/rust/exercises/clock/README.md +3 -2
- data/tracks/rust/exercises/collatz-conjecture/README.md +3 -2
- data/tracks/rust/exercises/collatz-conjecture/src/lib.rs +1 -1
- data/tracks/rust/exercises/crypto-square/README.md +3 -2
- data/tracks/rust/exercises/custom-set/README.md +3 -2
- data/tracks/rust/exercises/decimal/.meta/ALLOWED_TO_NOT_COMPILE +2 -0
- data/tracks/rust/exercises/decimal/README.md +3 -2
- data/tracks/rust/exercises/difference-of-squares/README.md +3 -2
- data/tracks/rust/exercises/difference-of-squares/src/lib.rs +3 -3
- data/tracks/rust/exercises/dominoes/README.md +3 -2
- data/tracks/rust/exercises/etl/README.md +3 -2
- data/tracks/rust/exercises/forth/README.md +3 -2
- data/tracks/rust/exercises/forth/src/lib.rs +3 -0
- data/tracks/rust/exercises/gigasecond/README.md +3 -2
- data/tracks/rust/exercises/grade-school/README.md +3 -2
- data/tracks/rust/exercises/grains/README.md +3 -2
- data/tracks/rust/exercises/hamming/README.md +3 -2
- data/tracks/rust/exercises/hello-world/GETTING_STARTED.md +1 -1
- data/tracks/rust/exercises/hello-world/README.md +3 -2
- data/tracks/rust/exercises/hexadecimal/README.md +3 -2
- data/tracks/rust/exercises/isogram/.gitignore +8 -0
- data/tracks/rust/exercises/isogram/Cargo.toml +3 -0
- data/tracks/rust/exercises/isogram/README.md +52 -0
- data/tracks/rust/exercises/isogram/example.rs +12 -0
- data/tracks/rust/exercises/isogram/src/lib.rs +0 -0
- data/tracks/rust/exercises/isogram/tests/isogram.rs +72 -0
- data/tracks/rust/exercises/largest-series-product/README.md +3 -2
- data/tracks/rust/exercises/leap/README.md +3 -2
- data/tracks/rust/exercises/leap/src/lib.rs +1 -1
- data/tracks/rust/exercises/luhn-from/README.md +3 -2
- data/tracks/rust/exercises/luhn-trait/.meta/description.md +2 -2
- data/tracks/rust/exercises/luhn-trait/README.md +5 -4
- data/tracks/rust/exercises/luhn/README.md +3 -2
- data/tracks/rust/exercises/minesweeper/README.md +3 -2
- data/tracks/rust/exercises/nth-prime/README.md +3 -2
- data/tracks/rust/exercises/nucleotide-codons/README.md +3 -2
- data/tracks/rust/exercises/nucleotide-count/README.md +3 -2
- data/tracks/rust/exercises/ocr-numbers/README.md +3 -2
- data/tracks/rust/exercises/pangram/README.md +3 -2
- data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +1 -1
- data/tracks/rust/exercises/parallel-letter-frequency/README.md +4 -3
- data/tracks/rust/exercises/pascals-triangle/README.md +3 -2
- data/tracks/rust/exercises/perfect-numbers/README.md +3 -2
- data/tracks/rust/exercises/phone-number/README.md +3 -2
- data/tracks/rust/exercises/pig-latin/README.md +3 -2
- data/tracks/rust/exercises/poker/README.md +3 -2
- data/tracks/rust/exercises/prime-factors/README.md +3 -2
- data/tracks/rust/exercises/protein-translation/README.md +3 -2
- data/tracks/rust/exercises/proverb/README.md +3 -2
- data/tracks/rust/exercises/proverb/src/lib.rs +1 -1
- data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -2
- data/tracks/rust/exercises/queen-attack/README.md +3 -2
- data/tracks/rust/exercises/raindrops/README.md +3 -2
- data/tracks/rust/exercises/raindrops/src/lib.rs +1 -1
- data/tracks/rust/exercises/react/README.md +3 -2
- data/tracks/rust/exercises/rectangles/README.md +3 -2
- data/tracks/rust/exercises/rna-transcription/README.md +3 -2
- data/tracks/rust/exercises/robot-name/README.md +3 -2
- data/tracks/rust/exercises/robot-simulator/README.md +3 -2
- data/tracks/rust/exercises/roman-numerals/README.md +3 -2
- data/tracks/rust/exercises/rotational-cipher/README.md +3 -2
- data/tracks/rust/exercises/run-length-encoding/README.md +3 -2
- data/tracks/rust/exercises/say/README.md +3 -2
- data/tracks/rust/exercises/scrabble-score/README.md +3 -2
- data/tracks/rust/exercises/sieve/README.md +3 -2
- data/tracks/rust/exercises/space-age/README.md +3 -2
- data/tracks/rust/exercises/sublist/README.md +3 -2
- data/tracks/rust/exercises/sum-of-multiples/README.md +3 -2
- data/tracks/rust/exercises/sum-of-multiples/src/lib.rs +1 -1
- data/tracks/rust/exercises/tournament/README.md +3 -2
- data/tracks/rust/exercises/triangle/HINTS.md +2 -2
- data/tracks/rust/exercises/triangle/README.md +5 -4
- data/tracks/rust/exercises/variable-length-quantity/README.md +3 -2
- data/tracks/rust/exercises/word-count/README.md +3 -2
- data/tracks/rust/exercises/wordy/README.md +3 -2
- metadata +38 -3
- data/tracks/ecmascript/yarn.lock +0 -3144
@@ -0,0 +1,80 @@
|
|
1
|
+
-module(tgs).
|
2
|
+
|
3
|
+
-export([
|
4
|
+
atom/1,
|
5
|
+
call_fun/2,
|
6
|
+
call_macro/2,
|
7
|
+
define/2,
|
8
|
+
export/1,
|
9
|
+
include/1,
|
10
|
+
module/1,
|
11
|
+
parens/1,
|
12
|
+
raw/1,
|
13
|
+
simple_fun/2,
|
14
|
+
simple_fun/3,
|
15
|
+
value/1
|
16
|
+
]).
|
17
|
+
|
18
|
+
module(Name) when is_atom(Name) ->
|
19
|
+
do_module(erl_syntax:abstract(Name));
|
20
|
+
module(Name) when is_binary(Name) ->
|
21
|
+
module(binary_to_list(Name));
|
22
|
+
module(Name) when is_list(Name) ->
|
23
|
+
do_module(erl_syntax:atom(Name)).
|
24
|
+
|
25
|
+
do_module(NameAbstract) ->
|
26
|
+
erl_syntax:attribute(
|
27
|
+
erl_syntax:text("module"), [
|
28
|
+
NameAbstract]).
|
29
|
+
|
30
|
+
export(Exports) when is_list(Exports) ->
|
31
|
+
erl_syntax:attribute(
|
32
|
+
erl_syntax:text("export"), [
|
33
|
+
erl_syntax:list(lists:map(fun fun_tuple_to_text/1, Exports))]).
|
34
|
+
|
35
|
+
fun_tuple_to_text({Name, Args}) when (is_list(Name) orelse is_binary(Name)) andalso is_list(Args) ->
|
36
|
+
Text = io_lib:format("~s/~B", [Name, length(Args)]),
|
37
|
+
erl_syntax:text(Text).
|
38
|
+
|
39
|
+
include(File) when is_list(File) ->
|
40
|
+
erl_syntax:attribute(
|
41
|
+
erl_syntax:text("include"), [
|
42
|
+
erl_syntax:abstract(File)]).
|
43
|
+
|
44
|
+
define(Name, Substitution) when is_list(Name) ->
|
45
|
+
erl_syntax:attribute(
|
46
|
+
erl_syntax:text("define"), [
|
47
|
+
erl_syntax:text(Name),
|
48
|
+
Substitution]).
|
49
|
+
|
50
|
+
parens(Tree) ->
|
51
|
+
erl_syntax:parentheses(Tree).
|
52
|
+
|
53
|
+
call_fun(Name, Args) when is_list(Name) ->
|
54
|
+
erl_syntax:application(
|
55
|
+
erl_syntax:text(Name), Args).
|
56
|
+
|
57
|
+
call_macro(Name, Args) when is_list(Name) ->
|
58
|
+
call_fun("?" ++ Name, Args).
|
59
|
+
|
60
|
+
atom(Name) when is_list(Name); is_atom(Name) ->
|
61
|
+
erl_syntax:atom(Name);
|
62
|
+
atom(Name) when is_binary(Name) ->
|
63
|
+
atom(binary_to_list(Name)).
|
64
|
+
|
65
|
+
simple_fun(Name, Body) ->
|
66
|
+
erl_syntax:function(
|
67
|
+
atom(Name), [erl_syntax:clause(none, Body)]).
|
68
|
+
|
69
|
+
simple_fun(Name, Args, Body) when is_list(Args) ->
|
70
|
+
erl_syntax:function(
|
71
|
+
atom(Name), [erl_syntax:clause(
|
72
|
+
lists:map(fun (Arg) -> erl_syntax:text(Arg) end, Args),
|
73
|
+
none,
|
74
|
+
Body)]).
|
75
|
+
|
76
|
+
raw(Text) when is_list(Text) ->
|
77
|
+
erl_syntax:text(Text).
|
78
|
+
|
79
|
+
value(Value) ->
|
80
|
+
erl_syntax:abstract(Value).
|
@@ -1,52 +1,107 @@
|
|
1
|
+
// This file was auto-generated based on version 1.0.0 of the canonical data.
|
2
|
+
|
1
3
|
module AlphameticsTest
|
2
4
|
|
3
|
-
open Xunit
|
4
5
|
open FsUnit.Xunit
|
6
|
+
open Xunit
|
5
7
|
|
6
8
|
open Alphametics
|
7
9
|
|
8
10
|
[<Fact>]
|
9
11
|
let ``Puzzle with three letters`` () =
|
10
|
-
let
|
11
|
-
let expected =
|
12
|
-
|
12
|
+
let puzzle = "I + BB == ILL"
|
13
|
+
let expected =
|
14
|
+
[ ('I', 1)
|
15
|
+
('B', 9)
|
16
|
+
('L', 0) ]
|
17
|
+
|> Map.ofList
|
18
|
+
|> Some
|
19
|
+
solve puzzle |> should equal expected
|
13
20
|
|
14
21
|
[<Fact(Skip = "Remove to run test")>]
|
15
22
|
let ``Solution must have unique value for each letter`` () =
|
16
|
-
let
|
17
|
-
|
23
|
+
let puzzle = "A == B"
|
24
|
+
let expected = None
|
25
|
+
solve puzzle |> should equal expected
|
18
26
|
|
19
27
|
[<Fact(Skip = "Remove to run test")>]
|
20
28
|
let ``Leading zero solution is invalid`` () =
|
21
|
-
let
|
22
|
-
|
29
|
+
let puzzle = "ACA + DD == BD"
|
30
|
+
let expected = None
|
31
|
+
solve puzzle |> should equal expected
|
23
32
|
|
24
33
|
[<Fact(Skip = "Remove to run test")>]
|
25
34
|
let ``Puzzle with four letters`` () =
|
26
|
-
let
|
27
|
-
let expected =
|
28
|
-
|
35
|
+
let puzzle = "AS + A == MOM"
|
36
|
+
let expected =
|
37
|
+
[ ('A', 9)
|
38
|
+
('S', 2)
|
39
|
+
('M', 1)
|
40
|
+
('O', 0) ]
|
41
|
+
|> Map.ofList
|
42
|
+
|> Some
|
43
|
+
solve puzzle |> should equal expected
|
29
44
|
|
30
45
|
[<Fact(Skip = "Remove to run test")>]
|
31
46
|
let ``Puzzle with six letters`` () =
|
32
|
-
let
|
33
|
-
let expected =
|
34
|
-
|
47
|
+
let puzzle = "NO + NO + TOO == LATE"
|
48
|
+
let expected =
|
49
|
+
[ ('N', 7)
|
50
|
+
('O', 4)
|
51
|
+
('T', 9)
|
52
|
+
('L', 1)
|
53
|
+
('A', 0)
|
54
|
+
('E', 2) ]
|
55
|
+
|> Map.ofList
|
56
|
+
|> Some
|
57
|
+
solve puzzle |> should equal expected
|
35
58
|
|
36
59
|
[<Fact(Skip = "Remove to run test")>]
|
37
60
|
let ``Puzzle with seven letters`` () =
|
38
|
-
let
|
39
|
-
let expected =
|
40
|
-
|
61
|
+
let puzzle = "HE + SEES + THE == LIGHT"
|
62
|
+
let expected =
|
63
|
+
[ ('E', 4)
|
64
|
+
('G', 2)
|
65
|
+
('H', 5)
|
66
|
+
('I', 0)
|
67
|
+
('L', 1)
|
68
|
+
('S', 9)
|
69
|
+
('T', 7) ]
|
70
|
+
|> Map.ofList
|
71
|
+
|> Some
|
72
|
+
solve puzzle |> should equal expected
|
41
73
|
|
42
74
|
[<Fact(Skip = "Remove to run test")>]
|
43
75
|
let ``Puzzle with eight letters`` () =
|
44
|
-
let
|
45
|
-
let expected =
|
46
|
-
|
76
|
+
let puzzle = "SEND + MORE == MONEY"
|
77
|
+
let expected =
|
78
|
+
[ ('S', 9)
|
79
|
+
('E', 5)
|
80
|
+
('N', 6)
|
81
|
+
('D', 7)
|
82
|
+
('M', 1)
|
83
|
+
('O', 0)
|
84
|
+
('R', 8)
|
85
|
+
('Y', 2) ]
|
86
|
+
|> Map.ofList
|
87
|
+
|> Some
|
88
|
+
solve puzzle |> should equal expected
|
47
89
|
|
48
90
|
[<Fact(Skip = "Remove to run test")>]
|
49
91
|
let ``Puzzle with ten letters`` () =
|
50
|
-
let
|
51
|
-
let expected =
|
52
|
-
|
92
|
+
let puzzle = "AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE"
|
93
|
+
let expected =
|
94
|
+
[ ('A', 5)
|
95
|
+
('D', 3)
|
96
|
+
('E', 4)
|
97
|
+
('F', 7)
|
98
|
+
('G', 8)
|
99
|
+
('N', 0)
|
100
|
+
('O', 2)
|
101
|
+
('R', 1)
|
102
|
+
('S', 6)
|
103
|
+
('T', 9) ]
|
104
|
+
|> Map.ofList
|
105
|
+
|> Some
|
106
|
+
solve puzzle |> should equal expected
|
107
|
+
|
@@ -1,57 +1,89 @@
|
|
1
|
+
// This file was auto-generated based on version 1.0.1 of the canonical data.
|
2
|
+
|
1
3
|
module AnagramTest
|
2
4
|
|
3
|
-
open System
|
4
|
-
open Xunit
|
5
5
|
open FsUnit.Xunit
|
6
|
+
open Xunit
|
7
|
+
|
6
8
|
open Anagram
|
7
9
|
|
8
10
|
[<Fact>]
|
9
11
|
let ``No matches`` () =
|
10
|
-
let
|
11
|
-
anagrams
|
12
|
+
let candidates = ["hello"; "world"; "zombies"; "pants"]
|
13
|
+
anagrams candidates "diaper" |> should be Empty
|
14
|
+
|
15
|
+
[<Fact(Skip = "Remove to run test")>]
|
16
|
+
let ``Detects simple anagram`` () =
|
17
|
+
let candidates = ["tan"; "stand"; "at"]
|
18
|
+
anagrams candidates "ant" |> should equal ["tan"]
|
19
|
+
|
20
|
+
[<Fact(Skip = "Remove to run test")>]
|
21
|
+
let ``Does not detect false positives`` () =
|
22
|
+
let candidates = ["eagle"]
|
23
|
+
anagrams candidates "galea" |> should be Empty
|
24
|
+
|
25
|
+
[<Fact(Skip = "Remove to run test")>]
|
26
|
+
let ``Detects two anagrams`` () =
|
27
|
+
let candidates = ["stream"; "pigeon"; "maters"]
|
28
|
+
anagrams candidates "master" |> should equal ["stream"; "maters"]
|
12
29
|
|
13
30
|
[<Fact(Skip = "Remove to run test")>]
|
14
|
-
let ``
|
15
|
-
let
|
16
|
-
|
17
|
-
anagrams words "ant" |> should equal expected
|
31
|
+
let ``Does not detect anagram subsets`` () =
|
32
|
+
let candidates = ["dog"; "goody"]
|
33
|
+
anagrams candidates "good" |> should be Empty
|
18
34
|
|
19
35
|
[<Fact(Skip = "Remove to run test")>]
|
20
|
-
let ``
|
21
|
-
let
|
22
|
-
|
23
|
-
anagrams words "master" |> should equal expected;
|
36
|
+
let ``Detects anagram`` () =
|
37
|
+
let candidates = ["enlists"; "google"; "inlets"; "banana"]
|
38
|
+
anagrams candidates "listen" |> should equal ["inlets"]
|
24
39
|
|
25
40
|
[<Fact(Skip = "Remove to run test")>]
|
26
|
-
let ``
|
27
|
-
let
|
28
|
-
anagrams
|
41
|
+
let ``Detects three anagrams`` () =
|
42
|
+
let candidates = ["gallery"; "ballerina"; "regally"; "clergy"; "largely"; "leading"]
|
43
|
+
anagrams candidates "allergy" |> should equal ["gallery"; "regally"; "largely"]
|
29
44
|
|
30
45
|
[<Fact(Skip = "Remove to run test")>]
|
31
|
-
let ``
|
32
|
-
let
|
33
|
-
|
34
|
-
anagrams words "corn" |> should equal expected
|
46
|
+
let ``Does not detect identical words`` () =
|
47
|
+
let candidates = ["corn"; "dark"; "Corn"; "rank"; "CORN"; "cron"; "park"]
|
48
|
+
anagrams candidates "corn" |> should equal ["cron"]
|
35
49
|
|
36
50
|
[<Fact(Skip = "Remove to run test")>]
|
37
|
-
let ``
|
38
|
-
let
|
39
|
-
anagrams
|
51
|
+
let ``Does not detect non-anagrams with identical checksum`` () =
|
52
|
+
let candidates = ["last"]
|
53
|
+
anagrams candidates "mass" |> should be Empty
|
40
54
|
|
41
55
|
[<Fact(Skip = "Remove to run test")>]
|
42
|
-
let ``
|
43
|
-
let
|
44
|
-
anagrams
|
56
|
+
let ``Detects anagrams case-insensitively`` () =
|
57
|
+
let candidates = ["cashregister"; "Carthorse"; "radishes"]
|
58
|
+
anagrams candidates "Orchestra" |> should equal ["Carthorse"]
|
45
59
|
|
46
60
|
[<Fact(Skip = "Remove to run test")>]
|
47
|
-
let ``
|
48
|
-
let
|
49
|
-
|
50
|
-
let actual = anagrams words "allergy"
|
51
|
-
actual |> should equal expected
|
61
|
+
let ``Detects anagrams using case-insensitive subject`` () =
|
62
|
+
let candidates = ["cashregister"; "carthorse"; "radishes"]
|
63
|
+
anagrams candidates "Orchestra" |> should equal ["carthorse"]
|
52
64
|
|
53
65
|
[<Fact(Skip = "Remove to run test")>]
|
54
|
-
let ``
|
55
|
-
let
|
56
|
-
|
57
|
-
|
66
|
+
let ``Detects anagrams using case-insensitive possible matches`` () =
|
67
|
+
let candidates = ["cashregister"; "Carthorse"; "radishes"]
|
68
|
+
anagrams candidates "orchestra" |> should equal ["Carthorse"]
|
69
|
+
|
70
|
+
[<Fact(Skip = "Remove to run test")>]
|
71
|
+
let ``Does not detect a word as its own anagram`` () =
|
72
|
+
let candidates = ["Banana"]
|
73
|
+
anagrams candidates "banana" |> should be Empty
|
74
|
+
|
75
|
+
[<Fact(Skip = "Remove to run test")>]
|
76
|
+
let ``Does not detect a anagram if the original word is repeated`` () =
|
77
|
+
let candidates = ["go Go GO"]
|
78
|
+
anagrams candidates "go" |> should be Empty
|
79
|
+
|
80
|
+
[<Fact(Skip = "Remove to run test")>]
|
81
|
+
let ``Anagrams must use all letters exactly once`` () =
|
82
|
+
let candidates = ["patter"]
|
83
|
+
anagrams candidates "tapper" |> should be Empty
|
84
|
+
|
85
|
+
[<Fact(Skip = "Remove to run test")>]
|
86
|
+
let ``Capital word is not own anagram`` () =
|
87
|
+
let candidates = ["Banana"]
|
88
|
+
anagrams candidates "BANANA" |> should be Empty
|
89
|
+
|
@@ -1,89 +1,102 @@
|
|
1
|
+
// This file was auto-generated based on version 1.0.0 of the canonical data.
|
2
|
+
|
1
3
|
module ConnectTest
|
2
4
|
|
3
|
-
open Xunit
|
4
5
|
open FsUnit.Xunit
|
5
|
-
open
|
6
|
+
open Xunit
|
6
7
|
|
7
8
|
open Connect
|
8
9
|
|
9
|
-
let makeBoard (board: string list) = board |> List.map (fun x -> x.Replace(" ", ""))
|
10
|
-
|
11
10
|
[<Fact>]
|
12
|
-
let ``
|
13
|
-
let
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
let ``An empty board has no winner`` () =
|
12
|
+
let board =
|
13
|
+
[ ". . . . . "
|
14
|
+
" . . . . . "
|
15
|
+
" . . . . . "
|
16
|
+
" . . . . . "
|
17
|
+
" . . . . ." ]
|
18
|
+
winner board |> should equal None
|
20
19
|
|
21
20
|
[<Fact(Skip = "Remove to run test")>]
|
22
|
-
let ``
|
23
|
-
let
|
24
|
-
|
25
|
-
resultFor board |> should equal <| Some Black
|
21
|
+
let ``X can win on a 1x1 board`` () =
|
22
|
+
let board = ["X"]
|
23
|
+
winner board |> should equal (Some Black)
|
26
24
|
|
27
25
|
[<Fact(Skip = "Remove to run test")>]
|
28
|
-
let ``
|
29
|
-
let
|
30
|
-
|
31
|
-
resultFor board |> should equal <| Some White
|
26
|
+
let ``O can win on a 1x1 board`` () =
|
27
|
+
let board = ["O"]
|
28
|
+
winner board |> should equal (Some White)
|
32
29
|
|
33
30
|
[<Fact(Skip = "Remove to run test")>]
|
34
|
-
let ``
|
35
|
-
let
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
resultFor board |> should equal <| Some Black
|
31
|
+
let ``Only edges does not make a winner`` () =
|
32
|
+
let board =
|
33
|
+
[ "O O O X "
|
34
|
+
" X . . X "
|
35
|
+
" X . . X "
|
36
|
+
" X O O O" ]
|
37
|
+
winner board |> should equal None
|
42
38
|
|
43
39
|
[<Fact(Skip = "Remove to run test")>]
|
44
|
-
let ``
|
45
|
-
let
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
40
|
+
let ``Illegal diagonal does not make a winner`` () =
|
41
|
+
let board =
|
42
|
+
[ "X O . . "
|
43
|
+
" O X X X "
|
44
|
+
" O X O . "
|
45
|
+
" . O X . "
|
46
|
+
" X X O O" ]
|
47
|
+
winner board |> should equal None
|
52
48
|
|
53
49
|
[<Fact(Skip = "Remove to run test")>]
|
54
|
-
let ``
|
55
|
-
let
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
50
|
+
let ``Nobody wins crossing adjacent angles`` () =
|
51
|
+
let board =
|
52
|
+
[ "X . . . "
|
53
|
+
" . X O . "
|
54
|
+
" O . X O "
|
55
|
+
" . O . X "
|
56
|
+
" . . O ." ]
|
57
|
+
winner board |> should equal None
|
62
58
|
|
63
59
|
[<Fact(Skip = "Remove to run test")>]
|
64
|
-
let ``
|
65
|
-
let
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
"OOOOOOOXO";
|
73
|
-
"XXXXXXXXO"]
|
74
|
-
let board = makeBoard lines
|
75
|
-
resultFor board |> should equal <| Some Black
|
60
|
+
let ``X wins crossing from left to right`` () =
|
61
|
+
let board =
|
62
|
+
[ ". O . . "
|
63
|
+
" O X X X "
|
64
|
+
" O X O . "
|
65
|
+
" X X O X "
|
66
|
+
" . O X ." ]
|
67
|
+
winner board |> should equal (Some Black)
|
76
68
|
|
77
69
|
[<Fact(Skip = "Remove to run test")>]
|
78
|
-
let ``
|
79
|
-
let
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
70
|
+
let ``O wins crossing from top to bottom`` () =
|
71
|
+
let board =
|
72
|
+
[ ". O . . "
|
73
|
+
" O X X X "
|
74
|
+
" O O O . "
|
75
|
+
" X X O X "
|
76
|
+
" . O X ." ]
|
77
|
+
winner board |> should equal (Some White)
|
78
|
+
|
79
|
+
[<Fact(Skip = "Remove to run test")>]
|
80
|
+
let ``X wins using a convoluted path`` () =
|
81
|
+
let board =
|
82
|
+
[ ". X X . . "
|
83
|
+
" X . X . X "
|
84
|
+
" . X . X . "
|
85
|
+
" . X X . . "
|
86
|
+
" O O O O O" ]
|
87
|
+
winner board |> should equal (Some Black)
|
88
|
+
|
89
|
+
[<Fact(Skip = "Remove to run test")>]
|
90
|
+
let ``X wins using a spiral path`` () =
|
91
|
+
let board =
|
92
|
+
[ "O X X X X X X X X "
|
93
|
+
" O X O O O O O O O "
|
94
|
+
" O X O X X X X X O "
|
95
|
+
" O X O X O O O X O "
|
96
|
+
" O X O X X X O X O "
|
97
|
+
" O X O O O X O X O "
|
98
|
+
" O X X X X X O X O "
|
99
|
+
" O O O O O O O X O "
|
100
|
+
" X X X X X X X X O" ]
|
101
|
+
winner board |> should equal (Some Black)
|
102
|
+
|