trackler 2.0.8.28 → 2.0.8.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/common/CONTRIBUTING.md +4 -1
  3. data/common/README.md +52 -0
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/ecmascript/config.json +7 -0
  6. data/tracks/ecmascript/exercises/perfect-numbers/example.js +68 -0
  7. data/tracks/ecmascript/exercises/perfect-numbers/gulpfile.js +89 -0
  8. data/tracks/ecmascript/exercises/perfect-numbers/package.json +28 -0
  9. data/tracks/ecmascript/exercises/perfect-numbers/perfect-numbers.spec.js +75 -0
  10. data/tracks/erlang/exercises/accumulate/src/accumulate.app.src +1 -1
  11. data/tracks/erlang/exercises/all-your-base/src/all_your_base.app.src +1 -1
  12. data/tracks/erlang/exercises/allergies/src/allergies.app.src +1 -1
  13. data/tracks/erlang/exercises/anagram/src/anagram.app.src +1 -1
  14. data/tracks/erlang/exercises/atbash-cipher/src/atbash_cipher.app.src +1 -1
  15. data/tracks/erlang/exercises/bank-account/src/bank_account.app.src +1 -1
  16. data/tracks/erlang/exercises/beer-song/src/beer_song.app.src +1 -1
  17. data/tracks/erlang/exercises/bob/src/bob.app.src +1 -1
  18. data/tracks/erlang/exercises/circular-buffer/src/circular_buffer.app.src +1 -1
  19. data/tracks/erlang/exercises/clock/src/clock.app.src +1 -1
  20. data/tracks/erlang/exercises/difference-of-squares/src/difference_of_squares.app.src +1 -1
  21. data/tracks/erlang/exercises/etl/src/etl.app.src +1 -1
  22. data/tracks/erlang/exercises/gigasecond/src/gigasecond.app.src +1 -1
  23. data/tracks/erlang/exercises/grade-school/src/grade_school.app.src +1 -1
  24. data/tracks/erlang/exercises/grains/src/grains.app.src +1 -1
  25. data/tracks/erlang/exercises/hamming/src/hamming.app.src +1 -1
  26. data/tracks/erlang/exercises/hello-world/src/hello_world.app.src +1 -1
  27. data/tracks/erlang/exercises/largest-series-product/src/largest_series_product.app.src +1 -1
  28. data/tracks/erlang/exercises/leap/src/leap.app.src +1 -1
  29. data/tracks/erlang/exercises/luhn/src/luhn.app.src +1 -1
  30. data/tracks/erlang/exercises/meetup/src/meetup.app.src +1 -1
  31. data/tracks/erlang/exercises/nucleotide-count/src/nucleotide_count.app.src +1 -1
  32. data/tracks/erlang/exercises/parallel-letter-frequency/src/parallel_letter_frequency.app.src +1 -1
  33. data/tracks/erlang/exercises/phone-number/src/phone_number.app.src +1 -1
  34. data/tracks/erlang/exercises/rna-transcription/src/rna_transcription.app.src +1 -1
  35. data/tracks/erlang/exercises/robot-simulator/src/robot_simulator.app.src +1 -1
  36. data/tracks/erlang/exercises/roman-numerals/src/roman_numerals.app.src +1 -1
  37. data/tracks/erlang/exercises/rotational-cipher/src/rotational_cipher.app.src +1 -1
  38. data/tracks/erlang/exercises/scrabble-score/src/scrabble_score.app.src +1 -1
  39. data/tracks/erlang/exercises/series/src/series.app.src +1 -1
  40. data/tracks/erlang/exercises/space-age/src/space_age.app.src +1 -1
  41. data/tracks/erlang/exercises/strain/src/strain.app.src +1 -1
  42. data/tracks/erlang/exercises/sum-of-multiples/src/sum_of_multiples.app.src +1 -1
  43. data/tracks/erlang/exercises/triangle/src/triangle.app.src +1 -1
  44. data/tracks/erlang/exercises/word-count/src/word_count.app.src +1 -1
  45. data/tracks/erlang/exercises/zipper/src/zipper.app.src +1 -1
  46. data/tracks/go/exercises/hello-world/hello_world.go +10 -1
  47. data/tracks/haskell/exercises/simple-linked-list/examples/success-standard/package.yaml +1 -0
  48. data/tracks/haskell/exercises/simple-linked-list/examples/success-standard/src/LinkedList.hs +1 -0
  49. data/tracks/haskell/exercises/simple-linked-list/package.yaml +1 -0
  50. data/tracks/haskell/exercises/simple-linked-list/src/LinkedList.hs +1 -1
  51. data/tracks/haskell/exercises/simple-linked-list/test/Tests.hs +37 -1
  52. data/tracks/java/exercises/diamond/src/test/java/DiamondPrinterTest.java +13 -6
  53. data/tracks/java/exercises/secret-handshake/src/test/java/HandshakeCalculatorTest.java +21 -13
  54. data/tracks/objective-c/exercises/atbash-cipher/AtbashCipherExample.m +1 -1
  55. data/tracks/objective-c/exercises/beer-song/BeerSongExample.m +1 -1
  56. data/tracks/objective-c/exercises/beer-song/BeerSongTest.m +4 -4
  57. data/tracks/objective-c/exercises/binary-search/BinarySearchExample.m +1 -1
  58. data/tracks/objective-c/exercises/flatten-array/FlattenArrayExample.h +2 -1
  59. data/tracks/objective-c/exercises/flatten-array/FlattenArrayExample.m +12 -25
  60. data/tracks/objective-c/exercises/flatten-array/FlattenArrayTest.m +32 -80
  61. data/tracks/objective-c/exercises/sublist/SublistTest.m +47 -70
  62. data/tracks/perl6/exercises/allergies/Allergies.pm6 +1 -0
  63. data/tracks/perl6/exercises/allergies/Example.pm +3 -1
  64. data/tracks/perl6/exercises/allergies/allergies.t +187 -137
  65. data/tracks/perl6/exercises/anagram/Anagram.pm6 +1 -0
  66. data/tracks/perl6/exercises/anagram/Example.pm +15 -15
  67. data/tracks/perl6/exercises/anagram/anagram.t +164 -15
  68. data/tracks/perl6/exercises/atbash-cipher/AtbashCipher.pm6 +1 -0
  69. data/tracks/perl6/exercises/atbash-cipher/Example.pm +2 -0
  70. data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +109 -86
  71. data/tracks/perl6/exercises/grains/Example.pm +10 -9
  72. data/tracks/perl6/exercises/grains/Grains.pm6 +1 -0
  73. data/tracks/perl6/exercises/grains/grains.t +126 -18
  74. data/tracks/perl6/exercises/leap/Example.pm +9 -9
  75. data/tracks/perl6/exercises/leap/Leap.pm6 +4 -0
  76. data/tracks/perl6/exercises/leap/leap.t +61 -17
  77. data/tracks/perl6/exercises/phone-number/Example.pm +4 -28
  78. data/tracks/perl6/exercises/phone-number/PhoneNumber.pm6 +4 -0
  79. data/tracks/perl6/exercises/phone-number/phone-number.t +102 -65
  80. data/tracks/perl6/exercises/raindrops/Example.pm +10 -8
  81. data/tracks/perl6/exercises/raindrops/Raindrops.pm6 +4 -0
  82. data/tracks/perl6/exercises/raindrops/raindrops.t +153 -20
  83. data/tracks/perl6/exercises/rna-transcription/Example.pm +5 -7
  84. data/tracks/perl6/exercises/rna-transcription/RNA.pm6 +4 -0
  85. data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +107 -11
  86. data/tracks/perl6/exercises/scrabble-score/Example.pm +14 -19
  87. data/tracks/perl6/exercises/scrabble-score/Scrabble.pm6 +4 -0
  88. data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +106 -15
  89. data/tracks/perl6/exercises/space-age/Example.pm +29 -13
  90. data/tracks/perl6/exercises/space-age/SpaceAge.pm6 +22 -0
  91. data/tracks/perl6/exercises/space-age/space-age.t +90 -52
  92. data/tracks/perl6/exercises/word-count/Example.pm +4 -8
  93. data/tracks/perl6/exercises/word-count/WordCount.pm6 +4 -0
  94. data/tracks/perl6/exercises/word-count/word-count.t +149 -16
  95. data/tracks/perl6/exercises/wordy/Example.pm +13 -13
  96. data/tracks/perl6/exercises/wordy/Wordy.pm6 +4 -0
  97. data/tracks/perl6/exercises/wordy/wordy.t +140 -97
  98. data/tracks/purescript/config.json +7 -0
  99. data/tracks/purescript/exercises/atbash-cipher/bower.json +18 -0
  100. data/tracks/purescript/exercises/atbash-cipher/examples/src/AtbashCipher.purs +41 -0
  101. data/tracks/purescript/exercises/atbash-cipher/src/AtbashCipher.purs +4 -0
  102. data/tracks/purescript/exercises/atbash-cipher/test/Main.purs +64 -0
  103. data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +2 -0
  104. data/tracks/swift/exercises/grade-school/Tests/GradeSchoolTests/GradeSchoolTests.swift +1 -1
  105. metadata +22 -2
