trackler 2.0.3.6 → 2.0.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/csharp/build.fsx +1 -2
  4. data/tracks/csharp/exercises/clock/ClockTest.cs +9 -0
  5. data/tracks/fsharp/build.fsx +1 -2
  6. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTreeTest.fs +3 -3
  7. data/tracks/objective-c/Dangerfile +1 -1
  8. data/tracks/ocaml/config.json +6 -5
  9. data/tracks/ocaml/exercises/all-your-base/.merlin +5 -0
  10. data/tracks/ocaml/exercises/all-your-base/Makefile +11 -0
  11. data/tracks/ocaml/exercises/all-your-base/all_your_base.mli +5 -0
  12. data/tracks/ocaml/exercises/all-your-base/example.ml +20 -0
  13. data/tracks/ocaml/exercises/all-your-base/test.ml +58 -0
  14. data/tracks/ocaml/tools/test-generator/src/special_cases.ml +10 -2
  15. data/tracks/ocaml/tools/test-generator/templates/all-your-base/template.ml +10 -6
  16. data/tracks/perl6/config.json +5 -0
  17. data/tracks/perl6/exercises/space-age/Example.p6 +16 -0
  18. data/tracks/perl6/exercises/space-age/cases.json +46 -0
  19. data/tracks/perl6/exercises/space-age/space-age.t +23 -0
  20. data/tracks/purescript/.gitignore +2 -0
  21. data/tracks/purescript/.travis.yml +8 -0
  22. data/tracks/purescript/bin/test.sh +39 -0
  23. data/tracks/purescript/config.json +22 -0
  24. data/tracks/purescript/docs/INSTALLATION.md +12 -0
  25. data/tracks/purescript/docs/TESTS.md +6 -0
  26. data/tracks/purescript/exercises/hello-world/src/HelloWorld.purs +0 -5
  27. data/tracks/purescript/exercises/leap/bower.json +16 -0
  28. data/tracks/purescript/exercises/leap/examples/src/Leap.purs +9 -0
  29. data/tracks/purescript/exercises/leap/src/Leap.purs +1 -0
  30. data/tracks/purescript/exercises/leap/test/Main.purs +25 -0
  31. data/tracks/purescript/exercises/pangram/bower.json +17 -0
  32. data/tracks/purescript/exercises/pangram/examples/src/Pangram.purs +25 -0
  33. data/tracks/purescript/exercises/pangram/src/Pangram.purs +3 -0
  34. data/tracks/purescript/exercises/pangram/test/Main.purs +46 -0
  35. data/tracks/purescript/exercises/raindrops/bower.json +16 -0
  36. data/tracks/purescript/exercises/raindrops/examples/src/Raindrops.purs +23 -0
  37. data/tracks/purescript/exercises/raindrops/src/Raindrops.purs +3 -0
  38. data/tracks/purescript/exercises/raindrops/test/Main.purs +41 -0
  39. data/tracks/swift/Dangerfile +1 -1
  40. data/tracks/swift/config.json +8 -0
  41. data/tracks/swift/exercises/isogram/IsogramExample.swift +25 -0
  42. data/tracks/swift/exercises/isogram/IsogramTest.swift +38 -0
  43. data/tracks/swift/exercises/space-age/SpaceAgeExample.swift +1 -1
  44. data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +16 -0
  45. metadata +25 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b901d5120c25f537dcee46f542598bbb15a01356
4
- data.tar.gz: 8466d0a7d4886cd07a4c9110398131daf7e3dcf9
3
+ metadata.gz: 7778e095275365245b61d227de2380686d8f52a6
4
+ data.tar.gz: baf69491b1aa86f855c0a3a0dc312c169d3f91b7
5
5
  SHA512:
6
- metadata.gz: b25a7bcb55bb5636de9f61f7ad52e304fa68c9761fc5f479debfd0b58176635183714511d6d3cd0c5a515007c271ebaddf70ac6c7913bc526fdacc4d66e9073b
7
- data.tar.gz: dda9f974754afe11ae94ec7d937c422ce3dcb5e2cfc24b16fcfc3ee4527df995802b124e0ea46a2d1ab1a491ad602d2ca4ad8ccf2b933d2aa1ea91450b6d3d1b
6
+ metadata.gz: ef3092dcc542059ebcb8dce86d78c9e36ab07624096d962b469cb06a00d16a6f85684e7a015e8dfd32446172b33b8e49b4ecdb3c01e40eed7d187b5f80beeb11
7
+ data.tar.gz: 55cb0a7661c46826a0272c15bb231790ada521268054b488e4d219819b61231b0a9cb7ccee5a1e1cd9f3f80923f64187d8d357221322b1799098ab15829d5ad6
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.3.6"
2
+ VERSION = "2.0.3.7"
3
3
  end
