trackler 2.2.1.107 → 2.2.1.108

Sign up to get free protection for your applications and to get access to all the features.
Files changed (397) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/pig-latin/description.md +4 -4
  4. data/tracks/c/config.json +42 -0
  5. data/tracks/c/exercises/bracket-push/README.md +3 -0
  6. data/tracks/c/exercises/bracket-push/makefile +25 -0
  7. data/tracks/c/exercises/bracket-push/src/example.c +52 -0
  8. data/tracks/c/exercises/bracket-push/src/example.h +7 -0
  9. data/tracks/c/exercises/bracket-push/test/test_bracket_push.c +132 -0
  10. data/tracks/c/exercises/bracket-push/test/vendor/unity.c +1300 -0
  11. data/tracks/c/exercises/bracket-push/test/vendor/unity.h +274 -0
  12. data/tracks/c/exercises/bracket-push/test/vendor/unity_internals.h +701 -0
  13. data/tracks/c/exercises/etl/README.md +46 -0
  14. data/tracks/c/exercises/etl/makefile +25 -0
  15. data/tracks/c/exercises/etl/src/example.c +44 -0
  16. data/tracks/c/exercises/etl/src/example.h +18 -0
  17. data/tracks/c/exercises/etl/test/test_etl.c +120 -0
  18. data/tracks/c/exercises/etl/test/vendor/unity.c +1300 -0
  19. data/tracks/c/exercises/etl/test/vendor/unity.h +274 -0
  20. data/tracks/c/exercises/etl/test/vendor/unity_internals.h +701 -0
  21. data/tracks/c/exercises/luhn/README.md +64 -0
  22. data/tracks/c/exercises/luhn/makefile +25 -0
  23. data/tracks/c/exercises/luhn/src/example.c +38 -0
  24. data/tracks/c/exercises/luhn/src/example.h +7 -0
  25. data/tracks/c/exercises/luhn/test/test_luhn.c +109 -0
  26. data/tracks/c/exercises/luhn/test/vendor/unity.c +1300 -0
  27. data/tracks/c/exercises/luhn/test/vendor/unity.h +274 -0
  28. data/tracks/c/exercises/luhn/test/vendor/unity_internals.h +701 -0
  29. data/tracks/c/exercises/prime-factors/README.md +29 -0
  30. data/tracks/c/exercises/prime-factors/makefile +25 -0
  31. data/tracks/c/exercises/prime-factors/src/example.c +28 -0
  32. data/tracks/c/exercises/prime-factors/src/example.h +11 -0
  33. data/tracks/c/exercises/prime-factors/test/test_prime_factors.c +96 -0
  34. data/tracks/c/exercises/prime-factors/test/vendor/unity.c +1300 -0
  35. data/tracks/c/exercises/prime-factors/test/vendor/unity.h +274 -0
  36. data/tracks/c/exercises/prime-factors/test/vendor/unity_internals.h +701 -0
  37. data/tracks/clojure/exercises/hello-world/src/example.clj +2 -3
  38. data/tracks/clojure/exercises/hello-world/test/hello_world_test.clj +0 -6
  39. data/tracks/common-lisp/README.md +3 -8
  40. data/tracks/common-lisp/config/exercise_readme.go.tmpl +1 -1
  41. data/tracks/common-lisp/exercises/acronym/README.md +1 -1
  42. data/tracks/common-lisp/exercises/acronym/acronym-test.lisp +0 -5
  43. data/tracks/common-lisp/exercises/allergies/README.md +1 -1
  44. data/tracks/common-lisp/exercises/anagram/README.md +1 -1
  45. data/tracks/common-lisp/exercises/atbash-cipher/README.md +1 -1
  46. data/tracks/common-lisp/exercises/beer-song/README.md +1 -1
  47. data/tracks/common-lisp/exercises/binary/README.md +1 -1
  48. data/tracks/common-lisp/exercises/bob/README.md +1 -1
  49. data/tracks/common-lisp/exercises/collatz-conjecture/README.md +1 -1
  50. data/tracks/common-lisp/exercises/crypto-square/README.md +1 -1
  51. data/tracks/common-lisp/exercises/difference-of-squares/README.md +1 -1
  52. data/tracks/common-lisp/exercises/etl/README.md +1 -1
  53. data/tracks/common-lisp/exercises/gigasecond/README.md +1 -1
  54. data/tracks/common-lisp/exercises/grade-school/README.md +1 -1
  55. data/tracks/common-lisp/exercises/grains/README.md +1 -1
  56. data/tracks/common-lisp/exercises/hamming/README.md +1 -1
  57. data/tracks/common-lisp/exercises/hello-world/README.md +1 -1
  58. data/tracks/common-lisp/exercises/isogram/README.md +1 -1
  59. data/tracks/common-lisp/exercises/leap/README.md +1 -1
  60. data/tracks/common-lisp/exercises/meetup/README.md +1 -1
  61. data/tracks/common-lisp/exercises/nucleotide-count/README.md +1 -1
  62. data/tracks/common-lisp/exercises/pascals-triangle/README.md +1 -1
  63. data/tracks/common-lisp/exercises/perfect-numbers/README.md +1 -1
  64. data/tracks/common-lisp/exercises/phone-number/README.md +1 -1
  65. data/tracks/common-lisp/exercises/prime-factors/README.md +1 -1
  66. data/tracks/common-lisp/exercises/raindrops/README.md +1 -1
  67. data/tracks/common-lisp/exercises/rna-transcription/README.md +1 -1
  68. data/tracks/common-lisp/exercises/robot-name/README.md +1 -1
  69. data/tracks/common-lisp/exercises/roman-numerals/README.md +1 -1
  70. data/tracks/common-lisp/exercises/scrabble-score/README.md +1 -1
  71. data/tracks/common-lisp/exercises/sieve/README.md +1 -1
  72. data/tracks/common-lisp/exercises/space-age/README.md +1 -1
  73. data/tracks/common-lisp/exercises/strain/README.md +1 -1
  74. data/tracks/common-lisp/exercises/sublist/README.md +1 -1
  75. data/tracks/common-lisp/exercises/triangle/README.md +1 -1
  76. data/tracks/common-lisp/exercises/trinary/README.md +1 -1
  77. data/tracks/common-lisp/exercises/word-count/README.md +1 -1
  78. data/tracks/csharp/exercises/meetup/MeetupTest.cs +177 -177
  79. data/tracks/csharp/exercises/robot-simulator/Example.cs +27 -27
  80. data/tracks/csharp/exercises/robot-simulator/RobotSimulator.cs +3 -3
  81. data/tracks/csharp/exercises/robot-simulator/RobotSimulatorTest.cs +152 -31
  82. data/tracks/csharp/generators/Exercises/Meetup.cs +8 -9
  83. data/tracks/csharp/generators/Exercises/RobotSimulator.cs +116 -0
  84. data/tracks/delphi/exercises/allergies/uAllergyTests.pas +28 -0
  85. data/tracks/delphi/exercises/binary-search/uBinarySearchExample.pas +6 -0
  86. data/tracks/delphi/exercises/binary-search/uBinarySearchTest.pas +53 -37
  87. data/tracks/delphi/exercises/collatz-conjecture/uCollatzconjectureTest.pas +3 -0
  88. data/tracks/delphi/exercises/etl/uETLtests.pas +13 -10
  89. data/tracks/delphi/exercises/grains/uGrainsTests.pas +5 -2
  90. data/tracks/delphi/exercises/hamming/uHammingTests.pas +3 -0
  91. data/tracks/delphi/exercises/hello-world/uTestHelloWorld.pas +3 -0
  92. data/tracks/delphi/exercises/leap/uLeapTests.pas +3 -0
  93. data/tracks/delphi/exercises/minesweeper/uMineSweeperTest.pas +3 -0
  94. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +5 -17
  95. data/tracks/delphi/exercises/perfect-numbers/uPerfectNumbersExample.pas +6 -0
  96. data/tracks/delphi/exercises/perfect-numbers/uPerfectNumbersTest.pas +77 -26
  97. data/tracks/delphi/exercises/pig-latin/README.md +4 -4
  98. data/tracks/delphi/exercises/pig-latin/uTestPigLatin.pas +12 -9
  99. data/tracks/delphi/exercises/poker/uPokerExample.pas +81 -26
  100. data/tracks/delphi/exercises/poker/uPokerTest.pas +343 -121
  101. data/tracks/delphi/exercises/raindrops/uRaindropsTest.pas +3 -0
  102. data/tracks/delphi/exercises/saddle-points/uSaddlePointsExample.pas +4 -3
  103. data/tracks/delphi/exercises/saddle-points/uSaddlePointsTests.pas +25 -47
  104. data/tracks/delphi/exercises/triangle/uTestTriangle.pas +4 -2
  105. data/tracks/delphi/exercises/two-fer/utwoferTest.pas +3 -0
  106. data/tracks/delphi/exercises/wordy/uWordyTests.pas +3 -0
  107. data/tracks/ecmascript/.travis.yml +2 -1
  108. data/tracks/ecmascript/config.json +14 -0
  109. data/tracks/ecmascript/exercises/accumulate/package.json +1 -2
  110. data/tracks/ecmascript/exercises/acronym/package.json +1 -2
  111. data/tracks/ecmascript/exercises/all-your-base/package.json +1 -2
  112. data/tracks/ecmascript/exercises/allergies/package.json +1 -2
  113. data/tracks/ecmascript/exercises/alphametics/package.json +1 -2
  114. data/tracks/ecmascript/exercises/anagram/package.json +1 -2
  115. data/tracks/ecmascript/exercises/atbash-cipher/package.json +1 -2
  116. data/tracks/ecmascript/exercises/beer-song/package.json +1 -2
  117. data/tracks/ecmascript/exercises/binary-search-tree/package.json +1 -2
  118. data/tracks/ecmascript/exercises/binary-search/package.json +1 -2
  119. data/tracks/ecmascript/exercises/binary/package.json +1 -2
  120. data/tracks/ecmascript/exercises/bob/README.md +2 -0
  121. data/tracks/ecmascript/exercises/bob/bob.spec.js +5 -5
  122. data/tracks/ecmascript/exercises/bob/example.js +7 -2
  123. data/tracks/ecmascript/exercises/bob/package.json +1 -2
  124. data/tracks/ecmascript/exercises/bowling/package.json +1 -2
  125. data/tracks/ecmascript/exercises/bracket-push/package.json +1 -2
  126. data/tracks/ecmascript/exercises/change/package.json +1 -2
  127. data/tracks/ecmascript/exercises/circular-buffer/package.json +1 -2
  128. data/tracks/ecmascript/exercises/clock/package.json +1 -2
  129. data/tracks/ecmascript/exercises/collatz-conjecture/package.json +1 -2
  130. data/tracks/ecmascript/exercises/complex-numbers/package.json +1 -2
  131. data/tracks/ecmascript/exercises/connect/package.json +1 -2
  132. data/tracks/ecmascript/exercises/crypto-square/package.json +1 -2
  133. data/tracks/ecmascript/exercises/custom-set/package.json +1 -2
  134. data/tracks/ecmascript/exercises/diamond/package.json +1 -2
  135. data/tracks/ecmascript/exercises/difference-of-squares/package.json +1 -2
  136. data/tracks/ecmascript/exercises/diffie-hellman/package.json +1 -2
  137. data/tracks/ecmascript/exercises/etl/package.json +1 -2
  138. data/tracks/ecmascript/exercises/flatten-array/package.json +1 -2
  139. data/tracks/ecmascript/exercises/food-chain/package.json +1 -2
  140. data/tracks/ecmascript/exercises/gigasecond/package.json +1 -2
  141. data/tracks/ecmascript/exercises/grade-school/package.json +1 -2
  142. data/tracks/ecmascript/exercises/grains/package.json +1 -2
  143. data/tracks/ecmascript/exercises/hamming/package.json +1 -2
  144. data/tracks/ecmascript/exercises/hello-world/package.json +1 -2
  145. data/tracks/ecmascript/exercises/hexadecimal/package.json +1 -2
  146. data/tracks/ecmascript/exercises/house/package.json +1 -2
  147. data/tracks/ecmascript/exercises/isbn-verifier/package.json +1 -2
  148. data/tracks/ecmascript/exercises/isogram/package.json +1 -2
  149. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +1 -2
  150. data/tracks/ecmascript/exercises/largest-series-product/package.json +1 -2
  151. data/tracks/ecmascript/exercises/leap/package.json +1 -2
  152. data/tracks/ecmascript/exercises/linked-list/package.json +1 -2
  153. data/tracks/ecmascript/exercises/list-ops/package.json +1 -2
  154. data/tracks/ecmascript/exercises/luhn/package.json +1 -2
  155. data/tracks/ecmascript/exercises/matrix/package.json +1 -2
  156. data/tracks/ecmascript/exercises/meetup/package.json +1 -2
  157. data/tracks/ecmascript/exercises/minesweeper/package.json +1 -2
  158. data/tracks/ecmascript/exercises/nth-prime/package.json +1 -2
  159. data/tracks/ecmascript/exercises/nucleotide-count/README.md +60 -0
  160. data/tracks/ecmascript/exercises/nucleotide-count/example.js +13 -0
  161. data/tracks/ecmascript/exercises/nucleotide-count/nucleotide-count.spec.js +23 -0
  162. data/tracks/ecmascript/exercises/nucleotide-count/package.json +70 -0
  163. data/tracks/ecmascript/exercises/ocr-numbers/package.json +1 -2
  164. data/tracks/ecmascript/exercises/octal/package.json +1 -2
  165. data/tracks/ecmascript/exercises/palindrome-products/package.json +1 -2
  166. data/tracks/ecmascript/exercises/pangram/package.json +1 -2
  167. data/tracks/ecmascript/exercises/pascals-triangle/package.json +1 -2
  168. data/tracks/ecmascript/exercises/perfect-numbers/package.json +1 -2
  169. data/tracks/ecmascript/exercises/phone-number/package.json +1 -2
  170. data/tracks/ecmascript/exercises/pig-latin/package.json +1 -2
  171. data/tracks/ecmascript/exercises/prime-factors/package.json +1 -2
  172. data/tracks/ecmascript/exercises/protein-translation/package.json +1 -2
  173. data/tracks/ecmascript/exercises/proverb/package.json +1 -2
  174. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +1 -2
  175. data/tracks/ecmascript/exercises/queen-attack/package.json +1 -2
  176. data/tracks/ecmascript/exercises/raindrops/package.json +1 -2
  177. data/tracks/ecmascript/exercises/react/package.json +1 -2
  178. data/tracks/ecmascript/exercises/rectangles/package.json +1 -2
  179. data/tracks/ecmascript/exercises/rna-transcription/package.json +1 -2
  180. data/tracks/ecmascript/exercises/robot-name/package.json +1 -2
  181. data/tracks/ecmascript/exercises/robot-simulator/package.json +1 -2
  182. data/tracks/ecmascript/exercises/roman-numerals/package.json +1 -2
  183. data/tracks/ecmascript/exercises/rotational-cipher/package.json +1 -2
  184. data/tracks/ecmascript/exercises/run-length-encoding/package.json +1 -2
  185. data/tracks/ecmascript/exercises/saddle-points/package.json +1 -2
  186. data/tracks/ecmascript/exercises/say/package.json +1 -2
  187. data/tracks/ecmascript/exercises/scrabble-score/package.json +1 -2
  188. data/tracks/ecmascript/exercises/secret-handshake/package.json +1 -2
  189. data/tracks/ecmascript/exercises/series/package.json +1 -2
  190. data/tracks/ecmascript/exercises/sieve/package.json +1 -2
  191. data/tracks/ecmascript/exercises/simple-cipher/package.json +1 -2
  192. data/tracks/ecmascript/exercises/simple-linked-list/package.json +1 -2
  193. data/tracks/ecmascript/exercises/space-age/package.json +1 -2
  194. data/tracks/ecmascript/exercises/spiral-matrix/package.json +1 -2
  195. data/tracks/ecmascript/exercises/strain/package.json +1 -2
  196. data/tracks/ecmascript/exercises/sublist/package.json +1 -2
  197. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +1 -2
  198. data/tracks/ecmascript/exercises/transpose/package.json +1 -2
  199. data/tracks/ecmascript/exercises/triangle/package.json +1 -2
  200. data/tracks/ecmascript/exercises/trinary/package.json +1 -2
  201. data/tracks/ecmascript/exercises/twelve-days/package.json +1 -2
  202. data/tracks/ecmascript/exercises/two-bucket/package.json +1 -2
  203. data/tracks/ecmascript/exercises/two-fer/package.json +1 -2
  204. data/tracks/ecmascript/exercises/word-count/package.json +1 -2
  205. data/tracks/ecmascript/exercises/word-search/package.json +1 -2
  206. data/tracks/ecmascript/exercises/wordy/package.json +1 -2
  207. data/tracks/ecmascript/package.json +1 -2
  208. data/tracks/elm/config.json +13 -1
  209. data/tracks/elm/exercises/binary-search/BinarySearch.elm +9 -0
  210. data/tracks/elm/exercises/binary-search/BinarySearch.example.elm +36 -0
  211. data/tracks/elm/exercises/binary-search/README.md +71 -0
  212. data/tracks/elm/exercises/binary-search/elm-package.json +15 -0
  213. data/tracks/elm/exercises/binary-search/tests/Tests.elm +66 -0
  214. data/tracks/elm/exercises/binary-search/tests/elm-package.json +17 -0
  215. data/tracks/elm/exercises/hamming/Hamming.example.elm +3 -3
  216. data/tracks/elm/exercises/hamming/tests/Tests.elm +14 -14
  217. data/tracks/go/exercises/word-search/.meta/gen.go +9 -7
  218. data/tracks/go/exercises/word-search/cases_test.go +2 -2
  219. data/tracks/groovy/config.json +12 -0
  220. data/tracks/groovy/exercises/bank-account/BankAccount.groovy +30 -0
  221. data/tracks/groovy/exercises/bank-account/BankAccountSpec.groovy +200 -0
  222. data/tracks/groovy/exercises/bank-account/Example.groovy +47 -0
  223. data/tracks/groovy/exercises/bank-account/README.md +75 -0
  224. data/tracks/groovy/exercises/phone-number/Example.groovy +10 -14
  225. data/tracks/groovy/exercises/phone-number/PhoneNumber.groovy +2 -14
  226. data/tracks/groovy/exercises/phone-number/PhoneNumberSpec.groovy +39 -26
  227. data/tracks/groovy/exercises/phone-number/README.md +1 -1
  228. data/tracks/java/config.json +13 -0
  229. data/tracks/java/exercises/forth/README.md +10 -0
  230. data/tracks/java/exercises/rna-transcription/.meta/version +1 -1
  231. data/tracks/java/exercises/settings.gradle +1 -0
  232. data/tracks/java/exercises/sieve/.meta/version +1 -1
  233. data/tracks/java/exercises/spiral-matrix/.meta/version +1 -1
  234. data/tracks/java/exercises/triangle/.meta/version +1 -1
  235. data/tracks/java/exercises/two-bucket/README.md +1 -1
  236. data/tracks/java/exercises/zipper/.meta/src/reference/java/Zipper.java +199 -0
  237. data/tracks/java/exercises/zipper/.meta/version +1 -0
  238. data/tracks/java/exercises/zipper/README.md +42 -0
  239. data/tracks/java/exercises/zipper/build.gradle +18 -0
  240. data/tracks/java/exercises/zipper/src/main/java/.keep +0 -0
  241. data/tracks/java/exercises/zipper/src/test/java/ZipperTest.java +204 -0
  242. data/tracks/javascript/package.json +10 -0
  243. data/tracks/ocaml/.travis-ci.sh +1 -1
  244. data/tracks/ocaml/.travis.yml +1 -1
  245. data/tracks/ocaml/README.md +1 -1
  246. data/tracks/ocaml/config/exercise_readme.go.tmpl +2 -0
  247. data/tracks/python/config.json +13 -0
  248. data/tracks/python/exercises/all-your-base/all_your_base.py +1 -1
  249. data/tracks/python/exercises/all-your-base/all_your_base_test.py +8 -8
  250. data/tracks/python/exercises/alphametics/alphametics_test.py +49 -9
  251. data/tracks/python/exercises/binary-search-tree/binary_search_tree.py +11 -5
  252. data/tracks/python/exercises/binary-search-tree/binary_search_tree_test.py +89 -48
  253. data/tracks/python/exercises/binary-search-tree/example.py +42 -52
  254. data/tracks/python/exercises/binary-search/binary_search_test.py +1 -1
  255. data/tracks/python/exercises/book-store/book_store_test.py +18 -39
  256. data/tracks/python/exercises/book-store/example.py +1 -1
  257. data/tracks/python/exercises/bowling/bowling.py +0 -2
  258. data/tracks/python/exercises/bowling/bowling_test.py +49 -13
  259. data/tracks/python/exercises/bowling/example.py +85 -135
  260. data/tracks/python/exercises/bracket-push/bracket_push.py +1 -1
  261. data/tracks/python/exercises/bracket-push/bracket_push_test.py +16 -16
  262. data/tracks/python/exercises/bracket-push/example.py +2 -2
  263. data/tracks/python/exercises/change/change_test.py +17 -4
  264. data/tracks/python/exercises/change/example.py +2 -2
  265. data/tracks/python/exercises/circular-buffer/circular_buffer.py +12 -0
  266. data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +4 -11
  267. data/tracks/python/exercises/clock/clock.py +10 -1
  268. data/tracks/python/exercises/clock/clock_test.py +9 -9
  269. data/tracks/python/exercises/clock/example.py +4 -1
  270. data/tracks/python/exercises/collatz-conjecture/collatz_conjecture_test.py +15 -5
  271. data/tracks/python/exercises/collatz-conjecture/example.py +1 -1
  272. data/tracks/python/exercises/complex-numbers/complex_numbers_test.py +37 -26
  273. data/tracks/python/exercises/custom-set/custom_set_test.py +1 -1
  274. data/tracks/python/exercises/diamond/diamond_test.py +1 -1
  275. data/tracks/python/exercises/dominoes/dominoes_test.py +1 -1
  276. data/tracks/python/exercises/forth/forth_test.py +1 -1
  277. data/tracks/python/exercises/house/example.py +11 -3
  278. data/tracks/python/exercises/house/house.py +1 -5
  279. data/tracks/python/exercises/house/house_test.py +269 -116
  280. data/tracks/python/exercises/list-ops/list_ops_test.py +1 -1
  281. data/tracks/python/exercises/luhn/luhn.py +3 -0
  282. data/tracks/python/exercises/luhn/luhn_test.py +1 -1
  283. data/tracks/python/exercises/markdown/markdown_test.py +2 -3
  284. data/tracks/python/exercises/minesweeper/minesweeper_test.py +1 -1
  285. data/tracks/python/exercises/nth-prime/nth_prime_test.py +1 -1
  286. data/tracks/python/exercises/ocr-numbers/ocr_numbers_test.py +1 -1
  287. data/tracks/python/exercises/palindrome-products/palindrome_products_test.py +14 -6
  288. data/tracks/python/exercises/perfect-numbers/perfect_numbers_test.py +1 -24
  289. data/tracks/python/exercises/phone-number/phone_number_test.py +11 -3
  290. data/tracks/python/exercises/poker/example.py +4 -3
  291. data/tracks/python/exercises/poker/poker.py +1 -1
  292. data/tracks/python/exercises/poker/poker_test.py +196 -119
  293. data/tracks/python/exercises/pov/example.py +3 -3
  294. data/tracks/python/exercises/pov/pov.py +2 -2
  295. data/tracks/python/exercises/pov/pov_test.py +19 -18
  296. data/tracks/python/exercises/protein-translation/protein_translation_test.py +14 -24
  297. data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher_test.py +1 -1
  298. data/tracks/python/exercises/rational-numbers/README.md +59 -0
  299. data/tracks/python/exercises/rational-numbers/example.py +58 -0
  300. data/tracks/python/exercises/rational-numbers/rational_numbers.py +34 -0
  301. data/tracks/python/exercises/rational-numbers/rational_numbers_test.py +132 -0
  302. data/tracks/python/exercises/rectangles/rectangles_test.py +1 -1
  303. data/tracks/python/exercises/roman-numerals/roman_numerals_test.py +2 -1
  304. data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +2 -2
  305. data/tracks/python/exercises/saddle-points/saddle_points_test.py +18 -18
  306. data/tracks/python/exercises/scale-generator/example.py +4 -5
  307. data/tracks/python/exercises/scale-generator/scale_generator.py +2 -2
  308. data/tracks/python/exercises/scale-generator/scale_generator_test.py +38 -73
  309. data/tracks/python/exercises/secret-handshake/secret_handshake_test.py +1 -1
  310. data/tracks/python/exercises/tournament/tournament_test.py +1 -1
  311. data/tracks/python/exercises/twelve-days/example.py +3 -8
  312. data/tracks/python/exercises/twelve-days/twelve_days.py +1 -9
  313. data/tracks/python/exercises/twelve-days/twelve_days_test.py +51 -50
  314. data/tracks/python/exercises/two-bucket/example.py +3 -4
  315. data/tracks/python/exercises/two-bucket/two_bucket.py +1 -1
  316. data/tracks/python/exercises/two-bucket/two_bucket_test.py +8 -13
  317. data/tracks/python/exercises/two-fer/two_fer_test.py +8 -9
  318. data/tracks/python/exercises/variable-length-quantity/variable_length_quantity_test.py +1 -1
  319. data/tracks/python/exercises/word-count/word_count_test.py +8 -14
  320. data/tracks/python/exercises/word-search/word_search.py +3 -15
  321. data/tracks/python/exercises/word-search/word_search_test.py +1 -1
  322. data/tracks/python/exercises/wordy/wordy_test.py +1 -1
  323. data/tracks/python/exercises/zebra-puzzle/example.py +11 -2
  324. data/tracks/python/exercises/zebra-puzzle/zebra_puzzle.py +5 -1
  325. data/tracks/python/exercises/zebra-puzzle/zebra_puzzle_test.py +8 -5
  326. data/tracks/python/exercises/zipper/zipper_test.py +24 -30
  327. data/tracks/scala/exercises/dominoes/src/test/scala/DominoesTest.scala +2 -2
  328. data/tracks/scala/exercises/flatten-array/src/test/scala/FlattenArrayTest.scala +1 -1
  329. data/tracks/scala/exercises/food-chain/example.scala +3 -3
  330. data/tracks/scala/exercises/food-chain/src/test/scala/FoodChainTest.scala +12 -12
  331. data/tracks/scala/exercises/forth/src/test/scala/ForthTest.scala +35 -10
  332. data/tracks/scala/exercises/gigasecond/src/test/scala/GigasecondTest.scala +2 -2
  333. data/tracks/scala/exercises/hamming/src/test/scala/HammingTest.scala +4 -4
  334. data/tracks/scala/exercises/hello-world/src/test/scala/HelloWorldTest.scala +2 -3
  335. data/tracks/scala/exercises/house/example.scala +4 -5
  336. data/tracks/scala/exercises/house/src/test/scala/HouseTest.scala +16 -17
  337. data/tracks/scala/exercises/isogram/src/test/scala/IsogramTest.scala +3 -3
  338. data/tracks/scala/exercises/kindergarten-garden/src/test/scala/GardenTest.scala +1 -29
  339. data/tracks/scala/exercises/largest-series-product/src/test/scala/SeriesTest.scala +20 -17
  340. data/tracks/scala/exercises/leap/src/test/scala/LeapTest.scala +3 -3
  341. data/tracks/scala/exercises/luhn/src/test/scala/LuhnTest.scala +3 -3
  342. data/tracks/scala/exercises/matrix/example.scala +5 -1
  343. data/tracks/scala/exercises/matrix/src/test/scala/MatrixTest.scala +48 -12
  344. data/tracks/scala/exercises/meetup/src/test/scala/MeetupTest.scala +2 -1
  345. data/tracks/scala/exercises/minesweeper/src/test/scala/MinesweeperTest.scala +9 -9
  346. data/tracks/scala/testgen/src/main/scala/DominoesTestGenerator.scala +6 -6
  347. data/tracks/scala/testgen/src/main/scala/FlattenArrayTestGenerator.scala +6 -6
  348. data/tracks/scala/testgen/src/main/scala/FoodChainTestGenerator.scala +10 -12
  349. data/tracks/scala/testgen/src/main/scala/ForthTestGenerator.scala +6 -6
  350. data/tracks/scala/testgen/src/main/scala/GigasecondTestGenerator.scala +6 -4
  351. data/tracks/scala/testgen/src/main/scala/HammingTestGenerator.scala +3 -3
  352. data/tracks/scala/testgen/src/main/scala/HouseTestGenerator.scala +10 -16
  353. data/tracks/scala/testgen/src/main/scala/IsogramTestGenerator.scala +1 -1
  354. data/tracks/scala/testgen/src/main/scala/KindergartenGardenTestGenerator.scala +6 -5
  355. data/tracks/scala/testgen/src/main/scala/LeapTestGenerator.scala +3 -3
  356. data/tracks/scala/testgen/src/main/scala/LuhnTestGenerator.scala +1 -1
  357. data/tracks/scala/testgen/src/main/scala/MatrixTestGenerator.scala +35 -0
  358. data/tracks/scala/testgen/src/main/scala/MeetupTestGenerator.scala +14 -11
  359. data/tracks/scala/testgen/src/main/scala/MinesweeperTestGenerator.scala +1 -1
  360. data/tracks/scala/testgen/src/main/scala/SeriesTestGenerator.scala +3 -3
  361. data/tracks/typescript/config/exercise_readme.go.tmpl +25 -4
  362. data/tracks/typescript/exercises/acronym/README.md +7 -2
  363. data/tracks/typescript/exercises/atbash-cipher/README.md +2 -1
  364. data/tracks/typescript/exercises/beer-song/README.md +2 -2
  365. data/tracks/typescript/exercises/binary-search-tree/README.md +2 -0
  366. data/tracks/typescript/exercises/circular-buffer/README.md +16 -7
  367. data/tracks/typescript/exercises/clock/README.md +6 -0
  368. data/tracks/typescript/exercises/diamond/README.md +8 -7
  369. data/tracks/typescript/exercises/etl/README.md +3 -1
  370. data/tracks/typescript/exercises/food-chain/README.md +1 -1
  371. data/tracks/typescript/exercises/grade-school/README.md +0 -1
  372. data/tracks/typescript/exercises/hello-world/.meta/hints.md +378 -0
  373. data/tracks/typescript/exercises/hello-world/README.md +37 -11
  374. data/tracks/typescript/exercises/largest-series-product/README.md +1 -6
  375. data/tracks/typescript/exercises/leap/README.md +1 -1
  376. data/tracks/typescript/exercises/linked-list/README.md +20 -15
  377. data/tracks/typescript/exercises/nth-prime/README.md +7 -2
  378. data/tracks/typescript/exercises/ocr-numbers/README.md +7 -6
  379. data/tracks/typescript/exercises/pangram/README.md +1 -1
  380. data/tracks/typescript/exercises/pascals-triangle/README.md +1 -1
  381. data/tracks/typescript/exercises/phone-number/README.md +4 -3
  382. data/tracks/typescript/exercises/prime-factors/README.md +1 -12
  383. data/tracks/typescript/exercises/pythagorean-triplet/README.md +3 -7
  384. data/tracks/typescript/exercises/rna-transcription/README.md +2 -2
  385. data/tracks/typescript/exercises/robot-simulator/README.md +3 -1
  386. data/tracks/typescript/exercises/scrabble-score/README.md +3 -1
  387. data/tracks/typescript/exercises/series/README.md +0 -4
  388. data/tracks/typescript/exercises/space-age/README.md +1 -1
  389. data/tracks/typescript/exercises/strain/README.md +6 -0
  390. data/tracks/typescript/exercises/sum-of-multiples/README.md +4 -7
  391. data/tracks/typescript/exercises/two-bucket/README.md +15 -19
  392. data/tracks/typescript/exercises/word-count/README.md +1 -2
  393. data/tracks/typescript/exercises/wordy/README.md +0 -5
  394. metadata +61 -5
  395. data/tracks/common-lisp/exercises/bob/.meta/description.md +0 -10
  396. data/tracks/javascript/.eslintrc.json +0 -10
  397. data/tracks/typescript/docs/EXERCISE_README_INSERT.md +0 -24
