trackler 2.2.1.52 → 2.2.1.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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