trackler 2.2.1.43 → 2.2.1.44

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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/lens-person/description.md +1 -1
  4. data/problem-specifications/exercises/palindrome-products/description.md +5 -12
  5. data/problem-specifications/exercises/pascals-triangle/canonical-data.json +1 -7
  6. data/tracks/c/exercises/meetup/src/example.c +64 -60
  7. data/tracks/c/exercises/meetup/src/example.h +2 -2
  8. data/tracks/c/exercises/meetup/test/test_meetup.c +4 -4
  9. data/tracks/cfml/config.json +179 -169
  10. data/tracks/cfml/exercises/markdown/.meta/HINTS.md +0 -0
  11. data/tracks/cfml/exercises/markdown/Markdown.cfc +121 -0
  12. data/tracks/cfml/exercises/markdown/MarkdownTest.cfc +51 -0
  13. data/tracks/cfml/exercises/markdown/Solution.cfc +204 -0
  14. data/tracks/cfml/exercises/markdown/SolutionTest.cfc +7 -0
  15. data/tracks/cfml/exercises/markdown/TestRunner.cfc +103 -0
  16. data/tracks/cfml/exercises/markdown/box.json +8 -0
  17. data/tracks/cfml/exercises/markdown/index.cfm +37 -0
  18. data/tracks/csharp/exercises/dominoes/DominoesTest.cs +40 -45
  19. data/tracks/csharp/exercises/meetup/MeetupTest.cs +761 -83
  20. data/tracks/csharp/generators/Exercises/Dominoes.cs +33 -0
  21. data/tracks/csharp/generators/Exercises/Meetup.cs +46 -0
  22. data/tracks/csharp/generators/Output/FormattingExtensions.cs +11 -1
  23. data/tracks/csharp/generators/Output/TypesExtensions.cs +23 -0
  24. data/tracks/csharp/generators/Output/ValueFormatter.cs +70 -69
  25. data/tracks/dart/config.json +15 -3
  26. data/tracks/dart/exercises/word-count/README.md +18 -0
  27. data/tracks/dart/exercises/word-count/lib/example.dart +26 -0
  28. data/tracks/dart/exercises/word-count/lib/word_count.dart +3 -0
  29. data/tracks/dart/exercises/word-count/pubspec.lock +293 -0
  30. data/tracks/dart/exercises/word-count/pubspec.yaml +3 -0
  31. data/tracks/dart/exercises/word-count/test/word_count_test.dart +64 -0
  32. data/tracks/ecmascript/docs/INSTALLATION.md +4 -7
  33. data/tracks/elixir/exercises/hello-world/README.md +1 -26
  34. data/tracks/elixir/exercises/hello-world/example.exs +3 -7
  35. data/tracks/elixir/exercises/hello-world/hello_world.exs +3 -25
  36. data/tracks/elixir/exercises/hello-world/hello_world_test.exs +2 -13
  37. data/tracks/elixir/mix.lock +1 -1
  38. data/tracks/elm/config.json +11 -0
  39. data/tracks/elm/exercises/pascals-triangle/README.md +51 -0
  40. data/tracks/elm/exercises/pascals-triangle/Triangle.elm +1 -0
  41. data/tracks/elm/exercises/pascals-triangle/Triangle.example.elm +23 -0
  42. data/tracks/elm/exercises/pascals-triangle/elm-package.json +14 -0
  43. data/tracks/elm/exercises/pascals-triangle/package.json +14 -0
  44. data/tracks/elm/exercises/pascals-triangle/tests/Tests.elm +34 -0
  45. data/tracks/elm/exercises/pascals-triangle/tests/elm-package.json +16 -0
  46. data/tracks/fsharp/exercises/grade-school/GradeSchool.fs +2 -2
  47. data/tracks/fsharp/exercises/grade-school/GradeSchoolTest.fs +3 -2
  48. data/tracks/java/CONTRIBUTING.md +34 -0
  49. data/tracks/java/config.json +42 -6
  50. data/tracks/java/exercises/largest-series-product/src/main/java/LargestSeriesProductCalculator.java +7 -3
  51. data/tracks/java/exercises/matrix/src/main/java/Matrix.java +23 -0
  52. data/tracks/julia/config.json +11 -2
  53. data/tracks/julia/exercises/grains/README.md +33 -0
  54. data/tracks/julia/exercises/grains/example.jl +23 -0
  55. data/tracks/julia/exercises/grains/grains.jl +9 -0
  56. data/tracks/julia/exercises/grains/runtests.jl +27 -0
  57. data/tracks/lua/README.md +1 -1
  58. data/tracks/mips/exercises/octal/README.md +3 -8
  59. data/tracks/ocaml/exercises/palindrome-products/README.md +8 -14
  60. data/tracks/perl6/.travis.yml +7 -3
  61. data/tracks/perl6/bin/exercise-gen.pl6 +5 -1
  62. data/tracks/perl6/exercises/accumulate/README.md +0 -3
  63. data/tracks/perl6/exercises/accumulate/accumulate.t +9 -3
  64. data/tracks/perl6/exercises/all-your-base/README.md +1 -1
  65. data/tracks/perl6/exercises/all-your-base/all-your-base.t +23 -11
  66. data/tracks/perl6/exercises/all-your-base/example.yaml +1 -1
  67. data/tracks/perl6/exercises/allergies/README.md +0 -1
  68. data/tracks/perl6/exercises/allergies/allergies.t +22 -10
  69. data/tracks/perl6/exercises/anagram/anagram.t +22 -10
  70. data/tracks/perl6/exercises/atbash-cipher/README.md +2 -1
  71. data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +22 -10
  72. data/tracks/perl6/exercises/binary/README.md +2 -0
  73. data/tracks/perl6/exercises/bob/bob.t +24 -11
  74. data/tracks/perl6/exercises/bob/example.yaml +2 -2
  75. data/tracks/perl6/exercises/clock/clock.t +22 -10
  76. data/tracks/perl6/exercises/flatten-array/README.md +1 -2
  77. data/tracks/perl6/exercises/flatten-array/example.yaml +1 -1
  78. data/tracks/perl6/exercises/flatten-array/flatten-array.t +23 -11
  79. data/tracks/perl6/exercises/grade-school/README.md +0 -1
  80. data/tracks/perl6/exercises/grade-school/grade-school.t +9 -3
  81. data/tracks/perl6/exercises/grains/README.md +0 -1
  82. data/tracks/perl6/exercises/grains/grains.t +22 -10
  83. data/tracks/perl6/exercises/hello-world/example.yaml +3 -3
  84. data/tracks/perl6/exercises/hello-world/hello-world.t +25 -12
  85. data/tracks/perl6/exercises/leap/README.md +1 -1
  86. data/tracks/perl6/exercises/leap/example.yaml +1 -1
  87. data/tracks/perl6/exercises/leap/leap.t +23 -11
  88. data/tracks/perl6/exercises/linked-list/README.md +10 -10
  89. data/tracks/perl6/exercises/linked-list/linked-list.t +9 -3
  90. data/tracks/perl6/exercises/luhn/README.md +7 -7
  91. data/tracks/perl6/exercises/luhn/luhn.t +22 -10
  92. data/tracks/perl6/exercises/phone-number/README.md +3 -2
  93. data/tracks/perl6/exercises/phone-number/phone-number.t +22 -10
  94. data/tracks/perl6/exercises/raindrops/raindrops.t +22 -10
  95. data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +22 -10
  96. data/tracks/perl6/exercises/robot-name/robot-name.t +9 -3
  97. data/tracks/perl6/exercises/scrabble-score/README.md +3 -1
  98. data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +22 -10
  99. data/tracks/perl6/exercises/space-age/README.md +2 -1
  100. data/tracks/perl6/exercises/space-age/space-age.t +22 -10
  101. data/tracks/perl6/exercises/trinary/README.md +1 -1
  102. data/tracks/perl6/exercises/word-count/README.md +1 -2
  103. data/tracks/perl6/exercises/word-count/word-count.t +22 -10
  104. data/tracks/perl6/exercises/wordy/README.md +0 -5
  105. data/tracks/perl6/exercises/wordy/wordy.t +22 -10
  106. data/tracks/perl6/templates/test.mustache +26 -15
  107. data/tracks/python/config.json +10 -0
  108. data/tracks/python/exercises/book-store/book_store.py +1 -1
  109. data/tracks/python/exercises/flatten-array/flatten_array.py +1 -1
  110. data/tracks/python/exercises/matrix/matrix.py +1 -1
  111. data/tracks/python/exercises/palindrome-products/palindrome_products.py +2 -2
  112. data/tracks/python/exercises/perfect-numbers/perfect_numbers.py +2 -2
  113. data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet.py +3 -3
  114. data/tracks/python/exercises/raindrops/raindrops.py +1 -1
  115. data/tracks/python/exercises/scale-generator/scale_generator.py +1 -1
  116. data/tracks/python/exercises/sieve/sieve.py +1 -1
  117. data/tracks/python/exercises/sublist/sublist.py +1 -1
  118. data/tracks/python/exercises/transpose/transpose.py +1 -1
  119. data/tracks/python/exercises/triangle/triangle.py +4 -1
  120. data/tracks/python/exercises/two-bucket/example.py +59 -0
  121. data/tracks/python/exercises/two-bucket/two_bucket.py +2 -0
  122. data/tracks/python/exercises/two-bucket/two_bucket_test.py +32 -0
  123. data/tracks/scheme/config.json +59 -89
  124. data/tracks/scheme/config/maintainers.json +11 -11
  125. data/tracks/sml/exercises/allergies/README.md +20 -5
  126. data/tracks/sml/exercises/allergies/allergies.sml +11 -14
  127. data/tracks/sml/exercises/allergies/example.sml +9 -9
  128. data/tracks/sml/exercises/allergies/test.sml +65 -129
  129. data/tracks/sml/exercises/allergies/testlib.sml +159 -0
  130. data/tracks/sml/exercises/hamming/README.md +21 -5
  131. data/tracks/sml/exercises/hamming/example.sml +14 -10
  132. data/tracks/sml/exercises/hamming/hamming.sml +4 -3
  133. data/tracks/sml/exercises/hamming/test.sml +55 -64
  134. data/tracks/sml/exercises/hamming/testlib.sml +159 -0
  135. data/tracks/typescript/config.json +15 -0
  136. data/tracks/typescript/exercises/linked-list/linked-list.test.ts +11 -11
  137. data/tracks/typescript/exercises/nth-prime/README.md +36 -0
  138. data/tracks/typescript/exercises/nth-prime/nth-prime.example.ts +28 -0
  139. data/tracks/typescript/exercises/nth-prime/nth-prime.test.ts +25 -0
  140. data/tracks/typescript/exercises/nth-prime/nth-prime.ts +0 -0
  141. data/tracks/typescript/exercises/nth-prime/package.json +36 -0
  142. data/tracks/typescript/exercises/nth-prime/tsconfig.json +22 -0
  143. data/tracks/typescript/exercises/nth-prime/tslint.json +127 -0
  144. data/tracks/typescript/exercises/nth-prime/yarn.lock +2305 -0
  145. data/tracks/typescript/exercises/prime-factors/README.md +1 -1
  146. data/tracks/typescript/exercises/prime-factors/prime-factors.test.ts +11 -11
  147. data/tracks/typescript/exercises/series/README.md +1 -1
  148. data/tracks/typescript/exercises/series/series.test.ts +11 -11
  149. data/tracks/typescript/img/icon.png +0 -0
  150. data/tracks/typescript/img/icon.svg +3 -8
  151. metadata +44 -2