@@ -1,8 +1,11 @@
1
1
  unit uPerfectNumbers;
2
2
 
3
3
  interface
4
+ uses System.SysUtils;
4
5
 
5
6
  type
7
+ ENotNaturalNumber = class(Exception);
8
+
6
9
  NumberType = (Perfect, Abundant, Deficient);
7
10
 
8
11
  PerfectNumber = class
@@ -16,6 +19,9 @@ class function PerfectNumber.Classify(aNumber: Integer): NumberType;
16
19
  var sumOfFactors: integer;
17
20
  i: integer;
18
21
  begin
22
+ if aNumber < 1 then
23
+ raise ENotNaturalNumber.Create('Classification is only possible for natural numbers.');
24
+
19
25
  sumOfFactors := 0;
20
26
 
21
27
  for i := 1 to aNumber - 1 do
@@ -4,94 +4,145 @@ interface
4
4
  uses
5
5
  DUnitX.TestFramework;
6
6
 
7
+ const
8
+ CanonicalVersion = '1.1.0';
9
+
7
10
  type
8
11
 
9
12
  [TestFixture]
10
- PerfectNumbersTest = class(TObject)
13
+ PerfectNumbersTest = class(TObject)
11
14
  public
12
15
  [Test]
13
- // [Ignore('Comment the "[Ignore]" statement to run the test')]
14
- procedure Can_classify_3_as_deficient;
16
+ // [Ignore('Comment the "[Ignore]" statement to run the test')]
17
+ procedure Smallest_perfect_number_is_classified_correctly;
18
+
19
+ [Test]
20
+ [Ignore]
21
+ procedure Medium_perfect_number_is_classified_correctly;
22
+
23
+ [Test]
24
+ [Ignore]
25
+ procedure Large_perfect_number_is_classified_correctly;
26
+
27
+ [Test]
28
+ [Ignore]
29
+ procedure Smallest_abundant_number_is_classified_correctly;
15
30
 
