trackler 2.0.8.20 → 2.0.8.21
Sign up to get free protection for your applications and to get access to all the features.
- 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__':
|