trackler 2.2.1.52 → 2.2.1.53

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/leap/canonical-data.json +2 -2
  4. data/tracks/cfml/tasks/FormatConfig.cfc +6 -4
  5. data/tracks/cfml/tasks/GenerateReadme.cfc +197 -0
  6. data/tracks/cfml/tasks/ScaffoldExercise.cfc +6 -0
  7. data/tracks/csharp/config.json +1 -1
  8. data/tracks/delphi/exercises/leap/uLeapTests.pas +1 -1
  9. data/tracks/fsharp/exercises/clock/Clock.fs +1 -1
  10. data/tracks/fsharp/exercises/clock/ClockTest.fs +239 -61
  11. data/tracks/fsharp/exercises/clock/Example.fs +3 -3
  12. data/tracks/fsharp/exercises/dominoes/DominoesTest.fs +29 -26
  13. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProductTest.fs +30 -15
  14. data/tracks/fsharp/exercises/leap/LeapTest.fs +2 -2
  15. data/tracks/fsharp/exercises/rectangles/Example.fs +1 -1
  16. data/tracks/fsharp/exercises/rectangles/Rectangles.fs +1 -1
  17. data/tracks/fsharp/exercises/rectangles/RectanglesTest.fs +66 -43
  18. data/tracks/fsharp/generators/Generators.fs +85 -1
  19. data/tracks/java/scripts/canonical_data_check.sh +8 -0
  20. data/tracks/kotlin/.gitignore +1 -0
  21. data/tracks/kotlin/exercises/acronym/.meta/version +1 -0
  22. data/tracks/kotlin/exercises/acronym/src/test/kotlin/AcronymTest.kt +9 -10
  23. data/tracks/kotlin/exercises/all-your-base/.meta/version +1 -1
  24. data/tracks/kotlin/exercises/all-your-base/src/test/kotlin/BaseConverterTest.kt +20 -20
  25. data/tracks/kotlin/exercises/allergies/.meta/version +1 -0
  26. data/tracks/kotlin/exercises/allergies/src/test/kotlin/AllergiesTest.kt +19 -72
  27. data/tracks/kotlin/exercises/anagram/.meta/src/reference/kotlin/Anagram.kt +7 -4
  28. data/tracks/kotlin/exercises/anagram/.meta/version +1 -0
  29. data/tracks/kotlin/exercises/anagram/src/test/kotlin/AnagramTest.kt +76 -29
  30. data/tracks/kotlin/exercises/atbash-cipher/.meta/version +1 -0
  31. data/tracks/kotlin/exercises/atbash-cipher/src/test/kotlin/AtbashTest.kt +6 -3
  32. data/tracks/kotlin/exercises/beer-song/.meta/version +1 -0
  33. data/tracks/kotlin/exercises/beer-song/src/test/kotlin/BeerSongTest.kt +21 -46
  34. data/tracks/kotlin/exercises/binary-search/.meta/version +1 -0
  35. data/tracks/kotlin/exercises/binary-search/src/test/kotlin/BinarySearchTest.kt +30 -19
  36. data/tracks/kotlin/exercises/bob/.meta/src/reference/kotlin/Bob.kt +8 -7
  37. data/tracks/kotlin/exercises/bob/.meta/version +1 -0
  38. data/tracks/kotlin/exercises/bob/src/test/kotlin/BobTest.kt +57 -15
  39. data/tracks/kotlin/exercises/bracket-push/.meta/version +1 -0
  40. data/tracks/kotlin/exercises/bracket-push/src/test/kotlin/BracketPushTest.kt +3 -1
  41. data/tracks/kotlin/exercises/collatz-conjecture/.meta/version +1 -1
  42. data/tracks/kotlin/exercises/difference-of-squares/.meta/version +1 -0
  43. data/tracks/kotlin/exercises/difference-of-squares/src/test/kotlin/SquaresTest.kt +10 -23
  44. data/tracks/kotlin/exercises/etl/.meta/src/reference/kotlin/ETL.kt +7 -1
  45. data/tracks/kotlin/exercises/etl/.meta/version +1 -0
  46. data/tracks/kotlin/exercises/etl/src/test/kotlin/ETLTest.kt +10 -10
  47. data/tracks/kotlin/exercises/flatten-array/.meta/version +1 -0
  48. data/tracks/kotlin/exercises/flatten-array/src/test/kotlin/FlattenerTest.kt +8 -16
  49. data/tracks/kotlin/exercises/gigasecond/.meta/version +1 -0
  50. data/tracks/kotlin/exercises/gigasecond/src/test/kotlin/GigasecondTest.kt +1 -1
  51. data/tracks/kotlin/exercises/hamming/.meta/src/reference/kotlin/Hamming.kt +1 -1
  52. data/tracks/kotlin/exercises/hamming/.meta/version +1 -1
  53. data/tracks/kotlin/exercises/hamming/src/test/kotlin/HammingTest.kt +4 -4
  54. data/tracks/kotlin/exercises/hello-world/.meta/version +1 -0
  55. data/tracks/kotlin/exercises/hello-world/src/test/kotlin/HelloWorldTest.kt +1 -1
  56. data/tracks/kotlin/exercises/isogram/.meta/version +1 -0
  57. data/tracks/kotlin/exercises/isogram/src/test/kotlin/IsogramTest.kt +5 -8
  58. data/tracks/kotlin/exercises/largest-series-product/.meta/src/reference/kotlin/Series.kt +2 -3
  59. data/tracks/kotlin/exercises/largest-series-product/.meta/version +1 -0
  60. data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesTest.kt +97 -0
  61. data/tracks/kotlin/exercises/leap/.meta/version +1 -0
  62. data/tracks/kotlin/exercises/leap/src/test/kotlin/LeapTest.kt +8 -26
  63. data/tracks/kotlin/exercises/list-ops/.meta/version +1 -1
  64. data/tracks/kotlin/exercises/luhn/.meta/version +1 -0
  65. data/tracks/kotlin/exercises/luhn/src/test/kotlin/LuhnTest.kt +0 -3
  66. data/tracks/kotlin/exercises/nth-prime/.meta/version +1 -0
  67. data/tracks/kotlin/exercises/nth-prime/src/test/kotlin/PrimeTest.kt +0 -2
  68. data/tracks/kotlin/exercises/nucleotide-count/.meta/src/reference/kotlin/{DNA.kt → Dna.kt} +3 -8
  69. data/tracks/kotlin/exercises/nucleotide-count/.meta/version +1 -0
  70. data/tracks/kotlin/exercises/nucleotide-count/src/test/kotlin/DnaTest.kt +48 -0
  71. data/tracks/kotlin/exercises/pangram/.meta/src/reference/kotlin/{Pangrams.kt → Pangram.kt} +1 -1
  72. data/tracks/kotlin/exercises/pangram/.meta/version +1 -1
  73. data/tracks/kotlin/exercises/pangram/src/test/kotlin/PangramTest.kt +15 -9
  74. data/tracks/kotlin/exercises/pascals-triangle/.meta/version +1 -0
  75. data/tracks/kotlin/exercises/pascals-triangle/src/test/kotlin/PascalsTriangleTest.kt +32 -14
  76. data/tracks/kotlin/exercises/perfect-numbers/.meta/src/reference/kotlin/NaturalNumber.kt +1 -1
  77. data/tracks/kotlin/exercises/perfect-numbers/.meta/version +1 -0
  78. data/tracks/kotlin/exercises/perfect-numbers/src/test/kotlin/{PerfectNumbersTest.kt → NaturalNumberTest.kt} +25 -7
  79. data/tracks/kotlin/exercises/phone-number/.meta/src/reference/kotlin/PhoneNumber.kt +15 -7
  80. data/tracks/kotlin/exercises/phone-number/.meta/version +1 -0
  81. data/tracks/kotlin/exercises/phone-number/src/test/kotlin/PhoneNumberTest.kt +46 -29
  82. data/tracks/kotlin/exercises/pig-latin/.meta/src/reference/kotlin/PigLatin.kt +2 -2
  83. data/tracks/kotlin/exercises/pig-latin/.meta/version +1 -0
  84. data/tracks/kotlin/exercises/pig-latin/src/test/kotlin/PigLatinTest.kt +21 -10
  85. data/tracks/kotlin/exercises/raindrops/.meta/version +1 -0
  86. data/tracks/kotlin/exercises/raindrops/src/test/kotlin/RaindropsTest.kt +19 -26
  87. data/tracks/kotlin/exercises/react/.meta/version +1 -0
  88. data/tracks/kotlin/exercises/react/src/test/kotlin/ReactTest.kt +11 -4
  89. data/tracks/kotlin/exercises/robot-simulator/.meta/version +1 -1
  90. data/tracks/kotlin/exercises/roman-numerals/.meta/version +1 -0
  91. data/tracks/kotlin/exercises/roman-numerals/src/test/kotlin/RomanNumeralTest.kt +1 -2
  92. data/tracks/kotlin/exercises/rotational-cipher/.meta/version +1 -1
  93. data/tracks/kotlin/exercises/rotational-cipher/src/test/kotlin/RotationalCipherTest.kt +7 -7
  94. data/tracks/kotlin/exercises/scrabble-score/.meta/src/reference/kotlin/{Scrabble.kt → ScrabbleScore.kt} +1 -1
  95. data/tracks/kotlin/exercises/scrabble-score/.meta/version +1 -0
  96. data/tracks/kotlin/exercises/scrabble-score/src/test/kotlin/ScrabbleScoreTest.kt +9 -7
  97. data/tracks/kotlin/exercises/sieve/.meta/version +1 -0
  98. data/tracks/kotlin/exercises/sieve/src/test/kotlin/SieveTest.kt +8 -0
  99. data/tracks/kotlin/exercises/space-age/.meta/version +1 -0
  100. data/tracks/kotlin/exercises/space-age/src/test/kotlin/SpaceAgeTest.kt +1 -16
  101. data/tracks/kotlin/exercises/sum-of-multiples/.meta/version +1 -0
  102. data/tracks/kotlin/exercises/sum-of-multiples/src/test/kotlin/SumOfMultiplesTest.kt +7 -7
  103. data/tracks/kotlin/exercises/triangle/.meta/version +1 -0
  104. data/tracks/kotlin/exercises/two-fer/.meta/version +1 -0
  105. data/tracks/kotlin/exercises/two-fer/src/test/kotlin/TwoferTest.kt +0 -1
  106. data/tracks/kotlin/exercises/word-count/.meta/src/reference/kotlin/WordCount.kt +6 -2
  107. data/tracks/kotlin/exercises/word-count/.meta/version +1 -0
  108. data/tracks/kotlin/exercises/word-count/src/test/kotlin/WordCountTest.kt +31 -9
  109. data/tracks/kotlin/scripts/canonical_data_check.sh +8 -0
  110. data/tracks/perl6/exercises/leap/leap.t +2 -2
  111. data/tracks/php/config.json +16 -0
  112. data/tracks/php/exercises/crypto-square/crypto-square_test.php +50 -0
  113. data/tracks/php/exercises/crypto-square/example.php +32 -0
  114. data/tracks/php/exercises/meetup/README.md +21 -0
  115. data/tracks/php/exercises/meetup/example.php +19 -0
  116. data/tracks/php/exercises/meetup/meetup_test.php +577 -0
  117. data/tracks/python/README.md +7 -5
  118. data/tracks/python/config.json +36 -27
  119. data/tracks/python/docs/TESTS.md +36 -12
  120. data/tracks/python/exercises/complex-numbers/complex_numbers_test.py +1 -1
  121. data/tracks/python/exercises/diffie-hellman/.meta/hints.md +16 -0
  122. data/tracks/python/exercises/diffie-hellman/README.md +15 -2
  123. data/tracks/python/exercises/error-handling/README.md +23 -0
  124. data/tracks/python/exercises/error-handling/error_handling.py +14 -0
  125. data/tracks/python/exercises/error-handling/error_handling_test.py +66 -0
  126. data/tracks/python/exercises/error-handling/example.py +21 -0
  127. data/tracks/python/exercises/forth/forth_test.py +1 -1
  128. data/tracks/python/exercises/isogram/isogram_test.py +5 -3
  129. data/tracks/python/exercises/leap/leap_test.py +2 -2
  130. data/tracks/python/exercises/rotational-cipher/rotational_cipher_test.py +4 -4
  131. data/tracks/python/exercises/simple-cipher/.meta/hints.md +16 -0
  132. data/tracks/python/exercises/simple-cipher/README.md +17 -0
  133. data/tracks/python/exercises/sum-of-multiples/sum_of_multiples_test.py +4 -1
  134. data/tracks/python/exercises/twelve-days/example.py +3 -3
  135. data/tracks/python/exercises/twelve-days/twelve_days.py +2 -2
  136. metadata +53 -9
  137. data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesInvalidInputTest.kt +0 -30
  138. data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesValidInputTest.kt +0 -34
  139. data/tracks/kotlin/exercises/nucleotide-count/src/test/kotlin/NucleotideTest.kt +0 -87