16
31
  [Test]
17
32
  [Ignore]
18
- procedure Can_classify_7_as_deficient;
33
+ procedure Medium_abundant_number_is_classified_correctly;
19
34
 
20
35
  [Test]
21
36
  [Ignore]
22
- procedure Can_classify_13_as_deficient;
37
+ procedure Large_abundant_number_is_classified_correctly;
23
38
 
24
39
  [Test]
25
40
  [Ignore]
26
- procedure Can_classify_6_as_perfect;
41
+ procedure Smallest_prime_deficient_number_is_classified_correctly;
27
42
 
28
43
  [Test]
29
44
  [Ignore]
30
- procedure Can_classify_28_as_perfect;
45
+ procedure Smallest_non_prime_deficient_number_is_classified_correctly;
31
46
 
32
47
  [Test]
33
48
  [Ignore]
34
- procedure Can_classify_496_as_perfect;
49
+ procedure Medium_deficient_number_is_classified_correctly;
35
50
 
36
51
  [Test]
37
52
  [Ignore]
38
- procedure Can_classify_12_as_abundant;
53
+ procedure Large_deficient_number_is_classified_correctly;
39
54
 
40
55
  [Test]
41
56
  [Ignore]
42
- procedure Can_classify_18_as_abundant;
57
+ procedure Edge_case_no_factors_other_than_itself_is_classified_correctly;
43
58
 
