trackler 2.2.1.66 → 2.2.1.67

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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/README.md +1 -0
  4. data/tracks/bash/exercises/anagram/anagram_tests.sh +16 -0
  5. data/tracks/bash/exercises/bob/bob_test.sh +28 -0
  6. data/tracks/bash/exercises/difference-of-squares/difference_of_squares_test.sh +3 -0
  7. data/tracks/bash/exercises/error-handling/error_handling_test.sh +5 -0
  8. data/tracks/bash/exercises/gigasecond/gigasecond_test.sh +10 -0
  9. data/tracks/bash/exercises/hamming/hamming_test.sh +15 -0
  10. data/tracks/bash/exercises/leap/leap_test.sh +10 -0
  11. data/tracks/bash/exercises/nucleotide-count/nucleotide_count_test.sh +4 -0
  12. data/tracks/bash/exercises/pangram/pangram_tests.sh +9 -0
  13. data/tracks/bash/exercises/phone-number/phone_number_tests.sh +13 -1
  14. data/tracks/bash/exercises/raindrops/raindrops_test.sh +16 -0
  15. data/tracks/bash/exercises/rna-transcription/rna_transcription_test.sh +8 -0
  16. data/tracks/bash/exercises/two-fer/two_fer_test.sh +3 -0
  17. data/tracks/bash/exercises/word-count/word_count_test.sh +9 -1
  18. data/tracks/c/exercises/hello-world/src/hello_world.c +0 -2
  19. data/tracks/c/exercises/sieve/test/test_sieve.c +13 -16
  20. data/tracks/erlang/config.json +4 -4
  21. data/tracks/fsharp/config.json +12 -0
  22. data/tracks/fsharp/exercises/Exercises.sln +6 -0
  23. data/tracks/fsharp/exercises/rotational-cipher/Example.fs +29 -0
  24. data/tracks/fsharp/exercises/rotational-cipher/Program.fs +1 -0
  25. data/tracks/fsharp/exercises/rotational-cipher/README.md +29 -0
  26. data/tracks/fsharp/exercises/rotational-cipher/RotationalCipher.fs +3 -0
  27. data/tracks/fsharp/exercises/rotational-cipher/RotationalCipher.fsproj +23 -0
  28. data/tracks/fsharp/exercises/rotational-cipher/RotationalCipherTest.fs +49 -0
  29. data/tracks/fsharp/generators/Generators.fs +3 -0
  30. data/tracks/go/exercises/grains/.meta/gen.go +99 -0
  31. data/tracks/go/exercises/grains/cases_test.go +64 -0
  32. data/tracks/go/exercises/grains/grains_test.go +4 -20
  33. data/tracks/go/exercises/space-age/space_age_test.go +3 -1
  34. data/tracks/java/config.json +12 -0
  35. data/tracks/java/exercises/beer-song/.meta/src/reference/java/BeerSong.java +4 -4
  36. data/tracks/java/exercises/diamond/src/main/java/DiamondPrinter.java +9 -0
  37. data/tracks/java/exercises/isbn-verifier/.meta/src/reference/java/IsbnVerifier.java +35 -0
  38. data/tracks/java/exercises/isbn-verifier/.meta/version +1 -0
  39. data/tracks/java/exercises/isbn-verifier/README.md +53 -0
  40. data/tracks/java/exercises/isbn-verifier/build.gradle +18 -0
  41. data/tracks/java/exercises/isbn-verifier/src/main/java/IsbnVerifier.java +7 -0
  42. data/tracks/java/exercises/isbn-verifier/src/test/java/IsbnVerifierTest.java +94 -0
  43. data/tracks/java/exercises/isogram/src/main/java/IsogramChecker.java +7 -0
  44. data/tracks/java/exercises/saddle-points/src/main/java/Matrix.java +13 -0
  45. data/tracks/java/exercises/settings.gradle +1 -0
  46. data/tracks/kotlin/config.json +1 -1
  47. data/tracks/ocaml/exercises/all-your-base/example.ml +1 -1
  48. data/tracks/ocaml/exercises/all-your-base/test.ml +9 -9
  49. data/tracks/perl6/config.json +1 -1
  50. data/tracks/perl6/docs/SNIPPET.txt +2 -2
  51. data/tracks/perl6/exercises/anagram/Anagram.pm6 +4 -1
  52. data/tracks/perl6/exercises/anagram/Example.pm6 +4 -15
  53. data/tracks/perl6/exercises/anagram/anagram.t +2 -2
  54. data/tracks/perl6/exercises/anagram/example.yaml +7 -15
  55. data/tracks/php/config.json +12 -0
  56. data/tracks/php/exercises/run-length-encoding/README.md +42 -0
  57. data/tracks/php/exercises/run-length-encoding/example.php +60 -0
  58. data/tracks/php/exercises/run-length-encoding/run-length-encoding.php +20 -0
  59. data/tracks/php/exercises/run-length-encoding/run-length-encoding_test.php +65 -0
  60. data/tracks/purescript/.travis.yml +1 -1
  61. data/tracks/purescript/bin/test.sh +9 -2
  62. data/tracks/python/config.json +7 -16
  63. data/tracks/r/exercises/hello-world/test_hello-world.R +0 -8
  64. data/tracks/racket/config.json +1 -1
  65. data/tracks/swift/config.json +12 -2
  66. data/tracks/swift/exercises/diamond/Package.swift +5 -0
  67. data/tracks/swift/exercises/diamond/README.md +64 -0
  68. data/tracks/swift/exercises/diamond/Sources/Diamond.swift +1 -0
  69. data/tracks/swift/exercises/diamond/Sources/DiamondExample.swift +30 -0
  70. data/tracks/swift/exercises/diamond/Tests/DiamondTests/DiamondTests.swift +98 -0
  71. data/tracks/swift/exercises/diamond/Tests/LinuxMain.swift +6 -0
  72. metadata +29 -8
  73. data/tracks/java/exercises/diamond/src/main/java/.keep +0 -0
  74. data/tracks/java/exercises/isogram/src/main/java/.keep +0 -0
  75. data/tracks/python/exercises/parallel-letter-frequency/README.md +0 -24
  76. data/tracks/python/exercises/parallel-letter-frequency/example.py +0 -56
  77. data/tracks/python/exercises/parallel-letter-frequency/parallel_letter_frequency.py +0 -2
  78. data/tracks/python/exercises/parallel-letter-frequency/parallel_letter_frequency_test.py +0 -61