@@ -4,10 +4,12 @@ use Test;
4
4
  use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
- my $exercise = 'Grains';
8
- my $version = v1;
9
- my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
- plan 13;
7
+ my Str:D $exercise := 'Grains';
8
+ my Version:D $version = v1;
9
+ my Str $module //= $exercise;
10
+ INIT {
11
+ plan 13;
12
+ }
11
13
 
12
14
  use-ok $module or bail-out;
13
15
  require ::($module);
@@ -31,12 +33,6 @@ for @($c-data<cases>[0]<cases>) {
31
33
  }
32
34
  is total-grains, |$c-data<cases>[1]<expected description>;
33
35
 
34
- if %*ENV<EXERCISM> {
35
- if (my $c-data-file = "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f {
36
- is-deeply $c-data, EVAL('use JSON::Fast; from-json($c-data-file.slurp);'), 'canonical-data';
37
- } else { flunk 'canonical-data' }
38
- } else { skip }
39
-
40
36
  done-testing;
41
37
 
42
38
  INIT {
@@ -125,4 +121,20 @@ $c-data := from-json q:to/END/;
125
121
  }
126
122
 
127
123
  END
124
+
125
+ if %*ENV<EXERCISM> {
126
+ $module = 'Example';
127
+ if (my $c-data-file =
128
+ "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json"
129
+ .IO.resolve) ~~ :f
130
+ {
131
+ is-deeply $c-data, EVAL('from-json $c-data-file.slurp'), 'canonical-data';
132
+ }
133
+ else {
134
+ flunk 'canonical-data';
135
+ }
136
+ }
137
+ else {
138
+ skip;
139
+ }
128
140
  }