44
59
  [Test]
45
60
  [Ignore]
46
- procedure Can_classify_20_as_abundant;
61
+ procedure Zero_is_rejected_not_a_natural_number;
62
+
63
+ [Test]
64
+ [Ignore]
65
+ procedure Negative_integer_is_rejected_not_a_natural_number;
47
66
  end;
48
67
 
49
68
  implementation
50
69
  uses uPerfectNumbers;
51
70
 
52
- procedure PerfectNumbersTest.Can_classify_3_as_deficient;
71
+ procedure PerfectNumbersTest.Smallest_prime_deficient_number_is_classified_correctly;
53
72
  begin
54
- Assert.AreEqual(Deficient, PerfectNumber.Classify(3));
73
+ Assert.AreEqual(Deficient, PerfectNumber.Classify(2));
55
74
  end;
56
75
 
57
- procedure PerfectNumbersTest.Can_classify_7_as_deficient;
76
+ procedure PerfectNumbersTest.Smallest_non_prime_deficient_number_is_classified_correctly;
58
77
  begin
59
- Assert.AreEqual(Deficient, PerfectNumber.Classify(7));
78
+ Assert.AreEqual(Deficient, PerfectNumber.Classify(4));
60
79
  end;
61
80
 
62
- procedure PerfectNumbersTest.Can_classify_13_as_deficient;
81
+ procedure PerfectNumbersTest.Medium_deficient_number_is_classified_correctly;
63
82
  begin