@@ -0,0 +1,21 @@
1
+ def handle_error_by_throwing_exception():
2
+ raise Exception()
3
+
4
+
5
+ def handle_error_by_returning_none(input_data):
6
+ try:
7
+ return int(input_data)
8
+ except ValueError:
9
+ return None
10
+
11
+
12
+ def handle_error_by_returning_tuple(input_data):
13
+ try:
14
+ return (True, int(input_data))
15
+ except ValueError:
16
+ return (False, None)
17
+
18
+
19
+ def filelike_objects_are_closed_on_exception(filelike_object):
20
+ with filelike_object as fobj:
21
+ fobj.do_something()
@@ -3,7 +3,7 @@ import unittest
3
3
  from forth import evaluate, StackUnderflowError
4
4
 
5
5
 
6
- # test cases adapted from `x-common//canonical-data.json` @ version: 1.2.0
6
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.2.0
7
7
 
8
8
 
9
9
  class ForthAdditionTest(unittest.TestCase):
@@ -3,7 +3,7 @@ import unittest
3
3
  from isogram import is_isogram
4
4
 
5
5
 
6
- # test cases adapted from `x-common//canonical-data.json` @ version: 1.1.0
6
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.2.0
7
7
 
8
8
  class TestIsogram(unittest.TestCase):
