trackler 2.2.1.65 → 2.2.1.66

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/reverse-string/canonical-data.json +3 -3
  4. data/tracks/c/exercises/hello-world/makefile +9 -0
  5. data/tracks/c/exercises/phone-number/test/test_phone_number.c +2 -1
  6. data/tracks/go/exercises/collatz-conjecture/.meta/gen.go +72 -0
  7. data/tracks/go/exercises/collatz-conjecture/cases_test.go +43 -0
  8. data/tracks/go/exercises/collatz-conjecture/collatz_conjecture_test.go +0 -42
  9. data/tracks/perl6/config.json +10 -0
  10. data/tracks/perl6/docs/ABOUT.md +21 -12
  11. data/tracks/perl6/exercises/all-your-base/AllYourBase.pm6 +4 -1
  12. data/tracks/perl6/exercises/all-your-base/Example.pm6 +14 -34
  13. data/tracks/perl6/exercises/all-your-base/all-your-base.t +40 -53
  14. data/tracks/perl6/exercises/all-your-base/example.yaml +31 -51
  15. data/tracks/perl6/exercises/hamming/Example.pm6 +5 -4
  16. data/tracks/perl6/exercises/hamming/Hamming.pm6 +1 -1
  17. data/tracks/perl6/exercises/hamming/example.yaml +6 -5
  18. data/tracks/perl6/exercises/hamming/hamming.t +2 -2
  19. data/tracks/perl6/exercises/meetup/README.md +16 -12
  20. data/tracks/perl6/exercises/nucleotide-count/Example.pm6 +7 -0
  21. data/tracks/perl6/exercises/nucleotide-count/NucleotideCount.pm6 +4 -0
  22. data/tracks/perl6/exercises/nucleotide-count/README.md +38 -0
  23. data/tracks/perl6/exercises/nucleotide-count/example.yaml +24 -0
  24. data/tracks/perl6/exercises/nucleotide-count/nucleotide-count.t +116 -0
  25. data/tracks/python/exercises/perfect-numbers/example.py +13 -2
  26. data/tracks/python/exercises/perfect-numbers/perfect_numbers.py +1 -5
  27. data/tracks/python/exercises/perfect-numbers/perfect_numbers_test.py +60 -22
  28. data/tracks/python/test/check-exercises.py +1 -30
  29. data/tracks/scala/config.json +12 -0
  30. data/tracks/scala/exercises/flatten-array/README.md +29 -0
  31. data/tracks/scala/exercises/flatten-array/build.sbt +3 -0
  32. data/tracks/scala/exercises/flatten-array/example.scala +7 -0
  33. data/tracks/scala/exercises/flatten-array/project/build.properties +1 -0
  34. data/tracks/scala/exercises/flatten-array/src/main/scala/.keep +0 -0
  35. data/tracks/scala/exercises/flatten-array/src/test/scala/FlattenArrayTest.scala +55 -0
  36. metadata +15 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f5d8b6d5409d0876c5f4a128f8aaca28d581f9c8
4
- data.tar.gz: 5a090210fad681fbd4afec72f355de5647b466e8
3
+ metadata.gz: 3204de800ec7eef566ccc5e2a48e9dd99d70a407
4
+ data.tar.gz: 8ea801d22c63ea5a884e0b879fcfa80af2f611cb
5
5
  SHA512:
6
- metadata.gz: edb8c0e07373da1f34e6ea9fd2fbd69ff03fba9cf5f8e04bdb9aac09ed18838a3876b2097b6452c82b1a5b62113dce996e3b76eff6f26ed7180b0f54a9ad359c
7
- data.tar.gz: 7d963ed89adbedb458b719c11cc6ebd53b7428dfc9b8157c075aca8e468b5566a18341881fcfe841d437ea4e2c2f7a5239be4aa75c9747ddd79df2f82611e5f8
6
+ metadata.gz: d62a8b637aaa23601fe7bf220d463a4ed3d01382bbc2648495ba884da180c05ff14926ff0009a937dc2c63e0f3570365bd1777e32ee655dade7cf3050366b670
7
+ data.tar.gz: f40ff5b7155f9837e9d8c5bd5a73e04ffc89e043295d56fc32be38c168db4342bca2696e62e6849a0c642344c22f2f16f5b36fd52c2a60771c032c06784a577d
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.2.1.65"
2
+ VERSION = "2.2.1.66"
3
3
  end
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "exercise": "reverse-string",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "comments": [
5
5
  "If property based testing tools are available, a good property to test is reversing a string twice: reverse(reverse(string)) == string"
6
6
  ],
