trackler 2.0.8.20 → 2.0.8.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/csharp/.travis.yml +1 -4
- data/tracks/csharp/exercises/accumulate/HINTS.md +3 -0
- data/tracks/csharp/exercises/allergies/HINTS.md +3 -0
- data/tracks/csharp/exercises/alphametics/HINTS.md +5 -0
- data/tracks/csharp/exercises/bank-account/HINTS.md +3 -0
- data/tracks/csharp/exercises/beer-song/HINTS.md +2 -0
- data/tracks/csharp/exercises/clock/HINTS.md +4 -0
- data/tracks/csharp/exercises/custom-set/HINTS.md +4 -0
- data/tracks/csharp/exercises/difference-of-squares/HINTS.md +4 -0
- data/tracks/csharp/exercises/diffie-hellman/HINTS.md +3 -0
- data/tracks/csharp/exercises/food-chain/HINTS.md +2 -0
- data/tracks/csharp/exercises/forth/HINTS.md +2 -0
- data/tracks/csharp/exercises/hangman/HINTS.md +3 -0
- data/tracks/csharp/exercises/leap/Example.cs +2 -2
- data/tracks/csharp/exercises/leap/Leap.cs +2 -2
- data/tracks/csharp/exercises/leap/LeapTest.cs +4 -4
- data/tracks/csharp/exercises/sgf-parsing/HINTS.md +2 -0
- data/tracks/csharp/exercises/simple-linked-list/HINTS.md +3 -0
- data/tracks/csharp/exercises/sublist/HINTS.md +3 -0
- data/tracks/csharp/exercises/twelve-days/HINTS.md +2 -0
- data/tracks/csharp/exercises/variable-length-quantity/HINTS.md +3 -0
- data/tracks/csharp/exercises/wordy/HINTS.md +2 -0
- data/tracks/csharp/generators/BooleanTestMethod.cs +36 -0
- data/tracks/csharp/generators/Exercises/Exercise.cs +13 -2
- data/tracks/csharp/generators/Exercises/LeapExercise.cs +3 -26
- data/tracks/csharp/generators/Program.cs +7 -8
- data/tracks/csharp/generators/TestClassNameTransformer.cs +9 -0
- data/tracks/csharp/generators/TestClassRenderer.cs +1 -1
- data/tracks/csharp/generators/TestedClassNameTransformer.cs +11 -0
- data/tracks/csharp/generators/TestedMethodNameTransformer.cs +9 -0
- data/tracks/csharp/generators/To.cs +3 -0
- data/tracks/elixir/config.json +8 -0
- data/tracks/elixir/exercises/ocr-numbers/example.exs +47 -0
- data/tracks/elixir/exercises/ocr-numbers/ocr_numbers.exs +10 -0
- data/tracks/elixir/exercises/ocr-numbers/ocr_numbers_test.exs +254 -0
- data/tracks/go/exercises/say/example.go +2 -0
- data/tracks/go/exercises/say/say_test.go +8 -0
- data/tracks/go/exercises/scrabble-score/scrabble_score_test.go +6 -4
- data/tracks/go/exercises/secret-handshake/secret_handshake_test.go +4 -1
- data/tracks/go/exercises/sieve/example.go +2 -0
- data/tracks/go/exercises/sieve/sieve_test.go +8 -0
- data/tracks/go/exercises/simple-cipher/example.go +3 -1
- data/tracks/go/exercises/simple-cipher/simple_cipher_test.go +8 -0
- data/tracks/go/exercises/sum-of-multiples/example.go +2 -0
- data/tracks/go/exercises/sum-of-multiples/sum_of_multiples_test.go +8 -0
- data/tracks/go/exercises/tournament/tournament_test.go +3 -1
- data/tracks/go/exercises/transpose/example.go +2 -0
- data/tracks/go/exercises/transpose/transpose_test.go +8 -0
- data/tracks/go/exercises/tree-building/tree_test.go +6 -6
- data/tracks/go/exercises/triangle/triangle_test.go +6 -6
- data/tracks/haskell/exercises/atbash-cipher/src/Atbash.hs +2 -2
- data/tracks/haskell/exercises/largest-series-product/src/Series.hs +1 -1
- data/tracks/haskell/exercises/linked-list/src/Deque.hs +4 -4
- data/tracks/haskell/exercises/list-ops/src/ListOps.hs +7 -7
- data/tracks/haskell/exercises/luhn/src/Luhn.hs +10 -5
- data/tracks/haskell/exercises/matrix/src/Matrix.hs +10 -10
- data/tracks/haskell/exercises/minesweeper/src/Minesweeper.hs +1 -1
- data/tracks/haskell/exercises/nth-prime/src/Prime.hs +2 -1
- data/tracks/haskell/exercises/nucleotide-count/src/DNA.hs +1 -1
- data/tracks/haskell/exercises/ocr-numbers/src/OCR.hs +1 -1
- data/tracks/haskell/exercises/pascals-triangle/src/Triangle.hs +1 -1
- data/tracks/haskell/exercises/phone-number/src/Phone.hs +1 -1
- data/tracks/haskell/exercises/pig-latin/src/PigLatin.hs +1 -1
- data/tracks/haskell/exercises/prime-factors/src/PrimeFactors.hs +1 -1
- data/tracks/kotlin/exercises/_template/build.gradle +1 -1
- data/tracks/kotlin/exercises/accumulate/build.gradle +1 -1
- data/tracks/kotlin/exercises/acronym/build.gradle +1 -1
- data/tracks/kotlin/exercises/allergies/build.gradle +1 -1
- data/tracks/kotlin/exercises/anagram/build.gradle +1 -1
- data/tracks/kotlin/exercises/atbash-cipher/build.gradle +1 -1
- data/tracks/kotlin/exercises/beer-song/build.gradle +1 -1
- data/tracks/kotlin/exercises/binary/build.gradle +1 -1
- data/tracks/kotlin/exercises/binary-search/build.gradle +1 -1
- data/tracks/kotlin/exercises/bob/build.gradle +1 -1
- data/tracks/kotlin/exercises/bracket-push/build.gradle +1 -1
- data/tracks/kotlin/exercises/change/build.gradle +1 -1
- data/tracks/kotlin/exercises/difference-of-squares/build.gradle +1 -1
- data/tracks/kotlin/exercises/etl/build.gradle +1 -1
- data/tracks/kotlin/exercises/flatten-array/build.gradle +1 -1
- data/tracks/kotlin/exercises/gigasecond/build.gradle +1 -1
- data/tracks/kotlin/exercises/grade-school/build.gradle +1 -1
- data/tracks/kotlin/exercises/hamming/build.gradle +1 -1
- data/tracks/kotlin/exercises/hello-world/build.gradle +1 -1
- data/tracks/kotlin/exercises/hexadecimal/build.gradle +1 -1
- data/tracks/kotlin/exercises/isogram/build.gradle +1 -1
- data/tracks/kotlin/exercises/largest-series-product/build.gradle +1 -1
- data/tracks/kotlin/exercises/leap/build.gradle +1 -1
- data/tracks/kotlin/exercises/linked-list/build.gradle +1 -1
- data/tracks/kotlin/exercises/luhn/build.gradle +1 -1
- data/tracks/kotlin/exercises/nth-prime/build.gradle +1 -1
- data/tracks/kotlin/exercises/nucleotide-count/build.gradle +1 -1
- data/tracks/kotlin/exercises/pangram/build.gradle +1 -1
- data/tracks/kotlin/exercises/pascals-triangle/build.gradle +1 -1
- data/tracks/kotlin/exercises/perfect-numbers/build.gradle +1 -1
- data/tracks/kotlin/exercises/phone-number/build.gradle +1 -1
- data/tracks/kotlin/exercises/pig-latin/build.gradle +1 -1
- data/tracks/kotlin/exercises/raindrops/build.gradle +1 -1
- data/tracks/kotlin/exercises/react/build.gradle +1 -1
- data/tracks/kotlin/exercises/react/src/test/kotlin/ReactTest.kt +9 -9
- data/tracks/kotlin/exercises/rna-transcription/build.gradle +1 -1
- data/tracks/kotlin/exercises/robot-name/build.gradle +1 -1
- data/tracks/kotlin/exercises/roman-numerals/build.gradle +1 -1
- data/tracks/kotlin/exercises/scrabble-score/build.gradle +1 -1
- data/tracks/kotlin/exercises/series/build.gradle +1 -1
- data/tracks/kotlin/exercises/sieve/build.gradle +1 -1
- data/tracks/kotlin/exercises/simple-cipher/build.gradle +1 -1
- data/tracks/kotlin/exercises/space-age/build.gradle +1 -1
- data/tracks/kotlin/exercises/strain/build.gradle +1 -1
- data/tracks/kotlin/exercises/triangle/build.gradle +1 -1
- data/tracks/kotlin/exercises/word-count/build.gradle +1 -1
- data/tracks/perl6/.gitmodules +3 -0
- data/tracks/perl6/.travis.yml +1 -0
- data/tracks/perl6/config.json +8 -11
- data/tracks/perl6/exercises/accumulate/Accumulate.pm6 +1 -0
- data/tracks/perl6/exercises/accumulate/Example.pm +8 -8
- data/tracks/perl6/exercises/accumulate/accumulate.t +27 -12
- data/tracks/perl6/exercises/all-your-base/AllYourBase.pm6 +1 -0
- data/tracks/perl6/exercises/all-your-base/Example.pm +46 -0
- data/tracks/perl6/exercises/all-your-base/all-your-base.t +163 -0
- data/tracks/perl6/exercises/bob/Bob.pm6 +13 -0
- data/tracks/perl6/exercises/bob/Example.pm +9 -9
- data/tracks/perl6/exercises/bob/bob.t +201 -34
- data/tracks/perl6/exercises/grade-school/Example.pm +13 -12
- data/tracks/perl6/exercises/grade-school/GradeSchool.pm6 +4 -0
- data/tracks/perl6/exercises/grade-school/grade-school.t +38 -19
- data/tracks/perl6/exercises/hello-world/Example.pm +3 -3
- data/tracks/perl6/exercises/hello-world/HelloWorld.pm6 +2 -2
- data/tracks/perl6/exercises/hello-world/hello-world.t +41 -10
- data/tracks/perl6/exercises/linked-list/Example.pm6 +33 -34
- data/tracks/perl6/exercises/linked-list/LinkedList.pm6 +1 -0
- data/tracks/perl6/exercises/linked-list/linked-list.t +32 -22
- data/tracks/perl6/exercises/robot-name/Example.pm +8 -15
- data/tracks/perl6/exercises/robot-name/Robot.pm6 +1 -0
- data/tracks/perl6/exercises/robot-name/robot-name.t +39 -14
- data/tracks/php/config.json +5 -0
- data/tracks/php/exercises/luhn/example.php +26 -0
- data/tracks/php/exercises/luhn/luhn_test.php +95 -0
- data/tracks/purescript/README.md +67 -4
- data/tracks/python/docs/LEARNING.md +1 -0
- data/tracks/python/exercises/acronym/acronym_test.py +5 -1
- data/tracks/python/exercises/atbash-cipher/atbash_cipher_test.py +8 -0
- data/tracks/python/exercises/hello-world/hello_world_test.py +4 -38
- data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +30 -15
- metadata +38 -2
|
@@ -1,51 +1,50 @@
|
|
|
1
|
+
unit class LinkedList:ver<1>;
|
|
2
|
+
|
|
1
3
|
class ListNode {
|
|
2
4
|
has $.next is rw;
|
|
3
5
|
has $.previous is rw;
|
|
4
6
|
has $.value;
|
|
5
7
|
}
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
has $!last;
|
|
10
|
-
|
|
11
|
-
method push($value) {
|
|
12
|
-
my $next = ListNode.new( value => $value, previous => $!last );
|
|
13
|
-
if ( $!last ) {
|
|
14
|
-
$!last = $!last.next= $next ;
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
$!first = $!last = $next;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
9
|
+
has $!first;
|
|
10
|
+
has $!last;
|
|
20
11
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
12
|
+
method push-list($value) {
|
|
13
|
+
my $next = ListNode.new( value => $value, previous => $!last );
|
|
14
|
+
if ( $!last ) {
|
|
15
|
+
$!last = $!last.next= $next ;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
$!first = $!last = $next;
|
|
29
19
|
}
|
|
20
|
+
}
|
|
30
21
|
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
method unshift-list($value) {
|
|
23
|
+
my $next = ListNode.new( value => $value, next => $!first );
|
|
24
|
+
if ( $!first ) {
|
|
25
|
+
$!first = $!first.previous = $next ;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
$!first = $!last = $next;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
method shift-list() {
|
|
33
|
+
my $f = $!first;
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
$!first = $!first.next;
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
}
|
|
37
|
+
unless $!first { $!last = $!first }
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
return $f.value;
|
|
40
|
+
}
|
|
43
41
|
|
|
44
|
-
|
|
42
|
+
method pop-list() {
|
|
43
|
+
my $f = $!last;
|
|
45
44
|
|
|
46
|
-
|
|
45
|
+
$!last = $!last.previous;
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
};
|
|
47
|
+
unless $!.last { $!first = $!last }
|
|
51
48
|
|
|
49
|
+
return $f.value;
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
unit class LinkedList:ver<1>;
|
|
@@ -1,35 +1,45 @@
|
|
|
1
1
|
#!/usr/bin/env perl6
|
|
2
|
-
|
|
2
|
+
use v6;
|
|
3
3
|
use Test;
|
|
4
|
+
use lib $?FILE.IO.dirname;
|
|
4
5
|
use JSON::Tiny;
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
my $module = %*ENV<EXERCISM> ?? 'Example' !!
|
|
9
|
-
|
|
7
|
+
my $exercise = 'LinkedList';
|
|
8
|
+
my $version = v1;
|
|
9
|
+
my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
|
|
10
|
+
plan 7;
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
use-ok $module or bail-out;
|
|
13
|
+
require ::($module);
|
|
14
|
+
if ::($exercise).^ver !~~ $version {
|
|
15
|
+
warn "\nExercise version mismatch. Further tests may fail!"
|
|
16
|
+
~ "\n$exercise is $(::($exercise).^ver.gist). "
|
|
17
|
+
~ "Test is $($version.gist).\n";
|
|
18
|
+
bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
|
|
19
|
+
}
|
|
12
20
|
|
|
13
|
-
|
|
21
|
+
subtest "Class method(s)", {
|
|
22
|
+
plan 4;
|
|
23
|
+
ok ::($exercise).can($_), $_ for <push-list pop-list shift-list unshift-list>;
|
|
24
|
+
}
|
|
14
25
|
|
|
15
|
-
for @cases -> $
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
}
|
|
26
|
+
for my @cases -> $case {
|
|
27
|
+
subtest $case.<name>, sub {
|
|
28
|
+
my $linkedlist = ::($exercise).new;
|
|
29
|
+
for |$case.<set> -> %set {
|
|
30
|
+
for %set {
|
|
31
|
+
my $value = $_.value;
|
|
32
|
+
given $_.key {
|
|
33
|
+
when 'push' { $linkedlist.?push-list( $value ) }
|
|
34
|
+
when 'unshift' { $linkedlist.?unshift-list( $value ) }
|
|
35
|
+
when 'pop' { is $linkedlist.?pop-list, $value, 'pop' }
|
|
36
|
+
when 'shift' { is $linkedlist.?shift-list, $value, 'shift' }
|
|
28
37
|
}
|
|
29
|
-
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
30
41
|
}
|
|
31
42
|
|
|
32
|
-
|
|
33
43
|
done-testing;
|
|
34
44
|
|
|
35
45
|
INIT {
|
|
@@ -1,19 +1,12 @@
|
|
|
1
|
-
class Robot
|
|
2
|
-
has $.name is rw = self.reset_name;
|
|
1
|
+
unit class Robot:ver<1>;
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
['A'..'Z'].pick;
|
|
6
|
-
}
|
|
3
|
+
state %record;
|
|
7
4
|
|
|
8
|
-
|
|
9
|
-
100 + 900.rand.truncate;
|
|
10
|
-
}
|
|
5
|
+
has Str:D $.name = self.reset-name;
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
self.name = self.new_name;
|
|
18
|
-
}
|
|
7
|
+
method reset-name {
|
|
8
|
+
$!name = ('AA'..'ZZ').roll ~ ('000'..'999').roll;
|
|
9
|
+
self.reset-name if %record{$!name}:exists;
|
|
10
|
+
%record{$!name} = True;
|
|
11
|
+
return $!name;
|
|
19
12
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
unit class Robot:ver<1>;
|
|
@@ -1,23 +1,48 @@
|
|
|
1
1
|
#!/usr/bin/env perl6
|
|
2
2
|
use v6;
|
|
3
3
|
use Test;
|
|
4
|
-
use lib
|
|
4
|
+
use lib $?FILE.IO.dirname;
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
my $
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
my $exercise = 'Robot';
|
|
7
|
+
my $version = v1;
|
|
8
|
+
my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
|
|
9
|
+
plan 8;
|
|
10
10
|
|
|
11
|
-
ok
|
|
12
|
-
|
|
11
|
+
use-ok $module or bail-out;
|
|
12
|
+
require ::($module);
|
|
13
|
+
if ::($exercise).^ver !~~ $version {
|
|
14
|
+
warn "\nExercise version mismatch. Further tests may fail!"
|
|
15
|
+
~ "\n$exercise is $(::($exercise).^ver.gist). "
|
|
16
|
+
~ "Test is $($version.gist).\n";
|
|
17
|
+
bail-out 'Example must match test.' if %*ENV<EXERCISM>;
|
|
18
|
+
}
|
|
13
19
|
|
|
14
|
-
|
|
15
|
-
|
|
20
|
+
subtest 'Class method(s)', {
|
|
21
|
+
plan 2;
|
|
22
|
+
ok ::($exercise).can($_), $_ for <name reset-name>;
|
|
23
|
+
}
|
|
16
24
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
srand 1;
|
|
26
|
+
my $robot = ::($exercise).?new;
|
|
27
|
+
my Str $name = $robot.?name;
|
|
20
28
|
|
|
21
|
-
$
|
|
29
|
+
like $name, /^^<[A..Z]>**2 <[0..9]>**3$$/, 'Name matches schema';
|
|
30
|
+
srand 2;
|
|
31
|
+
is $robot.?name, $name, 'Name is persistent';
|
|
22
32
|
|
|
23
|
-
|
|
33
|
+
srand 1;
|
|
34
|
+
isnt ::($exercise).new.?name, $name, 'New Robot cannot claim previous Robot name';
|
|
35
|
+
|
|
36
|
+
srand 1;
|
|
37
|
+
$robot.?reset-name;
|
|
38
|
+
$robot.?reset_name; # Allows next test to still pass for older solutions
|
|
39
|
+
isnt $robot.?name, $name, "'reset-name' cannot use previous Robot name";
|
|
40
|
+
|
|
41
|
+
diag "\nCreating 100 robots...";
|
|
42
|
+
push my @names, ::($exercise).new.name for 1..100;
|
|
43
|
+
is @names, @names.unique, 'All names are unique';
|
|
44
|
+
subtest 'Randomness', {
|
|
45
|
+
plan 2;
|
|
46
|
+
isnt @names, @names.sort, 'Names not ordered';
|
|
47
|
+
isnt @names, @names.sort.reverse, 'Names not reverse ordered';
|
|
48
|
+
}
|
data/tracks/php/config.json
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
function isValid($candidate)
|
|
4
|
+
{
|
|
5
|
+
$sanitizedCandidate = str_replace(" ", "", $candidate) ;
|
|
6
|
+
|
|
7
|
+
if (strlen($sanitizedCandidate) <= 1 || !ctype_digit($sanitizedCandidate)) {
|
|
8
|
+
return false ;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
$reversseCandidate = strrev($sanitizedCandidate) ;
|
|
12
|
+
$sum = 0 ;
|
|
13
|
+
|
|
14
|
+
for ($i = 1; $i < strlen($reversseCandidate); $i+=2) {
|
|
15
|
+
$digit = 2 * intval($reversseCandidate{$i}) ;
|
|
16
|
+
|
|
17
|
+
if ($digit > 9) {
|
|
18
|
+
$digit -= 9 ;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
$sum += $digit ;
|
|
22
|
+
$sum += intval($reversseCandidate{$i-1}) ;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return $sum % 10 == 0 ;
|
|
26
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
require "luhn.php";
|
|
4
|
+
|
|
5
|
+
class LuhnValidatorTest extends PHPUnit\Framework\TestCase
|
|
6
|
+
{
|
|
7
|
+
public function testSingleDigitInvalid()
|
|
8
|
+
{
|
|
9
|
+
$this->assertFalse(isValid("1"));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public function testSingleZeroInvalid()
|
|
13
|
+
{
|
|
14
|
+
$this->markTestSkipped();
|
|
15
|
+
|
|
16
|
+
$this->assertFalse(isValid("0"));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public function testSimpleValidNumber()
|
|
20
|
+
{
|
|
21
|
+
$this->markTestSkipped();
|
|
22
|
+
|
|
23
|
+
$this->assertTrue(isValid("59"));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public function testSpaceHandling()
|
|
27
|
+
{
|
|
28
|
+
$this->markTestSkipped();
|
|
29
|
+
|
|
30
|
+
$this->assertTrue(isValid(" 5 9 "));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public function testValidCanadianSocialInsuranceNumber()
|
|
34
|
+
{
|
|
35
|
+
$this->markTestSkipped();
|
|
36
|
+
|
|
37
|
+
$this->assertTrue(isValid("046 454 286"));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public function testInvalidCanadianSocialInsuranceNumber()
|
|
41
|
+
{
|
|
42
|
+
$this->markTestSkipped();
|
|
43
|
+
|
|
44
|
+
$this->assertFalse(isValid("046 454 287"));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public function testInvalidCreditCard()
|
|
48
|
+
{
|
|
49
|
+
$this->markTestSkipped();
|
|
50
|
+
|
|
51
|
+
$this->assertFalse(isValid("8273 1232 7352 0569"));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public function testNonDigitCharacterInValidStringInvalidatesTheString()
|
|
55
|
+
{
|
|
56
|
+
$this->markTestSkipped();
|
|
57
|
+
|
|
58
|
+
$this->assertFalse(isValid("046a 454 286"));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public function testThatStringContainingSymbolsIsInvalid()
|
|
62
|
+
{
|
|
63
|
+
$this->markTestSkipped();
|
|
64
|
+
|
|
65
|
+
$this->assertFalse(isValid("055£ 444$ 285"));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public function testThatStringContainingPunctuationIsInvalid()
|
|
69
|
+
{
|
|
70
|
+
$this->markTestSkipped();
|
|
71
|
+
|
|
72
|
+
$this->assertFalse(isValid("055-444-285"));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public function testSpaceAndSingleZeroIsInvalid()
|
|
76
|
+
{
|
|
77
|
+
$this->markTestSkipped();
|
|
78
|
+
|
|
79
|
+
$this->assertFalse(isValid(" 0"));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public function testMultipleZerosIsValid()
|
|
83
|
+
{
|
|
84
|
+
$this->markTestSkipped();
|
|
85
|
+
|
|
86
|
+
$this->assertTrue(isValid(" 00000"));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public function testThatDoublingNineIsHandledCorrectly()
|
|
90
|
+
{
|
|
91
|
+
$this->markTestSkipped();
|
|
92
|
+
|
|
93
|
+
$this->assertTrue(isValid("091"));
|
|
94
|
+
}
|
|
95
|
+
}
|
data/tracks/purescript/README.md
CHANGED
|
@@ -2,13 +2,76 @@
|
|
|
2
2
|
|
|
3
3
|
Exercism problems in PureScript.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## How to contribute
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Thank you so much for contributing! :tada:
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
- [Asking for help](#asking-for-help)
|
|
10
|
+
- [How to contribute](#how-to-contribute)
|
|
11
|
+
* [Reporting or fixing bugs](#reporting-or-fixing-bugs)
|
|
12
|
+
* [Reviewing issues and pull requests](#reviewing-issues-and-pull)
|
|
13
|
+
* [Porting exercises](#porting-exercises)
|
|
14
|
+
- [Repository structure and conventions](#repository-structure-and-conventions)
|
|
15
|
+
- [Writing a pull request](#writing-a-pull-request)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Asking for help
|
|
19
|
+
|
|
20
|
+
When in doubt just [open a GitHub issue][new-issue] and ask! In any case,
|
|
21
|
+
don't be afraid or shy! We promise to be friendly and as helpful as possible.
|
|
22
|
+
|
|
23
|
+
[new-issue]: https://github.com/exercism/xpurescript/issues/new
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### How to contribute
|
|
27
|
+
|
|
28
|
+
As a first step we recommend you read the [contributing guide][cont-guide].
|
|
29
|
+
|
|
30
|
+
[cont-guide]: https://github.com/exercism/x-common/blob/master/CONTRIBUTING.md
|
|
31
|
+
|
|
32
|
+
#### Reporting or fixing bugs
|
|
33
|
+
|
|
34
|
+
Typical examples for a bug: A typo, a missing test case, an unclear or
|
|
35
|
+
ambiguous problem description.
|
|
36
|
+
|
|
37
|
+
- If you are unsure whether you have really found a bug [just ask](#asking-for-help).
|
|
38
|
+
- To report a bug you can [write an issue][new-issue]
|
|
39
|
+
- If you already have a fix for it you may [write a pull request](#writing-a-pull-request).
|
|
40
|
+
|
|
41
|
+
#### Reviewing issues and pull requests
|
|
42
|
+
|
|
43
|
+
If you have an opinion or feedback on work currently being done on this track
|
|
44
|
+
please do [write a comment][write-comment] for an [issue][issue] or a
|
|
45
|
+
[pull request][prs]. Feedback is extremely useful to us.
|
|
46
|
+
|
|
47
|
+
[write-comment]: https://help.github.com/articles/commenting-on-a-pull-request/
|
|
48
|
+
[issues]: https://github.com/exercism/xpurescript/issue
|
|
49
|
+
[prs]: https://github.com/exercism/xpurescript/pull
|
|
50
|
+
|
|
51
|
+
Please be detailed and include any links or arguments to support your
|
|
52
|
+
opinion.
|
|
53
|
+
|
|
54
|
+
#### Porting exercises
|
|
55
|
+
|
|
56
|
+
Here is the [list of missing exercises][missing]. See here for more
|
|
57
|
+
information about [porting an exercise][porting]. Of course you can also add a
|
|
58
|
+
totally new exercise, but it might be a good idea to first discuss it in one
|
|
59
|
+
of [our forums](#asking-for-help).
|
|
60
|
+
|
|
61
|
+
[missing]: http://exercism.io/languages/purescript/todo
|
|
62
|
+
[porting]: https://github.com/exercism/x-common/blob/master/CONTRIBUTING.md#porting-an-exercise-to-another-language-track
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
### Repository structure and conventions
|
|
66
|
+
|
|
67
|
+
[Here](https://github.com/exercism/x-common/blob/master/CONTRIBUTING.md#track-anatomy)
|
|
68
|
+
is a general description of all the files and directories that are not
|
|
69
|
+
explicitly described below.
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
### Writing a pull request
|
|
73
|
+
To fix a bug you should [create a pull request from a fork](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) [here](https://github.com/exercism/xpurescript/pull). See also [here](https://github.com/exercism/x-common/blob/master/CONTRIBUTING.md#git-basics) for more information.
|
|
10
74
|
|
|
11
|
-
Please see the [contributing guide](https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data)
|
|
12
75
|
|
|
13
76
|
## License
|
|
14
77
|
|
|
@@ -16,3 +16,4 @@ With this premise, a good, beginner friendly, starting point for those who don't
|
|
|
16
16
|
- [Offical Python3 **Documentation** and **Reference**](https://docs.python.org/3/)
|
|
17
17
|
- [Learn X in Y minutes (where X = Python3)](https://learnxinyminutes.com/docs/python3/)
|
|
18
18
|
- [The Hitchhiker’s Guide to Python](http://docs.python-guide.org/en/latest/)
|
|
19
|
+
- [PyCharm EDU **IDE** and **Courses**](https://www.jetbrains.com/pycharm-edu/)
|
|
@@ -3,8 +3,9 @@ import unittest
|
|
|
3
3
|
from acronym import abbreviate
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
# test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
|
|
7
7
|
|
|
8
|
+
class AcronymTest(unittest.TestCase):
|
|
8
9
|
def test_basic(self):
|
|
9
10
|
self.assertEqual('PNG', abbreviate('Portable Network Graphics'))
|
|
10
11
|
|
|
@@ -20,6 +21,9 @@ class AcronymTest(unittest.TestCase):
|
|
|
20
21
|
def test_all_caps_words(self):
|
|
21
22
|
self.assertEqual('PHP', abbreviate('PHP: Hypertext Preprocessor'))
|
|
22
23
|
|
|
24
|
+
def test_non_acronym_all_caps_word(self):
|
|
25
|
+
self.assertEqual('GIMP', abbreviate('GNU Image Manipulation Program'))
|
|
26
|
+
|
|
23
27
|
def test_hyphenated(self):
|
|
24
28
|
self.assertEqual('CMOS', abbreviate('Complementary metal-oxide semiconductor'))
|
|
25
29
|
|
|
@@ -3,6 +3,8 @@ import unittest
|
|
|
3
3
|
from atbash_cipher import decode, encode
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
# test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
|
|
7
|
+
|
|
6
8
|
class AtbashCipherTest(unittest.TestCase):
|
|
7
9
|
|
|
8
10
|
def test_encode_no(self):
|
|
@@ -48,6 +50,12 @@ class AtbashCipherTest(unittest.TestCase):
|
|
|
48
50
|
decode("gvhgr mt123 gvhgr mt")
|
|
49
51
|
)
|
|
50
52
|
|
|
53
|
+
def test_decode_all_the_letters(self):
|
|
54
|
+
ciphertext = "gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt"
|
|
55
|
+
plaintext = "thequickbrownfoxjumpsoverthelazydog"
|
|
56
|
+
self.assertMultiLineEqual(plaintext, decode(ciphertext))
|
|
57
|
+
|
|
58
|
+
# additional track specific test
|
|
51
59
|
def test_encode_decode(self):
|
|
52
60
|
self.assertMultiLineEqual(
|
|
53
61
|
"testing123testing",
|
|
@@ -1,48 +1,14 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
from __future__ import unicode_literals
|
|
4
1
|
import unittest
|
|
5
2
|
|
|
6
3
|
import hello_world
|
|
7
4
|
|
|
8
5
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def test_hello_without_name(self):
|
|
12
|
-
self.assertEqual(
|
|
13
|
-
'Hello, World!',
|
|
14
|
-
hello_world.hello()
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
def test_hello_with_sample_name(self):
|
|
18
|
-
self.assertEqual(
|
|
19
|
-
'Hello, Alice!',
|
|
20
|
-
hello_world.hello('Alice')
|
|
21
|
-
)
|
|
6
|
+
# test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
|
|
22
7
|
|
|
23
|
-
|
|
24
|
-
self.assertEqual(
|
|
25
|
-
'Hello, Bob!',
|
|
26
|
-
hello_world.hello('Bob')
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
def test_hello_with_umlaut_name(self):
|
|
30
|
-
self.assertEqual(
|
|
31
|
-
'Hello, Jürgen!',
|
|
32
|
-
hello_world.hello('Jürgen')
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
def test_hello_with_blank_name(self):
|
|
36
|
-
self.assertEqual(
|
|
37
|
-
'Hello, World!',
|
|
38
|
-
hello_world.hello('')
|
|
39
|
-
)
|
|
8
|
+
class HelloWorldTests(unittest.TestCase):
|
|
40
9
|
|
|
41
|
-
def
|
|
42
|
-
self.assertEqual(
|
|
43
|
-
'Hello, World!',
|
|
44
|
-
hello_world.hello(None)
|
|
45
|
-
)
|
|
10
|
+
def test_hello(self):
|
|
11
|
+
self.assertEqual('Hello, World!', hello_world.hello())
|
|
46
12
|
|
|
47
13
|
|
|
48
14
|
if __name__ == '__main__':
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
from __future__ import unicode_literals
|
|
3
|
-
|
|
4
1
|
import unittest
|
|
5
2
|
|
|
6
3
|
from run_length_encoding import encode, decode
|
|
@@ -8,30 +5,48 @@ from run_length_encoding import encode, decode
|
|
|
8
5
|
|
|
9
6
|
class WordCountTests(unittest.TestCase):
|
|
10
7
|
|
|
11
|
-
def
|
|
12
|
-
self.assertMultiLineEqual('
|
|
8
|
+
def test_encode_empty_string(self):
|
|
9
|
+
self.assertMultiLineEqual('', encode(''))
|
|
13
10
|
|
|
14
|
-
def
|
|
15
|
-
self.assertMultiLineEqual('
|
|
11
|
+
def test_encode_single_characters_only_are_encoded_without_count(self):
|
|
12
|
+
self.assertMultiLineEqual('XYZ', encode('XYZ'))
|
|
13
|
+
|
|
14
|
+
def test_encode_string_with_no_single_characters(self):
|
|
15
|
+
self.assertMultiLineEqual('2A3B4C', encode('AABBBCCCC'))
|
|
16
16
|
|
|
17
|
-
def
|
|
17
|
+
def test_encode_single_characters_mixed_with_repeated_characters(self):
|
|
18
18
|
self.assertMultiLineEqual(
|
|
19
19
|
'12WB12W3B24WB',
|
|
20
20
|
encode('WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB'))
|
|
21
21
|
|
|
22
|
-
def
|
|
22
|
+
def test_encode_multiple_whitespace_mixed_in_string(self):
|
|
23
|
+
self.assertMultiLineEqual('2 hs2q q2w2 ', encode(' hsqq qww '))
|
|
24
|
+
|
|
25
|
+
def test_encode_lowercase_characters(self):
|
|
26
|
+
self.assertMultiLineEqual('2a3b4c', encode('aabbbcccc'))
|
|
27
|
+
|
|
28
|
+
def test_decode_empty_string(self):
|
|
29
|
+
self.assertMultiLineEqual('', decode(''))
|
|
30
|
+
|
|
31
|
+
def test_decode_single_characters_only(self):
|
|
32
|
+
self.assertMultiLineEqual('XYZ', decode('XYZ'))
|
|
33
|
+
|
|
34
|
+
def test_decode_string_with_no_single_characters(self):
|
|
35
|
+
self.assertMultiLineEqual('AABBBCCCC', decode('2A3B4C'))
|
|
36
|
+
|
|
37
|
+
def test_decode_single_characters_with_repeated_characters(self):
|
|
23
38
|
self.assertMultiLineEqual(
|
|
24
39
|
'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB',
|
|
25
40
|
decode('12WB12W3B24WB'))
|
|
26
41
|
|
|
27
|
-
def
|
|
28
|
-
self.assertMultiLineEqual('
|
|
42
|
+
def test_decode_multiple_whitespace_mixed_in_string(self):
|
|
43
|
+
self.assertMultiLineEqual(' hsqq qww ', decode('2 hs2q q2w2 '))
|
|
29
44
|
|
|
30
|
-
def
|
|
31
|
-
self.assertMultiLineEqual('
|
|
45
|
+
def test_decode_lower_case_string(self):
|
|
46
|
+
self.assertMultiLineEqual('aabbbcccc', decode('2a3b4c'))
|
|
32
47
|
|
|
33
|
-
def
|
|
34
|
-
self.assertMultiLineEqual('
|
|
48
|
+
def test_combination(self):
|
|
49
|
+
self.assertMultiLineEqual('zzz ZZ zZ', decode(encode('zzz ZZ zZ')))
|
|
35
50
|
|
|
36
51
|
|
|
37
52
|
if __name__ == '__main__':
|