9
9
 
@@ -25,8 +25,8 @@ class TestIsogram(unittest.TestCase):
25
25
  def test_hypothetical_isogrammic_word_with_hyphen(self):
26
26
  self.assertIs(is_isogram("thumbscrew-japingly"), True)
27
27
 
28
- def test_isogram_with_duplicated_non_letter_character(self):
29
- self.assertIs(is_isogram("Hjelmqvist-Gryb-Zock-Pfund-Wax"), True)
28
+ def test_isogram_with_duplicated_hyphen(self):
29
+ self.assertIs(is_isogram("six-year-old"), True)
30
30
 
31
31
  def test_made_up_name_that_is_an_isogram(self):
32
32
  self.assertIs(is_isogram("Emily Jung Schwartzkopf"), True)
@@ -34,6 +34,8 @@ class TestIsogram(unittest.TestCase):
34
34
  def test_duplicated_character_in_the_middle(self):
35
35
  self.assertIs(is_isogram("accentor"), False)
36
36
 
37
+ # Additional tests for this track
38
+
37
39
  def test_isogram_with_duplicated_letter_and_nonletter_character(self):
38
40
  self.assertIs(is_isogram("Aleph Bot Chap"), False)
39
41
 
@@ -3,14 +3,14 @@ import unittest
3
3
  from leap import is_leap_year
4
4
 
5
5
 
6
- # Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
6
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.2.0
7
7
 
8
8
  class YearTest(unittest.TestCase):
9
9
  def test_year_not_divisible_by_4(self):
10
10
  self.assertIs(is_leap_year(2015), False)
11
11
 
12
12
  def test_year_divisible_by_4_not_divisible_by_100(self):
13
- self.assertIs(is_leap_year(2016), True)
13
+ self.assertIs(is_leap_year(1996), True)
14
14
 
15
15
  def test_year_divisible_by_100_not_divisible_by_400(self):
16
16
  self.assertIs(is_leap_year(2100), False)
@@ -3,18 +3,18 @@ import unittest
3
3
  import rotational_cipher
4
4
 
5
5
 
6
- # test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
6
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0
7
7
 
8
8
  class RotationalCipher(unittest.TestCase):
9
+ def test_rotate_a_by_0(self):
10
+ self.assertEqual(rotational_cipher.rotate('a', 0), 'a')
11
+
9
12
  def test_rotate_a_by_1(self):
10
13
  self.assertEqual(rotational_cipher.rotate('a', 1), 'b')
11
14
 
12
15
  def test_rotate_a_by_26(self):
13
16
  self.assertEqual(rotational_cipher.rotate('a', 26), 'a')
14
17
 
15
- def test_rotate_a_by_0(self):
16
- self.assertEqual(rotational_cipher.rotate('a', 0), 'a')
17
-
18
18
  def test_rotate_m_by_13(self):
19
19
  self.assertEqual(rotational_cipher.rotate('m', 13), 'z')
20
20
 
