trackler 2.0.3.6 → 2.0.3.7
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/tracks/csharp/build.fsx +1 -2
- data/tracks/csharp/exercises/clock/ClockTest.cs +9 -0
- data/tracks/fsharp/build.fsx +1 -2
- data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTreeTest.fs +3 -3
- data/tracks/objective-c/Dangerfile +1 -1
- data/tracks/ocaml/config.json +6 -5
- data/tracks/ocaml/exercises/all-your-base/.merlin +5 -0
- data/tracks/ocaml/exercises/all-your-base/Makefile +11 -0
- data/tracks/ocaml/exercises/all-your-base/all_your_base.mli +5 -0
- data/tracks/ocaml/exercises/all-your-base/example.ml +20 -0
- data/tracks/ocaml/exercises/all-your-base/test.ml +58 -0
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +10 -2
- data/tracks/ocaml/tools/test-generator/templates/all-your-base/template.ml +10 -6
- data/tracks/perl6/config.json +5 -0
- data/tracks/perl6/exercises/space-age/Example.p6 +16 -0
- data/tracks/perl6/exercises/space-age/cases.json +46 -0
- data/tracks/perl6/exercises/space-age/space-age.t +23 -0
- data/tracks/purescript/.gitignore +2 -0
- data/tracks/purescript/.travis.yml +8 -0
- data/tracks/purescript/bin/test.sh +39 -0
- data/tracks/purescript/config.json +22 -0
- data/tracks/purescript/docs/INSTALLATION.md +12 -0
- data/tracks/purescript/docs/TESTS.md +6 -0
- data/tracks/purescript/exercises/hello-world/src/HelloWorld.purs +0 -5
- data/tracks/purescript/exercises/leap/bower.json +16 -0
- data/tracks/purescript/exercises/leap/examples/src/Leap.purs +9 -0
- data/tracks/purescript/exercises/leap/src/Leap.purs +1 -0
- data/tracks/purescript/exercises/leap/test/Main.purs +25 -0
- data/tracks/purescript/exercises/pangram/bower.json +17 -0
- data/tracks/purescript/exercises/pangram/examples/src/Pangram.purs +25 -0
- data/tracks/purescript/exercises/pangram/src/Pangram.purs +3 -0
- data/tracks/purescript/exercises/pangram/test/Main.purs +46 -0
- data/tracks/purescript/exercises/raindrops/bower.json +16 -0
- data/tracks/purescript/exercises/raindrops/examples/src/Raindrops.purs +23 -0
- data/tracks/purescript/exercises/raindrops/src/Raindrops.purs +3 -0
- data/tracks/purescript/exercises/raindrops/test/Main.purs +41 -0
- data/tracks/swift/Dangerfile +1 -1
- data/tracks/swift/config.json +8 -0
- data/tracks/swift/exercises/isogram/IsogramExample.swift +25 -0
- data/tracks/swift/exercises/isogram/IsogramTest.swift +38 -0
- data/tracks/swift/exercises/space-age/SpaceAgeExample.swift +1 -1
- data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +16 -0
- metadata +25 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7778e095275365245b61d227de2380686d8f52a6
|
4
|
+
data.tar.gz: baf69491b1aa86f855c0a3a0dc312c169d3f91b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef3092dcc542059ebcb8dce86d78c9e36ab07624096d962b469cb06a00d16a6f85684e7a015e8dfd32446172b33b8e49b4ecdb3c01e40eed7d187b5f80beeb11
|
7
|
+
data.tar.gz: 55cb0a7661c46826a0272c15bb231790ada521268054b488e4d219819b61231b0a9cb7ccee5a1e1cd9f3f80923f64187d8d357221322b1799098ab15829d5ad6
|
data/lib/trackler/version.rb
CHANGED
data/tracks/csharp/build.fsx
CHANGED
@@ -43,8 +43,7 @@ Target "Test" (fun _ ->
|
|
43
43
|
[compiledOutput]
|
44
44
|
|> NUnit3 (fun p -> { p with
|
45
45
|
ShadowCopy = false
|
46
|
-
ToolPath =
|
47
|
-
ResultSpecs = ["myresults.xml;format=AppVeyor"] })
|
46
|
+
ToolPath = "nunit3-console.exe" })
|
48
47
|
else
|
49
48
|
[compiledOutput]
|
50
49
|
|> NUnit3 (fun p -> { p with ShadowCopy = false })
|
@@ -107,6 +107,15 @@ public class ClockTest
|
|
107
107
|
Assert.That(clock1, Is.EqualTo(clock2));
|
108
108
|
}
|
109
109
|
|
110
|
+
[Ignore("Remove to run test")]
|
111
|
+
[Test]
|
112
|
+
public void Clocks_with_different_time_are_not_equal()
|
113
|
+
{
|
114
|
+
var clock1 = new Clock(15, 30);
|
115
|
+
var clock2 = new Clock(14, 30);
|
116
|
+
Assert.That(clock1, Is.Not.EqualTo(clock2));
|
117
|
+
}
|
118
|
+
|
110
119
|
[Ignore("Remove to run test")]
|
111
120
|
[Test]
|
112
121
|
public void Overflown_clocks_with_same_time_are_equal()
|
data/tracks/fsharp/build.fsx
CHANGED
@@ -41,8 +41,7 @@ Target "Test" (fun _ ->
|
|
41
41
|
[compiledOutput]
|
42
42
|
|> NUnit3 (fun p -> { p with
|
43
43
|
ShadowCopy = false
|
44
|
-
ToolPath =
|
45
|
-
ResultSpecs = ["myresults.xml;format=AppVeyor"] })
|
44
|
+
ToolPath = "nunit3-console.exe" })
|
46
45
|
else
|
47
46
|
[compiledOutput]
|
48
47
|
|> NUnit3 (fun p -> { p with ShadowCopy = false })
|
@@ -34,12 +34,12 @@ let ``Inserting greater`` () =
|
|
34
34
|
let ``Complex tree`` () =
|
35
35
|
let tree = fromList [4; 2; 6; 1; 3; 7; 5]
|
36
36
|
Assert.That(tree |> value, Is.EqualTo(4))
|
37
|
-
Assert.That(tree |> left |> Option.map value, Is.EqualTo(2))
|
37
|
+
Assert.That(tree |> left |> Option.map value, Is.EqualTo(Some 2))
|
38
38
|
Assert.That(tree |> left |> Option.bind (fun x -> x |> left) |> Option.map value, Is.EqualTo(Some 1))
|
39
39
|
Assert.That(tree |> left |> Option.bind (fun x -> x |> right) |> Option.map value, Is.EqualTo(Some 3))
|
40
|
-
Assert.That(tree |> right |> Option.map value, Is.EqualTo(6))
|
40
|
+
Assert.That(tree |> right |> Option.map value, Is.EqualTo(Some 6))
|
41
41
|
Assert.That(tree |> right |> Option.bind (fun x -> x |> left) |> Option.map value, Is.EqualTo(Some 5))
|
42
|
-
Assert.That(tree |> right |> Option.bind (fun x -> x |> right) |> Option.map value, Is.EqualTo(7))
|
42
|
+
Assert.That(tree |> right |> Option.bind (fun x -> x |> right) |> Option.map value, Is.EqualTo(Some 7))
|
43
43
|
|
44
44
|
[<Test>]
|
45
45
|
[<Ignore("Remove to run test")>]
|
@@ -18,7 +18,7 @@ warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]"
|
|
18
18
|
warn("Big PR") if git.lines_of_code > 500
|
19
19
|
|
20
20
|
#ENSURE THERE IS A SUMMARY FOR A PR
|
21
|
-
warn("Please provide a summary in the Pull Request description") if github.pr_body.length < 5
|
21
|
+
warn("Please provide a summary in the Pull Request description. See more info <a href=\"http\://tinyletter.com/exercism/letters/exercism-pull-requests\">here.</a>") if github.pr_body.length < 5
|
22
22
|
|
23
23
|
# LINT Comments in for each Line
|
24
24
|
jsonpath = ".oclint.json"
|
data/tracks/ocaml/config.json
CHANGED
@@ -61,11 +61,6 @@
|
|
61
61
|
"difficulty": 3,
|
62
62
|
"topics": []
|
63
63
|
},
|
64
|
-
{
|
65
|
-
"slug": "hexadecimal",
|
66
|
-
"difficulty": 3,
|
67
|
-
"topics": []
|
68
|
-
},
|
69
64
|
{
|
70
65
|
"slug": "anagram",
|
71
66
|
"difficulty": 3,
|
@@ -76,6 +71,11 @@
|
|
76
71
|
"difficulty": 3,
|
77
72
|
"topics": []
|
78
73
|
},
|
74
|
+
{
|
75
|
+
"slug": "all-your-base",
|
76
|
+
"difficulty": 4,
|
77
|
+
"topics": ["Mathematics"]
|
78
|
+
},
|
79
79
|
{
|
80
80
|
"slug": "bracket-push",
|
81
81
|
"difficulty": 4,
|
@@ -158,6 +158,7 @@
|
|
158
158
|
}
|
159
159
|
],
|
160
160
|
"deprecated": [
|
161
|
+
"hexadecimal",
|
161
162
|
"point-mutations"
|
162
163
|
],
|
163
164
|
"ignored": [
|
@@ -0,0 +1,20 @@
|
|
1
|
+
open Core.Std
|
2
|
+
|
3
|
+
type base = int
|
4
|
+
|
5
|
+
let rec to_digits (b: base) (acc: int list) = function
|
6
|
+
| 0 -> acc
|
7
|
+
| n -> to_digits b (n % b :: acc) (n / b)
|
8
|
+
|
9
|
+
let convert_bases ~from ~digits ~target =
|
10
|
+
if from <= 1 || target <= 1 || List.is_empty digits
|
11
|
+
then None
|
12
|
+
else
|
13
|
+
let open Option.Monad_infix in
|
14
|
+
let digits = List.fold_left digits ~init:(Some 0) ~f:(fun acc d ->
|
15
|
+
if d < 0 || d >= from
|
16
|
+
then None
|
17
|
+
else acc >>= (fun acc -> Some (acc * from + d))
|
18
|
+
) in
|
19
|
+
Option.map digits ~f:(to_digits target [])
|
20
|
+
|> Option.map ~f:(fun xs -> if List.is_empty xs then [0] else xs)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open All_your_base
|
4
|
+
|
5
|
+
let option_printer = function
|
6
|
+
| None -> "None"
|
7
|
+
| Some xs -> "Some [" ^ String.concat ~sep:";" (List.map xs ~f:Int.to_string) ^ "]"
|
8
|
+
|
9
|
+
let ae exp got _test_ctxt =
|
10
|
+
assert_equal exp got ~printer:option_printer
|
11
|
+
|
12
|
+
let tests = [
|
13
|
+
"single bit one to decimal" >::
|
14
|
+
ae (Some [1]) (convert_bases ~from:2 ~digits:[1] ~target:10);
|
15
|
+
"binary to single decimal" >::
|
16
|
+
ae (Some [5]) (convert_bases ~from:2 ~digits:[1; 0; 1] ~target:10);
|
17
|
+
"single decimal to binary" >::
|
18
|
+
ae (Some [1; 0; 1]) (convert_bases ~from:10 ~digits:[5] ~target:2);
|
19
|
+
"binary to multiple decimal" >::
|
20
|
+
ae (Some [4; 2]) (convert_bases ~from:2 ~digits:[1; 0; 1; 0; 1; 0] ~target:10);
|
21
|
+
"decimal to binary" >::
|
22
|
+
ae (Some [1; 0; 1; 0; 1; 0]) (convert_bases ~from:10 ~digits:[4; 2] ~target:2);
|
23
|
+
"trinary to hexadecimal" >::
|
24
|
+
ae (Some [2; 10]) (convert_bases ~from:3 ~digits:[1; 1; 2; 0] ~target:16);
|
25
|
+
"hexadecimal to trinary" >::
|
26
|
+
ae (Some [1; 1; 2; 0]) (convert_bases ~from:16 ~digits:[2; 10] ~target:3);
|
27
|
+
"15-bit integer" >::
|
28
|
+
ae (Some [6; 10; 45]) (convert_bases ~from:97 ~digits:[3; 46; 60] ~target:73);
|
29
|
+
"empty list" >::
|
30
|
+
ae None (convert_bases ~from:2 ~digits:[] ~target:10);
|
31
|
+
"single zero" >::
|
32
|
+
ae (Some [0]) (convert_bases ~from:10 ~digits:[0] ~target:2);
|
33
|
+
"multiple zeros" >::
|
34
|
+
ae (Some [0]) (convert_bases ~from:10 ~digits:[0; 0; 0] ~target:2);
|
35
|
+
"leading zeros" >::
|
36
|
+
ae (Some [4; 2]) (convert_bases ~from:7 ~digits:[0; 0; 6; 0] ~target:10);
|
37
|
+
"negative digit" >::
|
38
|
+
ae None (convert_bases ~from:2 ~digits:[1; -1; 1; 0; 1; 0] ~target:10);
|
39
|
+
"invalid positive digit" >::
|
40
|
+
ae None (convert_bases ~from:2 ~digits:[1; 2; 1; 0; 1; 0] ~target:10);
|
41
|
+
"first base is one" >::
|
42
|
+
ae None (convert_bases ~from:1 ~digits:[] ~target:10);
|
43
|
+
"second base is one" >::
|
44
|
+
ae None (convert_bases ~from:2 ~digits:[1; 0; 1; 0; 1; 0] ~target:1);
|
45
|
+
"first base is zero" >::
|
46
|
+
ae None (convert_bases ~from:0 ~digits:[] ~target:10);
|
47
|
+
"second base is zero" >::
|
48
|
+
ae None (convert_bases ~from:10 ~digits:[7] ~target:0);
|
49
|
+
"first base is negative" >::
|
50
|
+
ae None (convert_bases ~from:(-2) ~digits:[1] ~target:10);
|
51
|
+
"second base is negative" >::
|
52
|
+
ae None (convert_bases ~from:2 ~digits:[1] ~target:(-7));
|
53
|
+
"both bases are negative" >::
|
54
|
+
ae None (convert_bases ~from:(-2) ~digits:[1] ~target:(-7));
|
55
|
+
]
|
56
|
+
|
57
|
+
let () =
|
58
|
+
run_test_tt_main ("all-your-bases tests" >::: tests)
|
@@ -8,7 +8,7 @@ let optional_int ~(none: int) = function
|
|
8
8
|
| x -> parameter_to_string x
|
9
9
|
|
10
10
|
let optional_int_list = function
|
11
|
-
| IntList xs -> "(Some " ^ String.concat ~sep:"; " (List.map ~f:Int.to_string xs) ^ ")"
|
11
|
+
| IntList xs -> "(Some [" ^ String.concat ~sep:"; " (List.map ~f:Int.to_string xs) ^ "])"
|
12
12
|
| _ -> "None"
|
13
13
|
|
14
14
|
let optional_int_or_string ~(none: int) = function
|
@@ -37,7 +37,14 @@ let edit_expected ~(stringify: parameter -> string) ~(slug: string) ~(value: par
|
|
37
37
|
|
38
38
|
let edit_say (ps: (string * string) list) =
|
39
39
|
let edit = function
|
40
|
-
| ("input", v) -> ("input", if Int.of_string v
|
40
|
+
| ("input", v) -> ("input", if Int.of_string v >= 0 then "(" ^ v ^ "L)" else v ^ "L")
|
41
|
+
| x -> x in
|
42
|
+
List.map ps ~f:edit
|
43
|
+
|
44
|
+
let edit_all_your_base (ps: (string * string) list) =
|
45
|
+
let edit = function
|
46
|
+
| ("output_base", v) -> ("output_base", if Int.of_string v >= 0 then v else "(" ^ v ^ ")")
|
47
|
+
| ("input_base", v) -> ("input_base", if Int.of_string v >= 0 then v else "(" ^ v ^ ")")
|
41
48
|
| x -> x in
|
42
49
|
List.map ps ~f:edit
|
43
50
|
|
@@ -46,4 +53,5 @@ let edit_parameters ~(slug: string) (parameters: (string * string) list) = match
|
|
46
53
|
@@ optional_strings ~f:(fun _x -> true)
|
47
54
|
@@ parameters
|
48
55
|
| ("say", ps) -> edit_say ps
|
56
|
+
| ("all-your-base", ps) -> edit_all_your_base ps
|
49
57
|
| (_, ps) -> ps
|
@@ -1,15 +1,19 @@
|
|
1
1
|
open Core.Std
|
2
2
|
open OUnit2
|
3
|
-
open
|
3
|
+
open All_your_base
|
4
|
+
|
5
|
+
let option_printer = function
|
6
|
+
| None -> "None"
|
7
|
+
| Some xs -> "Some [" ^ String.concat ~sep:";" (List.map xs ~f:Int.to_string) ^ "]"
|
4
8
|
|
5
9
|
let ae exp got _test_ctxt =
|
6
|
-
assert_equal exp got ~printer:
|
10
|
+
assert_equal exp got ~printer:option_printer
|
7
11
|
|
8
12
|
let tests = [
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
+
(* TEST
|
14
|
+
"$description" >::
|
15
|
+
ae $expected (convert_bases ~from:$input_base ~digits:$input_digits ~target:$output_base);
|
16
|
+
END TEST *)
|
13
17
|
]
|
14
18
|
|
15
19
|
let () =
|
data/tracks/perl6/config.json
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
our $earth_revolution = 31557600;
|
2
|
+
|
3
|
+
our %planets = (
|
4
|
+
mercury => 0.2408467,
|
5
|
+
venus => 0.61519726,
|
6
|
+
mars => 1.8808158,
|
7
|
+
jupiter => 11.862615,
|
8
|
+
saturn => 29.447498,
|
9
|
+
uranus => 84.016846,
|
10
|
+
neptune => 164.79132,
|
11
|
+
earth => 1,
|
12
|
+
);
|
13
|
+
|
14
|
+
sub age-on( $planet, $seconds ) is export {
|
15
|
+
( $seconds / %planets{$planet.lc} / $earth_revolution ).round(0.01);
|
16
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
{ "#": [],
|
2
|
+
"age on": {
|
3
|
+
"cases": [
|
4
|
+
{
|
5
|
+
"planet": "Earth",
|
6
|
+
"seconds": 1000000000,
|
7
|
+
"expected": 31.69
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"planet": "Mercury",
|
11
|
+
"seconds": 2134835688,
|
12
|
+
"expected": 280.88
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"planet": "Venus",
|
16
|
+
"seconds": 189839836,
|
17
|
+
"expected": 9.78
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"planet": "Mars",
|
21
|
+
"seconds": 2329871239,
|
22
|
+
"expected": 39.25
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"planet": "Jupiter",
|
26
|
+
"seconds": 901876382,
|
27
|
+
"expected": 2.41
|
28
|
+
},
|
29
|
+
{
|
30
|
+
"planet": "Saturn",
|
31
|
+
"seconds": 3000000000,
|
32
|
+
"expected": 3.23
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"planet": "Uranus",
|
36
|
+
"seconds": 3210123456,
|
37
|
+
"expected": 1.21
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"planet": "Neptune",
|
41
|
+
"seconds": 8210123456,
|
42
|
+
"expected": 1.58
|
43
|
+
}
|
44
|
+
]
|
45
|
+
}
|
46
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env perl6
|
2
|
+
|
3
|
+
use Test;
|
4
|
+
use JSON::Tiny;
|
5
|
+
|
6
|
+
use lib ( my $dir = IO::Path.new($?FILE).parent ).path;
|
7
|
+
|
8
|
+
my $module_name = %*ENV<EXERCISM>.so ?? 'Example' !! 'SpaceAge';
|
9
|
+
my @potential_module = <p6 pm6 pm>.map: $module_name ~ '.' ~ *;
|
10
|
+
|
11
|
+
my $module = first { $dir.child($_).e }, |@potential_module
|
12
|
+
or die "No file '$module_name.p6' found\n";
|
13
|
+
|
14
|
+
require $module <&age-on>;
|
15
|
+
|
16
|
+
plan 8;
|
17
|
+
|
18
|
+
my %testcase = from-json $dir.child('cases.json').slurp;
|
19
|
+
|
20
|
+
for |%testcase{'age on'}{'cases'} -> %case {
|
21
|
+
is age-on( |%case<planet seconds>), %case{'expected'},
|
22
|
+
%case<planet seconds>.gist;
|
23
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# TEST
|
4
|
+
|
5
|
+
declare -i TEST_RESULT=0
|
6
|
+
FAILED_EXERCISES=''
|
7
|
+
|
8
|
+
for exercise_dir in exercises/**
|
9
|
+
do
|
10
|
+
exercise_src="$exercise_dir/src"
|
11
|
+
exercise_examples_src="$exercise_dir/examples/src"
|
12
|
+
|
13
|
+
mv "$exercise_src" "$exercise_src.impl"
|
14
|
+
mv "$exercise_examples_src" "$exercise_src"
|
15
|
+
|
16
|
+
echo "-------------------------------------------------------"
|
17
|
+
echo "Testing $exercise_dir"
|
18
|
+
|
19
|
+
cd "$exercise_dir"
|
20
|
+
bower install
|
21
|
+
pulp test
|
22
|
+
|
23
|
+
# capture result from last command (pulp test)
|
24
|
+
if [ $? -ne 0 ]; then
|
25
|
+
TEST_RESULT=1
|
26
|
+
FAILED_EXERCISES+="$exercise_dir\n"
|
27
|
+
fi
|
28
|
+
|
29
|
+
# be kind, rewind
|
30
|
+
cd -
|
31
|
+
mv "$exercise_src" "$exercise_examples_src"
|
32
|
+
mv "$exercise_src.impl" "$exercise_src"
|
33
|
+
done
|
34
|
+
|
35
|
+
if [ $TEST_RESULT -ne 0 ]; then
|
36
|
+
echo "The following exercises failed"
|
37
|
+
printf $FAILED_EXERCISES
|
38
|
+
exit $TEST_RESULT
|
39
|
+
fi
|
@@ -10,6 +10,28 @@
|
|
10
10
|
"topics": [
|
11
11
|
"maybe"
|
12
12
|
]
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"slug": "leap",
|
16
|
+
"difficulty": 1,
|
17
|
+
"topics": [
|
18
|
+
"modulo"
|
19
|
+
]
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"slug": "raindrops",
|
23
|
+
"difficulty": 1,
|
24
|
+
"topics": [
|
25
|
+
"modulo"
|
26
|
+
]
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"slug": "pangram",
|
30
|
+
"difficulty": 1,
|
31
|
+
"topics": [
|
32
|
+
"strings",
|
33
|
+
"chars"
|
34
|
+
]
|
13
35
|
}
|
14
36
|
],
|
15
37
|
"deprecated": [
|
@@ -0,0 +1,12 @@
|
|
1
|
+
The simplest way to install Purescript is via Node.js and NPM.
|
2
|
+
|
3
|
+
If you don't already have Node.js installed on your computer, you can download
|
4
|
+
it from the [Node.js website](https://nodejs.org/). Once you have Node.js up
|
5
|
+
and running, enter this command into the terminal to install the Purescript
|
6
|
+
compiler, the Pulp build tool and the Bower package manager.
|
7
|
+
|
8
|
+
npm install --global purescript pulp bower
|
9
|
+
|
10
|
+
More information can be found in [the Purescript repository][ps-repo]
|
11
|
+
|
12
|
+
[ps-repo]: (https://github.com/purescript/purescript/blob/master/INSTALL.md).
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"name": "leap",
|
3
|
+
"ignore": [
|
4
|
+
"**/.*",
|
5
|
+
"node_modules",
|
6
|
+
"bower_components",
|
7
|
+
"output"
|
8
|
+
],
|
9
|
+
"dependencies": {
|
10
|
+
"purescript-prelude": "^2.1.0"
|
11
|
+
},
|
12
|
+
"devDependencies": {
|
13
|
+
"purescript-psci-support": "^2.0.0",
|
14
|
+
"purescript-test-unit": "^10.0.1"
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
module Leap where
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Test.Main where
|
2
|
+
|
3
|
+
import Prelude
|
4
|
+
import Test.Unit (suite, test)
|
5
|
+
import Test.Unit.Main (runTest)
|
6
|
+
import Test.Unit.Assert as Assert
|
7
|
+
import Leap as Leap
|
8
|
+
|
9
|
+
|
10
|
+
main = runTest do
|
11
|
+
suite "Leap.isLeapYear" do
|
12
|
+
test "leap year" do
|
13
|
+
Assert.equal true $ Leap.isLeapYear 1996
|
14
|
+
test "non-leap year" do
|
15
|
+
Assert.equal false $ Leap.isLeapYear 1997
|
16
|
+
test "non-leap even year" do
|
17
|
+
Assert.equal false $ Leap.isLeapYear 1998
|
18
|
+
test "century" do
|
19
|
+
Assert.equal false $ Leap.isLeapYear 1900
|
20
|
+
test "second century" do
|
21
|
+
Assert.equal false $ Leap.isLeapYear 1800
|
22
|
+
test "fourth century" do
|
23
|
+
Assert.equal true $ Leap.isLeapYear 2400
|
24
|
+
test "y2k" do
|
25
|
+
Assert.equal true $ Leap.isLeapYear 2000
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"name": "hello-world",
|
3
|
+
"ignore": [
|
4
|
+
"**/.*",
|
5
|
+
"node_modules",
|
6
|
+
"bower_components",
|
7
|
+
"output"
|
8
|
+
],
|
9
|
+
"dependencies": {
|
10
|
+
"purescript-prelude": "^2.1.0",
|
11
|
+
"purescript-sets": "^2.0.0"
|
12
|
+
},
|
13
|
+
"devDependencies": {
|
14
|
+
"purescript-psci-support": "^2.0.0",
|
15
|
+
"purescript-test-unit": "^10.0.1"
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Pangram
|
2
|
+
( isPangram
|
3
|
+
) where
|
4
|
+
|
5
|
+
import Prelude
|
6
|
+
import Data.Set as Set
|
7
|
+
import Data.String as String
|
8
|
+
|
9
|
+
isPangram :: String -> Boolean
|
10
|
+
isPangram str =
|
11
|
+
let
|
12
|
+
letters =
|
13
|
+
charSet $ String.toLower str
|
14
|
+
in
|
15
|
+
Set.subset alphabet letters
|
16
|
+
|
17
|
+
|
18
|
+
alphabet :: Set.Set Char
|
19
|
+
alphabet =
|
20
|
+
charSet "abcdefghijklmnopqrstuvwxyz"
|
21
|
+
|
22
|
+
|
23
|
+
charSet :: String -> Set.Set Char
|
24
|
+
charSet =
|
25
|
+
String.toCharArray >>> Set.fromFoldable
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Test.Main where
|
2
|
+
|
3
|
+
import Prelude
|
4
|
+
import Test.Unit (suite, test)
|
5
|
+
import Test.Unit.Main (runTest)
|
6
|
+
import Test.Unit.Assert as Assert
|
7
|
+
import Pangram (isPangram)
|
8
|
+
|
9
|
+
|
10
|
+
main = runTest do
|
11
|
+
suite "Pangram.isPangram" do
|
12
|
+
test "sentence empty" do
|
13
|
+
Assert.equal false $
|
14
|
+
isPangram ""
|
15
|
+
|
16
|
+
test "pangram with only lower case" do
|
17
|
+
Assert.equal true $
|
18
|
+
isPangram "the quick brown fox jumps over the lazy dog"
|
19
|
+
|
20
|
+
test "missing character 'x'" do
|
21
|
+
Assert.equal false $
|
22
|
+
isPangram "a quick movement of the enemy will jeopardize five gunboats"
|
23
|
+
|
24
|
+
test "another missing character 'x'" do
|
25
|
+
Assert.equal false $
|
26
|
+
isPangram "the quick brown fish jumps over the lazy dog"
|
27
|
+
|
28
|
+
test "pangram with underscores" do
|
29
|
+
Assert.equal true $
|
30
|
+
isPangram "the_quick_brown_fox_jumps_over_the_lazy_dog"
|
31
|
+
|
32
|
+
test "pangram with numbers" do
|
33
|
+
Assert.equal true $
|
34
|
+
isPangram "the 1 quick brown fox jumps over the 2 lazy dogs"
|
35
|
+
|
36
|
+
test "missing letters replaced by numbers" do
|
37
|
+
Assert.equal false $
|
38
|
+
isPangram "7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"
|
39
|
+
|
40
|
+
test "pangram with mixed case and punctuation" do
|
41
|
+
Assert.equal true $
|
42
|
+
isPangram "\"Five quacking Zephyrs jolt my wax bed.\""
|
43
|
+
|
44
|
+
test "pangram with non ascii characters" do
|
45
|
+
Assert.equal true $
|
46
|
+
isPangram "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich."
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"name": "hello-world",
|
3
|
+
"ignore": [
|
4
|
+
"**/.*",
|
5
|
+
"node_modules",
|
6
|
+
"bower_components",
|
7
|
+
"output"
|
8
|
+
],
|
9
|
+
"dependencies": {
|
10
|
+
"purescript-prelude": "^2.1.0"
|
11
|
+
},
|
12
|
+
"devDependencies": {
|
13
|
+
"purescript-psci-support": "^2.0.0",
|
14
|
+
"purescript-test-unit": "^10.0.1"
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Raindrops
|
2
|
+
( raindrops
|
3
|
+
) where
|
4
|
+
|
5
|
+
import Prelude
|
6
|
+
|
7
|
+
raindrops :: Int -> String
|
8
|
+
raindrops n =
|
9
|
+
let
|
10
|
+
fn = toNoise n
|
11
|
+
noises =
|
12
|
+
fn 3 "Pling" <>
|
13
|
+
fn 5 "Plang" <>
|
14
|
+
fn 7 "Plong"
|
15
|
+
in
|
16
|
+
case noises of
|
17
|
+
"" -> show n
|
18
|
+
other -> other
|
19
|
+
|
20
|
+
toNoise :: Int -> Int -> String -> String
|
21
|
+
toNoise n factor noise
|
22
|
+
| mod n factor == 0 = noise
|
23
|
+
| otherwise = ""
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Test.Main where
|
2
|
+
|
3
|
+
import Prelude
|
4
|
+
import Test.Unit (suite, test)
|
5
|
+
import Test.Unit.Main (runTest)
|
6
|
+
import Test.Unit.Assert as Assert
|
7
|
+
import Raindrops (raindrops)
|
8
|
+
|
9
|
+
|
10
|
+
main = runTest do
|
11
|
+
suite "Raindrops.raindrops" do
|
12
|
+
test "1" do
|
13
|
+
Assert.equal "1" $ raindrops 1
|
14
|
+
test "3" do
|
15
|
+
Assert.equal "Pling" $ raindrops 3
|
16
|
+
test "5" do
|
17
|
+
Assert.equal "Plang" $ raindrops 5
|
18
|
+
test "7" do
|
19
|
+
Assert.equal "Plong" $ raindrops 7
|
20
|
+
test "6" do
|
21
|
+
Assert.equal "Pling" $ raindrops 6
|
22
|
+
test "9" do
|
23
|
+
Assert.equal "Pling" $ raindrops 9
|
24
|
+
test "10" do
|
25
|
+
Assert.equal "Plang" $ raindrops 10
|
26
|
+
test "14" do
|
27
|
+
Assert.equal "Plong" $ raindrops 14
|
28
|
+
test "15" do
|
29
|
+
Assert.equal "PlingPlang" $ raindrops 15
|
30
|
+
test "21" do
|
31
|
+
Assert.equal "PlingPlong" $ raindrops 21
|
32
|
+
test "25" do
|
33
|
+
Assert.equal "Plang" $ raindrops 25
|
34
|
+
test "35" do
|
35
|
+
Assert.equal "PlangPlong" $ raindrops 35
|
36
|
+
test "49" do
|
37
|
+
Assert.equal "Plong" $ raindrops 49
|
38
|
+
test "52" do
|
39
|
+
Assert.equal "52" $ raindrops 52
|
40
|
+
test "105" do
|
41
|
+
Assert.equal "PlingPlangPlong" $ raindrops 105
|
data/tracks/swift/Dangerfile
CHANGED
@@ -18,7 +18,7 @@ warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]"
|
|
18
18
|
warn("Big PR") if git.lines_of_code > 500
|
19
19
|
|
20
20
|
#ENSURE THERE IS A SUMMARY FOR A PR
|
21
|
-
warn("Please provide a summary in the Pull Request description") if github.pr_body.length < 5
|
21
|
+
warn("Please provide a summary in the Pull Request description. See more info <a href=\"http\://tinyletter.com/exercism/letters/exercism-pull-requests\">here.</a>") if github.pr_body.length < 5
|
22
22
|
|
23
23
|
# LINT Comments in for each Line
|
24
24
|
jsonpath = "lintreport.json"
|
data/tracks/swift/config.json
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
import Foundation
|
2
|
+
|
3
|
+
struct Isogram {
|
4
|
+
|
5
|
+
static func isIsogram(_ string: String) -> Bool {
|
6
|
+
let lowercasedString = string.lowercased()
|
7
|
+
let lowercaseLetterSet = CharacterSet.lowercaseLetters
|
8
|
+
|
9
|
+
var letters: Set<UnicodeScalar> = []
|
10
|
+
|
11
|
+
for character in lowercasedString.unicodeScalars {
|
12
|
+
guard lowercaseLetterSet.contains(character) else {
|
13
|
+
continue
|
14
|
+
}
|
15
|
+
|
16
|
+
guard !letters.contains(character) else {
|
17
|
+
return false
|
18
|
+
}
|
19
|
+
|
20
|
+
letters.insert(character)
|
21
|
+
}
|
22
|
+
|
23
|
+
return true
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#if swift(>=3.0)
|
2
|
+
import XCTest
|
3
|
+
#endif
|
4
|
+
|
5
|
+
class IsogramTest: XCTestCase {
|
6
|
+
|
7
|
+
func testEmptyString() {
|
8
|
+
XCTAssertTrue(Isogram.isIsogram(""))
|
9
|
+
}
|
10
|
+
|
11
|
+
func testIsogramWithOnlyLowerCaseCharacters() {
|
12
|
+
XCTAssertTrue(Isogram.isIsogram("isogram"))
|
13
|
+
}
|
14
|
+
|
15
|
+
func testWordWithOneDuplicatedCharacter() {
|
16
|
+
XCTAssertFalse(Isogram.isIsogram("eleven"))
|
17
|
+
}
|
18
|
+
|
19
|
+
func testLongestReportedEnglishIsogram() {
|
20
|
+
XCTAssertTrue(Isogram.isIsogram("subdermatoglyphic"))
|
21
|
+
}
|
22
|
+
|
23
|
+
func testWordWithDuplicatedCharacterInMixedCase() {
|
24
|
+
XCTAssertFalse(Isogram.isIsogram("Alphabet"))
|
25
|
+
}
|
26
|
+
|
27
|
+
func testHypotheticalIsogrammicWordWithHyphen() {
|
28
|
+
XCTAssertTrue(Isogram.isIsogram("thumbscrew-japingly"))
|
29
|
+
}
|
30
|
+
|
31
|
+
func testIsogramWithDuplicatedNonLetterCharacter() {
|
32
|
+
XCTAssertTrue(Isogram.isIsogram("Hjelmqvist-Gryb-Zock-Pfund-Wax"))
|
33
|
+
}
|
34
|
+
|
35
|
+
func testMadeUpNameThatIsAnIsogram() {
|
36
|
+
XCTAssertTrue(Isogram.isIsogram("Emily Jung Schwartzkopf"))
|
37
|
+
}
|
38
|
+
}
|
@@ -11,7 +11,7 @@ struct SpaceAge {
|
|
11
11
|
var onSaturn: Float { return round((seconds / 929_596_608.0) * 100) / 100 }
|
12
12
|
var onUranus: Float { return round((seconds / 2_661_041_808.0) * 100) / 100 }
|
13
13
|
var onNeptune: Float { return round((seconds / 5_200_418_592.0) * 100) / 100 }
|
14
|
-
|
14
|
+
|
15
15
|
init(_ input: Float) {
|
16
16
|
self.seconds = input
|
17
17
|
}
|
@@ -127,6 +127,8 @@
|
|
127
127
|
E90D62081C653ADC00C266D3 /* PalindromeProductsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90D62071C653ADC00C266D3 /* PalindromeProductsTest.swift */; };
|
128
128
|
E90DE39C1D3E812300F3B881 /* AllYourBaseExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90DE39B1D3E812300F3B881 /* AllYourBaseExample.swift */; };
|
129
129
|
E90DE39E1D3E818000F3B881 /* AllYourBaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90DE39D1D3E818000F3B881 /* AllYourBaseTest.swift */; };
|
130
|
+
E92EA8F91DFB5CF200C5CFF7 /* IsogramExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E92EA8F81DFB5CF200C5CFF7 /* IsogramExample.swift */; };
|
131
|
+
E92EA8FB1DFB5D0200C5CFF7 /* IsogramTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E92EA8FA1DFB5D0200C5CFF7 /* IsogramTest.swift */; };
|
130
132
|
E9443F251DF5C02700A468B7 /* TransposeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9443F241DF5C02700A468B7 /* TransposeExample.swift */; };
|
131
133
|
E9443F271DF5C04000A468B7 /* TransposeTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9443F261DF5C04000A468B7 /* TransposeTest.swift */; };
|
132
134
|
E94BDECF1C510E68009318BB /* BinarySearchExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E94BDECD1C510E68009318BB /* BinarySearchExample.swift */; };
|
@@ -287,6 +289,8 @@
|
|
287
289
|
E90D62071C653ADC00C266D3 /* PalindromeProductsTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = PalindromeProductsTest.swift; path = "palindrome-products/PalindromeProductsTest.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
|
288
290
|
E90DE39B1D3E812300F3B881 /* AllYourBaseExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AllYourBaseExample.swift; path = "../all-your-base/AllYourBaseExample.swift"; sourceTree = "<group>"; };
|
289
291
|
E90DE39D1D3E818000F3B881 /* AllYourBaseTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AllYourBaseTest.swift; path = "../all-your-base/AllYourBaseTest.swift"; sourceTree = "<group>"; };
|
292
|
+
E92EA8F81DFB5CF200C5CFF7 /* IsogramExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IsogramExample.swift; path = isogram/IsogramExample.swift; sourceTree = "<group>"; };
|
293
|
+
E92EA8FA1DFB5D0200C5CFF7 /* IsogramTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IsogramTest.swift; path = isogram/IsogramTest.swift; sourceTree = "<group>"; };
|
290
294
|
E9443F241DF5C02700A468B7 /* TransposeExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TransposeExample.swift; path = ../transpose/TransposeExample.swift; sourceTree = "<group>"; };
|
291
295
|
E9443F261DF5C04000A468B7 /* TransposeTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TransposeTest.swift; path = ../transpose/TransposeTest.swift; sourceTree = "<group>"; };
|
292
296
|
E94BDECD1C510E68009318BB /* BinarySearchExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BinarySearchExample.swift; path = "binary-search/BinarySearchExample.swift"; sourceTree = "<group>"; };
|
@@ -362,6 +366,7 @@
|
|
362
366
|
1E9A63191C506EFC00E28AE1 /* hello-world */,
|
363
367
|
E9AFA14E1C594423006AD72D /* hexadecimal */,
|
364
368
|
E9AFA1751C614D6A006AD72D /* house */,
|
369
|
+
E92EA8F61DFB5CCF00C5CFF7 /* isogram */,
|
365
370
|
1E9A63221C506EFC00E28AE1 /* kindergarten-garden */,
|
366
371
|
E9AFA15D1C5BFB55006AD72D /* largest-series-product */,
|
367
372
|
1E9A63251C506EFC00E28AE1 /* leap */,
|
@@ -988,6 +993,15 @@
|
|
988
993
|
path = acronym;
|
989
994
|
sourceTree = "<group>";
|
990
995
|
};
|
996
|
+
E92EA8F61DFB5CCF00C5CFF7 /* isogram */ = {
|
997
|
+
isa = PBXGroup;
|
998
|
+
children = (
|
999
|
+
E92EA8F81DFB5CF200C5CFF7 /* IsogramExample.swift */,
|
1000
|
+
E92EA8FA1DFB5D0200C5CFF7 /* IsogramTest.swift */,
|
1001
|
+
);
|
1002
|
+
name = isogram;
|
1003
|
+
sourceTree = "<group>";
|
1004
|
+
};
|
991
1005
|
E9443F201DF5BFBF00A468B7 /* transpose */ = {
|
992
1006
|
isa = PBXGroup;
|
993
1007
|
children = (
|
@@ -1222,6 +1236,7 @@
|
|
1222
1236
|
1E9A63BC1C506EFD00E28AE1 /* PerfectNumbersExample.swift in Sources */,
|
1223
1237
|
E99909621D792446002A2B6E /* RunLengthEncodingExample.swift in Sources */,
|
1224
1238
|
1E9A63BB1C506EFD00E28AE1 /* OctalTest.swift in Sources */,
|
1239
|
+
E92EA8FB1DFB5D0200C5CFF7 /* IsogramTest.swift in Sources */,
|
1225
1240
|
1E9A63ED1C506EFD00E28AE1 /* WordCountTest.swift in Sources */,
|
1226
1241
|
1E9A63951C506EFD00E28AE1 /* BobTest.swift in Sources */,
|
1227
1242
|
1E9A63BE1C506EFD00E28AE1 /* PhoneNumberExample.swift in Sources */,
|
@@ -1248,6 +1263,7 @@
|
|
1248
1263
|
1E9A63B81C506EFD00E28AE1 /* NucleotideCountExample.swift in Sources */,
|
1249
1264
|
1E9A63881C506EFC00E28AE1 /* AccumulateExample.swift in Sources */,
|
1250
1265
|
E9AFA1491C593AF5006AD72D /* BinarySearchTreeTest.swift in Sources */,
|
1266
|
+
E92EA8F91DFB5CF200C5CFF7 /* IsogramExample.swift in Sources */,
|
1251
1267
|
E908CD541C6D7AD1005D081E /* PascalsTriangleExample.swift in Sources */,
|
1252
1268
|
1E9A63D61C506EFD00E28AE1 /* SeriesExample.swift in Sources */,
|
1253
1269
|
1E9A638B1C506EFD00E28AE1 /* AcronymTest.swift in Sources */,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trackler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.3.
|
4
|
+
version: 2.0.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katrina Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -4788,6 +4788,11 @@ files:
|
|
4788
4788
|
- tracks/ocaml/docs/LEARNING.md
|
4789
4789
|
- tracks/ocaml/docs/RESOURCES.md
|
4790
4790
|
- tracks/ocaml/docs/TESTS.md
|
4791
|
+
- tracks/ocaml/exercises/all-your-base/.merlin
|
4792
|
+
- tracks/ocaml/exercises/all-your-base/Makefile
|
4793
|
+
- tracks/ocaml/exercises/all-your-base/all_your_base.mli
|
4794
|
+
- tracks/ocaml/exercises/all-your-base/example.ml
|
4795
|
+
- tracks/ocaml/exercises/all-your-base/test.ml
|
4791
4796
|
- tracks/ocaml/exercises/anagram/.merlin
|
4792
4797
|
- tracks/ocaml/exercises/anagram/Makefile
|
4793
4798
|
- tracks/ocaml/exercises/anagram/anagram.mli
|
@@ -5195,6 +5200,9 @@ files:
|
|
5195
5200
|
- tracks/perl6/exercises/robot-name/robot.t
|
5196
5201
|
- tracks/perl6/exercises/scrabble-score/Example.pm
|
5197
5202
|
- tracks/perl6/exercises/scrabble-score/scrabble_score.t
|
5203
|
+
- tracks/perl6/exercises/space-age/Example.p6
|
5204
|
+
- tracks/perl6/exercises/space-age/cases.json
|
5205
|
+
- tracks/perl6/exercises/space-age/space-age.t
|
5198
5206
|
- tracks/perl6/exercises/trinary/Example.p6
|
5199
5207
|
- tracks/perl6/exercises/trinary/trinary.t
|
5200
5208
|
- tracks/perl6/exercises/word-count/Example.pm
|
@@ -5427,6 +5435,7 @@ files:
|
|
5427
5435
|
- tracks/purescript/README.md
|
5428
5436
|
- tracks/purescript/SETUP.md
|
5429
5437
|
- tracks/purescript/bin/fetch-configlet
|
5438
|
+
- tracks/purescript/bin/test.sh
|
5430
5439
|
- tracks/purescript/config.json
|
5431
5440
|
- tracks/purescript/docs/ABOUT.md
|
5432
5441
|
- tracks/purescript/docs/INSTALLATION.md
|
@@ -5437,6 +5446,18 @@ files:
|
|
5437
5446
|
- tracks/purescript/exercises/hello-world/examples/src/HelloWorld.purs
|
5438
5447
|
- tracks/purescript/exercises/hello-world/src/HelloWorld.purs
|
5439
5448
|
- tracks/purescript/exercises/hello-world/test/Main.purs
|
5449
|
+
- tracks/purescript/exercises/leap/bower.json
|
5450
|
+
- tracks/purescript/exercises/leap/examples/src/Leap.purs
|
5451
|
+
- tracks/purescript/exercises/leap/src/Leap.purs
|
5452
|
+
- tracks/purescript/exercises/leap/test/Main.purs
|
5453
|
+
- tracks/purescript/exercises/pangram/bower.json
|
5454
|
+
- tracks/purescript/exercises/pangram/examples/src/Pangram.purs
|
5455
|
+
- tracks/purescript/exercises/pangram/src/Pangram.purs
|
5456
|
+
- tracks/purescript/exercises/pangram/test/Main.purs
|
5457
|
+
- tracks/purescript/exercises/raindrops/bower.json
|
5458
|
+
- tracks/purescript/exercises/raindrops/examples/src/Raindrops.purs
|
5459
|
+
- tracks/purescript/exercises/raindrops/src/Raindrops.purs
|
5460
|
+
- tracks/purescript/exercises/raindrops/test/Main.purs
|
5440
5461
|
- tracks/purescript/img/icon.png
|
5441
5462
|
- tracks/python/.git
|
5442
5463
|
- tracks/python/.gitignore
|
@@ -6766,6 +6787,8 @@ files:
|
|
6766
6787
|
- tracks/swift/exercises/hexadecimal/HexadecimalTest.swift
|
6767
6788
|
- tracks/swift/exercises/house/HouseExample.swift
|
6768
6789
|
- tracks/swift/exercises/house/HouseTest.swift
|
6790
|
+
- tracks/swift/exercises/isogram/IsogramExample.swift
|
6791
|
+
- tracks/swift/exercises/isogram/IsogramTest.swift
|
6769
6792
|
- tracks/swift/exercises/kindergarten-garden/KindergartenGardenExample.swift
|
6770
6793
|
- tracks/swift/exercises/kindergarten-garden/KindergartenGardenTest.swift
|
6771
6794
|
- tracks/swift/exercises/largest-series-product/LargestSeriesProductExample.swift
|