@@ -43,8 +43,7 @@ Target "Test" (fun _ ->
43
43
  [compiledOutput]
44
44
  |> NUnit3 (fun p -> { p with
45
45
  ShadowCopy = false
46
- ToolPath = @"C:\Tools\NUnit3\bin\nunit3-console.exe"
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()
@@ -41,8 +41,7 @@ Target "Test" (fun _ ->
41
41
  [compiledOutput]
42
42
  |> NUnit3 (fun p -> { p with
43
43
  ShadowCopy = false
44
- ToolPath = @"C:\Tools\NUnit3\bin\nunit3-console.exe"
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"
@@ -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,5 @@
1
+ PKG findlib
2
+ PKG core
3
+ PKG ounit
4
+ S *
5
+ B *
@@ -0,0 +1,11 @@
1
+ test: test.native
2
+ @./test.native
3
+
4
+ test.native: *.ml *.mli
5
+ @corebuild -r -quiet -pkg oUnit test.native
6
+
7
+ clean:
8
+ rm -rf _build
9
+ rm -f test.native
10
+
11
+ .PHONY: clean
@@ -0,0 +1,5 @@
1
+ open Core.Std
2
+
3
+ type base = int
4
+
5
+ val convert_bases : from: base -> digits: int list -> target: base -> (int list) option
@@ -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 < 0 then "(" ^ v ^ "L)" else v ^ "L")
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 All_your_bases
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:Bool.to_string
10
+ assert_equal exp got ~printer:option_printer
7
11
 
8
12
  let tests = [
9
- (* TEST
10
- "$description" >::
11
- ae $expected (convert_bases $input_base $input_digits $output_base);
12
- END TEST *)
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 () =
@@ -80,6 +80,11 @@
80
80
  "difficulty": 1,
81
81
  "slug": "trinary",
82
82
  "topics": []
83
+ },
84
+ {
85
+ "difficulty": 1,
86
+ "slug": "space-age",
87
+ "topics": []
83
88
  }
84
89
  ]
85
90
  }
@@ -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
+ }
@@ -3,6 +3,8 @@
3
3
  bin/configlet
4
4
  bin/configlet.exe
5
5
 
6
+ **/npm-debug.log
7
+
6
8
  # Purescript artifact directories
7
9
  **/bower_components/
8
10
  **/node_modules/
@@ -1,5 +1,13 @@
1
1
  language: bash
2
2
 
3
+ sudo: false
4
+
5
+ install:
6
+ - nvm install 6
7
+ - nvm use 6
8
+ - npm install -g purescript@0.10.2 pulp bower
9
+
3
10
  script:
4
11
  - bin/fetch-configlet
5
12
  - bin/configlet .
13
+ - bin/test.sh
@@ -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,6 @@
1
+ The Purescript exercise test suites may be run from the exercise directory
2
+ using the pulp tool.
3
+
4
+ cd exercism/project/directory/purescript/hello-world
5
+ bower install
6
+ pulp test
@@ -1,6 +1 @@
1
1
  module HelloWorld where
2
-
3
- import Prelude
4
- import Data.Maybe (Maybe(Just, Nothing))
5
-
6
- helloWorld :: Maybe String -> String
@@ -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,9 @@
1
+ module Leap where
2
+
3
+ import Prelude
4
+
5
+ isLeapYear :: Int -> Boolean
6
+ isLeapYear year =
7
+ mod year 4 == 0 &&
8
+ mod year 100 /= 0 ||
9
+ mod year 400 == 0
@@ -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,3 @@
1
+ module Pangram
2
+ ( isPangram
3
+ ) where
@@ -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,3 @@
1
+ module Raindrops
2
+ ( raindrops
3
+ ) where
@@ -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
@@ -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"
@@ -120,6 +120,14 @@
120
120
  "Transforming"
121
121
  ]
122
122
  },
123
+ {
124
+ "difficulty": 2,
125
+ "slug": "isogram",
126
+ "topics": [
127
+ "Strings",
128
+ "Filtering"
129
+ ]
130
+ },
123
131
  {
124
132
  "difficulty": 3,
125
133
  "slug": "clock",
@@ -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.6
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-09 00:00:00.000000000 Z
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