@@ -5,17 +5,17 @@ imports: '&hello'
5
5
  tests: |
6
6
  #`[Go through the cases (hiding at the bottom of this file)
7
7
  and check that &hello gives us the correct response.]
8
- is &::('hello')(), |.<expected description> for @($c-data<cases>);
8
+ is hello, |.<expected description> for @($c-data<cases>);
9
9
 
10
10
  exercise_comment: The name of this exercise.
11
- module_comment: "%*ENV<EXERCISM> is for tests not directly for the exercise, don't worry about these :)"
11
+ module_comment: The name of the module file to be loaded.
12
12
  version_comment: The version we will be matching against the exercise.
13
13
  lib_comment: Look for the module inside the same directory as this test file.
14
14
  plan_comment: This is how many tests we expect to run.
15
15
  use_test_comment: Check that the module can be use-d.
16
16
  version_test_comment: "If the exercise is updated, we want to make sure other people testing\nyour code don't think you've made a mistake if things have changed!"
17
17
  imports_comment: Import '&hello' from 'HelloWorld'
18
- cdata_test_comment: Ignore this for your exercise! Tells Exercism folks when exercise cases become out of date.
18
+ exercism_comment: "Don't worry about the stuff in here for your exercise.\nThis is for Exercism folks to check that everything is in order."
19
19
  done_testing_comment: There are no more tests after this :)
