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.
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