64
- Assert.AreEqual(Deficient, PerfectNumber.Classify(13));
83
+ Assert.AreEqual(Deficient, PerfectNumber.Classify(32));
65
84
  end;
66
85
 
67
- procedure PerfectNumbersTest.Can_classify_6_as_perfect;
86
+ procedure PerfectNumbersTest.Large_deficient_number_is_classified_correctly;
87
+ begin
88
+ Assert.AreEqual(Deficient, PerfectNumber.Classify(33550337));
89
+ end;
90
+
91
+ procedure PerfectNumbersTest.Edge_case_no_factors_other_than_itself_is_classified_correctly;
92
+ begin
93
+ Assert.AreEqual(Deficient, PerfectNumber.Classify(1));
94
+ end;
95
+
96
+ procedure PerfectNumbersTest.Smallest_perfect_number_is_classified_correctly;
68
97
  begin
69
98
  Assert.AreEqual(Perfect, PerfectNumber.Classify(6));
70
99
  end;
71
100
 
72
- procedure PerfectNumbersTest.Can_classify_28_as_perfect;
101
+ procedure PerfectNumbersTest.Medium_perfect_number_is_classified_correctly;
73
102
  begin
74
103
  Assert.AreEqual(Perfect, PerfectNumber.Classify(28));
75
104
  end;