20
20
  INIT_comment: "'INIT' is a phaser, it makes sure that the test data is available before everything else\nstarts running (otherwise we'd have to shove the test data into the middle of the file!)"
21
21
 
@@ -4,10 +4,12 @@ use Test;
4
4
  use lib my $dir = $?FILE.IO.dirname; #`[Look for the module inside the same directory as this test file.]
5
5
  use JSON::Fast;
6
6
 
7
- my $exercise = 'HelloWorld'; #`[The name of this exercise.]
8
- my $version = v2; #`[The version we will be matching against the exercise.]
9
- my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise; #`[%*ENV<EXERCISM> is for tests not directly for the exercise, don't worry about these :)]
10
- plan 3; #`[This is how many tests we expect to run.]
7
+ my Str:D $exercise := 'HelloWorld'; #`[The name of this exercise.]
8
+ my Version:D $version = v2; #`[The version we will be matching against the exercise.]
9
+ my Str $module //= $exercise; #`[The name of the module file to be loaded.]
10
+ INIT {
11
+ plan 3; #`[This is how many tests we expect to run.]
12
+ }
11
13
 
12
14
  #`[Check that the module can be use-d.]
13
15
  use-ok $module or bail-out;
@@ -28,14 +30,7 @@ require ::($module) <&hello>;
28
30
  my $c-data;
29
31
  #`[Go through the cases (hiding at the bottom of this file)
30
32
  and check that &hello gives us the correct response.]
31
- is &::('hello')(), |.<expected description> for @($c-data<cases>);
32
-
33
- #`[Ignore this for your exercise! Tells Exercism folks when exercise cases become out of date.]
34
- if %*ENV<EXERCISM> {
35
- if (my $c-data-file = "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f {
36
- is-deeply $c-data, EVAL('use JSON::Fast; from-json($c-data-file.slurp);'), 'canonical-data';
37
- } else { flunk 'canonical-data' }
38
- } else { skip }
33
+ is hello, |.<expected description> for @($c-data<cases>);
39
34
 
40
35
  done-testing; #`[There are no more tests after this :)]
41
36
 
@@ -57,4 +52,22 @@ $c-data := from-json q:to/END/;
57
52
  }
58
53
 
59
54
  END