@@ -0,0 +1,16 @@
1
+ ## Should I use random or secrets?
2
+
3
+ Python, as of version 3.6, includes two different random modules.
4
+
5
+ The module called `random` is pseudo-random, meaning it does not generate
6
+ true randomness, but follows an algorithm that simulates randomness.
7
+ Since random numbers are generated through a known algorithm, they are not truly random.
8
+
9
+ The `random` module is not correctly suited for cryptography and should not be used,
10
+ precisely because it is pseudo-random.
11
+
12
+ For this reason, in version 3.6, Python introduced the `secrets` module, which generates
13
+ cryptographically strong random numbers that provide the greater security required for cryptography.
14
+
15
+ Since this is only an exercise, `random` is fine to use, but note that **it would be
16
+ very insecure if actually used for cryptography.**
@@ -83,6 +83,23 @@ on Wikipedia][dh] for one of the first implementations of this scheme.
83
83
  [1]: https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Caesar_cipher_left_shift_of_3.svg/320px-Caesar_cipher_left_shift_of_3.svg.png
84
84
  [dh]: http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
85
85
 
86
+ ## Should I use random or secrets?
87
+
88
+ Python, as of version 3.6, includes two different random modules.
89
+
90
+ The module called `random` is pseudo-random, meaning it does not generate
91
+ true randomness, but follows an algorithm that simulates randomness.
92
+ Since random numbers are generated through a known algorithm, they are not truly random.
93
+
94
+ The `random` module is not correctly suited for cryptography and should not be used,
95
+ precisely because it is pseudo-random.
96
+
97
+ For this reason, in version 3.6, Python introduced the `secrets` module, which generates
98
+ cryptographically strong random numbers that provide the greater security required for cryptography.
99
+
100
+ Since this is only an exercise, `random` is fine to use, but note that **it would be
101
+ very insecure if actually used for cryptography.**
102
+
86
103
  ### Submitting Exercises
87
104
 
88
105
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -12,7 +12,7 @@ import unittest
12
12
  from sum_of_multiples import sum_of_multiples
13
13
 
14
14
 
15
- # test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
15
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0
16
16
 
17
17
  class SumOfMultiplesTest(unittest.TestCase):
18
18
  def test_multiples_of_3_or_5_up_to_1(self):
@@ -21,6 +21,9 @@ class SumOfMultiplesTest(unittest.TestCase):
21
21
  def test_multiples_of_3_or_5_up_to_4(self):
22
22
  self.assertEqual(sum_of_multiples(4, [3, 5]), 3)
23
23
 
24
+ def test_multiples_of_3_up_to_7(self):
25
+ self.assertEqual(sum_of_multiples(7, [3]), 9)
26
+
24
27
  def test_multiples_of_3_or_5_up_to_10(self):
25
28
  self.assertEqual(sum_of_multiples(10, [3, 5]), 23)
26
29
 
@@ -15,13 +15,13 @@ ORDINAL = [None, 'first', 'second', 'third', 'fourth', 'fifth', 'sixth',
15
15
  'seventh', 'eighth', 'ninth', 'tenth', 'eleventh', 'twelfth']
16
16
 
17
17
 
18
- def verse(n):
19
- gifts = GIFTS[-n:]
18
+ def verse(day_number):
19
+ gifts = GIFTS[-day_number:]
20
20
  if len(gifts) > 1:
21
21
  gifts[:-1] = [', '.join(gifts[:-1])]
22
22
  gifts = ', and '.join(gifts)
23
23
  return 'On the {} day of Christmas my true love gave to me, {}.\n'.format(
24
- ORDINAL[n], gifts)
24
+ ORDINAL[day_number], gifts)
25
25
 
26
26
 
27
27
  def verses(start, end):
@@ -1,8 +1,8 @@
1
- def verse():
1
+ def verse(day_number):
2
2
  pass
3
3
 
4
4
 
5
- def verses():
5
+ def verses(start, end):
6
6
  pass
7
7
 
8
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trackler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1.52
4
+ version: 2.2.1.53
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Owen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-24 00:00:00.000000000 Z
11
+ date: 2017-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -1301,6 +1301,7 @@ files:
1301
1301
  - tracks/cfml/exercises/word-count/index.cfm
1302
1302
  - tracks/cfml/img/icon.png
1303
1303
  - tracks/cfml/tasks/FormatConfig.cfc
1304
+ - tracks/cfml/tasks/GenerateReadme.cfc
1304
1305
  - tracks/cfml/tasks/GenerateTests.cfc
1305
1306
  - tracks/cfml/tasks/ScaffoldExercise.cfc
1306
1307
  - tracks/cfml/tasks/TestAllSolutions.cfc
@@ -7750,6 +7751,7 @@ files:
7750
7751
  - tracks/kotlin/exercises/accumulate/src/main/kotlin/.keep
7751
7752
  - tracks/kotlin/exercises/accumulate/src/test/kotlin/AccumulateTest.kt
7752
7753
  - tracks/kotlin/exercises/acronym/.meta/src/reference/kotlin/Acronym.kt
7754
+ - tracks/kotlin/exercises/acronym/.meta/version
7753
7755
  - tracks/kotlin/exercises/acronym/README.md
7754
7756
  - tracks/kotlin/exercises/acronym/build.gradle
7755
7757
  - tracks/kotlin/exercises/acronym/src/main/kotlin/.keep
@@ -7762,16 +7764,19 @@ files:
7762
7764
  - tracks/kotlin/exercises/all-your-base/src/test/kotlin/BaseConverterTest.kt
7763
7765
  - tracks/kotlin/exercises/allergies/.meta/src/reference/kotlin/Allergen.kt
7764
7766
  - tracks/kotlin/exercises/allergies/.meta/src/reference/kotlin/Allergies.kt
7767
+ - tracks/kotlin/exercises/allergies/.meta/version
7765
7768
  - tracks/kotlin/exercises/allergies/README.md
7766
7769
  - tracks/kotlin/exercises/allergies/build.gradle
7767
7770
  - tracks/kotlin/exercises/allergies/src/main/kotlin/Allergen.kt
7768
7771
  - tracks/kotlin/exercises/allergies/src/test/kotlin/AllergiesTest.kt
7769
7772
  - tracks/kotlin/exercises/anagram/.meta/src/reference/kotlin/Anagram.kt
7773
+ - tracks/kotlin/exercises/anagram/.meta/version
7770
7774
  - tracks/kotlin/exercises/anagram/README.md