@@ -1,30 +1,6 @@
1
- use v6;
1
+ unit module Phone:ver<1>;
2
2
 
3
- class X::Phone::Invalid is Exception {
4
- has $.payload;
5
- method message {"'$!payload' is not valid."}
3
+ sub clean-number ($number is copy) is export {
4
+ $number ~~ /<:L>/ ?? return Nil !! $number ~~ s:g/<:!Nd>//;
5
+ $number ~~ /^ 1? (<:Nd> ** 10) $/ ?? ~$0 !! Nil;
6
6
  }
7
-
8
- class Phone is export {
9
- has $.number;
10
-
11
- method new (:$number!) {
12
- my $validated = $number;
13
- $validated ~~ s:g/<:!Decimal_Number>//;
14
- $validated ~~ /^ 1? (\d ** 10) $/ ?? ($validated = ~$0) !! X::Phone::Invalid.new(payload => $number).throw;
15
- self.bless(number => $validated);
16
- }
17
-
18
- method area-code {
19
- $!number ~~ /\d**3/ and return ~$/;
20
- }
21
-
22
- method pretty {
23
- $!number ~~ /
24
- $<area-code> = \d**3
25
- $<central-office-code> = \d**3
26
- $<station-number> = \d**4
27
- / and return "($<area-code>) $<central-office-code>-$<station-number>";
28
- }
29
- }
30
-
@@ -0,0 +1,4 @@
1
+ unit module Phone:ver<1>;
2
+
3
+ sub clean-number ($number) is export {
4
+ }
@@ -1,84 +1,121 @@
1
1
  #!/usr/bin/env perl6
2
2
  use v6;
3
3
  use Test;
4
+ use lib my $dir = $?FILE.IO.dirname;
4
5
  use JSON::Tiny;
5
- use lib $?FILE.IO.dirname;
6
6
 
7
- plan 12;
8
- my $module = %*ENV<EXERCISM> ?? 'Example' !! 'Phone';
9
- use-ok $module;
10
- require ::($module) <Phone>;
7
+ my $exercise = 'Phone';
8
+ my $version = v1;
9
+ my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
+ plan 13;
11
11
 
12
- my %cases;
13
- subtest 'number, area-code and pretty methods', {
14
- plan 3;
15
- ok Phone.can('number'), 'can Phone.number';
16
- ok Phone.can('area-code'), 'can Phone.area-code';
17
- ok Phone.can('pretty'), 'can Phone.pretty';
18
- } or fail 'Missing method(s).';
12
+ use-ok $module or bail-out;
13
+ require ::($module);
19
14
 
20
- for @(%cases<valid>) {
21
- my $phone = Phone.new(number => .<input>);
22
- my $msg = 'for ' ~ .<test>;
23
- is $phone.number, .<number>, "number $msg";
24
- is $phone.area-code, .<area-code>, "area-code $msg";
25
- is $phone.pretty, .<pretty>, "pretty $msg";
15
+ if ::($exercise).^ver !~~ $version {
16
+ warn "\nExercise version mismatch. Further tests may fail!"
17
+ ~ "\n$exercise is $(::($exercise).^ver.gist). "
18
+ ~ "Test is $($version.gist).\n";
19
+ bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
26
20
  }
27
21
 
28
- todo 'Optional Exception Tests' unless %*ENV<EXERCISM>; # Remove this line for invalid input tests
29
- subtest 'Throw exceptions for invalid input', {
30
- plan 5;
31
- throws-like {Phone.new(number => .<input>)}, Exception, .<test> for @(%cases<invalid>);
22
+ my @subs;
23
+ BEGIN { @subs = <&clean-number> };
24
+ subtest 'Subroutine(s)', {
25
+ plan 1;
26
+ eval-lives-ok "use $module; ::('$_').defined or die '$_ is not defined.'", $_ for @subs;
27
+ } or bail-out 'All subroutines must be defined and exported.';
28
+ require ::($module) @subs.eager;
29
+
30
+ for @(my $c-data.<cases>.[0].<cases>) {
31
+ if .<expected> {
32
+ is clean-number(.<phrase>), |.<expected description>;
33
+ } else {
34
+ nok clean-number(.<phrase>), .<description>;
35
+ }
32
36
  }
33
37
 
38
+ if %*ENV<EXERCISM> && (my $c-data-file = "$dir/../../x-common/exercises/{$dir.IO.basename}/canonical-data.json".IO.resolve) ~~ :f {
39
+ is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data'
40
+ } else { skip }
41
+
34
42
  done-testing;
35
43
 
36
44
  INIT {
37
- %cases := from-json 「
45
+ $c-data := from-json 「
38
46
  {
39
- "valid": [
40
- {
41
- "input": 1234567890,
42
- "number": "1234567890",
43
- "area-code": "123",
44
- "pretty": "(123) 456-7890",
45
- "test": "10 digit integer"
46
- },
47
- {
48
- "input": "+1 (234) 555-6789",
49
- "number": "2345556789",
50
- "area-code": "234",
51
- "pretty": "(234) 555-6789",
52
- "test": "11 digit formatted number"
53
- },
54
- {
55
- "input": "1.379.555.2468",
56
- "number": "3795552468",
57
- "area-code": "379",
58
- "pretty": "(379) 555-2468",
59
- "test": "11 digit number containing separators"
60
- }
61
- ],
62
- "invalid": [
63
- {
64
- "input": "",
65
- "test": "empty input"
66
- },
67
- {
68
- "input": "13579",
69
- "test": "5 digit number"
70
- },
71
- {
72
- "input": "123456789011",
73
- "test": "12 digit number"
74
- },
75
- {
76
- "input": "+2 (468) 555-1379",
77
- "test": "11 digit number not beginning with 1"
78
- },
47
+ "exercise": "phone-number",
48
+ "version": "1.0.2",
49
+ "cases": [
79
50
  {
80
- "input": "phone number",
81
- "test": "not a number"
51
+ "description": "Cleanup user-entered phone numbers",
52
+ "comments": [
53
+ " Returns the cleaned phone number if given number is valid, "
54
+ , " else returns nil. Note that number is not formatted, "
55
+ , " just a 10-digit number is returned. "
56
+ ],
57
+ "cases": [
58
+ {
59
+ "description": "cleans the number",
60
+ "property": "clean",
61
+ "phrase": "(123) 456-7890",
62
+ "expected": "1234567890"
63
+ },
64
+ {
65
+ "description": "cleans numbers with dots",
66
+ "property": "clean",
67
+ "phrase": "123.456.7890",
68
+ "expected": "1234567890"
69
+ },
70
+ {
71
+ "description": "cleans numbers with multiple spaces",
72
+ "property": "clean",
73
+ "phrase": "123 456 7890 ",
74
+ "expected": "1234567890"
75
+ },
76
+ {
77
+ "description": "invalid when 9 digits",
78
+ "property": "clean",
79
+ "phrase": "123456789",
80
+ "expected": null
81
+ },
82
+ {
83
+ "description": "invalid when 11 digits does not start with a 1",
84
+ "property": "clean",
85
+ "phrase": "21234567890",
86
+ "expected": null
87
+ },
88
+ {
89
+ "description": "valid when 11 digits and starting with 1",
90
+ "property": "clean",
91
+ "phrase": "11234567890",
92
+ "expected": "1234567890"
93
+ },
94
+ {
95
+ "description": "invalid when more than 11 digits",
96
+ "property": "clean",
97
+ "phrase": "321234567890",
98
+ "expected": null
99
+ },
100
+ {
101
+ "description": "invalid with letters",
102
+ "property": "clean",
103
+ "phrase": "123-abc-7890",
104
+ "expected": null
105
+ },
106
+ {
107
+ "description": "invalid with punctuations",
108
+ "property": "clean",
109
+ "phrase": "123-@:!-7890",
110
+ "expected": null
111
+ },
112
+ {
113
+ "description": "invalid with right number of digits but letters mixed in",
114
+ "property": "clean",
115
+ "phrase": "1a2b3c4d5e6f7g8h9i0j",
116
+ "expected": null
117
+ }
118
+ ]
82
119
  }
83
120
  ]
84
121
  }
@@ -1,9 +1,11 @@
1
- class Raindrops is export {
2
- method convert (Int:D $num --> Str:D) {
3
- my $str = '';
4
- $str ~= "Pling" if $num % 3 == 0;
5
- $str ~= "Plang" if $num % 5 == 0;
6
- $str ~= "Plong" if $num % 7 == 0;
7
- return $str ?? $str !! $num.Str;
8
- }
1
+ unit module Raindrops:ver<1>;
2
+
3
+ sub convert (Int:D $num --> Str:D) is export {
4
+ my $str = '';
5
+ given $num {
6
+ when * %% 3 {$str ~= 'Pling'; proceed}
7
+ when * %% 5 {$str ~= 'Plang'; proceed}
8
+ when * %% 7 {$str ~= 'Plong'}
9
+ }
10
+ return $str ?? $str !! $num.Str;
9
11
  }
@@ -0,0 +1,4 @@
1
+ unit module Raindrops:ver<1>;
2
+
3
+ sub convert ($num) is export {
4
+ }
@@ -1,28 +1,161 @@
1
1
  #!/usr/bin/env perl6
2
2
  use v6;
3
3
  use Test;
4
- use lib IO::Path.new($?FILE).parent.path;
4
+ use lib my $dir = $?FILE.IO.dirname;
5
+ use JSON::Tiny;
5
6
 
6
- plan 23;
7
- my $module = %*ENV<EXERCISM> ?? 'Example' !! 'Raindrops';
8
- use-ok $module;
9
- require ::($module) <Raindrops>;
7
+ my $exercise = 'Raindrops';
8
+ my $version = v1;
9
+ my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
+ plan 21;
10
11
 
11
- ok Raindrops.can('convert'), 'Class Raindrops has convert method';
12
+ use-ok $module or bail-out;
13
+ require ::($module);
12
14
 
13
- my @ints = 1, 8, 52;
14
- my @plings = 3, 6, 9, 27;
15
- my @plangs = 5, 10, 25, 3125;
16
- my @plongs = 7, 14, 49;
15
+ if ::($exercise).^ver !~~ $version {
16
+ warn "\nExercise version mismatch. Further tests may fail!"
17
+ ~ "\n$exercise is $(::($exercise).^ver.gist). "
18
+ ~ "Test is $($version.gist).\n";
19
+ bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
20
+ }
21
+
22
+ my @subs;
23
+ BEGIN { @subs = <&convert> };
24
+ subtest 'Subroutine(s)', {
25
+ plan 1;
26
+ eval-lives-ok "use $module; ::('$_').defined or die '$_ is not defined.'", $_ for @subs;
27
+ } or bail-out 'All subroutines must be defined and exported.';
28
+ require ::($module) @subs.eager;
29
+
30
+ for @(my $c-data.<cases>) {
31
+ subtest {
32
+ plan 2;
33
+ is .<number>.&convert, |.<expected description>;
34
+ isa-ok .<number>.&convert, Str;
35
+ }
36
+ }
37
+
38
+ if %*ENV<EXERCISM> && (my $c-data-file = "$dir/../../x-common/exercises/{$dir.IO.basename}/canonical-data.json".IO.resolve) ~~ :f {
39
+ is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data'
40
+ } else { skip }
41
+
42
+ done-testing;
17
43
 
18
- for @ints {
19
- is Raindrops.convert($_), $_, "$_ is not a factor of 3, 5 or 7";
20
- isa-ok Raindrops.convert($_), Str, "$_ gives a string";
44
+ INIT {
45
+ $c-data := from-json
46
+ {
47
+ "exercise": "raindrops",
48
+ "version": "1.0.0",
49
+ "cases": [
50
+ {
51
+ "description": "the sound for 1 is 1",
52
+ "property": "convert",
53
+ "number": 1,
54
+ "expected": "1"
55
+ },
56
+ {
57
+ "description": "the sound for 3 is Pling",
58
+ "property": "convert",
59
+ "number": 3,
60
+ "expected": "Pling"
61
+ },
62
+ {
63
+ "description": "the sound for 5 is Plang",
64
+ "property": "convert",
65
+ "number": 5,
66
+ "expected": "Plang"
67
+ },
68
+ {
69
+ "description": "the sound for 7 is Plong",
70
+ "property": "convert",
71
+ "number": 7,
72
+ "expected": "Plong"
73
+ },
74
+ {
75
+ "description": "the sound for 6 is Pling as it has a factor 3",
76
+ "property": "convert",
77
+ "number": 6,
78
+ "expected": "Pling"
79
+ },
80
+ {
81
+ "description": "2 to the power 3 does not make a raindrop sound as 3 is the exponent not the base",
82
+ "property": "convert",
83
+ "number": 8,
84
+ "expected": "8"
85
+ },
86
+ {
87
+ "description": "the sound for 9 is Pling as it has a factor 3",
88
+ "property": "convert",
89
+ "number": 9,
90
+ "expected": "Pling"
91
+ },
92
+ {
93
+ "description": "the sound for 10 is Plang as it has a factor 5",
94
+ "property": "convert",
95
+ "number": 10,
96
+ "expected": "Plang"
97
+ },
98
+ {
99
+ "description": "the sound for 14 is Plong as it has a factor of 7",
100
+ "property": "convert",
101
+ "number": 14,
102
+ "expected": "Plong"
103
+ },
104
+ {
105
+ "description": "the sound for 15 is PlingPlang as it has factors 3 and 5",
106
+ "property": "convert",
107
+ "number": 15,
108
+ "expected": "PlingPlang"
109
+ },
110
+ {
111
+ "description": "the sound for 21 is PlingPlong as it has factors 3 and 7",
112
+ "property": "convert",
113
+ "number": 21,
114
+ "expected": "PlingPlong"
115
+ },
116
+ {
117
+ "description": "the sound for 25 is Plang as it has a factor 5",
118
+ "property": "convert",
119
+ "number": 25,
120
+ "expected": "Plang"
121
+ },
122
+ {
123
+ "description": "the sound for 27 is Pling as it has a factor 3",
124
+ "property": "convert",
125
+ "number": 27,
126
+ "expected": "Pling"
127
+ },
128
+ {
129
+ "description": "the sound for 35 is PlangPlong as it has factors 5 and 7",
130
+ "property": "convert",
131
+ "number": 35,
132
+ "expected": "PlangPlong"
133
+ },
134
+ {
135
+ "description": "the sound for 49 is Plong as it has a factor 7",
136
+ "property": "convert",
137
+ "number": 49,
138
+ "expected": "Plong"
139
+ },
140
+ {
141
+ "description": "the sound for 52 is 52",
142
+ "property": "convert",
143
+ "number": 52,
144
+ "expected": "52"
145
+ },
146
+ {
147
+ "description": "the sound for 105 is PlingPlangPlong as it has factors 3, 5 and 7",
148
+ "property": "convert",
149
+ "number": 105,
150
+ "expected": "PlingPlangPlong"
151
+ },
152
+ {
153
+ "description": "the sound for 3125 is Plang as it has a factor 5",
154
+ "property": "convert",
155
+ "number": 3125,
156
+ "expected": "Plang"
157
+ }
158
+ ]
159
+ }
160
+
21
161
  }
22
- is Raindrops.convert($_), 'Pling', "$_ is a factor of 3, not 5 or 7" for @plings;
23
- is Raindrops.convert($_), 'Plang', "$_ is a factor of 5, not 3 or 7" for @plangs;
24
- is Raindrops.convert($_), 'Plong', "$_ is a factor of 7, not 3 or 5" for @plongs;
25
- is Raindrops.convert(15), 'PlingPlang', '15 is a factor of 3 and 5, not 7';
26
- is Raindrops.convert(21), 'PlingPlong', '21 is a factor of 3 and 7, not 5';
27
- is Raindrops.convert(35), 'PlangPlong', '35 is a factor of 5 and 7, not 3';
28
- is Raindrops.convert(105), 'PlingPlangPlong', '105 is a factor of 3, 5 and 7';
@@ -1,8 +1,6 @@
1
- class RNA_Transcription is export {
2
- method to_rna ($dna) {
3
- $dna.trans( 'A' => 'U',
4
- 'G' => 'C',
5
- 'C' => 'G',
6
- 'T' => 'A');
7
- }
1
+ unit module RNA:ver<1>;
2
+
3
+ sub to-rna ($dna) is export {
4
+ fail if $dna ~~ /<-[AGCT]>/;
5
+ $dna.trans(<A G C T> => <U C G A>);
8
6
  }