55
+
56
+ if %*ENV<EXERCISM> {
57
+ #`[Don't worry about the stuff in here for your exercise.
58
+ This is for Exercism folks to check that everything is in order.]
59
+ $module = 'Example';
60
+ if (my $c-data-file =
61
+ "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json"
62
+ .IO.resolve) ~~ :f
63
+ {
64
+ is-deeply $c-data, EVAL('from-json $c-data-file.slurp'), 'canonical-data';
65
+ }
66
+ else {
67
+ flunk 'canonical-data';
68
+ }
69
+ }
70
+ else {
71
+ skip;
72
+ }
60
73
  }
@@ -4,7 +4,7 @@ Given a year, report if it is a leap year.
4
4
 
5
5
  The tricky thing here is that a leap year in the Gregorian calendar occurs:
6
6
 
7
- ```plain
7
+ ```text
8
8
  on every year that is evenly divisible by 4
9
9
  except every year that is evenly divisible by 100
10
10
  unless the year is also evenly divisible by 400
@@ -3,7 +3,7 @@ version: 1
3
3
  plan: 6
4
4
  imports: '&is-leap-year'
5
5
  tests: |
6
- is &::('is-leap-year')(.<input>), |.<expected description> for @($c-data<cases>);
6
+ is is-leap-year(.<input>), |.<expected description> for @($c-data<cases>);
7
7
 
8
8
  unit: module
9
9
  example: |
@@ -4,10 +4,12 @@ use Test;
4
4
  use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
- my $exercise = 'Leap';
8
- my $version = v1;
9
- my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
- plan 6;
7
+ my Str:D $exercise := 'Leap';
8
+ my Version:D $version = v1;
9
+ my Str $module //= $exercise;
10
+ INIT {
11
+ plan 6;
12
+ }
11
13
 
12
14
  use-ok $module or bail-out;
13
15
  require ::($module);
@@ -22,13 +24,7 @@ if ::($exercise).^ver !~~ $version {
22
24
  require ::($module) <&is-leap-year>;
23
25
 
24
26
  my $c-data;
25
- is &::('is-leap-year')(.<input>), |.<expected description> for @($c-data<cases>);
26
-
27
- if %*ENV<EXERCISM> {
28
- if (my $c-data-file = "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f {
29
- is-deeply $c-data, EVAL('use JSON::Fast; from-json($c-data-file.slurp);'), 'canonical-data';
30
- } else { flunk 'canonical-data' }
31
- } else { skip }
27
+ is is-leap-year(.<input>), |.<expected description> for @($c-data<cases>);
32
28
 
33
29
  done-testing;
34
30
 
@@ -67,4 +63,20 @@ $c-data := from-json q:to/END/;
67
63
  }
68
64
 
69
65
  END
66
+
67
+ if %*ENV<EXERCISM> {
68
+ $module = 'Example';
69
+ if (my $c-data-file =
70
+ "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json"
71
+ .IO.resolve) ~~ :f
72
+ {
73
+ is-deeply $c-data, EVAL('from-json $c-data-file.slurp'), 'canonical-data';
74
+ }
75
+ else {
76
+ flunk 'canonical-data';
77
+ }
78
+ }
79
+ else {
80
+ skip;
81
+ }
70
82
  }
@@ -2,18 +2,18 @@
2
2
 
3
3
  Implement a doubly linked list.
4
4
 
5
- Like an array, a linked list is a simple linear data structure. Several
6
- common data types can be implemented using linked lists, like queues,
5
+ Like an array, a linked list is a simple linear data structure. Several
6
+ common data types can be implemented using linked lists, like queues,
7
7
  stacks, and associative arrays.
8
8
 
9
- A linked list is a collection of data elements called *nodes*. In a
10
- *singly linked list* each node holds a value and a link to the next node.
11
- In a *doubly linked list* each node also holds a link to the previous
9
+ A linked list is a collection of data elements called *nodes*. In a
10
+ *singly linked list* each node holds a value and a link to the next node.
11
+ In a *doubly linked list* each node also holds a link to the previous
12
12
  node.
13
13
 
14
- You will write an implementation of a doubly linked list. Implement a
15
- Node to hold a value and pointers to the next and previous nodes. Then
16
- implement a List which holds references to the first and last node and
14
+ You will write an implementation of a doubly linked list. Implement a
15
+ Node to hold a value and pointers to the next and previous nodes. Then
16
+ implement a List which holds references to the first and last node and
17
17
  offers an array-like interface for adding and removing items:
18
18
 
19
19
  * `push` (*insert value at back*);