7
7
  "cases": [
8
8
  {
9
- "description": "empty string",
9
+ "description": "an empty string",
10
10
  "property": "reverse",
11
11
  "input": "",
12
12
  "expected": ""
@@ -36,4 +36,4 @@
36
36
  "expected": "racecar"
37
37
  }
38
38
  ]
39
- }
39
+ }
@@ -1,13 +1,22 @@
1
1
  CFLAGS = -std=c99
2
+ CFLAGS += -g
2
3
  CFLAGS += -Wall
3
4
  CFLAGS += -Wextra
4
5
  CFLAGS += -pedantic
5
6
  CFLAGS += -Werror
6
7
 
8
+ VFLAGS = --quiet
9
+ VFLAGS += --tool=memcheck
10
+ VFLAGS += --leak-check=full
11
+ VFLAGS += --error-exitcode=1
7
12
 
8
13
  test: tests.out
9
14
  @./tests.out
10
15
 
16
+ memcheck: tests.out
17
+ @valgrind $(VFLAGS) ./tests.out
18
+ @echo "Memory check passed"
19
+
11
20
  clean:
12
21
  rm -f *.o *.out
13
22
 
@@ -2,7 +2,7 @@
2
2
  #include "../src/phone_number.h"
3
3
  #include <stdlib.h>
4
4
 
5
- char *result;
5
+ static char *result = NULL;
6
6
 
7
7
  void setUp(void)
