trackler 2.2.1.66 → 2.2.1.67

Sign up to get free protection for your applications and to get access to all the features.
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
  }