@@ -21,8 +21,8 @@ offers an array-like interface for adding and removing items:
21
21
  * `shift` (*remove value at front*).
22
22
  * `unshift` (*insert value at front*);
23
23
 
24
- To keep your implementation simple, the tests will not cover error
25
- conditions. Specifically: `pop` or `shift` will never be called on an
24
+ To keep your implementation simple, the tests will not cover error
25
+ conditions. Specifically: `pop` or `shift` will never be called on an
26
26
  empty list.
27
27
 
28
28
  If you want to know more about linked lists, check [Wikipedia](https://en.wikipedia.org/wiki/Linked_list).
@@ -4,9 +4,9 @@ use Test;
4
4
  use lib $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
- my $exercise = 'LinkedList';
8
- my $version = v1;
9
- my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
7
+ my Str:D $exercise := 'LinkedList';
8
+ my Version:D $version = v1;
9
+ my Str $module //= $exercise;
10
10
  plan 7;
11
11
 
12
12
  use-ok $module or bail-out;
@@ -99,3 +99,9 @@ INIT {
99
99
  ]
100
100
 
101
101
  }
102
+
103
+ INIT {
104
+ if %*ENV<EXERCISM> {
105
+ $module = 'Example';
106
+ }
107
+ }
@@ -18,27 +18,27 @@ are disallowed.
18
18
 
19
19
  ## Example 1: valid credit card number
20
20
 
21
- ```
21
+ ```text
22
22
  4539 1488 0343 6467
23
23
  ```
24
24
 
25
25
  The first step of the Luhn algorithm is to double every second digit,
26
26
  starting from the right. We will be doubling
27
27
 
28
- ```
28
+ ```text
29
29
  4_3_ 1_8_ 0_4_ 6_6_
30
30
  ```
31
31
 
32
32
  If doubling the number results in a number greater than 9 then subtract 9
33
33
  from the product. The results of our doubling:
34
34
 
35
- ```
35
+ ```text
36
36
  8569 2478 0383 3437
37
37
  ```
38
38
 
39
39
  Then sum all of the digits:
40
40
 
41
- ```
41
+ ```text
42
42
  8+5+6+9+2+4+7+8+0+3+8+3+3+4+3+7 = 80
43
43
  ```
44
44
 
@@ -46,19 +46,19 @@ If the sum is evenly divisible by 10, then the number is valid. This number is v
46
46
 
47
47
  ## Example 2: invalid credit card number
48
48
 
49
- ```
49
+ ```text
50
50
  8273 1232 7352 0569
51
51
  ```
52
52
 
53
53
  Double the second digits, starting from the right
54
54
 
55
- ```
55
+ ```text
56
56
  7253 2262 5312 0539
57
57
  ```
58
58
 
59
59
  Sum the digits
60
60
 
61
- ```
61
+ ```text
62
62
  7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57
63
63
  ```
64
64
 
@@ -4,10 +4,12 @@ use Test;
4
4
  use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
- my $exercise = 'Luhn';
8
- my $version = v1;
9
- my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
- plan 15;
7
+ my Str:D $exercise := 'Luhn';
8
+ my Version:D $version = v1;
9
+ my Str $module //= $exercise;
10
+ INIT {
11
+ plan 15;
12
+ }
11
13
 
12
14
  use-ok $module or bail-out;
13
15
  require ::($module);
@@ -24,12 +26,6 @@ require ::($module) <&is-luhn-valid>;
24
26
  my $c-data;
25
27
  is .<input>.&is-luhn-valid, |.<expected description> for @($c-data<cases>);
26
28
 
27
- if %*ENV<EXERCISM> {
28
- if (my $c-data-file = "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f {
29
- is-deeply $c-data, EVAL('use JSON::Fast; from-json($c-data-file.slurp);'), 'canonical-data';
30
- } else { flunk 'canonical-data' }
31
- } else { skip }
32
-
33
29
  done-testing;
34
30
 
35
31
  INIT {
@@ -121,4 +117,20 @@ $c-data := from-json q:to/END/;
121
117
  }
122
118
 
123
119
  END
120
+
121
+ if %*ENV<EXERCISM> {
122
+ $module = 'Example';
123
+ if (my $c-data-file =
124
+ "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json"
125
+ .IO.resolve) ~~ :f
126
+ {
127
+ is-deeply $c-data, EVAL('from-json $c-data-file.slurp'), 'canonical-data';
128
+ }
129
+ else {
130
+ flunk 'canonical-data';
131
+ }
132
+ }
133
+ else {
134
+ skip;
135
+ }
124
136
  }
@@ -6,11 +6,12 @@ The **North American Numbering Plan (NANP)** is a telephone numbering system use
6
6
 
7
7
  NANP numbers are ten-digit numbers consisting of a three-digit Numbering Plan Area code, commonly known as *area code*, followed by a seven-digit local number. The first three digits of the local number represent the *exchange code*, followed by the unique four-digit number which is the *subscriber number*.
8
8
 
9
-
10
9
  The format is usually represented as
11
- ```
10
+
11
+ ```text
12
12
  (NXX)-NXX-XXXX
13
13
  ```