76
105
 
77
- procedure PerfectNumbersTest.Can_classify_496_as_perfect;
106
+ procedure PerfectNumbersTest.Large_perfect_number_is_classified_correctly;
78
107
  begin
79
- Assert.AreEqual(Perfect, PerfectNumber.Classify(496));
108
+ Assert.AreEqual(Perfect, PerfectNumber.Classify(33550336));
80
109
  end;
81
110
 
82
- procedure PerfectNumbersTest.Can_classify_12_as_abundant;
111
+ procedure PerfectNumbersTest.Smallest_abundant_number_is_classified_correctly;
83
112
  begin
84
113
  Assert.AreEqual(Abundant, PerfectNumber.Classify(12));
85
114
  end;
86
115
 
87
- procedure PerfectNumbersTest.Can_classify_18_as_abundant;
116
+ procedure PerfectNumbersTest.Medium_abundant_number_is_classified_correctly;
88
117
  begin
89
- Assert.AreEqual(Abundant, PerfectNumber.Classify(18));
118
+ Assert.AreEqual(Abundant, PerfectNumber.Classify(30));
90
119
  end;
91
120
 
92
- procedure PerfectNumbersTest.Can_classify_20_as_abundant;
121
+ procedure PerfectNumbersTest.Large_abundant_number_is_classified_correctly;
93
122
  begin