7771
7775
  - tracks/kotlin/exercises/anagram/build.gradle
7772
7776
  - tracks/kotlin/exercises/anagram/src/main/kotlin/.keep
7773
7777
  - tracks/kotlin/exercises/anagram/src/test/kotlin/AnagramTest.kt
7774
7778
  - tracks/kotlin/exercises/atbash-cipher/.meta/src/reference/kotlin/Atbash.kt
7779
+ - tracks/kotlin/exercises/atbash-cipher/.meta/version
7775
7780
  - tracks/kotlin/exercises/atbash-cipher/README.md
7776
7781
  - tracks/kotlin/exercises/atbash-cipher/build.gradle
7777
7782
  - tracks/kotlin/exercises/atbash-cipher/src/main/kotlin/.keep
@@ -7782,11 +7787,13 @@ files:
7782
7787
  - tracks/kotlin/exercises/bank-account/src/main/kotlin/.keep
7783
7788
  - tracks/kotlin/exercises/bank-account/src/test/kotlin/BankAccountTest.kt
7784
7789
  - tracks/kotlin/exercises/beer-song/.meta/src/reference/kotlin/BeerSong.kt
7790
+ - tracks/kotlin/exercises/beer-song/.meta/version
7785
7791
  - tracks/kotlin/exercises/beer-song/README.md
7786
7792
  - tracks/kotlin/exercises/beer-song/build.gradle
7787
7793
  - tracks/kotlin/exercises/beer-song/src/main/kotlin/.keep
7788
7794
  - tracks/kotlin/exercises/beer-song/src/test/kotlin/BeerSongTest.kt
7789
7795
  - tracks/kotlin/exercises/binary-search/.meta/src/reference/kotlin/BinarySearch.kt
7796
+ - tracks/kotlin/exercises/binary-search/.meta/version
7790
7797
  - tracks/kotlin/exercises/binary-search/README.md
7791
7798
  - tracks/kotlin/exercises/binary-search/build.gradle
7792
7799
  - tracks/kotlin/exercises/binary-search/src/main/kotlin/.keep
@@ -7797,11 +7804,13 @@ files:
7797
7804
  - tracks/kotlin/exercises/binary/src/main/kotlin/.keep
7798
7805
  - tracks/kotlin/exercises/binary/src/test/kotlin/BinaryTest.kt
7799
7806
  - tracks/kotlin/exercises/bob/.meta/src/reference/kotlin/Bob.kt
7807
+ - tracks/kotlin/exercises/bob/.meta/version
7800
7808
  - tracks/kotlin/exercises/bob/README.md
7801
7809
  - tracks/kotlin/exercises/bob/build.gradle
7802
7810
  - tracks/kotlin/exercises/bob/src/main/kotlin/.keep
7803
7811
  - tracks/kotlin/exercises/bob/src/test/kotlin/BobTest.kt
7804
7812
  - tracks/kotlin/exercises/bracket-push/.meta/src/reference/kotlin/BracketPush.kt
7813
+ - tracks/kotlin/exercises/bracket-push/.meta/version
7805
7814
  - tracks/kotlin/exercises/bracket-push/README.md
7806
7815
  - tracks/kotlin/exercises/bracket-push/build.gradle
7807
7816
  - tracks/kotlin/exercises/bracket-push/src/main/kotlin/.keep
@@ -7840,16 +7849,19 @@ files:
7840
7849
  - tracks/kotlin/exercises/diamond/src/main/kotlin/DiamondPrinter.kt
7841
7850
  - tracks/kotlin/exercises/diamond/src/test/kotlin/DiamondPrinterTest.kt
7842
7851
  - tracks/kotlin/exercises/difference-of-squares/.meta/src/reference/kotlin/Squares.kt
7852
+ - tracks/kotlin/exercises/difference-of-squares/.meta/version
7843
7853
  - tracks/kotlin/exercises/difference-of-squares/README.md
7844
7854
  - tracks/kotlin/exercises/difference-of-squares/build.gradle
7845
7855
  - tracks/kotlin/exercises/difference-of-squares/src/main/kotlin/.keep
7846
7856
  - tracks/kotlin/exercises/difference-of-squares/src/test/kotlin/SquaresTest.kt
7847
7857
  - tracks/kotlin/exercises/etl/.meta/src/reference/kotlin/ETL.kt
7858
+ - tracks/kotlin/exercises/etl/.meta/version
7848
7859
  - tracks/kotlin/exercises/etl/README.md
7849
7860
  - tracks/kotlin/exercises/etl/build.gradle
7850
7861
  - tracks/kotlin/exercises/etl/src/main/kotlin/.keep
7851
7862
  - tracks/kotlin/exercises/etl/src/test/kotlin/ETLTest.kt
7852
7863
  - tracks/kotlin/exercises/flatten-array/.meta/src/reference/kotlin/Flattener.kt
7864
+ - tracks/kotlin/exercises/flatten-array/.meta/version
7853
7865
  - tracks/kotlin/exercises/flatten-array/README.md
7854
7866
  - tracks/kotlin/exercises/flatten-array/build.gradle
7855
7867
  - tracks/kotlin/exercises/flatten-array/src/main/kotlin/.keep
@@ -7861,6 +7873,7 @@ files:
7861
7873
  - tracks/kotlin/exercises/forth/src/main/kotlin/.keep
7862
7874
  - tracks/kotlin/exercises/forth/src/test/kotlin/ForthEvaluatorTest.kt
7863
7875
  - tracks/kotlin/exercises/gigasecond/.meta/src/reference/kotlin/Gigasecond.kt
7876
+ - tracks/kotlin/exercises/gigasecond/.meta/version
7864
7877
  - tracks/kotlin/exercises/gigasecond/README.md
7865
7878
  - tracks/kotlin/exercises/gigasecond/build.gradle
7866
7879
  - tracks/kotlin/exercises/gigasecond/src/main/kotlin/.keep