@@ -0,0 +1,7 @@
1
+ class IsogramChecker {
2
+
3
+ boolean isIsogram(String phrase) {
4
+ throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
5
+ }
6
+
7
+ }
@@ -0,0 +1,13 @@
1
+ import java.util.List;
2
+ import java.util.Set;
3
+
4
+ class Matrix {
5
+
6
+ Matrix(List<List<Integer>> values) {
7
+ throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
8
+ }
9
+
10
+ Set<MatrixCoordinate> getSaddlePoints() {
11
+ throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
12
+ }
13
+ }
@@ -32,6 +32,7 @@ include 'hamming'
32
32
  include 'hexadecimal'
33
33
  include 'hello-world'
34
34
  include 'house'
35
+ include 'isbn-verifier'
35
36
  include 'isogram'
36
37
  include 'kindergarten-garden'
37
38
  include 'largest-series-product'
@@ -15,7 +15,7 @@
15
15
  "slug": "two-fer",
16
16
  "topics": null,
17
17
  "unlocked_by": null,
18
- "uuid": "fa4194c5-084d-f780-4db6-707ef7bcc30c00e9ee5"
18
+ "uuid": "40f85461-c256-4b96-8d5b-0509f42fab17"
19
19
  },
20
20
  {
21
21
  "core": false,
@@ -7,7 +7,7 @@ let rec to_digits (b: base) (acc: int list) = function
7
7
  | n -> to_digits b (n % b :: acc) (n / b)
8
8
 
9
9
  let convert_bases ~from ~digits ~target =
10
- if from <= 1 || target <= 1 || List.is_empty digits
10
+ if from <= 1 || target <= 1
11
11
  then None
12
12
  else
13
13
  let open Option.Monad_infix in
@@ -1,4 +1,4 @@
1
- (* Test/exercise version: "1.1.0" *)
1
+ (* Test/exercise version: "2.0.1" *)
2
2
 
3
3
  open Core
4
4
  open OUnit2
@@ -29,28 +29,28 @@ let tests = [
29
29
  "15-bit integer" >::
30
30
  ae (Some [6; 10; 45]) (convert_bases ~from:97 ~digits:[3; 46; 60] ~target:73);
31
31
  "empty list" >::
32
- ae None (convert_bases ~from:2 ~digits:[] ~target:10);
32
+ ae (Some [0]) (convert_bases ~from:2 ~digits:[] ~target:10);
33
33
  "single zero" >::
34
34
  ae (Some [0]) (convert_bases ~from:10 ~digits:[0] ~target:2);
35
35
  "multiple zeros" >::
36
36
  ae (Some [0]) (convert_bases ~from:10 ~digits:[0; 0; 0] ~target:2);
37
37
  "leading zeros" >::
38
- ae (Some [4;2]) (convert_bases ~from:7 ~digits:[0; 6; 0] ~target:10);
39
- "first base is one" >::
38
+ ae (Some [4; 2]) (convert_bases ~from:7 ~digits:[0; 6; 0] ~target:10);
39
+ "input base is one" >::
40
40
  ae None (convert_bases ~from:1 ~digits:[] ~target:10);
41
- "first base is zero" >::
41
+ "input base is zero" >::
42
42
  ae None (convert_bases ~from:0 ~digits:[] ~target:10);
43
- "first base is negative" >::
43
+ "input base is negative" >::
44
44
  ae None (convert_bases ~from:(-2) ~digits:[1] ~target:10);
45
45
  "negative digit" >::
46
46
  ae None (convert_bases ~from:2 ~digits:[1; -1; 1; 0; 1; 0] ~target:10);
47
47
  "invalid positive digit" >::
48
48
  ae None (convert_bases ~from:2 ~digits:[1; 2; 1; 0; 1; 0] ~target:10);
49
- "second base is one" >::
49
+ "output base is one" >::
50
50
  ae None (convert_bases ~from:2 ~digits:[1; 0; 1; 0; 1; 0] ~target:1);
51
- "second base is zero" >::
51
+ "output base is zero" >::
52
52
  ae None (convert_bases ~from:10 ~digits:[7] ~target:0);
53
- "second base is negative" >::
53
+ "output base is negative" >::
54
54
  ae None (convert_bases ~from:2 ~digits:[1] ~target:(-7));
55
55
  "both bases are negative" >::
56
56
  ae None (convert_bases ~from:(-2) ~digits:[1] ~target:(-7));
@@ -233,7 +233,7 @@
233
233
  "slug": "anagram",
234
234
  "core": false,
235
235
  "unlocked_by": null,
236
- "difficulty": 5,
236
+ "difficulty": 4,
237
237
  "topics": [
238
238
 
239
239
  ]
@@ -1,6 +1,6 @@
1
1
  say my $candidates = all
2
- (‘Alphabet’, subdermatoglyphic’,
3
- ‘Emily Jung Schwartzkopf’).pick: 2;
2
+ «Alphabet subdermatoglyphic
3
+ ‘Emily Jung Schwartzkopf’».pick: 2;
4
4
 
5
5
  say “All isograms? {$_ ?? ‘✔’ !! ‘❌’}”
6
6
  given is-isogram($candidates).so;
@@ -1 +1,4 @@
1
- unit module Anagram:ver<1>;
1
+ unit module Anagram:ver<2>;
2
+
3
+ sub match-anagrams (:$subject!, :@candidates!) is export {
4
+ }
@@ -1,18 +1,7 @@
1
- unit module Anagram:ver<1>;
1
+ unit module Anagram:ver<2>;
2
2
 
3
- sub match-anagrams ($word, @words) is export {
4
- my @results;
5
- my $canonical = canonize($word);
6
- for @words -> $w {
7
- next if $w.lc eq $word.lc;
8
- my $try = canonize($w);
9
- if $try eq $canonical {
10
- @results.push: $w;
11
- }
3
+ sub match-anagrams ( :$subject!, :@candidates! ) is export {
4
+ given $subject.uc -> $ucs {
5
+ @candidates.grep: { given .uc {$_ ne $ucs && .comb ~~ $ucs.comb.Bag} }
12
6
  }
13
- @results;
14
- }
15
-
16
- sub canonize ($str) {
17
- (($str.lc.split('')).sort).join('');
18
7
  }
@@ -5,7 +5,7 @@ use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
7
  my Str:D $exercise := 'Anagram';
8
- my Version:D $version = v1;
8
+ my Version:D $version = v2;
9
9
  my Str $module //= $exercise;
10
10
  plan 18;
11
11
 
@@ -22,7 +22,7 @@ if ::($exercise).^ver !~~ $version {
22
22
  require ::($module) <&match-anagrams>;
23
23
 
24
24
  my $c-data = from-json $=pod.pop.contents;
25
- is match-anagrams(|.<subject candidates>), |.<expected description> for @($c-data<cases>);
25
+ cmp-ok match-anagrams( |%(.<subject candidates>:p) ), '~~', .<expected>.Set, .<description> for $c-data<cases>.values;
26
26
 
27
27
  =head2 Canonical Data
28
28
  =begin code
@@ -1,25 +1,17 @@
1
1
  exercise: Anagram
2
- version: 1
2
+ version: 2
3
3
  plan: 18
4
4
  imports: '&match-anagrams'
5
5
  tests: |-
6
- is match-anagrams(|.<subject candidates>), |.<expected description> for @($c-data<cases>);
6
+ cmp-ok match-anagrams( |%(.<subject candidates>:p) ), '~~', .<expected>.Set, .<description> for $c-data<cases>.values;
7
7
 
8
8
  unit: module
9
9
  example: |-
10
- sub match-anagrams ($word, @words) is export {
11
- my @results;
12
- my $canonical = canonize($word);
13
- for @words -> $w {
14
- next if $w.lc eq $word.lc;
15
- my $try = canonize($w);
16
- if $try eq $canonical {
17
- @results.push: $w;
18
- }
10
+ sub match-anagrams ( :$subject!, :@candidates! ) is export {
11
+ given $subject.uc -> $ucs {
12
+ @candidates.grep: { given .uc {$_ ne $ucs && .comb ~~ $ucs.comb.Bag} }
19
13
  }
20
- @results;
21
14
  }
22
-
23
- sub canonize ($str) {
24
- (($str.lc.split('')).sort).join('');
15
+ stub: |-
16
+ sub match-anagrams (:$subject!, :@candidates!) is export {
25
17
  }
@@ -48,6 +48,18 @@
48
48
  "Control-flow (if-else statements)"
49
49
  ]
50
50
  },
51
+ {
52
+ "uuid": "0a453685-55c2-47e2-88b2-e26d1d8fbde9",
53
+ "slug": "run-length-encoding",
54
+ "core": false,
55
+ "unlocked_by": null,
56
+ "difficulty": 1,
57
+ "topics": [
58
+ "strings",
59
+ "algorithms",
60
+ "text_formatting"
61
+ ]
62
+ },
51
63
  {
52
64
  "uuid": "4f15fc17-f68e-43bc-9417-403dd6d03f4f",
53
65
  "slug": "pangram",
@@ -0,0 +1,42 @@
1
+ # Run Length Encoding
2
+
3
+ Implement run-length encoding and decoding.
4
+
5
+ Run-length encoding (RLE) is a simple form of data compression, where runs
6
+ (consecutive data elements) are replaced by just one data value and count.
7
+
8
+ For example we can represent the original 53 characters with only 13.
9
+
10
+ ```text
11
+ "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB" -> "12WB12W3B24WB"
12
+ ```
13
+
14
+ RLE allows the original data to be perfectly reconstructed from
15
+ the compressed data, which makes it a lossless data compression.
16
+
17
+ ```text
18
+ "AABCCCDEEEE" -> "2AB3CD4E" -> "AABCCCDEEEE"
19
+ ```
20
+
21
+ For simplicity, you can assume that the unencoded string will only contain
22
+ the letters A through Z (either lower or upper case) and whitespace. This way
23
+ data to be encoded will never contain any numbers and numbers inside data to
24
+ be decoded always represent the count for the following character.
25
+
26
+ ## Submitting Exercises
27
+
28
+ 1. Get [PHPUnit].
29
+
30
+ % wget --no-check-certificate https://phar.phpunit.de/phpunit.phar
31
+ % chmod +x phpunit.phar
32
+
33
+ 2. Execute the tests for an assignment.
34
+
35
+ % phpunit.phar run-length-encoding/run-length-encoding_test.php
36
+
37
+ ## Source
38
+
39
+ Wikipedia [https://en.wikipedia.org/wiki/Run-length_encoding](https://en.wikipedia.org/wiki/Run-length_encoding)
40
+
41
+ ## Submitting Incomplete Solutions
42
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,60 @@
1
+ <?php
2
+
3
+ /**
4
+ * @param string $input
5
+ * @return string
6
+ */
7
+ function encode($input)
8
+ {
9
+ if (!$input) {
10
+ return '';
11
+ }
12
+
13
+ $output = '';
14
+ $prev = $letter = null;
15
+ $count = 1;
16
+
17
+ foreach (str_split($input) as $letter) {
18
+ if ($letter === $prev) {
19
+ $count++;
20
+ } else {
21
+ if ($count > 1) {
22
+ $output .= $count;
23
+ }
24
+ $output .= $prev;
25
+ $count = 1;
26
+ }
27
+
28
+ $prev = $letter;
29
+ }
30
+
31
+ if ($count > 1) {
32
+ $output .= $count;
33
+ }
34
+ $output .= $letter;
35
+
36
+ return $output;
37
+ }
38
+
39
+ /**
40
+ * @param string $input
41
+ * @return string
42
+ */
43
+ function decode($input)
44
+ {
45
+ $output = '';
46
+ preg_match_all('/([1-9]*)(\w|\s)/', $input, $matches);
47
+
48
+ $length = count($matches[0]);
49
+ for ($i = 0; $i < $length; $i++) {
50
+ $count = $matches[1][$i];
51
+ if ($count === '') {
52
+ $count = 1;
53
+ }
54
+ $letter = $matches[2][$i];
55
+
56
+ $output .= str_repeat($letter, (int) $count);
57
+ }
58
+
59
+ return $output;
60
+ }
@@ -0,0 +1,20 @@
1
+ <?php
2
+
3
+ //
4
+ // This is only a SKELETON file for the "Run Length Encoding" exercise. It's been provided as a
5
+ // convenience to get you started writing code faster.
6
+ //
7
+
8
+ function encode($input)
9
+ {
10
+ //
11
+ // YOUR CODE GOES HERE
12
+ //
13
+ }
14
+
15
+ function decode($input)
16
+ {
17
+ //
18
+ // YOUR CODE GOES HERE
19
+ //
20
+ }
@@ -0,0 +1,65 @@
1
+ <?php
2
+
3
+ require "run-length-encoding.php";
4
+
5
+ /**
6
+ * Class RunLengthEncodingTest
7
+ */
8
+ class RunLengthEncodingTest extends PHPUnit\Framework\TestCase
9
+ {
10
+ public function testEncodeEmptyString()
11
+ {
12
+ $this->assertEquals('', encode(''));
13
+ }
14
+
15
+ public function testEncodeSingleCharactersOnly()
16
+ {
17
+ $this->assertEquals('XYZ', encode('XYZ'));
18
+ }
19
+
20
+ public function testDecodeEmptyString()
21
+ {
22
+ $this->assertEquals('', decode(''));
23
+ }
24
+
25
+ public function testDecodeSingleCharactersOnly()
26
+ {
27
+ $this->assertEquals('XYZ', decode('XYZ'));
28
+ }
29
+
30
+ public function testEncodeSimple()
31
+ {
32
+ $this->assertEquals('2A3B4C', encode('AABBBCCCC'));
33
+ }
34
+
35
+ public function testDecodeSimple()
36
+ {
37
+ $this->assertEquals('AABBBCCCC', decode('2A3B4C'));
38
+ }
39
+
40
+ public function testEncodeWithSingleValues()
41
+ {
42
+ $this->assertEquals(
43
+ '12WB12W3B24WB',
44
+ encode('WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB')
45
+ );
46
+ }
47
+
48
+ public function testDecodeWithSingleValues()
49
+ {
50
+ $this->assertEquals(
51
+ 'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB',
52
+ decode('12WB12W3B24WB')
53
+ );
54
+ }
55
+
56
+ public function testDecodeMultipleWhitespaceMixedInString()
57
+ {
58
+ $this->assertEquals(' hsqq qww ', decode('2 hs2q q2w2 '));
59
+ }
60
+
61
+ public function testEncodeDecodeCombination()
62
+ {
63
+ $this->assertEquals('zzz ZZ zZ', decode(encode('zzz ZZ zZ')));
64
+ }
65
+ }
@@ -11,7 +11,7 @@ script:
11
11
  - bin/fetch-configlet
12
12
  - bin/configlet --track-id purescript lint .
13
13
  - bin/check-bower.sh
14
- - bin/test.sh
14
+ - LIMIT_CORES=1 bin/test.sh
15
15
 
16
16
  cache:
17
17
  directories:
@@ -58,7 +58,14 @@ node etc/test-module-updater.js $work_dir/test
58
58
  cd $work_dir
59
59
 
60
60
  time bower install
61
- time pulp test
61
+
62
+ # CI reports that we can use more cores than we can, so limit
63
+ # the number we attempt to use to prevent slowdown on CI.
64
+ if [[ -z "$LIMIT_CORES" ]]; then
65
+ time pulp test -j 2
66
+ else
67
+ time pulp test
68
+ fi
62
69
 
63
70
  test_result=$?
64
71
 
@@ -71,4 +78,4 @@ else
71
78
  echo -e "\e[1;31m[ Some tests have failed ]\e[0;39m"
72
79
  fi
73
80
 
74
- exit $test_result
81
+ exit $test_result
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "language": "Python",
3
+ "blurb": "Python is a clear and powerful object-oriented programming language with an elegant and easy-to-read syntax. It is ideal for prototyping and ad-hoc tasks, but also sees wide use in scientific computing, web development, and automation.",
3
4
  "active": true,
4
5
  "exercises": [
5
6
  {
@@ -54,20 +55,6 @@
54
55
  "logic"
55
56
  ]
56
57
  },
57
- {
58
- "uuid": "c4754efd-6d67-48bd-994e-4b07a217ffc3",
59
- "slug": "parallel-letter-frequency",
60
- "core": false,
61
- "unlocked_by": null,
62
- "difficulty": 5,
63
- "topics": [
64
- "threading",
65
- "parallellism",
66
- "loops",
67
- "queues",
68
- "strings"
69
- ]
70
- },
71
58
  {
72
59
  "uuid": "ca7c5ef1-5135-4fb4-8e68-669ef0f2a51a",
73
60
  "slug": "rna-transcription",
@@ -1105,6 +1092,8 @@
1105
1092
  {
1106
1093
  "uuid": "6f530d0c-d13e-4270-b120-e42c16691a66",
1107
1094
  "slug": "two-bucket",
1095
+ "core": false,
1096
+ "unlocked_by": null,
1108
1097
  "difficulty": 5,
1109
1098
  "topics": [
1110
1099
  "algorithms",
@@ -1115,6 +1104,8 @@
1115
1104
  {
1116
1105
  "uuid": "88610b9a-6d3e-4924-a092-6d2f907ed4e2",
1117
1106
  "slug": "markdown",
1107
+ "core": false,
1108
+ "unlocked_by": null,
1118
1109
  "difficulty": 3,
1119
1110
  "topics": [
1120
1111
  "refactoring"
@@ -1201,7 +1192,7 @@
1201
1192
  ]
1202
1193
  },
1203
1194
  {
1204
- "uuid": "6f196341-0ffc-9780-a7ca-1f817508247161cbcd9",
1195
+ "uuid": "df7cd9b9-283a-4466-accf-98c4a7609450",
1205
1196
  "slug": "binary-search-tree",
1206
1197
  "core": false,
1207
1198
  "unlocked_by": null,
@@ -1271,6 +1262,6 @@
1271
1262
  }
1272
1263
  ],
1273
1264
  "foregone": [
1274
-
1265
+ "parallel-letter-frequency"
1275
1266
  ]
1276
1267
  }