14
+
14
15
  where `N` is any digit from 2 through 9 and `X` is any digit from 0 through 9.
15
16
 
16
17
  Your task is to clean up differently formated telephone numbers by removing punctuation and the country code (1) if present.
@@ -4,10 +4,12 @@ use Test;
4
4
  use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
- my $exercise = 'Phone';
8
- my $version = v3;
9
- my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
- plan 14;
7
+ my Str:D $exercise := 'Phone';
8
+ my Version:D $version = v3;
9
+ my Str $module //= $exercise;
10
+ INIT {
11
+ plan 14;
12
+ }
11
13
 
12
14
  use-ok $module or bail-out;
13
15
  require ::($module);
@@ -30,12 +32,6 @@ for @($c-data<cases>[0]<cases>) {
30
32
  }
31
33
  }
32
34
 
33
- if %*ENV<EXERCISM> {
34
- if (my $c-data-file = "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f {
35
- is-deeply $c-data, EVAL('use JSON::Fast; from-json($c-data-file.slurp);'), 'canonical-data';
36
- } else { flunk 'canonical-data' }
37
- } else { skip }
38
-
39
35
  done-testing;
40
36
 
41
37
  INIT {
@@ -131,4 +127,20 @@ $c-data := from-json q:to/END/;
131
127
  }
132
128
 
133
129
  END
130
+
131
+ if %*ENV<EXERCISM> {
132
+ $module = 'Example';
133
+ if (my $c-data-file =
134
+ "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json"
135
+ .IO.resolve) ~~ :f
136
+ {
137
+ is-deeply $c-data, EVAL('from-json $c-data-file.slurp'), 'canonical-data';
138
+ }
139
+ else {
140
+ flunk 'canonical-data';
141
+ }
142
+ }
143
+ else {
144
+ skip;
145
+ }
134
146
  }
@@ -4,10 +4,12 @@ use Test;
4
4
  use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
- my $exercise = 'Raindrops';
8
- my $version = v1;
9
- my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
- plan 20;
7
+ my Str:D $exercise := 'Raindrops';
8
+ my Version:D $version = v1;
9
+ my Str $module //= $exercise;
10
+ INIT {
11
+ plan 20;
12
+ }
11
13
 
12
14
  use-ok $module or bail-out;
13
15
  require ::($module);
@@ -30,12 +32,6 @@ for @($c-data<cases>) {
30
32
  }
31
33
  }
32
34
 
33
- if %*ENV<EXERCISM> {
34
- if (my $c-data-file = "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f {
35
- is-deeply $c-data, EVAL('use JSON::Fast; from-json($c-data-file.slurp);'), 'canonical-data';
36
- } else { flunk 'canonical-data' }
37
- } else { skip }
38
-
39
35
  done-testing;
40
36
 
41
37
  INIT {
@@ -157,4 +153,20 @@ $c-data := from-json q:to/END/;
157
153
  }
158
154
 
159
155
  END
156
+
157
+ if %*ENV<EXERCISM> {
158
+ $module = 'Example';
159
+ if (my $c-data-file =
160
+ "$dir/../../problem-specifications/exercises/{$dir.IO.resolve.basename}/canonical-data.json"
161
+ .IO.resolve) ~~ :f
162
+ {
163
+ is-deeply $c-data, EVAL('from-json $c-data-file.slurp'), 'canonical-data';
164
+ }
165
+ else {
166
+ flunk 'canonical-data';
167
+ }
168
+ }
169
+ else {
170
+ skip;
171
+ }
160
172
  }