@@ -7885,6 +7898,7 @@ files:
7885
7898
  - tracks/kotlin/exercises/hamming/src/test/kotlin/HammingTest.kt
7886
7899
  - tracks/kotlin/exercises/hello-world/.meta/hints.md
7887
7900
  - tracks/kotlin/exercises/hello-world/.meta/src/reference/kotlin/HelloWorld.kt
7901
+ - tracks/kotlin/exercises/hello-world/.meta/version
7888
7902
  - tracks/kotlin/exercises/hello-world/README.md
7889
7903
  - tracks/kotlin/exercises/hello-world/TUTORIAL.md
7890
7904
  - tracks/kotlin/exercises/hello-world/build.gradle
@@ -7896,17 +7910,19 @@ files:
7896
7910
  - tracks/kotlin/exercises/hexadecimal/src/main/kotlin/.keep
7897
7911
  - tracks/kotlin/exercises/hexadecimal/src/test/kotlin/HexadecimalTest.kt
7898
7912
  - tracks/kotlin/exercises/isogram/.meta/src/reference/kotlin/Isogram.kt
7913
+ - tracks/kotlin/exercises/isogram/.meta/version
7899
7914
  - tracks/kotlin/exercises/isogram/README.md
7900
7915
  - tracks/kotlin/exercises/isogram/build.gradle
7901
7916
  - tracks/kotlin/exercises/isogram/src/main/kotlin/.keep
7902
7917
  - tracks/kotlin/exercises/isogram/src/test/kotlin/IsogramTest.kt
7903
7918
  - tracks/kotlin/exercises/largest-series-product/.meta/src/reference/kotlin/Series.kt
7919
+ - tracks/kotlin/exercises/largest-series-product/.meta/version
7904
7920
  - tracks/kotlin/exercises/largest-series-product/README.md
7905
7921
  - tracks/kotlin/exercises/largest-series-product/build.gradle
7906
7922
  - tracks/kotlin/exercises/largest-series-product/src/main/kotlin/.keep
7907
- - tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesInvalidInputTest.kt
7908
- - tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesValidInputTest.kt
7923
+ - tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesTest.kt
7909
7924
  - tracks/kotlin/exercises/leap/.meta/src/reference/kotlin/Year.kt
7925
+ - tracks/kotlin/exercises/leap/.meta/version
7910
7926
  - tracks/kotlin/exercises/leap/README.md
7911
7927
  - tracks/kotlin/exercises/leap/build.gradle
7912
7928
  - tracks/kotlin/exercises/leap/src/main/kotlin/.keep
@@ -7924,6 +7940,7 @@ files:
7924
7940
  - tracks/kotlin/exercises/list-ops/src/main/kotlin/.keep
7925
7941
  - tracks/kotlin/exercises/list-ops/src/test/kotlin/ListExtensionsTest.kt
7926
7942
  - tracks/kotlin/exercises/luhn/.meta/src/reference/kotlin/Luhn.kt
7943
+ - tracks/kotlin/exercises/luhn/.meta/version
7927
7944
  - tracks/kotlin/exercises/luhn/README.md
7928
7945
  - tracks/kotlin/exercises/luhn/build.gradle
7929
7946
  - tracks/kotlin/exercises/luhn/src/main/kotlin/.keep
@@ -7942,37 +7959,43 @@ files:
7942
7959
  - tracks/kotlin/exercises/minesweeper/src/main/kotlin/.keep
7943
7960
  - tracks/kotlin/exercises/minesweeper/src/test/kotlin/MinesweeperBoardTest.kt
7944
7961
  - tracks/kotlin/exercises/nth-prime/.meta/src/reference/kotlin/Prime.kt
7962
+ - tracks/kotlin/exercises/nth-prime/.meta/version
7945
7963
  - tracks/kotlin/exercises/nth-prime/README.md
7946
7964
  - tracks/kotlin/exercises/nth-prime/build.gradle
7947
7965
  - tracks/kotlin/exercises/nth-prime/src/main/kotlin/.keep
7948
7966
  - tracks/kotlin/exercises/nth-prime/src/test/kotlin/PrimeTest.kt
7949
- - tracks/kotlin/exercises/nucleotide-count/.meta/src/reference/kotlin/DNA.kt
7967
+ - tracks/kotlin/exercises/nucleotide-count/.meta/src/reference/kotlin/Dna.kt
7968
+ - tracks/kotlin/exercises/nucleotide-count/.meta/version
7950
7969
  - tracks/kotlin/exercises/nucleotide-count/README.md
7951
7970
  - tracks/kotlin/exercises/nucleotide-count/build.gradle
7952
7971
  - tracks/kotlin/exercises/nucleotide-count/src/main/kotlin/.keep
7953
- - tracks/kotlin/exercises/nucleotide-count/src/test/kotlin/NucleotideTest.kt
7954
- - tracks/kotlin/exercises/pangram/.meta/src/reference/kotlin/Pangrams.kt
7972
+ - tracks/kotlin/exercises/nucleotide-count/src/test/kotlin/DnaTest.kt
7973
+ - tracks/kotlin/exercises/pangram/.meta/src/reference/kotlin/Pangram.kt
7955
7974
  - tracks/kotlin/exercises/pangram/.meta/version
7956
7975
  - tracks/kotlin/exercises/pangram/README.md
7957
7976
  - tracks/kotlin/exercises/pangram/build.gradle
7958
7977
  - tracks/kotlin/exercises/pangram/src/main/kotlin/.keep
7959
7978
  - tracks/kotlin/exercises/pangram/src/test/kotlin/PangramTest.kt
7960
7979
  - tracks/kotlin/exercises/pascals-triangle/.meta/src/reference/kotlin/PascalsTriangle.kt
7980
+ - tracks/kotlin/exercises/pascals-triangle/.meta/version
7961
7981
  - tracks/kotlin/exercises/pascals-triangle/README.md
7962
7982
  - tracks/kotlin/exercises/pascals-triangle/build.gradle