94
- Assert.AreEqual(Abundant, PerfectNumber.Classify(20));
123
+ Assert.AreEqual(Abundant, PerfectNumber.Classify(33550335));
124
+ end;
125
+
126
+ procedure PerfectNumbersTest.Zero_is_rejected_not_a_natural_number;
127
+ var MyProc: TTestLocalMethod;
128
+ begin
129
+ MyProc := procedure
130
+ begin
131
+ PerfectNumber.Classify(0);
132
+ end;
133
+
134
+ assert.WillRaiseWithMessage(MyProc, ENotNaturalNumber, 'Classification is only possible for natural numbers.');
135
+ end;
136
+
137
+ procedure PerfectNumbersTest.Negative_integer_is_rejected_not_a_natural_number;
138
+ var MyProc: TTestLocalMethod;
139
+ begin
140
+ MyProc := procedure
141
+ begin
142
+ PerfectNumber.Classify(-1);
143
+ end;
144
+
145
+ assert.WillRaiseWithMessage(MyProc, ENotNaturalNumber, 'Classification is only possible for natural numbers.');
95
146
  end;
96
147
 
97
148
  initialization
@@ -7,10 +7,10 @@ confusing. It obeys a few simple rules (below), but when it's spoken
7
7
  quickly it's really difficult for non-children (and non-native speakers)
8
8
  to understand.
9
9
 
10
- - **Rule 1**: If a word begins with a vowel sound, add an "ay" sound to
11
- the end of the word.
12
- - **Rule 2**: If a word begins with a consonant sound, move it to the
13
- end of the word, and then add an "ay" sound to the end of the word.
10
+ - **Rule 1**: If a word begins with a vowel sound, add an "ay" sound to the end of the word. Please note that "xr" and "yt" at the beginning of a word make vowel sounds (e.g. "xray" -> "xrayay", "yttria" -> "yttriaay").
11
+ - **Rule 2**: If a word begins with a consonant sound, move it to the end of the word and then add an "ay" sound to the end of the word. Consonant sounds can be made up of multiple consonants, a.k.a. a consonant cluster (e.g. "chair" -> "airchay").
12
+ - **Rule 3**: If a word starts with a consonant sound followed by "qu", move it to the end of the word, and then add an "ay" sound to the end of the word (e.g. "square" -> "aresquay").
13
+ - **Rule 4**: If a word contains a "y" after a consonant cluster or as the second letter in a two letter word it makes a vowel sound (e.g. "rhythm" -> "ythmrhay", "my" -> "ymay").
14
14
 
15
15
  There are a few more rules for edge cases, and there are regional
16
16
  variants too.
@@ -4,6 +4,9 @@ interface
4
4
  uses
5
5
  DUnitX.TestFramework;
6
6
 
7
+ const
8
+ CanonicalVersion = '1.2.0';
9
+
7
10
  type
8
11
  [TestFixture]
9
12
  PigLatinTest = class(TObject)
@@ -32,15 +35,6 @@ type
32
35
  [Ignore]
33
36
  procedure Word_beginning_with_k;
34
37
 
35
- [Ignore]
36
- procedure y_is_treated_like_a_consonant_at_the_beginning_of_a_word;
37
-
38
- [Ignore]
39
- procedure y_is_treated_like_a_vowel_at_the_end_of_a_consonant_cluster;
40
-
41
- [Ignore]
42
- procedure y_as_second_letter_in_two_letter_word;
43
-
44
38
  [Ignore]
45
39
  procedure Word_beginning_with_x;
46
40
 
@@ -71,6 +65,15 @@ type
71
65
  [Ignore]
72
66
  procedure Word_beginning_with_xr;
73
67
 
68
+ [Ignore]
69
+ procedure y_is_treated_like_a_consonant_at_the_beginning_of_a_word;
70
+
71
+ [Ignore]
72
+ procedure y_is_treated_like_a_vowel_at_the_end_of_a_consonant_cluster;
73
+
74
+ [Ignore]
75
+ procedure y_as_second_letter_in_two_letter_word;
76
+
74
77
  [Ignore]
75
78
  procedure A_whole_phrase;
76
79
  end;
@@ -12,18 +12,22 @@ type
12
12
  Rank,
13
13
  Suit: integer;
14
14
  end;
15
+ Scores = record
16
+ Score: integer;
17
+ TieBreakerScore: integer;
18
+ end;
15
19
  Hand = record
16
20
  Input: string;
17
- Score: integer;
21
+ handResult: Scores;
18
22
  end;
19
- class function ParseHand(aHand: string): Hand; static;
20
- class function ParseCards(aHand: string): TArray<Card>; static;
21
- class function ParseCard(aCard: string): Card; static;
22
- class function ParseRank(aCard: string): integer; static;
23
- class function ParseSuit(aCard: string): integer; static;
24
- class function ScoreHand(aCards: TArray<Card>): integer; static;
23
+ class function ParseHand(aHand: string): Hand;
24
+ class function ParseCards(aHand: string): TArray<Card>;
25
+ class function ParseCard(aCard: string): Card;
26
+ class function ParseRank(aCard: string): integer;
27
+ class function ParseSuit(aCard: string): integer;
28
+ class function ScoreHand(aCards: TArray<Card>): Scores;
25
29
  public
26
- class function BestHands(aHands: TList<String>): TList<string>; static;
30
+ class function BestHands(aHands: TList<String>): TList<string>;
27
31
  end;
28
32
 
29
33
  implementation
@@ -38,8 +42,8 @@ class function Poker.BestHands(aHands: TList<String>): TList<string>;
38
42
  begin
39
43
  lResult := 0;
40
44
  for aItem in aList do
41
- if aItem.Score > lResult then
42
- lResult := aItem.score;
45
+ if aItem.handResult.Score > lResult then
46
+ lResult := aItem.handResult.Score;
43
47
  result := lResult;
44
48
  end;
45
49
 
@@ -52,33 +56,61 @@ class function Poker.BestHands(aHands: TList<String>): TList<string>;
52
56
  end;
53
57
 
54
58
  function ListOfWinningHands(const aTarget: integer; aList: IList<Hand>): IList<string>;