8
8
  {
@@ -11,6 +11,7 @@ void setUp(void)
11
11
  void tearDown(void)
12
12
  {
13
13
  free(result);
14
+ result = NULL;
14
15
  }
15
16
 
16
17
  void test_cleans_parens_dashes_and_spaces_from_the_number(void)
@@ -0,0 +1,72 @@
1
+ package main
2
+
3
+ import (
4
+ "log"
5
+ "text/template"
6
+
7
+ "../../../gen"
8
+ )
9
+
10
+ func main() {
11
+ t, err := template.New("").Parse(tmpl)
12
+ if err != nil {
13
+ log.Fatal(err)
14
+ }
15
+ var j js
16
+ if err := gen.Gen("collatz-conjecture", &j, t); err != nil {
17
+ log.Fatal(err)
18
+ }
19
+ }
20
+
21
+ type OneCase struct {
22
+ Description string
23
+ Number int
24
+ Expected interface{}
25
+ }
26
+
27
+ // The JSON structure we expect to be able to unmarshal into
28
+ type js struct {
29
+ Cases []OneCase
30
+ }
31
+
32
+ func (c OneCase) Valid() bool {
33
+ valid, _ := determineExpected(c.Expected)
34
+ return valid
35
+ }
36
+
37
+ func (c OneCase) Answer() int {
38
+ _, answer := determineExpected(c.Expected)
39
+ return answer
40
+ }
41
+
42
+ // determineExpected examines an .Expected interface{} object and determines
43
+ // whether a test case is valid(bool) and has an answer or expects an error.
44
+ // returning valid and answer.
45
+ func determineExpected(expected interface{}) (bool, int) {
46
+ ans, ok := expected.(float64)
47
+ if ok {
48
+ return ok, int(ans)
49
+ }
50
+ return false, 0
51
+ }
52
+
53
+ // template applied to above data structure generates the Go test cases
54
+ var tmpl = `package collatzconjecture
55
+
56
+ {{.Header}}
57
+
58
+ var testCases = []struct {
59
+ description string
60
+ input int
61
+ expectError bool
62
+ expected int
63
+ }{
64
+ {{range .J.Cases}}{
65
+ description: "{{.Description}}",
66
+ input: {{.Number}},
67
+ {{if .Valid}} expected: {{.Answer}},
68
+ {{- else}} expectError: true,
69
+ {{- end}}
70
+ },
71
+ {{end}}}
72
+ `
@@ -0,0 +1,43 @@
1
+ package collatzconjecture
2
+
3
+ // Source: exercism/problem-specifications
4
+ // Commit: 25c4479 Collatz-conjecture: remove trailing space in test name (#839)
5
+ // Problem Specifications Version: 1.1.1
6
+
7
+ var testCases = []struct {
8
+ description string
9
+ input int
10
+ expectError bool
11
+ expected int
12
+ }{
13
+ {
14
+ description: "zero steps for one",
15
+ input: 1,
16
+ expected: 0,
17
+ },
18
+ {
19
+ description: "divide if even",
20
+ input: 16,
21
+ expected: 4,
22
+ },
23
+ {
24
+ description: "even and odd steps",
25
+ input: 12,
26
+ expected: 9,
27
+ },
28
+ {
29
+ description: "Large number of even and odd steps",
30
+ input: 1000000,
31
+ expected: 152,
32
+ },
33
+ {
34
+ description: "zero is an error",
35
+ input: 0,
36
+ expectError: true,
37
+ },
38
+ {
39
+ description: "negative value is an error",
40
+ input: -15,
41
+ expectError: true,
42
+ },
43
+ }
@@ -4,48 +4,6 @@ import (
4
4
  "testing"
5
5
  )
6
6
 
7
- var testCases = []struct {
8
- description string
9
- input int
10
- expectError bool
11
- expected int
12
- }{
13
- {
14
- description: "zero steps for one",
15
- input: 1,
16
- expectError: false,
17
- expected: 0,
18
- },
19
- {
20
- description: "divide if even",
21
- input: 16,
22
- expectError: false,
23
- expected: 4,
24
- },
25
- {
26
- description: "even and old steps",
27
- input: 12,
28
- expectError: false,
29
- expected: 9,
30
- },
31
- {
32
- description: "large number of even and odd steps",
33
- input: 1000000,
34
- expectError: false,
35
- expected: 152,
36
- },
37
- {
38
- description: "zero is an error",
39
- input: 0,
40
- expectError: true,
41
- },
42
- {
43
- description: "negative value is an error",
44
- input: -15,
45
- expectError: true,
46
- },
47
- }
48
-
49
7
  func TestCollatzConjecture(t *testing.T) {
50
8
  for _, testCase := range testCases {
51
9
  steps, err := CollatzConjecture(testCase.input)
@@ -98,6 +98,16 @@
98
98
 
99
99
  ]
100
100
  },
101
+ {
102
+ "uuid": "0313a0a8-0d35-f480-7dce-65154edf4e804d52dc1",
103
+ "slug": "nucleotide-count",
104
+ "core": false,
105
+ "unlocked_by": null,
106
+ "difficulty": 3,
107
+ "topics": [
108
+
109
+ ]
110
+ },
101
111
  {
102
112
  "uuid": "9fc9b102-185d-4f34-98d0-e3084399610a",
103
113
  "slug": "clock",
@@ -1,15 +1,24 @@
1
- From [Perl 6 Introduction](http://perl6intro.com/):
1
+ Perl 6 is a clean, modern, multi-paradigm language; it offers procedural,
2
+ object-oriented AND functional programming methodologies. It is a supremely
3
+ flexible language, adapting to your style of programming, whether that be quick
4
+ one­liners for sysadmins, scripts to manage a database import, or the full stack
5
+ of modules necessary to realise an entire website.
2
6
 
3
- ## What is Perl 6
4
- Perl 6 is a high-level, general-purpose, gradually typed language. Perl 6 is multi-paradigmatic. It supports Procedural, Object Oriented, and Functional programming.
7
+ Perl 6 enhances Perl’s long­term appeal with a proper object system including
8
+ roles, threading and multi­method dispatch. It has spent a long time coming to
9
+ fruition and has learned from other programming languages, building on their
10
+ success and learning from the issues of the past. We believe Perl 6 is a
11
+ language that will last for decades as it has been conceived to adapt to future
12
+ trends and is flexible in its usage with other languages.
5
13
 
6
- ##### Perl 6 motto:
7
- * TMTOWTDI (Pronounced Tim Toady): There is more than one way to do it.
8
- * Easy things should stay easy, hard things should get easier, and impossible things should get hard.
14
+ Perl 6 learns from other languages. For instance: taking threading from Java
15
+ (simplified to a handful of methods); Foreign-function interfaces from Lisp make
16
+ accessing libraries as simple as one line of code. Regular expressions are now
17
+ turned up to 11 with the introduction of Parser Expression Grammars, which let
18
+ you tackle huge parsing tasks. Strictures and warnings are now automatic,
19
+ cutting out huge swathes of potential errors.
9
20
 
10
- ## Jargon
11
- * **Perl 6:** Is a language specification with a test suite. Implementations that pass the specification test suite are considered Perl 6.
12
- * **Rakudo:** Is a compiler for Perl 6.
13
- * **Rakudobrew:** Is an installation manager for Rakudo.
14
- * **Zef:** Is a Perl 6 module installer.
15
- * **Rakudo Star:** Is a bundle that includes Rakudo, Zef, a collection of Perl 6 modules, and documentation.
21
+ Perl 6’s mottos remain the same as Perl: “Perl is different. In a nutshell,
22
+ Perl is designed to make the easy jobs easy, without making the hard jobs
23
+ impossible.” and “There Is More Than One Way To Do It”. Now with even more
24
+ -Ofun (optimized for fun) added.
@@ -1 +1,4 @@
1
- unit module AllYourBase:ver<2>;
1
+ unit module AllYourBase:ver<3>;
2
+
3
+ sub convert-base (:%bases!, :@digits!) is export {
4
+ }
@@ -1,46 +1,26 @@
1
- unit module AllYourBase:ver<2>;
1
+ unit module AllYourBase:ver<3>;
2
2
 
3
- class X::AllYourBase::InvalidBase is Exception {
4
- has $.payload;
5
- method message {"$!payload is not a valid base."}
6
- }
7
-
8
- class X::AllYourBase::InvalidDigit is Exception {
9
- has %.payload;
10
- method message {"%!payload<digit> is not a valid digit for base %!payload<base>."}
11
- }
12
-
13
- sub convert-base (Int:D $input-base, @input-digits, Int:D $output-base --> Array:D) is export {
14
- for $input-base, $output-base {
15
- X::AllYourBase::InvalidBase.new(payload => $_).throw if $_ < 2;
16
- }
17
- from-decimal($output-base, (to-decimal $input-base, @input-digits));
3
+ sub convert-base (
4
+ :%bases! where all(.keys ~~ <from to>.Set, .values.all > 1),
5
+ :@digits! where %bases<from> > .all ~~ UInt:D,
6
+ --> Array[UInt:D]
7
+ ) is export {
8
+ from-decimal %bases<to>, to-decimal(%bases<from>, @digits);
18
9
  }
19
10
 
20
11
  sub to-decimal ($input-base, @input-digits) {
21
- return [].Slip if !@input-digits;
22
12
  my $elems = @input-digits.elems;
23
- for @input-digits {
24
- if $_ == 0 { $elems-- }
25
- else { last }
26
- }
27
- my $dec = 0;
28
- loop (my $i = 0; $i < $elems; $i++) {
29
- if @input-digits.reverse[$i] < 0 || @input-digits.reverse[$i] >= $input-base {
30
- X::AllYourBase::InvalidDigit.new( :payload(base => $input-base, digit => @input-digits.reverse[$i]) ).throw;
31
- }
32
- $dec += @input-digits.reverse[$i] * $input-base ** $i;
33
- }
34
- return $dec;
13
+ $_ == 0 ?? $elems-- !! last for @input-digits;
14
+ (loop (my $i = 0; $i < $elems; $i++) {
15
+ @input-digits.reverse[$i] * $input-base ** $i;
16
+ }).sum;
35
17
  }
36
18
 
37
- sub from-decimal ($output-base, $dec) {
38
- my @output-digits;
39
- my $num = $dec;
19
+ sub from-decimal ($output-base, $num is copy) {
20
+ my UInt:D @output-digits;
40
21
  while $num >= $output-base {
41
22
  unshift @output-digits, $num % $output-base;
42
23
  $num div= $output-base;
43
24
  }
44
- unshift @output-digits, $num;
45
- return @output-digits;
25
+ @output-digits.unshift: $num;
46
26
  }
@@ -5,7 +5,7 @@ use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
7
  my Str:D $exercise := 'AllYourBase';
8
- my Version:D $version = v2;
8
+ my Version:D $version = v3;
9
9
  my Str $module //= $exercise;
10
10
  plan 23;
11
11
 
@@ -22,26 +22,22 @@ if ::($exercise).^ver !~~ $version {
22
22
  require ::($module) <&convert-base>;
23
23
 
24
24
  my $c-data = from-json $=pod.pop.contents;
25
-
26
- for @($c-data<cases>) -> $case {
27
- if $case<expected> ~~ Array:D { test }
28
- else {
29
- given $case<description> {
30
- when 'empty list' { test [] }
31
- when /base|digit/ { throws-like {call-convert-base}, Exception, $_ }
32
- when /zero/ {
33
- when 'leading zeros' { test [4,2] }
34
- default { test [0] }
35
- }
36
- flunk "$_; not tested" if %*ENV<EXERCISM>; # To ensure that no canonical-data cases are missed.
37
- }
25
+ for $c-data<cases>.values -> $case {
26
+ sub call-convert-base {
27
+ convert-base(
28
+ bases => %(<from to> Z=> .<input_base output_base>),
29
+ digits => .<input_digits>,
30
+ ) given $case;
38
31
  }
39
32
 
40
- sub test (Array:D $expected = $case<expected>) {
41
- is-deeply call-convert-base, $expected, $case<description>
33
+ given $case {
34
+ if .<expected><error> {
35
+ throws-like {call-convert-base}, Exception, .<description>;
36
+ }
37
+ else {
38
+ cmp-ok call-convert-base, ‘~~’, |.<expected description>;
39
+ }
42
40
  }
43
-
44
- sub call-convert-base { convert-base(|$case<input_base input_digits output_base>) }
45
41
  }
46
42
 
47
43
  =head2 Canonical Data
@@ -49,24 +45,15 @@ for @($c-data<cases>) -> $case {
49
45
 
50
46
  {
51
47
  "exercise": "all-your-base",
52
- "version": "1.1.0",
48
+ "version": "2.0.1",
53
49
  "comments": [
54
- "It's up to each track do decide:",
50
+ "This canonical data makes the following choices:",
51
+ "1. Zero is always represented in outputs as [0] instead of [].",
52
+ "2. In no other instances are leading zeroes present in any outputs.",
53
+ "3. Leading zeroes are accepted in inputs.",
54
+ "4. An empty sequence of input digits is considered zero, rather than an error.",
55
55
  "",
56
- "1. What's the canonical representation of zero?",
57
- " - []?",
58
- " - [0]?",
59
- "",
60
- "2. What representations of zero are allowed?",
61
- " - []?",
62
- " - [0]?",
63
- " - [0,0]?",
64
- "",
65
- "3. Are leading zeroes allowed?",
66
- "",
67
- "4. How should invalid input be handled?",
68
- "",
69
- "All the undefined cases are marked as null.",
56
+ "Tracks that wish to make different decisions for these choices may translate appropriately.",
70
57
  "",
71
58
  "All your numeric-base are belong to [2..]. :)"
72
59
  ],
@@ -141,7 +128,7 @@ for @($c-data<cases>) -> $case {
141
128
  "input_base": 2,
142
129
  "input_digits": [],
143
130
  "output_base": 10,
144
- "expected": null
131
+ "expected": [0]
145
132
  },
146
133
  {
147
134
  "description": "single zero",
@@ -149,7 +136,7 @@ for @($c-data<cases>) -> $case {
149
136
  "input_base": 10,
150
137
  "input_digits": [0],
151
138
  "output_base": 2,
152
- "expected": null
139
+ "expected": [0]
153
140
  },
154
141
  {
155
142
  "description": "multiple zeros",
@@ -157,7 +144,7 @@ for @($c-data<cases>) -> $case {
157
144
  "input_base": 10,
158
145
  "input_digits": [0, 0, 0],
159
146
  "output_base": 2,
160
- "expected": null
147
+ "expected": [0]
161
148
  },
162
149
  {
163
150
  "description": "leading zeros",
@@ -165,31 +152,31 @@ for @($c-data<cases>) -> $case {
165
152
  "input_base": 7,
166
153
  "input_digits": [0, 6, 0],
167
154
  "output_base": 10,
168
- "expected": null
155
+ "expected": [4, 2]
169
156
  },
170
157
  {
171
- "description": "first base is one",
158
+ "description": "input base is one",
172
159
  "property": "rebase",
173
160
  "input_base": 1,
174
161
  "input_digits": [],
175
162
  "output_base": 10,
176
- "expected": null
163
+ "expected": {"error": "input base must be >= 2"}
177
164
  },
178
165
  {
179
- "description": "first base is zero",
166
+ "description": "input base is zero",
180
167
  "property": "rebase",
181
168
  "input_base": 0,
182
169
  "input_digits": [],
183
170
  "output_base": 10,
184
- "expected": null
171
+ "expected": {"error": "input base must be >= 2"}
185
172
  },
186
173
  {
187
- "description": "first base is negative",
174
+ "description": "input base is negative",
188
175
  "property": "rebase",
189
176
  "input_base": -2,
190
177
  "input_digits": [1],
191
178
  "output_base": 10,
192
- "expected": null
179
+ "expected": {"error": "input base must be >= 2"}
193
180
  },
194
181
  {
195
182
  "description": "negative digit",
@@ -197,7 +184,7 @@ for @($c-data<cases>) -> $case {
197
184
  "input_base": 2,
198
185
  "input_digits": [1, -1, 1, 0, 1, 0],
199
186
  "output_base": 10,
200
- "expected": null
187
+ "expected": {"error": "all digits must satisfy 0 <= d < input base"}
201
188
  },
202
189
  {
203
190
  "description": "invalid positive digit",
@@ -205,31 +192,31 @@ for @($c-data<cases>) -> $case {
205
192
  "input_base": 2,
206
193
  "input_digits": [1, 2, 1, 0, 1, 0],
207
194
  "output_base": 10,
208
- "expected": null
195
+ "expected": {"error": "all digits must satisfy 0 <= d < input base"}
209
196
  },
210
197
  {
211
- "description": "second base is one",
198
+ "description": "output base is one",
212
199
  "property": "rebase",
213
200
  "input_base": 2,
214
201
  "input_digits": [1, 0, 1, 0, 1, 0],
215
202
  "output_base": 1,
216
- "expected": null
203
+ "expected": {"error": "output base must be >= 2"}
217
204
  },
218
205
  {
219
- "description": "second base is zero",
206
+ "description": "output base is zero",
220
207
  "property": "rebase",
221
208
  "input_base": 10,
222
209
  "input_digits": [7],
223
210
  "output_base": 0,
224
- "expected": null
211
+ "expected": {"error": "output base must be >= 2"}
225
212
  },
226
213
  {
227
- "description": "second base is negative",
214
+ "description": "output base is negative",
228
215
  "property": "rebase",
229
216
  "input_base": 2,
230
217
  "input_digits": [1],
231
218
  "output_base": -7,
232
- "expected": null
219
+ "expected": {"error": "output base must be >= 2"}
233
220
  },
234
221
  {
235
222
  "description": "both bases are negative",
@@ -237,7 +224,7 @@ for @($c-data<cases>) -> $case {
237
224
  "input_base": -2,
238
225
  "input_digits": [1],
239
226
  "output_base": -7,
240
- "expected": null
227
+ "expected": {"error": "input base must be >= 2"}
241
228
  }
242
229
  ]
243
230
  }