7963
7983
  - tracks/kotlin/exercises/pascals-triangle/src/main/kotlin/.keep
7964
7984
  - tracks/kotlin/exercises/pascals-triangle/src/test/kotlin/PascalsTriangleTest.kt
7965
7985
  - tracks/kotlin/exercises/perfect-numbers/.meta/src/reference/kotlin/NaturalNumber.kt
7986
+ - tracks/kotlin/exercises/perfect-numbers/.meta/version
7966
7987
  - tracks/kotlin/exercises/perfect-numbers/README.md
7967
7988
  - tracks/kotlin/exercises/perfect-numbers/build.gradle
7968
7989
  - tracks/kotlin/exercises/perfect-numbers/src/main/kotlin/NaturalNumber.kt
7969
- - tracks/kotlin/exercises/perfect-numbers/src/test/kotlin/PerfectNumbersTest.kt
7990
+ - tracks/kotlin/exercises/perfect-numbers/src/test/kotlin/NaturalNumberTest.kt
7970
7991
  - tracks/kotlin/exercises/phone-number/.meta/src/reference/kotlin/PhoneNumber.kt
7992
+ - tracks/kotlin/exercises/phone-number/.meta/version
7971
7993
  - tracks/kotlin/exercises/phone-number/README.md
7972
7994
  - tracks/kotlin/exercises/phone-number/build.gradle
7973
7995
  - tracks/kotlin/exercises/phone-number/src/main/kotlin/.keep
7974
7996
  - tracks/kotlin/exercises/phone-number/src/test/kotlin/PhoneNumberTest.kt
7975
7997
  - tracks/kotlin/exercises/pig-latin/.meta/src/reference/kotlin/PigLatin.kt
7998
+ - tracks/kotlin/exercises/pig-latin/.meta/version
7976
7999
  - tracks/kotlin/exercises/pig-latin/README.md
7977
8000
  - tracks/kotlin/exercises/pig-latin/build.gradle
7978
8001
  - tracks/kotlin/exercises/pig-latin/src/main/kotlin/.keep
@@ -7984,11 +8007,13 @@ files:
7984
8007
  - tracks/kotlin/exercises/prime-factors/src/main/kotlin/.keep
7985
8008
  - tracks/kotlin/exercises/prime-factors/src/test/kotlin/PrimeFactorCalculatorTest.kt
7986
8009
  - tracks/kotlin/exercises/raindrops/.meta/src/reference/kotlin/Raindrops.kt
8010
+ - tracks/kotlin/exercises/raindrops/.meta/version
7987
8011
  - tracks/kotlin/exercises/raindrops/README.md
7988
8012
  - tracks/kotlin/exercises/raindrops/build.gradle
7989
8013
  - tracks/kotlin/exercises/raindrops/src/main/kotlin/.keep
7990
8014
  - tracks/kotlin/exercises/raindrops/src/test/kotlin/RaindropsTest.kt
7991
8015
  - tracks/kotlin/exercises/react/.meta/src/reference/kotlin/React.kt
8016
+ - tracks/kotlin/exercises/react/.meta/version
7992
8017
  - tracks/kotlin/exercises/react/README.md
7993
8018
  - tracks/kotlin/exercises/react/build.gradle
7994
8019
  - tracks/kotlin/exercises/react/src/main/kotlin/React.kt
@@ -8015,6 +8040,7 @@ files:
8015
8040
  - tracks/kotlin/exercises/robot-simulator/src/starterSource/kotlin/.keep
8016
8041
  - tracks/kotlin/exercises/robot-simulator/src/test/kotlin/RobotTest.kt
8017
8042
  - tracks/kotlin/exercises/roman-numerals/.meta/src/reference/kotlin/RomanNumeral.kt
8043
+ - tracks/kotlin/exercises/roman-numerals/.meta/version
8018
8044
  - tracks/kotlin/exercises/roman-numerals/README.md
8019
8045
  - tracks/kotlin/exercises/roman-numerals/build.gradle
8020
8046
  - tracks/kotlin/exercises/roman-numerals/src/main/kotlin/.keep
@@ -8038,7 +8064,8 @@ files:
8038
8064
  - tracks/kotlin/exercises/say/build.gradle
8039
8065
  - tracks/kotlin/exercises/say/src/main/kotlin/.keep
8040
8066
  - tracks/kotlin/exercises/say/src/test/kotlin/NumberSpellerTest.kt
8041
- - tracks/kotlin/exercises/scrabble-score/.meta/src/reference/kotlin/Scrabble.kt
8067
+ - tracks/kotlin/exercises/scrabble-score/.meta/src/reference/kotlin/ScrabbleScore.kt
8068
+ - tracks/kotlin/exercises/scrabble-score/.meta/version
8042
8069
  - tracks/kotlin/exercises/scrabble-score/README.md
8043
8070
  - tracks/kotlin/exercises/scrabble-score/build.gradle
8044
8071
  - tracks/kotlin/exercises/scrabble-score/src/main/kotlin/.keep
@@ -8057,6 +8084,7 @@ files:
8057
8084
  - tracks/kotlin/exercises/series/src/test/kotlin/SeriesTest.kt
8058
8085
  - tracks/kotlin/exercises/settings.gradle
8059
8086
  - tracks/kotlin/exercises/sieve/.meta/src/reference/kotlin/Sieve.kt
8087
+ - tracks/kotlin/exercises/sieve/.meta/version
8060
8088
  - tracks/kotlin/exercises/sieve/README.md
8061
8089
  - tracks/kotlin/exercises/sieve/build.gradle
8062
8090
  - tracks/kotlin/exercises/sieve/src/main/kotlin/.keep
@@ -8070,6 +8098,7 @@ files:
8070
8098
  - tracks/kotlin/exercises/simple-cipher/src/test/kotlin/SimpleCipherTest.kt
8071
8099
  - tracks/kotlin/exercises/simple-cipher/src/test/kotlin/SubstitutionCipherTest.kt