59
+
60
+ function MaxTieBreakerScore: integer;
61
+ var
62
+ aItem: Hand;
63
+ lResult: integer;
64
+ begin
65
+ lResult := 0;
66
+ for aItem in aList do
67
+ if aItem.handResult.TieBreakerScore > lResult then
68
+ lResult := aItem.handResult.TieBreakerScore;
69
+ result := lResult;
70
+ end;
71
+
55
72
  var aItem: Hand;
73
+ lmaxTieBreakerScore: integer;
56
74
  begin
57
75
  result := TCollections.CreateList<string>;
76
+ lmaxTieBreakerScore := MaxTieBreakerScore;
58
77
  for aItem in aList do
59
- if aItem.Score = aTarget then
78
+ if aItem.handResult.TieBreakerScore = lmaxTieBreakerScore then
60
79
  result.Add(aItem.Input);
61
80
  end;
81
+
82
+ function MaxHands(aScoredHands: IList<Hand>; aMaxScore: integer): IList<Hand>;
83
+ var
84
+ lHand: Hand;
85
+ begin
86
+ result := TCollections.CreateList<Hand>;
87
+ for lHand in aScoredHands do
88
+ if lHand.handResult.Score = aMaxScore then
89
+ result.Add(lHand);
90
+ end;
62
91
  {$endregion}
63
92
 
64
93
  var scoredHands: IList<Hand>;
65
94
  lmaxScore: integer;
95
+ lmaxHands: IList<Hand>;
66
96
  begin
67
97
  scoredHands := ScoreHands(aHands);
68
98
  lMaxScore := MaxScore(scoredHands);
99
+ lmaxHands := MaxHands(scoredHands, lMaxScore);
69
100
 
70
101
  result := TList<string>.Create;
71
- result.AddRange(ListOfWinningHands(lMaxScore, scoredHands).ToArray);
102
+ result.AddRange(ListOfWinningHands(lMaxScore, lmaxHands).ToArray);
72
103
  end;
73
104
 
74
105
  class function Poker.ParseHand(aHand: string): Hand;
75
106
  begin
76
107
  result.Input := aHand;
77
- result.Score := ScoreHand(ParseCards(aHand));
108
+ result.handResult := ScoreHand(ParseCards(aHand));
78
109
  end;
79
110
 
80
111
  class function Poker.ParseCards(aHand: string): TArray<Card>;
81
112
  var lhand: TArray<string>;
113
+ lhandReplace10: string;
82
114
  lCardStr: string;
83
115
  lParsedHand: IList<Card>;
84
116
  begin
@@ -88,7 +120,8 @@ begin
88
120
  result := TComparer<integer>.Default.Compare(left.Rank, right.Rank);
89
121
  end);
90
122
 
91
- lhand := aHand.Split([' ']);
123
+ lhandReplace10 := aHand.Replace('10', 'T');
124
+ lhand := lhandReplace10.Split([' ']);
92
125
  for lCardStr in lhand do
93
126
  lParsedHand.Add(ParseCard(lCardStr));
94
127
  lParsedHand.Sort;
@@ -122,7 +155,7 @@ begin
122
155
  result := lSuits.IndexOf(lCard[high(lCard)]);
123
156
  end;
124
157
 
125
- class function Poker.ScoreHand(aCards: TArray<Card>): integer;
158
+ class function Poker.ScoreHand(aCards: TArray<Card>): Scores;
126
159
 
127
160
  {$region 'ScoreHand Workers'}
128
161
  function CardsByRankOccurance: IList<integer>;
@@ -139,11 +172,14 @@ class function Poker.ScoreHand(aCards: TArray<Card>): integer;
139
172
  result.Add(0);
140
173
  for rank := High(lRankOccurence) downto Low(lRankOccurence) + 2 do
141
174
  begin
142
- if lRankOccurence[rank] >= currentOccurenceCount then
175
+ if (lRankOccurence[rank] >= currentOccurenceCount) then
143
176
  begin
144
177
  result.Insert(0,rank);
145
178
  currentOccurenceCount := lRankOccurence[rank];
146
- end;
179
+ end
180
+ else
181
+ if lRankOccurence[rank] > 0 then
182
+ result.Insert(1,rank);
147
183
  end;
148
184
  end;
149
185
 
@@ -222,31 +258,50 @@ begin
222
258
  flush := Distinct(Suits) = 1;
223
259
  straight := (Distinct(Ranks) = 5) and ((Ranks[0] - Ranks[4]) = 4);
224
260
 
261
+ fillchar(result, SizeOf(Scores), #0);
225
262
  if straight and flush then
226
- result := 800 + Ranks.First
263
+ result.Score := 800 + Ranks.First
227
264
  else
228
265
  if listOfRankCounts.EqualsTo([4,1]) then // 4 of a kind
229
- result := 700 + listOfCardsByRank[0]
266
+ begin
267
+ result.Score := 700 + listOfCardsByRank[0];
268
+ result.TieBreakerScore := listOfCardsByRank[1];
269
+ end
230
270
  else
231
271
  if listOfRankCounts.EqualsTo([3,2]) then // full house
232
- result := 600 + listOfCardsByRank[0]
272
+ begin
273
+ result.Score := 600 + listOfCardsByRank[0];
274
+ result.TieBreakerScore := listofCardsByRank[1];
275
+ end
233
276
  else
234
277
  if flush then
235
- result := 500 + Ranks.First
278
+ result.Score := 500 + Ranks.First
236
279
  else
237
280
  if straight then
238
- result := 400 + Ranks.First
281
+ result.Score := 400 + Ranks.First
239
282
  else
240
283
  if listOfRankCounts.EqualsTo([3,1,1]) then //3 of a kind
241
- result := 300 + listOfCardsByRank[0]
284
+ begin
285
+ result.Score := 300 + listOfCardsByRank[0];
286
+ result.TieBreakerScore := listOfCardsByRank[2];
287
+ end
242
288
  else
243
289
  if listOfRankCounts.EqualsTo([2,2,1]) then // 2 pair
244
- result := 200 + Math.Max(listOfCardsByRank[0], listOfCardsByRank[1])
290
+ begin
291
+ result.Score := 200 + listOfCardsByRank[0] + listOfCardsByRank[1];
292
+ result.TieBreakerScore := Ranks.Min;
293
+ end
245
294
  else
246
295
  if listOfRankCounts.EqualsTo([2,1,1,1]) then // 1 pair
247
- result := 100 + listOfCardsByRank[0]
296
+ begin
297
+ result.Score := 100 + listOfCardsByRank[0];
298
+ result.TieBreakerScore := 0;
299
+ end
248
300
  else
249
- result := Ranks.Max; // high card
301
+ begin
302
+ result.Score := Ranks.Max; // high card
303
+ result.TieBreakerScore := Ranks.Min;
304
+ end;
250
305
 
251
306
  end;
252
307