8072
8100
  - tracks/kotlin/exercises/space-age/.meta/src/reference/kotlin/SpaceAge.kt
8101
+ - tracks/kotlin/exercises/space-age/.meta/version
8073
8102
  - tracks/kotlin/exercises/space-age/README.md
8074
8103
  - tracks/kotlin/exercises/space-age/build.gradle
8075
8104
  - tracks/kotlin/exercises/space-age/src/main/kotlin/.keep
@@ -8093,21 +8122,25 @@ files:
8093
8122
  - tracks/kotlin/exercises/sublist/src/main/kotlin/Relationship.kt
8094
8123
  - tracks/kotlin/exercises/sublist/src/test/kotlin/SublistTest.kt
8095
8124
  - tracks/kotlin/exercises/sum-of-multiples/.meta/src/reference/kotlin/SumOfMultiples.kt
8125
+ - tracks/kotlin/exercises/sum-of-multiples/.meta/version
8096
8126
  - tracks/kotlin/exercises/sum-of-multiples/README.md
8097
8127
  - tracks/kotlin/exercises/sum-of-multiples/build.gradle
8098
8128
  - tracks/kotlin/exercises/sum-of-multiples/src/main/kotlin/.keep
8099
8129
  - tracks/kotlin/exercises/sum-of-multiples/src/test/kotlin/SumOfMultiplesTest.kt
8100
8130
  - tracks/kotlin/exercises/triangle/.meta/src/reference/kotlin/Triangle.kt
8131
+ - tracks/kotlin/exercises/triangle/.meta/version
8101
8132
  - tracks/kotlin/exercises/triangle/README.md
8102
8133
  - tracks/kotlin/exercises/triangle/build.gradle
8103
8134
  - tracks/kotlin/exercises/triangle/src/main/kotlin/.keep
8104
8135
  - tracks/kotlin/exercises/triangle/src/test/kotlin/TriangleTest.kt
8105
8136
  - tracks/kotlin/exercises/two-fer/.meta/src/reference/kotlin/Twofer.kt
8137
+ - tracks/kotlin/exercises/two-fer/.meta/version
8106
8138
  - tracks/kotlin/exercises/two-fer/README.md
8107
8139
  - tracks/kotlin/exercises/two-fer/build.gradle
8108
8140
  - tracks/kotlin/exercises/two-fer/src/main/kotlin/.keep
8109
8141
  - tracks/kotlin/exercises/two-fer/src/test/kotlin/TwoferTest.kt
8110
8142
  - tracks/kotlin/exercises/word-count/.meta/src/reference/kotlin/WordCount.kt
8143
+ - tracks/kotlin/exercises/word-count/.meta/version
8111
8144
  - tracks/kotlin/exercises/word-count/README.md
8112
8145
  - tracks/kotlin/exercises/word-count/build.gradle
8113
8146
  - tracks/kotlin/exercises/word-count/src/main/kotlin/.keep
@@ -9743,6 +9776,8 @@ files:
9743
9776
  - tracks/php/exercises/connect/README.md
9744
9777
  - tracks/php/exercises/connect/connect_test.php
9745
9778
  - tracks/php/exercises/connect/example.php
9779
+ - tracks/php/exercises/crypto-square/crypto-square_test.php
9780
+ - tracks/php/exercises/crypto-square/example.php
9746
9781
  - tracks/php/exercises/difference-of-squares/README.md
9747
9782
  - tracks/php/exercises/difference-of-squares/difference-of-squares_test.php
9748
9783
  - tracks/php/exercises/difference-of-squares/example.php
@@ -9784,6 +9819,9 @@ files:
9784
9819
  - tracks/php/exercises/markdown/example.php
9785
9820
  - tracks/php/exercises/markdown/markdown.php
9786
9821
  - tracks/php/exercises/markdown/markdown_test.php
9822
+ - tracks/php/exercises/meetup/README.md
9823
+ - tracks/php/exercises/meetup/example.php
9824
+ - tracks/php/exercises/meetup/meetup_test.php
9787
9825
  - tracks/php/exercises/minesweeper/README.md
9788
9826
  - tracks/php/exercises/minesweeper/example.php
9789
9827
  - tracks/php/exercises/minesweeper/minesweeper_test.php
@@ -10322,10 +10360,15 @@ files:
10322
10360
  - tracks/python/exercises/difference-of-squares/difference_of_squares.py
10323
10361
  - tracks/python/exercises/difference-of-squares/difference_of_squares_test.py
10324
10362
  - tracks/python/exercises/difference-of-squares/example.py
10363
+ - tracks/python/exercises/diffie-hellman/.meta/hints.md
10325
10364
  - tracks/python/exercises/diffie-hellman/README.md
10326
10365
  - tracks/python/exercises/diffie-hellman/diffie_hellman.py
10327
10366
  - tracks/python/exercises/diffie-hellman/diffie_hellman_test.py
10328
10367
  - tracks/python/exercises/diffie-hellman/example.py
10368
+ - tracks/python/exercises/error-handling/README.md
10369
+ - tracks/python/exercises/error-handling/error_handling.py
10370
+ - tracks/python/exercises/error-handling/error_handling_test.py
10371
+ - tracks/python/exercises/error-handling/example.py
10329
10372
  - tracks/python/exercises/etl/README.md
10330
10373
  - tracks/python/exercises/etl/etl.py
10331
10374
  - tracks/python/exercises/etl/etl_test.py
@@ -10550,6 +10593,7 @@ files:
10550
10593
  - tracks/python/exercises/sieve/example.py
10551
10594
  - tracks/python/exercises/sieve/sieve.py
10552
10595
  - tracks/python/exercises/sieve/sieve_test.py
10596
+ - tracks/python/exercises/simple-cipher/.meta/hints.md
10553
10597
  - tracks/python/exercises/simple-cipher/README.md
10554
10598
  - tracks/python/exercises/simple-cipher/example.py
10555
10599
  - tracks/python/exercises/simple-cipher/simple_cipher.py