From 746742b1803d8bdeea2b635d77b337a9efc79544 Mon Sep 17 00:00:00 2001 From: ihollander Date: Wed, 9 Jun 2021 06:23:04 -0400 Subject: [PATCH] Initial commit --- .../README.md | 49 ++ .../01-algorithmic-problem-solving/README.md | 124 +++++ 00-welcome/02-a-note-on-testing/README.md | 16 + 00-welcome/03-problem-solving-tips/README.md | 54 +++ .../00-day-1--reverse-a-string/.gitignore | 4 + .../00-day-1--reverse-a-string/README.md | 53 +++ .../javascript/package.json | 19 + .../javascript/reverse_string.js | 19 + .../javascript/tests/reverse_string.test.js | 21 + .../00-day-1--reverse-a-string/ruby/.rspec | 1 + .../00-day-1--reverse-a-string/ruby/Gemfile | 7 + .../ruby/reverse_string.rb | 18 + .../ruby/spec/reverse_string_spec.rb | 23 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/reverse_string.js | 47 ++ .../solutions/reverse_string.rb | 49 ++ .../01-day-2--find-first-duplicate/.gitignore | 4 + .../01-day-2--find-first-duplicate/README.md | 49 ++ .../javascript/find_first_duplicate.js | 19 + .../javascript/package.json | 19 + .../tests/find_first_duplicate.test.js | 17 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/find_first_duplicate.rb | 18 + .../ruby/spec/find_first_duplicate_spec.rb | 19 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/find_first_duplicate.js | 62 +++ .../solutions/find_first_duplicate.rb | 59 +++ .../02-day-3--fibonacci-series/.gitignore | 4 + .../02-day-3--fibonacci-series/README.md | 54 +++ .../javascript/fibonacci.js | 24 + .../javascript/package.json | 19 + .../javascript/tests/fibonacci.test.js | 13 + .../02-day-3--fibonacci-series/ruby/.rspec | 1 + .../02-day-3--fibonacci-series/ruby/Gemfile | 7 + .../ruby/fibonacci.rb | 23 + .../ruby/spec/fibonacci_spec.rb | 15 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/fibonacci.js | 67 +++ .../solutions/fibonacci.rb | 63 +++ .../03-day-4--selection-sort/.gitignore | 4 + .../03-day-4--selection-sort/README.md | 64 +++ .../javascript/package.json | 19 + .../javascript/selection_sort.js | 23 + .../javascript/tests/selection_sort.test.js | 26 ++ .../03-day-4--selection-sort/ruby/.rspec | 1 + .../03-day-4--selection-sort/ruby/Gemfile | 7 + .../ruby/selection_sort.rb | 21 + .../ruby/spec/selection_sort_spec.rb | 27 ++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/selection_sort.js | 84 ++++ .../solutions/selection_sort.rb | 78 ++++ .../04-day-5--find-shortest-string/.gitignore | 4 + .../04-day-5--find-shortest-string/README.md | 68 +++ .../javascript/find_shortest_string.js | 26 ++ .../javascript/package.json | 19 + .../tests/find_shortest_string.test.js | 17 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/find_shortest_string.rb | 25 + .../ruby/spec/find_shortest_string_spec.rb | 19 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/find_shortest_string.js | 70 +++ .../solutions/find_shortest_string.rb | 70 +++ .../00-introduction-to-recursion/README.md | 120 +++++ .../01-day-1--recursive-counting/.gitignore | 4 + .../01-day-1--recursive-counting/README.md | 57 +++ .../javascript/package.json | 19 + .../javascript/recursive_count.js | 13 + .../javascript/tests/recursive_count.test.js | 14 + .../01-day-1--recursive-counting/ruby/.rspec | 1 + .../01-day-1--recursive-counting/ruby/Gemfile | 7 + .../ruby/recursive_count.rb | 11 + .../ruby/spec/recursive_count_spec.rb | 11 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/recursive_count.js | 27 ++ .../solutions/recursive_count.rb | 17 + .../02-day-2--recursive-search/.gitignore | 4 + .../02-day-2--recursive-search/README.md | 77 ++++ .../javascript/package.json | 19 + .../javascript/recursive_search.js | 19 + .../javascript/tests/recursive_search.test.js | 17 + .../02-day-2--recursive-search/ruby/.rspec | 1 + .../02-day-2--recursive-search/ruby/Gemfile | 7 + .../ruby/recursive_search.rb | 18 + .../ruby/spec/recursive_search_spec.rb | 18 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/recursive_search.js | 52 +++ .../solutions/recursive_search.rb | 43 ++ .../.gitignore | 4 + .../README.md | 90 ++++ .../javascript/fibonacci_recursive.js | 24 + .../javascript/package.json | 19 + .../tests/fibonacci_recursive.test.js | 13 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/fibonacci_recursive.rb | 23 + .../ruby/spec/fibonacci_recursive_spec.rb | 15 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/fibonacci_recursive.js | 53 +++ .../solutions/fibonacci_recursive.rb | 49 ++ .../.gitignore | 4 + .../README.md | 72 +++ .../benchmark/benchmark.js | 17 + .../benchmark/benchmark.rb | 14 + .../find_shortest_string_recursive.js | 24 + .../javascript/package.json | 19 + .../find_shortest_string_recursive.test.js | 17 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/find_shortest_string_recursive.rb | 23 + .../ruby/spec/find_shortest_string_spec.rb | 19 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/benchmark/benchmark.js | 28 ++ .../solutions/benchmark/benchmark.rb | 26 ++ .../find_shortest_string_recursive.js | 58 +++ .../find_shortest_string_recursive.rb | 55 +++ .../.gitignore | 4 + .../README.md | 81 ++++ .../benchmark/benchmark.js | 17 + .../benchmark/benchmark.rb | 14 + .../javascript/package.json | 19 + .../javascript/selection_sort_recursive.js | 16 + .../tests/selection_sort_recursive.test.js | 26 ++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/selection_sort_recursive.rb | 16 + .../spec/selection_sort_recursive_spec.rb | 27 ++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/benchmark/benchmark.js | 43 ++ .../solutions/benchmark/benchmark.rb | 38 ++ .../solutions/selection_sort_recursive.js | 68 +++ .../solutions/selection_sort_recursive.rb | 64 +++ .../.gitignore | 4 + .../README.md | 52 +++ .../javascript/balancing_parentheses.js | 24 + .../javascript/package.json | 19 + .../tests/balancing_parentheses.test.js | 25 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/balancing_parentheses.rb | 23 + .../ruby/spec/balancing_parentheses_spec.rb | 25 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/balancing_parentheses.js | 100 ++++ .../solutions/balancing_parentheses.rb | 99 ++++ .../.gitignore | 4 + .../README.md | 54 +++ .../javascript/package.json | 19 + .../javascript/roman_numeral.js | 24 + .../javascript/tests/roman_numeral.test.js | 19 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/roman_numeral.rb | 23 + .../ruby/spec/roman_numeral_spec.rb | 21 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/roman_numeral.js | 109 +++++ .../solutions/roman_numeral.rb | 108 +++++ .../.gitignore | 4 + .../README.md | 54 +++ .../javascript/package.json | 19 + .../javascript/rotate_array.js | 24 + .../javascript/tests/rotate_array.test.js | 22 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/rotate_array.rb | 25 + .../ruby/spec/rotate_array_spec.rb | 24 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/rotate_array.js | 54 +++ .../solutions/rotate_array.rb | 54 +++ .../03-bonus-4--distinct-pair-sum/.gitignore | 4 + .../03-bonus-4--distinct-pair-sum/README.md | 49 ++ .../javascript/distinct_pair_sum.js | 19 + .../javascript/package.json | 19 + .../tests/distinct_pair_sum.test.js | 21 + .../03-bonus-4--distinct-pair-sum/ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/distinct_pair_sum.rb | 20 + .../ruby/spec/distinct_pair_sum_spec.rb | 22 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/distinct_pair_sum.js | 73 +++ .../solutions/distinct_pair_sum.rb | 72 +++ .../.gitignore | 4 + .../README.md | 53 +++ .../javascript/consecutive_substrings.js | 19 + .../javascript/package.json | 19 + .../tests/consecutive_substrings.test.js | 14 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/consecutive_substrings.rb | 20 + .../ruby/spec/consecutive_substrings_spec.rb | 16 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/consecutive_substrings.js | 64 +++ .../solutions/consecutive_substrings.rb | 61 +++ .../00-code-review/README.md | 96 ++++ .../01-whiteboard/README.md | 92 ++++ .../Big-O-graph.png | Bin 0 -> 264073 bytes .../README.md | 177 +++++++ .../README.md | 139 ++++++ .../.gitignore | 4 + .../README.md | 87 ++++ .../javascript/package.json | 19 + .../javascript/stack.js | 56 +++ .../javascript/tests/stack.test.js | 71 +++ .../pancakes.png | Bin 0 -> 509400 bytes .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/spec/spec_helper.rb | 100 ++++ .../ruby/spec/stack_spec.rb | 100 ++++ .../ruby/stack.rb | 49 ++ .../solutions/stack.js | 113 +++++ .../solutions/stack.rb | 110 +++++ .../.gitignore | 4 + .../README.md | 83 ++++ .../grocery_store.jpg | Bin 0 -> 55818 bytes .../javascript/package.json | 19 + .../javascript/queue.js | 56 +++ .../javascript/tests/queue.test.js | 71 +++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/queue.rb | 49 ++ .../ruby/spec/queue_spec.rb | 101 ++++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/queue.js | 107 +++++ .../solutions/queue.rb | 106 +++++ .../02-day-5--implement-a-set/.gitignore | 4 + .../02-day-5--implement-a-set/README.md | 117 +++++ .../javascript/my_set.js | 47 ++ .../javascript/package.json | 19 + .../javascript/tests/my_set.test.js | 57 +++ .../02-day-5--implement-a-set/ruby/.rspec | 1 + .../02-day-5--implement-a-set/ruby/Gemfile | 7 + .../02-day-5--implement-a-set/ruby/my_set.rb | 37 ++ .../ruby/spec/my_set_spec.rb | 65 +++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/my_set.js | 90 ++++ .../solutions/my_set.rb | 82 ++++ .../.gitignore | 4 + .../README.md | 369 +++++++++++++++ .../javascript/linked_list.js | 75 +++ .../javascript/package.json | 19 + .../javascript/tests/linked_list.test.js | 292 ++++++++++++ .../linked_list.png | Bin 0 -> 4035 bytes .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/linked_list.rb | 67 +++ .../ruby/spec/linked_list_spec.rb | 257 +++++++++++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/linked_list.js | 320 +++++++++++++ .../solutions/linked_list.rb | 245 ++++++++++ .../01-day-3--underneath-arrays/README.md | 98 ++++ .../02-day-4--underneath-hashes/README.md | 104 +++++ .../.gitignore | 4 + .../README.md | 51 +++ .../javascript/package.json | 19 + .../javascript/reverse_string.js | 19 + .../javascript/tests/reverse_string.test.js | 21 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/reverse_string.rb | 18 + .../ruby/spec/reverse_string_spec.rb | 23 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/reverse_string.js | 48 ++ .../solutions/reverse_string.rb | 43 ++ .../.gitignore | 4 + .../README.md | 119 +++++ .../javascript/linked_list.js | 181 ++++++++ .../javascript/package.json | 19 + .../javascript/tests/linked_list.test.js | 430 ++++++++++++++++++ .../linked_list.png | Bin 0 -> 4035 bytes .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/linked_list.rb | 138 ++++++ .../ruby/spec/linked_list_spec.rb | 395 ++++++++++++++++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/linked_list.js | 366 +++++++++++++++ .../solutions/linked_list.rb | 309 +++++++++++++ .../.gitignore | 4 + .../README.md | 90 ++++ .../javascript/doubly_linked_list.js | 178 ++++++++ .../javascript/package.json | 19 + .../tests/doubly_linked_list.test.js | 414 +++++++++++++++++ .../linked_list.png | Bin 0 -> 30144 bytes .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/doubly_linked_list.rb | 134 ++++++ .../ruby/spec/doubly_linked_list_spec.rb | 384 ++++++++++++++++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/doubly_linked_list.js | 301 ++++++++++++ .../solutions/doubly_linked_list.rb | 249 ++++++++++ .../00-whiteboard-big-o/README.md | 22 + .../00-days-1-to-2--bubble-sort/.gitignore | 4 + .../00-days-1-to-2--bubble-sort/README.md | 91 ++++ .../javascript/bubble_sort.js | 29 ++ .../javascript/package.json | 19 + .../javascript/tests/bubble_sort.test.js | 40 ++ .../00-days-1-to-2--bubble-sort/ruby/.rspec | 1 + .../00-days-1-to-2--bubble-sort/ruby/Gemfile | 7 + .../ruby/bubble_sort.rb | 32 ++ .../ruby/spec/bubble_sort_spec.rb | 45 ++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/bubble_sort.js | 91 ++++ .../solutions/bubble_sort.rb | 86 ++++ .../01-days-3-to-5--merge-sort/.gitignore | 4 + .../01-days-3-to-5--merge-sort/README.md | 224 +++++++++ .../javascript/merge_sort.js | 28 ++ .../javascript/package.json | 19 + .../javascript/tests/merge_sort.test.js | 35 ++ .../01-days-3-to-5--merge-sort/merge_sort.gif | Bin 0 -> 94355 bytes .../01-days-3-to-5--merge-sort/merge_sort.png | Bin 0 -> 38796 bytes .../01-days-3-to-5--merge-sort/ruby/.rspec | 1 + .../01-days-3-to-5--merge-sort/ruby/Gemfile | 7 + .../ruby/merge_sort.rb | 27 ++ .../ruby/spec/merge_sort_spec.rb | 37 ++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/merge_sort.js | 89 ++++ .../solutions/merge_sort.rb | 85 ++++ .../00-days-1-to-3--binary-search/.gitignore | 4 + .../00-days-1-to-3--binary-search/README.md | 153 +++++++ .../binary_search.gif | Bin 0 -> 163527 bytes .../javascript/binary_search.js | 36 ++ .../javascript/package.json | 19 + .../javascript/tests/binary_search.test.js | 68 +++ .../phone_book.jpeg | Bin 0 -> 80104 bytes .../00-days-1-to-3--binary-search/ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/binary_search.rb | 32 ++ .../ruby/spec/binary_search_spec.rb | 67 +++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/binary_search.js | 164 +++++++ .../solutions/binary_search.rb | 150 ++++++ .../01-day-4--manual-binary-tree/.gitignore | 4 + .../01-day-4--manual-binary-tree/README.md | 182 ++++++++ .../invalid_trees.png | Bin 0 -> 31391 bytes .../javascript/binary_tree.js | 35 ++ .../javascript/package.json | 19 + .../javascript/tests/binary_tree.test.js | 65 +++ .../01-day-4--manual-binary-tree/ruby/.rspec | 1 + .../01-day-4--manual-binary-tree/ruby/Gemfile | 7 + .../ruby/binary_tree.rb | 30 ++ .../ruby/spec/binary_tree_spec.rb | 70 +++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/binary_tree.js | 77 ++++ .../solutions/binary_tree.rb | 72 +++ .../valid_tree.png | Bin 0 -> 48311 bytes .../valid_trees.png | Bin 0 -> 24534 bytes .../.gitignore | 4 + .../README.md | 106 +++++ .../javascript/balancing.js | 30 ++ .../javascript/package.json | 19 + .../javascript/tests/balancing.test.js | 24 + .../javascript/tests/validation_methods.js | 65 +++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/balancing.rb | 26 ++ .../ruby/spec/balancing_spec.rb | 24 + .../ruby/spec/spec_helper.rb | 100 ++++ .../ruby/spec/validation_methods.rb | 56 +++ .../solutions/balancing.js | 47 ++ .../solutions/balancing.rb | 43 ++ .../tree_compare.png | Bin 0 -> 39210 bytes .../tree_height.png | Bin 0 -> 9916 bytes .../valid_trees.png | Bin 0 -> 24534 bytes .../00-pair-programming/README.md | 26 ++ .../.gitignore | 4 + .../README.md | 83 ++++ .../javascript/package.json | 19 + .../tests/tree_traversal_bfs.test.js | 40 ++ .../javascript/tree_traversal_bfs.js | 33 ++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/spec/spec_helper.rb | 100 ++++ .../ruby/spec/tree_traversal_bfs_spec.rb | 40 ++ .../ruby/tree_traversal_bfs.rb | 36 ++ .../solutions/tree_traversal_bfs.js | 99 ++++ .../solutions/tree_traversal_bfs.rb | 99 ++++ .../trees.png | Bin 0 -> 24534 bytes .../unordered_tree.png | Bin 0 -> 23039 bytes .../.gitignore | 4 + .../README.md | 71 +++ .../javascript/package.json | 19 + .../tests/tree_traversal_inorder.test.js | 33 ++ .../javascript/tree_traversal_inorder.js | 32 ++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/spec/spec_helper.rb | 100 ++++ .../ruby/spec/tree_traversal_inorder_spec.rb | 33 ++ .../ruby/tree_traversal_inorder.rb | 32 ++ .../solutions/tree_traversal_inorder.js | 138 ++++++ .../solutions/tree_traversal_inorder.rb | 140 ++++++ .../trees.png | Bin 0 -> 24534 bytes .../.gitignore | 4 + .../README.md | 55 +++ .../javascript/find_target.js | 28 ++ .../javascript/package.json | 19 + .../javascript/tests/find_target.test.js | 35 ++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/find_target.rb | 29 ++ .../ruby/spec/find_target_spec.rb | 35 ++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/find_target.js | 91 ++++ .../solutions/find_target.rb | 80 ++++ .../03-bonus--quicksort/.gitignore | 4 + .../03-bonus--quicksort/README.md | 130 ++++++ .../javascript/package.json | 19 + .../javascript/quicksort.js | 23 + .../javascript/tests/quicksort.test.js | 49 ++ .../quick_sort_partition_animation.gif | Bin 0 -> 151599 bytes .../03-bonus--quicksort/quicksort_diagram.png | Bin 0 -> 47651 bytes .../03-bonus--quicksort/ruby/.rspec | 1 + .../03-bonus--quicksort/ruby/Gemfile | 7 + .../03-bonus--quicksort/ruby/quicksort.rb | 24 + .../ruby/spec/quicksort_spec.rb | 47 ++ .../ruby/spec/spec_helper.rb | 100 ++++ .../03-bonus--quicksort/solutions/bonus.js | 111 +++++ .../03-bonus--quicksort/solutions/bonus.rb | 106 +++++ .../solutions/quicksort.js | 146 ++++++ .../solutions/quicksort.rb | 137 ++++++ .../.gitignore | 4 + .../README.md | 139 ++++++ .../javascript/package.json | 19 + .../javascript/queue.js | 60 +++ .../javascript/tests/queue.test.js | 118 +++++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/queue.rb | 58 +++ .../ruby/spec/queue_spec.rb | 118 +++++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/queue.js | 105 +++++ .../solutions/queue.rb | 101 ++++ .../.gitignore | 4 + .../README.md | 247 ++++++++++ .../javascript/lru_cache.js | 78 ++++ .../javascript/package.json | 19 + .../javascript/tests/lru_cache.test.js | 108 +++++ .../lru_cache.svg | 193 ++++++++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/lru_cache.rb | 78 ++++ .../ruby/spec/lru_cache_spec.rb | 110 +++++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/lru_cache.js | 192 ++++++++ .../solutions/lru_cache.rb | 178 ++++++++ .../00-day-1--what-is-a-graph-/.gitignore | 4 + .../00-day-1--what-is-a-graph-/README.md | 182 ++++++++ .../00-day-1--what-is-a-graph-/friends.jpg | Bin 0 -> 38531 bytes .../javascript/graph.js | 52 +++ .../javascript/package.json | 19 + .../javascript/tests/graph.test.js | 67 +++ .../00-day-1--what-is-a-graph-/ruby/.rspec | 1 + .../00-day-1--what-is-a-graph-/ruby/Gemfile | 7 + .../00-day-1--what-is-a-graph-/ruby/graph.rb | 48 ++ .../ruby/spec/graph_spec.rb | 60 +++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/graph.js | 136 ++++++ .../solutions/graph.rb | 136 ++++++ .../.gitignore | 4 + .../README.md | 87 ++++ .../fork_road.jpg | Bin 0 -> 130426 bytes .../graph.jpg | Bin 0 -> 16120 bytes .../javascript/graph_dfs.js | 27 ++ .../javascript/package.json | 19 + .../javascript/tests/graph_dfs.test.js | 61 +++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/graph_dfs.rb | 26 ++ .../ruby/spec/graph_dfs_spec.rb | 61 +++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/graph_dfs.js | 136 ++++++ .../solutions/graph_dfs.rb | 131 ++++++ .../.gitignore | 4 + .../README.md | 75 +++ .../graph.jpg | Bin 0 -> 16120 bytes .../javascript/find_distance.js | 27 ++ .../javascript/package.json | 19 + .../javascript/tests/find_distance.test.js | 38 ++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/find_distance.rb | 26 ++ .../ruby/spec/find_distance_spec.rb | 38 ++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/find_distance.js | 124 +++++ .../solutions/find_distance.rb | 120 +++++ .../.gitignore | 4 + .../README.md | 70 +++ .../javascript/package.json | 19 + .../javascript/table_to_graph.js | 35 ++ .../javascript/tests/table_to_graph.test.js | 88 ++++ .../ruby/Gemfile | 7 + .../ruby/spec/table_to_graph_spec.rb | 89 ++++ .../ruby/table_to_graph.rb | 32 ++ .../solutions/table_to_graph.js | 156 +++++++ .../solutions/table_to_graph.rb | 148 ++++++ .../README.md | 95 ++++ .../.gitignore | 4 + .../README.md | 60 +++ .../javascript/fibonacci.js | 24 + .../javascript/package.json | 19 + .../javascript/tests/fibonacci.test.js | 13 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/fibonacci.rb | 24 + .../ruby/spec/fibonacci_spec.rb | 15 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/fibonacci.js | 43 ++ .../solutions/fibonacci.rb | 42 ++ .../.gitignore | 4 + .../README.md | 64 +++ .../example.png | Bin 0 -> 34017 bytes .../javascript/addTwoList.js | 25 + .../javascript/package.json | 19 + .../javascript/tests/addTwoList.test.js | 27 ++ .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/addTwoList.rb | 24 + .../ruby/spec/addTwoList_spec.rb | 25 + .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/addTwoList.js | 42 ++ .../solutions/addTwoList.rb | 42 ++ .../.gitignore | 5 + .../README.md | 64 +++ .../javascript/longSubString.js | 16 + .../javascript/package.json | 19 + .../javascript/tests/longSubString.test.js | 23 + .../ruby/.rspec | 1 + .../ruby/Gemfile | 7 + .../ruby/longSubString.rb | 15 + .../ruby/spec/longSubString_spec.rb | 34 ++ .../ruby/spec/spec_helper.rb | 100 ++++ .../solutions/longSubString.js | 29 ++ .../solutions/longSubString.rb | 20 + .../01-day-3-to-5--validate-bst/.gitignore | 5 + .../01-day-3-to-5--validate-bst/README.md | 63 +++ .../01-day-3-to-5--validate-bst/example-1.png | Bin 0 -> 109360 bytes .../01-day-3-to-5--validate-bst/example-2.png | Bin 0 -> 59735 bytes .../javascript/package.json | 19 + .../javascript/tests/validBTS.test.js | 11 + .../javascript/validBTS.js | 29 ++ .../01-day-3-to-5--validate-bst/ruby/.rspec | 1 + .../01-day-3-to-5--validate-bst/ruby/Gemfile | 7 + .../ruby/spec/spec_helper.rb | 100 ++++ .../ruby/spec/valdiBTS_spec.rb | 21 + .../ruby/validBTS.rb | 26 ++ .../solutions/validBTS.js | 37 ++ .../solutions/validBTS.rb | 30 ++ .../00-week-15-algo-practices/README.md | 11 + .../00-code-comparison/README.md | 23 + .../README.md | 44 ++ README.md | 193 ++++++++ 549 files changed, 27848 insertions(+) create mode 100644 00-welcome/00-welcome-to-technical-interview-preparation/README.md create mode 100644 00-welcome/01-algorithmic-problem-solving/README.md create mode 100644 00-welcome/02-a-note-on-testing/README.md create mode 100644 00-welcome/03-problem-solving-tips/README.md create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/.gitignore create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/README.md create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/package.json create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/reverse_string.js create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/tests/reverse_string.test.js create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/.rspec create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/Gemfile create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/reverse_string.rb create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/spec/reverse_string_spec.rb create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/spec/spec_helper.rb create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/solutions/reverse_string.js create mode 100644 01-week-1--starter-algorithms/00-day-1--reverse-a-string/solutions/reverse_string.rb create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/.gitignore create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/README.md create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/find_first_duplicate.js create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/package.json create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/tests/find_first_duplicate.test.js create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/.rspec create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/Gemfile create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/find_first_duplicate.rb create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/spec/find_first_duplicate_spec.rb create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/spec/spec_helper.rb create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/solutions/find_first_duplicate.js create mode 100644 01-week-1--starter-algorithms/01-day-2--find-first-duplicate/solutions/find_first_duplicate.rb create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/.gitignore create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/README.md create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/fibonacci.js create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/package.json create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/tests/fibonacci.test.js create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/.rspec create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/Gemfile create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/fibonacci.rb create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/spec/fibonacci_spec.rb create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/spec/spec_helper.rb create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/solutions/fibonacci.js create mode 100644 01-week-1--starter-algorithms/02-day-3--fibonacci-series/solutions/fibonacci.rb create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/.gitignore create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/README.md create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/package.json create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/selection_sort.js create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/tests/selection_sort.test.js create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/.rspec create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/Gemfile create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/selection_sort.rb create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/spec/selection_sort_spec.rb create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/spec/spec_helper.rb create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/solutions/selection_sort.js create mode 100644 01-week-1--starter-algorithms/03-day-4--selection-sort/solutions/selection_sort.rb create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/.gitignore create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/README.md create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/find_shortest_string.js create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/package.json create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/tests/find_shortest_string.test.js create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/.rspec create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/Gemfile create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/find_shortest_string.rb create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/spec/find_shortest_string_spec.rb create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/spec/spec_helper.rb create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/solutions/find_shortest_string.js create mode 100644 01-week-1--starter-algorithms/04-day-5--find-shortest-string/solutions/find_shortest_string.rb create mode 100644 02-week-2--recursion/00-introduction-to-recursion/README.md create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/.gitignore create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/README.md create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/javascript/package.json create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/javascript/recursive_count.js create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/javascript/tests/recursive_count.test.js create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/ruby/.rspec create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/ruby/Gemfile create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/ruby/recursive_count.rb create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/ruby/spec/recursive_count_spec.rb create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/ruby/spec/spec_helper.rb create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/solutions/recursive_count.js create mode 100644 02-week-2--recursion/01-day-1--recursive-counting/solutions/recursive_count.rb create mode 100644 02-week-2--recursion/02-day-2--recursive-search/.gitignore create mode 100644 02-week-2--recursion/02-day-2--recursive-search/README.md create mode 100644 02-week-2--recursion/02-day-2--recursive-search/javascript/package.json create mode 100644 02-week-2--recursion/02-day-2--recursive-search/javascript/recursive_search.js create mode 100644 02-week-2--recursion/02-day-2--recursive-search/javascript/tests/recursive_search.test.js create mode 100644 02-week-2--recursion/02-day-2--recursive-search/ruby/.rspec create mode 100644 02-week-2--recursion/02-day-2--recursive-search/ruby/Gemfile create mode 100644 02-week-2--recursion/02-day-2--recursive-search/ruby/recursive_search.rb create mode 100644 02-week-2--recursion/02-day-2--recursive-search/ruby/spec/recursive_search_spec.rb create mode 100644 02-week-2--recursion/02-day-2--recursive-search/ruby/spec/spec_helper.rb create mode 100644 02-week-2--recursion/02-day-2--recursive-search/solutions/recursive_search.js create mode 100644 02-week-2--recursion/02-day-2--recursive-search/solutions/recursive_search.rb create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/.gitignore create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/README.md create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/fibonacci_recursive.js create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/package.json create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/tests/fibonacci_recursive.test.js create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/.rspec create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/Gemfile create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/fibonacci_recursive.rb create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/spec/fibonacci_recursive_spec.rb create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/spec/spec_helper.rb create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/solutions/fibonacci_recursive.js create mode 100644 02-week-2--recursion/03-day-3--recursive-fibonacci-series/solutions/fibonacci_recursive.rb create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/.gitignore create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/README.md create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/benchmark/benchmark.js create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/benchmark/benchmark.rb create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/find_shortest_string_recursive.js create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/package.json create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/tests/find_shortest_string_recursive.test.js create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/.rspec create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/Gemfile create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/find_shortest_string_recursive.rb create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/spec/find_shortest_string_spec.rb create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/spec/spec_helper.rb create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/benchmark/benchmark.js create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/benchmark/benchmark.rb create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/find_shortest_string_recursive.js create mode 100644 02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/find_shortest_string_recursive.rb create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/.gitignore create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/README.md create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/benchmark/benchmark.js create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/benchmark/benchmark.rb create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/package.json create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/selection_sort_recursive.js create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/tests/selection_sort_recursive.test.js create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/.rspec create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/Gemfile create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/selection_sort_recursive.rb create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/spec/selection_sort_recursive_spec.rb create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/spec/spec_helper.rb create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/benchmark/benchmark.js create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/benchmark/benchmark.rb create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/selection_sort_recursive.js create mode 100644 02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/selection_sort_recursive.rb create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/.gitignore create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/README.md create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/balancing_parentheses.js create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/package.json create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/tests/balancing_parentheses.test.js create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/.rspec create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/Gemfile create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/balancing_parentheses.rb create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/spec/balancing_parentheses_spec.rb create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/spec/spec_helper.rb create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/solutions/balancing_parentheses.js create mode 100644 03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/solutions/balancing_parentheses.rb create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/.gitignore create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/README.md create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/package.json create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/roman_numeral.js create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/tests/roman_numeral.test.js create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/.rspec create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/Gemfile create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/roman_numeral.rb create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/spec/roman_numeral_spec.rb create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/spec/spec_helper.rb create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/solutions/roman_numeral.js create mode 100644 03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/solutions/roman_numeral.rb create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/.gitignore create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/README.md create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/package.json create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/rotate_array.js create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/tests/rotate_array.test.js create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/.rspec create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/Gemfile create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/rotate_array.rb create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/spec/rotate_array_spec.rb create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/spec/spec_helper.rb create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/solutions/rotate_array.js create mode 100644 03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/solutions/rotate_array.rb create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/.gitignore create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/README.md create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/distinct_pair_sum.js create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/package.json create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/tests/distinct_pair_sum.test.js create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/.rspec create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/Gemfile create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/distinct_pair_sum.rb create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/spec/distinct_pair_sum_spec.rb create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/spec/spec_helper.rb create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/solutions/distinct_pair_sum.js create mode 100644 03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/solutions/distinct_pair_sum.rb create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/.gitignore create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/README.md create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/consecutive_substrings.js create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/package.json create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/tests/consecutive_substrings.test.js create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/.rspec create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/Gemfile create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/consecutive_substrings.rb create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/spec/consecutive_substrings_spec.rb create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/spec/spec_helper.rb create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/solutions/consecutive_substrings.js create mode 100644 03-week-3--additional-practice/04-bonus-5--consecutive-substrings/solutions/consecutive_substrings.rb create mode 100644 04-pairing-exercises-1/00-code-review/README.md create mode 100644 04-pairing-exercises-1/01-whiteboard/README.md create mode 100644 05-week-4--big-o-notation/00-day-1--introduction-to-big-o-notation/Big-O-graph.png create mode 100644 05-week-4--big-o-notation/00-day-1--introduction-to-big-o-notation/README.md create mode 100644 05-week-4--big-o-notation/01-day-2--introduction-to-space-complexity/README.md create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/.gitignore create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/README.md create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/package.json create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/stack.js create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/tests/stack.test.js create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/pancakes.png create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/.rspec create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/Gemfile create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/spec/spec_helper.rb create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/spec/stack_spec.rb create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/stack.rb create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/solutions/stack.js create mode 100644 06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/solutions/stack.rb create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/.gitignore create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/README.md create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/grocery_store.jpg create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/javascript/package.json create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/javascript/queue.js create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/javascript/tests/queue.test.js create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/.rspec create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/Gemfile create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/queue.rb create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/spec/queue_spec.rb create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/spec/spec_helper.rb create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/solutions/queue.js create mode 100644 06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/solutions/queue.rb create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/.gitignore create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/README.md create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/my_set.js create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/package.json create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/tests/my_set.test.js create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/.rspec create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/Gemfile create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/my_set.rb create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/spec/my_set_spec.rb create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/spec/spec_helper.rb create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/solutions/my_set.js create mode 100644 06-week-5--big-o-continued/02-day-5--implement-a-set/solutions/my_set.rb create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/.gitignore create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/README.md create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/linked_list.js create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/package.json create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/tests/linked_list.test.js create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/linked_list.png create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/ruby/.rspec create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/ruby/Gemfile create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/ruby/linked_list.rb create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/ruby/spec/linked_list_spec.rb create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/ruby/spec/spec_helper.rb create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/solutions/linked_list.js create mode 100644 07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/solutions/linked_list.rb create mode 100644 07-week-6--foundational-data-structures/01-day-3--underneath-arrays/README.md create mode 100644 07-week-6--foundational-data-structures/02-day-4--underneath-hashes/README.md create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/.gitignore create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/README.md create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/package.json create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/reverse_string.js create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/tests/reverse_string.test.js create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/.rspec create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/Gemfile create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/reverse_string.rb create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/spec/reverse_string_spec.rb create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/spec/spec_helper.rb create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/solutions/reverse_string.js create mode 100644 07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/solutions/reverse_string.rb create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/.gitignore create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/README.md create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/linked_list.js create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/package.json create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/tests/linked_list.test.js create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/linked_list.png create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/ruby/.rspec create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/ruby/Gemfile create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/ruby/linked_list.rb create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/ruby/spec/linked_list_spec.rb create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/ruby/spec/spec_helper.rb create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/solutions/linked_list.js create mode 100644 07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/solutions/linked_list.rb create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/.gitignore create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/README.md create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/doubly_linked_list.js create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/package.json create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/tests/doubly_linked_list.test.js create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/linked_list.png create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/ruby/.rspec create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/ruby/Gemfile create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/ruby/doubly_linked_list.rb create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/ruby/spec/doubly_linked_list_spec.rb create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/ruby/spec/spec_helper.rb create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/solutions/doubly_linked_list.js create mode 100644 07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/solutions/doubly_linked_list.rb create mode 100644 08-pairing-exercise-2/00-whiteboard-big-o/README.md create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/.gitignore create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/README.md create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/bubble_sort.js create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/package.json create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/tests/bubble_sort.test.js create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/.rspec create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/Gemfile create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/bubble_sort.rb create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/spec/bubble_sort_spec.rb create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/spec/spec_helper.rb create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/solutions/bubble_sort.js create mode 100644 09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/solutions/bubble_sort.rb create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/.gitignore create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/README.md create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/merge_sort.js create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/package.json create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/tests/merge_sort.test.js create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/merge_sort.gif create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/merge_sort.png create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/.rspec create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/Gemfile create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/merge_sort.rb create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/spec/merge_sort_spec.rb create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/spec/spec_helper.rb create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/solutions/merge_sort.js create mode 100644 09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/solutions/merge_sort.rb create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/.gitignore create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/README.md create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/binary_search.gif create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/javascript/binary_search.js create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/javascript/package.json create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/javascript/tests/binary_search.test.js create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/phone_book.jpeg create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/ruby/.rspec create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/ruby/Gemfile create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/ruby/binary_search.rb create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/ruby/spec/binary_search_spec.rb create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/ruby/spec/spec_helper.rb create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/solutions/binary_search.js create mode 100644 10-week-8--searching/00-days-1-to-3--binary-search/solutions/binary_search.rb create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/.gitignore create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/README.md create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/invalid_trees.png create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/javascript/binary_tree.js create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/javascript/package.json create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/javascript/tests/binary_tree.test.js create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/ruby/.rspec create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/ruby/Gemfile create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/ruby/binary_tree.rb create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/ruby/spec/binary_tree_spec.rb create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/ruby/spec/spec_helper.rb create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/solutions/binary_tree.js create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/solutions/binary_tree.rb create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/valid_tree.png create mode 100644 10-week-8--searching/01-day-4--manual-binary-tree/valid_trees.png create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/.gitignore create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/README.md create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/balancing.js create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/package.json create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/tests/balancing.test.js create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/tests/validation_methods.js create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/.rspec create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/Gemfile create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/balancing.rb create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/balancing_spec.rb create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/spec_helper.rb create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/validation_methods.rb create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/solutions/balancing.js create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/solutions/balancing.rb create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/tree_compare.png create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/tree_height.png create mode 100644 10-week-8--searching/02-day-5--build-a-binary-tree---balancing/valid_trees.png create mode 100644 11-pairing-exercise-3/00-pair-programming/README.md create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/.gitignore create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/README.md create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/package.json create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/tests/tree_traversal_bfs.test.js create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/tree_traversal_bfs.js create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/.rspec create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/Gemfile create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/spec/spec_helper.rb create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/spec/tree_traversal_bfs_spec.rb create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/tree_traversal_bfs.rb create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/solutions/tree_traversal_bfs.js create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/solutions/tree_traversal_bfs.rb create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/trees.png create mode 100644 12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/unordered_tree.png create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/.gitignore create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/README.md create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/package.json create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/tests/tree_traversal_inorder.test.js create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/tree_traversal_inorder.js create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/.rspec create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/Gemfile create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/spec/spec_helper.rb create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/spec/tree_traversal_inorder_spec.rb create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/tree_traversal_inorder.rb create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/solutions/tree_traversal_inorder.js create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/solutions/tree_traversal_inorder.rb create mode 100644 12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/trees.png create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/.gitignore create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/README.md create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/find_target.js create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/package.json create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/tests/find_target.test.js create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/.rspec create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/Gemfile create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/find_target.rb create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/spec/find_target_spec.rb create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/spec/spec_helper.rb create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/solutions/find_target.js create mode 100644 12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/solutions/find_target.rb create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/.gitignore create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/README.md create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/package.json create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/quicksort.js create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/tests/quicksort.test.js create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/quick_sort_partition_animation.gif create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/quicksort_diagram.png create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/ruby/.rspec create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/ruby/Gemfile create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/ruby/quicksort.rb create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/ruby/spec/quicksort_spec.rb create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/ruby/spec/spec_helper.rb create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/bonus.js create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/bonus.rb create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/quicksort.js create mode 100644 12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/quicksort.rb create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/.gitignore create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/README.md create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/package.json create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/queue.js create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/tests/queue.test.js create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/.rspec create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/Gemfile create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/queue.rb create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/spec/queue_spec.rb create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/spec/spec_helper.rb create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/solutions/queue.js create mode 100644 13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/solutions/queue.rb create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/.gitignore create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/README.md create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/lru_cache.js create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/package.json create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/tests/lru_cache.test.js create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/lru_cache.svg create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/.rspec create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/Gemfile create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/lru_cache.rb create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/spec/lru_cache_spec.rb create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/spec/spec_helper.rb create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/solutions/lru_cache.js create mode 100644 13-week-10/01-days-3-to-5--build-an-lru-cache/solutions/lru_cache.rb create mode 100644 14-week-11/00-day-1--what-is-a-graph-/.gitignore create mode 100644 14-week-11/00-day-1--what-is-a-graph-/README.md create mode 100644 14-week-11/00-day-1--what-is-a-graph-/friends.jpg create mode 100644 14-week-11/00-day-1--what-is-a-graph-/javascript/graph.js create mode 100644 14-week-11/00-day-1--what-is-a-graph-/javascript/package.json create mode 100644 14-week-11/00-day-1--what-is-a-graph-/javascript/tests/graph.test.js create mode 100644 14-week-11/00-day-1--what-is-a-graph-/ruby/.rspec create mode 100644 14-week-11/00-day-1--what-is-a-graph-/ruby/Gemfile create mode 100644 14-week-11/00-day-1--what-is-a-graph-/ruby/graph.rb create mode 100644 14-week-11/00-day-1--what-is-a-graph-/ruby/spec/graph_spec.rb create mode 100644 14-week-11/00-day-1--what-is-a-graph-/ruby/spec/spec_helper.rb create mode 100644 14-week-11/00-day-1--what-is-a-graph-/solutions/graph.js create mode 100644 14-week-11/00-day-1--what-is-a-graph-/solutions/graph.rb create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/.gitignore create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/README.md create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/fork_road.jpg create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/graph.jpg create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/graph_dfs.js create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/package.json create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/tests/graph_dfs.test.js create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/.rspec create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/Gemfile create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/graph_dfs.rb create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/spec/graph_dfs_spec.rb create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/spec/spec_helper.rb create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/solutions/graph_dfs.js create mode 100644 14-week-11/01-days-2-to-3--depth-first-graph-traversal/solutions/graph_dfs.rb create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/.gitignore create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/README.md create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/graph.jpg create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/find_distance.js create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/package.json create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/tests/find_distance.test.js create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/.rspec create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/Gemfile create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/find_distance.rb create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/spec/find_distance_spec.rb create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/spec/spec_helper.rb create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/solutions/find_distance.js create mode 100644 14-week-11/02-days-4-to-5--breadth-first-graph-traversal/solutions/find_distance.rb create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/.gitignore create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/README.md create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/package.json create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/table_to_graph.js create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/tests/table_to_graph.test.js create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/Gemfile create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/spec/table_to_graph_spec.rb create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/table_to_graph.rb create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/solutions/table_to_graph.js create mode 100644 15-week-12/00-days-1-to-2--convert-html-to-a-graph/solutions/table_to_graph.rb create mode 100644 16-pairing-exercise-4/00-whiteboard-and-calculate-big-o/README.md create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/.gitignore create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/README.md create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/javascript/fibonacci.js create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/javascript/package.json create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/javascript/tests/fibonacci.test.js create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/ruby/.rspec create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/ruby/Gemfile create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/ruby/fibonacci.rb create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/ruby/spec/fibonacci_spec.rb create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/ruby/spec/spec_helper.rb create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/solutions/fibonacci.js create mode 100644 17-week-13/00-day-1-to-2--dynamic-programming/solutions/fibonacci.rb create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/.gitignore create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/README.md create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/example.png create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/addTwoList.js create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/package.json create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/tests/addTwoList.test.js create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/.rspec create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/Gemfile create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/addTwoList.rb create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/spec/addTwoList_spec.rb create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/spec/spec_helper.rb create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/solutions/addTwoList.js create mode 100644 17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/solutions/addTwoList.rb create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/.gitignore create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/README.md create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/longSubString.js create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/package.json create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/tests/longSubString.test.js create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/.rspec create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/Gemfile create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/longSubString.rb create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/spec/longSubString_spec.rb create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/spec/spec_helper.rb create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/solutions/longSubString.js create mode 100644 18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/solutions/longSubString.rb create mode 100644 18-week-14/01-day-3-to-5--validate-bst/.gitignore create mode 100644 18-week-14/01-day-3-to-5--validate-bst/README.md create mode 100644 18-week-14/01-day-3-to-5--validate-bst/example-1.png create mode 100644 18-week-14/01-day-3-to-5--validate-bst/example-2.png create mode 100644 18-week-14/01-day-3-to-5--validate-bst/javascript/package.json create mode 100644 18-week-14/01-day-3-to-5--validate-bst/javascript/tests/validBTS.test.js create mode 100644 18-week-14/01-day-3-to-5--validate-bst/javascript/validBTS.js create mode 100644 18-week-14/01-day-3-to-5--validate-bst/ruby/.rspec create mode 100644 18-week-14/01-day-3-to-5--validate-bst/ruby/Gemfile create mode 100644 18-week-14/01-day-3-to-5--validate-bst/ruby/spec/spec_helper.rb create mode 100644 18-week-14/01-day-3-to-5--validate-bst/ruby/spec/valdiBTS_spec.rb create mode 100644 18-week-14/01-day-3-to-5--validate-bst/ruby/validBTS.rb create mode 100644 18-week-14/01-day-3-to-5--validate-bst/solutions/validBTS.js create mode 100644 18-week-14/01-day-3-to-5--validate-bst/solutions/validBTS.rb create mode 100644 19-week-15/00-week-15-algo-practices/README.md create mode 100644 20-pairing-exercises-5/00-code-comparison/README.md create mode 100644 20-pairing-exercises-5/01-whiteboard-and-calculate-big-o/README.md create mode 100644 README.md diff --git a/00-welcome/00-welcome-to-technical-interview-preparation/README.md b/00-welcome/00-welcome-to-technical-interview-preparation/README.md new file mode 100644 index 00000000..fbc10575 --- /dev/null +++ b/00-welcome/00-welcome-to-technical-interview-preparation/README.md @@ -0,0 +1,49 @@ +# Welcome to Technical Interview Preparation + +In addition to preparing a portfolio of awesome projects to show off to your +future employer, you’ll also need to be prepared for technical interviews. In +this course, we’ll help you prepare by asking you to solve a series of problems +on algorithms and/or data structures. You may find some problems easy and others +incredibly difficult. Don’t worry - this is normal. It takes time to get used to +solving these types of problems. + +Before we get into how to approach progressing through this section, let’s talk +about the two types of technical interviews. + +## Two Types of Technical Interviews + +Your technical interview may be held asynchronously or synchronously. During an +asynchronous technical interview, you may be asked to solve algorithmic problems +in a timed environment by yourself. For a synchronous interview, you will likely +be asked to whiteboard and solve the problem in front of your interviewer. + +Async technical interviews typically require candidates to problem solve alone. +Once the solution is submitted, the hiring team will review your solution and +determine whether you should move forward in the hiring process. At this point, +they’ll likely require that most or all problems be solved and will also +consider the quality of the solution/s. + +During synchronous interviews, the interviewer is likely looking to see how you: + +- Work in a team +- Handle feedback +- Talk technically +- Handle obstacles +- Approach solving a problem / think +- Evaluate different approaches to solving a problem and make decisions + +At this stage, you may be able to move forward in the hiring process if you +demonstrate good communication skills, logical thinking, perseverance, calm +under pressure, and graciousness towards your interviewer’s feedback even if you +are unable to solve the problem. Asking good questions to fully understand the +problem or get unstuck are normally welcome. Interviewers also typically expect +you to come up with your own test cases to ensure the problem is actually +solved. This portion of the interview might require you to largely solve the +problem alone on a whiteboard or IDE, or through pair programming where the +interviewer is either the driver or navigator. Many interviewers are forgiving +of syntax errors, and they generally don’t expect you to have every piece of the +core language memorized. + +In this course, we will be preparing you for both types of interviews, so it’s +important to take the time to solve as many problems as you can alone and to +complete the paired assignments, if applicable. diff --git a/00-welcome/01-algorithmic-problem-solving/README.md b/00-welcome/01-algorithmic-problem-solving/README.md new file mode 100644 index 00000000..f3f34872 --- /dev/null +++ b/00-welcome/01-algorithmic-problem-solving/README.md @@ -0,0 +1,124 @@ +# Algorithmic Problem Solving + +An algorithm is just a procedure that solves a problem. If you’re wondering if +that’s any different from the work you’ve already been doing, we’ve got good +news: It’s not! + +In this reading, we’ll go over the importance of solving such problems and how +to approach coming up with solutions. + +## Why Solve Algorithm Problems? + +Working through these challenges will not only help you during the technical +interview process, it will also help you become a better programmer. Learning +how to break apart a problem into pieces you can understand and then code a +solution for is a vital skill, as is learning to think about the different types +of inputs - or test cases - your solution must account for. + +As you grow as a developer, you’ll find yourself leaning on these skills more +and more, especially as your work becomes more challenging. These skills will +truly help you in any and every project you take on. + +## How to Solve a Problem + +Two mistakes many programmers make are to jump into code too fast or to start +thinking about code optimization too early. Both of these mistakes can greatly +increase the amount of time it takes to solve a problem and increase +frustration. To avoid this, here are the steps we recommend taking: + +### 1. Spend Time Understanding the Problem + +Before you dive into solving the problem, take the time to read it and describe +it in your own words. You might find it useful to rewrite the problem before +moving on. + +If you have been given test cases, look at each one, apply your understanding of +the problem to them to determine what the answer is, and then check if your +answer matches the actual answer (e.g. work it out on paper or in your head, no +code necessary here). If your answer doesn’t match, you need to spend more time +understanding the problem. + +### 2. Write Your Own Test Cases + +Now that you understand the problem and why the answers to the test cases are +what they are, you’re ready to write your own test cases! We are not +recommending that you write test suites in Rspec or Jest. Instead, you simply +print the result of calling your solution method and compare it to the answer +you expected. + +Be aware that algorithm problem descriptions rarely provide all of the test +cases you need to account for, so it’s incredibly important that you also come +up with your own. This is true when using online platforms, such as Leetcode and +HackerRank, as well as during interviews. + +### 3. Pseudocode + +Remember how we asked you to check your understanding of the problem by going +through the test cases and then writing your own tests? Congratulations! This +means that on some level, you know how to solve the problem. Before you start +coding, write pseudocode, which is just a plain description of how to solve the +problem. For example, the pseudocode for copying only numbers from one array to +another might look like this: + +``` +initialize empty array called result + +iterate over each item in the input array: + if element is a number: + push item onto result + +return result +``` + +Note that different people write pseudocode differently. The key is to make it +easy to understand yourself and explain to others - this is the map to the code +you’re about to write! I often paste my pseudocode into my workspace as +comments, and then code each piece alongside the matching comment. + +You can also test this procedure against the test cases before writing any code. +Validating and rewriting pseudocode will likely save you time. You might also +wish to think about additional solutions: there’s always more than one way to +solve a problem. + +### 4. Code! + +Now that you have a map, convert it to code! + +At this point, the goal is to make it work: pass those test cases! If you’re +having a hard time getting all of the test cases working, check that your +pseudocode actually solves for all of those cases and then check that your code +does what the pseudocode says it should. + +### 5. Make It Clean and Readable + +Once your solution is well, a solution, it’s time to refactor your code so that +it’s easy to read, not just for you but also for others. Use well-named +variables and convert blocks of code to methods when necessary. If you find any +unneeded or redundant code, delete it. + +Don’t forget to test your code again! + +### 6. Optimize? + +Don’t optimize your code for time or space complexity (e.g. how long it takes to +run or how much memory it’s using) unless you absolutely need to. There are +three major situations that call for optimization: + +- The solution is hanging on certain test cases, and therefore cannot pass since it’s taking too long +- You were asked to do so +- You think it would be fun to try + +### Conclusion + +We hope these steps help you solve the problems you’re about to encounter. +Remember, they can be applied to all types of problems, including building web +apps. Don’t be afraid to spend more time thinking and planning than coding. Take +it from those of us who have been coding for years: we often spend more time +thinking, talking, and writing than we do coding. + +Before we go, we’d like to leave you with some final tips: + +- Talk to yourself while you code: think out loud +- Consider recording your screen and voice as you solve a problem so you can + review your performance +- Take your time and be patient with yourself! diff --git a/00-welcome/02-a-note-on-testing/README.md b/00-welcome/02-a-note-on-testing/README.md new file mode 100644 index 00000000..b2161e5c --- /dev/null +++ b/00-welcome/02-a-note-on-testing/README.md @@ -0,0 +1,16 @@ +# A Note on Testing + +If we have made a test suite available for a problem, please refrain from +looking at or running those tests until you have: + +- Passed the tests given in the README +- Passed the tests you wrote yourself + +This will give you a chance to think through the problem and write your own test +cases, which is a skill you’ll need when interviewing. + +After you run our tests, you might notice that you missed some test cases: this +is a good thing - it’s a chance for you to learn and grow as a programmer. You +won’t always think of all of the necessary test cases, but as time goes by, +you’ll get better and better at thinking of all of the possible inputs that need +to be solved for before a solution can be considered complete. diff --git a/00-welcome/03-problem-solving-tips/README.md b/00-welcome/03-problem-solving-tips/README.md new file mode 100644 index 00000000..1858eb23 --- /dev/null +++ b/00-welcome/03-problem-solving-tips/README.md @@ -0,0 +1,54 @@ +# Problem-Solving Tips + +If you’re stuck, ask yourself these questions to see if they help you get +unstuck: + +- Have I solved a similar problem before? How can I use that knowledge to solve + this one? +- Can I break this problem down into smaller problems that are easier to solve? +- Would it help to draw a picture or diagram of the problem? +- Which inputs might this method receive? Do my test cases cover the edge cases? +- Should I draw a table that maps inputs to outputs? Your test cases will then + mirror that table! The process of drawing the table might also reveal a + pattern, which you can then use to solve the problem. + + - Example table for a problem where an Array of distinct values must be returned: + + | Input | Output | + | ------------------- | ------------- | + | [1, 2, 2, 3] | [1, 2, 3] | + | [] | [] | + | [4] | [4] | + | [3, 2, 2, 10, 2, 7] | [3, 2, 10, 7] | + +- Do I really understand the problem? You can prove this to yourself by solving + it on paper without thinking about code. +- Can I talk to someone about this and explain my thinking? + - Sometimes the act of talking to someone even if they don’t say anything + helps you get unstuck. It forces you to explain the problem in more + understandable language. +- What information is available to me in this problem? What additional + information can I derive? + - If you have experience writing or deriving mathematical equations, this is a + similar process: list which variables and mathematical operations are + available and then the additional information that can be derived from that. + - If you have experience creating artwork, this is similar to the process of + understanding what tools you have available to you and how you can use them, + e.g. what colors are in my palette and how can I mix them? Or I have a + string, tape, and a pencil, and I need to draw a circle - how do I do that? + - Example: For a problem where an Array of distinct values must be returned, + some of the information available includes: the Array itself, each element + in the Array, its length, and the index of each item. You can find a list of + Array operations available by looking at the documentation. +- Can or should I create additional data to help me solve the problem? What do I + need to keep track of for my solution to work? + - Consider adding variables and ask yourself which data structures are + required and how they might help. + - Example: For a problem where an Array of distinct values must be returned, + you might think about using an additional Array or a Hash (aka POJO/Object + in JavaScript or Dictionary in Python) or a Set. +- Have I taken care of myself today? Do I need to eat? Am I hydrated? Am I + rested? Do I need to move my body? + - You’ll be surprised how much better your brain works after eating a good + meal, drinking water, resting and/or exercising! Don’t let yourself get + [hangry](https://www.merriam-webster.com/dictionary/hangry)! diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/.gitignore b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/README.md b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/README.md new file mode 100644 index 00000000..2c45cd81 --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/README.md @@ -0,0 +1,53 @@ +# Day 1: Reverse a String + +For this task, you'll need to reverse a string. Your method will receive one argument, a string, and be expected to output that string with its letters in reverse order. + +``` +Input: "hi" +Output: "ih" + +Input: "catbaby" +Output: "ybabtac" +``` + +**Do not call any type of built-in reverse method!** + +Please solve the problem using iteration. + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/package.json b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/package.json new file mode 100644 index 00000000..df161685 --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "reverse_string", + "version": "1.0.0", + "description": "reverse a string", + "main": "reverse_string.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} \ No newline at end of file diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/reverse_string.js b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/reverse_string.js new file mode 100644 index 00000000..9eda6e9f --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/reverse_string.js @@ -0,0 +1,19 @@ +function reverseString(str) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 'ih'"); + console.log("=>", reverseString("hi")); + + console.log(""); + + console.log("Expecting: 'ybabtac'"); + console.log("=>", reverseString("catbaby")); +} + +module.exports = reverseString; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/tests/reverse_string.test.js b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/tests/reverse_string.test.js new file mode 100644 index 00000000..9b2e65cd --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/javascript/tests/reverse_string.test.js @@ -0,0 +1,21 @@ +const reverseString = require('../reverse_string'); + +test("can handle an empty string", () => { + expect(reverseString("")).toBe(""); +}); + +test("can handle a single character", () => { + expect(reverseString("a")).toBe("a"); +}); + +test("can handle two characters", () => { + expect(reverseString("ab")).toBe("ba"); +}); + +test("can handle three characters", () => { + expect(reverseString("cat")).toBe("tac"); +}); + +test("can handle many characters", () => { + expect(reverseString("sham-meow")).toBe("sham-meow".split("").reverse().join("")); +}); diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/.rspec b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/Gemfile b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/reverse_string.rb b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/reverse_string.rb new file mode 100644 index 00000000..99487efc --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/reverse_string.rb @@ -0,0 +1,18 @@ +def reverse_string(str) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 'ih'" + puts "=>", reverse_string('hi') + + puts + + puts "Expecting: 'ybabtac'" + puts "=>", reverse_string('catbaby') + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution \ No newline at end of file diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/spec/reverse_string_spec.rb b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/spec/reverse_string_spec.rb new file mode 100644 index 00000000..f906e168 --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/spec/reverse_string_spec.rb @@ -0,0 +1,23 @@ +require './reverse_string' + +RSpec.describe '#reverse_string' do + it "can handle an empty string" do + expect(reverse_string('')).to eq('') + end + + it "can handle a single character" do + expect(reverse_string('a')).to eq('a') + end + + it "can handle two characters" do + expect(reverse_string('ab')).to eq('ba') + end + + it "can handle three characters" do + expect(reverse_string('cat')).to eq('tac') + end + + it "can handle many characters" do + expect(reverse_string('sham-meow')).to eq('sham-meow'.reverse) + end +end \ No newline at end of file diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/spec/spec_helper.rb b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/solutions/reverse_string.js b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/solutions/reverse_string.js new file mode 100644 index 00000000..01400d4b --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/solutions/reverse_string.js @@ -0,0 +1,47 @@ +function reverseString(str) { + let reversed = ""; + + for (let i = str.length - 1; i > -1; --i) { + reversed = reversed + str[i]; + } + + return reversed; +} + +console.log("Expecting: 'ih'"); +console.log(reverseString('hi')); + +console.log(""); + +console.log("Expecting: 'ybabtac'"); +console.log(reverseString('catbaby')); + +console.log(""); + +console.log("Expecting: 'a'"); +console.log(reverseString('a')); + +console.log(""); + +console.log("Expecting: '' (empty string)"); +console.log(reverseString('')); + +// Please add your pseudocode to this file +/************************************************** + * initialize a variable called reversed with an empty string + * + * iterate backwards through the input string: + * set reversed to reversed + current character + * + * return reversed + * ************************************************/ + + +// And a written explanation of your solution +/************************************************** + * If I iterate over the input string backwards, I should be able + * to add whichever character I'm currently iterating over onto + * my result string (""). For example, if the string is "ab", I'll iterate + * over "b" first, add that to my result ("b"), and then iterate over + * "a", and add that to my result next ("ba"). + * ************************************************/ diff --git a/01-week-1--starter-algorithms/00-day-1--reverse-a-string/solutions/reverse_string.rb b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/solutions/reverse_string.rb new file mode 100644 index 00000000..14962243 --- /dev/null +++ b/01-week-1--starter-algorithms/00-day-1--reverse-a-string/solutions/reverse_string.rb @@ -0,0 +1,49 @@ +def reverse_string(str) + reversed_str = "" + + str.chars.each do |char| + reversed_str = char + reversed_str + end + + reversed_str +end + +puts "Expecting: 'ih'" +puts reverse_string('hi') + +puts + +puts "Expecting: 'ybabtac'" +puts reverse_string('catbaby') + +puts + +puts "Expecting: '' (empty string)" +puts reverse_string('') + +puts + +puts "Expecting: 'a'" +puts reverse_string('a') + +############################################################################ +# Please add your pseudocode to this file: + +# initialize reversed_str to store empty string + +# iterate over each letter in the input string: +# place character before previous characters and store result in reversed_str + +# return reversed_str +############################################################################ + +############################################################################ +# And a written explanation of your solution: + +# The simplest way I can think of reversing a string is to start by thinking of a really +# simple example: "ab" + +# To solve for "ab", you take "a", store it in a variable, and then take the next character "b", +# and place it before "a" in that same variable. If we do this for each character, we should be +# able to reverse the string. +############################################################################ \ No newline at end of file diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/.gitignore b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/README.md b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/README.md new file mode 100644 index 00000000..4ecd5f51 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/README.md @@ -0,0 +1,49 @@ +# Day 2: Find First Duplicate + +Given an Array, find the first duplicate value that occurs. If there are no duplicates, return -1. + +``` +Input: [2, 1, 3, 3, 2] +Output: 3 + +Input: [1, 2, 3, 4] +Output: -1 +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/find_first_duplicate.js b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/find_first_duplicate.js new file mode 100644 index 00000000..ff277623 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/find_first_duplicate.js @@ -0,0 +1,19 @@ +function findFirstDuplicate(arr) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 3"); + console.log("=>", findFirstDuplicate([2, 1, 3, 3, 2])); + + console.log(""); + + console.log("Expecting: -1"); + console.log("=>", findFirstDuplicate([1, 2, 3, 4])); +} + +module.exports = findFirstDuplicate; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/package.json b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/package.json new file mode 100644 index 00000000..94217e3e --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "find_first_duplicate", + "version": "1.0.0", + "description": "find_first_duplicate", + "main": "find_first_duplicate.js", + "dependencies": {}, + "devDependencies": { + "jest": "^26.6.3" + }, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/tests/find_first_duplicate.test.js b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/tests/find_first_duplicate.test.js new file mode 100644 index 00000000..b409c830 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/javascript/tests/find_first_duplicate.test.js @@ -0,0 +1,17 @@ +const findFirstDuplicate = require('../find_first_duplicate'); + +test('can handle an empty array', () => { + expect(findFirstDuplicate([])).toBe(-1); +}); + +test('can handle an array containing one element', () => { + expect(findFirstDuplicate([4])).toBe(-1); +}); + +test('finds the first duplicate when there is only one duplicate', () => { + expect(findFirstDuplicate([2, 2])).toBe(2); +}); + +test('finds the first duplicate in an Array containing multiple duplicates', () => { + expect(findFirstDuplicate([1, 2, 3, 3, 2, 1])).toBe(3); +}); diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/.rspec b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/Gemfile b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/find_first_duplicate.rb b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/find_first_duplicate.rb new file mode 100644 index 00000000..10ee1758 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/find_first_duplicate.rb @@ -0,0 +1,18 @@ +def find_first_duplicate(arr) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 3" + puts "=>", find_first_duplicate([2, 1, 3, 3, 2]) + + puts + + puts "Expecting: -1" + puts "=>", find_first_duplicate([1, 2, 3, 4]) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/spec/find_first_duplicate_spec.rb b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/spec/find_first_duplicate_spec.rb new file mode 100644 index 00000000..2e9f0b61 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/spec/find_first_duplicate_spec.rb @@ -0,0 +1,19 @@ +require './find_first_duplicate' + +RSpec.describe '#find_first_duplicate' do + it 'can handle an empty array' do + expect(find_first_duplicate([])).to eq(-1) + end + + it 'can handle an array containing one element' do + expect(find_first_duplicate([4])).to eq(-1) + end + + it 'finds the first duplicate when there is only one duplicate' do + expect(find_first_duplicate([2, 2])).to eq(2) + end + + it 'finds the first duplicate in an Array containing multiple duplicates' do + expect(find_first_duplicate([1, 2, 3, 3, 2, 1])).to eq(3) + end +end \ No newline at end of file diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/spec/spec_helper.rb b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/solutions/find_first_duplicate.js b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/solutions/find_first_duplicate.js new file mode 100644 index 00000000..48ed48b0 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/solutions/find_first_duplicate.js @@ -0,0 +1,62 @@ +function findFirstDuplicate(arr) { + const uniques = new Set(); + + for (const value of arr) { + if (uniques.has(value)) { + return value; + } + + uniques.add(value); + } + + return -1; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 3"); + console.log(findFirstDuplicate([2, 1, 3, 3, 2])); + + console.log(""); + + console.log("Expecting: -1"); + console.log(findFirstDuplicate([1, 2, 3, 4])); + + console.log(""); + + console.log("Expecting: -1"); + console.log(findFirstDuplicate([])); + + console.log(""); + + console.log("Expecting: -1"); + console.log(findFirstDuplicate([5])); + + console.log(""); + + console.log("Expecting: 7"); + console.log(findFirstDuplicate([7, 1, 2, 3, 7])); +} + +module.exports = findFirstDuplicate; + +// Please add your pseudocode to this file +/****************************************************************** + * initialize an empty set called uniques + * + * iterate through the input array: + * if the value is in uniques, return the value + * else add the value to the set + * + * return -1 if no duplicate found during iteration + * ***************************************************************/ + +// And a written explanation of your solution +/******************************************************************* + * A Set is a data structure that contains only unique objects/values. + * If I check if a value is in a Set before adding it, I'll know if there's + * a duplicate. If there's a duplicate, I'll just return that value right + * away because that'll be the first duplicate in the input array. If we + * exit iteration without returning anything, that means there's no duplicate, + * so we'll return -1 + * *******************************************************************/ diff --git a/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/solutions/find_first_duplicate.rb b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/solutions/find_first_duplicate.rb new file mode 100644 index 00000000..4c01b486 --- /dev/null +++ b/01-week-1--starter-algorithms/01-day-2--find-first-duplicate/solutions/find_first_duplicate.rb @@ -0,0 +1,59 @@ +require 'set' + +def find_first_duplicate(arr) + uniques = Set.new + + arr.each do |value| + return value if uniques.include?(value) + + uniques.add(value) + end + + -1 +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 3" + puts find_first_duplicate([2, 1, 3, 3, 2]) + + puts + + puts "Expecting: -1" + puts find_first_duplicate([1, 2, 3, 4]) + + puts + + puts "Expecting: -1" + puts find_first_duplicate([]) + + puts + + puts "Expecting: -1" + puts find_first_duplicate([4]) + + puts + + puts "Expecting: 7" + puts find_first_duplicate([7, 1, 2, 3, 7]) +end + +# Please add your pseudocode to this file +#################################################################### + # initialize an empty set called uniques + # + # iterate through the input array: + # if the value is in uniques, return the value + # else add the value to the set + # + # return -1 if no duplicate found during iteration +##################################################################### + +# And a written explanation of your solution +#################################################################### + # A Set is a data structure that contains only unique objects/values. + # If I check if a value is in a Set before adding it, I'll know if there's + # a duplicate. If there's a duplicate, I'll just return that value right + # away because that'll be the first duplicate in the input array. If we + # exit iteration without returning anything, that means there's no duplicate, + # so we'll return -1 + #################################################################### diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/.gitignore b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/README.md b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/README.md new file mode 100644 index 00000000..2520e998 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/README.md @@ -0,0 +1,54 @@ +# Day 3: Fibonacci Series + +Find the nth element in the Fibonacci series. The Fibonacci sequence starts with a 0 followed by a 1. After that, every value is the sum of the two values preceding it. Here are the first seven values as an example: 0, 1, 1, 2, 3, 5, 8. + +``` +Input: 0 +Output: 0 + +Input: 2 +Output: 1 + +Input: 10 +Output: 55 +``` + +Note that we are using zero-indexing for the series. + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/fibonacci.js b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/fibonacci.js new file mode 100644 index 00000000..d10cae73 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/fibonacci.js @@ -0,0 +1,24 @@ +function fibonacci(num) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 0"); + console.log("=>", fibonacci(0)); + + console.log(""); + + console.log("Expecting: 1"); + console.log("=>", fibonacci(2)); + + console.log(""); + + console.log("Expecting: 55"); + console.log("=>", fibonacci(10)); +} + +module.exports = fibonacci; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/package.json b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/package.json new file mode 100644 index 00000000..c0b37698 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "fibonacci", + "version": "1.0.0", + "description": "find nth value in fibo sequence", + "main": "fibonacci.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} \ No newline at end of file diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/tests/fibonacci.test.js b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/tests/fibonacci.test.js new file mode 100644 index 00000000..2a46c7a7 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/javascript/tests/fibonacci.test.js @@ -0,0 +1,13 @@ +const fibonacci = require('../fibonacci'); + +const fibo = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811]; + +for (let i = 0; i < 10; ++i) { + test(`outputs the correct number in the sequence at index ${i}`, () => { + expect(fibonacci(i)).toBe(fibo[i]); + }); +} + +test('outputs the correct number in the sequence at index 28', () => { + expect(fibonacci(28)).toBe(fibo[28]); +}); diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/.rspec b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/Gemfile b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/fibonacci.rb b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/fibonacci.rb new file mode 100644 index 00000000..2837ba84 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/fibonacci.rb @@ -0,0 +1,23 @@ +def fibonacci(num) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 0" + puts "=>", fibonacci(0) + + puts + + puts "Expecting: 1" + puts "=>", fibonacci(2) + + puts + + puts "Expecting: 55" + puts "=>", fibonacci(10) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/spec/fibonacci_spec.rb b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/spec/fibonacci_spec.rb new file mode 100644 index 00000000..93dd94b0 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/spec/fibonacci_spec.rb @@ -0,0 +1,15 @@ +require './fibonacci' + +RSpec.describe '#fibonacci' do + fibo = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811] + + 10.times do |n| + it "outputs the correct number in the sequence at index #{n}" do + expect(fibonacci(n)).to eq(fibo[n]) + end + end + + it "outputs the correct number at index 28" do + expect(fibonacci(28)).to eq(fibo[28]) + end +end \ No newline at end of file diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/spec/spec_helper.rb b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/solutions/fibonacci.js b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/solutions/fibonacci.js new file mode 100644 index 00000000..ae251bea --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/solutions/fibonacci.js @@ -0,0 +1,67 @@ +function fibonacci(num) { + if (num < 2) { + return num; + } + + let lastTwo = [0, 1]; + + for (let i = 0; i < num - 1; ++i) { + const sum = lastTwo[0] + lastTwo[1]; + lastTwo = [lastTwo[1], sum]; + } + + return lastTwo[1]; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 0"); + console.log(fibonacci(0)); + + console.log(""); + + console.log("Expecting: 1"); + console.log(fibonacci(2)); + + console.log(""); + + console.log("Expecting: 55"); + console.log(fibonacci(10)); + + console.log(""); + + console.log("Expecting: 1"); + console.log(fibonacci(1)); + + console.log(""); + + console.log("Expecting: 6765"); + console.log(fibonacci(20)); +} + +module.exports = fibonacci; + +// Please add your pseudocode to this file +/******************************************************************** + * if the input is 0 or 1, return the input + * + * initialize an Array called lastTwo with the first two values from the sequence + * + * loop input - 1 times: + * store the sum of the values in lastTwo in a variable called sum + * remove the first element from lastTwo + * push sum onto lastTwo + * + * return the last value in lastTwo + * *****************************************************************/ + +// And a written explanation of your solution +/******************************************************************** + * Since the fibonacci sequence is always the same, I can initialize an Array + * with the first two values of the sequence. I only need to store two values + * because the next value is the sum of the two values that came before it. By + * adding up the two values I'm storing, I'll always get the next value. If I do + * that enough times (num - 1), once I'm done adding up the values, the last value + * will be the nth value in the sequence. Every time I add up the two values, I need + * to remove the 0th value I'm storing and then push the sum onto that array. +***********************************************************************/ \ No newline at end of file diff --git a/01-week-1--starter-algorithms/02-day-3--fibonacci-series/solutions/fibonacci.rb b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/solutions/fibonacci.rb new file mode 100644 index 00000000..50f92dd2 --- /dev/null +++ b/01-week-1--starter-algorithms/02-day-3--fibonacci-series/solutions/fibonacci.rb @@ -0,0 +1,63 @@ +def fibonacci(num) + last_two = [0, 1] + + return last_two[num] if num < 2 + + (num - 1).times do + sum = last_two[0] + last_two[1] + last_two = [last_two[1], sum] + end + + last_two.last +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 0" + puts fibonacci(0) + + puts + + puts "Expecting: 1" + puts fibonacci(2) + + puts + + puts "Expecting: 55" + puts fibonacci(10) + + # Don't forget to add your own! + puts + + puts "Expecting: 1" + puts fibonacci(1) + + puts + + puts "Expecting: 6765" + puts fibonacci(20) +end + +# Please add your pseudocode to this file +######################################################################### +# initialize an Array called last_two with the first two values from the sequence +# +# if the input is 0 or 1, return the value at that index from last_two +# +# loop input - 1 times: +# store the sum of the values in last_two in a variable called sum +# remove the first element from last_two +# push sum onto last_two +# +# return the last value in last_two +######################################################################### + +# And a written explanation of your solution +######################################################################### +# Since the fibonacci sequence is always the same, I can initialize an Array +# with the first two values of the sequence. I only need to store two values +# because the next value is the sum of the two values that came before it. By +# adding up the two values I'm storing, I'll always get the next value. If I do +# that enough times (num - 1), once I'm done adding up the values, the last value +# will be the nth value in the sequence. Every time I add up the two values, I need +# to remove the 0th value I'm storing and then push the sum onto that array. +######################################################################### diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/.gitignore b/01-week-1--starter-algorithms/03-day-4--selection-sort/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/README.md b/01-week-1--starter-algorithms/03-day-4--selection-sort/README.md new file mode 100644 index 00000000..82a50293 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/README.md @@ -0,0 +1,64 @@ +# Day 4: Selection Sort + +Sort an Array of numbers using selection sort. The selection sort algorithm sorts an array by repeatedly finding the minimum element (lowest value) in the input Array, and then putting it at the correct location in the sorted Array. + +``` +Input: [3, -1, 5, 2] +Output: [-1, 2, 3, 5] +``` + +**Benchmarking** + +For this task, we are also asking you to calculate the average runtime of your solution. In other words, you run it a bunch of times and then divide the total time it took for the solution to run by the number of times it ran. + +Here is the pseudocode for creating your own basic benchmarking procedure: + +``` +store the current time in a variable called start time + +loop 1000 times: + execute the method using a small input, e.g. three items if input is an Array + execute the method using a larger input, e.g. 100 items if input is an Array + +average runtime = (current time - start time) / 2000 +``` + +We have provided you with the long input to use for benchmarking. + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/package.json b/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/package.json new file mode 100644 index 00000000..7ac9270d --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "selection-sort", + "version": "1.0.0", + "description": "sort using selection sort", + "main": "selection_sort.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/selection_sort.js b/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/selection_sort.js new file mode 100644 index 00000000..230c8030 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/selection_sort.js @@ -0,0 +1,23 @@ +function selectionSort(arr) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [-1, 2, 3, 5]"); + console.log("=>", selectionSort([3, -1, 5, 2])); + + console.log(""); + + // BENCHMARK HERE, and print the average runtime + const longInput = []; + + for (let i = 0; i < 100; ++i) { + longInput.push(Math.random()); + } +} + +module.exports = selectionSort; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/tests/selection_sort.test.js b/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/tests/selection_sort.test.js new file mode 100644 index 00000000..7a4574ba --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/javascript/tests/selection_sort.test.js @@ -0,0 +1,26 @@ +const selectionSort = require('../selection_sort'); + +test('can handle an empty array', () => { + expect(selectionSort([])).toEqual([]); +}); + +test('can sort one element', () => { + expect(selectionSort([5])).toEqual([5]); +}); + +test('can sort two elements', () => { + expect(selectionSort([3, 1])).toEqual([1, 3]); +}); + +test('can sort several elements', () => { + expect(selectionSort([10, 4, 3, 2, 1, 5])).toEqual([1, 2, 3, 4, 5, 10]); +}); + +test('can sort negative and positive values', () => { + expect(selectionSort([-1, -2, 4, 2])).toEqual([-2, -1, 2, 4]); +}); + +test('can sort an array containing repeating values', () => { + expect(selectionSort([1, 4, 2, 1, 2, 4, 20, -2])).toEqual([1, 4, 2, 1, 2, 4, 20, -2].sort((a, b) => a - b)); +}); + diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/.rspec b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/Gemfile b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/selection_sort.rb b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/selection_sort.rb new file mode 100644 index 00000000..d9134f52 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/selection_sort.rb @@ -0,0 +1,21 @@ +def selection_sort(arr) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [-1, 2, 3, 5]" + print "=> " + print selection_sort([3, -1, 5, 2]) + + puts + + # Don't forget to add your own! + + # BENCHMARK HERE, you can print the average runtime + long_input = [] + + 100.times { long_input << rand } +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/spec/selection_sort_spec.rb b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/spec/selection_sort_spec.rb new file mode 100644 index 00000000..58a629b5 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/spec/selection_sort_spec.rb @@ -0,0 +1,27 @@ +require './selection_sort' + +RSpec.describe '#selection_sort' do + it 'can handle an empty array' do + expect(selection_sort([])).to eq([]) + end + + it 'can sort one element' do + expect(selection_sort([5])).to eq([5]) + end + + it 'can sort two elements' do + expect(selection_sort([3, 1])).to eq([1, 3]) + end + + it 'can sort several elements' do + expect(selection_sort([10, 4, 3, 2, 1, 5])).to eq([1, 2, 3, 4, 5, 10]) + end + + it 'can sort negative and positive values' do + expect(selection_sort([-1, -2, 4, 2])).to eq([-2, -1, 2, 4]) + end + + it 'can sort an array containing repeating values' do + expect(selection_sort([1, 4, 2, 1, 2, 4, 20, -2])).to eq([1, 4, 2, 1, 2, 4, 20, -2].sort) + end +end \ No newline at end of file diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/spec/spec_helper.rb b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/solutions/selection_sort.js b/01-week-1--starter-algorithms/03-day-4--selection-sort/solutions/selection_sort.js new file mode 100644 index 00000000..92774be4 --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/solutions/selection_sort.js @@ -0,0 +1,84 @@ +function selectionSort(arr) { + const sorted = []; + + while (arr.length > 0) { + const min = Math.min(...arr); + const idx = arr.indexOf(min); + + sorted.push(min); + arr.splice(idx, 1); + } + + return sorted; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [-1, 2, 3, 5]"); + console.log(selectionSort([3, -1, 5, 2])); + + console.log(""); + + console.log("Expecting: []"); + console.log(selectionSort([])); + + console.log(""); + + console.log("Expecting: [-1]"); + console.log(selectionSort([-1])); + + console.log(""); + + console.log("Expecting: [-10, 2, 2, 3, 7]"); + console.log(selectionSort([3, 2, 2, 7, -10])); + + console.log(""); + + console.log("Expecting: [100, 200]"); + console.log(selectionSort([100, 200])); + + console.log(""); + + // BENCHMARK HERE, and print the average runtime + const longInput = []; + + for (let i = 0; i < 100; ++i) { + longInput.push(Math.random()); + } + + const startTime = Date.now(); + + for (let i = 0; i < 1000; ++i) { + selectionSort([2, 1]); + selectionSort(longInput); + } + + const avgTime = (Date.now() - startTime) / 2000; + + console.log(avgTime); +} + +module.exports = selectionSort; + +// Please add your pseudocode to this file +/*************************************************************************** + * initialize an empty Array called sorted + * + * loop array length times: + * store minimum value in array in min + * remove minimum value from input array + * push min onto sorted + * + * return sorted +****************************************************************************/ + +// And a written explanation of your solution +/**************************************************************************** + * The selection sort algorithm states that we need to find the minimum value + * of the input array and place it in another array until all of the values have + * been placed. This means I can find the minimum in the input, remove it from the + * input, and push it onto another array in order to sort the values. The first time + * I find the minimum in the input, that's the lowest value, the second time I find + * the minimum, that's the second lowest value, and so on. Once the input array is + * empty, the sorting is complete. + * **************************************************************************/ \ No newline at end of file diff --git a/01-week-1--starter-algorithms/03-day-4--selection-sort/solutions/selection_sort.rb b/01-week-1--starter-algorithms/03-day-4--selection-sort/solutions/selection_sort.rb new file mode 100644 index 00000000..ab7aa6eb --- /dev/null +++ b/01-week-1--starter-algorithms/03-day-4--selection-sort/solutions/selection_sort.rb @@ -0,0 +1,78 @@ +def selection_sort(arr) + sorted = [] + + until arr.length == 0 + min = arr.min + idx = arr.index(min) + sorted << min + arr.delete_at(idx) + end + + sorted +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [-1, 2, 3, 5]" + print selection_sort([3, -1, 5, 2]) + + puts + + puts "Expecting: []" + print selection_sort([]) + + puts + + puts "Expecting: [-1]" + print selection_sort([-1]) + + puts + + puts "Expecting: [-10, 2, 2, 3, 7]" + print selection_sort([3, 2, 2, 7, -10]) + + puts + + puts "Expecting: [100, 200]" + print selection_sort([100, 200]) + + puts + # Don't forget to add your own! + + # BENCHMARK HERE, you can print the average runtime + long_input = [] + + 100.times { long_input << rand } + + start_time = Time.now + + 1000.times do + selection_sort([2, 1]) + selection_sort(long_input) + end + + avg_time = (Time.now - start_time) / 2000 + puts avg_time +end + +# Please add your pseudocode to this file +############################################################################ + # initialize an empty Array called sorted + # + # loop array length times: + # store minimum value in array in min + # remove minimum value from input array + # push min onto sorted + # + # return sorted +############################################################################ + +# And a written explanation of your solution +############################################################################ + # The selection sort algorithm states that we need to find the minimum value + # of the input array and place it in another array until all of the values have + # been placed. This means I can find the minimum in the input, remove it from the + # input, and push it onto another array in order to sort the values. The first time + # I find the minimum in the input, that's the lowest value, the second time I find + # the minimum, that's the second lowest value, and so on. Once the input array is + # empty, the sorting is complete. +############################################################################ diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/.gitignore b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/README.md b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/README.md new file mode 100644 index 00000000..439b0601 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/README.md @@ -0,0 +1,68 @@ +# Day 5: Find Shortest String + +Given an Array of strings, return the shortest string. If there is more than one string of that length, return the string that comes first in the list. The Array will have a minimum length of 1. + +``` +Input: ['aaa', 'a', 'bb', 'ccc'] +Output: 'a' + +Input: ['cat', 'hi', 'dog', 'an'] +Output: 'hi' + +Input: ['flower', 'juniper', 'lily', 'dandelion'] +Output: 'lily' +``` + +**Benchmarking** + +For this task, we are also asking you to calculate the average runtime of your solution. In other words, you run it a bunch of times and then divide the total time it took for the solution to run by the number of times it ran. + +Here is the pseudocode for creating your own basic benchmarking procedure: + +``` +store the current time in a variable called start time + +loop 1000 times: + execute the method using a small input, e.g. three items if input is an Array + execute the method using a larger input, e.g. 100 items if input is an Array + +average runtime = (current time - start time) / 2000 +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/find_shortest_string.js b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/find_shortest_string.js new file mode 100644 index 00000000..0e2d09db --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/find_shortest_string.js @@ -0,0 +1,26 @@ +function findShortestString(arr) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 'a'"); + console.log("=>", findShortestString(['aaa', 'a', 'bb', 'ccc'])); + + console.log(""); + + console.log("Expecting: 'hi'"); + console.log("=>", findShortestString(['cat', 'hi', 'dog', 'an'])); + + console.log(""); + + console.log("Expecting: 'lily'"); + console.log("=>", findShortestString(['flower', 'juniper', 'lily', 'dadelion'])); + + // BENCHMARK HERE +} + +module.exports = findShortestString; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/package.json b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/package.json new file mode 100644 index 00000000..3872e051 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "find_shortest_string", + "version": "1.0.0", + "description": "find shortest string in a list", + "main": "find_shortest_string.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/tests/find_shortest_string.test.js b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/tests/find_shortest_string.test.js new file mode 100644 index 00000000..0bf84bbf --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/javascript/tests/find_shortest_string.test.js @@ -0,0 +1,17 @@ +const findShortestString = require('../find_shortest_string'); + +test('can handle an array containing one string', () => { + expect(findShortestString(['cat'])).toBe('cat'); +}); + +test('returns the shortest string when there is only one', () => { + expect(findShortestString(['dogbaby', 'cat', 'jammy', 'hamtaro'])).toBe('cat'); +}); + +test('returns the first occurrence of the shortest string when there are several', () => { + expect(findShortestString(['stuff', 'a', 'things', 'b', 'two'])).toBe('a'); +}); + +test('returns the empty string', () => { + expect(findShortestString(['things', 'crabapple', '', 'stuff'])).toBe(''); +}); diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/.rspec b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/Gemfile b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/find_shortest_string.rb b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/find_shortest_string.rb new file mode 100644 index 00000000..a6734404 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/find_shortest_string.rb @@ -0,0 +1,25 @@ +def find_shortest_string(arr) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 'a'" + puts "=>", find_shortest_string(['aaa', 'a', 'bb', 'ccc']) + + puts + + puts "Expecting: 'hi'" + puts "=>", find_shortest_string(['cat', 'hi', 'dog', 'an']) + + puts + + puts "Expecting: 'lily'" + puts "=>", find_shortest_string(['flower', 'juniper', 'lily', 'dadelion']) + + # Don't forget to add your own! + + # BENCHMARK HERE +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/spec/find_shortest_string_spec.rb b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/spec/find_shortest_string_spec.rb new file mode 100644 index 00000000..ecb8c62b --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/spec/find_shortest_string_spec.rb @@ -0,0 +1,19 @@ +require './find_shortest_string' + +RSpec.describe '#find_shortest_string' do + it 'can handle an array containing one string' do + expect(find_shortest_string(['cat'])).to eq('cat') + end + + it 'returns the shortest string when there is only one' do + expect(find_shortest_string(['dogbaby', 'cat', 'jammy', 'hamtaro'])).to eq('cat') + end + + it 'returns the first occurrence of the shortest string when there are several' do + expect(find_shortest_string(['stuff', 'a', 'things', 'b', 'two'])).to eq('a') + end + + it 'returns the empty string' do + expect(find_shortest_string(['things', 'crabapple', '', 'stuff'])).to eq('') + end +end diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/spec/spec_helper.rb b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/solutions/find_shortest_string.js b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/solutions/find_shortest_string.js new file mode 100644 index 00000000..5e7e61c6 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/solutions/find_shortest_string.js @@ -0,0 +1,70 @@ +function findShortestString(arr) { + // THE LONGER WAY OF DOING THE EXACT SAME THING THAT'S ON LINES 13-14 + // let shortest = arr[0]; + + // arr.forEach(string => { + // if (string.length < shortest.length) { + // shortest = string; + // } + // }); + + // return shortest; + + return arr.reduce((shortest, string) => + string.length < shortest.length ? string : shortest); +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 'a'"); + console.log(findShortestString(['aaa', 'a', 'bb', 'ccc'])); + + console.log(""); + + console.log("Expecting: 'hi'"); + console.log(findShortestString(['cat', 'hi', 'dog', 'an'])); + + console.log(""); + + console.log("Expecting: 'lily'"); + console.log(findShortestString(['flower', 'juniper', 'lily', 'dadelion'])); + + console.log(""); + + console.log("Expecting: 'cat'"); + console.log(findShortestString(['cat'])); + + // BENCHMARK HERE + const startTime = Date.now(); + + for (let i = 0; i < 1000; ++i) { + findShortestString(['flower', 'juniper', 'lily', 'dadelion']); + } + + const avgTime = (Date.now() - startTime) / 1000; + console.log(avgTime); +} + +module.exports = findShortestString; + +// Please add your pseudocode to this file +/**************************************************************************** + * store the first string from the array in a variable called shortest + * + * iterate over the array: + * if the length of the current string < shortest: + * shortest = current string + * + * return shortest +******************************************************************************/ + +// And a written explanation of your solution +/**************************************************************************** + * We can get the first occurrence of the shortest string by storing the first + * string in the input array in a variable. As we iterate over the array, we + * check if the current string is shorter than the shortest string. If it is, + * we store the current string as the shortest string. Since we are checking if + * subsequent strings are shorter than the shortest string, we will always return + * the first occurrence of the shorest string. If we iterated over a string of + * equal length to the shortest string, the value stored wouldn't change. + ******************************************************************************/ \ No newline at end of file diff --git a/01-week-1--starter-algorithms/04-day-5--find-shortest-string/solutions/find_shortest_string.rb b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/solutions/find_shortest_string.rb new file mode 100644 index 00000000..bf4d4c92 --- /dev/null +++ b/01-week-1--starter-algorithms/04-day-5--find-shortest-string/solutions/find_shortest_string.rb @@ -0,0 +1,70 @@ +def find_shortest_string(arr) + # THIS IS THE LONGER WAY OF DOING THE SAME THING ON LINES 13-15 + # shortest = arr[0] + + # arr.each do |string| + # if string.length < shortest.length + # shortest = string + # end + # end + + # return shortest + + arr.reduce do |shortest, string| + string.length < shortest.length ? string : shortest + end +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 'a'" + puts find_shortest_string(['aaa', 'a', 'bb', 'ccc']) + + puts + + puts "Expecting: 'hi'" + puts find_shortest_string(['cat', 'hi', 'dog', 'an']) + + puts + + puts "Expecting: 'lily'" + puts find_shortest_string(['flower', 'juniper', 'lily', 'dadelion']) + + puts + + puts "Expecting: 'cat'" + puts find_shortest_string(['cat']) + + # Don't forget to add your own! + + # BENCHMARK HERE + start_time = Time.now + + 1000.times do + find_shortest_string(['flower', 'juniper', 'lily', 'dadelion']) + end + + avg_time = (Time.now - start_time) / 1000.0 + puts avg_time +end + +# Please add your pseudocode to this file +#################################################################################### + # store the first string from the array in a variable called shortest + # + # iterate over the array: + # if the length of the current string < shortest: + # shortest = current string + # + # return shortest +#################################################################################### + +# And a written explanation of your solution +#################################################################################### + # We can get the first occurrence of the shortest string by storing the first + # string in the input array in a variable. As we iterate over the array, we + # check if the current string is shorter than the shortest string. If it is, + # we store the current string as the shortest string. Since we are checking if + # subsequent strings are shorter than the shortest string, we will always return + # the first occurrence of the shorest string. If we iterated over a string of + # equal length to the shortest string, the value stored wouldn't change. +#################################################################################### diff --git a/02-week-2--recursion/00-introduction-to-recursion/README.md b/02-week-2--recursion/00-introduction-to-recursion/README.md new file mode 100644 index 00000000..dafece5f --- /dev/null +++ b/02-week-2--recursion/00-introduction-to-recursion/README.md @@ -0,0 +1,120 @@ +# Introduction to Recursion + +Recursion is similar to a loop: a procedure is run over and over again until it reaches a stopping point. Recursive methods must call themselves to be considered recursive. We can use recursion anywhere we use a loop, and vice versa. Sometimes, it’s a lot easier to solve a problem using recursion, as opposed to a loop, and sometimes it’s easier to use a loop. It takes time and practice to figure out when to choose one over the other. + +## Example of Never-Ending Recursion + +``` +def talk_to_myself(n) + talk_to_myself(n) +end +``` + +In the above code, the method `talk_to_myself` is recursive because it calls itself. It, however, has a gigantic problem: there is no stopping point! + +## Base Case/s (aka the stopping point/s) + +The base case (or cases) tells the recursive method when to stop running. It is often an if statement, though it doesn’t have to be (it depends on the method and what it needs to do). + +``` +def talk_to_myself(n) + return if n <= 0.5 + + talk_to_myself(n / 2) +end +``` + +Notice how the base case comes before the recursive call to the method. If the base case came after, it would be unreachable and we’d have the same exact problem as before: there would be no stopping point and we’d hit a stack overflow. + +## Stack Overflow + +When we run a while loop where the terminating condition is never reached, we get an infinite loop. A stack overflow is similar. However, code that would eventually terminate can also cause a stack overflow if it adds too many frames to the stack. A frame is like a snapshot of all of the variables and other necessary information required to finish running the process. The stack is a data structure that stores frames. Frames are removed from the stack in last-in-first-out (LIFO) order, similar to how we eat a stack of pancakes (the last pancake is put on the stack last, and we eat that one first). + +## Depth-First Completion (LIFO) + +With recursive methods, the last recursive call will complete its execution first. Once that completes, the second to last recursive call will complete, and so on until only the first call to the method remains. Let’s go back to our `talk_to_myself` method and illustrate each frame: + +``` +def talk_to_myself(n) + return if n <= 0.5 + + talk_to_myself(n / 2) +end +``` + +- Initial Call (execution incomplete, paused on recursive call): + - `talk_to_myself(4)` +- Recursive Call 1 (execution incomplete, paused on recursive call): + - `talk_to_myself(2)` +- Recursive Call 2 (execution incomplete, paused on recursive call): + - `talk_to_myself(1)` +- Recursive Call 3 (execution incomplete, paused on recursive call): + - `talk_to_myself(0.5)` +- => Base case is hit because n <= 0.5, no more recursion! +- Recursive Call 3 completes +- Recursive Call 2 completes +- Recursive Call 1 completes +- Initial Call completes + +You can walk through and visualize this process [here](http://pythontutor.com/visualize.html#code=def%20talk_to_myself%28n%29%0A%20%20return%20if%20n%20%3C%3D%200.5%0A%0A%20%20talk_to_myself%28n%20/%202%29%0Aend%0A%0Atalk_to_myself%284%29&cumulative=false&heapPrimitives=nevernest&mode=edit&origin=opt-frontend.js&py=ruby&rawInputLstJSON=%5B%5D&textReferences=false). The frames and their data are visualized on the right side of the screen and the arrows on the left inside the IDE show you which line is being executed. Notice that the arrow pauses on the recursive call if the base case is not hit. When a recursive call finally completes execution and returns up the stack, the previous call will then continue to run from that line onward (the line where the recursion was triggered). + +## Dealing With Return Values + +Let’s go back to our code example and modify it to return the string ‘done’: + +``` +def talk_to_myself(n) + return 'done' if n <= 0.5 + + # this is where our method pauses + # it's also where our return values return to + talk_to_myself(n / 2) +end +``` + +That one small change will cause the method to return the string 'done' from every recursive call and the initial call. But how? + +Let's illustrate how using stack frames again: + +- Initial Call (execution incomplete, paused on recursive call): + - `talk_to_myself(1)` # pauses on the line of the recursive call +- Recursive Call 1 (execution incomplete, paused on recursive call): + - `talk_to_myself(0.5)` # pauses on the line of the recursive call +- => Base case is hit because `n <= 0.5`, no more recursion! 'done' is returned to the previous frame +- Recursive Call 1 receives 'done', and then returns 'done' up the stack +- Initial Call receives 'done', and then returns 'done' + +But what if we added a line of code after the recursive call? What would happen then? + +``` +def talk_to_myself(n) + return 'done' if n <= 0.5 + + # this is where our method pauses + # it's also where our return values return to + talk_to_myself(n / 2) + 'The sheep goes baaaaaahhhh' +end +``` + +- Initial Call (execution incomplete, paused on recursive call): + - `talk_to_myself(1)` # pauses on the line of the recursive call +- Recursive Call 1 (execution incomplete, paused on recursive call): + - `talk_to_myself(0.5)` # pauses on the line of the recursive call +- => Base case is hit because n <= 0.5, no more recursion! 'done' is returned to the previous frame +- Recursive Call 1 receives 'done' and returns 'The sheep goes baaaaaahhhh' up the stack +- Initial Call receives 'The sheep goes baaaaaahhhh', and then returns 'The sheep goes baaaaaahhhh' + +You can see a visualization of the code [here](http://pythontutor.com/visualize.html#code=def%20talk_to_myself%28n%29%0A%20%20%20%20return%20'done'%20if%20n%20%3C%3D%200.5%0A%0A%20%20%20%20%23%20this%20is%20where%20our%20method%20pauses%0A%20%20%20%20%23%20it's%20also%20where%20our%20return%20values%20return%20to%0A%20%20%20%20talk_to_myself%28n%20/%202%29%0A%20%20%20%20'The%20sheep%20goes%20baaaaaahhhh'%0Aend%0A%0Atalk_to_myself%281%29&cumulative=false&curInstr=10&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=ruby&rawInputLstJSON=%5B%5D&textReferences=false). + +## Conclusion + +Don't worry if this hasn't all sunk in yet. We'll get you started slowly. If you find yourself having trouble with recursion, ask yourself these questions: + +- What is/are the base case/s? Many people add those first. +- If you're getting a stack overflow: Why isn't my base case being triggered? +- What should the recursive call return? And how should I use that value? + - Remember the return value goes up the stack to the line where the recursive call was made. +- What should the method return once it has completed execution? + +You can also try drawing out the frames to trace what's happening or use this [tool](http://pythontutor.com/visualize.html#mode=edit). Start small when mapping out what's happening, e.g. in the code examples above we used the values 2 or 4, but never 20! diff --git a/02-week-2--recursion/01-day-1--recursive-counting/.gitignore b/02-week-2--recursion/01-day-1--recursive-counting/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/02-week-2--recursion/01-day-1--recursive-counting/README.md b/02-week-2--recursion/01-day-1--recursive-counting/README.md new file mode 100644 index 00000000..fd08d084 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/README.md @@ -0,0 +1,57 @@ +# Day 1: Recursive Counting + +Let's ease into recursion. For this challenge, we'd like you to convert the following while loop that counts to a recursive method that counts. We've included while loops for Ruby and JS below. Your method is successful if it prints numbers 0-9. Remember: it must call itself! + +```ruby +count = 0 + +while count < 10 + puts count + count += 1 +end +``` + +```js +let count = 0; + +while (count < 10) { + console.log(count); + ++count; +} +``` + +If you get a stack overflow, just breathe. We all get them - the trick is to get used to them and carry on solving the problem. + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +You may wish to optionally write pseudocode and an explanation of your solution for this problem. + +Feel free to run our tests whenever you like. + +## How to run your code + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/02-week-2--recursion/01-day-1--recursive-counting/javascript/package.json b/02-week-2--recursion/01-day-1--recursive-counting/javascript/package.json new file mode 100644 index 00000000..95399263 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "recursive_count", + "version": "1.0.0", + "description": "recursively count", + "main": "recursive_count.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/02-week-2--recursion/01-day-1--recursive-counting/javascript/recursive_count.js b/02-week-2--recursion/01-day-1--recursive-counting/javascript/recursive_count.js new file mode 100644 index 00000000..d995b9c7 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/javascript/recursive_count.js @@ -0,0 +1,13 @@ +function recursiveCount(num = 0) { + // type your code here +} + +if (require.main === module) { + recursiveCount(); +} + +module.exports = recursiveCount; + +// OPTIONAL +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/02-week-2--recursion/01-day-1--recursive-counting/javascript/tests/recursive_count.test.js b/02-week-2--recursion/01-day-1--recursive-counting/javascript/tests/recursive_count.test.js new file mode 100644 index 00000000..35cac8fa --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/javascript/tests/recursive_count.test.js @@ -0,0 +1,14 @@ +const recursiveCount = require('../recursive_count'); + +test('logs numbers 0 to 9', () => { + console.log = jest.fn(); + recursiveCount(); + + for (let i = 0; i < 10; ++i) { + expect(console.log).toHaveBeenCalledWith(i); + } +}); + +test('returns undefined', () => { + expect(recursiveCount()).toBe(undefined); +}); \ No newline at end of file diff --git a/02-week-2--recursion/01-day-1--recursive-counting/ruby/.rspec b/02-week-2--recursion/01-day-1--recursive-counting/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/02-week-2--recursion/01-day-1--recursive-counting/ruby/Gemfile b/02-week-2--recursion/01-day-1--recursive-counting/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/02-week-2--recursion/01-day-1--recursive-counting/ruby/recursive_count.rb b/02-week-2--recursion/01-day-1--recursive-counting/ruby/recursive_count.rb new file mode 100644 index 00000000..039678f7 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/ruby/recursive_count.rb @@ -0,0 +1,11 @@ +def recursive_count(num = 0) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + recursive_count +end + +# OPTIONAL +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/02-week-2--recursion/01-day-1--recursive-counting/ruby/spec/recursive_count_spec.rb b/02-week-2--recursion/01-day-1--recursive-counting/ruby/spec/recursive_count_spec.rb new file mode 100644 index 00000000..2d7b875a --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/ruby/spec/recursive_count_spec.rb @@ -0,0 +1,11 @@ +require './recursive_count' + +RSpec.describe '#recursive_count' do + it 'outputs numbers 0 to 9' do + expect { recursive_count }.to output("0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n").to_stdout + end + + it 'returns nil' do + expect(recursive_count).to be_nil + end +end \ No newline at end of file diff --git a/02-week-2--recursion/01-day-1--recursive-counting/ruby/spec/spec_helper.rb b/02-week-2--recursion/01-day-1--recursive-counting/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/02-week-2--recursion/01-day-1--recursive-counting/solutions/recursive_count.js b/02-week-2--recursion/01-day-1--recursive-counting/solutions/recursive_count.js new file mode 100644 index 00000000..d08d827b --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/solutions/recursive_count.js @@ -0,0 +1,27 @@ +function recursiveCount(num = 0) { + if (num >= 10) { + return; + } + + console.log(num); + recursiveCount(num + 1); + + // THIS IS ALSO A VALID OPTION INSTEAD OF THE ABOVE + // recursiveCount(++num); + + // THIS WILL CAUSE A STACK OVERFLOW. WHY? + // recursiveCount(num++); + + // IF YOU LOG NUM BELOW, THE NUMBERS PRINT BACKWARDS FROM 9 TO 0. WHY? + // console.log(num); +} + +if (require.main === module) { + recursiveCount(); +} + +module.exports = recursiveCount; + +// OPTIONAL +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/02-week-2--recursion/01-day-1--recursive-counting/solutions/recursive_count.rb b/02-week-2--recursion/01-day-1--recursive-counting/solutions/recursive_count.rb new file mode 100644 index 00000000..8c6c4b49 --- /dev/null +++ b/02-week-2--recursion/01-day-1--recursive-counting/solutions/recursive_count.rb @@ -0,0 +1,17 @@ +def recursive_count(num = 0) + # BASE CASE + return if num >= 10 + + puts num + recursive_count(num + 1) + # IF YOU PUTS NUM BELOW, THE NUMBERS PRINT BACKWARDS FROM 9 TO 0. WHY? + # puts num +end + +if __FILE__ == $PROGRAM_NAME + recursive_count +end + +# OPTIONAL +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/02-week-2--recursion/02-day-2--recursive-search/.gitignore b/02-week-2--recursion/02-day-2--recursive-search/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/02-week-2--recursion/02-day-2--recursive-search/README.md b/02-week-2--recursion/02-day-2--recursive-search/README.md new file mode 100644 index 00000000..f4b474b5 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/README.md @@ -0,0 +1,77 @@ +# Day 2: Recursive Search + +Given an Array of values, use recursion to find the target value. Return `true` if found, otherwise `false`. + +``` +Input: [1, 2, 3], 2 +Output: true + +Input: [3, 2, 1], 4 +Output: false +``` + +Sometimes it can help to solve the problem iteratively first, and then convert that to the recursive version. Here are two possible iterative solutions: one in Ruby and one in JS. + +```ruby +def iterative_search(arr, target) + arr.each do |value| + return true if value == target + end + + false +end +``` + +```js +function iterativeSearch(arr, target) { + for (const value of arr) { + if (value === target) { + return true; + } + } + + return false; +} +``` + +There are many ways to solve this problem. We suggest starting with the bases cases. What are they? + +Feeling stuck? Have a hint! Do you need to pass the whole array with every recursive call or just part of it? + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/02-week-2--recursion/02-day-2--recursive-search/javascript/package.json b/02-week-2--recursion/02-day-2--recursive-search/javascript/package.json new file mode 100644 index 00000000..a6709944 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "recursive_search", + "version": "1.0.0", + "description": "recursive search", + "main": "recursive_search.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/02-week-2--recursion/02-day-2--recursive-search/javascript/recursive_search.js b/02-week-2--recursion/02-day-2--recursive-search/javascript/recursive_search.js new file mode 100644 index 00000000..7ff60062 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/javascript/recursive_search.js @@ -0,0 +1,19 @@ +function recursiveSearch(arr, target) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: true"); + console.log("=>", recursiveSearch([1, 2, 3], 2)); + + console.log(""); + + console.log("Expecting: false"); + console.log("=>", recursiveSearch([3, 2, 1], 4)); +} + +module.exports = recursiveSearch; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/02-week-2--recursion/02-day-2--recursive-search/javascript/tests/recursive_search.test.js b/02-week-2--recursion/02-day-2--recursive-search/javascript/tests/recursive_search.test.js new file mode 100644 index 00000000..88ad0c60 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/javascript/tests/recursive_search.test.js @@ -0,0 +1,17 @@ +const recursiveSearch = require('../recursive_search'); + +test('returns false when given an empty array', () => { + expect(recursiveSearch([], 7)).toBe(false); +}); + +test('returns true when the target is in the array', () => { + expect(recursiveSearch([7], 7)).toBe(true); + expect(recursiveSearch([1, 2, 3], 2)).toBe(true); + expect(recursiveSearch([1, 2, 3], 3)).toBe(true); +}); + +test('returns false when the target is not in the array', () => { + expect(recursiveSearch([3], 7)).toBe(false); + expect(recursiveSearch([1, 2, 3], 5)).toBe(false); +}); + diff --git a/02-week-2--recursion/02-day-2--recursive-search/ruby/.rspec b/02-week-2--recursion/02-day-2--recursive-search/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/02-week-2--recursion/02-day-2--recursive-search/ruby/Gemfile b/02-week-2--recursion/02-day-2--recursive-search/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/02-week-2--recursion/02-day-2--recursive-search/ruby/recursive_search.rb b/02-week-2--recursion/02-day-2--recursive-search/ruby/recursive_search.rb new file mode 100644 index 00000000..8df0d269 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/ruby/recursive_search.rb @@ -0,0 +1,18 @@ +def recursive_search(arr, target) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: true" + puts "=>", recursive_search([1, 2, 3], 2) + + puts + + puts "Expecting: false" + puts "=>", recursive_search([3, 2, 1], 4) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/02-week-2--recursion/02-day-2--recursive-search/ruby/spec/recursive_search_spec.rb b/02-week-2--recursion/02-day-2--recursive-search/ruby/spec/recursive_search_spec.rb new file mode 100644 index 00000000..7f6b5d54 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/ruby/spec/recursive_search_spec.rb @@ -0,0 +1,18 @@ +require './recursive_search' + +RSpec.describe '#recursive_search' do + it 'returns false when given an empty array' do + expect(recursive_search([], 7)).to be false + end + + it 'returns true when the target is in the array' do + expect(recursive_search([7], 7)).to be true + expect(recursive_search([1, 2, 3], 2)).to be true + expect(recursive_search([1, 2, 3], 3)).to be true + end + + it 'returns false when the target is not in the array' do + expect(recursive_search([3], 7)).to be false + expect(recursive_search([1, 2, 3], 5)).to be false + end +end \ No newline at end of file diff --git a/02-week-2--recursion/02-day-2--recursive-search/ruby/spec/spec_helper.rb b/02-week-2--recursion/02-day-2--recursive-search/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/02-week-2--recursion/02-day-2--recursive-search/solutions/recursive_search.js b/02-week-2--recursion/02-day-2--recursive-search/solutions/recursive_search.js new file mode 100644 index 00000000..d8f56af4 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/solutions/recursive_search.js @@ -0,0 +1,52 @@ +function recursiveSearch(arr, target) { + if (arr.length === 0) { + return false; + } + + if (arr[0] === target) { + return true; + } + + return recursiveSearch(arr.slice(1), target); +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: true"); + console.log(recursiveSearch([1, 2, 3], 2)); + + console.log(""); + + console.log("Expecting: false"); + console.log(recursiveSearch([3, 2, 1], 4)); + + console.log(""); + + console.log("Expecting: false"); + console.log(recursiveSearch([], 7)); + + console.log(""); + + console.log("Expecting: true"); + console.log(recursiveSearch([7], 7)); +} + +module.exports = recursiveSearch; + +// Please add your pseudocode to this file +/***************************************************************************************** +* return false if array is empty +* return true if first element of array == target + +* return recursive_search(input array - first element, target) +******************************************************************************************/ + +// And a written explanation of your solution +/***************************************************************************************** +* There are two bases cases for this problem: if we find the target, we should return true +* and stop recursing, and if we go through all of the elements, we should stop recursing +* and return false. This means we need to operate on a subset of the array every time we +* recurse. To do this, we can pass the array minus the first element to the recursive call, +* and then check if the 0th element in the array is the target. The array will shrink by +* one element on every invocation. +******************************************************************************************/ diff --git a/02-week-2--recursion/02-day-2--recursive-search/solutions/recursive_search.rb b/02-week-2--recursion/02-day-2--recursive-search/solutions/recursive_search.rb new file mode 100644 index 00000000..07bbe687 --- /dev/null +++ b/02-week-2--recursion/02-day-2--recursive-search/solutions/recursive_search.rb @@ -0,0 +1,43 @@ +def recursive_search(arr, target) + return false if arr.empty? + return true if arr.first == target + + recursive_search(arr[1..-1], target) +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: true" + puts recursive_search([1, 2, 3], 2) + + puts + + puts "Expecting: false" + puts recursive_search([3, 2, 1], 4) + + # Don't forget to add your own! + puts + puts "Expecting: false" + puts recursive_search([], 7) + + puts + puts "Expecting: true" + puts recursive_search([7], 7) +end + +# Please add your pseudocode to this file +############################################################################ +# return false if array is empty +# return true if first element of array == target + +# return recursive_search(input array - first element, target) +############################################################################ + +# And a written explanation of your solution +############################################################################ +# There are two bases cases for this problem: if we find the target, we should return true +# and stop recursing, and if we go through all of the elements, we should stop recursing +# and return false. This means we need to operate on a subset of the array every time we +# recurse. To do this, we can pass the array minus the first element to the recursive call, +# and then check if the 0th element in the array is the target. The array will shrink by +# one element on every invocation. +############################################################################ diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/.gitignore b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/README.md b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/README.md new file mode 100644 index 00000000..7c1ac57a --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/README.md @@ -0,0 +1,90 @@ +# Day 3: Recursive Fibonacci Series + +Find the nth element in the Fibonacci series. The Fibonacci sequence starts with a 0 followed by a 1. After that, every value is the sum of the two values preceding it. Here are the first seven values as an example: 0, 1, 1, 2, 3, 5, 8. + +``` +Input: 0 +Output: 0 + +Input: 2 +Output: 1 + +Input: 10 +Output: 55 +``` + +If you solved this problem before iteratively, you may wish to convert that solution to a recursive version. Here are two iterative solutions - one in Ruby and one in JS: + +```ruby +def fibonacci(n) + return n if n < 2 + + values = [0, 1] + + (n - 1).times do + values << values[-1] + values[-2] + end + + values.last +end +``` + +```javascript +function fibonacci(n) { + if (n < 2) { + return n; + } + + const values = [0, 1]; + + for (let i = 0; i < n - 1; ++i) { + values.push(values[values.length - 1] + values[values.length - 2]); + } + + return values[values.length - 1]; +} +``` + +Hint: Code the base cases first. + +Hint: You may wish to look up how the fibonacci sequence is expressed as a formula. + +Hint: Start small. What needs to happen if n is 1 or n is 2? + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/fibonacci_recursive.js b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/fibonacci_recursive.js new file mode 100644 index 00000000..7d118da6 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/fibonacci_recursive.js @@ -0,0 +1,24 @@ +function fibonacci(n) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 0"); + console.log("=>", fibonacci(0)); + + console.log(""); + + console.log("Expecting: 1"); + console.log("=>", fibonacci(2)); + + console.log(""); + + console.log("Expecting: 55"); + console.log("=>", fibonacci(10)); +} + +module.exports = fibonacci; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/package.json b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/package.json new file mode 100644 index 00000000..55ca5050 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "fibonacci_recursive", + "version": "1.0.0", + "description": "recursive fibo", + "main": "fibonacci_recursive.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} \ No newline at end of file diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/tests/fibonacci_recursive.test.js b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/tests/fibonacci_recursive.test.js new file mode 100644 index 00000000..7d9453eb --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/javascript/tests/fibonacci_recursive.test.js @@ -0,0 +1,13 @@ +const fibonacci = require('../fibonacci_recursive'); + +const fibo = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811]; + +for (let i = 0; i < 10; ++i) { + test(`outputs the correct number in the sequence at index ${i}`, () => { + expect(fibonacci(i)).toBe(fibo[i]); + }); +} + +test('outputs the correct number in the sequence at index 28', () => { + expect(fibonacci(28)).toBe(fibo[28]); +}); diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/.rspec b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/Gemfile b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/fibonacci_recursive.rb b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/fibonacci_recursive.rb new file mode 100644 index 00000000..9e894774 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/fibonacci_recursive.rb @@ -0,0 +1,23 @@ +def fibonacci(n) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 0" + puts "=>", fibonacci(0) + + puts + + puts "Expecting: 1" + puts "=>", fibonacci(2) + + puts + + puts "Expecting: 55" + puts "=>", fibonacci(10) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/spec/fibonacci_recursive_spec.rb b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/spec/fibonacci_recursive_spec.rb new file mode 100644 index 00000000..388eb491 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/spec/fibonacci_recursive_spec.rb @@ -0,0 +1,15 @@ +require './fibonacci_recursive' + +RSpec.describe '#fibonacci' do + fibo = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811] + + 10.times do |n| + it "outputs the correct number in the sequence at index #{n}" do + expect(fibonacci(n)).to eq(fibo[n]) + end + end + + it "outputs the correct number at index 28" do + expect(fibonacci(28)).to eq(fibo[28]) + end +end \ No newline at end of file diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/spec/spec_helper.rb b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/solutions/fibonacci_recursive.js b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/solutions/fibonacci_recursive.js new file mode 100644 index 00000000..5501440d --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/solutions/fibonacci_recursive.js @@ -0,0 +1,53 @@ +function fibonacci(n) { + if (n < 2) { + return n; + } + + return fibonacci(n - 1) + fibonacci(n - 2); +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 0"); + console.log(fibonacci(0)); + + console.log(""); + + console.log("Expecting: 1"); + console.log(fibonacci(2)); + + console.log(""); + + console.log("Expecting: 55"); + console.log(fibonacci(10)); + + console.log(""); + + console.log("Expecting: 1"); + console.log(fibonacci(1)); + + console.log(""); + + console.log("Expecting: 6765"); + console.log(fibonacci(20)); +} + +module.exports = fibonacci; + +// Please add your pseudocode to this file +/************************************************************************************** +* if n is less than 2 return n +* +* return last value in sequence + second to last value in sequence +***************************************************************************************/ + +// And a written explanation of your solution +/************************************************************************************** +* We can use the same base case as the iterative version: if n is less than 2, just +* return n, since 0 and 1 are the first values in the series. After that we need to +* calculate the next value by adding up the two previous values. If we recurse until +* n equals 0 or 1, we'll hit the base case and start returning values, which can then +* be added together. For example, if we start with n = 2, our recursive call will be +* fibonacci(1) + fibonacci(0). Both sides of the equation will hit the base case. The +* left side will return 1 and the right side will return 0, resulting in a total of 1. +***************************************************************************************/ diff --git a/02-week-2--recursion/03-day-3--recursive-fibonacci-series/solutions/fibonacci_recursive.rb b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/solutions/fibonacci_recursive.rb new file mode 100644 index 00000000..56e9d1f3 --- /dev/null +++ b/02-week-2--recursion/03-day-3--recursive-fibonacci-series/solutions/fibonacci_recursive.rb @@ -0,0 +1,49 @@ +def fibonacci(n) + return n if n < 2 + + fibonacci(n - 1) + fibonacci(n - 2) +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 0" + puts fibonacci(0) + + puts + + puts "Expecting: 1" + puts fibonacci(2) + + puts + + puts "Expecting: 55" + puts fibonacci(10) + + # Don't forget to add your own! + puts + + puts "Expecting: 6765" + puts fibonacci(20) + + puts + + puts "Expecting: 1" + puts fibonacci(1) +end + +# Please add your pseudocode to this file +################################################################################ +# if n is less than 2 return n +# +# return last value in sequence + second to last value in sequence +################################################################################ + +# And a written explanation of your solution +################################################################################ +# We can use the same base case as the iterative version: if n is less than 2, just +# return n, since 0 and 1 are the first values in the series. After that we need to +# calculate the next value by adding up the two previous values. If we recurse until +# n equals 0 or 1, we'll hit the base case and start returning values, which can then +# be added together. For example, if we start with n = 2, our recursive call will be +# fibonacci(1) + fibonacci(0). Both sides of the equation will hit the base case. The +# left side will return 1 and the right side will return 0, resulting in a total of 1. +################################################################################ diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/.gitignore b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/README.md b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/README.md new file mode 100644 index 00000000..3f87daaf --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/README.md @@ -0,0 +1,72 @@ +# Day 4: Recursive Find Shortest String + +Given an Array of strings, return the shortest string. If there is more than one string of that length, return the string that comes first in the list. The Array will have a minimum length of 1. + +Once you're done solving the problem, calculate the average run time and compare it to the average run time for the iterative version. + +``` +Input: ['aaa', 'a', 'bb', 'ccc'] +Output: 'a' + +Input: ['cat', 'hi', 'dog', 'an'] +Output: 'hi' + +Input: ['flower', 'juniper', 'lily', 'dandelion'] +Output: 'lily' +``` + +You may wish to convert your iterative solution to a recursive one. We've included our old solutions in Ruby and JavaScript below: + +```ruby +def find_shortest_string(arr) + arr.reduce do |shortest, string| + string.length < shortest.length ? string : shortest + end +end +``` + +```javascript +function findShortestString(arr) { + return arr.reduce((shortest, string) => + string.length < shortest.length ? string : shortest + ); +} +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/benchmark/benchmark.js b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/benchmark/benchmark.js new file mode 100644 index 00000000..eb5d2152 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/benchmark/benchmark.js @@ -0,0 +1,17 @@ +// Paste your iterative and recursive solutions in this file +// And then calculate their average run times to compare them. + + + + + + +function benchmark(callback) { + const startTime = Date.now(); + + for (let i = 0; i < 1000; ++i) { + callback(); + } + + return (Date.now() - startTime) / 1000; +} diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/benchmark/benchmark.rb b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/benchmark/benchmark.rb new file mode 100644 index 00000000..0e29561d --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/benchmark/benchmark.rb @@ -0,0 +1,14 @@ +# Paste your iterative and recursive solutions in this file +# And then calculate their average run times to compare them. + + + +def benchmark + start_time = Time.now + + 1000.times do + yield + end + + (Time.now - start_time) / 1000 +end diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/find_shortest_string_recursive.js b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/find_shortest_string_recursive.js new file mode 100644 index 00000000..92c47e89 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/find_shortest_string_recursive.js @@ -0,0 +1,24 @@ +function findShortestStringRecursive(arr) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 'a'"); + console.log("=>", findShortestStringRecursive(['aaa', 'a', 'bb', 'ccc'])); + + console.log(""); + + console.log("Expecting: 'hi'"); + console.log("=>", findShortestStringRecursive(['cat', 'hi', 'dog', 'an'])); + + console.log(""); + + console.log("Expecting: 'lily'"); + console.log("=>", findShortestStringRecursive(['flower', 'juniper', 'lily', 'dandelion'])); +} + +module.exports = findShortestStringRecursive; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/package.json b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/package.json new file mode 100644 index 00000000..4680358c --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "find_shortest_string_recursive", + "version": "1.0.0", + "description": "find_shortest_string_recursive", + "main": "find_shortest_string_recursive.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/tests/find_shortest_string_recursive.test.js b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/tests/find_shortest_string_recursive.test.js new file mode 100644 index 00000000..7e60834e --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/javascript/tests/find_shortest_string_recursive.test.js @@ -0,0 +1,17 @@ +const findShortestStringRecursive = require('../find_shortest_string_recursive'); + +test('can handle an array containing one string', () => { + expect(findShortestStringRecursive(['cat'])).toBe('cat'); +}); + +test('returns the shortest string when there is only one', () => { + expect(findShortestStringRecursive(['dogbaby', 'cat', 'jammy', 'hamtaro'])).toBe('cat'); +}); + +test('returns the first occurrence of the shortest string when there are several', () => { + expect(findShortestStringRecursive(['stuff', 'a', 'things', 'b', 'two'])).toBe('a'); +}); + +test('returns the empty string', () => { + expect(findShortestStringRecursive(['things', 'crabapple', '', 'stuff'])).toBe(''); +}); diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/.rspec b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/Gemfile b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/find_shortest_string_recursive.rb b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/find_shortest_string_recursive.rb new file mode 100644 index 00000000..a0878be4 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/find_shortest_string_recursive.rb @@ -0,0 +1,23 @@ +def find_shortest_string_recursive(arr) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 'a'" + puts "=>", find_shortest_string_recursive(['aaa', 'a', 'bb', 'ccc']) + + puts + + puts "Expecting: 'hi'" + puts "=>", find_shortest_string_recursive(['cat', 'hi', 'dog', 'an']) + + puts + + puts "Expecting: 'lily'" + puts "=>", find_shortest_string_recursive(['flower', 'juniper', 'lily', 'dandelion']) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/spec/find_shortest_string_spec.rb b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/spec/find_shortest_string_spec.rb new file mode 100644 index 00000000..babc354b --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/spec/find_shortest_string_spec.rb @@ -0,0 +1,19 @@ +require './find_shortest_string_recursive' + +RSpec.describe '#find_shortest_string' do + it 'can handle an array containing one string' do + expect(find_shortest_string_recursive(['cat'])).to eq('cat') + end + + it 'returns the shortest string when there is only one' do + expect(find_shortest_string_recursive(['dogbaby', 'cat', 'jammy', 'hamtaro'])).to eq('cat') + end + + it 'returns the first occurrence of the shortest string when there are several' do + expect(find_shortest_string_recursive(['stuff', 'a', 'things', 'b', 'two'])).to eq('a') + end + + it 'returns the empty string' do + expect(find_shortest_string_recursive(['things', 'crabapple', '', 'stuff'])).to eq('') + end +end diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/spec/spec_helper.rb b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/benchmark/benchmark.js b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/benchmark/benchmark.js new file mode 100644 index 00000000..84c31da0 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/benchmark/benchmark.js @@ -0,0 +1,28 @@ +function findShortestString(arr) { + return arr.reduce((shortest, string) => + string.length < shortest.length ? string : shortest + ); +} + +function findShortestStringRecursive(arr) { + if (arr.length === 1) { + return arr[0]; + } + + const result = findShortestStringRecursive(arr.slice(1)); + + return arr[0].length <= result.length ? arr[0] : result; +} + +function benchmark(callback) { + const startTime = Date.now(); + + for (let i = 0; i < 1000; ++i) { + callback(); + } + + return (Date.now() - startTime) / 1000; +} + +console.log('Iterative:', benchmark(() => findShortestString(['cat', 'dogs', '', 'bats', 'flags']))); +console.log('Recursive:', benchmark(() => findShortestStringRecursive(['cat', 'dogs', '', 'bats', 'flags']))); \ No newline at end of file diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/benchmark/benchmark.rb b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/benchmark/benchmark.rb new file mode 100644 index 00000000..6a4f0a8c --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/benchmark/benchmark.rb @@ -0,0 +1,26 @@ +def find_shortest_string(arr) + arr.reduce do |shortest, string| + string.length < shortest.length ? string : shortest + end +end + +def find_shortest_string_recursive(arr) + return arr.first if arr.length == 1 + + result = find_shortest_string_recursive(arr[1..-1]) + + arr.first.length <= result.length ? arr.first : result +end + +def benchmark + start_time = Time.now + + 1000.times do + yield + end + + (Time.now - start_time) / 1000 +end + +puts "Iterative: #{benchmark { find_shortest_string(['cat', 'dogs', '', 'bats', 'flags']) }}" +puts "Recursive: #{benchmark { find_shortest_string_recursive(['cat', 'dogs', '', 'bats', 'flags']) }}" diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/find_shortest_string_recursive.js b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/find_shortest_string_recursive.js new file mode 100644 index 00000000..cdd31cd8 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/find_shortest_string_recursive.js @@ -0,0 +1,58 @@ +function findShortestStringRecursive(arr) { + if (arr.length === 1) { + return arr[0]; + } + + const result = findShortestStringRecursive(arr.slice(1)); + + return arr[0].length <= result.length ? arr[0] : result; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 'a'"); + console.log(findShortestStringRecursive(['aaa', 'a', 'bb', 'ccc'])); + + console.log(""); + + console.log("Expecting: 'hi'"); + console.log(findShortestStringRecursive(['cat', 'hi', 'dog', 'an'])); + + console.log(""); + + console.log("Expecting: 'lily'"); + console.log(findShortestStringRecursive(['flower', 'juniper', 'lily', 'dandelion'])); + + console.log(""); + + console.log("Expecting: 'ardvark'"); + console.log(findShortestStringRecursive(['ardvark'])); +} + +module.exports = findShortestStringRecursive; + +// Please add your pseudocode to this file +/************************************************************************************************* +* if array length == 1: +* return first element +* +* recursively traverse the array and store the resulting element in a variable called result +* +* if the first element's length is <= the result's length: +* return the first element +* else: +* return the result +***************************************************************************************************/ + +// And a written explanation of your solution +/************************************************************************************************* +* We can start coding this solution with the base case: if there is only one element in the array +* return it. After that, we need to compare every element in the array to find the shortest. We +* do this by recursively calling the method with a smaller and smaller array. Since we're removing +* the first element from the array each time we recurse, this means we can compare the return value +* of our recursive call to the first element in the array in that frame. The shortest one gets +* returned up the stack. For example, if we had an array of two elements ['cat', 'dogs'], the +* initial call would occur, and then a recursive call would occur with the argument ['dogs']. 'dogs' +* would then be returned up the stack, since the base case would be triggered, so 'dogs' would now +* be stored in result. On the last line 'cat' is compared to 'dogs', and the shorter one is returned. +***************************************************************************************************/ diff --git a/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/find_shortest_string_recursive.rb b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/find_shortest_string_recursive.rb new file mode 100644 index 00000000..b3740bf9 --- /dev/null +++ b/02-week-2--recursion/04-day-4--recursive-find-shortest-string/solutions/find_shortest_string_recursive.rb @@ -0,0 +1,55 @@ +def find_shortest_string_recursive(arr) + return arr.first if arr.length == 1 + + result = find_shortest_string_recursive(arr[1..-1]) + + arr.first.length <= result.length ? arr.first : result +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 'a'" + puts find_shortest_string_recursive(['aaa', 'a', 'bb', 'ccc']) + + puts + + puts "Expecting: 'hi'" + puts find_shortest_string_recursive(['cat', 'hi', 'dog', 'an']) + + puts + + puts "Expecting: 'lily'" + puts find_shortest_string_recursive(['flower', 'juniper', 'lily', 'dandelion']) + + puts + + puts "Expecting: 'ardvark'" + puts find_shortest_string_recursive(['ardvark']) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +############################################################################################# +# if array length == 1: +# return first element +# +# recursively traverse the array and store the resulting element in a variable called result +# +# if the first element's length is <= the result's length: +# return the first element +# else: +# return the result +############################################################################################# + +# And a written explanation of your solution +############################################################################################# +# We can start coding this solution with the base case: if there is only one element in the array +# return it. After that, we need to compare every element in the array to find the shortest. We +# do this by recursively calling the method with a smaller and smaller array. Since we're removing +# the first element from the array each time we recurse, this means we can compare the return value +# of our recursive call to the first element in the array in that frame. The shortest one gets +# returned up the stack. For example, if we had an array of two elements ['cat', 'dogs'], the +# initial call would occur, and then a recursive call would occur with the argument ['dogs']. 'dogs' +# would then be returned up the stack, since the base case would be triggered, so 'dogs' would now +# be stored in result. On the last line 'cat' is compared to 'dogs', and the shorter one is returned. +############################################################################################# diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/.gitignore b/02-week-2--recursion/05-day-5--recursive-selection-sort/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/README.md b/02-week-2--recursion/05-day-5--recursive-selection-sort/README.md new file mode 100644 index 00000000..d5b6bb88 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/README.md @@ -0,0 +1,81 @@ +# Day 5: Recursive Selection Sort + +Sort an Array of numbers using selection sort. The selection sort algorithm sorts an array by repeatedly finding the minimum element (lowest value) in the input Array, and then putting it at the correct location in the sorted Array. + +Once you're done solving the problem, calculate the average run time and compare it to the average run time for the iterative version. + +``` +Input: [3, -1, 5, 2] +Output: [-1, 2, 3, 5] +``` + +You may wish to convert your iterative solution to a recursive one. We've included our old solutions in Ruby and JavaScript below: + +```ruby +def selection_sort(arr) + sorted = [] + + until arr.length == 0 + min = arr.min + idx = arr.index(min) + sorted << min + arr.delete_at(idx) + end + + sorted +end +``` + +```javascript +function selectionSort(arr) { + const sorted = []; + + while (arr.length > 0) { + const min = Math.min(...arr); + const idx = arr.indexOf(min); + + sorted.push(min); + arr.splice(idx, 1); + } + + return sorted; +} +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/benchmark/benchmark.js b/02-week-2--recursion/05-day-5--recursive-selection-sort/benchmark/benchmark.js new file mode 100644 index 00000000..eb5d2152 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/benchmark/benchmark.js @@ -0,0 +1,17 @@ +// Paste your iterative and recursive solutions in this file +// And then calculate their average run times to compare them. + + + + + + +function benchmark(callback) { + const startTime = Date.now(); + + for (let i = 0; i < 1000; ++i) { + callback(); + } + + return (Date.now() - startTime) / 1000; +} diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/benchmark/benchmark.rb b/02-week-2--recursion/05-day-5--recursive-selection-sort/benchmark/benchmark.rb new file mode 100644 index 00000000..0e29561d --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/benchmark/benchmark.rb @@ -0,0 +1,14 @@ +# Paste your iterative and recursive solutions in this file +# And then calculate their average run times to compare them. + + + +def benchmark + start_time = Time.now + + 1000.times do + yield + end + + (Time.now - start_time) / 1000 +end diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/package.json b/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/package.json new file mode 100644 index 00000000..cbc19291 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "selection_sort_recursive", + "version": "1.0.0", + "description": "selection_sort_recursive", + "main": "selection_sort_recursive.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/selection_sort_recursive.js b/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/selection_sort_recursive.js new file mode 100644 index 00000000..bf1c20b6 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/selection_sort_recursive.js @@ -0,0 +1,16 @@ +function selectionSortRecursive(arr) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [-1, 2, 3, 5]"); + console.log("=>", selectionSortRecursive([3, -1, 5, 2])); + + console.log(""); +} + +module.exports = selectionSortRecursive; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/tests/selection_sort_recursive.test.js b/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/tests/selection_sort_recursive.test.js new file mode 100644 index 00000000..ca0414a1 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/javascript/tests/selection_sort_recursive.test.js @@ -0,0 +1,26 @@ +const selectionSortRecursive = require('../selection_sort_recursive'); + +test('can handle an empty array', () => { + expect(selectionSortRecursive([])).toEqual([]); +}); + +test('can sort one element', () => { + expect(selectionSortRecursive([5])).toEqual([5]); +}); + +test('can sort two elements', () => { + expect(selectionSortRecursive([3, 1])).toEqual([1, 3]); +}); + +test('can sort several elements', () => { + expect(selectionSortRecursive([10, 4, 3, 2, 1, 5])).toEqual([1, 2, 3, 4, 5, 10]); +}); + +test('can sort negative and positive values', () => { + expect(selectionSortRecursive([-1, -2, 4, 2])).toEqual([-2, -1, 2, 4]); +}); + +test('can sort an array containing repeating values', () => { + expect(selectionSortRecursive([1, 4, 2, 1, 2, 4, 20, -2])).toEqual([1, 4, 2, 1, 2, 4, 20, -2].sort((a, b) => a - b)); +}); + diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/.rspec b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/Gemfile b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/selection_sort_recursive.rb b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/selection_sort_recursive.rb new file mode 100644 index 00000000..56200763 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/selection_sort_recursive.rb @@ -0,0 +1,16 @@ +def selection_sort_recursive(arr) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [-1, 2, 3, 5]" + print "=> " + print selection_sort_recursive([3, -1, 5, 2]) + + puts + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/spec/selection_sort_recursive_spec.rb b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/spec/selection_sort_recursive_spec.rb new file mode 100644 index 00000000..23e599cf --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/spec/selection_sort_recursive_spec.rb @@ -0,0 +1,27 @@ +require './selection_sort_recursive' + +RSpec.describe '#selection_sort_recursive' do + it 'can handle an empty array' do + expect(selection_sort_recursive([])).to eq([]) + end + + it 'can sort one element' do + expect(selection_sort_recursive([5])).to eq([5]) + end + + it 'can sort two elements' do + expect(selection_sort_recursive([3, 1])).to eq([1, 3]) + end + + it 'can sort several elements' do + expect(selection_sort_recursive([10, 4, 3, 2, 1, 5])).to eq([1, 2, 3, 4, 5, 10]) + end + + it 'can sort negative and positive values' do + expect(selection_sort_recursive([-1, -2, 4, 2])).to eq([-2, -1, 2, 4]) + end + + it 'can sort an array containing repeating values' do + expect(selection_sort_recursive([1, 4, 2, 1, 2, 4, 20, -2])).to eq([1, 4, 2, 1, 2, 4, 20, -2].sort) + end +end \ No newline at end of file diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/spec/spec_helper.rb b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/benchmark/benchmark.js b/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/benchmark/benchmark.js new file mode 100644 index 00000000..9e60eb08 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/benchmark/benchmark.js @@ -0,0 +1,43 @@ +// Paste your iterative and recursive solutions in this file +// And then calculate their average run times to compare them. +function selectionSort(arr) { + const sorted = []; + + while (arr.length > 0) { + const min = Math.min(...arr); + const idx = arr.indexOf(min); + + sorted.push(min); + arr.splice(idx, 1); + } + + return sorted; +} + +function selectionSortRecursive(arr) { + if (arr.length === 0) { + return []; + } + + const min = Math.min(...arr); + const idx = arr.indexOf(min); + arr.splice(idx, 1); + + const result = selectionSortRecursive(arr); + result.unshift(min); + return result; +} + + +function benchmark(callback) { + const startTime = Date.now(); + + for (let i = 0; i < 1000; ++i) { + callback(); + } + + return (Date.now() - startTime) / 1000; +} + +console.log('Iterative:', benchmark(() => selectionSort([2, 3, 4, 1, 4, 56, -2, 20]))); +console.log('Recursive:', benchmark(() => selectionSortRecursive([2, 3, 4, 1, 4, 56, -2, 20]))); diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/benchmark/benchmark.rb b/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/benchmark/benchmark.rb new file mode 100644 index 00000000..edf791ac --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/benchmark/benchmark.rb @@ -0,0 +1,38 @@ +# Paste your iterative and recursive solutions in this file +# And then calculate their average run times to compare them. +def selection_sort(arr) + sorted = [] + + until arr.length == 0 + min = arr.min + idx = arr.index(min) + sorted << min + arr.delete_at(idx) + end + + sorted +end + +def selection_sort_recursive(arr) + return [] if arr.empty? + + min = arr.min + idx = arr.index(min) + arr.delete_at(idx) + + result = selection_sort_recursive(arr) + result.unshift(min) +end + +def benchmark + start_time = Time.now + + 1000.times do + yield + end + + (Time.now - start_time) / 1000 +end + +puts "Iterative: #{benchmark { selection_sort([2, 3, 4, 1, 4, 56, -2, 20]) }}" +puts "Recursive: #{benchmark { selection_sort_recursive([2, 3, 4, 1, 4, 56, -2, 20]) }}" diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/selection_sort_recursive.js b/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/selection_sort_recursive.js new file mode 100644 index 00000000..79bddd5d --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/selection_sort_recursive.js @@ -0,0 +1,68 @@ +function selectionSortRecursive(arr) { + if (arr.length === 0) { + return []; + } + + const min = Math.min(...arr); + const idx = arr.indexOf(min); + arr.splice(idx, 1); + + const result = selectionSortRecursive(arr); + result.unshift(min); + return result; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [-1, 2, 3, 5]"); + console.log(selectionSortRecursive([3, -1, 5, 2])); + + console.log(""); + + console.log("Expecting: [5]"); + console.log(selectionSortRecursive([5])); + + console.log(""); + + console.log("Expecting: [-1, 2, 2, 3, 3, 5]"); + console.log(selectionSortRecursive([3, 2, -1, 3, 5, 2])); + + console.log(""); + + console.log("Expecting: [3, 5]"); + console.log(selectionSortRecursive([5, 3])); + + console.log(""); +} + +module.exports = selectionSortRecursive; + +// Please add your pseudocode to this file +/***************************************************************************************** +* return empty array if array is empty +* +* find smallest value in array and store it in min +* find index of smallest value and store it in idx +* remove the smallest value from the array +* +* recurse through the array and store the result in result +* place the min from each frame at the front of the array +* return result +*****************************************************************************************/ + +// And a written explanation of your solution +/***************************************************************************************** +* Once again, it's easier to start with the base case: if the array is empty, return +* an empty array. We can then add items to this returned empty array in the previous +* frames. To figure out what to add, we need to find the minimum value in the array +* and its index. Next, we remove that value from the array and pass the array to the +* recursive call. This means that as we go deeper and deeper into the stack, the +* array gets smaller, until it's empty. Since frames are completed in last in first out +* order, we need to add the minimum value from each frame to the front of the result +* array. For example, if the array is [2, 1], the minimum in the first frame is 1, and +* the recusrive call is made with the argument [2]. In this frame the minimum is 2, so +* the recursive call is now made with the argument []. This hits the base case, which +* returns []. result is now an empty array in the previous frame. On the next line, the +* minimum, which is 2, gets unshifted on. [2] is returned up the stack, and stored in +* result. Here, the minimum is 1, which gets unshifted on, resulting in [1, 2]. +*****************************************************************************************/ diff --git a/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/selection_sort_recursive.rb b/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/selection_sort_recursive.rb new file mode 100644 index 00000000..a7b327d3 --- /dev/null +++ b/02-week-2--recursion/05-day-5--recursive-selection-sort/solutions/selection_sort_recursive.rb @@ -0,0 +1,64 @@ +def selection_sort_recursive(arr) + return [] if arr.empty? + + min = arr.min + idx = arr.index(min) + arr.delete_at(idx) + + result = selection_sort_recursive(arr) + result.unshift(min) +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [-1, 2, 3, 5]" + print selection_sort_recursive([3, -1, 5, 2]) + + puts + + puts "Expecting: [5]" + print selection_sort_recursive([5]) + + puts + + puts "Expecting: [-1, 2, 2, 3, 3, 5]" + print selection_sort_recursive([3, 2, -1, 3, 5, 2]) + + puts + + puts "Expecting: [3, 5]" + print selection_sort_recursive([5, 3]) + + puts + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +################################################################################# +# return empty array if array is empty +# +# find smallest value in array and store it in min +# find index of smallest value and store it in idx +# remove the smallest value from the array +# +# recurse through the array and store the result in result +# place the min from each frame at the front of the array +# return result +################################################################################# + +# And a written explanation of your solution +################################################################################# +# Once again, it's easier to start with the base case: if the array is empty, return +# an empty array. We can then add items to this returned empty array in the previous +# frames. To figure out what to add, we need to find the minimum value in the array +# and its index. Next, we remove that value from the array and pass the array to the +# recursive call. This means that as we go deeper and deeper into the stack, the +# array gets smaller, until it's empty. Since frames are completed in last in first out +# order, we need to add the minimum value from each frame to the front of the result +# array. For example, if the array is [2, 1], the minimum in the first frame is 1, and +# the recusrive call is made with the argument [2]. In this frame the minimum is 2, so +# the recursive call is now made with the argument []. This hits the base case, which +# returns []. result is now an empty array in the previous frame. On the next line, the +# minimum, which is 2, gets unshifted on. [2] is returned up the stack, and stored in +# result. Here, the minimum is 1, which gets unshifted on, resulting in [1, 2]. +################################################################################# \ No newline at end of file diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/.gitignore b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/README.md b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/README.md new file mode 100644 index 00000000..3ad0f36b --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/README.md @@ -0,0 +1,52 @@ +# Bonus 1: Balancing Parentheses + +For parentheses to be considered balanced, there must an opening parenthesis followed by a matching closing parenthesis. Given a string containing only parentheses, return the number of additional parentheses needed for the string to be considered balanced. The input string will have a minimum length of 1. + +``` +Input: '(()())' +Output: 0 + +Input: '()))' +Output: 2 + +Input: ')' +Output: 1 +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/balancing_parentheses.js b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/balancing_parentheses.js new file mode 100644 index 00000000..b05af5c8 --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/balancing_parentheses.js @@ -0,0 +1,24 @@ +function balancingParentheses(string) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 0"); + console.log(balancingParentheses('(()())')); + + console.log(""); + + console.log("Expecting: 2"); + console.log(balancingParentheses('()))')); + + console.log(""); + + console.log("Expecting: 1"); + console.log(balancingParentheses(')')); +} + +module.exports = balancingParentheses; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/package.json b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/package.json new file mode 100644 index 00000000..bf4287e8 --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "balancing_parentheses", + "version": "1.0.0", + "description": "balancing_parentheses", + "main": "balancing_parentheses.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/tests/balancing_parentheses.test.js b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/tests/balancing_parentheses.test.js new file mode 100644 index 00000000..2903e183 --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/javascript/tests/balancing_parentheses.test.js @@ -0,0 +1,25 @@ +const balancingParentheses = require('../balancing_parentheses'); + +test('can balance parentheses when only one type of parenthesis is in the string', () => { + expect(balancingParentheses(')')).toBe(1); + expect(balancingParentheses('(')).toBe(1); + expect(balancingParentheses(')))')).toBe(3); + expect(balancingParentheses('(((')).toBe(3); +}); + +test('accounts for strings that start with a closing parenthesis or end with an opening one', () => { + expect(balancingParentheses(')(')).toBe(2); + expect(balancingParentheses(')()')).toBe(1); + expect(balancingParentheses(')((((()))((())))()(()))(')).toBe(2); +}); + +test('returns 0 when the parentheses are balanced', () => { + expect(balancingParentheses('(()())')).toBe(0); + expect(balancingParentheses('()')).toBe(0); +}); + + +test('returns the correct number when the string starts with an opening parenthesis and ends with a closing one', () => { + expect(balancingParentheses('()))')).toBe(2); +}); + \ No newline at end of file diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/.rspec b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/Gemfile b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/balancing_parentheses.rb b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/balancing_parentheses.rb new file mode 100644 index 00000000..e941fdbf --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/balancing_parentheses.rb @@ -0,0 +1,23 @@ +def balancing_parentheses(string) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 0" + puts balancing_parentheses('(()())') + + puts + + puts "Expecting: 2" + puts balancing_parentheses('()))') + + puts + + puts "Expecting: 1" + puts balancing_parentheses(')') + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/spec/balancing_parentheses_spec.rb b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/spec/balancing_parentheses_spec.rb new file mode 100644 index 00000000..8b90a590 --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/spec/balancing_parentheses_spec.rb @@ -0,0 +1,25 @@ +require './balancing_parentheses' + +RSpec.describe '#balancing_parentheses' do + it 'can balance parentheses when only one type of parenthesis is in the string' do + expect(balancing_parentheses(')')).to eq(1) + expect(balancing_parentheses('(')).to eq(1) + expect(balancing_parentheses(')))')).to eq(3) + expect(balancing_parentheses('(((')).to eq(3) + end + + it 'accounts for strings that start with a closing parenthesis or end with an opening one' do + expect(balancing_parentheses(')(')).to eq(2) + expect(balancing_parentheses(')()')).to eq(1) + expect(balancing_parentheses(')((((()))((())))()(()))(')).to eq(2) + end + + it 'returns 0 when the parentheses are balanced' do + expect(balancing_parentheses('(()())')).to eq(0) + expect(balancing_parentheses('()')).to eq(0) + end + + it 'returns the correct number when the string starts with an opening parenthesis and ends with a closing one' do + expect(balancing_parentheses('()))')).to eq(2) + end +end diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/spec/spec_helper.rb b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/solutions/balancing_parentheses.js b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/solutions/balancing_parentheses.js new file mode 100644 index 00000000..f6affcdb --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/solutions/balancing_parentheses.js @@ -0,0 +1,100 @@ +function balancingParentheses(string) { + let missing = 0; + let openings = 0; + + for (let i = 0; i < string.length; ++i) { + if (string[i] === '(') { + ++openings; + continue; + } + + if (openings > 0) { + --openings; + } else { + ++missing; + } + } + + return missing + openings; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 0"); + console.log(balancingParentheses('(()())')); + + console.log(""); + + console.log("Expecting: 2"); + console.log(balancingParentheses('()))')); + + console.log(""); + + console.log("Expecting: 1"); + console.log(balancingParentheses(')')); + + console.log(""); + + console.log("Expecting: 0"); + console.log(balancingParentheses('()')); + + console.log(""); + + console.log("Expecting: 1"); + console.log(balancingParentheses('(')); + + console.log(""); + + console.log("Expecting: 2"); + console.log(balancingParentheses(')(')); + + console.log(""); + + console.log("Expecting: 1"); + console.log(balancingParentheses(')()')); + + console.log(""); + + console.log("Expecting: 2"); + console.log(balancingParentheses(')((((()))((())))()(()))(')); + + console.log(""); + + console.log("Expecting: 3"); + console.log(balancingParentheses(')))')); + + console.log(""); + + console.log("Expecting: 3"); + console.log(balancingParentheses('(((')); +} + +module.exports = balancingParentheses; + +// Please add your pseudocode to this file +/************************************************************************************** +* initialize missing to 0 (will store unmatched closing parens count) +* initialize openings to 0 (will store opening parens count) +* +* iterate over string: +* if char == '(': +* increment openings +* else: +* if openings is 0: +* increment missing +* else: +* decrement openings +* +* return missing + openings +***************************************************************************************/ + +// And a written explanation of your solution +/************************************************************************************** +* We can calculate the number of parentheses needed by counting the number of opening +* parentheses that occur in the string and decrementing that count any time a closing +* parenthesis is encountered after that. If we encounter a closing parenthesis and there +* are no opening parentheses (openings = 0), we add to missing. Once we've iterated +* over the whole string, we just need to add the missing count with the openings count, +* since the openings count will track any opening parentheses for which there were no +* matching closing ones. +***************************************************************************************/ diff --git a/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/solutions/balancing_parentheses.rb b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/solutions/balancing_parentheses.rb new file mode 100644 index 00000000..4583dcfb --- /dev/null +++ b/03-week-3--additional-practice/00-bonus-1--balancing-parenetheses/solutions/balancing_parentheses.rb @@ -0,0 +1,99 @@ +def balancing_parentheses(string) + missing = 0 + openings = 0 + + string.chars.each do |char| + if char == '(' + openings += 1 + next + end + + if openings > 0 + openings -= 1 + else + missing += 1 + end + end + + missing + openings +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 0" + puts balancing_parentheses('(()())') + + puts + + puts "Expecting: 2" + puts balancing_parentheses('()))') + + puts + + puts "Expecting: 1" + puts balancing_parentheses(')') + + # Don't forget to add your own! + + puts + + puts "Expecting: 0" + puts balancing_parentheses('()') + + puts + + puts "Expecting: 1" + puts balancing_parentheses('(') + + puts + + puts "Expecting: 2" + puts balancing_parentheses(')(') + + puts + + puts "Expecting: 1" + puts balancing_parentheses(')()') + + puts + + puts "Expecting: 2" + puts balancing_parentheses(')((((()))((())))()(()))(') + + puts + + puts "Expecting: 3" + puts balancing_parentheses(')))') + + puts + + puts "Expecting: 3" + puts balancing_parentheses('(((') +end + +# Please add your pseudocode to this file +################################################################################## +# initialize missing to 0 (will store unmatched closing parens count) +# initialize openings to 0 (will store opening parens count) +# +# iterate over string: +# if char == '(': +# increment openings +# else: +# if openings is 0: +# increment missing +# else: +# decrement openings +# +# return missing + openings +################################################################################## + +# And a written explanation of your solution +################################################################################## +# We can calculate the number of parentheses needed by counting the number of opening +# parentheses that occur in the string and decrementing that count any time a closing +# parenthesis is encountered after that. If we encounter a closing parenthesis and there +# are no opening parentheses (openings = 0), we add to missing. Once we've iterated +# over the whole string, we just need to add the missing count with the openings count, +# since the openings count will track any opening parentheses for which there were no +# matching closing ones. +################################################################################## diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/.gitignore b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/README.md b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/README.md new file mode 100644 index 00000000..a4ca2f46 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/README.md @@ -0,0 +1,54 @@ +# Bonus 2: Roman Numeral to Integer + +Convert the provided Roman numeral (a String) to an Integer. For more information on Roman numerals, please go to [Math Is Fun](https://www.mathsisfun.com/roman-numerals.html). + +The String input will always consist of uppercase letters with a minimum length of 1. We will only be covering numbers below 4000, so you can safely ignore the "Really Big Numbers" section on the Math is Fun page we linked to. + +``` +Input: 'I' +Output: 1 + +Input: 'IX' +Output: 9 + +Input: 'CDII' +Output: 402 +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/package.json b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/package.json new file mode 100644 index 00000000..4fc75de0 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "roman_numeral", + "version": "1.0.0", + "description": "roman_numeral", + "main": "roman_numeral.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/roman_numeral.js b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/roman_numeral.js new file mode 100644 index 00000000..f227e61e --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/roman_numeral.js @@ -0,0 +1,24 @@ +function romanNumeral(string) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 1"); + console.log(romanNumeral('I')); + + console.log(""); + + console.log("Expecting: 9"); + console.log(romanNumeral('IX')); + + console.log(""); + + console.log("Expecting: 402"); + console.log(romanNumeral('CDII')); +} + +module.exports = romanNumeral; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/tests/roman_numeral.test.js b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/tests/roman_numeral.test.js new file mode 100644 index 00000000..a3d7ac43 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/javascript/tests/roman_numeral.test.js @@ -0,0 +1,19 @@ +const romanNumeral = require('../roman_numeral'); + +test('handles small roman numerals', () => { + expect(romanNumeral('I')).toBe(1); + expect(romanNumeral('III')).toBe(3); +}); + +test('handles instances where the smaller numeral comes before the larger one', () => { + expect(romanNumeral('IX')).toBe(9); + expect(romanNumeral('MCM')).toBe(1900); + expect(romanNumeral('MCMXCIX')).toBe(1999); + expect(romanNumeral('CDII')).toBe(402); + expect(romanNumeral('XLIV')).toBe(44); +}); + +test('handles numbers in the hundreds and low thousands', () => { + expect(romanNumeral('CCXXIII')).toBe(223); + expect(romanNumeral('MMMDCCCXLVIII')).toBe(3848); +}); diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/.rspec b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/Gemfile b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/roman_numeral.rb b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/roman_numeral.rb new file mode 100644 index 00000000..c2d32e8b --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/roman_numeral.rb @@ -0,0 +1,23 @@ +def roman_numeral(string) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 1" + puts roman_numeral('I') + + puts + + puts "Expecting: 9" + puts roman_numeral('IX') + + puts + + puts "Expecting: 402" + puts roman_numeral('CDII') + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/spec/roman_numeral_spec.rb b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/spec/roman_numeral_spec.rb new file mode 100644 index 00000000..6a56a9f1 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/spec/roman_numeral_spec.rb @@ -0,0 +1,21 @@ +require './roman_numeral' + +RSpec.describe '#roman_numeral' do + it 'handles small roman numerals' do + expect(roman_numeral('I')).to eq(1) + expect(roman_numeral('III')).to eq(3) + end + + it 'handles instances where the smaller numeral comes before the larger one' do + expect(roman_numeral('IX')).to eq(9) + expect(roman_numeral('MCM')).to eq(1900) + expect(roman_numeral('MCMXCIX')).to eq(1999) + expect(roman_numeral('CDII')).to eq(402) + expect(roman_numeral('XLIV')).to eq(44) + end + + it 'handles numbers in the hundreds and low thousands' do + expect(roman_numeral('CCXXIII')).to eq(223) + expect(roman_numeral('MMMDCCCXLVIII')).to eq(3848) + end +end diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/spec/spec_helper.rb b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/solutions/roman_numeral.js b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/solutions/roman_numeral.js new file mode 100644 index 00000000..cfada0ec --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/solutions/roman_numeral.js @@ -0,0 +1,109 @@ +function romanNumeral(string) { + const romans = { + I: 1, + IV: 4, + V: 5, + IX: 9, + X: 10, + XL: 40, + L: 50, + XC: 90, + C: 100, + CD: 400, + D: 500, + CM: 900, + M: 1000 + }; + let total = 0; + let idx = 0; + + while (idx < string.length) { + const twoChar = string[idx] + (string[idx + 1] || ''); + + if (romans[twoChar] !== undefined) { + total += romans[twoChar]; + idx += 2; + } else { + total += romans[string[idx]]; + ++idx; + } + } + + return total; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 1"); + console.log(romanNumeral('I')); + + console.log(""); + + console.log("Expecting: 9"); + console.log(romanNumeral('IX')); + + console.log(""); + + console.log("Expecting: 402"); + console.log(romanNumeral('CDII')); + + console.log(""); + + console.log("Expecting: 3"); + console.log(romanNumeral('III')); + + console.log(""); + + console.log("Expecting: 1900"); + console.log(romanNumeral('MCM')); + + console.log(""); + + console.log("Expecting: 1999"); + console.log(romanNumeral('MCMXCIX')); + + console.log(""); + + console.log("Expecting: 44"); + console.log(romanNumeral('XLIV')); + + console.log(""); + + console.log("Expecting: 223"); + console.log(romanNumeral('CCXXIII')); + + console.log(""); + + console.log("Expecting: 3848"); + console.log(romanNumeral('MMMDCCCXLVIII')); +} + +module.exports = romanNumeral; + +// Please add your pseudocode to this file +/**************************************************************************** + * store important roman numerals in an Object called romans + * initialize total to 0 + * + * iterate over string: + * if current character + next character is a key in romans: + * add that value to total + * skip over next character in iteration + * else: + * get value where current character is a key in romans + * add value to total + * + * return total + * *************************************************************************/ + + // And a written explanation of your solution +/**************************************************************************** + * We can store the unique Roman numerals in an Object (key-value pairs), including + * those where the small Roman numeral comes before the larger Roman numeral (e.g. 'IX'). + * When we iterate over the string, we first check if the current character plus the next + * character is a key in the Object. If it is, we add the value associated with that key + * to the total. We'll then need to increment our index in the string by 2. This takes care + * of those numerals where the small number comes before the big one. If the two characters + * together aren't a key, we add the value at the single-character key to the total and + * increment the index by one. + * *************************************************************************/ \ No newline at end of file diff --git a/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/solutions/roman_numeral.rb b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/solutions/roman_numeral.rb new file mode 100644 index 00000000..3dff73e4 --- /dev/null +++ b/03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer/solutions/roman_numeral.rb @@ -0,0 +1,108 @@ +def roman_numeral(string) + romans = { + I: 1, + IV: 4, + V: 5, + IX: 9, + X: 10, + XL: 40, + L: 50, + XC: 90, + C: 100, + CD: 400, + D: 500, + CM: 900, + M: 1000 + } + total = 0 + idx = 0 + + while idx < string.length + twoChar = (string[idx] + (string[idx + 1] || '')).to_sym + + if !romans[twoChar].nil? + total += romans[twoChar] + idx += 2 + else + total += romans[string[idx].to_sym] + idx += 1 + end + end + + total +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 1" + puts roman_numeral('I') + + puts + + puts "Expecting: 9" + puts roman_numeral('IX') + + puts + + puts "Expecting: 402" + puts roman_numeral('CDII') + + # Don't forget to add your own! + puts + + puts "Expecting: 3" + puts roman_numeral('III') + + puts + + puts "Expecting: 1900" + puts roman_numeral('MCM') + + puts + + puts "Expecting: 1999" + puts roman_numeral('MCMXCIX') + + puts + + puts "Expecting: 44" + puts roman_numeral('XLIV') + + puts + + puts "Expecting: 223" + puts roman_numeral('CCXXIII') + + puts + + puts "Expecting: 3848" + puts roman_numeral('MMMDCCCXLVIII') +end + +# Please add your pseudocode to this file +############################################################################################# + # store important roman numerals in an Object called romans + # initialize total to 0 + # + # iterate over string: + # if current character + next character is a key in romans: + # add that value to total + # skip over next character in iteration + # else: + # get value where current character is a key in romans + # add value to total + # + # return total +############################################################################################# + + # And a written explanation of your solution +############################################################################################# + # We can store the unique Roman numerals in an Object (key-value pairs), including + # those where the small Roman numeral comes before the larger Roman numeral (e.g. 'IX'). + # When we iterate over the string, we first check if the current character plus the next + # character is a key in the Object. If it is, we add the value associated with that key + # to the total. We'll then need to increment our index in the string by 2. This takes care + # of those numerals where the small number comes before the big one. If the two characters + # together aren't a key, we add the value at the single-character key to the total and + # increment the index by one. +############################################################################################# + diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/.gitignore b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/README.md b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/README.md new file mode 100644 index 00000000..500694f9 --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/README.md @@ -0,0 +1,54 @@ +# Bonus 3: Rotate Array Clockwise + +Given an input Array, rotate `k` units clockwise, i.e. shift the values rightward `k` units. + +`k` is an Integer >= 0. + +``` +Input: [1, 2, 3, 4], 1 +Output: [4, 1, 2, 3] + +Input: [1, 2, 3], 2 +Output: [2, 3, 1] + +Input: [1, 2, 3], 3 +Output: [1, 2, 3] +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/package.json b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/package.json new file mode 100644 index 00000000..0c6a132b --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "rotate_array", + "version": "1.0.0", + "description": "rotate_array", + "main": "rotate_array.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/rotate_array.js b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/rotate_array.js new file mode 100644 index 00000000..2d8f8cda --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/rotate_array.js @@ -0,0 +1,24 @@ +function rotateArray(arr, k) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [4, 1, 2, 3]"); + console.log("=>", rotateArray([1, 2, 3, 4], 1)); + + console.log(""); + + console.log("Expecting: [2, 3, 1]"); + console.log("=>", rotateArray([1, 2, 3], 2)); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log("=>", rotateArray([1, 2, 3], 3)); +} + +module.exports = rotateArray; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/tests/rotate_array.test.js b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/tests/rotate_array.test.js new file mode 100644 index 00000000..d3cf608e --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/javascript/tests/rotate_array.test.js @@ -0,0 +1,22 @@ +const rotateArray = require('../rotate_array'); + +test('can handle k values from 1 up to the length of the array', () => { + expect(rotateArray([1, 2, 3, 4], 1)).toEqual([4, 1, 2, 3]); + expect(rotateArray([1, 2, 3], 2)).toEqual([2, 3, 1]); + expect(rotateArray([1, 2, 3], 3)).toEqual([1, 2, 3]); +}); + +test('can handle an empty array', () => { + expect(rotateArray([], 7)).toEqual([]); + expect(rotateArray([], 0)).toEqual([]); +}); + +test('can handle a k value of 0', () => { + expect(rotateArray([1, 2, 3], 0)).toEqual([1, 2, 3]); +}); + +test('can handle k values larger than the array length', () => { + expect(rotateArray([1, 2, 3], 5)).toEqual([2, 3, 1]); + expect(rotateArray([1, 2, 3], 6)).toEqual([1, 2, 3]); + expect(rotateArray([1, 2, 3, 4], 41)).toEqual([4, 1, 2, 3]); +}); diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/.rspec b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/Gemfile b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/rotate_array.rb b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/rotate_array.rb new file mode 100644 index 00000000..182168f1 --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/rotate_array.rb @@ -0,0 +1,25 @@ +def rotate_array(arr, k) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [4, 1, 2, 3]" + print "=> " + print rotate_array([1, 2, 3, 4], 1) + + puts + + puts "Expecting: [2, 3, 1]" + print "=> " + print rotate_array([1, 2, 3], 2) + + puts + + puts "Expecting: [1, 2, 3]" + print "=> " + print rotate_array([1, 2, 3], 3) + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/spec/rotate_array_spec.rb b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/spec/rotate_array_spec.rb new file mode 100644 index 00000000..04f9c2df --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/spec/rotate_array_spec.rb @@ -0,0 +1,24 @@ +require './rotate_array' + +RSpec.describe '#rotate_array' do + it 'can handle k values from 1 up to the length of the array' do + expect(rotate_array([1, 2, 3, 4], 1)).to eq([4, 1, 2, 3]) + expect(rotate_array([1, 2, 3], 2)).to eq([2, 3, 1]) + expect(rotate_array([1, 2, 3], 3)).to eq([1, 2, 3]) + end + + it 'can handle an empty array' do + expect(rotate_array([], 7)).to eq([]) + expect(rotate_array([], 0)).to eq([]) + end + + it 'can handle a k value of 0' do + expect(rotate_array([1, 2, 3], 0)).to eq([1, 2, 3]) + end + + it 'can handle k values larger than the array length' do + expect(rotate_array([1, 2, 3], 5)).to eq([2, 3, 1]) + expect(rotate_array([1, 2, 3], 6)).to eq([1, 2, 3]) + expect(rotate_array([1, 2, 3, 4], 41)).to eq([4, 1, 2, 3]) + end +end diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/spec/spec_helper.rb b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/solutions/rotate_array.js b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/solutions/rotate_array.js new file mode 100644 index 00000000..d6906759 --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/solutions/rotate_array.js @@ -0,0 +1,54 @@ +function rotateArray(arr, k) { + const rotations = k % arr.length; + const removed = arr.splice(arr.length - rotations, rotations); + + return removed.concat(arr); +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [4, 1, 2, 3]"); + console.log(rotateArray([1, 2, 3, 4], 1)); + + console.log(""); + + console.log("Expecting: [2, 3, 1]"); + console.log(rotateArray([1, 2, 3], 2)); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log(rotateArray([1, 2, 3], 3)); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log(rotateArray([1, 2, 3], 0)); + + console.log(""); + + console.log("Expecting: [2, 3, 1]"); + console.log(rotateArray([1, 2, 3], 5)); + + console.log(""); + + console.log("Expecting: []"); + console.log(rotateArray([], 7)); +} + +module.exports = rotateArray; + +// Please add your pseudocode to this file +/*********************************************************************************** + * initialize rotations to store the remainder of k / array length + * remove rotations number elements from end of array + * return removed elements + remaining elements + * *********************************************************************************/ + +// And a written explanation of your solution +/*********************************************************************************** + * We can solve this problem by figuring out how many elements to remove from the end + * of the array, and then adding those removed elements to the front of the array. To + * do this, we need to account for when k is the same or larger than the array's length. + * This is ascertained by getting the remainder of k / array length. + * **********************************************************************************/ \ No newline at end of file diff --git a/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/solutions/rotate_array.rb b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/solutions/rotate_array.rb new file mode 100644 index 00000000..f0509c7b --- /dev/null +++ b/03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise/solutions/rotate_array.rb @@ -0,0 +1,54 @@ +def rotate_array(arr, k) + # avoid divide by zero error in Ruby, which will otherwise occur on L5 + return arr if arr.empty? || k.zero? + + rotations = k % arr.length + removed = arr.slice!(arr.length - rotations, rotations) + removed + arr +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [4, 1, 2, 3]" + print rotate_array([1, 2, 3, 4], 1) + + puts + + puts "Expecting: [2, 3, 1]" + print rotate_array([1, 2, 3], 2) + + puts + + puts "Expecting: [1, 2, 3]" + print rotate_array([1, 2, 3], 3) + # Don't forget to add your own! + + puts + + puts "Expecting: [1, 2, 3]" + print rotate_array([1, 2, 3], 0) + + puts + + puts "Expecting: [2, 3, 1]" + print rotate_array([1, 2, 3], 5) + + puts + + puts "Expecting: []" + print rotate_array([], 7) +end + +# Please add your pseudocode to this file +########################################################################################## + # initialize rotations to store the remainder of k / array length + # remove rotations number elements from end of array + # return removed elements + remaining elements +########################################################################################## + +# And a written explanation of your solution +########################################################################################## + # We can solve this problem by figuring out how many elements to remove from the end + # of the array, and then adding those removed elements to the front of the array. To + # do this, we need to account for when k is the same or larger than the array's length. + # This is ascertained by getting the remainder of k / array length. +########################################################################################## \ No newline at end of file diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/.gitignore b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/README.md b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/README.md new file mode 100644 index 00000000..63c3a025 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/README.md @@ -0,0 +1,49 @@ +# Bonus 4: Distinct Pair Sum + +Given an input Array and a target value `k`, return all distinct pairs of consecutive numbers that add up to `k`. A pair is distinct if no other pair contains the same numbers. The order of the pairs and order of the values in each pair does not matter, e.g. we consider [[2, 8], [7, 3]] to be the same as [[3, 7], [8, 2]]. + +``` +Input: [0, 1, 1, 2, 0, 1, 1], 2 +Output: [[1, 1], [2, 0]] + +Input: [3, 4, 2, 1, 5, 2, 8, 2], 10 +Output: [[2, 8]] +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/distinct_pair_sum.js b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/distinct_pair_sum.js new file mode 100644 index 00000000..1c60bd41 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/distinct_pair_sum.js @@ -0,0 +1,19 @@ +function distinctPairSum(arr, k) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [[1, 1], [2, 0]]"); + console.log("=>", distinctPairSum([0, 1, 1, 2, 0, 1, 1], 2)); + + console.log(""); + + console.log("Expecting: [[2, 8]]"); + console.log("=>", distinctPairSum([3, 4, 2, 1, 5, 2, 8, 2], 10)); +} + +module.exports = distinctPairSum; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/package.json b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/package.json new file mode 100644 index 00000000..aee161e2 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "distinct_pair_sum.js", + "version": "1.0.0", + "description": "distinct_pair_sum.js", + "main": "distinct_pair_sum.js.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/tests/distinct_pair_sum.test.js b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/tests/distinct_pair_sum.test.js new file mode 100644 index 00000000..d385eb4e --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/javascript/tests/distinct_pair_sum.test.js @@ -0,0 +1,21 @@ +const distinctPairSum = require('../distinct_pair_sum'); + +function sortArray(arr, k) { + let res = distinctPairSum(arr, k); + res = res.map(arr => arr.sort((a, b) => a - b)); + return res.sort((a, b) => a[0] - b[0]); +} + +test('returns an empty array when there are no pairs that sum up to k', () => { + expect(distinctPairSum([3, 4, 2, 1, 5, 2, 8, 2], 100)).toEqual([]); + expect(distinctPairSum([3, 4, 2, 1, 5, 2, 8, 2], 100).length).toBe(0); + expect(distinctPairSum([], 100).length).toBe(0); + expect(distinctPairSum([59], 100).length).toBe(0); +}); + +test('only returns distinct pairs', () => { + expect(sortArray([0, 1, 1, 2, 0, 1, 1], 2)).toEqual([[0, 2], [1, 1]]); + expect(sortArray([3, 4, 2, 1, 5, 2, 8, 2], 10)).toEqual([[2, 8]]); + expect(sortArray([59, 41], 100)).toEqual([[41, 59]]); + expect(sortArray([1, 0, 0, 10, -10, 5, 4, 3, -3, -3], 0)).toEqual([[-10, 10], [-3, 3], [0, 0]]); +}); diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/.rspec b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/Gemfile b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/distinct_pair_sum.rb b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/distinct_pair_sum.rb new file mode 100644 index 00000000..1a2e1612 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/distinct_pair_sum.rb @@ -0,0 +1,20 @@ +def distinct_pair_sum(arr, k) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [[1, 1], [2, 0]]" + print "=> " + print distinct_pair_sum([0, 1, 1, 2, 0, 1, 1], 2) + + puts + + puts "Expecting: [[2, 8]]" + print "=> " + print distinct_pair_sum([3, 4, 2, 1, 5, 2, 8, 2], 10) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/spec/distinct_pair_sum_spec.rb b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/spec/distinct_pair_sum_spec.rb new file mode 100644 index 00000000..0418a1ed --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/spec/distinct_pair_sum_spec.rb @@ -0,0 +1,22 @@ +require './distinct_pair_sum' + +def sort_array(arr, k) + res = distinct_pair_sum(arr, k) + res.map!(&:sort) + res.sort! +end + +RSpec.describe '#distinct_pair_sum' do + it 'returns an empty array when there are no pairs that sum up to k' do + expect(distinct_pair_sum([3, 4, 2, 1, 5, 2, 8, 2], 100)).to eq([]) + expect(distinct_pair_sum([], 100)).to eq([]) + expect(distinct_pair_sum([59], 100)).to eq([]) + end + + it 'only returns distinct pairs' do + expect(sort_array([0, 1, 1, 2, 0, 1, 1], 2)).to eq([[0, 2], [1, 1]]) + expect(sort_array([3, 4, 2, 1, 5, 2, 8, 2], 10)).to eq([[2, 8]]) + expect(sort_array([59, 41], 100)).to eq([[41, 59]]) + expect(sort_array([1, 0, 0, 10, -10, 5, 4, 3, -3, -3], 0)).to eq([[-10, 10], [-3, 3], [0, 0]]) + end +end diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/spec/spec_helper.rb b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/solutions/distinct_pair_sum.js b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/solutions/distinct_pair_sum.js new file mode 100644 index 00000000..6d7bef90 --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/solutions/distinct_pair_sum.js @@ -0,0 +1,73 @@ +function distinctPairSum(arr, k) { + const pairs = {}; + + arr.slice(0, -1).forEach((num, idx) => { + const nextValue = arr[idx + 1]; + + if (num + nextValue === k && + pairs[num] === undefined && + pairs[nextValue] === undefined) { + pairs[num] = [num, nextValue]; + } + }); + + return Object.values(pairs); +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [[1, 1], [2, 0]]"); + console.log(distinctPairSum([0, 1, 1, 2, 0, 1, 1], 2)); + + console.log(""); + + console.log("Expecting: [[2, 8]]"); + console.log(distinctPairSum([3, 4, 2, 1, 5, 2, 8, 2], 10)); + + console.log(""); + + console.log("Expecting: []"); + console.log(distinctPairSum([3, 4, 2, 1, 5, 2, 8, 2], 100)); + + console.log(""); + + console.log("Expecting: []"); + console.log(distinctPairSum([], 100)); + + console.log(""); + + console.log("Expecting: [[59, 41]]"); + console.log(distinctPairSum([59, 41], 100)); + + console.log(""); + + console.log("Expecting: []"); + console.log(distinctPairSum([59], 100)); + + console.log(""); + + console.log("Expecting: [[0, 0], [10, -10], [3, -3]]"); + console.log(distinctPairSum([1, 0, 0, 10, -10, 5, 4, 3, -3, -3], 0)); +} + +module.exports = distinctPairSum; + +// Please add your pseudocode to this file +/*********************************************************************************** + * initialize empty object called pairs + * + * iterate over array up to second to last item: + * if current item and next item are not keys in pairs and they sum to k: + * add current item as key in pairs with value of [current item, next item] + * + * return values stored in pairs +************************************************************************************/ + +// And a written explanation of your solution +/*********************************************************************************** + * Objects only allow keys with unique values. If we iterate over the array, and on + * each iteration, check if the current value and next value add up to k, we can then + * check if either of those values is a key in pairs. If neither is a key in pairs, we + * add the current element being iterated over as the key and the pair as the value. + * When the iteration is over, we just return the values from pairs. + ************************************************************************************/ \ No newline at end of file diff --git a/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/solutions/distinct_pair_sum.rb b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/solutions/distinct_pair_sum.rb new file mode 100644 index 00000000..0efbc9bd --- /dev/null +++ b/03-week-3--additional-practice/03-bonus-4--distinct-pair-sum/solutions/distinct_pair_sum.rb @@ -0,0 +1,72 @@ +def distinct_pair_sum(arr, k) + pairs = {} + + (0...(arr.length - 1)).each do |idx| + next_value = arr[idx + 1] + + if next_value + arr[idx] == k && + !pairs.key?(next_value) && + !pairs.key?(arr[idx]) + pairs[arr[idx]] = [arr[idx], next_value] + end + end + + pairs.values +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [[1, 1], [2, 0]]" + print distinct_pair_sum([0, 1, 1, 2, 0, 1, 1], 2) + + puts + + puts "Expecting: [[2, 8]]" + print distinct_pair_sum([3, 4, 2, 1, 5, 2, 8, 2], 10) + + # Don't forget to add your own! + + puts + + puts "Expecting: []" + print distinct_pair_sum([3, 4, 2, 1, 5, 2, 8, 2], 100) + + puts + + puts "Expecting: []" + print distinct_pair_sum([], 100) + + puts + + puts "Expecting: [[59, 41]]" + print distinct_pair_sum([59, 41], 100) + + puts + + puts "Expecting: []" + print distinct_pair_sum([59], 100) + + puts + + puts "Expecting: [[0, 0], [10, -10], [3, -3]]" + print distinct_pair_sum([1, 0, 0, 10, -10, 5, 4, 3, -3, -3], 0) +end + +# Please add your pseudocode to this file +########################################################################################## + # initialize empty object called pairs + # + # iterate over array up to second to last item: + # if current item and next item are not keys in pairs and they sum to k: + # add current item as key in pairs with value of [current item, next item] + # + # return values stored in pairs +########################################################################################## + +# And a written explanation of your solution +########################################################################################## + # Objects only allow keys with unique values. If we iterate over the array, and on + # each iteration, check if the current value and next value add up to k, we can then + # check if either of those values is a key in pairs. If neither is a key in pairs, we + # add the current element being iterated over as the key and the pair as the value. + # When the iteration is over, we just return the values from pairs. +########################################################################################## diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/.gitignore b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/README.md b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/README.md new file mode 100644 index 00000000..57c22a1d --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/README.md @@ -0,0 +1,53 @@ +# Bonus 5: Consecutive Substrings + +Given a string, return all consecutive substrings within that string consisting of at least one character. Substrings should be returned in the order in which they appear. + +Note than in the string 'abc', 'ac' is not a consecutive substring. + +The input string will have a length of 0 or more. + +``` +Input: 'abc' +Output: ['a', 'ab', 'abc', 'b', 'bc', 'c'] + +Input: 'a' +Output: ['a'] +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/consecutive_substrings.js b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/consecutive_substrings.js new file mode 100644 index 00000000..115c46f1 --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/consecutive_substrings.js @@ -0,0 +1,19 @@ +function consecutiveSubstrings(string) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: ['a', 'ab', 'abc', 'b', 'bc', 'c']"); + console.log("=>", consecutiveSubstrings('abc')); + + console.log(""); + + console.log("Expecting: ['a']"); + console.log("=>", consecutiveSubstrings('a')); +} + +module.exports = consecutiveSubstrings; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/package.json b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/package.json new file mode 100644 index 00000000..28ba390d --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "consecutive_substrings", + "version": "1.0.0", + "description": "consecutive_substrings", + "main": "consecutive_substrings.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/tests/consecutive_substrings.test.js b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/tests/consecutive_substrings.test.js new file mode 100644 index 00000000..4e83192b --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/javascript/tests/consecutive_substrings.test.js @@ -0,0 +1,14 @@ +const consecutiveSubstrings = require('../consecutive_substrings'); + +test('returns an empty array when the input string is empty', () => { + expect(consecutiveSubstrings('').length).toBe(0); +}); + +test('returns an array containing one string when the input is one character', () => { + expect(consecutiveSubstrings('a')).toEqual(['a']); +}); + +test('can handle many letters', () => { + expect(consecutiveSubstrings('ab')).toEqual(['a', 'ab', 'b']); + expect(consecutiveSubstrings('abc')).toEqual(['a', 'ab', 'abc', 'b', 'bc', 'c']); +}); diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/.rspec b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/Gemfile b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/consecutive_substrings.rb b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/consecutive_substrings.rb new file mode 100644 index 00000000..c2349e3a --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/consecutive_substrings.rb @@ -0,0 +1,20 @@ +def consecutive_substrings(string) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: ['a', 'ab', 'abc', 'b', 'bc', 'c']" + print "=> " + print consecutive_substrings('abc') + + puts + + puts "Expecting: ['a']" + print "=> " + print consecutive_substrings('a') + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/spec/consecutive_substrings_spec.rb b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/spec/consecutive_substrings_spec.rb new file mode 100644 index 00000000..7080c042 --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/spec/consecutive_substrings_spec.rb @@ -0,0 +1,16 @@ +require './consecutive_substrings' + +RSpec.describe '#consecutive_substrings' do + it 'returns an empty array when the input string is empty' do + expect(consecutive_substrings('')).to eq([]) + end + + it 'returns an array containing one string when the input is one character' do + expect(consecutive_substrings('a')).to eq(['a']) + end + + it 'can handle many letters' do + expect(consecutive_substrings('ab')).to eq(['a', 'ab', 'b']) + expect(consecutive_substrings('abc')).to eq(['a', 'ab', 'abc', 'b', 'bc', 'c']) + end +end diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/spec/spec_helper.rb b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/solutions/consecutive_substrings.js b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/solutions/consecutive_substrings.js new file mode 100644 index 00000000..197b56d1 --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/solutions/consecutive_substrings.js @@ -0,0 +1,64 @@ +function consecutiveSubstrings(string) { + const stringArr = string.split(''); + const subs = []; + + stringArr.forEach((char, idx) => { + subs.push(char); + + let fragment = char; + + stringArr.slice(idx + 1).forEach((letter) => { + fragment = fragment + letter; + subs.push(fragment); + }); + }); + + return subs; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: ['a', 'ab', 'abc', 'b', 'bc', 'c']"); + console.log(consecutiveSubstrings('abc')); + + console.log(""); + + console.log("Expecting: ['a']"); + console.log(consecutiveSubstrings('a')); + + console.log(""); + + console.log("Expecting: []"); + console.log(consecutiveSubstrings('')); + + console.log(""); + + console.log("Expecting: ['a', 'ab', 'b']"); + console.log(consecutiveSubstrings('ab')); +} + +module.exports = consecutiveSubstrings; + +// Please add your pseudocode to this file +/***************************************************************************** + * initialize an empty array called subs + * + * iterate over string: + * push character onto subs + * initialize fragment and store character in it + * + * iterate over string starting one index ahead: + * add letter to fragment + * push fragment onto subs + * + * return subs + * ****************************************************************************/ + +// And a written explanation of your solution +/***************************************************************************** + * We can get all of the consecutive substrings by iterating over the string. We + * push that character onto an array. We also store that character in a variable, + * which we'll use to store the rest of the following characters. Next, we iterate + * over the rest of the string. Each time we encounter a new character, we add it + * onto the variable and then push the variable onto the array. + * ****************************************************************************/ \ No newline at end of file diff --git a/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/solutions/consecutive_substrings.rb b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/solutions/consecutive_substrings.rb new file mode 100644 index 00000000..50b4671a --- /dev/null +++ b/03-week-3--additional-practice/04-bonus-5--consecutive-substrings/solutions/consecutive_substrings.rb @@ -0,0 +1,61 @@ +def consecutive_substrings(string) + subs = [] + + string.split('').each_with_index do |char, idx| + subs << char + fragment = char + + string[idx + 1..-1].split('').each_with_index do |letter| + fragment += letter + subs << fragment + end + end + + subs +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: ['a', 'ab', 'abc', 'b', 'bc', 'c']" + print consecutive_substrings('abc') + + puts + + puts "Expecting: ['a']" + print consecutive_substrings('a') + + # Don't forget to add your own! + + puts + + puts "Expecting: []" + print consecutive_substrings('') + + puts + + puts "Expecting: ['a', 'ab', 'b']" + print consecutive_substrings('ab') +end + +# Please add your pseudocode to this file +##################################################################################### + # initialize an empty array called subs + # + # iterate over string: + # push character onto subs + # initialize fragment and store character in it + # + # iterate over string starting one index ahead: + # add letter to fragment + # push fragment onto subs + # + # return subs +##################################################################################### + +# And a written explanation of your solution +##################################################################################### + # We can get all of the consecutive substrings by iterating over the string. We + # push that character onto an array. We also store that character in a variable, + # which we'll use to store the rest of the following characters. Next, we iterate + # over the rest of the string. Each time we encounter a new character, we add it + # onto the variable and then push the variable onto the array. +##################################################################################### diff --git a/04-pairing-exercises-1/00-code-review/README.md b/04-pairing-exercises-1/00-code-review/README.md new file mode 100644 index 00000000..d6a5256c --- /dev/null +++ b/04-pairing-exercises-1/00-code-review/README.md @@ -0,0 +1,96 @@ +# Code Review + +## Introduction + +For this activity, you will perform a code review with a partner. You should +each review the other's code. + +- Choose a challenge you have both completed. +- Share the link to your repo with your partner. +- Write the critique and share it with your partner over Slack. Alternatively, + fork your partner's repo, add your comments to the code or in a new file, and + then make a Pull Request. + +## How to Write a Good Code Review + +A good code review is constructive and detailed. It does not use harsh or +derogatory language, nor is it broad in nature. When writing a review, ask +yourself if the critique could actually help your partner become a better coder. + +Here are some areas you may wish to comment on: + +- Readability: is the code easy to understand as it is written? Are variables + and functions named appropriately? Is code formatted consistently (spaces/tabs + and line breaks)? Have appropriate naming conventions been followed for the + chosen language (e.g. camel case for JS and snake case for Ruby)? +- Separation: were helper functions declared and used where appropriate? Did + those functions have a single responsibility? Were overly long function bodies + avoided (e.g. a function containing 20+ lines of code is probably too long and + a good candidate for being refactored)? +- Syntax: was the correct syntax used? Be sure to point out any syntactical + errors. +- Redundancies: is there any useless code in the solution, such as unused + variables or functions? Are there lines of code that could be removed without + affecting the output? Were unnecessary comments removed? +- Efficacy: does the code achieve the goal? Were any tests cases missed? +- Overall quality: are there areas that could be improved? Could certain lines + be shortened without reducing readability? Were the appropriate methods used, + such as Array methods, when applicable? If pseudocode and an explanation were + included in your partner's repo, were you able to understand it? What did they + explain well? What could be made clearer and how? + +## Example + +The following is an example of a review for the below code. Use the example as a +guide for your own reviews and not a required template. + +```js +// Challenge: Print each character on a single line in the following format: : +function printCharacters(string) { + var output = []; + + for (var i = 0; i <= string.length; i++) { + var outputString = i + ": " + string[i]; + output.push(outputString); + } + + for (var i = 0; i <= output.length; i++) { + console.log(output[i]); + } +} +``` + +### Review + +Hi partner, + +I've looked over your solution to the challenge. I'm just going to dive right in +to what I think went well and what can be improved: + +What went well: + +- Formatting and consistency: The code is formatted well. The same spacing is + used throughout and so is camelcase. This made it very easy to read. +- Syntax: There are no syntax errors and the code runs without error. +- Naming: Everything is named clearly and easy to understand. +- Separation: The solution was short so I can see why you didn't use helper + functions. If you wanted to, you could separate each loop and their logic into + well-named helpers. + +What could be improved: + +- Syntax: I know it's weird to see this here also, but modern JS prefers let and + const to var. +- Efficacy: The code doesn't quite achieve the challenge. For example, even if + the string is empty it prints "0: undefined", which seems strange, and it + prints that same line but with a different number at the end of any provided + string. This is because of the terminating condition in the for loops. The + condition should be < and not <=. +- Overall quality: The challenge could be solved with a single loop that prints + the string. There's no need to create a new array and push strings to it. Also + we can loop over a string using a for...of loop, which would be more + appropriate than using a for loop. Whenever possible we should use the most + specific method provided by the language, e.g. when looping over an array use + forEach(). + +I didn't see an explanation or pseudocode, so I can't comment on that. diff --git a/04-pairing-exercises-1/01-whiteboard/README.md b/04-pairing-exercises-1/01-whiteboard/README.md new file mode 100644 index 00000000..d4a1176e --- /dev/null +++ b/04-pairing-exercises-1/01-whiteboard/README.md @@ -0,0 +1,92 @@ +# Whiteboard + +## Introduction + +For this activity, you and your partner will each choose a problem and solve it +in front of one another. You may select a problem you have already solved or a +problem you have not yet solved. You may complete this activity using an actual +whiteboard, if available, or in the IDE of your choosing, such as VS Code or an +online REPL. + +Keep in mind that these challenges tend to make people nervous, so remember to +always be kind, patient, and encouraging. Also be aware that nerves can cause +people to come up with some pretty weird solutions to problems, so remember to +bring your empathy with you! + +Plan to spend 15 minutes in each role. This means you and/or your partner might +not have enough time to finish the solution, and that's OK. If you can +reasonably spend more time on this, you can, but do put a time limit on it. + +## Instructions for Interviewer + +As the interviewer your job will be to first present the problem. Explain the +challenge to your partner and provide some example test cases. You are not +expected to provide every possible test case or edge case. Instead, provide just +enough detail for the interviewee to understand the problem and ask clarifying +questions. Example: "For this challenge, your function will accept a single +string as input and return it in reverse. So if it were to receive 'cat', it +would return 'tac'." + +You will also need to answer questions. Your partner might ask you to confirm +their understanding of the problem or whether or not they should handle certain +edge cases. If you don't know the answer to a question, it's OK to say "I don't +know" or "I'll let you decide." Sometimes the interviewer doesn't have the +answers. + +Notice when your partner gets stuck and needs a nudge in the right direction. +Provide helpful tips or hints, but don't give away the answer. Ideally, your +partner will ask questions when they get stuck, but if you notice that they're +struggling with something for a little too long, don't be afraid to give a +little nudge. You can also ask in advance if your partner would like a hint +before providing advice. + +When time is up, provide a constructive review of your partner's performance. +Some areas to talk about include: + +- Problem explanation: did your partner explain the problem back to you in their + own words and confirm their understanding before coding? Did they ask + clarifying questions when necessary? +- Testing: did your partner check their understanding against the given test + case/s? Did they write their own? +- Pseudocoding: did your partner explain what they were going to do out loud + before coding and with pseudocode? Did they check their pseudocode against the + test cases? +- Solution: did your partner solve the problem? Was their syntax correct? Did + they handle all of the test cases? Were variables and functions named + appropriately? How readable was the code? +- Openness to feedback: Did they ask for feedback when necessary? Were they + receptive to your feedback? + +Ultimately, it is more important for the interviewer to evaluate the +interviewee's communication during this exercise, so if time is an issue, focus +your review there rather than on the solution itself. When providing feedback, +be specific, so your partner has an opportunity to improve. Also structure your +feedback into two sections. For example, you might talk about what went well and +then what can be improved, rather than mixing them together. + +## Instructions for Interviewee + +As the interviewee, your job will be to solve the problem posed by your partner. +The Interviewer instructions above explain which areas you should focus on in +order to ace your interview. The content in the Welcome section of this course +will also help, so make sure you read it before attempting your first whiteboard +challenge. + +Here are some general tips: + +- Communication is key: explain the problem and your approach to the solution +- Assume you haven't been given all of the information, such as all of the + inputs you need to account for +- Ask for help when you need it and be receptive to feedback +- Don't be afraid to admit when you know there's a better way to do something, + e.g. "I know I'm brute forcing this solution and there's a more efficient way, + but I want to solve it first and then optimize once I know I can solve it." + +When time is up, provide a constructive review for your interviewer. Some areas +to talk about include: + +- Did the interviewer communicate clearly? Could you understand the challenge + and did they answer your questions in a manner that you could understand? +- Did they give you time to solve the problem or explore a possible solution + before providing feedback? In other words, were they patient? +- Was their feedback helpful? diff --git a/05-week-4--big-o-notation/00-day-1--introduction-to-big-o-notation/Big-O-graph.png b/05-week-4--big-o-notation/00-day-1--introduction-to-big-o-notation/Big-O-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6124fbf6b17e50692630da5d7a6f2f267e8b8a GIT binary patch literal 264073 zcmZ^~1yo$i(l!hP0tA94xJw8+NN{%u8r)?F?!g8RKIkC9U4pv?cSvw&aCdiypL0)g z?)leu-&uRsn(4i}ySl2ny6UOg!HV*duU`?of`Nf~EiEOc1Oo$K{rr82^zyldNpo!h z1_o8iTvSw1T2z!w@r$jAxs@>tj8t%}I--j5FM>2}C22DsBq`+PU<#>tERj$$GSza- zXd#hc7IH8&%J{8LBlv4WRuM%=DMDlo5D*Gy_wtruUrL{n%Z&(6pf5n=TD;`?5~kll(jADqJ#yi)LoO1*sH zuTj`BL!eXGkw~EPy;l0;vQX0t7}oIK7~>Zib8r{MB3>Npqs_<_jbdbRFd348TwuT| zGFgN#NW<$<g2IeOx0&hWG#2i77sFgt4yhZ@X6I(xKB#o;!F|K^CFhuS8+1^Q~BB`zd<1QKgG#V zQKr`;bg@20*W3UiI>orZ0E*krAic_b9M4c2Z}effFw1n4U;?4q3xHp`9@mNR%dl=UBJlYVoVYCB zFi-J8Rg9MQpo-YplkZ=GG~Hgrb=d*&SVHiG9eW0k$@pL(KAuQcBtHO$oEQhV?j1%V zh%2xw1j5ok*u`}y?%t8&;GujQ5%uTT8Ypwt*nkBib`eB(-m{@^n9n*UYl6O&1 zm^0tp-rWC?ZBi_xkuysQYg*_SD4W7aXHc;+1o&)EeZSJFL2^iP2$SDJnPk2DR{6nG zC}FE*8%Gfq>D&3$73qCe=p#&#o`CjlZzup$b@b@3Vd0`MbZ4KLPj5H@tINyavwq@6hUqpg|?3Kg>*+mkAhSY^?Rm7KEm$T2qDi;90cL- zGGj)p90|0-;<98$=&I2cd^j?DN6xm{Re}XX-C4fw7|0F~ICOfjpy334H_}W%P4s}|!DTfU>NAm%twii$NjLX7m9BNx*F%oZFPya#RsO9m5n z1$F6R1%Lkdg&HAxRfQRz1SrHZ5l8GCS&XsSX<7Kf68(vhP6&h|ER z`+6sA9CL4AykKmm#6e=KWyn2=d@!IVQ!a!(BR-?>6q*Y*b|t}-k#a3xOlhsc29NpV6riPx^(tYv9e)1ZR@OO2{MW93Db$Bff}fW z=$L4lA9Cz}Zjjr`1t$3?Aj$Q~IVb9{-5B(-zUCZc*R`3oa+^lwbYLMgXd5P%iO`-Y8Y+k)M@i$bRKFG zVDsAMDu^wp7ZrfN$ajB()QGu583*CwU#)74cTc-BxtgPVEg6BY$y({OE`yGX-Xa;^ ztE$jo>c6Ekj5Cazts{vnSwiYG9=gIlwI^A|QKqmcu*iBOal}N*n~s{Ul}^|q(Q?uf z>N$Lkc`x#?c}slmespx8zuemUbOclPb^hxCtb!zO1Wv>v->qSW92vmQD1#OJ_8aE8 zLnJGdCjnOn_nxeaLky#mdL4N#F|~8C-HT+Ggbrna^fqp7IB}4hATU5YFgBhIVTt^kVjmcJSQ>b4g~MdR z7;>E$c$^2Iu|`K-v%MdI$!kJHoHoYu3!vU>^OM$a%7{=>b+$wMj-URT$a&cK!OB>5 zG%eDv&&#ouK1#(9 zFud>|3f9B!f2Wte&Q)MGHuK9Q=IkA5QWj?br?Krza!Ph1_Z~?-qOyqT)zyI1H; zTnJ-&?Z;ZWI%+H4Pe;o7tqUG^V=t?PM@MRmRwHD1JDqDkG_c#uch9R<5bmq(Kb}p8 z>6aY^FOJtvyV$M?+aWY~6zhI* zUjwxyo{lM7YGOGFJk4F+9M^WO)4Tt4ExB~y>Vo9bceJ}y(q!sYcBnt}H2eKrjiiCp z`KiON3$c#$lvKc-%KN;c>YU}legnIR=0br#jbuM$yWxDxUywIlI{m^a{=xWI{lFn_ z>+TWl=1yezI&BEI688as+sf)$b8(SBZQXp*e6_gVy5p|>ICQ>Hd)0EJ;4SrVoMU?{ zIo4aKFqEz(DCylYp1!mM*!Tt7&4zhNm=uf9)?WfMG7e*))dXwik3MOi>hR|4LOJ(<-+XyN#I7_s%*8p8l~$CgtDD&mv*R97(Dc$%9~_Jl zJxu!NhX>ES+dDz)!1hJB24Fuv!|0@+SV z(*Xtshx)HCth5r6KYDUylWelaFvXZpazOd;@!jEs!$%V!fF zB{7NL-Jk#QQx?zE93JMj1I0gj)ovc8wbk2 z2l+FOn6ZP=7jrvDb6Xp-zs5BL+B!M%Q&9Xh(LbNR=`;qJ|92)Ehu_P3ULfGFI{+3Y zX2AdI=4fv6e{}on&fnesv#!6V%VUOtLtC1@F;vSH-2W*U(66-;RF0XZNH!A1N_CQe{t?_vHYj? zSuO&v_yGUNSm4!DTeKw%j1Y{pn6L^6cE8!hMMpAe6W@+X_^26H>eB}-+EFPw)q9iZXxx6dKt7=+lRcdY4H_}m9&72vC$XM`TPp_lqDAy>dNHXyl zWIkc)Qk1hE0EKv0C+Fgv{bNUWMb5XAQ{(d(IcS4J!npW288wWxLI|FsrWYK)5VUC+7UsDs8k6s<&m z$U6hL|9M#pxB04RqsD}P_@66<#r_H3u$FUJ5qorJ_PpY{3Zi+pV@dZ;@B zkZ)K1drc)0%LND}*SLxgY6E~C1$vWFS1RUEtrCvcR*?Tlwe6f@A#h}P3E2AeKQdS`jh_~IyFAo2uZsZi6NVI4p=;zBn9jh=w zw{0-PQxP(W|K2=p{qK$kNVEWRigl)c_;LIh&XrKlw0Gc|lm2$DK=2@{GLL9#)~K1k zXF%shr2wF}`fT7)y^dXwAk*tBDimUGMAWM!vyN20kOT5i@>WpH??H@a%6#?Tr z!o{+qs*ML!GxYB+ROiRDS^9^ZRAj!YjBa<=SJOA9uA;+L-^@)1Y8QUrPQv~Plu?~G zb1rk;xm}3Ew%N^XKCL>j>P@C>E;8>!Q;p%b)iN7PHm2l}9n%?)R&7i+`N_$0d4rc^ z>5;ouH85vtv5o(#rqX(Ngcz6Q51AM~ra0BFOm9vv#ua={&Ap=BLo8A!f6qA^Eri2( z>YFUDa(2;O@WK8$$I7sr7|W{5>bYqR%!9`L}xPT zu;p>V+j`94739{ilt#jdSjo<2F1vH4l5qU6y}R89PTQ4wnB-J+cE0BSsDLn%_*>(b zsWG-oA1SV|W*xBqnN<#nOsX8b+1ZM7q9CDwMccr$7kZ)N^?BWJVsT+XmtN4&UJtW9 zDPioiF3BGG1lDmiA${C-$Q4ItvI-3uJ5`mRRs&a;sf&I=$dN+z?5&H}$*|SjxXL+$ zaa!&pZYn24v?f)5HgER_1&8Wh|JGnv@hxA1n^jHEZPCMV{U4=mE22EMBGD=v(yO!j zt)1g>LVDn!jMF#3KKOPaV@&(PMQ!|9$J3IbRd~;AeWP3T1_IH;x36O1i-)MBWn6j$ z^K{0~-|Q#H*?w_2A2owUSzAPZf7h^K3h7Ti>#Eq_`r%%-oR!$DDQm@ntM3!MmSkme z^aHiQKu?ZZ--uiPzZ(_=hf}S`XH@sc`YXR{TgAs*9;HN9dYwiSqblOn^y&TFjH*@m zD@@6&QTyZd5X(vFBqo&e9xp!m;yu*SErj=~F|R+y+=XAt|MYd8;g!uBfbIJbmrQ0L zpP$ceV_=Fyd{$8bXzfzk{4lCRQ^Zy$O~|bvAW)!t%6@k2ro=7C`A2acfkz`ZG&cukPGi;$`hyL3VlsYA7(%`)7MYuKxzAxk|RT0ZFXj}>jwc(z(@6&|{c{}D(VDz)MTTCfAMH27n9 zsAZa};F^7u_kF5G^F-{k4C}*x=!dX=E7*v69bl(atxd09VCfNhU>}Pw5dAgiy~=^n zp?AAbN1CshaYg>Dw_8#G!!8DU@YmNbj>EV}Scb?oV&RN_@z&{=)tZ%+*Lc;PFkEqx z{z|`_NVtmC6(n_3<{-t%8DJuHKnNc$x?=0qNvrhuV8IffCSfpiar=*Va12D&_!re* zk!5$^veWsjJ&q_gxL@ftct3ej3}F>u7*(s57tuSpO!_rKA|kq+yGB1*vrJ5Nq#bIS zt0|}_v75^89vsM3nGU}CL`i9iDKMpqTlM2fQF!fWG;Ox|$$)E6DY5=+Gq>JhtFSap zr@ABpjENpdn$zg#GQOPJxHFVGw=;F1z0>Z8Xbu8#@e_F^AVmvWUhaQzue~j58A|39 zjIi4~NX@=;@U8n0hEem1W&P$oDBa;#W9H0yEd(Z}Eu66!hPJ22*p z7t>=iRi@o1N)2uog{6qT2g}O_;5VrulpNlV_tlO&(c5QP;wa--Ct4Liajjab`iTB< z-vAV<-M17yPz~L#_aCAg6r%$o3%Cka2L>fZAGWy#!5Sc~6_ zBu=E}=lMPssg+D!gTMD6RE+-m=b*dz%fo19sSy8r>yCeYw($$~?wzM(JPx;xx2HvA zfs>l%I9Eyjh63-KdCp z9JwAG&&|LRNKSl&1P!=)THm&#nZcX{=^gY%$6;Cxj+(R8=E`nogPdcR2fQNl+SPW3 zAjePgKXc>0L5jbdu$B&F@b!84nY$rfbDDBac7jH zrXIQAy&c)Z+|%RqF@p$+4Evjedp;e&pU*!!g>u7R73oQ%X+4gn{fhGNGdwdru$`E6~<>DVj-q{=wz!uUbxCjs7%v>|;i0D7J~ zIbNxDoj{3Rm0Je~R3bT{U-@kTLBG5+e-=y68K&)zxjI|RdC86TAM$B-MV%;REJ9Ch zvGhAXqbPR-pUz2lc4LcX(PpEjO0<(nKB9Kk7PfI|Cb!uBaW0Qf|FX_E0}ENdP0t(n z>KBDYZ^|{e&Jr2R;%Y3XEl!%%7CEXy5uE&zF|tszdLQmYcS3NMIc*nZ1%JKR-W(*{ zsjQt}7{j3xOC5Z8FgN%6Asl(e9fDh9(B1*A7rQTBtZycVY2G(<#bNQ|GV=4g8vBJ! zGftE4!GQjKcx+n#NlyDcAdqwFi)(I$u2py!ihm3Ewc0D?F4{)w;ddb2ICZo+Y|I|{ zG`@l#+AbnwyxxZ%w->fvjE0uBR+9ck*5!Rw4DSPPKcEp*;%F}(7Z(a{wp(pUi=pg4H}k29&&pj3T}*%7Ymuzi9>{X<0WV z?I5JEp(B>+DlBNIYS6Y?qk2l>N*OAi6C&EushmJE`kltO#h&Nb$G>I-tzr-W* zb@AjSU-Q_9vIKiR@uqUwi%=Z;oqOLuEafek>6{E171^-27uUJiXfZ$-YJ-5BER#Iv zr!f0NYsWIyCAB*a|BWH#$)4ga`z^n`{>T4Qpo$C#vgpy+w_FL697&qA9DDS<8=tdn zC8j`xL!SHbQ(4ZcfMRp1Ksj%GSddgs@DU`YjWql*znK$CVIs#+dJ-kG( z_C`tF;zyLXk``-$;pWXv=3u}Dof0Kve%NFcc6j?LklrIq$|z56TaE z-#gXL?|x~qw|u$%1a##ed|hD^Cx#pwn>WFT5Y}q{AOSkMr?LTS#=lYCKaK6jRNh}4 z@kGW?HLqBW9!z4_?iF8anlB8aax!z=?VALR7I>wzLL>5Hv8Tc2f{)imNLoeghhY!J z#{2>5i9irSXl0TGZ+%1$<*K&2+*eDFTaU7eaF$ij)u928!=>!)p8g{i+*q=0OCpCA zH1cwPAqGc4>)L~`bV6c|nT9sUYcNd`3#H7A?*x2z*my+s6)kXU_Hdz51gTU7GcS~? z;o|Blz=Z_3Wm(pY12jQr==P@DC)_))`Evlbh0=`hKTfaVE@f!{27P>-X)r`YXM#;S z`aeGu#Zf9Se4~C<{t#{o!oIk;$kTtio!+@>ee%?z5)R~RN>s#ur_!%|KV+^wnduia z*7|hU`h8g7j-d(S#dn(B6xX8UQS4+sS37N~je8*J4W8Caz9oiH)i!L_ibagD|@ z@qukWjC#?6JlQ|ZrEFtR-+G6NDd0N zT2;B0R~?75st@pU$3$xf0U%5J2+wdMA!OrN$@PZw#m1xWkB@^Z8#Evkbgg51D8d}T<`X-(>+Xgi*ZE`LpiSwiYvkT88 zXYKJ+UF4KDu*k5i>6YWd8mm>3#bxs&>W2H-hhS%k3-VDtqvF!Mg1z|lZo;UiMwMQg zY22sb(X#=8;ZS5a3#R4l-`l8~*{5eIP7A7%Z1VfSDGLKZP7d>5mL1=U%*P`9*4Y?(1F5_UF?S<1`v{B)H4gW;$D$`hd z|ByQ*bR_MygZw(2Py^Sw2|havp}qj#dJINTsDX=%I?~GtHi}Pvd?_yW`mSH}k3)hT zrWWL|LaqBY?mr7V)`M0=x>6_(-^`(55`lRydY?{%&b6Cq?c!^{U3>&*G;hlwzRqVM z{-V510^+*pBSg!5HELJTR578$Y(z-bzS4TLnS4AyQ)3wq3?GCXq`QvlR}~e1nC+1I z&hX}q`mJa2BsLV~(m3S&e&$;f)>$4BEXX^>Q zQIvYJqO&H!7%y@C2N~`S^r3AamUkPZv)@VhDvq(J;s`I^JcthLgn98ty1cO^NIA>L z!-h{wz%C5BHNd^eaS~O zT#g-w6rXao!YhH=XoAe-kzcl~ah}Lp4xBp?<oWnpV@?P=CWa6pGTd@4=UpPE?$Wte5kqhuaa|?dSWY+qO)L=^Mu!c5YbzI-%&plr zAuCIQ=E-Fbp<6$ZtA?Y4ZAH`1&GVtO=;^*62q1Grlm`c_ z0}QXBG=9R+(^z_SiGgC5MNdh42uD#kLPJ@%cgb+u+KZnWzw%h%F&K|AaX@f@RsI8| z`MfGq`Jf+;_s|MQ;nf)hLE`WPMS8Vj#qvjPa(M%79C!<7CC@~QtJCm6%HbKbde<`( zWQ{!$+1u+iL1{6qIvwnp#=w(m*e3$x1gX%s8~@uq1kdSQZT9_kyx z&YGlrV_?E=oy^i3Oc!hOu1FCLQIP1!-T;Y(!2~H^;>!=XU_ocaISvS^AUQxdSUic| z<>k@)+PQ-BI@?Dz(2G)yL}*X1v-*CU!~3~G=h?Zs!=FWVWUC1*F0_#MbBvkD_SR?} z*_+TxV;T10xF94=(BPy|G>c$qkv`b(IRKLt+@nTzsZPb_P4wFu)(3;M>TDLIEW1yEmvOxk@BF!gPA#;CEpZdAF^nb~rskYucIsZAEz+9olC5!dm# zsbC>3Z%?LiBze24v|HdBas4@|PzkU(PCMXse>mN#ebc8V-0H{iuSnh{1h8Z@&$-Fp zb>2R*0x*r$Eh3nv5r;*aunhGLzq!B%M2D6%J(2UmK zM*|LJB*eee#^>V*Zl~4HAU^VMR&%xd&9xWou2Bqfsa3lt=^e9QqKFUV#{_Ziz(z=#k`SWT zCtt+{7B#zuR)5H9zsD@gkHCo}+vfGYE|W@`W_pz?fs~8``C76vFE>tbFI6( zw}*nx=pUP6p++wVmyK5W0+1EFD#a872`DGel!hCiZq|%qj0h9-D#G}T)0)g3_7ZjFa2kfW=py~bR2MTJ)7V)SX#W}YLZF>=?JtO^)|V28`j zc2eM>)%*{Z+Tp{cRzTC%Hm^1zzA}7yk$Tz3dmhH*i0))$fE37=Uj&y#cRig(__czV zfA8bt<8qbP!!5@Bv24dXpm8d<=R0DqW6?p9rZ=UBbu{meJM0( zbD4gK)Ox42{c{Ai7rGDWWt?9r%-VSrD0e&PU$a2&CErXu`S-kreZyj*2qdBaI1i_{ zlEF6<1Fvsut#2dF1Il|n`WFoizj?LA+&sHND;S?DET<0_%xgB0xANpu!&>b9@qG^Q z5t}O2N_Ap6Y~~}K4?QUTXWka6x((fqjuZsG(D`Tg zt6PK%9x^72Q;Q@DR_Y2B$ygoyYQ@>94TdULTz?miZBO3n+vwl9J8D&zEdWs1@%VOH zGv1m9`8P9+ARDxb>q$N%RN)<(ah3QPbn$59Up|UiDUkHistMq86U%wm+0BTDDTy*_y%mwV z10A*yo!hoqXu!8UYNUWQ-1|9I8Qqb~7dL2CYP|0Ml3*+NkVRr8fchQCzhV%x{n_1a zMbVxr)y>A!-|HO=*8x~hH;fvVCTdk?omV)fj$(5R%?j-Q% zvBr3c=zBu}qR~)IZb%Q9}M$s-kE;iJ62wiiDv0vcFc=x3yXCqqbTHToQllX z*`@O?KYJ&u#aBZoZs#ZVe?)7wT&|Ka`@`&F%v)Sjg+n9;Li*6i4zo;RY8N2Kzy_tMRI7*WUzNZ$X+XwF7G=bD^}*ysMn z;*ZCW`9A#s`HC|L+;ldu`ZJvNx?=VQZjpC=vt3_HLU62l;}ko5B5OE@r^m@Ki}@Z( z(HqAh#^@hIR2Q@XSX7R8O-{#IZPJAx+*+PW{epXYU`Q$g2iFD>B$4*My*6qVKUvz~ z{=(<1U%_v0b2N_;RgM6ORkpb6+mJCt@tvm*M%h|-6`O6ixPVTH^Oae=$~_m=A?R*Q zf!wZ@_+xn-zw5vbbO#d>PT5KosrUPdX9>3r1g!q7t&MioLAj&~ra4nVw5{DcI#Sr9 zqS95;KU{3iW7LZW-cj-GN?-K7+~2y+5sN&5g9{gyWovuARLXU(45&g*x2%>CBq{AnlsQ5tSy1&^&(080>c z#UiaK3KY6NNw02%vTBT+2;UoYRia%dnlDTyd@W`cQeXIpZIJ$r|9el}LZ)*ddmV|y ze4$PtcfSS&#lu}4{z-8|K|Fy0Zt<~BHqj-s4CVm_oB}-u5zFfK zGs@UJs?f4DA-qJ}Kc7c5?Xi?t2xrfJ>u>U8kVa5i>K(K}#Ek=&B!L%OmE>!dMIJX{?@iDm54-q9)4XZ;9 zNnj%>^&Wn-ClnmOGi?Q)@m&Yn1d_E(p z$UL}ADUgio8@cFouUlzwJoDGP4%W+wzW^GzenaaRO1-JxbdMB_;o}6O$Ag7N0Fb9d zvxIFWb;?0sujiC-zu_(R9B zwgm3>*<9b0#!XM(eozO_>kJ~?`Uk1Bu0~ckong<24$$K5FFvS&(4$Gqx~BD)-kn%| zg8F5sV0%uQ4M-C205~EsKAh}}_}@)?Kd2M8MjV;7!Ygt$72sJlv0wwlLdd#Od0jY& zBe^cZPbvIA1sa?|{d)1Ua2&XsST343@UzITFgnao&;gsjHV3tVdwX=N_Ox+$XUHev z2N57e3VBKo&#MPc;Dz2S#c=mbm0oCq?x;^6`mGG<4RhJ5!p&3CM~*)g3PSzZ&smOB z(a$gbK1yd(Vcz8opBt?Q^GE z+_<4yIQ<|{If8AgSY+K*6C)tJrZADCa7->6(=GQYq}zSP>73a=rHGuz<6<&?o z66esWceeE@6$1-=AliDo%uOA&(srKL{^^5eaSP6D#s?Ba4*B!F* zV-9gK!dcM)p&Sib!*J^icp6FB;vpX^6lXaTLff0hk_vA7)z4O)qURY3yfwrJ*$}UI zfr(oFRR|;bwJT)R&zvDx-)XJq;`r1LR%8d+`jdE=Ruf3tO?T0mKZH7P*?$3rYI)!} zW!0tHMXNy$!pz(4ME52H63L#te70TSZsi?+-=CDruch)oTW;_kHN`w02MPL{68PdB zoYX4755T(eR5)R_qm8~)pz4}a&b!P>UhS@J*Q|6(-Q?ZCfJ=0l7;ZAOSvlx&Zhck> zF#}h4KE50v(TBMZP6Cs{=OiUoA2wGSV|CL5)-Z#Wfz_h-)59{7^8PY!(f+AyBdPEB zY|Wm?x7+@7!Pw@!@%Y&(B$OtKlL$ZkCfMpzVq?7#+b#<+Ko647@d3ZPh!yn@J_eij zYBPydroa|fQ|M*zR~N0-GtJ;E5Ob~yq*HB=SpV0mrRI}fp&ZR`u+)t6IR`vz-DOqw zAHYFK8}la+2k!N%EPLif`Sl?3N}$jjs2)QbY2~X55>9MbL+@qtCxju1uR_m00dQ0w zN&XHyjj}1VRO%ZePBFvKjS6;rHRk0G(NXkxo#BR3)R;{A?|bzT4`-ZX+OA{=G74-cKk&wy53<+dPFJm zL>hPPylUI>#9=k7`3LEwgf=u-D$wBTGptP;EPNrObcpS={`%$kTTU7$x&A5Gbn<1eYV&ME zKal~6iFTFTc`%p#(?jdil|i-PiyQYf1PstO%&YK6=Ax6`wL71Dc4j;Frc;dE9^hgM25h>B17m`DA8}wP>jr&%4XsTJ|O*uxCJ|y387C!9sXTRn{1dd0qg)|CWg?`oMA&`Rs33^%^ep!|k;ekuo zWViI8y7l*gH7r;B))X-IByFbc_b!~;?v-v)Aty0xJTIEE!dNU*jAIP5!r5;>V!`O2{^~#uqo%7A7Dn)p37449pfl(1IrGF zK?85i58Pclg+as)kRmsc=G&c27-h2F@b^U0t0wkU^%_~1TBMNj`jp0Pr+2b^oY8p~ zyf;}i{f4N{7DYh{FY*-RxZ{ozba+^^;{(qJ)FHlJ5$c+xP$PhwcuS1$SFUPYA?Urt zeHvyj!exZA;t?D^Ka89i=HB#RKc3s7W#`qU4~*vjmKyUNm^QIxA3OQk*yB$vlUBIU z18108)xhQNYS1=R@-~WC1Zqh>X6TpLI^7L}9Wak;McBxNP}U^)a0MX%sRt86gtHKe z!-!Uf;UD_=cw%4OLkCpr>0jlyioEuJ-^0PkCxxMUoB~9_6_G+~(+lSmBX(sOz-cQf zvweL;vEQ3}&rmlBTIcqzbb*Rt(*44=&Y5!Qqm&{W@;`=Y)cUTOC9+LxTzDTzNN%^z z_hyxRT0`+tlqRvtM!X}}f|ixiVnbyx-GL%((&00pF$d#hzQj8%A;KTw?5Q%NlmIIx*;sC}ixC5k)Fq>=fXu!N>zClP`*A z(@8RW4Pnw@G8Q!Uoww8;VYY@GB&3X!oW*h^5LQQ>Rmnwhq6*N}HH?|m!jgxWDoe8f zj9RFW-8*MHT;w|z+c9!5o=eQ{{MN9nJ5#!y<*2QYv_CxO{9NgJEDL~oE8Vpc6nNT< zD^g$G^-{`JMc&TAp~Q9n_=E_Yln7Swvg&)++4>ex zg13R5IrhOaa-AHBU~B!QPtV1dE{l%FSGjYwM__9Y(3b!h+I9v+?BPjv5=?f`3li9^ zllAPh!Q?uBnu)bK3!E&&qxnTBS}<3zr&Ums;|>rh4e66rtYw^#5Gwtql~F6cyKo^{y(?Wv@9EUD|ay$U9TWcAifsT82q3dF$k zXmJ69AR9oCJ+D?vkN0cMJ{JDx#w=Ff6YdYmzD@O38GbC6842lyoMlOU`Yb&@vs22t z!HU}jv*^jXKOpkPUqDMed4=%bhMg^3=<=hXa0sUaCfOatO>`N^_*s*PGEz3DBa3v! z??4vx72`a)Z66eU{EmASufnOg^%uI^R%O*Bm5264MKLOGtkn};p6&R9I1)JncYf6_=MSyZ%kuXukUnJrT&=Zk%hrq8l zQg4=ny*`X4f%M8CQ!?$D43RU@h`Cm=VlbKf@ceMATaQXSc^+l6tsa1_73lU`&eQT$ zZok)f8N*g59fTouJS6;XRL^_utt;j76~S~Y7V=uSmvQm?p2}I0RRx?#t_~#ILSbuR zKm4_hd#&P(b*lp6zKJY_HuuhFYDQI61WNeQ-1zj zNBev-A3~w5f1k`dVnU%tI1PhXD4%emyOe>3eI4=ECZUcV^KdcZyUztn9h4T?zUGu_ zsIM1d@-IBCFe$%sXxAeZ4sw)bg}cEVV+d;CpM6?wiz_yC%^{;ZPU!}bD>5c6Z-{%U z-hqt+9-8VQ2?|x!(6XLKx8mOC7vwkn$S}sfMpk?e{h^EW`5b=^Ll|no%>awmo{!=3 zJ{A8tLKTRmbxW|^`k9&)?tyEMdgAMb$%H|QvANl&TrfMF(mGQi(DR*mRJPe^Kkv{! zxVJCDu07%E!aC$y$?EJ*#AgLlkPBc?d1Bxe%B>n;I_P>5DBoc`5!}#`~^2 zbk;X0znc(_^y4`p{wTDNpvPFsdeupaudw&KMG>@xx1T$jrMd_G8UYlFAy0PCM7n4G?Ur zs^qvTOr;d1?slpFq6<2DOB{AfxXE+HjP1_d+Ze_eT~kZvbTje0m`W>F=)v|Efc1!K|1M4*{RuA9&pHYT4irV6|KVi;jXu92uKNA^T~l&>x%0Q=mO^t> zCmHQ`C}jj{eCgv1l8>}5w}X$;*aWVc|4DJK@5@z3T_JWQL>4-*`1@Ob=wy~9V1 z(m=RqQljg(VhUV@VS21SU4HCCPYB*7%W!Vlj!cXCinMC313JFk0h76>gYUF_ya6% zcEo~ToY*;ddpF!2W~_1$hjQ*$92^FbqUE-2V4qRSojOiDyke-%eugU13M`Y zxBRNcqI^!2;4o2-3BibgqU#uxLVMrorD;N9%#YGwr?d56Qmq7A@&}Ei+`Z3bt$Sz9 zj|>p^7C&Nc)xBZoO;aM*2&4rw2X@HtpA5uXWJk^i?TWXIHFAGqo*wv-@4GSsS(Fu< zR!y3hEL}{DEJet|WH>o1sg#-Etxv&2)$ggj-iow!AfRO9%{@TrRIvx>Q1*2Ib*H|Z zIPDX8$@5zcOcto!u1wSWQeL$owy%!hFD~Gz$IVk z-;fdd7(FKeUwL^m`Zt`N?vm$@$K7cwL29|wl%L;p@|xVbN%25JvNG(F*`6p+HpaLJ zs+f#sOb&hHQ22@Y=SJQaF{!Nk&rSxSVV2x2NYtSD=OQ}lgM}&@T@|v+vesL=)HtYw zfunzVI3b6G-8q3az7kUKcdkO76Rqsh6hw4NxI)U(Fc}t{djr;qbVbrdJ6E(7+TQyl zP6d{lq^@PU*^jTXmUN&L&d|0tA)eDU$WEE}!~e(LTSdjWEbqgCK!A`0cXx*nG+}Uu z03o;y?iSo35L|E`~NrGLBt zve0TX+9w#OGbXm&*^HQ|i{pW{or-~TGOwL6Q7yWj!4I7YE7POm^)7i2cU1(hI>`!m zmhBBYc4>W`>#W^l)vO@<$An6?4}PMf9A1N%>f0Fl3#sTJFqfF5<_>57pAPu43v0YS48??;#FX z?p$VSgzFf(?dqWX8ZFyKYFFMh5?jEHq5*mbslmYW?zjQ?=a9F0I%C7XV^7%CF(%I6PFeFK znZkvotI@h<+T)p2bE5>V=x+~QS`)w3lpObTpvsW>v#*s$!^&GZ=_D8qg}d!j1uag_ zGvbW~QXxAk$R2Sl2$UmnYaZEOPobe&SC4Bg7=M`EnGd;!k&~))jfnJhz)+Y12JRTL zsAVIitlD+xCFS%IV?xAw(L%g2IJ>`64RHD3A%YnFcy z-ffv6$)sLnsI^_eSo7JeMP!}DRtR@S_dI^2O#$~bs^EruKoc<@>sa!J z?og%2?~RSc9<}gch)U1RQj?qPLaj?Wc)wl{Ox%}Z`F2i3Cjm*QtIgZSGAuOJizDGnW z8J1TzYY~BoxOVMHgTa~z%X9%rIZdy}%QTHQhph|{%|`?_sk{b2cHorWxFQFM-$_l^ z90b}srBx=b-iY7LE^VANpYi78RI`H7-1NT~$_KcJ8~bWm&{y!Wbs@~O021j2yxbIZ zTI@A^JAGtUyszab$pKE4{8qPD5KST3k7G{q-Kv!xR5^?v^dG~04kT$#K5r_)g)0V`%WUPZ%b)$rxeHQ8v3}{=_&$`6BcSL z)fUS2y_7$F`-lvI%=*aEZD=@cU!aZg_qZl4oHZ(Ko$D8jw&Z(T4vQ$HSuZTgDw z*)qQ5>*(~fW*WSCRkpwLzT`}LTf@~)R$vsO$UW-2%2&Dl9EF_! zL_!GcF4cBV`SG^XebTpj&W2agfU07VX-& zF^U4-h%T})md6(brp+3V)Z!hX((uL2H#=k}GBEV;dADbdH6RVyu~l(B6iQ;NZ zSuVxayX5zb`}pZ!t~w+t1~X^k7#(Q;q_P!Z%{><5z7-n3PXA=wBg?6iy&*di7ElC^ zt+EF_+($$+;7nw{LvR;=7ju&bvPtB2Z-!{l1YP>wYcCk=lfwSHN~PiTNVV-si#o3w zQGeLNZnI}35B6d{(8F3b_;oOuC%S@s3NHqb5t(RSly;y$fg!yv>zajY)U_i8Dn(mb#aJvx;JM%yM=E~KUz^?1hLwFW|c_0TrogmO= zKw^RoHx`LKxW_P<#ehq*MfjCqStx3^D_)vo$~t@ROmFRqH{X@4kQ4mfI)i`yr!g@f zUNW{B`imq4D!?$e^-|mm5&$;Pp{wi-Ylh9@URmDdf(WmyfgDFXLPq$<^WMl?;zf41 zqLqajqKP-nu6h~ZD|NYWd{E4f^>RQVa=!dPnu`;AK$5YWgd}c6Dgv&+uBc(APwfT< zB(`gz^Xoc7?=~r!e=&Yk|-t{k+w`}1Z%7}3Jf!Z z9VgwWc%qMn(~Q47=3-~9t>Hfzn&)7zMaM2kE(zSjc^sh!4QE4vV;;R(YQ+E+e|{dN zJ?zs~5>0Ye1$S20p_1_hX-N2g)HT|wsopWyg$Q!Rl`T7=KZ`SEv6T(rFFO6 z&4TKhDo9K!?efGn2&@hb<%9rt=g-Zow$QF15{tb5cLLo6p{$o08^0dBCD{4j@2HlHfuB} z+4zSG03T?zE{5NxYT&2OMk0m=BxG~EaH*3eSR$Hyo5qX#wlDn_7-JeRS)$*T+s z!LkH%K#*6Ya6G?Tp<87&9FPB#u9&;Kmg6yzxAnA(Yy*pQc?Qf3D%;&0enn6SB**$G zh!ki=2TRJkfidgcAq(GqO{bW<9Stl=cG@2!p5yg?!i;JeQ%~b{qckuRA9HpKElG4C zCiQte&h4ihB}OJDe-)Jno@RQyx+=cU0AEjK6_Z$!6{eha9c=HaL!!3-3b0ykTq?%B ziyw_F{>Wp^pJdWmb_%Q>l>5s4Exrc*TZs_6fVt3K0`7N6nc#!P zT8K%H;SSM!ycM)VEwiLDKo=brd;KaYKc+HGL|MJ-u{uRcgm3BZ({+%Xwy53T-A zGj{oD6$vxwMHg;y6S6q*T1xlp5UMm*m&2tOib%en@HK-C%cRdQkF(GwwHjUWr3$BPJk-FVl!!dq&TrC58 zupw8npe{ZDJ%FmNqvzJUu|Fy)y68c)m}ep6OCL~dxkDUWXOCYyY&o*vPK@1VRLk4W zT_1O%O_IUtp4Cb)xZQ@xkeLb3#m2Q;xcy2Y^I3C`;g%@4$K8GzSs5Ve+P?RUVq@85 zCH|wEKo4LPaaUrDNx(qWUSdN(#aVU=P`&*bi2p%t5zLzN&@tqizg%Z02Q;(oNv6U` zGQ&GLohsniiB%AgzrRes$MD2u)x_5#g))ucfGv@Ero}YC#Ubc24Tbm?E8fruz~jX3 z6r;Cu7r}Tl_T5yA-%j+k=sVeIVw=@?d)az zP*Kgrh|^ZNV)*sYqfbTR&N{M;m=Tg7dpy}t>Ytv+$!OgCgklXWZCrw!PY3y|X zWNGiZuqao(Ud3bQ&fx2pJWAN=ggeRhaqwx{v6BMob?I~{J+VVLq5(-#7MF`#MObMw zjvHJQzdpqj9g9Iq0hz9K2fEDE_*$-dbvZZitjy6U8Yo;HAdzJ+W5Q#M__dlX+gfQtc`*ctQC?A9dSm)v#!#K#6V=mYh>`h1+ec zg4K_Xht>~*T?MTd=I}@ZJ@bB;ChpgJ?qn{2lfkhs=dwQT%bK#huq`QNZ59$fOA~^4 zuJOSs(2QX8&B!1aqT1fc>me;#V$6<&&KIf_iHc>-l_b|fBzhe%D_;cl(yS4-|MY*|nSj^b_;@a%ixw|!53&Vz^S!tG{cClH7Ah6S zZC(cg$^_OI{`3lC63qFxq2NNiQEEoRR58V&rHp|8zzvordYbgS%rmTmx zW?6&wNyJj(pjaIbGABKYIz5lCv+l%{E=aDWf}xUH6M7ep*6Z{;8}bz-3bqW|%A-%z znT|juTDr2qZ;_>r>A2?=PK!HK!RWyx2qKa%yNW{WM6^YdIumSLZ@GJ(J(=r3YPU}Y zMcAn#Hx% z%?xN514l4CSjl*1n)N%^wyBr}J>ljLs~xUYM5Js?5KvQUXo1tkem#1GdVW>+bK!9E zRo5R@%Exw~?o@#Ev+|>?7rPW_@ECCAXCfX;4emFDjV2N)oNf}S$najbUKOdBXjEN1 z{-|9~5pev1sPxE@DGK#1qrl&hnXVcfckD?L{bwhiApQV@thKDFx*AdSAMs)ARR(Er z7n=CAum`M*gfP3(+|IUMm#sC^3Y0a2xE5%?->mNz3#>nnLl$*K!N9ZH9^vWWd!gvZ zb9^w@Le(^hZbTU$i>OM(WBv9>@T#WAKpt6!P9ZG@-7LA^D+bQYlo=4XT0vlX4;I8?yjy8;~ z&Qf&Y@@}uQ1ezeMmPAHF8q4#g6%s=oRpDJpHy58)^1%TMX|8HooGanhjb~eS-y%gHito4?$43;@5f%8?X}+4`h51X6j3*_VUAXp97z>>$Xc zE{#2sa!T907WmEeAXJ3)qwd39<{cr^9pyTk#hsJ6eA!Y8B+(S2`|PY0ee1;~Tg%%H z$=`R!B!8h*c|{-m*()s`)f|!vM5}kUkEy{UEZvt3VoWH+8aIrxr%=Z#aXM&dYomuj z(WIxfrGX`(Ptf|fC>QeUig10QT2J1lJDK``P>SgJQ3c%PQO3%$-UpZziEYe z+&S~CD?Wsah)7&8@3>A){{=%+MuW1NzUR0P{LnVy8?OwXbEHL^l@_eEXFxt=3*wWj z)z@U0UgAR!-3!rh?8Y#vDnv}~x%WK|P5t(*46&oDZRrKnP5SnkWK?K4O@d9)p>`5e z`ly6MyjxwMa&2z#m0F8iB*ojM9)w^7j|r<|;d;=%DE z{`}bqxCqBq6oK@WC(LNHaJs0gk!^p_HoU2<)_@X_27^xeOM&sF-ZBHQP~MEr!8mO8Vb}Oe?ql?hr4FdDP0pKXs&XL)w0XfOVhX9Y0fV z{YUX$APgW<4fb@H@OvR%PSwOA|$wr1tjJTlG{} zLP zyfh%64p&JVA^&Qk=Y#DMak{ytPqF>$KX- zJ`xaz&Q~fsMfI86P}n1whFXOz#9jKsCzjshQ_L(sW3Ob|xAVKbZ0fEv<*60Sq;_A- z$k=zH_xgLs_AP9(I-gFLKEnR*m`2Pi2%eIlRT=BkGdA(7A?-mC8ZX|0BvUmUv~V|BKS=&nf7|E8OYwmw zSJKfb+~VMa0G9JS$xAYen=eWy{Nwy1msn@=OMPLt4miZ=JSnB|iA0q8vnj7^w5ofw z8U062Cy@T+zWCsmFY!wADpFb>rTzwcv?0)9>e*>zi=+gfE$Akb?0}kH%J+Tx@k6m2 z_x(Qknj8jCXaMhty}G(X%Kp&;2ER`>A{!}yxjO7B%)b8FVtGE2Emg7bBjLC0c_Dk0 z2`Zqfmywm826k`B)Tw*(&=*{LxOuEZ&j)UYHiK0HzIAHhDWvd{iXf*cWnk0*_ahqO=$cCM zW3!tSD_&5<6nLj$TkpNS4D-eV{gA+32hOQ%ZN5>He&SDt@MbggW*n|Gj=^f;%uF=u z6UOa?!$5Q;av*u|_wHn-{>01fCRE%)0(OZdr%X|b9_$P0Z?QVTif*0-9?I5wDj?=7 z^##>%JP=MM;iX&WYO@ElM(((<6#M!u#5V%_jF*woAd})Jx+L>e{+p8zS+`~-R^_s{ z-;NO1^CcXfB;zZ%N$+4~=5(>|kFdSO7ghJ;J9rQDX}|#pBu)5{VxNUK7#DcAg*hN_ zbm=tJWy0^aal0z1&E-qBqm8I5P5CyT2l=t*+5rLU-pIfKVz1naSM1c6_b7n%>jt-~ zCQ2I6s`P6uw=nmx%KDVQ@gb!M=cDScn(tgzv96=emJcdi>=RsvwfegFZYtzAtGM5^*Yn7#TGh3?9)Xf(Kd%Cd?zlLlypbt{g zJKpH%-UN_wtDMEPKI`)03cy2KOfT)<+sy?Dts;Kfe&M@4FB6a_N4E&aBz-CptkD$z zLV>_QU0?Ub1V4Soo-e?nyz1vWe2<^v*;3~rao4@CwL|ah;;~R2l5jdyTEcF>P(e?G7sRm^e0;vZ87y!;>TXy z4pFVJl@*A7ImO>R8JT@4;%I)8%DVWaF}e&@e&}`5)WJr0MF57=mNFT~;k!qc1Aa?> zAe+tC1hwa%>>(#bTWnV`^&h$-tya2D#WlPq?444oNP-2s6NV|(YDx=r+MntdRHuX7 zfVVc|0w9IA;)3<*)}!0%39WcT94%OgwJ~r6Spyc$=O&)5dtRc?rtmrE#y=2jI*^=y zx>M}kpSMB+5|hRUJIrZqFhxdepNt9qL1;xFyAJ9TJx`GP-9h35-&L(2U9ZaSq<&s` z%RmPrGahBc&0&^5DJ`TuC4ad(9-m%eX2OI$+kLhc+^f85tQ5z9dl(?p<%bs)ErQJ$ zIVGBGMMph?38ryv{cbKE&VZ>kl~AUhw6*i5NmiM**U{h_#{hSc0RstEk(?~mX`F0; z>`^6Pk{ZrU(PMXU^Dmc?7I_t4gb0|NWPGQwt$BZ5coD*lUa9xC)k%XCl^re`?I=w| zpWeTVa>bQagSd}UYTSgK`@CWtwAO&1zJS|RY3tSmpY8oQ5s)2Xs1%F|xj;Q4yo&D) ze+8hkW6QJ9?S&R-no@Yaq&=tNV2KQH(e)CL+ecfFO8XS?tdgW!CtR9cV*1XZwY=3; zb?%F-JOFoHBV6fF5L%A+q}y$oqv9ti4y6hxN|UHJ$YZ#L57L5Xl@vw2P&&f1z;LCJ zZg|Xmr8b?pONk4!&2vDK(M;WN47Nb}o>=G0v<`R1vxwRlN~tPqSmRp8<;Z*RpL=jF z5#0R&_p-#)?JqE-845hJeR58~Q=8%BN3%@F+`>hQnig)!c#2$`pWZP#_Aex9*$o9a zvLCjjNe&Ry=cnN*6bWK{oO5@A!S@_@&v%feBBY#lrwY)=)w8kQd2C0Lm@h9lxyvp! z1#3BJu!no!U78|7T8P8Ualyzg9vA!4_v=14Q846b-Z!x9lmb8=TTqJfk=A7Bfoecf zEMi#sJ5*PY)27F8q&^SMlh}a@4EWLb&~$MvJ5j;R5>G`wZV~3PLAy|Q!bRq?Bm| zRUQ$|Os7-VN@datj0Z>#Pt^|F&+N`3j@Y@dIBfbSx|1h$UB~E$l=LPRsFc< z<{nGz+d3Z@95mn7rm`%^GFt454AarQnezoptw|)Z8}0))k0`(QWf6~->dV}8fJZJA zvQuTc8ycWBanQJolPM?`!Y4S&t&qSb2(4&F{;sG>HhFWOd9nNHcSqMt-z^y6j%$0Z z@pp;&SR1AM^9C9i7vYs{cO1XKT%kYROv~-HVG*X^42+*A2G$^7#1fo10W0X>QsOOs zrSDu^pWE_Bn%$i)nuIl^rh7xLSMp%q#Jq9!O*4N~?IKRtZqv7s*^<6??tjv6Rtr2( zfC@^0e$}$|2+@VwLIiWlCku53GG~hCt0oHLnI?&Bn+P(ezrq;Fb~sF_1ZKPtD<#_o z>^`D{Oh(gK%BphACvzjrgFw`W3(b5b(RBg%5-U}orweaEIt8xDUH zsUfnA{>{&ag7B22s0Ff3!+AL+r;OL^8an$y@~d*F~{%rrZAxk#{pF=o=|$t;jWaX;~_WQt%@)F^G`M?g=hinnOr(Ip=vDOTuQ&9* zM_IDfUcZVei@6=#&s+RjkANPdb>P9{Alb?Pi$AnPx0}$!rYdJdsEyEK9Cg8OR)0-nX5hTjB6^ zCVx5a5_O$+eelu`H2zm6<-7F5)IvW0&a))J$ZE%)h7Fs9t*Vyq(Vzt+|4sJ`^Y>YnBDyZzR=&Ft1=zd+^YfSbnu6G(CHuvwUJ)`}>x^&7bQd$6HI+Ix-v0fMT9ew080Xna=WzbX);+`t z+Y*z7;KtU!|L|WQ#vY7W&E=y7&)@fm-=X23BcEgrBR00oji|e}{7V{RxClLIH0skF zkmBH(!?uG_gwcS1&I^bE=V8`Nd2BQDr&tys#KFE7&=hwZpuE6{Z5{L*f%P!Swn1t= zw30;WMe9GO0vpA#X;%$i#}F2z!iHr;=k5;?1?frczSv2X#MNgERwLnSa_(p`+m>!pNn|-{M`;AO>@lM%~r=f zW#0QwckjQ(gpsB`5Zu;$L!=MWaV- zIFH|)9@hS2d;ZWW!?voL0d@qf-+bU+{O{8>c_4@8aN1b5{l|{|k>SJXS9)mjbNp@v z`tRcpDL<&mZeQd7Si)HDgPQEL&0GEV@skQ*&xfa?U0VNR1pdVkF85H$n)I!j|L`-hXq`{!@#Sgpx5~ZXoxuY1MxpUoRK-oJ&a(eET1==6@{zr7t%P45KTD zG-C4K$8UQJdv2K<*>wFU68S&#w3dMdCdn^ShX2R-UtrH?-jcXM|A&AU;$Q;iCgDx~ zALIZ33h@6~0e++vko?j=y(=vIBF75R?diRNEV{J!&hFV26%|wC>|R$K{1V;G|FUtu zd2}!%lxMny`5^MKCkTYyMLm1mKRQrfVJHs%xd!|;58s+m=0uB{dq-y;^r#IBnH;Rl zACo3ARFL2y!r}dg(fM!XVT=CAUk#+R;xT@(o(JOOVY-)dz!@G*%h6&9%9ejAlkWu$ zY$6vVd|H3?VJT66ZmuR}dn@Nk$dfBM#1N*Tl)^ajZ$o4)@}QN^;)WkgqOY!mo}V^X zX~X+QLKik&bo&9jDURoVYRP|2qvk_hPZb|=@h|Jc=HI4ne{+ThKNJ5qMe?tM*JJ=6 znE?q!Y8(D*rD2rEuIa^i(-xL9ixhYq0{>z2{@~Un z$8Ej+7Jve~-J+sJ%KZvXT<;Jn^C35u&Jlm_*{=_5VXy%c#TO3#aul+3ZMb~40MDJd zWNzMhURNR`CGD1fu)D*)qd*P|s8BxM%sp7hh1j;(Ze~FI*FomZ<%P~|>V~OZOLEPU z7LBysv%pNH=He&4KA?A+!_O?OnmMZzRD>_%H&3>hB#m4>OM4RjzK{Hx3rFflL$l#? zg70^*y@0{{DT>MClm#-jel!3WmECU&w&5fhO1m-u_cU?kR90WIV|w|s`eM@*-X9p% z7Ol+~xutoweo<_g-QccNrLdNJZwVt1iZwd>lL7v%j=pbTo@-j;=g`9fa&h3Y^K%J9 zx{4*f6sGZ{$G;wU42jEAFcNEnXr>hAJ^_duS94DXrkl;P4ZqtNQr}Xl56W07UH0R^ zQ`&FCuDYE7);0ah*uO=B+4$T}`UbRzRgJ|7;VOp)WmNs>jjdgpRw0m9QsiCvqU^xn zl)Qh-DL-Xlp%t5~uLrsFCvxX4K%DlAO%o&}l1nAgi52j<`ILEZ4B9m_(Q+$8&^GGd z2>ptxP!cG>iGfdM8}x^p;Ew}SA3G&}SfsDH2)Qit`UWN-MCQbJ>6Y&NHL8YD7EoaQ zB7eK5?_Dml$>tvCp+pX3z z1g!c6)pSa6Y2D_8ZdQwlfaeqkVh_}wO=)tZOPt*CkCRn!{Z8~tguj2j{Dcy&l|H2R z;;`XiZ-$8B<)&hHOFV(W+}+bu3A%80!I7tbHT=wg|dBbuoE$LtG0?~r@TzBJdJ^iRzlRhC0FSH);(bjo6A zWMo8SF6R|JKW6N>WR|(rM#fXAzTKHTr5IJy#7NJ$)-4RRxDo1R5sz8N{zmdbPr1>y(OC%Sh)B^4cWEFjF+KiB-DUlT1 z6d!o_EVsR#Z>K$#kHN_$@36kv{G!Rt{IDaSKrKBD@$7wXu|@!|1c#@LemQ4Gz7|>~ zP6IncxhxwP=rO9S(fst^@23!IeBk`Hp)&D!h!gZM;bYASH6Hf^HKsi;2~_OC8d&y@ zI0MSje0xG0tDi=(6$+hpD(NX9MXa-*Jq!jQAF_vEh^3=@D;ug#_23M$a9KKO_eisv z71-c>c}is8Jl%5a|IBb_{8);Rpegw-X zk&;jhj87=jO2jSEi8W!-{c17{yMD9y^IrM{@TpGWThF+^<5oJay=&rS+Aq?=Q`wZ1 zBb_0;{OkPx_BSv+fq#hX^y8Lcg-TxnNpedX$0lA$!hV;%S12NwS_o9=S5zpxh6^Tn z2ToBEq&f1|d9phEPR=@vL37I9yERi){$_Dx8(W1@L?cv82ZAwTxrW)24Pg%WBJWC> zPE0x$#EsT1p2~>^Po=l}*&I_fDqn%}$8A znMW*<$v|s1Upl$u93q}gHqi`DPCO@?7$7OjndYm_t09`n17D(svIOg!DtajL@cgI( zu^YUd>ty%&fd_P2e><)6rE+}w+4Nb;=%4EAFB6#51B)W%*4v$CVaqpRh2xAV_Q0M% zR_mkANbBpC@f-LdMM&hGM9S})MEXKdsuLRczPC?`kfb49g4)7Kc8YK(m1Q`W$w|6y z=QGdyTF|7^=y>yM2Wsbd_N;-gVYq`=(BeNx;WZBV3SNS?! zH6w>qQu{|Ub-d#OLLUpB4R^fq4iv>%OWUt^II(|o(uub7 zQ%yIoO49o+H1LSQMzywKB#$Fv032jWDpj{Dm#CJa;PRvtu@=!id97HEe<6lmUeQTI z5Glmv+$~PvOrLmayVM@lP~j+LiUL%q{AF;>PWA3vq?LP%u5xU6b{C(1kYWSD{gtjo(Y9Gf@3gorvZ7n)<<-hpTiKHW4wDO3r?;}RVHI;(}OHQy-p z1f7?EK{!byE_&{juq_2z=2wK8@kY@dU(m^Noh!w19Unf>fIn2S#%y|^+TgZ<(_T1r%9pCT$v7U`k@Yy6tq-VejCjtm(-dkg=W0WF)ilSz!U=Cn&5E|~<`|N^ zb2VSJ^Tv=|vB+g+zuNV7q1x#7ij&X4ZaC6gl!JLgl60k^f3s6&Q{Y#+;*WPF5Q1&s zGkhZ#Sn@>g33{K1Ja_^sMLAt^ZT@4o#_{@Rf#c>x4yWg(3}I}Yz1HHM zjr1I0y%W=NtA|>5&jhiXafI~HR~9(aw`AA7iI5 z3vJ5F-v;xmD`l6n$`>`fTY7g>Hs{B1RIJZV_;bg#!SSjZp;gN~1CXy;qM6EVwUV~Q zV4_;8V|v+=Db%3l*&R4Vw?Gn&w>Tf4bv-MUQ%4 zVO&F8!$@<>u;49;0-l>QE ziQH7a$z13~9$1b@DG#JWc{iL`VhBCTBdRThr7-a(JNNKvR8C?*WG}J^kp;J)kFaMPLLcrq5XGov6mxy)Cq zw0$d#<4LWMU%{D;=ELq^mqkU1tA=JXXoynAXpKVLoLl0oRu=f3gMQp}W3{t-bvV^r z+{b4(+BMewX<4R-AfxwtB(SDp@~#_t>=uN>-yeEBzgW(Nc z3ou`upb4E^HED0h2n&cXSMO?x2J5RPuPpjz&f&TtS#w#)s9A3<~>vv<*hkM zw0v9*=$;15=IE=T7ok0;r*IcPn`CbC8WW8ajPZS2pghxjt!BSk8lXoSbM=WUPdu zddplB>0!fQ#IA&SxvnqhPa~kxx7>dc-M=DJpVi=eSqi8r1&+{t$TA_6tsZNnwq_u3 zzaLlfIJq9(?7cH7~OMy7tYiv!!Y_(U;3E!p+=AzD}{ ziWRP;6$KaTK(qKYSu+jjoV`NrA`IvHH~{a0X8#~;=f{qc2f$_lf+kQdOXg)(yHQZn zT*We4>v^b+owB$Cg>h3nS54S@^7qEU_ApuOk+5YfnAXGh5dtff|x(6O8n!PKY*8O*=d-J@2RSFw>@k(b?$;+ZrOw6Srmcix7(eq*IJD90H9f2PxGjFo;{(9aNXAOQb0;6xJkbj+-lqS)ZD86GnH^J4N*G72yR(bftoVx zjT2ykf@1u-!h#G4$bCkov^>b?HnDQM`NPE8%yXJgtv)LgMNdntWc2JI?>eSkUshwC zL@Uf%fpQUw5}JxIhvV^%!ko%1o~N43wKz>44xH`%SUh5OJLyUzBVl@dFYA#Ft+}2j zvu>QNN)sqRDDl%XkN51^9hz=5uw(tBcMmE!#|w|FNd%RdM@Jz45RFo2gz4#)ZE4h5 zA&(9KiEj2^3F`+c+-F$9|HI0{*F`nLfg-ajPd$aZv(}EEX{Q1@F^LK3ALlG^ z9Q@NdVx>?6OX@wy{mpTnrYG5Bd7lE5G5YF1{56~y_xIv-I zv-;}IzyRs9vKV>nH=!-m`KDFL9ibBrMTLZiC`&|`$$+@ymJ7qm`5Y?25*Rlwlby|g zBzOF0u2Z9{6)#(lm3uv<%}$G4%qNXnGfN9k{j?b~%8CsGXmo~Rgf=ZX<2moXp4u(X z@VRdS9eUU1XG5ZN@5X^Q+a!%l`bUN8+1|Sur?KKu#o8NTu=|6l3%<9m?-~jAzs@u^ z>`X_vr&__Zbq)bO?6gb6gE0zX=Y6#B+46N7kL5lcgkkD9$miOHZz?2kC*<^v98HhZ z5wCnB$my~{$L+X{lyUy@K*8IbKhDznMkg$8oQNLhBpWycTl%i+Y97waaNC=+y7QI+ zgfAS|bQ`?p8=&ASrU6B#_4ex-6<+XAqjW51M=q`yVLG7ro9ywELA4^Y*GketnAzI? zr$dLA&&C(~)1hl6SJ+V=FvhLHw?NgAb_Hrq=z>M=ZuC*&AsuE}&uARNT@~AYzpanu zD78?;buXyIOS|#j8@<5U7F-QN)ysL;Ri09|X^n})Z&cxOpQaO^UqiK8STKog?Z})~ zb`EYS&wI*$J~pU)k&W4Q)2*tAfc$kvycWRBuG_hIw!8)P6#b9+6w<3gCO5O5xi;cK z|JW9Y!7G~({Jy7gNbTLgVaa-5NI`%ekX1Is@^9Z{Xje0-TZcJA(-~FuM z+->WXY~#fa-Ree5Af18kn8*@Qfy6xZqtc zv*LFnTG1OZv4h@DI=ZX3x8AUJ1gN8o6XmzALJ&fFAOhW}2G>N$rxOmv7B;+Z6Y_(B zBxptZ>W#}arS=Y7+8a-aAY953LOMTMguMjCY7CtG{85YhUx@6hY#7^`k0Erkrwf+L}OamovQkFyn3v*0vPCx&Nk_TpJbgZli^j59_V!wX z`7l)iW^*6>*I%wohy*5t=~WheD%kIQ9ne28P)c!PGUlFsC2W3wSX|ax(|ic~6%D=Kiju*t~-h9ZKMm#-(%!D|P)hnp>IrA5QMy_xSl-Pda)!eF4q1 zGqdh;n=ocWb6>SmZN+A$@xwM?v#SjoDSyT60(9g1J32am;jxKHvgbgQhR?!1{+S`uJDUg3G!pW`-A?Z`E3> zp?9ZBjSNvm-;HUbOEjNiNIM|Suy*x_6?v_H1vDNm$_;y+pDOY)*nN99gty{psjxv% z%LKb*9K>X|CJZq?8-m*z=`OZs2-DoWaPx{!;yTKC@>>oMBJqXLef(B)cZ7^e0TWM3 zn9%3f)LWU6cG2wTS_4YpWBj_`o1x zd-5rK!l-gE_2HN7hA_4W>&?LT_mN$Ni`Ul|GAOIibbi&~rHnu+S|T}`_suUXNg0Yi zp|}Q(?8=eF{0h=eig8gz#$fg* zf;N1$C{-I!f!vba=}9ikO65_%sF8#sG!~$D_eUgyvbKTV_kE<6hh!~R3oockb6AD? z*9U0QWHASUeU=tSV4X#!q!s=HA1Ii_5(fw<+3ibKfd=OUV0YktDmTR?MM)2QU-;Ih8=ITilDbwb}4xh2cXpV=5uK?s&2_^Zl!l!y1neJv{X*LbJLZxmzPM|*3EZr)>U zqUy;e-M2d_u1_OoMGdBxcTsCaU-d7R_2Kh|HXfN9Vwl|H-J}#j)-E z0{D7359A?9`Q>P_o7q|zE(XphWsza~RbqqJTUtd~=?xdhLIXAU)G#+zVvBWdRo0Tk z(@H+qi>0emn=_*`R=>*>#MGA_0%U%wC#~xL40iB7KJuGEbnUmofca!Ac;UHYbYZo( z)c*dSN&{|AltmcH zrm1@hG@R_rB7a8G;%Y1@iP`QbVjz0KNn-}Vwy&eodc%qkFnJT&y-bT2k6oH1HP)X7 zsH)h091ERL?mxI**tT?2cusxpS@yEe6!RF!?_)LGUQy$jwlf#!#<=elM@+x;N{O|E z#p7xi?@d63F;<9$w>5(!`#2rmw_MDWY69aC7Z?O--|Lj@-Z)))$bPgKPqQ_nrc}yv z!TX-S@qSN%#^`pT)aR$~!BR8TID-Ph5rAV9np3iI8e6;3?bX^OWr>=p%9v47UldD0 z^VunWUDig|_gW}(etdHKLep=?sd<#;4K8Zo3kx{y4%U*n{ zuB$32+PO=r6!%kMiO$q)MWP`(kLRbN$>TXUPjWuD9>x!XSbXVIo~rxr#OoF$kCVz3 z!|ZZ`y=y=JV2`^1|5EKO-E$9$uC`<@W-m2PBKpFF6GS%3A<4Rv#!;WZ@z) zF9M&o0t5)>UG5<@8ca1rPtl&$H!fJq@*}*nV0>ZTknCay^V^ zYzGcY{hLb;bWogSo(Yo9g~-Pclal(EcWRBEVUa5ZsE&l4enJeZk;EB|*jx=4aPbVv zSSQw{_7_B=4*bWBv-mkII<0ZT!H0(#Dss9Hq!gKyfe4o(EbX$gYAF1qU>-#<1KM7) zyacymy5OXhi^!{USv4GIy79dF`1F+RX5rxRq;hZVZ*?bH3Ic~Pmc3wYg*;MlHP|?y zkBcusYAj~uofP`f>#{&rvmK83Z=0{1ml6!!2%B#X`A~FX(y3W5QSGw90zL3-D)cTFrrl)vj*R<<6TU* z-X!y1maQ-n+^FqZEI6e~{A_0vtY~b#tI@gLFl@{=x(pHHbE!Rz#piFD=zPMTGG?8E z5ns)C3FDXP}%K>z=db(LXJtzBC^7=VPN zf`BMJq)MlR0z=0DLrHgc3xWtpH%Lo&H%N(ecgKJ<44w1s;eF3};e7wN=3@3ddp&F2 z>t6R-&)%9YvAcF$QL4kvB){kcTOVBeO!dypHBaUPs!*&H&10|8 zEXRca;g41Vv;eAu0>T^yFz!F9xR zbw#CiZT3L*wIilmbGaeCIk}BL7539EPfcU2@syDQtmC})_p<;p_%9Yz<2S|rgr~pi z;U?Ld+Wn|>+Hi#T@^rESmW}U!EcOVfqpt-9>dsg@_=)VJP}3tuAMB1VM+tPomM>oU zPDa-|$5J;E>JXOjP%A5;ZmYs|O`MyZ@aOz@Xy@dvNQ6cA#GyTwlM7K&+Q7pv!!QoI z{f=Tez!TP~L&R8-9;P|EC!U4Pm~I6$`q@N|y|_s|WBYt)|0Ae(P}l+i{LiSDJ^BmK zTo^sGzSbG}!nNZtAHuuiI(3ZcN$3crc|sjEz&}2)nx)pMBtFszgUIk(?~o=JDhQCG!GRo&t9)CqLz#aL9mIw(pieHqPUw#ivPyr7|j z(KBNI4yy;N;IBM{@RX(2}Z4uxqMAuY1o_Rtv&B*EZTry7=IDo zsU}oxNIzj%y!t-3u1>MI)^X|r6kXHWm@VNgSUj6Dsqxg)4t?Cmq+nN%^Rgk}adZrSDdQxe(M7%sYm)%TB>kF3qVfM_$$*YaoMg~=i*VW0? zp>&ZPwk96Z)VO>lN{A2Y>ozHdKl(+6j6&qysNgSctZ4C`vCG~&!%b*CS)2g$uQQ*+ zh(5YQ`GodflauI#;lh2@_UsC0PW&pxL!kySaPR8Xi2~}j=u8N`)ay)@ z`7jbMYFV&Fa|<4&arLU|y4d=0t700j?vQl;!SapR+&JV*d!JWKk6qGHlF8M4q|5_91p=%vGcecYsh8rbc;V5=sct zGFE53Le&)`-h0rKzsmDLX~jz=yQ)2c5Fte=7a7pUxrPPPvJG)zj^t8>A56l-FDVw^ zMkK4(1g%&;S=n3^>=FI^p{KxX?MGWYm)Y)mdt=ej7BRU|Jv!7cSD$p!@igpkd#<$W zcstADgZ5mLDcp}bMhUgL@Vk0d?Bw!ts|L7#k~_pe0U@&x0H@mL74MIG4m=KDcfVsc z0Q+ow%tlcAl0Gs^uOeOk1y;cpjfCYKRcTS*3rW~MVJ*6L>WbuY0?ZuhNBx5kOS)$6 z(X6oz+ACB;YWKyIx)ys%On)egk|RiDraHO}JlE$MH1U_hKNTiW*%aMH!7gK)r!2V- z*y=A-yvfd~ZThbijC}a%**WOSj81POl&5XpIPnr3FQS48f?Hviqit!iri-aT=IZqO zMZek>mkeIU2GBAVbhsJiuu|h_XP_m4qQBIIO~S>Eo&Kb5_DCM7^fKc5sW4JVE>D!F z;o@+!TPSa=u)@mMX(L`&Cd)2g7}F>zgEi#1#|nK>j`VHbfh_&O9ciGs9K+uQ>XZhE z`6i*MNM=Cws5MIr=r;QHcC^0u!inFECG;zM2**lwJr{Q^xz&XtrK5#&*g1ZxTtka? z()N>84JZ!LB}xkDZB?vZ3o4WWF&OZ)@ZRyD7V9Uk^@ zbj9M|9ClSQtW3s3sGnk`oK~x1g6d z)RNcGQHn&Y?UTzHQ$1h}gIHr70{dn7~HiP*$gHz(^ z**=Z~yM>hlhlj-qDHLrKo9bvnt$zs{w#74%@>6NOC9WjCN|XJnU(?P>TofnC-10zh@*RCdp18i z+mImoe9eh3Bc!(T^N1Rn|2M zIf$FDN1XOTj?6tdJ?z8$nIBHT1BB;OOaD=L7JZoJNVT-ya>Trf&W##sEJ-rBoYY+M8s% z$`A+|#z|s>M!+1uu(L#8GE(?FaO>Fk%^S%x;G8=YE;Fp?_)&94-lttMziK`fghc`pVoPy#?;=`yGO6S*Zf{gjp`DE z4;y!wF}fldsMpYAWEM-(wac{H}1} z!l-|0JQ;sP65y+usOa@#d^+kyRXX-B@afrtXYzZaBzJ~&_dw2;3zC!i<8!ePobe0Z zi2Dp=i_&Kfq@8P{Fv>p7sAK1VH$78}pBC4no4>f0b%pG?MgH>63H}PAKeEEQ3AJZ9 z0Mzc(wpb(K*XEwAgjIEG3#MI|ma3NTj2WeBbad3|n%BCxZ#x@Lgv02pNjy+Sx2UqG zPtouc#~6{8tXP8?^_|QZ{Y0M=(E{mOYTD&YjruO%$YrrKLyFjvi}-HAwER@3ik%p# z_`CjC)n~?x3{H$W%2aS7Vjo;=%1*~xf`E-vF&}){_Ix_;#6i4MgJUyH|=N zoS4n3qylTNHI{xP@oTz1)asTtQ;40|Nt7$)97*}Hzb{u1J&JzR{h#Yq~U6Xu30i>#}z^#ukzZfh8oy&WsGS@0-A! zp?tpQBTfv?u5Ek!CbQg)nK$V79nUjd*G1(_StpF&y=Jw7Nu0^()9{Yl990yRm6 zy~EbZ`OcIHs&pZ#8&kRgHcmfNfS4SZ*8Wl?LILKH5?7U zkE;+k0jk(V zS3)}8fx6ZA`#7r_d!pG!>22xmIXA&FiyEkmog3Kmz5sMXhH}0}G)2A2acI|j7wvq? zeWw7aSoZ)L`%w6pINHuq2E5-{ukdP#fAbAtBSi$y#R0B~$8-gNhB)O!KH7N81k(2k zhp?%cG^bL8i!2ap9#cw)qeASF;ObS40yR3lejaV_g=oups{T){Inv0`|(Bni+L*1jy0I|0t z{s7S$w#R%zn4rrgTbw3;*J7@`w(%^T_vAo+Dl}%Lx=v8giQiL(R7bLJ&CY0Sl8bj& zAd}Jg*+xX$)j%jo(3jCM!=Bf;LsI*_XjoAVzi?V#V-eEVC8&7^$c1)60@`?g)@fGn zD;=z)xdr{S-qV_Knd`)1&Be!JWK%R9MzS!68KA99)A&Ug2qDqoH?(!*X7`?~OMgR)t)STChgte=p=qdl-#b z%$1lWxc}*BclaQ`;jv#|4=KoR_qdooYB=ru<=l|HD}uGP&-w-xG6NdhJo|jSHQP=$ zkq-z&Q7#7A6br2)upPOoh0#Fb3b*qLJ?RE4!RX^!!=*$OdwS0Zf-pagt)_bG+66`I!NfF_Q=E-B&>W0sY<2 zwlKBj7+TuVkXgLEvY?>*PLDWz(MMZZ&a~#5+n4Ri%C$6p81a7k2ofN!%S-48Og-%H`4kd#BGInJoQ?3W`s%caVyE>1M{eEKvvw1H@ z=kb!5)+0u^eyywih4JYh{g;^VpPd!XaMP*c8Iv(vFI{#6dHQ8w{#G0IpxTi@xF9Ag+okf{kIOURM<-Zkxu|l7=bks;Qwq;*(wr zuUXBfuJ{sY)k=azho*yMVxkk;qjrLj8bPW#&b7;&+(O$3O zRJDUHp5lDIwsP$wfc!zj`waf-j$;&DfBpU2;3}jJXH}$MM_6=_m|mV zcEDeK#FXzq%RzD)OoZhnt*}_w>p@7na|ImS9Sj}z`23Vj=Sgh$Du*nz&@=8*K`5cg z(U?=Qo9oa|k>r$~{BhYI`v85L+QrNV{6^LkAu;S}qBjTH1ZmUqp)5p=n5qugpH(+Q{zaiW4W2 z(ct-2I1>JHiJC~GGS}lU+Fm|M^I}E5)_v9diLo-Kmrc`qGADJ`LbVE#z=;O?8K`P4 z{P9#}gK&P+UMNYI%cg)}??}_nn$BW7XED=|GPAJ9Z*@~eMZ~O!Ubgnu*L?qUG@lYw zZMw|upjqN%Mf*osJ4%NLLu!Qtz5J7`8J~Q5YmoR-v!oi|+h_x2$MLO@=r}el9aQH; z=}lN-E3aRGI;v;3GCR}G7vb}0^Vxpd&{K_lftKnlSl5qLQR~K!l$AFvl*IsG^kf6q zV_#%3>?JS^{*mHs$=|^eDC{nZQw}{gpQ4neE3o|8I~sMFjI!0&c-HKUBl8+nc?g*I zLZ!DsrB0%c)_E(vE`rtDZpQG*sch*dYW~)2-}VNsaPVf+#Bz-YyJ@!N9bTjwS=~XMp-W z_Y|b2-IJ4-`sWgrxeA7#PWo#<5G@#m`o)|E0>&w0S|WA$H*Q}nMalQ@#3>~Ig5ZqzwC(SYKp@Dza4nmkR?++dg{&&AVDc zETMy>;~8_MzK(sd4%p7`_-tyetm;~mE!D9+tJAP_pdh^G6SLSze(@$+wJz#@Xbx>( zkvb}bos_SvWmTGf!i8MR_=nx`rl?mCb;b_ppkT}dTxZqC=p#`PZw--?J3Zc3mFN7y zxc1}Miw8!dI)OGR=1SBw8Hryt&>!}doh}lkr!sf-Ca50GA};65vYu<_Z-KQ;Q`OYX z$}`6bl)HGF6mlwjGbW;?H!dyYt^fvw@CN^0f!CD5W|SMt)L^iAT;>4=|w((@nCp zy}LOI+AjYgf0tL+Ea&`SUC)FDrH~RUJ<&UN?W5tClp0OkWNRTMXJ@@95o3lZ3YhXS zB?hXbqz`rls{x%S#aERp?*K~1lVuI)-js`=6bSYGwvpZGlIHkKy_?HrJO7`umK`&i z&tGr`HTd04&$(o+sv0e3)KM+6T_lXyq_O89+D<+oHcB2RA|@tAdv&x5(St!nO+KE8 z*euGz;xFIpUr&(K6`RwtxE0CopD8<8RGVQCmU{WBT-7RNda+m|x%Q#agt!2E>qOD1 z4DV_bn&R-5=RoH2-2tlLw=Tul!IHj*E;h>V$LcEo><10|WM|_HJLF}nsjBYGl_ngM zDj)CRa&z$%`Gqx+@jB@j+U}%6R?i9!-W-dDJspj3P>xI5Ho)*%uYQ?nFZmQQs6^8M zy+Gl1ooPlnHjfLUdc(x{?1$7Abrg;M>B*o?F}FrNDB?#9Me1d$$mQ%XFg zdrBq3Kpbdxuo&4|M-2~~D%C)Y2fc zw@GbiJlB~15L_o;V}vY0{)sr~ldm2wd6BYD|DzrAzq&idKdqjfBGXzC_RArPzmuM< zF4hZ@YJBhuS~gf;3SS&kP6|dN_wJkhQ10Xa&2ReZ!RU za$kW9Sdi23$EcZSSlEGXg#iAEL|?N`_Pznk``N>twYqwHfpw}rTKjZ;Hu z$?Z9fx)p@rqTrZ>!d_6nT%3lMC+X}exvdia)$eVP!|+0=)UnIaupDfg$o2R$?@0pq~p=|9Q$Q>uWJHapm3EBNn>Td{64Nd%j;Gtxf0#7Hnc*<8aVrg`S9d9N>R$D?R~jIT64=|WDs zmt;fiLfm#SrAyb!y%3hFQkJb;Y8dFyV2eG|%sdhi0Fsa!CuZuJ)jxeKKQXw7Dp8t+4-tDg;AHPr@lOW-MtQ;IlI*MPEX zUQGsJ9c}HN{MOjPU|8Gy!rV%Y)-)9>k(ayY#G%92<=V?UBC*)9lVg^9g#Z5gq->&| z2BM>t-bX-x$>?{&p`6Rr=7^1pQgs3TqgloO6m8UaORzwWLzn+VQ+r6JC-9g z0~ylTcATSYyeX@_8^@#e7 zTl!#4k!2#H)8{(}og*==tV@(=YmNIz!4>=!*r8$*zL0`JIe$=5ndh(+WmmhMbch?> ztlt+3Ys0eS0b`=gkh*iCyBzHCr?&P>O3RS(IYXS9DkxWG5F<=xO4LLdaOJ7V$%+|O z_WVrm-E1kZ?m?Ql>iahKTCf*S35fRsJYG&Se`5OIDuHea8^E@E+#5HMO4-k(V1blO zdJwG~1kEZvr?{#pl8)2GbVRXP!r7?3hRpqAf{VkJepyAf?ruUwx_h%`0Y@9{($~tG zsC}2ObFJaWGeWR>}2(<4)f@SSkVb@>zf8^tR zpE`5sr_Gf4jjA8?bY@xyIlo8P*?5WhR6?e4Zyz4u0v0Lh(Zb(!wMh2K;?Q?mx`tVWJ?FQ34tJ0}ho9gp`HDZGhI@@8W0w- z)Z{=PIEUrpA0}wWUMv6)2TJO2f$xaK!^;U&Jz6i=|B z_11#U^s5W1uD@k>2*+Ig^i6JqUG)NKpx*&UW@lud7Iw%lVNVfHUBfF!29v@lnI0it zSr;SjE$HTAk3YY6^_e_}q9K>vkKJPZm~+uJvUuBOndGX&!`WNwY$BpES8}Po$0tu2 zGNP^dB$Lp5U&Vm8wDaP$TBWqtK`vG`;z8foqI-p>K)UV(Ex*xc0c9R;+|m`BXsYB} zgNlK#0Lxev9vomKP-?(DB!2O;>~p%hx>9}B(qqYeBywPxz_D@=xdss1(Zo+1FW$U^ zQ5V_!6ohrXEqGSSgWm)i+lctYniO3&shQ4shz|KKS3D-lWR7)i@H2F5p#X2?eJDzd4%6lHGs}r&+(kjo%GI`9p zRW8N80tc(DLWD^XocLhFqjMDx^1s&H83Wn|V7bS=BKhe_dR7fS)m?ACXKK7wY;hZO z0w0<;_^f{&$raw$uLon4lHQ(PQwEkrd~TdejP5rRz~Aeoq_{`;v5~*Xz0o3VL55a2 zqN}Y1LU6@lympXppPB#HZ)c~*49wK=#h>e8)5s~%Pe0W@snkylo#%$hM?~l3^JTif zz~`@RHgXRy)?4xmY_D<7N|id<$9-}rMEf+vmTT0IwWTlTeMheC+Qax2h5%@8J|Y`B zQ=x}b-8RAs2?QRsaE9k_({@#k$X5A9LUetpzSie9GT))K;fC`g?(>!S!mab2hRPIS z2Bra3@}NfdrJ8!g)%j6Jp}QXU)D*GQw=H0e{9k_3-Cg17WAcC7B^ae2D_KAWmA_OH z99`ZW$0XyeSd~sx_UKP?GEIN?P1^Jrs5k=8kMl;%*X9M1l6h>3jn!OLbhv`oR!QHy zX&e_f5<<5T{tRD%+o1nd?Q?_J-a$b_TJwV6herSY4*k{}N0x}A4N}Y`kE__rLd0R? zX42JK(&p*@YSU86h_R1s+5n9s=f&3CMgHXy;)Kk8Duc^B58gw z@dGo=!}LDDp>pk^mRILzm5rr+h(k@Yom2GqoE~u6L~*bE7-)hoef7V59Lg8&=O#)G`n-}y6uzbq64njAEe9zTOj0MgbM4Rj+Xy#p9`Fk+1#!MkN6SI8hq|NxMflgvd!kIjdm{2{Pf;^BQt7>dR~hc_S6eq`dsWJ z%D#R?=eL4|PoVED672=(i)b|QqqcGL%O2Ec?YzZ2!4P^z-N-IsPLpf!aksxmPQko# z7#>4uk=O0Pw?!s8?5s7>wOV}~_1I*ib>y<0A^sc1M<nTahI`pXIHp^A_GKPP65eqyb^1An|2h z;@S6hFD0={^@Ji5O8ufjNTBfX>x~Elzh- z1SJcIu;h!8{5=;j`_8(=xpN0TnCaqp5$06;gPU$8FwX#x@%sB^lCHW(4`Kd2_n8=- z1RZu`{A+jL`0CAu^po-v6$c`# z$!pEvzYe>*jl3%Nkx4n+i27MgD5Ieydhl1nven_m;5yOIz^3kI;#vkvC#BN~`b^On z`-r@b|JDv49PFd?A&LU$&Qw5h^~B;Bog&USqPyU@_^T!nNt%kQtJ8FJWk?SDcU3e$ zgPV25y1TvAbnp7M#x3uyhK9R#FIIJ9Wjzft9o$*G&>+i~-%nE)qrf@$qPA$dk zgI9LazF#o;HC$h$&wi`4y5m{%1Q@uOB5u(@nu9PmY_^>XVH+c-gsR`eTy9<9qa^AJ!~C^?CVJ$@@lx{_T;akD{N?>jOM4RiMEE@c z-@`J(ezkWjDSj3oY5P!hQ|G*cV*LKjyIg&y$2LfR0>-Oie=kQ)NHz$qDH=pQHLl{I z5!;u?CY*{UP$m_))$VyAg9~gPtCMUDDiQ-eo2- zEn9js@qVc5NBbn7hM{wVzp`&63E)o?DZp=fG_hBZelz~)9>_aS@tiI|vV(3c2Omqa zrK+1~&C6lbzgTg?6n2N`X3*a81Rg2cpVI_x7DnzIvB>=QMTk@1b||d6^jAx$q+*ip z>7}a#qYq_1B=ke>pS_h>akkuUvb3Ay9zer3?9=N%a{s+O{x^3C%X`z9oaj?L-r92! ztuHNnL1TH0$ex^zj2RKNYfiyw>C(&{bV^L8!?L`cYVue;*AeZFqZ!)IudQv0=gID5 z?BkArPb=YMXW$ZJP#WW(mUhyIf@^W-U`Iz{zuP%jKT+{+SfBPQ^QTBoy`Y%`hdV!!Pt2Eabs zxx0*GBKP?SMa_JWnno`1*~URwbxitm=+c#+Ubq;eZUP_A!FSdi^aFkQt-k03?hT$@vg05M*D-@W(E3fNjQ9gywl>a6p4cXNDAMwj#0ow6!PD&*{1&3U5fQmBpH{V&C@8vmEx2D_5{(6+rbpAXx5cxcvDjcs*rdA zoBEy>uKxtQfYi^wa567FW1BIeJ9{fwp?gYkU=^0XE(b+fUl`}73L=>RaHoLDkp>gK zgO$%!&tQrqqeZePsej%Q#^|#ixB4f+6E7oL6g8lMU+lPeP0Z{V#NbX#Y5`+#+u_>| z>WuRh@m*bdqnPOWl5F0ex}=;QX=5jQ(ZE!}^u*GpT+cyIE-q|a6yxp5L0?t;5UP?9 z#gM=sNQ>RD1vg-en#OmV*KNHgC~Do-h4kvFG57`9l-ZRD9^tSQ*x9MUM~a&_@So-#U$s^^OCdhb7$u$Uh00JuH%z4tZlXE> zt-n(geJi~Kk!vv)dm%2$-+WRsi6@+=9klqGhqHLikta!JsZy2K#GAQAeE%XtZhshl z+Y6JoQFi-t&WT&yk%l#q1}=hMPFKn0=VpZqW3ld*o6R%LVPVvkdQm*k82 z)PZ=EA8N{IY5KF!wl{K>Kpto&%q0F5OVD9jSz$U&c7MR6IQU=b#NWQ-`V)IB|t@YwnE%GHD!?bennlif48 z^gwLrP)1$f`Og(>$FwNChpihEs{BN>vUP$u+zF-DhWM$I6Y>M-|F|vEKEvJsdPr*E z=_7Zu$`Zx@In-*-Z?2Grdy4^_<^X9AZ*3H-qjL((j|rx_W!R6G$YhA%ZWcs-d`Mjc z4d8OqbT83T`8jB2!d&(x$-YV^ZmR&3>sw=QFO&w$M9uO0wYK<=yC#1@S=7A4`j#a8 zIu?@cQF;gC{d>I0F`Q&0dGbp_!x})G7afkeOKWg3-%ufox5Y84?gP>$R%>nN91m}A z^zHS;3w@N;qua`xR>Y6baY+9VmAf@c|L{`Vz{!0_wNCTjX|AXNxu3@~ADlH8~a7&T`eEcO4W};sI;qVuAC~C$2If}|o?r#)*5!6x4Z>jwH z)TZN(Ph%*ImYvGPwfy%c;3K7mw}vQ@1B5_ULU8L|&kwFkzEH~5uP%i5{5Hs?m!cKB zaAYpZ4r?|@!*w!^gd5V5yH0MXq`4&GVr~SYZQO>B?{~Zi5a4SZ@N^LRx%4<%8v{(L zzzA$QgiS%t(T9}H*6asP0Z~tEkBap1nv;7%-yjRj<=#&l-@JM)!3AE9?%p= z8uCTaa{A#HGumm(I9lQ;KEGy+nJy5J9?dIZ{pCEdV3pVhr@psK1JegcuHqQHc@J>% zpJ%unU}@+`G)NZxTrTHi&o6yKW>Hb!s7oa8i=8Ti3H?`<0cwymN~3j&PxZgVfOWx- ziQYdL33RBhSDE+36RzT&+tXPNJQYgOsSbr2RRIL%n2~Xsw>w-v?NV#aDcE)}ujHxg z<$w0-ws~1!e)1h9s(&njOd2xm_f`j@;VeE?c*39&Y1uFc8|ay9#t=q(OG+SB4pSD? zD6Zf!tL=cX9jz&6xyPY=*-fkj${Qho$+*qlzYf=|XP!eSY3poJ!Z|+uKh+$e-@(%N z`|{LWfs>U;p1+)W(?kQMLj+Kg`zdYdt6oC4^aVTXtIyT zXgu-d#??mCAfJQ-q=pj#NE|?{?f0mDkCa5E{76hYc_6dbugOimh|~apyv@iLPVw%<0CL? z2;f;ByJwcx{RE@*Y|4S0KYf>l@FR(rqY5csgw&~hd`FeXQjNuO6|*$E!fS&euN=)J z54ReijHdsJ%Nk@{{+)>IUSKQcJM#MWyom*O%u|1UCyGW!2F3;W8ZNHgT1EbZxlcGI zFQ;p@ZdmEXQoj2k&U*!4ANz(I1OW(zGwc`3MSMGGV5DOW$N!Agh7>Tvnupe=p4V1J zsg-7+iP%~&AcCVIAH1Sg`;A3^%H^f@EzQj)dGsMJe|Ds`7n4*8!d~65{~UAIqU;yBP!?RmTe%_mJpiZ12PMq-$QTxRA%kCfA?5k`6)N>mA9k~EzeoYyP{Po{bbMQph9`x9bBNx0y-#ROiDT&NA^nNKP&nfszJm#%ome8*2j=6bIB2 z&~QS}XULD&MSoHzi>Uk=cKiOiivCpss}gn@6?{A_8AeU$Ov@inL+cv$C!$5%#OW9O zkF`tL_*AEkHut|$*9<_v^QVZLuE#@JU+tz*By(_tJL0X22&FJN4bQ6?$BkvQgw~be znP)AMLIcGeQw9xbIbDAzDJ~Dik$3x_26W|J4*M56Z8v513O>Ar%DbzSfC>1SH1)5` zQO`H1q5^Rn5cF3tU&@89^1|#SYnq+B^p{)N6UHj*UQtpUYItb}wtK&WpJXq-0p||< z&rhx+3>Cm^CTmZgigV$s0rw_tC6 z+cxYx@)sjk+U;!PXn^vF)79XQ%F}Bvp?u+)llLrg<33Jw5u8T_UQ85d_V($Ytf{a*%OLuC2x%SH>i}V)+?TI#+N&m_nx6UHZdtpC<$}v*Fnn&Obyb8=z?tN6a z#2em1gk?M;5F(t$)xNi?W+wKv3lS~z>539|lXYDn5iOHyUxHiC{Lu{++q$Y@=Rp_p z_Du;q<;&7U$g&;D3KfADLVhGEmB4oOcS62v%gl;{sBCIW@B3`Z;biwAs5OPEznU&_f>_8 zDSw2TAdVH5q9}#NpB5$@+pYRmM{jU~=2k}p3F-4Gilu~Ks*&Gjyysc69f9#-u;dF{ zWFWMkwQsO-B)_Wr)yrM&;A?yQ*G+F8Q3A@k?>|$YMoMO~tzm5{r;fIY zFhqWN&}J1_#*(X42|4P`Il9%+LqanEtMzkaqexgCcfGeA2umH+H6GHg3@l?10U_{5 zjVkj8IJU-Ax~qMv%1;qOTD~`ap3v{7k;h#%iU*rW=mQkSyLXR^{52qvu+K+tcM={y zh@xe2P50K_@w2mSPFd{}=QdkYg-xV>f+-2-qj8)6V?$uCZ=O&D(mVMJPg-M1p8>sR z#>GsJqZ~%FJhX>8yt2|)iH+zKC8%FU@szoq<-Hzg_B!j&IFz+zV%6VP8 zS5b=WeG+hcv|OTKzEhILI`@I`iET!M{NlO_ZF7bsnw5c^RwlNk z;cIpMZ{B>z69d^U)nba+LVl#Ibnl%5SF}}FMW^vt$sj&Y#d2l2bwyr;ko*7BwI-2F zLaKOXqkeU-rv5*6=mp`OBSwn#*jb#OCA-Uq z&4oG7jk8AAKI*o#ydoxfPLnjsv00tY@!h4uMP`Dog-g{U~#8Q&Tz1A4*O$|r~e6K&S(LirPbaLXO@ybHAf(7GK8`#|=F)=_;!(xIXWlujI_aihh? z#EUdi>19%sg7qw^N)v8gSfBBasJDlEA#KUfQyaxoy6z6bTciRQvjbYfD~csgkhVXh zkcrIBarsT5PYE9^3ID6KLo|UhMO^EPSfNR*FvEUGi(GVH3C~XRr*%1G)A|NBvAz_L zJ0Ys4m$=r>Xi?NmJ7JUvhsdETGs;pikB{537M$uOBnu%e$7``ZNDKW`){4MpyP zlGqVP#jtY@tlMNNc@{K;{_PP1kyjbVf0z~yLSaKO?JbW zuR9S`Pk!@eSXIGqu^^=VQ&3As(u1XvW!l|Re zVhcLIwWeJ&a4}U?RY!+1Q+NP z;0?%M&8D=}Z?z|GTwzuv&3!I|eA#k#hn28?P-<#0Ll9F)`?PvTDTd{b@|BM!B=Yt$ zv-kl&JZluPM`rD00u(h!jyRZ+Edg#q(~3sLMucJZIyTArDf_x~g-boQ`MAPK3UxoU zHxwT)e=)SmdBlr@>|fiifg*JZPSuG23BBHSWs7@VujN!sp%uKcPg8MyM)+5^Q0b1_OTDe1^$uP4-9QRoV zqL_&o=7XLk>3Cn@*$y`%XnqFgr_ja>+~B&`MHnK`!JVU!@L7h9-iL_pRUHtI;tEOP z^H83(q9w6~t~iBizN9<_m!(gG$~m`hmkal&kV(QEX2o@X1^XT&C2TUX;czaeOrhR} zyi4dYug7R>p=Z;kQ5TNSQ##a(A5#?)siSrD-EUOi6h!wu*;(n6z1DsHsr=X9CtpMh z%$T-c_w2BV%PYaoFJ)gAXiAu)z$-3~%8wks?>nvm5`N_VD1hnb%(#rfFE7pFj5 zjLS*zB%?sALpArU*>kSOniv?Y``sya!~e^qzN5~KWY?;f<=!Jv%T6ksGPUkOgO~4e zS$guwCqUv*$q@pC$S=E`akAtd?_BYXwxy1so0lo_L?J+sj{jsRq5RL%@b8W#9dx|c zAwE9Gsr-e%Pi$mt=48^Q`O$(>si(D|b9nluAKbaeO8&|Be^TyK6g>SbOCkAf`nKl< z)7Ck4Dq=9(mcgP*xk~Xq`P;0{7+_Sn1cj*Aq8IQq8{wLfFx&JHA%0kYcym%_vQC08 zj?Uj11i1x8oG99@zg9NCCR{H;VCxaeJGv}r&S|y}d@v643mg176vR_rQW4g)F=YCK zh%dTyrJVf*$MH}0ZlT*s`mPiJSBFwXr8L(Ywd_~Y+QdrVzM#oy40N7!U_Ej#Pl|yy zRIDI&!0XXFtg53%V*SP{rRlloAFX~?7t%mi-?s_e42eAQyF6v1yXhZskcf@`A^8WB zUV-wdfk-Sxwj?Z8uQO#tff0D8$M!&ZiT8@4Tka&JR{;5>$$#ATMNtNljU2RnBtTvw zkP4eM-7&#zbfz%ksXI?`sI{SF#>jK1%FDaC=`uoo(EO;d7DDY&)3~h9ZC@-83*iP8 zPybVvA&qs7aL5Z9pDi*YyIuk_s8vUJ2bnZ{J{Yk4*s$hc-&b7+Vi&_g_|X-q8Zc@S zHazpHn1AUQuv^>f}f~ za^GS%%KY^RkZ=F(iJMyoPsg$E#d_V@m$nmL1+}Q;wpJj~`nG#;MX8^wQO!q~?FB zONoqhqJ+8}HiDEv0qENA@Kh(jw=FIsgzOW$8pS+D<^zD#Uo0mo+3e&NG5IOF4=xC6 zL);e^l!bCS77WhEjC^f^3piHul(-<<<&lNSJ23M7rs10#h@6q>x03y@VD>Xf;N!bs zXx!T4Cmo+Lg&cNM=^jM!h$0ijF? zVpWwi5$hHQkwV+b0tov$VEcb}kpF{mo`K}dh|I0P2^`|F$HQ*^*Z?TJ z8y+Imp@u)v#q-29(`3nhsHALn9gUcAEE=_Lz#I1A-(AcIKsk$Rc-rlSjM6m}DcqQn zz19qBct00s@j?+3s|f{G{`wzb)P(P^mX=QG zknV0+Ktho2Zb2HPTRQv}z4yEK{{DmA=b4>(XXcG_&deyGecj7gcqaV*weaO3wN)x2 z)9jqi+qiicv%)2$;UE)*I<+`#WF!);(E9yyrgo{F(KjT=s0 zTQ$tevaG_mEcVF%S!1st`}x)VW8H5|<&qR6PW!&s2@zs!c(HUM;`FHg;GFFvk9P&7 zg+uvCURF58lx4%k!o&2Wj{gq99U+i#zIci^a`imm3OIip*=c?jjpI<9?GhW#Il53W zj$mTuEX9<)pzb-1@s{N(u84_lTG!qKokKi|e;WzPUx)#czx}FkPkj#N9dML2qF;21 zVuzKSRpcnJ8FtZhvV^Qv2GRsrFc{)OH6Y@Ox6A3}dJo5X!=Fgo$J=fdjFe3WyNKzTRPW&11=uwI;3$O)XuA*B%Xgm59U*P~8zr}4&&MRr!ZV2ucbe;Q z8^7&dG0w__-qM94@yVZmNI%18fb1eU#*uEO|Ew)#0|*5$d%bML^XybFNm=Lf6weZM zMqFG&zG3FFqhlq8CJ%}+%xpSTPA6MvEZXP{ccV?;ejRK=q~h4X`k%T8m5TM3wV~MS zfyUocv$jKa>V~HB^hP}b5`WIec$Ej%ON?(=-=)4`w7%xWY=B()us3NHc#X$XPmksJ zUpdB17KH0)_z-OKJS`CR^b`xNIKlCBBn{>6mAcc7R$Y!4)l}^pmH2D%jbwxWGJzev zkOIy1Y=wvK`H0mi7>hgmaEk`_u9%g@U9*=EY+i06ljdd4mGnYT=EA^eC;i@Hl^yxN zh{gv=m>{Aj{B?G&-v(m@r5vb96yy%81XHT-L&E$;G17*gC_)^_kXq=;6k6D!pFnKt; zy0#dVr|!pgdzfgqo_pTGQ88QLCWct40Pcj8VL^KKh3L)L!viP?q_*h!D(7+OOdB|ARjoKu?+XQwcVIeNnOk^(%qBrQMqaNhzs0$Yab+%H{m!8d3?i zuB~%>ms=T-=Z|$S8AeF7s2odE|GW5XP@coa-w4Hl1Sx|kq6L~3&V{V1=3c$%hdw2S z5vtPj&!%OSOb7I2-W-?8-J(tBaw+slUmr_z>PdCe7m%_ezSY=iGgQtP%~|A)I1HtdEZ z6Sg~rM|J1A0m|97GrdZd5S$|w&CPs>k1`hI%u4Jp@zTfC-;Ms(v8lq0i z`;!WhR}GG0Jm5s^_DVIhz!de=aKisg@>(85ZrNgKpYizYtF$O!L}r}uD#H0cOHvR* zBIM+HoI(ux%&Q8mMaV@Xkc5*8b$cT3UvUlcCte!FX2HIXHZPyuYAY4U=d&pJ&Djj5 z(4GUUG8z*)dqpxtp{6T~vN|CXn%af_zn+zDv=TTOFWGh3ytz6#9|`q+sTlV3E$-ZuB{a+$ohXTlil#_%k;EhoMncT#7Byn z{kT-nD&qi^?y`BsvE!IjfuB-lXAnb=6z5yY?pdnM1`oQrOgI0%FCpp}$T6Gm3>Mwb zpF-Njt255YMWg>%mI#5k9K?J=c-I{$W0+X5e2Qe$j6!thZ1!BlGM!TPx)DR6(GC97 zR?Tx;hvgQ(e_@3f`cu7mokp_OE0uwDLrW8?;A{xPIyo4kpGGh%%~`jc{9a=ztwnK> zX?r3~fVhvzH*>j_JI(7qGnQiqX>SAk{Ob;7D1T2Z2k7CpdTgs*#Es#?+zf4}>AHeh)t5|}E+trKN*5ix zm2Le0tF3(kq+PDU@cs5<5J6O|0_0>M+E089@k)r&pgs-hbz;u;rFa1De<{GGg=afl z-CO)F_#tG8P^&}dC)xE7EJW>TectkHf5SE?$MkJr~=u z$TOz|*WG4JPskSJ*5c6n`p;U+l92*}{6HWWQDGnu8uE{?2f$_Iargtgj{ozgYq(^> z?8C(l+sgpz(1fQBo{(&mwqF(EFh4>a(1f7BB@L`Sz@=%^fwVt)O+>)YOZ;i&|C{tT z;DRBq_njrFeyRBU)u{)?nl#f6=w$(J7^5UFWpl4MQx#big_WraUt}Cw0;`bT%&}AD zCG~%M71UuXDjYOtdsly1@!V7YaTI6^6`*J&bqGAUHGfd@To@;A;7jT=(MT8gMQu7c zJ_DVJnfT^)iz_-Sp1;TTr&nt`Qjn&`W17vee~;Q94nQ5|uCI4Mks@ zBjqKv>SD`})5)lR83)opQ!sE>vy;fmdisiZ_$~aM|raiB8|ftsBkFkXDq^yN4swun>ma% zD}A%bPFl|%=91DAIkukk{}z3or00GtKlkJ4>EZI{?|v8npQTtB=e^0ps9|kDbl~3rsK*R3|zYz9ATkm&( zN5{10_7ij8+DRyGi+4cD9x*kt115-BS%%M~h047DADbqVk%}H9`>c8DJ-6Or5ePL{ zF}Ohe(GJLN4LoABdZ&;_8)}!i2F9EilkNJT0rMkdjO-!9YTn|4Qzz`dCI-O>Q9Lgi z$r`StKi~9#NVR*H*rb_2IDV*oI_I?R;M>y4s9FEE@oega^LNLV*t850qFeFIplmbK6rjt7R7FK9V8Y7f*tS+DZ-1PZ?!+mTyl z;l+CyOY?0xs$txm+@$!nb*5jDlbgtY&D@PUU_%`DVkZLcO!AY0hnS?1PGf1Qe%C#M!H4(r24`Pk74zw&_kphbdcUDkMBXwgObB8` zb!XUfQ8b7iXvxJpa|4 zg$4;z#6r`ZGvR0&0}Y_c-w#-6?N?az=SLmX0JL8iWwjXt+yU9zVwUEpcN0^2&h9re z5s|!uZ>F4XGt4s3nY4#ie_|;M{r_yOIRR)(d(1%2{nm$ps#2E0I*nVAPBOG&Zp;vY zci(LyKFIzfcfZMTTyXsm>?JY)_MkWKg&gO=-$z5JD;peXSN zxD(bV?vA2em6R&cQ7hS`nOl6(=@5%g_e47-c=)9}kw#s9FQmWhyA2fo9%0?%O{z{C z6ZB9YFJfg(Tx6;M)bCcbVV|G8ys|HmpYVV&*z%m3o;1#H;a$mAc@owBvTT#=PS+Yp z6p80ZD%D({~_0$vJoKI*fWS_2k~_3z$i$fK{LhT4`>QbRj7p58dwcNU6&I z`w#!6P$+F|OopudaP};nR2nV!Pao4HxiG@JO!phsX`O53AqvmT;+hG4hESPyoh!bugQ$zT(2yQrm!ZpyT z5+phlKx6M)>~JOSGdT-k(@uL0-poEog`I6~6-EB+_66+<{?c7qVhZf#5#C7+m&v^I$>k-s@6ebO=F-sStsM$nF%$4-7$>1)cT}# zgnGb-oFwBu+2(pPa!2Y4=uthSG`aOG&D9W|DP#Tl$SKuL7sGog)bi}c3`TXi>k2*Q zrE{lIB!@}i=6A{F`8Vpd@MgIw$f$Hf_hrJmwXD#hk%eb{zG26-Mqd5JT53z4r{QUU z5bxt8)jka?vte_Ns*y=;kt7@66xP-%(X~Zj&#$TKWo_cWhoy%KjU*!CWE>++>qNgh zAjW5nQhd6pZ?T_mgtG1g!_M$&kh_ynMl}+qIR0NgvnpIz59#c!3MLSD|Ah+dU^q>d zZLXA3yc8vPaUg>;q|s}k@%0kImG7?}G$lomwV#>4#wSyJ3v*g=zM)d*G9`_ts9#{| z8dQFp>npRZtX}AI>YS5xD2(m%&(sB=U47?b<UD9v=-dN1C zx(KQwe2JTOH5=%a{B&e5LM>v4MErf%BKy05Ws1`xF8(Vj>gcr#0(Ff3(1=?!8{Q6` z=p`SotK$j%wr}v%3V>4?zX6>(sr2$IpH~(PT1xP5i3R$|h<+F;T$to($N=?_{lBf= zHMEr0{xx9#81at1eRNxxui99^AQv>H1Tp#>FKA32peS924f~W4OxJ1v<7FJO^80`M z%PUgQZo&RudJ-nseL2PH-oM^sLY|{kaznJc~jc;omb=(h|&})oLg0~xw z6@?aH;Tj_*G&ojmf4j6e9q<)V_^_KD89UqoO!;RoggMIw+h)}ec-`?ji2;Xi73#?E zVtu?d9;Bwmf1O-RYnz)q`{4-Thw8^NpPAoT7AYhI7mGj@yKwRV61a$Cy0CgXU3g7k zGxkMze|BL8_gqkxy;Cy#d)Yy}nFHhj5gTp^N}{SL1m&@SuyyQE;i?Hd?7<4PFT`RD z2fbI}k2l76I?@P@&J%U!t;n`cMD0;Tg@MUfAk9R5VWHfQn;%b;1MKkl0~U?CZGPSK z%n4f^9cv!twA+1sd}V*F=D~o68NGY#CWf+-KG`veHOxrfJOUa82NvDjLrv(2nWx`ax2y`SSJF5lnQI60fCy!~`vdZYT z4wuY|4R_Bt6l&C3@z{SGEyFRgmbs0-xgq13>RK~0d>h<>^PJ&G{x^Q!2hrmEb9eac;~E%o6zE zZ21c+^>X6~I;^CMi|_Py(3zX4hYHkW4s%4?Zzd5*Hp$f!Nsj6|CUVW)Wwk)KuvUU< zTa}ASy7f``NI8G+tgUQz&6<9KcV@1u?E8nYLv)IXtvF0o^o!%{`Xd&l6;ZXro|d-u zZMNQX)!yUP4~Eu+gkuu0ORC)wCx|!nmxvrq!A{h3Oq6$=y%o`_-5Z&K?>X~{egI2q zgk2(II^tAoX!L^Vw&(il1U#CJ`9e?GLPD1i^jTI87cd8^WDyHADnaiGf}7be5yGN~ ztspT?Qv%|S)#Ft8{&L4IK<-&jSys?8ybrgQEswf~qHt&U2A)|4iago{ogy^KY>G9w`HhA}H%D>S&74pNlZeT2kbLb2lLzhbWnqzKJxUI$q1ndtQg zMl0m-k|<#p#n-?}i-<9JsNvk*_znG?_kmzO6F{rdVf@;1bTCy~RAHPMv+6jwD_>5Y z9`QsQt>~6S9~;kYllTFjradS_qLPB#*pk?ILNaqG7?y$kqKZ?Gf^}#W#6Btmwq3ec zSPH?qr4Xmw%IKCsI#-;N%=8!VYDNB0Vp8ahTjcRBRuG@z2gXBRrDfLPdRkf~o40#I zhWXrzBQb$;&KxP8`daz^*m7$l{B%3amx*aIzWy~J*3Hj|COZDp)M7Udg*Zc+n|os~ zC+}&ePuH7g%hfDTXm}V+qhiyxr5O#O=?snU-6M7*1p*`44BsOiH4-oBLFYEqp@7BE zqPUECC>y?q84ho3X>%4bi>}E6!zNlV<*g|HL~uMZRu;FnGgcZ|Yi!vEJqH7QF2M0m z7x~-jo1vB*eGCcXlRU5m3_zjN$=Hs|yxTACT^83cf?v@{UGYYah5Hy!ph#L*bft4;G6HW>KV1>>5{3?MDpV7(bEqa}L&pqO0 zeASdJuU ztRdM-naWXI8RJ-0+qY+&hyn9l$NVgY`1R)m=(VID%>1Y-WsL}*HOyB`F>ziZ{~4sg z%*E|Gb9XZ%x0F%S^%pO7aSO5}a^E;93oHCn7p++V0f-?^!NqaA90OK4a44#=DRZBOlvSwicn9!8NXlIXkKD|tW zgc(i^pYlW6zX!=S@DK-BiO5d1R@0yoK=Ekib$7KuP;7f}CDpjPyLkSTYYVwNMBOre z+xoOP_=>!af6Vh2Hzd#ZA@be-U28*ZCjvFK0w{LlQj`9+`tg0DjBkf zkQh#q8{1+n$?u1&Ayr;BMck+O|CIA#2o#2lcqXL_dJ)j5k`uE~2|HV`c?a|@+h;wo z?n1ydO>)5@*n%A{pq>az<7Pkjb;C4J5qjWekAq-$!=>=`e5RG$hqG&)Fua!R@HB$^ z<8VMTe$;E?TGNE7)dEbo7B&AT&8Exf2=ZRI;pg`TDoLY0ki> z6*;_EF_S5OWku&82xlaNPhc~f!K7J7dRI3`RFD&u9KvzW{9pyG8RWg?Y;LGOh=5%h z93#J%4+7<0s+^XBpL4Y}HwqA-Dm{r`Df+Vyvv9N~>8%B38^s zGv3p9mzLrGtvo`u78KS**{LH-59a*vnt_IRc2C))43?<`Ybj9e;;CTGGzNR*UY0eX z^|OBMhg;8S-|J;!-O3`=?@@%AEpL4F#sr`X0ci*p&MuG5C;w*DZfd2djg;5XHIVozJ8d^Rvby`C}+z2PIsF3-cU< z{D(2Lu*CvEZXVSoxG<9-qhbVi1@d*;pZV@@{F;r%BzS_<+%a^Z3El?(RXRP;gPNqx zwGx>gxPQpO0jXr1H9zJD_yD!xMdZ!hJ?|K9vAy5oh#<|{?3AF6GNx=yvfyb|AG4zV z((;K_bojYaC467TeQGp$9GV@OQ=O7w+sPwVRc?YH|AhHh*x`$;@Y_c_ z+({5&<9i2Fp)UsuR*q0om#(d_PF4r{W6_?WtmrmN3G-ervM&Nz1N*)ZQaKKhF=l5i zNM0^nMJwhsxEaTMwz^sl+KRz5+FO$x)dfPTYttWR9W@Re#cf=d^n#L^u|XS!bR{uh;DD*bwU3+<+8XFR=;d zYZ_{&_5$S>_ReDuhkYugqdhbJjjFIk?~6&@+y`FaUkcZ*B^@tF76LBX(*y!yO01wM z<4*!SRi(iVaJEdztmb4~$sj0<=q+bA^hwZr;S^%w`|{9cOc_AC|A<(0S-1ybF)M0N z2=;xvX@0X281;xQjc^X*og-&@afX#PZ!^lOHvUaMd9$SKm{82{S|yM4;?sKV<0C3L z6ZztrNT#*S;$V$2&Es{W(@gzq2liiEmt^&QHE6FpY@z|NGMl&WqYX7~e=HnV+XbH9 z%?%}$6<%OjR(dFlp;x8W>EgSk95CQWJ+a+w4mi0j_TEX_dfnY+J|3UZ%VS15fY6y( zVK^0t_5#qY7A5h?SYsfmln1{H&7ZwLFG4EKcIfO+gqap}@aBy_Ium!YA0t9G7B_}z zy;u>aA|pOOAG#1~VIjNss|lGhAp{hYrjUQ3UF|46>*&py`}P ziMTcC9(HlAG+d``BG;mTb=K6QzkNzj^O`B(TTrMCsrj6>gzji(Hg3^RP82#K%_ATy zef)F<3rNqVo3APs14?tP*$1`Ay;*NLo_HpT&8?@1OT_%BTT{a#r3SMoG%4#+d4B(A zF7a%=8n+fn4znjfw-om%{r>%0H^WhV7dOJ_jn+8Xtvuz>-JUw3-zh;ytpM@l&M8rp zU6;;@h(l)m5y<%pwJ2$#CqVj@LUf84<$e|p6OUE%{LA`*r@O-jrfNoAM8O)T)1;&T z&lfu%H&c7TEtVmqXLaB5%sk)LuPyGf;7k(7+`Cycqmme&;{5hi?QWclTbt8TWeQSiBXC9g?e@5*VUU^`>W! zHZy}B5&G|}>nk;&D{I{1?o@Cb_w41D%Qk+A2IYPcF;OsJ(X%chpS6EC#MCi<4&h#$ zZL44wyoo!4sy2gmZK5_DMj%x_ixie&BW^ybv7vh#{vC-mRu?ynlDfS(j-_j)3T5?; z_6=O-N0AJFR^zwePjzT{Bu-CkXqS?)ADYUZ9AHGtEo?!y#Z72ZVK;}KDU~y28kMsZ zZ?4*_CcYQu*y0{9Cm4TGA-8^4qGZ<5=ekatRXQ!=B6%~=qM82%$7O66+t*mC663)d zn#3}eit%Iwekl-lZo1(p^KGk|e|E)22o6{;p%~n?$o*;*t<*m$l<1RqP~T*Z?UB(C zTJAeH2bh4W)*xYF$E^i92q-}UjiEE&FE8+?U^K*lW&t-(m50&H45c;Y3+u7$f$*Za z-7N{y?Hs9E@P2#hXG01~0h+?cZP$!6cZ?sSNmzKUF#_NRFb7Y(Xo3;AAhS4V-a<=7V*P})+cWr3S&DP+e> zOOHjOulA%E5HMNLooY}MBtg2CA~s5C zw$?L*ufFTSHcM?N%K*On_@%k_Q&$_EF$>#P2Tp?<;lQ0V1L+PFX% z6nld2xyCH`CWW3p-=4OQTu+|KQZ%?IHyZj~S)po^YX-hoU+DWJXHx=Mm|VA_Ty1K^ z)i;RZydRZ*oY%sb$_R29!h9>b(_)9Mtfu6wU{4OfUw3jHtRu}WaqTUwPAmEJs;4JC zsY0OTtI@Bk(YIe3b5yp^UgX-Dm?18z6L~GAEmK&(7k-H1c=h7bA?S8$5GoG;z(MsZ z{-7CAl65u{r5IQYq(jABS$yGT)g9~t(`^5>Eu1!f=8+t(2m2L$ER{yfvuVQ><}*o zA~DW1))wlhkem6G`9(fXuRv9~SNa1U6{ggd&jXP+ImX-H?vFN^ z?yuI<1hmGx`jhQNCo6!J)i&m{ykWwRPp32bZXt6d6!e?!hTl~Bo2nlBkn*^wZCn9h znH1Bz3y-pkZSaE zsA?1JvqhT7fRaHLdog1VO+!Lyfl7W%SV;f(F8*XjJh*L33&|rBqc%D{g(dWFj@X66 zR`cXI%4>j3eU3NRe8^K-nxfe7cv1!m8#!@}bLLZ$`~>=fH?NXOueGCp6U^SH0NBb_ zYdJTILK`_A$z*dBQAm2)WeE4()QJ8CCU;jUORb}ziOJ0|uh8gSjbJuxClK|XtiH96 z^-~5l{}_NKHA;>9OK5gY?M3LT)%S}U_++QhfU$e8U&46mf1@NfT7WfMBi4E{Z?TWM zwsHXrd5b&=pR7q2gmvV)HN`QbwdjUaW)N8#)iD3xt+p!zh(4^ZF}n6Gip zF9y6q?!&oKKtc;~al#~x)$C7tlO08a=ZMe$#`9v%Q=8Uz; zh(tx-+eg|bAC%V^-RmGqlKPFcd1S{IZ{g;pP`%o}*RkUE53c#5=nh~z44F-{I%X`q zi?5pDQ9Tn_h}2wv?BI`1CTs-HKEm01l6r07Yy%x0A{9?s z?=HF%OqP7V0t<}m7M)Bdl$451^dG|ms^tC!#Xy$bgA=gl^@pmiTEa;u+=DK9Z9&`5 z3$$-WzKE%y<&0BVnQ`$_c)g!!pcyy#CiKDE3N>YW(&K)2_3P)U^Oj|W7?G>kj81NB z_LQ#JWAo@^M=EcIt}oG>Jy>2bY<(a*Oy1FuC~F6YXg@B->+*}Og$nfhP#qzSSc5Mk z9RALil$;~NkHQ?wG$3`>aR$8Hq~ko&J2Kw3bI5m&4AZ=%Bs zIKwZf9E2@7ei?d?k=IvBzPkYj==CKzW%hWmsq95j$I5Fj&_qWXEqkki)OQs|UqyG~ zakX?9D5w#nT@6x(*MaHaP zpgn;-qce=Z0g#L5l4F*{S|Y4d;@;Y9VoA{;Sxf^}D#H`vK}~eee0xO3-JiU%BMFp( zrA9igZ0!pp!j$o*NZ6+E3@Myki5FQkGJ4%{v|tJ^Oe8n-U-grPzi|DYGfVc;FArzI zVz$qR6G57)l(4bXM=J}_x?*0ft98ZISBHD)K3?FZdUHYyDEusYy&9u@i=;pb-O{9^ zW2ZU#;EY1q9PnDB-(Y1gs$$;&j>4+@uqID-gB6|qaAD#RaljXuPEPbR{hGNz77%YWtA6}fA4_=!~+_YCkF#emcIL~Os z3o@LnPobIX9nQe0hqC~14P^@7PW9pWyG=PweaNkpkcH@Mq>}q*A?o2k)ATbAXd!Q8Vml8Go9ZiPiNk_U2qg3vVrE802v>=5)i^=w8vyJ=pvHLcM8XKT!GSqqPFK z%AXiO_Pg|R>v40{#`cZ*jNlXHyPP~{H))CO5N!+D=k1+zTS!@4KMK}t2U6V5-t)hZWE3)zBSmwLy&$T^ zQQsp6*adXVK1JBG*WLZa-5-f`46|Egz1Alh2a{0{MH|}f{+!+EC6?QAO7_3=;r$fc z0sM;WTpVUmr1Dz|^;=cpU;_9-8|o~n{k>D@dk{s4{@FwQ1ZpRN0ihEoi+GKw_4-lH z%IEo$gRA{z|F%V*fbez1yr)YQ^k!0jSQa8T738pst!ba(00zf6=p|why+Z)nd4CkL zXqaYuvl#b$_iRpVMI=oT(ruzG>74<-^Q6jsSoAtu=L?lPG)1h&4=y&LkjS(t7(j_#4w_X=d3o9fIZ%u{j1Q2iPWohm;Mv`nQHR@*R zN6HYjS>?jX(N>Dw@;-g zEzTcR0Ng%!u=M<=YVsujbd3>9?x2k+cp1^4e_r2rbNH}%<+M7iLOD%sB>g_K!PqY7 z?4ABXF7-5BM*B%N1U$RH0#qNhnON6*mQct5zG{)WmF#i28C}Fr49WUK4J}Dl8tRf} zywb4J$O(B30eTJDni;ktzv*xvc++piH@;!+IApa@w|w6K!l)72(1WYab#=EIo~5XV zPEA^>*Fy{mO);?>3FFUCca2wKN|8H$iGFySZt~?SBY7Tb+;UTJD;+J5zQ_h&$EbW3 zrY|_P;Jx(rR#uYLU|CXt*;Tq0EwG02LrcusJOi{b`r^?Gi^OhuMLF9iZBpL16t^^M ztrVHKo>SuSD!6K-Ya0YQ%GII>S1D90g_DB#qpK%kgi$|26sx*XZiIrzhkeXRPxwjP zDtpJM)f9oJCknKGRyjmnRth>LSG92&VvMcpa|q+LYOtNz6J-q)4mn2z)RFB=Is~Kz zhv33xQ4;mgkbZ~b;SJ-r=!;Uwt@z`Gp1EOli2VtwA|JoQw`oa-48&oz2fS_<8eQ{d z)@YkZZxM_;#&(KDtQkxg;I%=sIRPlHzTdxkIPz~>E?;_bM2?=p5H}C%X107XlEBvFaK0Ixs1E z`6t_l0&L`|$@?~A6Ycv32w*f*wR|=Sf5s{xnd?Xe(@vhNt9JPWMtX%tqJiHY#h(WdfIl?>?i|7H)*fI#V z)6r^ejvr9I-9s&fog3vv|H~V>6T^oLA*!(S75~r=YvZUq#`)gMg1wQK5n`|Ne%N%onmH(^N_LQ>x!!qvTN7h|955wwz=dEG7Hlfve+6PJ z|MEz3{jyYLG2|!kmu9G-*T4@CEI>}Wphd;W54c2K7ePsFv`(HXDKN2sY-?X}D`vo7 z$PhI2SDJC8?iB(Cbowc<8;Z%nYewbUoSbptkzv4pcbd93k8qBo`-@c&-iPY z>qm9w+M8n<>}@-Kg5uCr@aDR9BdB6s4<>LK#PaDprY;#V=6P<Q)m%Msf3ax(?YQ zvwtFD>a5?^2>#l&B*q+Iw``({kNuiM);DgPn4$u`&auh0C8qS@lGinP#0W+8LrQ!$ zD#^gI!;wDkrql|o%r~3sO0?o9*t%quGE=EWv=2tJi&HaS*k|_WpQHL=^$m5~tkfT5 zAgCh=!!K+r8q?9gU=|^F_P`~h5x1A@Lmkiv2xC&EC;F4{=4(zf6upHhZf}LOd&~J3 zE84&2YR!$@L6Ap;F+gzKKWf^g3%Rmi&vl}MCHeb91~ zE>U!}$5#$FT`lde(!va-Q5jj~NEO$dJM3>`iG}Gz$`Q={mCs6(z*n=&X7^8L)cS;t zwR%vw0I7Xt3Uany94{CY{E47y#B<$1R%par)7+G2lw%ow;fB(K?jc`D_JA+8RGt`QLEPHWYfjhEE} zEdZ_UX4UqC?9Gs{s@b|F@!+s5b887F7gd&OX@zTFR_r;G#mN)aCbva`GpfG@FwNLz z-4V^U*(w`84CUM2#|pTpMl{nljQXiC)+IH*@%c^YGp}2L;wK)oDV=-?*Ap> zdoA1{BdfoVk6zhH7hFsIkatBoBRu0@!xzH+X$+4MnVlhhoUb_7aWcZVm}DLPqCE1S zXoLv!de!LL1wXmzhV)AiS<{rJ2A*lZuQgEfje-~Abk~mkb!Pt0{OMe-d)8_>oE(9m zwwGJz{qkL3qS!_0KEXSx*E8J=ctXMK9*ov4hnB85aoO`&+DvZ6{0Kb6+QV$#*-GP& z+qQdKIbKVZkR2-i0;^5Tv7Mm4t=*#u-l@#~!-uDp7CxqfpJyMnK4l|PhfRdR;9B@ zwL@3)hgDz>)FBPjsS3g#!n0}zDY007B+lYA9CL>{Vih;5NIaX!s-bYj&iXixh3Q&M zt%Wy^qlS0_J3NZV^&?p8j5oi?+df{40_0Ia+&wbE)kEB$7HbsQXZWEVUW=ju+!Dsg z<2Sf&$=$I7eE&pxF%)LlrdQb!E(H8iLefHu=ub!i5gPYRltSoR7)W61!N>tQ*V=UH zP$Ru}U$3|Gt62ifo`l%#w$zVnuRG zaA%SK?i~`i%QWwVtIp8#bE47$!N^^EfPFavE1OF-mpEL3M{YK6<4aue;OW_>Ud7>N z$yM_Di);Uxt{U@Tz=JLhTi4rp4|WfGJ}s~GI%Lkm7o{Em1OwDGQfA6{2jJQcrbUjV z22z@tM~SvABh}%VaaY z2Pt9r4!>BBC2$L8qfm2xWu=Fz@*_L@c1I%7hh=3WK;CKWn z_3%U&3r^`|qjY94k1Ir#^-M|5)~d?=Az_*@VDuLp+0h3Xfqqyeo7d~0b}7-wVxQ@) zU^z*ikxgutJs=ZMD{f?PT0A>1;GNJv3O|3PNa6Y&X1nI~EH7Steg~&FVSL`_1-M=T z-RFv{ao+^?7YS2#1U#JA1}fl1p{Bm7mZKXeCST}i&!BcGhpVjCO_1kJ|4g!i#y}~* zVj8_T_WGbM2gj}aUPl{Tj4GFw)Z?W05sT8iGLI(x)j1cbz8)euO1w24#bOR@M{T!xn8J3oc{>?&P2#+(%2uej8Gq)S$=5W5ZzHf4gyaKjCMEGR2%n z&i}4iiL5Ld$TWg(&V;~DmricR4dc=0DuoRN@7Uf5lMp(FMz7aQpN3%Uk=$*)OU}cd z?U-hAJ2Sve+Om+v0?$Jk-Z%b$jX@T(hHwNZARH9(g+PS<)#_G_?R5bRXw2)*BR-V7 z`IG=bcu1Z=5}0-OSCyj;2;dA#dzXw4^kPBEn5cCISqlXs=fqY{F^WJ&QtM&YE?y358#=}TISW2o6$LRM^p{g=`qT^90 zrQ)_QD8+pX=@+hbnkbe=#4dgnY@*;r|Bows zAObol{TNme!SLwzATIT{CP9&dHJuwXLLg9Z^}6%Ki$fuVsH^J}a3AP95wI02Ad2-t z-T_dPZm9MOkU)l1po6?pQ^eSR-cg?3Nm(Yu_2@ur06#Aoi1HML~MASHI9p}=7}bZ z<^a*iMQw^N>|rzV2xlIa=5b$2{rJl|>m4dJYRo{|R3L>JZ`pIQjOm9Oct&Ii8RJcj z^-;9>WQF;RX9*<|O6L|alrRd>p@L5fC2W~!e%@*P z3oHu+cp>f1g&9a3Omh;Ub=qxSLl4%YLv{V80Yve06x~e{?v1GN6C+Z=|R0oFi;mE{X~i?i;f&D`O!&LDoshty1LVXLLZ+)w9R$=#CSTZQrU4;2}#93&EAdFx7 zZPl&2!Q-pMo9(duYbM1FT#6ltaXA8n^B4>0iM2f#+KijXa8)1er^UM{D~N)9_rQx2b4eFW*f&L#`b4)u z)*(8YO}N7jE(Sf;iEiUca=FrJEb-|v@?QdtT>u2qt#m*x!#UHhMdZt#f1Xo5Q3=AV|Bn= zAMO%fxL9}2en#_oaFULw?cs4k2=9N`7>)|JSlc1d5QG9r-8@`JD`rmLb>_ra5c`h| zeKY4m#RL&pO*G1>HEv$;iL!h=l$=QiHNAqs?p3I%ynkVv4Ip5bI;FSbE(bF2-p~Bm zlWT{%JteNp6F8s&5YF^nkh7v$jYM$!e4299Kh&`VK$=)DQA^60JQl0nmiAI}S8ZMB zhY!;r%JEv%*bBu~zN^Ed+P0ACpUZ(*OZmx)SmurshO!-T+?gR99-(_!mYAInsA;0Q z<#MMn66DAjC?{_Y(MHb8CguXTGHBkyoON1rhI~RLN(#R8BNFk@`kcL;cU|Laa1vHH zkq8@f_I562H=Kl@&MrZ*0htoV3`@hWh8$k(OBk$IO-gqxHc}6$PC62+2FJknWp=+n zpFt`ZrWyo2R6cgguttNH zQD(8ur9k%`>yapozO5UG2G8@knt7>zW0(310WVJ*<+PIBf042~-u#q;QH%qh>N((a z*ov>gc7@+piJNAz5i^~-M6*!K%0W&)b|^_8SsjMMiCR<3H_!b`!DI{^`6YXXll#$& z_JU+luC1#6gwOgwE|(>k?FD#D3T%DdHy6NCd=%LDc(dQ3|7AJUZ7!TGfUKde50MuY zp*Jv)A)Z1e<%OzlDHOv0G4<79QFzbS(o0B}bc1wvccUP+bR*r}9RdQ??_^Gr8b)T(zeKdNPlNIUeW5A^fHc>!*?v6Cw*qnkP6+D$En)$uG>1PwT= zkxG~ltMCnk$oI16WsnleC;j5~!<{XI)s*HE`+~Kj#7ej=dwv zV>~A1$;D7_2sR%}PBBtV9c#LMq+b^GYn;D7n6zDoT_>bE_0QPlI)Rvf~u@I7;H&Ezxku-)q@d9(0(d)c*^l6 zouDR&`R0mVX5B%DX>F}hs?LJX_ax;YhNbCqJ2zk^r2e8AxgkOaTSPytl!Y7ke}b0m zEB1&XJ4|)P<#!S%^EI2muu3Sv<*LJff`=w;4z(Y>;V}_><`b-#g&6ZiJGq`BN_H53 z+9aXfSbaR{i}kwbk}BR~OBT;SzJzidZN2KS0HNrlnbEw(@Fghuj5{+m^&rdNIIIK1=~fjvODh4+Cq7cG>HPB&)!dJ-O~^8^oG z;=P9h^A>Kq2gJoV=|32?H3V@j@s z=Tu*3y^niv@3?G?+Ey!iBeV>x4|nG|JW|Fqh13nY8*E5{z_EH2o7dkm7Rr<&RE*kg z5s(XOaPGMvkE2FAjiGz7fP9XVZDq~57EP7}?3S8WC_zP$YdyXuj3o)!ptMZjph44KXQIpY~IViSL=5@P_CWklXaF}b_Dv=$H) ztkkctc)qK6c7w{@z8~F**sJO__6b#N4>ylVdTGM+2?W5B!zt|MzEXNE_7Jy$?ze1m zK`6Nrsmcze)~$#e?_g*rtBM>{nfP5ic;1!9rx)peX@m@xhzs3MA2OoPp^1p%uu{x< zF(yR+#;7Yt6rgK)v^tI|rr)w)yEt@Ya(^)8?go2AmQI99Q~M6mbC^X<^lpNj7sqLD zK67-!I^yPfrd7RV7X7q*vp=@3kTVa;tNN4o{Rc`U&vK!MRdKiEE{Q5COn`^B%hmB+ z%?M|AhO;VXSVda1SbTd<5(Q6l8mhF-)_x|<>2IxUp>CL7uO=>U1I-I^w&1 z1$$Eau3rwOeIwlc1tgrc1XotxW87jM>KZ&CXf(6U$py$|wOHRWlh(78;GZ+SM{>4Tl@S-fjpv?uhB0vExotjvY6;&RCgx zCGsI1aDZhm@dIexZ@n7|oaow9QCd4Ud-G2>eIoN$&9?I_?w}tZ>MGhjiA?%TV)VG5 z;@qp0um6yeKo*!lsrROSGmf1-yKhlczGuO)TYD@z5dc@SzE_ZT%30>UtJE#FDb`)3 znV!sh^|L}z*Qa#B)lYck|5Ss!8mhKh-VSu*qrsrEso^R?kcKsuE-!93qD$<|K zTVw^GV&0lO7Y6#=%KZE}1N30aj0e+U@hT{CUql`-r_Pe|iXc`&5#k35bfsquZs_a+F*0M#T@-{sV-x~9hV z`El*pwnD!x=m=cw`}}BsH)d z*qBky^CVfLL5^3>K_otKS-v~6NwP!G&G-~1SaAS1o-;R{zSs6K?sC~`diUEvn#*Lwnfy^X-G%gHym3=?nf)U-i}*F@YcTFDAZ=p(Gw z2is;kdL{GrBxM^M6&-JV20QeWQ?~GhR;y|tnL-wlDOO&I`n^Bp!tXd;IWBMYIPH3R z*cEBEMiVyjyV=OOYHz*C^1ZyNDk}#WhJkH6tZ!0=tm)c2DW+eBS%A|h(c6xeuSx7M z->2@pZ?=A%s*m}~e6nnM3X5+Lj-6TKU=G|gdc|3*>n&`8Pv>Lyvt3@q8KqY6zkL@$ zfHo?At&O$lu#i#o(l?w$hB2 zmCdG`+|xhgG?A07AdqksOX4%L1Vb0b4TKmUPek5knR%nIA3*w6lQ&LVU!8aJIZ*-! zZQ$qtLvg>qE&0)*#dLF7^$qb!RRMEaJL-Ltvx96K2I6`6e2ECMIZRHmGu9&rsLuXRsX&QQj~#W3#DMt4utqQee; zhvDc7DbsMOhj;*06^U(G$8@Esdvf$Rqdb8}`A11np35%6Ifq=)4SEyeZwGNnkLlIN zCZ}j`IA>*%%p5TL5BNEA<(ty$c${WGmIX=<1KEUvwk`!5L2);c?Gfh)tlPjSvbPP% z$gB)4FjLd&lI)6FBnV#=dNY%Zo_H;+`en|n0;b}(+AE4e2LXW$6krVhBhAbWWE(dO zg<&V@bz_3gD#up+22%friKnOQ_N4*2l_cuiKrr^NS<)vk0_0U<`@_!1`{cl2lP3wK z;l8-be%*70ZuiONKgHd3WQh($78fKD_}rN){bnKR+8eIDHlz(e_Qp50htUFVydm-% z*tD4eQ99?A)Y6%Z|0}!W239&tb4{%gPJAO+l9lsq3Z`zE@Tz=W2ik(Pb+#0FZsfK? zr(L?W8_|}{&XZ1l!#~NlMoaaH>dl>} z%j1d)VoJ0=VoVD)@8hn`dQB$i=a|n9>{F3$;Lo;^Kk$5giq_Lr9|^^&d8O*;$o;BF z1eePtDQl6>`_n5Fpy8)p6R{DJY!?&nBN7QR!zlD%IdxN}_%CMs>ZrF*|iL^gD^il1LAs17B5 zycu$8w+)Wt^cTHFq@8^yZiou0V>&zN`eF4mCTJia++RK1I$Hp5Ah@k4t9KQYzcX7? zG_d7AEuD_h){cm(<0L*V13 zO}j8;s6}M!icmEkIHk@V#Xy^QI&LqPh$gI774bbvXMyM&1RDE~I>ld%fLb*t$IJ_w zXxuiwO{PPhq^;v)yOD8~xGDnh665&b75&2~E~uvchaLbRc}B6duE56V5*S z8`|)op0jp)h*Ak-F|NI*&9Jkx6Kmg|HR7UwNpvtwhm8*%7ld>l`aJtJjg=?;PY`Q{ zzP>sbe8rZBd@j#qd0hH%yYbt>_L9~CyxOpP5_>eDgRX6VWrHWFQOY6e(*5PKPuqf@ z``a$V&4B!;=5l{r;l$%|92@JxU&F|xYdZDbLvOU&wl^+>5Jgn%oGv2i@aD5_bA*sl z!gLh1Fz$3ei=QBu*h`(l7R=`9{+b902_2g=;(UD1*X@~n|IzSF64!q=ti5E9zbl>B zGvQis7Zjqti`~2fVX~T%kcum{Xm2~Gc(&0F8XCqn41t#a{nDC^z5SRyW|iYj;bgGf z2-eNq5C4TW;4HqtuUR3*Mg*uEHBF$xbv$voe`hHG9RLU+eXVKoYJM=SV51?td2@CDCcxx3 zU(rd#tlxB4{xwADX0=v-tzv^l6L!gcWrePVbyKa#uSDn)5atT+S6w}yF_+BF%Eq{m z-#k=br(a`#%+f8!M-)JLMnVZ5AxxFBj=}8^c*5RHY)l8sVw7UkNgo|4`aHd*as&{u z7JQ00rjUQna;;s3bs{wKONY7MB10ujw(wSkb66&^8&<^mx;e%9aoYOk%UFI@8|NPq zdyXX_WV^7$V}DfPf8YFg?f=|Rw}C*DJvq)uwlBq0hR0$szi2RfDDt!=ayXhL;D&~} znfU!0@fke!_%kZ*TgyvSACl;Z=Bjd)sN8saM1>9{dyr`@ccwb8-V1n#t&6K z#e2lvDsbd}dS@5$a^mk%w9Woje%3X}(4Qw9%u}*t0=${AZegGBKFY)o2Z<+Nt}`4w ziuGlSQywg2_@?3=FFwhkeG84y=N;`pVcWg>)e%%E`lSG5T_--9T_^KZu$61r{I6>_OA<bdpc0C$3H4Pjb z5u{qc|DuikdbP~f@gTN>XPQa4Yx9xm(F0K;AOfA0H1^WNpF~kugPN;x{;mc0@K%jV zWbWZpO9o3?#%)4LliLqS&zC5~3lT)45`k2uZf^A$GhllMz_Sg(0;{kjS*_O3ht5tY zMXYD5HJ|hOw)R=mCj*YiGEu8r{zry5lafCtD~AW#F_!`4@;-CZortUU zE&_ci{M!L62I?+mX4g4q+~~UVZBU^aLNM2jJ9^DNuluG2q#3ar8ivf& zBQ^83w)#rcv~_8rAqAqC@@n`ffKU`+#S1$DmqlVzYcgc$FC90~(Td(UE>BjS%;0(d z`#5T9&6#AfpXNJefT(clB&h!rMJBXBK63$3hxw(yv?L)ANs!3fX#4 z@p$_9XfWopz~Y8y;9`TZ!DlSB`%oG&N6!LV9@bGtTU!o~l^0M8B&%{e3@7!gY=77u z)2NtRiK{`oB<*OSk(BhgyC`O=0L^zJpizh)3_Z;5q$%*aZ=ijM2a?_~yo3C}7=UCR zGE4llFjN{>Ajb_9k;SE`74^sLb<7du4WDFG%iP?gkb&HZUyxR@f5mLP&<;Ujt#DtI)XJmzcLn^=4DivWpNVldFHYnR>uw>rFw!sU55U~q^>T5s^uImNIT}c$ zb#rm~MbvIk$bd-7AM1bitN3vP&A+;=tl8~kRqwj{i2iX#`p=5Mh2*S>CZB`l>JroT zABka~0Tq7DX03K}lWd5zNuyfz?`jou4c|)g6@(@K4@k0L1jit$0KP4}ZC@R; z_XSR*{Lw5r3wJmEoWM6&rnJO4JUoP8=k{ka7l25F_(;yw62z5l}$>EV)n zd!R^Jg)Lk|Dfz;WgJ4`!~cu zZ7xf*q={^xHdRf3Mep@aqd0B}i;B@{N`vZA1v-@9#RH)b%l_D=;D--xdXPNr`>Kk$ z7J!Ntw?6-PawYP#_G~nkBh-h+W(TXO0x5n)Zst7Q$lQ;(w^yw_U3p6igm8Be)S{Qy z5$gIX*S&}|A9Mk*fu{78pNo+~hb4z`d@U{oviM%lVf^+G&g^zKLVbce-^Nr#-9RTX z`iX%zAtbIF@YIwocmCH6AX$nR_8Z~GGV4S#ujY<@@T4Xf3haNA!pZw zGH0DG2Wo5A3;T3@E-<#@&LAsQUZ=HQk`kg4t7~boL0hMd9$h;Jh^dGG6$@1dH0EY? z{d`XCc7Fez?0GYZ4uBqN;XU>}R)UuxY-pbCb2o3_&FVbAoljmX`e+F zvbmm9(2#)bhEO$dd&Wnr%Lu>n0L{PmITj%hKNu25dFYo9`a0MlcIv+7YyCX;{P^5R zYP|14uq}6RFZiy}0~lL%K5 zcex{BXl5ojH|r~O^vcyQDq}SM=H%xe%36{r^7dyZ4HP1Ph-#fne8>lPmkVL&1;Vt zkizG+8v-nDUCYn$GlE=uDCM}6WO|LRIPNq;{a0;&I$Uq^(6z9;cX7w$eGruQP}*kd zxjAdYvbd2volrwH7{L;J4W8tj^7irgmU$bwk&@w#k8 z;vr3y59XbL2~&ezEN${{O)^T&ZU%t$6=LQ>^PmN3uHD*dr|H42n^n!(TT>0KAr}>4 zwRO$%moao5W08NN=s2orGDmRWj_8{T3Pq#Yxz;AKW-!7WKsiRu!SLZ?zvkn#c(SH7 z!xavoa?R&DYsS#8AN!}NP+eme8n+ z&;!37w3`T%vsUD^yYOxpQXH5~i9J~P_=y*XvVI8p)>%CJ)FBt0C>`*MXn(9_nx|S6 zAuiH8CBttH)T9O!CO|=q#0q49eDGjHje%UZskxz$NqF;h#sot+ zLu$?%eH+px{Z?dB;JBOeuZcI`?wF+*0^Br&Gb+_@PFfKt4kl)iGTY~DtbGUSlg~BY z(lCX8Y{a8oVTr$~z`#DkmFQKFSRF%OQHuQWJy_?Tdy0@kZ}9Yv@oeF7tC6KbSK$~4 z=M&%EfpJc(wYdW#$(3HSC>R|MEq?zyDft#scRui-A=+MnbEi5w)#D>UwE?h~&K+x| zxM7i1*}(3C4J#(oKsdQsy?}5*05}qcG1EExBlANqy6en;gP1$U0y-}1^LuAcm2Az8 z`&F&XFXKOUR^2=LS}u{*WViU(k7Z6>ep=i<}KS z0YOOo2wms>rOxTTUn7<#ZXqM0GiiT~*%zz+0lpo(u^qQ-uFB=1Yoa~_V(bXPaFEfT z(h)+oz;A1zIdQqm|0X<& zpg|wIi_ga~XFAoZC}sS-V#;|9=V!ll|CzV^@pATz1<+gYVsd)n%Cs zmISXKDeXtTAhtaQWRiN-=|=h3bvy=>IPTJ`o7Hq7aqMmZ1}RC-VJ)`Z5#-w~mf=r~ zXXoyxz*$Lw3TvFRCz@H7IcEU<(Kzmcy zX6hL<3d;q+GpsXOHhrnS1P&aR2M_;fH%DtoK03BqP0mf~&2sh9z&;x5yu9B8HcBRk z)}8X()@XJ9{JS0lbjW&A0#uHQzn1kr;Acn=W`*4-Z|%oNYq!0+zod%^Ukx=$xNF%h zVBO(Ur+?`|hTPvOO08HPJsjujkq_PqA&L*_<(mrzev{%3wcbhWrxG*Wt|6;;=*jFD zLR>r)xaJ~Q8BQ{K^^#uy_2GpdtO5&Ef)L%$A<;QEylK_F}|O}g&r2*F_C4&B2PP_04iE#WJumj_693@ zbrrcubxrlA)-#ziNQevp15uwa+0Jda`hQ>#GB0Y3F^M#=e)?Ye2N?XFd5*w}1_VAl zDI0SjUZ2`M3OD3yBhiGL+{HDC^T$nNrn$ncPfNZGR}X9~I5;QoBA41Xs<7Ca`mv2J zPjtMlmoCb{pjHa3f0rtROy%o0_v5+a({1$J_#z2O94wOS~1Lbs6e{D?L%z^Y5DwhT*F}o zLMg;v!TaQ#)g8w1{l+5Y`-eZo2Ohk-7(v@l2VT;6v!VLKf45f{?+@%alN*kg|A4U` zhNJM1i>unaf~qZfekQ50OyvkH{`9g5nvos1d3Mkn1Gkq879rgvT-v+sG8_(ooPnKn zeg+e5-4(=(&1U4MVa)owCTDNM!tLwvI$oF)RKC&{wRCs=0z zxw?j^2wO#Lx-cH*`LS;LDQ=S_?^)^O6C$gUs$rIv=>(KO-h@LAPx>_o8RLT`+vp4E zJNM;9w6%?~3qV=@k>htbr0EUJp}5YrO=0ga>ZbnQJ2w3p|4k{3`1H0* z^b#Y#_^&~S#K~wZ#+U?|ui;-aWg|3df(j4fe!lSuH&>8S=;9N6w0QeJiyWdi8cv;i zXV1}RV~8>KA}cQoz4_&<{+d;q(EbF1Uc7zxYO9~lOqZ@y7H9iBdF4Qo?7^0y`1X^* zCyY0chntz;1Re{02D#CzKJSE%_Iw6vGk7ut_RE_bwCFM%FsADoJ;XmaOCIgmjb5q0 zbWN>0{}JDE2}kn9lrdc7=WmsMJBan2ah&;^+lnzFkUKaWQ@b7%zg#e&lz@SmA!31~SEq77(rVR^E#wF`7h4^!-X{E^8rb1)h zrn9oMW#(iz<1B^xwFLEuV{ldDcUG>Z%{zMkiU7HL_g!@lT}PPDhYjS$=>u>W38~j_ zh_~XxVJvl&K%WV8*mCM1FI@|Tbzk4RTm7m03OL;9OMH+>&~_-?HmAw$?NOIxaJx=v z4aG62do(jC{<{i=7Yn^>kEkT*e4qcq*4O7EMA2vPa$>f3-vd7krFU!{feY*;J_AoV zC5a6XKLg)dS&FF*EzlaXVgirbt%*>2`ZVU%%0Rp;TeY%+OS)#`<=_uMMC)X=i za(IhQ!Y>1DPv(xU{r$~Y)`vW&aI$m!bL$IYDy4kT$RaW+kvb#+N45YWC_GVYcWkj50gt(>$zgVIAI-Jr(}nSks$*^oSF+Q$dTK zN0(q@V*77!HUYS8Af9Y3gio{4?ylaqcV(^o_>0YtSW6;y+7RxYZ;COx=IA0}piP9w zf~lR>Gfp4M3AxBVJYC`Pc5&~8+!EHkmgE58CP)wY$e8!0u(!i9OT5rO2ZldjkwMs8 zsNlt;r^rOp(u}VeLow}bI-N8(IcubOZNlD46`9zk5~2cKEv?}Ug4;;Bs?NY-silky zR54Q@|CerZh@k^pfV%kC>^Xwep=5OZF7PG-g2#(S`6m9pevkxGbmc?{ncP5p(77Xw zXbYn93oTT`N~P>l!8Lh~4cA~U0IAaRt!b?ZYlU}T0DpbQ zy^6zYj?ka4+q`lSpI8(w0oSz_4?48uO*Y}vz@~!X+^@$`j`$ntTl16 zBG_DhRQr_CWfH9=k`j86K~=ysr9s*Q5$El=6;>UhK1Wt|XCt>Cu;-9W1ZbB>eraI8cATfe<<~ zkQYlYA=-0TOL6e^q_6f+$7ec;~V{Fp|zv+36^csxOP+ z$9N}h&F}B-YxVNSS1F;F0qY}dT`|||=-Ka42`|%Yt?N34mIA-lN{kN%N!&QFlat2{ z6MO(GKcwq1pKW*$w`%5 z{cyP>VeQfUz6Or~r*?0ssY+Hoi^pF5gO`$U2pkW01eys2nQnp^_9<(mW%hrX#^4|X zI|grpeN2dKOEsecD82%GG68hCmn43gGZY?ZU#(IgA38Lnua^+`7iZ0sXn>358xV^c z^pV24elD{@UinCtHH0FChugtDC{GqJmT=IHFU^yAF#*I9>(J1q9uNB?Z%EUT#or*C zpF@g6Ga%JE>M^w6XBXR550#!|EE^ZCAA+Tw2zxL`klwe)HI2rQeFBF#-V6>FOjYye z#3QgWJz(dk%${RjM=&b8erVb3qiGr6Aa&_V5%Ga25NlRzGg&+&Omm@zTz*`9oeGAm zLJnl`suHC$T}4d3q-kdF0v=HMOcMGFsF4!8 zMX5~ng1$Obn`Y4*UTFVwfmJ4Gzmh(GyA$?;$S@9w8irA>$2md1k}>3sk>(YoH0KT9b@TXtWO}YHCC{-Zzmtd<`5Irg?+&xhXA#(KP?8_tDJKWc$+?s8><8 zx+*|2Hz~ATR_LVPIkq>ptBuj!q(&wgJiNX6ArZ0wI%u`<0CpC&>%{g)m?=2wXUi8S z>4*!^(ajKy0AQ)MtOPcH{^nxjBpVJ^1kFW@N+9PBP!1HtI9TS9l<2a(+E01;o~RBT z3d2aUrAUE>nlCeMPAm6A@E7rEMOwzom0JaHGms87d{r3hgRc~0>)^*F+HfZa7kDM6 zn}{z|snpe~qH%f+gw^U`}s8Q5GbjMrf zBJM;xjgF{utDx>GZRp{or7h}{MHzG0*4F&y6gaFs-6Uv}tjyS3$NIL$2-<;p-!cK;$)zGgAGxWUK4__a(g(0de+xBNbjY$+yW@@z z!D|w8i-j*X<-vq%Xe2>FCD8JW=4|9xUl> z0e_!PU_#f=8due$HO4~1)S4~ux=X29G|pO6IFQD z!M-M9$<^ciQ8LuZ2HIPc^%7wCPZ+T%PChbhs=Pqgi}*`pZ^^|0d^!?H%B5m&Fk^d&EeH)T;Tx<82|$VEtS`L(QtKXK4$!PK#V0`aLFu%O5~eYs|@#DK`Y| zV^YSvlN--PONjhYTem|H4+(&BFhY0q-N7i_^-{9$sg=`mm;K`V-ydNJK?DlVNByr=RbuAd{#!Vr;uzH$aeZR{e*EjT{GVSX#h=v=}DAiOFW1Cf$6o{p9 zVAndB+gr-B+LcO0KfC`)8*(?#KMCzWgGNSSpBf`-mHYndT9Dc`NoHHPp?+#Y zOp^A3*62`c9iMiFiaZT&$m}dc%;x`k4c*gIDQ_T`r{CJjs_NymO+`WS>(t%QfiuI) zMw6hg8?OKj0>(?Y3LM>->!z>}gO-19#!ZZF)>GgnNs_Y+*l384kDsxeH~Cn2wT8Ca z=C464^e4QM@rvBoGmxHJi_zI5F9cKk~_%#O9 zZ=w*5Q{BZzR3n864*Q8<%s7)y5e^t}WCEZG>c)z5HG|%u0Owy*cYLAjKdxoHkkn8*9kiF?t=CNs}0}+O}|KBm8Vw52gR6rl<}9 zDTv=R1k{|gBK@8SGx+=QRO~Cf16H0dc4!BFyulS3g{qA5H5$Fr0m>U?r;>Eo@sjM6 zXB1{(bdGQ?YHr?SBnJ4W0Q~dRwU6lD!`r3>|e-Z4`j%-sai*F+Bx7vphLzBIh^ObPlIkf|h`d(22v% z;HJ(6Pg{=>cB&NHio=GFCu8Hze^FYX+@F;q;*6;M#mhW${LAG_eYNWQoDIlb zq=dnKtU+Jj*=`+&RJ`i)I4ADi3D^mP+I=>4=-b%LVRqzt`^O*uxK%#D&<O$mWNDdFNV?N@z$Z`XPd6*e{7sM5&-&eTs6M5dbAN{nIb{|M7^_HtLe+dL% z0a~zM#=Q`pF&}o=51B2ebJoQA7DHctP{S*z=3_TxH(jx%5|t5k%a3r29$PWf;aM^b zV-2gUvH_DeyZ0&@LH4 zYcP|+-!#bL6AalS_rll^?>TD$c=t8FXZIyIBG%R~SQ0`n@X_&8Zrn&xA50VbDMoQ0 zKKE?Kr+2*mZk}W<#K#+`F?$>-=!M9RJi0a}&l-*}HS=4Fjh0OpahJI^AP0n=*(O1b zyr}7@4IN)s#ct6L5{Q12Hr7iGmjt4#t7a9o(BCtsCt)GHwoJ1QgfH(kd#x??Uj%_9 z%UsvDoWMVa26A>BsG)TO?&r46jbc&IfkJoVR$PS(HnPpZ{qMf_m)KfXUKt}sev`Ef zT+XY(lH=uO4xH}U`Fzkdi{L_kK6$FFcn4MKw?+z8Nl*dYl-&FTR^0y0?;C>B*K zrM$%5rL;l`Zpy1*ymJrfz6NNO*mOy==o$YWrKkpm0)SUlO%!rO@EFiOL?sHDCBlP}Q<1e30SXVi{krxiS zo-f(a{`;FbZt~Wr50zC+En(1P2F3sv?-Cq{$NkEL;t;STKUiVKCt_{mbIAA?n zJO1$lSpIK6rZDgglnhw5^^l(@Qt^WNOFGZJtB@dN6m`$LGgu5171QhQbO=RUAH}sB zrz|`$fvO!3#EV+ohH{$5@#Wanjt30ZX41leo*QT4(&p?Kax&}Z@eg=m=Eno%o2I4( zjQ9hM5%;0=`XY06&GU&n|BwPi7Lh&fB)a$hU&d!bclZ{@n=o#bGN>vdkix8p8gDc# zy0{G00p$Z7f=fvxZTucf@%PL=r~yBRTm4@M!2qB{5@)|JimC~inr_X+2|8x6Vzz-9Sgz7}zZkbIYhPaFX^U!&giD%?qsLZZ9ukVR`Vq3KXnzFi>33Qx3t7fmb?*J8L zwO~r3_jv!024IJ$w7Hm_nJRfIX_qGM-7YclbI4TmFC2s|c+M+8`HE$|J6HO?P+C*4 z-@ka&0u7-YO0Ob;Iu#{_T)9o=FQ2o90t~6qHV3IBc@C$4tHR|<)kvf?#_xrRgL9G+ zEGeMaqwNP+R7?&Yh8V0OU!q7mHf`5ef)7*8i*0C!mGkI)ku2Gv9X9%#(jf@ zweC{k-@<&!zJ|=|d|eF370-x`dy~DI@&k-Fb>wvL?FEMh#t}oc7j%c^Ba0*Z)j*!< zaRiJNS-id*6K8cnq^LFm(1cgPW_HQsRiMN+M=vq7I7yWKL&Xj-7+*OX2(;aj!TJvP zszazeuQUce%AA7YXo!8dHfT%X%Rn{qYWjz`X7^tKBOr+d0sa(VKF%% zlG$ySN0RUykc*(Pk69Vh&i2zHG-u5jSxtfiJZac1IahTU>JR66MZ`r*sTvOU~xc_ zu=5jCX(akZNy5A4!6M4>!NH;KOTGoIFb!PA*A`O|`Vs8ucwS!?4TU*^PtA#VPQaEs zRQASay9cml7*qCtPY@Nv-CCg+W4{wr5ClD^pb!zRHM?s*UD-cJXJ%&`vZD@a8u(M! zIG0!t(ZY4)%w*3XIiNgL_e6!Wi1 zT$IQhkV;h<;{!3TFDV(f)3aE)jI9xg)0RcNKzqSRWnK1v0R|2Bi=!v<2TC%~*=>u@ zr7V5hu{Ouq16w07o=E3ikLSs3EH2jIk)G7x5Fvr}t=tt4lFrasPlE4EcZ~JnGwS=TZ^GZ4=={YijW~eD5kwxi2jp;Ymb?-{Z^E>w z&4dKfh|s59j6+uO@!=>j;h&SA<2^7sm}2~4oEfsU5nebqgf*K3K64O2{#slQBWX$x zUto=N)kKPFtBH^45lONs)&#PFxPbLZBZ`Q&7;oscA~M?)>rYuUQw_Rtcx~zg1t}x_ zRE}?<2MTc7I{p1N+%&~n@6eagFM03h#|#A<{UGB)Hp%#V)ciW=L9cP} z3X5qbCCjnBLJ7M-ofrB3{=?+2^nv&c?o>+Uk`wEaqL(f4!3MwzvJcG@1&#j}S13g! z1=^+(!(*sNy)XUo9VCSewfa>}!n(5XhOTlv{2$D3goldql>wYaSf})| zDma9~b(OHN#1U54c_a0m6pfGaL(&9{dARMzT6EKpMJ=)2a0~+NN|>H|vjJ*~YFOv4 zI=Gv`AI)^`nrGvaQC<7qvJ{3@vZkS}_ovx3X;?gDEOF=Q89DGc@x6ytCHlxZz7Dyx z{|reA{l}1^x9Whmv*ez=asR40s8G9#u2v1l=A{3FSx*80dDY?)?I4^!w83wW>H zyy@>AU@ zOmESOEpn@AD6u0%_m18V0w~tP%m={2(}eR}Hn~7Xt-oNC6mr)0Q%Ee_57ujPuCiEs z6w$G3kkVeA`y#9IS`OrrW>oBb?C622xF1fHlot&u`P;WGM4dy4hV7^cB@9NxZxuNB znwnA0yJDmu?`)fLV+Cty;7`0R^UPhVTv1VZV?11K61Go}yfM6e-nsJ7>--mH&_VN{ zLQYmoPLIfK+kQol+)^Q#_;h=;u%7>4RKC7LE}FJ0JP+&QJy|NjfjqkI9Rq297Inyl zUu(NIN+u3D0nu^R24Q^GX2S&LpA3f+MorMRGWyph>;DU{K6J1T*80yvkJbj77MR6w z`7UpH?pdipLs#!dQt{fBMdB^Iso!e;b^wsV#^Z!;ve3N+6^|g;%35x3z8|0sX3tRR zmYMw|*cc25JC{o(qWPquk*XHm2YH;$qkRN!XdF#ASY1G6STdL;aest=HSqF3CcCT% zVU%4bn>jvf7ZwzOQnY6@M$j$1u5BO37L{Kz?NZHp5@^TEv^Z z`~}ANZ8e5&{b*xKS|v-Tmi+R6Lk<)vG)#H;nXkh}siCqFFrxaDetMK%;@;{W7O1^M zd)B>^YjaFAaO#OcrHOwcjW16{(aCyQNkQXeL`u-ED978KKGwV4xd`$(HIz!Wn1TcX zIT`}d3-Qt7Iu1?+95t?iCgNMk-`#f!=5BV+6kx-zH)E z-xIB_8Q(10irYhD6)-&T0F6?QrHtD$2i0(^1@4AcfM@NxZVA3ck)&NX}Xv!1o?T45O-E*jVb+EYJ9(s3>@)Tl7O z0hkTTn=8MOjhr|*Qjk@I8%R4n&I8!g6djUNiOm{^6cA8(98Fb`YPdzPsiU~Kx7BI9 zW@7JMS@+-kGB5Zzz_@FQKsYf3e@U*9GQ-dm#kDgi){+80!xbyS)#VGpc1xkdaseV@ z6R11$a{`nPSs8L0%P(@jrx&K$tqSa8+*cW~@(d0S$uVa3aPi=`OstbA89%d>0Av$` z5IL}Pyr*CmaBL|ZtzR-=Ijo8Ex~c%G%W|)RB8Des9Wp@4$IG8!j0uXWbGi-nB$Vzz z*AhI-iJCm@gcH0ofD<({T@?fA()R_NOM&#W;#3Y_Q)RzW;KyN?#QCn2TF*-o4;H?f zZ}{tm1-=1q7yX+-P-Fnq&E*WHsBl~WTD2Ky3m*56^B@B8vc+6L;B%tcvChpo!D5Ma zQ#fI|C>7(er*c&_9B;6Bpv0!$`R3h4XAb4_cstCjdt2MBD&E zSgFeDE=M+g4!_C6BY`Z+see!9NMG=Ey7@SWxTt{YguDHT3byw!O-r?Ew#2gv92?@2 zV)BWZ`m`FK*E>cQS^#gDO&T#mV)^=0cUzgK)AoO$xINM%>WOnFyC$Jl`t76S85lT3 z!m!XOHrkQHG?YZ*48;?cawvfs`IDT7t+O-;HYIP_O%Y0E`Ga&3tYs2MZqP;27A2le z9*}ox9I9AB$u4EA8!MIP$e1ucrdLTV!pUY`bIZ!I-!I%(Y%V~1vi;LyxE)L5IjBKz}1s$uuihZw3r!Ff9pocU||4Rl|fgu_K9&H@NJ;b!R)QD>_N3%*9#|rk??1cE3VoVzfU^J>JWlx?0%E@L$tT1i9}TVh z7;#S3;frV7%Lwx4rbIQ842&B*bdoZ=^8|z3RxUczh_WVEB#N1$Y+t_@e_hkcQcj;|;G@cEb73jCt+s5NQpysyC^n5@AT{gB6Mj4_DTjg(CmGzo{fZ zWlPUm0%t!X&n}_9^?3STgZsrX9dx7Lf?q?Dk>j6u_5cGydf z%^(XbRt}^OoE~-plHO>&{z(7bI`92~&h7n)#Gdg}Pkls#Ff-J}#RLj7oXX9e{LW(^ z?&xXp&PYPmpj*6J0?;;Cz!K*2EV*viZKN-WM?BRkR~y)}SO~x~CU{ptLOmo%P!Op% zYemg6yEUgS07%c87?M9EF)LIgSEPyy%a!OHQ?&#KL(T)=dw2!QrZD)GvZ^w&FKD#y zW_{SdWYFA%k2Fq;lMaJ(#Vp8$GL5UHxVN0VJ5Jj<@TT+`&jFZcpo@v{w&CJwkrGKp zRmW(MLa-0$KtW7cV4OJ}Xal(vkZ=q3_-K^U55d<~TL(%^(}tC3(NjZtHjU9iljL!& z7EieJTM)F9FikT2*TqKpCUnOx2MVj?lhh%t>zkt}KlAi|g zV7H~c0N3{njxG?G4iAnN+tk=ckX3WnN1XhbfN`tzpkTQiDbTSIH;(wBDcMBTE~pRk zx`OO>5eY#TpX#tPyCj>hpL#@`91Z7{lv7c`L@}o0I^fOc%=UpF~VU#&$58kZZhP(kwhuJae&BDqX&4bLLdXj!tXWLVkK zw-iv--RQz%)@lvvm0{Z7Ab*<({sSRhw-AtF%VkWC=XyV&9LNNRZTj^fP8L<9F9rNX&Vvo7<&Z`tlH?38qfg`N&m z4#FKix^GG0&s;YtF%Ai2KNF4WiIfQk&AJPQlfMx#*9SXwY%C?5?m4;s_D91A!H-jN ziNOmdJTlm9Ek;I&y$X)mtCQ*M@`0}|Tc)<$^dER3;f4fc<~{c0&cXJ668sJ23*XPS z1-*H_atbpA?DPIniw5D3>Ys2QPcNsZcY6^I+Dnq%TJyVV5X7(;ES8d-zRDxAqNS$F z!GS49O{GW*UQ7-$ZK8%kcpel|eSMP(l$D!`5wXkT3c8auc2U=vRf2;qx^$}tWlSc~ zH`Z!q*w-f`S}CH)$TqM|HmIl7f6t~lxI8Z}dm6a(&Zp)-HHkdp4(@k4b zY?3%XBYrIC?I644l!0QF8%2|7_zX;2KwAoVfTGa9xjfbVk$s4HfX%?Ve4#J!;dwmC z7k}Y^(u^a`ytz*w*hY1{ta-&7KQ{_)eF;ZQTd!cv{HTAN z^p0f5u{@C5M$V~+jqM{6{K3EcjZ9pcaDyaqkqOJ2uYeAxM-w}12`$3Lt+=^7Y)W{XI@knKwCm4aX@yvtIBXA3~*ysq}*?kmn?zPS3`6iuu5R+35@Z)3E{+ zInjBQXamIq1qBI(38vc?BB=b+J-TbWeO0v9G8Dz|r(H&HV@NJB8)H*(f{UenV{-5M z$*R(Yu4Is9a?^rJVHF3{whbe)Vf#wlBpGzFB+j}7P63Ua6evR}{adgcovz=OQO<92 zTvI}{@`bgWMFWeHwJ&2^Mp0u#nkxU{8l)mX-BP-Wy7muCSSya#QpSoX)vHC>dj{y1 zX(;VyaXQ;ObME%I2*!h*HE^?)OT$qRTC+M_wEsSkm zd9*?Lwr8FuJXa9}WK)V;($*$d8EtPjrgmWIqUOYAGs83sprZAwL!~IzIn@4oINCD@ z0K&A|w+{BIahBC~gGd474HhAd207E5Vq!DK$myDZ%4G9I4wM$+wsPZN!h&sLI>zr6 zlZRQvl3t`O#pv`Rius%CZ0>c)o`}q6h6J#<4q^<>^OeX($;uU&obBYEN&3rr3cZ%$ z2jn9DmvNsvFA72zBFzJ@YQ(kTy`T^7{_n~2t-Z#lg5hHe+rz_;)hmJ4O3eGGG+>lI z>5JS0NKYcYc(jEzU0#9vGmymrjz6aACs(L^x1zVPDwKN4-<%qj|MX%!2@dnwKc4l= zNhj=u>lC_yQy@s19RPHlc~V-+CJ=acfoT=jm#3kDKfG``q8+NEl_)cEX=vukNc*!X z5wEoZ=A7QCHwEV}$>7j2IXSjCY&UX-A(I%TmCXkn$*Gok5VP-0IALi?Dgap}ak^Hl z%mLX{=V!Jzm%-=YmrL*4Gz3aZp39+qGe#*sJk5@+Q@LxXV`d-U} zb$z8cfS+qQn6hJN=o~V&`uPGCq1322Eb1-su-|7_7?qcuqd&V)^GTy*MN;C>iMnqu z)e~-~nII-QoSKh~t23ktr6^_b7(p`lk+3&vkx4V@S5dE zm(18#5Pqh5lgkRa5tq`5O8_U?Cz)0>=@!=8zsUJC!0i>QMOAAQ3dTcwNu3=nMu}uH zC9Zc+Is{orY8f=8h!33k>PG&1#<_)X#1q0pqJI!HQAykWw(R*((Lqmyb^O8vQ>B;4 zKr5C~m3m_B^CEJUNpTekBKP(x-ZvF4X=Z+F9LKY=V?TSs*Zl~?eP_wIz~fBn1s^e!P6GctB(K%~ZKf;!*{`RUaO*@h_{+xlx#rgclAHZ(3iatp!`AH0eI!8Oe63&SUi+roP?v5}Sp{|Y_lfJC+Wnac;T-6zgS}3&rN9fB zL(bQ|5x;$@t4k&>lO+R)A>AyiM&y((n&ul5%?kGSSqVWzd2>C`&{+eixT$v!} z5hSn6U1K}3bbU^2-5c+P!A}DK@XKwIv(^Sqsf+yN#n_-Nnz6mRscI=c5L1o(kU`Y^ zJu3OBO+CuRII2@gS;8rtTyS6LtCCBSy^vXp^babHB)=D$d_5X0#Q3sWg-s8Ys;acDO{$V?+q=5|R^ z@qy6+yTx6TSZmVAUY&{QAMu{b4O!crw|tmi}ePO9v-cx($b)vD&2?3Pxk!3OGK1^tDqwE)OBs z*Nquj8S=#_6NJ{=$tfw+N%HvEM{*C~yMkoOMw-b9!KXe#m=pS*X)MSC&=9wcC2D+O zWCBRP>4BO1(OTBO=ADvo7^o7lF_li>uA?s-@$D)e!-v!8ePxu-{SYfQ!qpd=zj{%( zHq=3!Ss6ODRg+i!U7D3+N%_@4Kc}&=GnKnflr?ZKH)~njatct3LfQ1ew@ zx{VK|HF4u+CX4_z*7MU6GC192#d^M?*_ctn3pvE|Z~aVoDAjl%&pQ|KWo;zqKj}$$ z$0ULxcJ3#x*SHG0XI-dyuEZoHkf{Nt>xt~P1ap<_{+*qoUj}9q9cIiaN(1BLRd;`u z?#&w=FQYRuvmn`Rw+R`UncXgmT5WeX42{)oW)xm=%LM3FsgQ-ncrfnqG!gJ@8u$?G z*H)H7Q;|&0ax;ctW z7D>PCZnByWVtPTMMq)7oEum3{Ut`0<82tbzT^k+R;h=fJPW8(%cZ(S(-+J@*Dm32r$?+M^`R`x!%Yfl=&9f@;6rYI)=Bzd;V zm^rew(HZdaWKvV#kQ_a+`jq4P{`PQV2}p+&v&@8y_}n{Q&yIN0h}=YwLb_J-sFtbt z@P4QXr>>Oa1>!ta5BoLrWmLGr;L>O(Lrbj?4a?eBssjqIZFH}6!@i8iGy9JE!&~8b z*U+7fzVe~dZNzADW>|0fmH%{^hWn!Vy}Jga{HD|!thH5^WL4owW&0VNCLRySs7oX3 zvlnq{yGn05e^ks#pLL<@@sFawQ#s`<1%Eq`gQeHJR?|r~)RT=Wsr}i)IAj{7p}~w1 z59^FRFUe~Z-n+tp#FFwJ?nFsExmaM3c(cLszX{|mtlmq%BAS{EQby=a&M!o+3wqNQ z`ZhK;{VYD$3fCz<*SOc`?t&E2H z1rcDZfK;nB7nGac4P_FRz+8R z>$N?d*DT3N$5sKlc6!}bb>d*&Xi!t7vB}XFpn)UUCO{EkT+zLjxv(H-6-BKLNr4bt zAnKsCi3|PHC;*QN->-~MJn|udId;}j=zV8l%mqjI?3aZuwM*cINhhK*RL7mvl40`| zN-IEkFx03sCdzX@iCZz!DA_ku)5DX=*E=*B-7-acReb_CFXe2SF#Q zgD&6U(}K1>e^_7BelGpScR}wvt+wk;!hF-8?jnD8R1EpA9ItQo%D=D*Fnn2U%;=yx z{<(=XfpUB3?4g>P7RMs|fV|;jo=0-O*M472BpR@?bpMB^s;!MVTksCnWa_&KJO0Fh zdYhj4e);&4Yv%Nyhq_q1wUMI70%=bSZCl;x9zY!W!K7R(8U$Q+^B0O* zGpt!aYVncyccwEZGY2G*YW&T}e5~$_E)pWsg^f`6j85|0dVBkTWAE5;gU)l2w|B&F zRZ4R%N`B^~#GDA|-0cIu$BNYLAjeyg@l)I{Q7HAw<} zte(7lmVU-g?)5z?6265Ac6^m!c0$w!$n(|F=cHJ1ekwy&t?0hhC^!9w)-)c)12^3$ zIcj55ss=D$ixs-JQ{jBt0C9-0NRM zRJE&n4cV{uXE{JxTCuHvg#y^Q8oqT4NznE|3QVf_EF8wnHC}Cox5p0+Da9Hu z_3PjLoQ^lTX21lmtu^1!dR32;2n9b*I(|FSzJ$~PFTT-WJuK)7Xu)Gga=1c;O@{1n z$(54i5xweadLM6Zhw1-E9>IYf3WOU3Z$%dP2OTLF!vL{#CD@`NWo02mvjIX@or2iY}!aF`a-In-xwriXH1EbtCzZckO0;r0CrXb3BYUyt1f$8#KAq49x zV|M?`I6k6Gmlod45b5noNF1`nOiO8}rUt3E87dkYI`%Oh82qvaHtxq%Pfu|3LQ*f9 zn3*o$3nsv6;P*ztz_a*A@1>26VNlulgM$N^~7fZ&D(Lv`WQRKt?-e}+ZjOKw# zwp%+Z@EVeBxuOaq2Rp9**QC0P?4*sK176pL?c~k9TD>IL7_AkwQObB(NR{(4Fiowo zdcWtHq1%J2i+mZeRjXi2OPT?pRI^6x2B^h8$jwkNvV&M>X*H`QB{$dA2vf#bUn%ut z8iC$eUuW`MiI}nD2M@fW65OY{@`y)UQ36O9p2;sYdh7_YEa#}h;#Ym8EX!zne46`#F4nu)APHKTVTo0kfd=&Lkqq!6xm1iutOqWvlt~G zXqd2pJD-Q6Q4dRAn^{Z%{U?ei_JGaooJdOPA0fA@Mh206G6%zI7A4mpv|#j%0QQ-Q zF0@O6(f(aIqPglI9i0QljYy5DU2#1PTtIIM295c$v8;zSQPmt7P4yj*kyqkDc7CJE z*bd*t7%}YD|GVfZj`W^Hni`nkC~27JMFj^3ccYqeGo)(Oz7f1320$JEGl*jX$(;(P znPB=`xc{&I%@cM3ZQn4%xl|Snbd-`YYh=#mo?!bwUkJNvv1|RG{^Rlh-+IIqKl1rM zIMfz(jKd8kqr~AJtUM+DXLgf#Y{lj^)idE{LC2D+t4G<`QN0zp;xYSY;_0bwxlu!&2M zmqAtjeqwzqnPo?c2iOxDDU)bC#60pbBD9w`VE&r2@nG)ubt%eg;Fxb5(BGLb`SpPZ zA&T@yp(S*R$bZ|aZa9T{2SPj1heGXtid9-0otzAvqA)bf9k|V(R|Nm3nW2L&k9kCv zSo3?-u>#-2rN7Lur>y)&UG4dvA5wx!fy+M2qp1aK)p9{1dEa%tXlY4Z(TF6bkP8)) zQR|KZ*5!6;)wB@}yoP-L=rA}r`P^|G;y_gkRO*Tcj}4l{-VrjV#N^VlsPjy@GHxFfpH?9b`%jPI4;F^VCFN*}&FSZ!eA7 zf-LlHkgPNZjsqV;_m3B9wpeUe{qoZ5otf0vPR7b4wv2tRGTO{nj}lD5Gb}u>9oPTv zJd9E;HMD+ogWFu5LphCgWOG!VstEgk9#`KK(3pH=Df|v1R>xrvt=3h&7ZM>jG+GqDuB?8_1G4ee6Fj$PB14 zfpT(p@}c6xu?fx)N*dXNdu&AQc;hbx)16h%*duNcyl$E|DM_y>i74EYXD4&?tqhG_ zc)fHKXZDbr(p*pGP-rgl(jL3FAq1T^SPvyNyfRU zRq-~~0-DXgb`^@I;xYsB!oXJ!hmsd7XMeX_-b`v}xx-jNF?@w-MNKsIh)1}j%2wze z^8gwXmOk2}gj(V3SSLa2nku^7Qs$XYF(Ma4)9TX>Pgl(&dIJOC_Bf)>R9N+zRF;@w zf$Ih|ygWR1iZEzT$zpH6k4lD${w53Mj~*q50(KjDBgb)Ry`9mIG10&fZd6uQ{t`@Q zAQxOI^YCkT{F#tb5;ZXSY{ad)_-*^L-?}Y0fB%w<4FfUxzB=5T42Up%8N}(hlc$8| zz>12s2Mc5Ic4`a_*Tq!%cf?l95A*d!8qM~nGY1H(bDRiM>|1EO);D4xn#uU@_;|yA zp?}C9-|rv(sOuclU)AVAG2*Ojdby0Oywp5ixT}GlUXeJx-#8sF%S#85)nBb(O${k8 z@c=BGIOaK-Tr7@_bQzs%KVf#8lD_pD!DM>>$Hj>Q@H4^f*tg82p-q!dpQMBz?l|5g zho7A7U|p|e-&2XWpJ<*yXfI7^vPsdwPS8s~H_Ik1&d8-U%Sp(R)o_hb3J zs=o81$pNGOd%a-$V+6vvGc@{w;evziGM*Ph03dp`SCq zE6zc2Op)bEVJKHR2~d74X!0i}d!xJn=ncqb7gHQ41G#7|-rW6x+jq!X6#yhE zX-<-xr*fdIf&QL;MxyqS{yXG6+#We66eZ+8vXOxo@LPnR3CsQyBmi>ANZ{yPee`!N zmSSRR-g-qAZzw-CrLj>xBAk-KqTgTc^VjP7@1YMZ;D)pJ)kz*{zk*KJkh2QjP9ssp ziui#OqtjXg1~O$AlI+_5PSyCFZNHRoE-fvEw0d0TKqWVKJ}^32JRSvXgw&{HpZX0O zvxd$Sn<{uM-;S@&mN9@$Y+Hb=1{{@soGlg7{W`A`!4nmbaK8FeB1=yVECM-O^7Be- zzPeOe!-nVih4u7y+p~C&l`IBli90!BFHE*IW8{Oyz=# z1b-nuK3_LBSf-!dCW~*N&0yA?*|ukAU{`rr`PPSf-u~UJEBR2TL*9TVZI9$lpdJev z9o==Y#C+v6#!0c_s*^YBpfoa=N*B_Z!)1wI!_zuj-nj@_?AOeD7Us>rhV^tf$wUkL zrP^m~tCWaKUCKD6+P&zvcy1pLqVHUX=Acf4`G*L~+HLL#sqFG85ykQ@W1OQ0) z!i83ZutIoV@GnkyIWE$I|#(!|PE`7X&te-ruZX7p40m`C9TFz1|n7zr0*XU~+ zqHYt-KM__ikhb2-gP+-6gjFjn)@S4`tHAY9HDuzl`@N-U()#sq8h~FxxNEB9HwZjU z$*Z`}is|&_q~UH^{{|2C+`>Vqk1)BjW6y&k=XEpTa+4B3sf56iSb&v$H;=_R^Y&N5 zpntXNsKK_vKWE3IU;I&TG*FJRL7Qx3fA76DO#C>%Kr5ASgh?9*SIo`NC7O?9;rAXm z!RiO(yJBhqs$a74>C2@DgR-6X5n%AX&&QANyzkaX2bS))+LOxLZ{%N%>MYZY%o8G^ zkX)B3J%1J{GE_LxL1E-R8|}qZ@XTuAhg9?PnhL~SV{J)N@EN`qb9aiydoXKtv`1|t z8xkNlqQgj`8bnz`@WnWT>qw>B2(GWZocnI* zXx=iis<+sN%N}GE?nf9iRy74MMguf>?FLxWo$&OS5%}T^uS5c%cmru?4W7;KqZCG|m47J7d&f0*}nn;lIls@6hQ-;tCyk4`B`GC)S zEN|jAVn-jlNKbp%2FOZJq=~RH40C@j4?51Nl+R04y&Gizu>c9ztKnU4LhdedS?0R6 zo`|qG{T&$wyeQch_XwR9QPw3|z46!gKu0|J+)IRr8#KUsw7Ueta``8{+&ljc!v?mw zSZ|q2{yUN0G9#4IOXI(imXWMI9yoEC6$c>?HMP_fD+3tYAnP7X)mO8Dj3ee7!>VFW zY!IMMGVhLuiu>85qo-=te4EEr9t)_Rj^}b&^;Rwav+DrQXa|r1Z2T36QAMh5CjZ(J zmOTge?y46YvcwRtrr&9DL=@M0ae2A1y!;~DE58)Tx}&PbB&$xw!7;^thq<-6Y2xj@ z$eXItc^7OJsd)b_eDTj8{_avn__Tj&iI<`;n(^KHC}yLX5?je@t0Qr+O>npk3^8@d zZap}87?TP-9q57REwx-W0~Zx^V^>7<0Axjp&s@l~KfN6ySBLiS*<%UcxST^}so3Q{ z-9%y?+7|Eb>|0&n=<_ix&vwJj>iSrYS_%g(#U{>M784fM(goezkcUd%uhH&pXLwgN zjqktZUNwDj4knM`>mZY5YKj{9iV09Ji6e(hojbQBjNMS4(wzY`d%G!~`M)fHf9LV8@sT--Yv=p`csBt;8 zKS)dd6HN(TPA>^qPN@98*%_u7uI=B-yg)4tA+;$uSdLg=s

*AkQn(He7gUf|Ed*`(OO-UTEe_;V*E*& zWHBvZ?Xu=|JS&T2W856kXBpp>NXAsY1{Q%chNWX^Kwt?Rh# zNF;*#Nr&}#?e)|Py00`EGzo0cD@A_5miQ<$7_RbfaiW+E$nQUs4Hq3Rs}x?!nIyNz zXFdD2%|$yPO`WBgC981)6tUW^UMg^$oNzy>(NW|YO38`J(4#4uk^D0f{?3`)i)fY5y4lGPJw zF;l&B{kL45nb zGQYZNfd~bFd2Y6HdsC1f9|4ClyP+qB9L&nQf?y8?+MB8wTuIfzb}?!DCn5(Xkva;1 zZ=Wi@7o{8^UK(7IUUXKg0#mnEsZ^&OrA8)@U zK#1&2{w2IEo-s!5nI1T`>OZD&9y4)nU9WlIeNXTYBDobaP+L6;#~e;@fHCA*FZKlG z!x;IsbCl)*0W}H_x{-i z0i`W3I&g{xT5?ZD?o;l(l>_?uY-!_wT+pA}K`&p1uyQeW8k#F~k>y8TqfBDaP;Fi` zjhgwwnBJ@y=}HUh=;$QYPIA2w4Iqcp=SZQ()Rwo@4UXOfUZ0L;@s8Ll>BtqUikEqn z5lR7!>u2P>O|fC7R~XjG5oA>jHr2Py@MlP??*b!6OsP?>aSAV2#aPOc_lAhmo|6px zE<=11OuGeiSbSzS$H9yZGewX*$%2VXa4`!lS!o>_eHEezNJY$StffM&s9QyYw2FgX zXzlD(`rlt#Qh2kh(M7JZX6)}kX-a+F=WcHHcIr50n1BZbkS%AIxqj@>%+{aR-r%~1d8^#bJOifrU_x>3>^=+)mcR z1ienwyj{-_eoTdhS@*eX2n;a2wvJ(v6pUoA!o}oj1oE6H;(p48LL^naZxXU0OLrnZ zYac9il`Y<+nI8Xo>}gy_5bRmtj22twc?2lGDwrM$RGs?~?P+{x6)3^qIvTg>o=2}j z-DLl(CGH<;+ecTvqV>xW!ES@{_UO{sc17o zde^Sz#z{K{(B2DCZYu}x)a!to-tqGF9B9kIburPX6iFX6C2KFsL>>+-rAO#1)uE>^ zKE-crW@jK&0P-FN`%ZME)yEls2CwR8JvREYR;I zEOali@Szb;n<-ntqg_T+-F9u)(%$FA`e~G5rTmK47S7x86CG6pp>05(J`fb16*d5G z`GF6G$@Z*jHpBCJGDUh|KrQ{~i^&x1+b1Q%A|JHIl&I?U1@~aS0wYa6TnEycH68}4 zq4I(lIx>Qo1%6H30$U;1d`1vD3iqoee?#<3ulSp+2gctCf2_W}S#HkN^gB5*Dzhqm z4m;8#h3Zetop&R~=dd>2h^NgY`xfa*q(^`+TUsKYPupt>G}|T8Q=Mu1#Mm1RzXGof z5$%=unJc(EKGkQyM6MpL2avgH99KauSm}*ml$HtVyTm+&0qZD@SgGG z*Tmce%mJ4E>EpSw6geS_tfz7T)Ixy5NaYug_{{Y+Xu}&P9ar@;{p&!AdY-S@xDhA4 zB6sh+uLtz|Mee#qeCOu^b`0N-@6=qs-3u44khN{RcOAN)O%Z8y|7gKNh52z!#Hs=I zc=|_PHG8WuR}AjqLb$JH9-=5Wo!nq-+>mr;U| zCLEYbwA6SJ3QJq)izuEaJ^e|$Pc^~MCCWEj{N(ZvRR*QQJlAdq&v(l6Mj8_|7%bse zGUbSx?m&W_?krzP-&!dk8E!-q0a5dXP+svXqG>N6>;{dYd32>?R3!^nW9F6(nk7_m zrX;8w3=Z@-h)r$2SM`M$vhNNeEnKxy_IBr<41AkJ&4v(8k#+n05!u3;T^}*cdT<|& z%KBf=%|qZj9)?}->}K(nTbhSD8si5K#~DD8?O#ai3( zvGPw`CQ3raJKX*9#Cr?_uFYn->&82xSTMAkq$@754C=CJvH= zT`Ac>P~bWixnB_Zf$y!a780ys{Puxek3TzqJdea`O42vIF)NamE%wrxk>3}W>GjjQ zPZuxn6gvb&0hs z+0(Rx4(+|#>!a+(nfU&%@U%bGUa6o{U|gxGDdn4cnl|NPUAId8_`|G&G=$*WUg|f~ z0^{3c=&_Qc3`W=fQ~Y8p+HNkU?w_a!7`zxCE7)wkO-30l%L^U8trG$w zV1%P=IXQ@C?Oy?Kq;*=6zhQT)xb3k5R>i7xui+&%(BGN&yeGArynFK^1i}ng`C+}5 z&CV$eD;i6#67l?>7>h^zg^?v)+Dt%__Qh|8V@VKc+lvpu5){Ruq2)uC_yn)!&)%KB z_$yjQy-djp;kbt-@psS{dCllyEBh&euAp09{7dL4QT!78?x0{rF`_{Uk2%o$SFBKs|Dr>n+WB4R(=oaowB@I%^ zHf#4K4;k-SSOUOk0GEdXjCfPApv6HSe8V3>XmTZ%wc(+`Uq?9+2D(GgHp;!vQciwu zWy|p=C8O6=!^6%H-Y4MO`OLa5R(RMv5vv`0-Tr(QhIfZ3TKQz zqb$|3`&$lt5Q$sPWI1D)t(yu$xm%%q=NhNfa`We|QUSJP|0AZk>Ima!s@znS@jf8o zdQFynZ@YwArCwR-tm`oQkkF`j&IEAu*Hjtxpyhs$DfNuK@AQVD3G@Q_0}DY2-5T55 z086i3XbGn^(%M@{o(7J7)QyasPq1?)FVSZ{m`>BM5<{C!v~v60e+p}-fqs2sokh$Y#Hp#Rg1mE8z3^&d;?~)|UHMC5-ecqmX9{l`V!hP#w z*iCQ-Q9Q_Q1irk=Bho1N{jFO{1A&m&;=?&xRG=|tSTB{Z07IM!z)RMTt(pz&*}gSX zq1lR7AAe?V7YU%+YmTu*HIy5PGza2AXG!WGE;fh?16d69t~_tGxG#Z_u~x=gbCg7} zIx&WbIW=YDaQW*J7FC-)+;jY*Xk1!1s zH3*bSSMq<4HCCdYx^eTl)I{t31F(TGCPL`<3KqH-65~{?1W|IYybY>Gxh?9@ZSe^k z`MK@AqXGx!II_=m7I1B{-AW-8mG}f{`%SlpC+9Ip=cJ&5|X|IDSbey_XH!K_Sdr8Lp zk65x2c<`$*Hj{W&@y8W|6yTN2jTX-)VcN^&>MAW+d4lUBM6@m>7k22l7%Nk%nEZUh zS=TC+^^w+8V~?}xv41%{z#L%=q$)8TrhFn$pD)-r;RB>@2`p`Q;x|hdrY?5VykR0D zA}JP(^oEiQE%f-91B~`GOdP>X3qm1$-5ksBm2^n7# zEGz^1o_{Idr1YO`k5OK)j2T}q9D1|p`>%t=@#Pr2gWHUl+ZE6vn3x5T$AXOQ#Z7(; zXj?t&+kt8N743K9w7`6Ujar5P`=gSA*f-*R!BM2vU)B0owe5DIUMmuIh3;PR9#|a?9w%$X zn`HQ5p|?2a?-jT#=r>Tjs8t~Gn?=#F%W$Iocp|9D86yA=Wv+=WO;EQSo&C{*b!0B; zyV@I0CeM+r0X&{}65iC2~3;bS_^}Jate#6aZ zEbg4bpl8O)9u9gs9F^9%Mc6Y%ZPmewi}hWh_>#bhzllceZ<(5|@Rph0h{00ISrPjF zF-T*E`nM#wO!`x*4O(AG$g)!hTzADk(Eri#_GhBYfnXoqFBieqcKgK zwb$;&5{G>ZsH63$oYQ?x+!zQ;-MZih^*~-R)mqpZRk{6X`B^!zKgSME2%v4no|_Zu#i2$4mhZfZfi&jx9oS(6TMBGwJm}Q zWR2RRM3EZ!aB4CA9=c z6HF+AErJk1=|g>UfVANV1dxhB__252NY4)xZX&;4#B1ufYx55Y|J*BsZH*oqC~*3; zQ-E{dQg8L=Q0_UY@$qq?0gnp{tidtB|M4(Q)3zo@>O8n_|&i%DxvlHD3_i9$ z<-*6FIkg+jBR|5^pR4h2ijIY(*%AA_5G0HAi;CPm4a;$U0Uiug?aW}RQh%7;_?lPp z=q5s$T`yPPA$GkvVQm~5Yan#pM6=zr<+m<;yvpq(&?{;N_t0kQ2tWF9}i+sTmFR{r=p~vZFqPvy~^bb z$Mz~!axFO-N`MnVkHq>d5ThRCq_tYX6e-RS5wTafLe@*&c2_f^OuyH( zPla9xzR`w1DdUBd|3LYd$(=67-ZGGZ|4f1wBMm^fsTQk$*^8jzChFZVC#udCY;Gxh zR#6|NBe**B*Ra>|kyVMBb^fV@%pUiGB*xuw3f3HW5}KUeAFTp{(?12xH-7-p_wNKr-H z1-|>D6KCiB;Bo!c=Z5xrQ!r`S(Go{|M8{I`?z>-~glF$?AfY?RZe z2gX>vXH!_iI|O^I4QIt*>z8TRyK?1-{Nd?{eF6f)adX#2SRbT|bHbwZh}hYhSF;-1*k!V9PH5J*5qf`(9 z=l+%r*3s7G2*b(U25L>E`}npY3a)Y|5dUbQe ziMz{o_J<3R_0J-nl)y%?R8nssdZy>=)b8&0TM>suqemxN+I zuizyd9`3!|u9kCI<5!ERe6q_`_4l3z;Uj4TWM{=T8!TlH*3Y(-ywcdhHL})hwadu( zJ-^0dsHo$HWo>Oy!C<~U*4a~YV~^u=Q?OngN;BgU=lCNbdL@gIBTg4)SJwIsh3mtR z<2!zxL2|)_60|p!S1Xn!T6+T!kd)rRK7_R1a&)jtd5Ms?`Sn5f+gPDXAZ!T@GlJmz zJM`N$C)Ler{A&{%4UOfi%;BYJT-A65SU94Tk5|!V76Tz4IopWW3bqUvc;w8iEqJeY zmI`ES^8ZI-dq0{797K{poMPI$RX7v8i_&9& zIwg{VN7R*&^D0Ebo+BXk!gw9~)?EMoM-YkK^=}9%Vz5UT+D;_KP&~y*s7st={m_|NmS3&yWm;^T!O6CX8puUeHk;ZoDb?i&fY+Ny5ItT^260c z84*eLz#Bac?xG}YV8ZC@&|!sTXF%UpV8=;(tysj9Jbp6U6Mvjk%blHQO{Bbn(S+{z zU8avw!h$?TqEJOc;C?J6^I&%IjQ4)~|DQu~9-q@mg7p3AF=HmzE;;4q&<%Qm+e zza?I{SP92p<2mCQe;foFOc7f8eJrx6Sp8S9=X5lF?uEZpRXB^2nh@9H5j7#k5vX#} zN$zD)-Uu0z;N#~5#P0suq6`W^Xq95}U^py4!Xj3jI1LS8tIAE|qP#q0>|3=KKbfs4 zAY069tDJeS3O*RTuqg995564Z06y?vLXqn<;DO5hMC|*kkRmK8uucs6`zFBSq`w5b zN~=9O_8CsQ6oDM?5jI1Z-`)CBVJCb&i~S3IS=EGRDFEkTIl|)k!U4f z4kNW1T4P49B7q*28nbKKrtX{S*-G`stmOVCac0EH`c@B zz(DKebG>EkrWNOd?>`zTGdGuSz z_|Wp&fC{}RNn+%!ZZ&Q8xj>COB}tKjdBtQtoiM$s)7iG*{u6Fu0>E~J#3wUA zlfpp56mhuX)oT!#G+_0?A;7zE9m}#K=_Dlr+lm}@QWm=N$gAtnhD|OTD87Jk)3rzQ z&^C`R#_(ZIg7Rf4ekE%OGB~DHFpg}k4|pgz_`pq9e|S@XK1AS!c4(`w<{-*T!sCTf`%;0mb=@S+jVmdqTNiOhP05E64 zmX$hi-{5~Mo{(a4A zb((OATQY0?`8@Sc+4)}DSNXy`oZL^a6#= z#^|P72*(>GdLjHDs;)9D%698YcjwTJbazP)jl{sv-AYP>bayw>jWC2XNS7cW2r6CD zAt0dO_ki#D&U^lG$#u!heLv6MYp=cb+L6Et%)bUa8c|P}Z5z@Byt3MpCr>=SWMQkH z+Uminlq4RMHE9hMlit*+iB(~I!g{NryIYpsPQ9rnMS-hdUx=w)^&rGP7K2yFn0tl% ze0C%}n_vr0K|=bso2l8b{2}w{t|TgN?gwjhZq^8iQ&p_RK{qYv>k_L4dqZEEEoKw= z*%IzsP7q%|?@c#ef;kG?LZ$&D*H>~MT&UkU^`GNtr!;M?@qS5Gg%JvxujP%y4eOqH z#QK0k;aBQmSVUB;0^%+xTKDaLay&41uYkCa__4nsG_}e)geAt3?5d$v@ZB@JJH@>| zPt_lP97egM{xJMG=lVnUVdrGK^Q1SE9m2X56aG7ZJ2E(tw&mOR<4~enq(@4{MGQXA zEBl6+p;>$pw^aHX`i^U5FC4QG9O14Si8L??PkN(_w7-NjW^Jx5 zeoaLoNCL$#BI*aFU+8Js({kR@Bo+KI;!83#?3H#VNgcbgwXsb1X(>;dscGTF z#3q|a#LQ1iu=ORfrL0Z+bl7BS+;ixcOe0^`77KK_g#__0)#F|?O;_*6VTNi-l8XBi z9YZ_v2_ZePwDl5`=33lO62vkGkj-QNSkF!|EX4o!P`ZTR9p&wyRYCLmJX629H`ZvX zLm0m+*|ivO-24I7#wrHF7YSTTq0FBAWPn4f6NOx|X2zt1bk{MI5`NE03?<4K;EH|O zXVbg0g@m8_H;u)J9uz}dS zBkV_r@DHjj6Mwa0ayy(Ro$TSk?-o^L2=;x@(NfVi>__hqOuLBnxNVXRpnMPuh4LAy7On3>J^Rjr7eZEHJekUlt!~dxWbCODW>AeX+~=o z<RnvaJAo(iEKmfGFd;R3}yTAQ5=a?NhU zi?=IH{}Z|&mYoE*&@~HZapP-x`dZJM(6v2ZPC}?gV<6ycto@NFb&vXLAXDM!^x{wz z7;~_WvOakIdyjdk(pkAoE2PmI?101?mFpVYP z(t|a1BN-ZR`y4S0=!iOENBTb0sRVR=dl}hbjp~cj=e9|&gQTzVbg)qLiP+IfPVH6k z%^?`re66a|um--Y5Ue_Qh;UrdNlDXOD;O%+65VM(aG$Ks>?cH9x*pSaC;LQ}M!1P5 z{@uuXpUJX!{obE(T&RyQ@(Q~V^&*Z{%`UoylJ#r>|H|1Ep$au09}gCix?s$T2DKR1 zJd%Nr3-2OU+r#A1S1Ihd4)!3@*sW~mh&3d~vb+aN(rT>}Xe@LhO6+q+SBgf5BjDA} ztM-78_qt*X=B#?ETc7a2S}%2(u>PO1Ck$SV=`+AHK#U#4Gxj(g3`XgNpLIRuN51iJ z^`ZT<`TDm8u&4SDrocdkQJ(A(veg18s_tPeZFm?2tF?9CMqaKyCMzUo15sh~rlfE? zsn0?}8`tU^-)|`ZWU1XBypC6?(l?@MHd-#n>v%MgSmUGNE{tuQB8ZdX$cz0 zSo>B~qq>c*e<{g0l+RH`teh0_CXMyiM;|n%_9NY05xr8>%})>YB@PkX6=J>6GivFx zvUZFCj_jdCzXewf?B!6~7#;s>6qC&rylhL9Iy z0ieiIPJpeMo4)C^dvp6phyBg`p)?JiVGu%r6!qf+Q~qxwqm`fcMh}FXw<4)uC(X@i zgW}EP2=|oK1#;CYsjjxKuLr}PD^G}|n7m|^3skd`6a_}Fl16=hZ$&qY8H0ka-KMZN zAXuSB=*xe#BWJiS1d27{lmyP=JXcM;-Eg0<@vQdq;*pt zQ&qrb-SEkm`)w@1jvbNi5K#|X_E0pvIQ85isFK|cl_ZUCQdDM_0-mL?hB^Ii}+(sd@xqmo`28o!Ve) ztRe_1A1;?he9XEJ0>dxTSiM2m=(w9rux2{WzzH7<2|j6Wx|MSU=d_pm`PLbIB?;hv zTnclefqm-}`XZMwP|Qh2f@QjG`(@}`jh21Ze}lU}CgL~0JIl1Yp-d&-XiiqzXI0fY zqAY&Dew~}%C;p*Zy*n1$`{_IEIbf_Fg>S@AJDlVamGPki>?RR#tJC9qr4y5dIJNnT z!K&foL(cH0LKLQ@H??MV{hsvE^tslnC|wix&1B5DTEtT7q+yM1X`6I2F>aP z5V?JQ9Vs>XW7pI&ouXF%8hev8MXz~ah*!zNhqOqI$#RiYjkFV5M#s?NW(1n-uv_L- z{rR8Aq1ZSVufJH@iZqP+-5UeSq#FWiR#7`l)y1qp4rmSdg}e4_J3BF9Xt9M^?x}XO z-oXRC$3+orSFw?!%!{#ECz5S_i|NP}D_DMwmb4#^P;26iG;tESYbeP`E?Y+W0WgLJS2Suae{*Y&nkq$j&!8OP--dFtqSLz4+;V7CQxTNH9 z3*6rfjcwoFn0wX!CSYu;G!gD!tXj?;TOWF6Qpmp*Nm9{}J)acI^a%rn`xaYtJkhWT zhl$zA+O<$+s4QuE^xj6A$`WbdEw%I5d+bA-7dEAYxX{B@88jVFJ!j@7C;H_oIX^H- zYujtXn0G^58Rd%qc?JNwQV($<;-dkCt2vA?f>fmhQ+*LE&LbJUDket1;quPNiQvy9 z!&$(7hoL~u-{m#$=*)b@D&cSR8!V8=YB`B}NuL3c^h)&qFe?`+xNh2ma&MCv4=B@HMM|ACSwbT3WenbkZfIru45VbDp?$!IE zbWCf84ANFG_w`&wXc9(_pQxmcJA9gBz3}LKvFO4t{;B|K5ek z_CwL{qoMZnanToJ@+Hg!n4P~#QQg5oFz}B?Jml5QhFubk$iIOAuPZ(ZXVHL%OPSnh6VSq5!k*s$bGtwaMhI@9ZN`KS&R|j;84BdS5D}9~{n4aN z015t3yS!|?6lP4CVrZ=TJs~l1dw(CDjp7ROWyVd*v^;1uVsIX2X^_#`(!%kV;AM;@ z!YR=*nDDvK{|izRg0h#*L(xi6;0v#sn2r)WzPy+8$Ck!4B;tp58IDE3fmS-|PSzOivS{z-7g7V!a=PsMV7<&sBaUpju;yIsq$DvY< zSjIZx1(6hIj?}nSkeS_xS2WdO)C_2R^5VN@F2IA!Zr0O?eIC zxkHep=h=))3nvD9pvTnw(1OAtc{qpSOqVFMuV-h;zxOo$Xy4zh{#gdA08v}@{-*E` zv^uNwIYm!++5Vr43aJSIozmFa?q+SqH?Z^T;tixQH3&2vlIAOiH<0zCmsIUJp%0X@ z+}y3+ncQar46r48LD+)PrE5El#9t>%ZQ8X`O?w0v?i3c(I@h;scQZ6jaH8)RZu^|7 z7>IDsvyE2B!fFnOOD>@c=N66 z!$Z~k^UU7y*T0Ln_vR|jm%Ub%@dvdDt}O4*KLfx1bMl9kEAUP?LYA$} zB{PO4T3(Ttt-3yIde<5m|8Qn=1lHT@m08UHw|XkXgsUc*@(ln5f6RHG0dW$1mS|7O z$mXUgqzakfwnk{#Be>b^LZ&ovHO3X(&s#)$KihjnS>reJ$wfP#{wv(-zR&kA^{^F@? z9n?0ZH+9Z2l8q?o2j=fMloo41mMXlCQC8Vn(EWzObmT^&(Eat0(ftaC`h^GP*c26> zHrUz^&+pKe5Fbit}*OulMoBL%jKg%HiY5Y=HkBn%UWEJ~6L&Ooxb_ifQ% z{VT+;;_8dZ#3E#Su)a9dzq|k0E2OZl4WQlo-|dY>>4OaMhPn}@X_M3*)pr3GnM+1Hu9B7WRcTcejskE$TZ95v!#K#q21R=+$-yHseytGbGBjK zSZbUX>Iv^ZJ!a{LhyfITa%L}3Irz-hvye7Psu6bpGZM@6`n%A8v4KCp2xF2y5rHDn zpg|oIz~c92<}Xw3$s$Fv;pGJ5j(~Rz+$V_8148A$THt9cxZYplID~x!~5wzp?V#N_#pDe){sa_Rg%9NKre;aUF3Vh zYTf-PK+Z04!K6o?Gtlbzzzb*d=IEweFeq8`@*g+G$K#PU3qa+FvjJ1Mo(|rjvPLYw z)cC@EKedis2E$kQ62x{kSf;~1{%+MDq4*%1=lc{~YI2W^h3#m5stnG=H!<6O9ucb> z&!C~^C@f?>%#wh5%#02VCK5(+RVuxtvHr)r2{bBPP#g51dHvyvk{+S{>{&CR)dG6L z7v=Oy78@dNA{$CdZ%$Zs##5qj&#CKQ8KgWQ?r7A-8StW>nWkmV81B6=`bL2#%=cR0 z3xQ9-m-laJr9vk~yTj^gZEzIUX_JXm$mwDklU$Ss%k_<9Ceb72EtCt)FZ-R%F7C!m z)LNyT=J6n5I>dTh%~lyTGZ{e^nj!;hhd~%rRPO9Ho;IpG!}{tn6M4Z)H1VSUC9d1v zq1FP5F}5va-pw(6gRF+`z&qu8zz<2S_1!ybN5=`$aG{!gn!4nT5InC@T7Mlytw~`@ z{Q#Z378l@uX+RA##`;xYHmpeP^xNkyIBtr|deJFL>KOS{-x%ES zSSTbu9OYnV_8HHOfB z!r&5f^F%T%)8wMiI2FO0JxLq4=-nK^l%>NKu&FmeEjjtx5_0%Lcl#@I?m2M1X^3AU`T(OExF)5d>SoY^dA23rso=d8X zMbKU)HQ+k+QuyGi%zZuy;M2_Lz(jOh>B(|M3^(x|X>7Wxyd;dOpFwI8UVv7KhMU>y z<=oa6^*Q*hw+2_tiR)P}fiP;+vR&nv6%h8GR7?DYX`(vvndE*++ z^*}a_Rlx*k2pLm6mFPsuPO>XDS5333YgP2@tiw;RbB}jS)6~urCCeR$F9=KXG)Tpu zAD{7G8qQ1WN&S32BKLXvJ)XX5fP^5bArT&j?{TktzYq51V}kt~Q7WV#B1-=rvM@!K zn)#dq>LuBi){Xtp-|cAMSikEHHFj;EHYDhlEplg$fNePvKfIhO=Xng%{@#dYVzE;w zMFMa$QW4LuX(6Iyd%|aPX#d3IR0% zZNgCT(1>?zsXmZWUuHHnr0QlccUs?E1u3l7XmRYCUo59UOP7{1k|y1D&1CVcE!0@O z0Pl07HYKz12F4}J<$r~W0U5J8R1Wt&_^MFh(Wli!DM7qfO)GS+E(FiF`*#_L#=Xp) zyLF2P#$}nk;P{pI9(4L)4n{iP!$=3o1Vmu-| zK4%cHEtP%+e#qV5ybuq6IRAq4I8NlvqnB^w z1Z3~Q$|4pq_QiozbIWpq?WejvPE#%u&8oZSVLU>a)M_PxkAWjl3_kc1Vkxs7ZeYYb zR^(B_MF%BCqS_f1QAac|$ZKIb-?>)4zc|RwD-hZ)4Gw3xrB|_$ zE}pB<$ruv|&e|o7SPf_jS$_|K0;R?FO$o>0g#L#H)XRQ`sQRquJf(DedWK~j+RDMf zc(PGqB8GJD%(LP#v}u(81)OS$;2jn1vKv3fsHldph~~K~WypS@nUJqvd`njaVaQE| zK8HW7_t8tQFn>I(E*yBtQV##x1<`P<_v%fIo6@T(H(88RcGt+~#4NbbvO2X|g^V;( zh}|{{oJ!;p*(;eF$x%nD2UyXE;yV9qXTgEpc&JhRLZmff6#($?{VSb~>GOvgTU|V9 zdKE8jfNKo&4`9hx*ULfJDIfHcBU(bZBMSAU9j$iYp%)`(#D$Wd&r2Kk^aqxt!Q_bB z-X=-P%7(ggTXKCm*hE;nbk%DvizWPAS5ck(_>mvq=+m_a%;e}wYW224TSWEQK8-T# z%TMW#7T@&YsZx2^!V9oN-b32;K&*5Fhn{jHOSN^S zE!o+Lay_NBXw6RcW<{|))m{3wnreg=M$DA^eR46q>OsN6MHXyE2ooobZeA*hp+R%v zRc z&x^hYiH<#WOj$5Doqyacu)?i!5Q6yZ0UGs<$OhdRSRsGcXy`w1dD=Y@ftiDK77@U3 zDk3mcOE60kUQEbJRCRJBqg8_$g7FqB#bCHyoma~Yw***Rig%ra+GZPX%_-qLQ@PE0 zB{FvePu0YK(1;{LSR*aWjzJR5kcV$E!?iSZ zA~y(_D|$K*C>rc7fgDGmimsjaU7lh9tkXzA(%ak1W%~NA#mVWVa+Q9wmSM8^J^)n! zXdi&rHn;V%Ac{(rLXiN#x@qb)jG+)&1%i6z;jEzM@zOG_8f8~^S(v6sTsDz;T^KQ= zn6NhXPR7YsrwO+}UBC4KYRK7Gygt|z5JEli=IPdk6ofm^N0w!$38u?7{$5?JfLh1O*=qu9{esYr z%`tfp=pQe-wDyS}SpISAHiZf!P&A-@Rv#mJWaR#NJ%E`MVo+9#@b&?-&wN|TBbY({ z#WQc9W;0g>y-dQ_d3iZtg>TA$_cAgtX%=2-D4B2|g`qX%&SFncGMMq0Wd?9X*($u> zE1Xm|Z}&GD*I9l3NZj=8$~=j1|2+d9*3;wt?rHro(t~)3UHHngN)=lQtfy0x0-r5E zHjA{!&cIk@9me8eWA8E-4{UeFYna}Zp;YH^78wuk4A=r$Yo+K9s}p1U(!j`o^O&I+ zJxDF*xxK%wwbsFowA2`;>GZE8u@JT_xFLmbsahf`LF+6y*~A*sFP8~w&8{z=ltOd` z$63JE>!DOp6<--(lRj_mZ_q!XMx{WH(}+ibmw>@T@^Am+FTlxpfO;8?vEk;VD9RHr zpU{s24fc#5Kit94GVVf*GS~)bU-BoqcI$aeCH1q#W07XVBMWINb&R@+T@0--odxRq zQxqRw|HF`1Zy#$gX1ON;G*~@z5SmXhHc3-CMgmr|$D>)ZP`+wSdJ1DhGAl@xQL;zX zQ9!Q8OSZ(M?d{kck>a_a5O*Gq8S2_C*KI*I@ceigAyyF;-NL#i@`*mg+bqxN2F(N(!5gLc?|+L`3HhSv-vc zzK6EzU_3-vB*bg;Da~in-_N~m_7)lCxx0U#jZvA;6?(g^kd5zIuY#?+#XHgpvA@n9 zYFP7^t8pxj#XRqcxj7_#N>m7zB+v9^Hdk}NIYB5MY>HU-c8{il+ z@9q%Tr70s{uzyMBq34h_alMd}Ju{k#+~l~eyMVNrzWO@&%>Ra_r%glp#o1TDevnzC zfK;hYcTeDP)nqVEM9@*cs;kakqq{u0uxXctc*@RA_(hQ~Wv+R+Y#W-M|4^VZK9$3w zeA1o5hc8M&h^gv+qoFiG+4B#Ko3jGVt(-j7=9_OrN%OE>aEz5INb(ni6(g2JxkPAS zJly!^Y(BgzNQamaMn<_fE4wv_5FJjWzB?^&XyubMPFHBm!a$R*o4lJSxYcR<6{g1( zG&&CEB*^54xoY~jCz^ew#H>q7;q)yR3^UB-6)!;H4uO7?Op)vUSC|caIGt_II>svE zNacA4wZNa9t7ESL5kZrGVgUSAqd0hs63yp7UI11;Hd>0mxOrq9c;2Sgx&^)~M8-El z!`BDzt}9B-{UD{93nOES%;iSaK)86IQGlefhRW{gT<%RSm%=J@5Nh}H*|$X6{CNqH zbXuVEZN3qc&3@Zc6}QQvB(u$}_f`dc7Fv(fq?5@u(^`N}pPV9f&0-%M)8|XqP-`^0 zo1j6yO?NZ7wCj?L4>L#Rl55lPhcQP1yAeC=63q^~(dZ7eO!E1+u8ZmQ8VUu1^VzwO zn=mMT1ofTM<`ZqAM`&`eTb-S~O-p`TWN_{MmUH?_Xe(EdaqPW1WCh(d8`8)Td&I+$ z?QC?=)~ixzKJJ#SKmHQH$31arIQ+FFIV++ex_@r~VLO6wKn? zV98PTx6A2xsCC0jEX`QJM`a)z7+y$AU6N5}?G#H1C9H98;Qroq`W|OP3T{j{-)_nr z_(Z30xGq+Z>#n89xRDuVQ8RBlcb1|yY#pIU!GXFxQq`{Z;%^}fx z;x_Ye%PkdhL|DCIN^FTWLGMM9udVIbGN+F+8DWqBR}cGF$Gb@%yC0yb3nKAuj1Xa> z++6mgZ@?aZ4)04rMnRCwEPSfjB>SD5mRou?q2T^b=ETkpfqMD+)*K|1iuc%ejJ$f* z40wy$#Na8!*(Ce-q+V3M)_1xY1(S-m1Cl_@^70Ru^CE1W?$VL_&a! zCfBKkIJeWAu%PXT*(rhh(~XnQG5BBM6sU5s9!>zTv(q>K_)b+zB-op2{bOt?@xXU4 zzhU{iW71%zyb)FEj*ry0{fp_6LK~g#5$R=iZysNuVVdS#PXpGNH$h$0@m61sz&JJJ z3CNUVZ+iKRu?5FG6tuVzO+)T#`AeHp^pOO=aPTZ!NL4(0FgS2l=nFvG9I&BM`1xr` zmTHJZ2R%Cq{q zlp0f>$BZWaZiu5|9vDOW?{g5ESAnz<>Ct;lF~4p2A!KDvZ(-rDwSv;9fTDk-6G&Fn&7vdHGG#fyBJ4_rcCrnQNGp+OITN6 zq}TZQZi^+phx(IsMNYB-57OlTY1G?32;`$WW+dHI%NSC<-S1A!AUejHhwTpk)MdbO zHNe;tBe<#4V3~zN1jy(eO(-)o>|*)#1b6S1n+>D(6D>>s%x(U*n6Zl z=OJe6;;6PYq-1D9 zWt_db?xVsf#(gVUUQI{rvnD(&QQ5>J`BAO$nVRxGfG<7X!C&@s-0X~%JL$P=u~jgj zgr0(2z7=8We@rmzYN{S0`+p-4EFGIRt5TJL{Oa&jJmQ~MifG&!`#Ynbwe6yS`~HRoCkZ|dwvHeN z(@W7bgEcJIWk9kXFupu#R!2lbDAvvPhw!fc{cuGRiM^{4O-^Kbq88BpGy@tPhT}T8 zEGzTK;5oM0_q&_a7d~Bj>7l+5<)yY#%H;5~WXi8u3QL}6@4YxTtbZJtGkh$Ydw9hD zNp-*oD%?ZoGAf_GEW?#SsYO|NqKvO5ct|4Zo8c=85~}65bWIc*Hp68nygjmCyp*V3 zL_VmVfR_4N7;iCQ_mi+aZTLO**J05wE12U4=)v~JO6d3oI=~)L0W~WIKqtBLzJ~|Z z`Mk)??ea$;%PIShpBO~@!N5lV`rOCnowS+hjmi`E*JL-&nX(gZx4&h3-ye3g0vo2{d2LyusG&ReA^0~WZNT!XLsDrlKW zM%NWPZ|0`KU!PqGO>i=_WLW;~C;w#~fPt>W2a#J?;+8H`YR1vgiyNFj>(pf^ExBY) zL*lRRjmEdp!|;f=akExxH!i98gi_@dy{PZ&=kXtUO=R$g4tXEgI~8iw`rB=}|Ae93 zk>lSEG^&1~%*Kq=l*-HYo_-f#%A1?XfYqlGGy_{Gztdoc>@}D0BGq7t|4x4x_YrM4lpvDil|LEX1J* z%p{qi%E_3!9dbC2;ntv?`qus;pu#~1n~nRnz=pWArQiIcxrgaCpleLYv5WdwvjAXh zNgq@eG1cfhX4E@1Z+kPGIN7G#Bjd9I!1RZQhhY5FckRA(W9+{{>HR;utwg{2nQrkv zaE@Il@RB;nA}9$+T11B-JIlDtZ8Qx4f%x%gykRb+gO=koX*UK<^{7wSLmhTmopvB# zi7S~=Jf5=tzTZt1d->u0ij)n~V4-^UBMs?3$f|Xa5W*~X_$2Yb$Cgg2_vL8eYsnO9 zlY*edePGL5Bs$$Nm;Z5gzUikoCQt7XYyPN~W~q(Z2ymIcU;IVgBa&p>$ylYQm9(H7 zGz!y#x|6&S(winXFvt9hX+)TU}{VO+=UA`AVsSXixK{u8@ zu^S(jkvwid)+LYDXa}A8)9Rh6{*RQ19Z~o_1DtbNg*Tz9?1!y1@-XTB{!R2qO%aOs zG+jb=w3B>R#M{zc%FuDKuPLm=jM>4`-hA0D+l%W5>$K1E$*o|LS=&Wn(hOidf# z4|&n^B>9#9N;-*R+Nc9rRqc;q%?N^ew=6=gVOmOjaym!k&|^LpTX~1FkVB`mXErY^ zhz78HV8&^_A}l`NiQQan7DR=XJR24RP~Wb2K*u?W&rHFZRMxzu2{xPuT_C5(Nt=_HpoUj;?t{ zAm9*D3(4A;&r$fgVZZ7(HKRWO#6ss2>t%TYx3ko0XWuMHBXi9)=DK5?bYNORFN>aY$tizXfI-@?{hLU5f)}PEb9?*byEy+B zpZG%%7g9dbZ6tKX_=k3#$#ngEb1{rB@QC4nmpdpGwl+AYsz(1qTZ|_k4XZyfmt(Ir zhgV=0n)k#|u~WANl923L5nI?bUQP5n&5x!F_?HoLcs%3yy zNtz)jRMyqb=mWL~i5aO_Wr*S7;G60=$H{d*1t^rCm~cOv+iW^3hAH2!aP8()@Z!*v zQQ3#jDNB99R|``EJXO3ytM!Si7{4@<59mYu*2ebcp9T8AVtW1SQpcoFuyh7A5u^px zcg>C!zV^P}Scz(9h@UYc&c)B*_HWirv(@A%jak3Ygzd>C7Zx0-JYDEC7ap3-@{?%hY2UuOCpW~`!;7DcVwBP5s;BA3g zXa1J?&IX~})23lM6)`(}%!7_TT1zP%2%{Fo zS!#7_?(qCt?^$uL0!0`mex`S8`%77t+!SN5dB6`Vm7V~jOhqw3{s&j*FNj^mfoizn zL6L2JuyxZ2QMR60cIgp9Tum8BD<}V-`$U2V)xG<)e>67ky9ncIQMBkW^u<>&3P zB=G?kW5rUwU351wd8+a<<2(7qK~$wMvhM6I;g=I!Z>P5zM{7wG^&0X8g87LnYe)+e z$pRFaR>6wujQLSYg6SD#Q8gn;`lxyGf^ot0+6lt6^N%IY_i(N|=gT)xEp zKatZ#>fsp-G-7^H_820a70o1hu$bm;VB=!~fep#qSje*{9&sJ!UW=J&(3_9M2Lq`7 zJ2Qaj_yt(J5TVE#jZJ-u{@_h_H&%`eo;Nq@sR+8!;6##3BPq%I$izTDaRjWPS131! zav=KQl+ofGXOjK!k@!Xm)8?)3wLm!z2-2K9%-Jy5$Y9b{Z7=&lYLh<}QH|hBGLwXGhOw?=Myxg-!k4l{ zZun^{4Jz4KZ{3vS`2X=x>^zW|fAC_Tahk~a&LhPCc0^%$j{4@a~V%I~q)nxSUbhc^x8 zIK1cK+rRLHqmb}613DpgH(w3F4+pfBy{w%racLN6W5xKkUnoKU z^NE2r$J3$~!At{<2RqjVBDj)z#M$ZqSC-`g*}V%<-T@w~RvN67B&`mbA&2=SgDMM7 z%?dYyTT};bcIw#BPrT0;yGm&Hz)C=G;}``#A-Oo%ThvRn7cEwjIRmnh@hKzKg&|uY zFNz<9Dz3+COA#0P`tDMHg~AkU3ogcxyyJ(qBOh<8ur4P-nD(=|0JBF&6TK z^@Qpyq~;fYdYT>{vqQ*NU`wAgwyXU=2+Hwc>9C_)(Ix)__%)|rE1#daX%(|13oA4d zERCPX>degSx9lK?lm};N6IV}}PEi^S9!$}&w zUB7JSC*x>8Y{V4@hU6q;XTrpOKV?G0s}U|3gI}z6kYqHKSP9lysQ3S6rCs1;U4}{z zg&@b>&~n&+=fmDi%KqT;0wXu<+5dbAaifP7t8Jel(~spfI-FREfLvNWS7>xdkppSi z&j|YL)=plBcV=c}bo4emj%Bj9RkcJ9{>Ox36V`S^o9%k_EpKK+KHWKD-_0~8ny_PBn6{BC2Sv# z<%Yd~1EX1~8KZR4^6uxZ&hT_>EM*qb1x_T}dnU$}CfBI<%A7ApYZ<`2QOb0Yx^~U+ z8$JzbZ#bNoUt>c4Cx;+BY;#8m48FVo2nVxn+&AZ1aRjEne}hJAS%9I%oLNc93_*y< z)_z3uhXD~TJ;R9#KCMc~o0o00Xti&MRW@20_(A0{w0eeyrR@tCdJbP2Rj9;)MwsDC>L%ZNJJvI;?goLZF^~@WYe|POJV2u1A3&=IOax&D zfcU6K*>QlehaKxFb|))FO;5ax<#&SPuwJbB{_Y(AJ3DQv7dB-vr$P1T1uCuav_frV z<*P}`q5loFz|bh}LtvueEGc+UaMuEJh!j7Zk2msyzHTb@G9%Q!e7d~iuQf&VSy+M@ zn!fxs7^{x1RN-YHW0+OO6d;VK*^PZh*_^ zC+Xyk$u*|j0)&GtUB-weizo%kRPnVznxW-s)!$*#|J1~nz-q~*iCc?e+rO)3B;@+E z)ZMiv21-e!s72NDJq^irNqED?i=+m|BZS57hqLlNPcT+Fzfi7D8c`*;S<`+8e*H~W zr+MrkJcu?oLp{5+j=qI>j9tZLsp7r0o4L4WU%fQWT9wm9Gf(Ka)Y7e$4>x({%YK19iO){1yagBNk&?kEB(=@ei?Y(^7 z>L>zM8@8icDSgG!XU@Q2hch`+^Y4}zpzZoN^HJ0^0FZ0}w-bbFhCYcjO%u31ZL={D zxKKHldcRjS8KEf@)-(&v+8PMVFs)HBch-Xq6*Htw@?L-6>7g-;rc9Ac*nm3ufKisa zc$w$qRLqn(3)zUKW6b;CJS9bu4qu}cTpq(@BTm@%`t10u~a zRg(;FkUIDnb-Q3r2_wr)q%IpMT>&F{cXO1auPc1bv0Gv6$(L7`=$T&?H`wjiJlESh zJYp-qCqKfFn7#n%zV67ym9MuKb{+4^y191ik8}`^BY=?XHK3&Z2%}Gj=*_mJxGRh1 z9aLQ;z_v4i3x|g?$eAR(M?yS}cWFRi>_zfkoay3A&YIB0XVDEI3nLA$r3|xlOXACV4 zhB8dvSXlCe)xvmrPHI$v1VV_rk?{PQf5=70KlkSCg;;!dYVnf1>EjV66KcXrfrWMJ zsMyr7q9H!VTzIF%=J&*MsBvgSASYt+=Y98<_4QAF6Sdpxd8Gw^t*vk<;eI+a6S!bn z`h!z1PkEPg6KWhPJZI+ZWO0`-5F@v;k~nUL?K!(-)HfrQ9!YZo$S?#s5Lzi6^$VY4E((OCxCC6&}gs-w{DEdtxu6`=$orWnv9p>VpW5V;*+}XXZ zPq#*Ew_8uIhgECv9kb|8L3nFFLVmqkZ-lnJegThsrkFh}2w@TLA(JMnVU+3?4VQz+ za^^_bUk>x;1dFQ&(I6LXhaO&@`43rWml)`CSX-lb!k(sI5`k-tYpt&B-m!0E5?em; zQstdE9bGhh_Ys#w_;nYlqv6n9KS-`0RPi|L4&(<$_*VMvm2gf*&#{bDXWz#jXD`REp$A%23G;TvCpq7tuojE)}c>A zrY|1!!QU(}$QBtV0i-yKAcWAaV(30l#Z0+4DB4aj_SWeA>2`aUa7Wr4TP=lXYYpbC z0wiQszabe(6r;DwDz)d+8|Aj{^h{?eKquv?+w;1W#kxWNhW*eEDeL(V_geN|r=$kj zEVQUGcQe$A&GX71B4?NM7y%BVpL7m^|GXwZ^->|eYJ{*ZrV~f3E;e?S3LP7R>Kl(2 ztzFiS^?#a5!V4KS0bhQ*aFk?TMyUL@n5-=RpDpce2=K`yG~JNan47f$hln{U2C({c zDaJ48ij@V^;f^j@tO~HK5}l!0`7(!rx1l0k-GWS#Z5 zMEx0VBijDYDZ~XGh+-kL`56+(${)`+vak8ZVMP-k>%3njIt@l#=6l2~+IR+^g;6e3wgi)@J)p81ZA5G~o~ji}w$vx{Nt=n<2+{1lRG+eB1~n?^JL z84+wl3*Md*Rvjr2_#Qm)Y|}lUe&Qej1iA&0Q)S1Uv_Yqi_G5_&)CevW=PLjFpgC6tnka#e~qFN-*O__b070OYT`;O@x8~U5nVs7usop!DM<8Jkz z_4%5xg@Mj;Uj;xF(V&33SVXMuEtwMBg?ebKW=OeLU<{@%T`*hB%(fkB60am@f&p$8 zuUMpI*s{6Y%AIfx3F8VgyP|f^{k(6yd0MCdf{6ld#qHQLk(g>FrihDdS~Y?h9UeN2 zsZ?dM80@<)@5sQc7trLkJ`E5trx(E5b+Uj&^RfXe8u1|`nx;2zay6J43df{}xakvr zI-LKWA&%?K1nL=vOMiIJW;150Dr3jVf)}X!LR5U~X4z9njql~GXzNs94vAqunrk-x zs#AdTNI+%(Sw1l$L_|258|WRL9p-pwX7P1Neuw z+k!$2nbRK_rD)y}t&NZzf8bjF&b_yzBmEpm+>-F{T_?pq*DZ*Wv-(CmW0^I!fLW05 z%E$mi>Ivw+i@AEKOvWeZ7biqtjOsel$W~IROW;D$-ucq%V3^x-BJtEvIGO8?i}-Zu zrZLkr-QVX1EY6;d#9C0wot;THT6uxY^y-3)X%>h636duTIe{n=3 zl%uQOy7C*pn75^?nhdLkMf@2r=FWLmqt+FbAf%${Q|OJ?{yjI#W?^sN8uyYPT}PY_5gDsl|fxe>|N7b0qNcwPS2-+nm_8lZ|cLPByk} zCmY+g?QCq@+&6pg{l6bzs-|Xs)zy8@)2BB{jsjjM#qbac4M>}{|IDIH<@^3u@9{?n z@H@BO%n7D{oGbZ08$1DLPXHN6&!c(ZIM0oXb2re1lV$lPw5|-}Z*au}X-EH;!Gm1-(9T$I%rmWw z@feVzT2-I&w3d+vFma@!MyMGbXNR?9hxlWE(3m*469XIMl2EPQ*7v?uw{f1KI#r2@ zT?1*)yQO%yM>|;uD@}4Tc>K^G^$Pj$3J?;IAqBvYh`7 zmH75wTA^z1O+sakKX{Ig1u>>MxE3rRy*gp5$4;20-Z_?~L%WFT)d9cgH;~LWAg`l5 za08AECVcTL-g%%n*3IU;MqxsLuRQBbrmw5dk1Z~J%2c4M-W`h@v;Xt(HX?vZ=H2-{ z71*<$Jm)z${XZ+&`Y)st*P+Qj+qC7%Gcy(Y0GTuUWM{e=wtffHeRWDcj)F8#Z{<3` z5fDDcVD2k)n>C%WI&p1Om)T=lY0qDnncwJ6w)RuB$g;d0eVv^|A#>c<>d09zBi6gc zclE>+zCLOL7Q~H>CWAY_&TJ~c6(Bx8|7JY4s>ab(0UKpUMTin6@eqZXfNsBmm-=zS zFq)FR*s6x912%UE*&t|9^_>)Wo!b9PV%Q=8UO@;2#7Jn6C*X+d{xo(A*k^pR^Co=| zXJZ^z#`kq7Egm5aW{{~cit}Xe;t8kwnhmcxTSs#0Fd~26*NU<+z&UZFheJ3I3u)uH z+I*SrGJ6O{7CpXy*<^KjM%U_l4__JHWS%?!&V#fS*=76v&2gWY|Kqs7gD8N2xmEjN z5I|`N<~2}Cv0Z1Ti`-lcpy+czmf)t0yOdLKNgE@+_ZP<%HW^~_XSGv?vZ~TuahM{> zxG}mFPMKZW|9Kj@F#h24Xl|zNnHfaiNgm!(Caig4?oiws`~=NG5Zk{vt$U$95EZpB zIfj+oVHp^E8+H;g??V!zJeE~esi|C6$35#?$hL)v&of6{*48N{s4!Adp=ip9?mTvL zlJDDYq6d?ktT8NNBn8vb=Hb*ltd)Nh#A1U!0+ams|L|KY0)hcM&S@EAOnnS5D->y* zno^oA;VDCAbY18{2PAhfrt;4?x2R`nY9%rLoH&szHc4i}R!0fQ1ez3K%xy;6+%DfD zeB8~GBe=qmW+OH{{V;ZPJGOp&m_$F3`y#?J<>78&83R&DhONw~S+Pcvm`~V!p2e95 z=!Swvymfu4b_yJ~F>R-w7bRz7^l)1F5~D4>?zSG}F^~^JaU%~&L)N=lpIZtvwnyfd z0tugxvnHwkm5df*L>~=6=K?Vj;tbR94ma;N#sE&L1@(XgXhvj1KSwef;(v4fA24DExmJ*8ZbDGdOd2{nwq!fP=H(=r84%X|L~9 z5RkKAjJrE9*ZK@l;2!V*3{usNg!W0Zu`;SfN8U<(%v4P(x_2!!lH|vwLfKc#--L%k ze+J3Eua5|L7m2+PZ3b5jZp@A&Yr_^e*+gDFa@Mc@FTF_K-;boBdSxgF3lNR@?(!jk z|LQ9(rcUO`WEs$UHi`;!F<3;hKlkm%DhLxqOVFDz=8Q`~RBR3Jc}V`A;GhqPE0y9( zP7ujZ)JocMB&pK!^nDIs5J4ZYvzAs93#3_G6ZfGD62zxfi8HnoPdNOhVG~T6r<5d4 z5#Cana7z?^A$VB1&kT`euO$gFMj9=`-Cg#za_T-`Mp2%!gTJmO`_`C@Rw7+B$Uqzk z)VeD%bw%@z(QR?JYyh4w8~GKzHcQV*&}xSMx5MPE4MvF}m&LgnOfds%(e6v}vXu z4yN0R($x=*AXt$!e#|p+-@+ct{6^(u9)&P{__+cj3_2);eVr-NlO-|$>wL;ElBQ() z%%vEfid03$9T}_^ zBl+Vf)(&$-)g*8t>QQxSl@n%2)wZdFg)65>wi9a91k^H-wn!+%dGD>lWP9ImF>ms+ z_tkCg6Aq`UAQ+1)y#*?rx>Or8T}u8C88K!`k|K+hQTe!mX9Cm4FjiIb+*HDX%_!-$ zuKtc8N(c%{Q3)6M#HVH^#SF+|j<$!iTki;=FLvsirZ3`l9Ya4;k1;L?2BTl$z6fN3 zvv^LiuJ$y-CX}%XwBfe3jg~!((7&<|9;>Y^wPUow-0u_n9c#65*$J${Ip|{5#{xBc z5(gnu?CP+se@iZGNf*o5&$Kwg%^guoT<~AQ=Ej7mc0>GrwbSGjnz+pJq%UOvQ4bD4 zZ{oMzx*kAh71f-_C2EnZ&O~&It;)W!7O&j|(uXQlQt7Kxe=&d1O zX~l;Pa%F0dR@q%;T`3*OGJRez`ph;B`&!uNpBv~_!~p784y`E_eimE^tqQo1J$$ME z7sM5(r#o=+?jc>R35q2oYJ6rg6#57Ju;Rq@P8^a$?s^^^4k&n#{whwJYD4JPh(VEw+Se7hEn(s$Ks1@2k0c)5eBiMQlOpW!1iTwRA zI+0C3+Lf_DINFzO_P=)7Pr+_<#w69W%$mR%6hkOl_0;@t#~=?@U{`X2wc1hyy&Fo#Oq*B4sZP_-zWW;NEI;$z zcpF&z2};ND<;X~)TZSxM(sdHvHZcsO7DYRQM!W)%X>R}cE3}X_sp&t94NkWK+vm|y zJKAMwsQm)M1FPM6Z_SpvD$7QU0>tbH8=LMJ_1*(aeBQ~Mk~%`?A^6x|NW&R`^y2y} z#2pr5Kg+t+n{Xm(?wLv%O7u)&Xm!1EbRiJV18o2L`+&n*^>IY!xg6v=N>Dx^Z$})Zv+w3+=d@+@CFEMlwI=vxRGWL(_kS? z3(7Rju|D76?1-Pzl_rl=I-|p@ay)$a5xZ^#{hQMGw$O&5NWp;C zkrx6_ir5MlRK#k!!j8{aDV1bOG zG@65fR!eQc9EXi(zmR=B9F8D= zz4P2DdJTpzuMO!ieiKU@QrEhJGr8#( z)eqlce;+T)X+9W9J-$1tB)iA4k5NmoHwl`${1FdHi-49OM3y*7wNTC$L4@n#7M~}I4-?KX4OoGJqU~Szg^;9wL;U_!>OiXD7^Gw$BZlOU1nE`AdxqkFS0EmYcS1Q7zSVC}>zCLL`S?;xtcG`g0 z?dnjURe^)`H0TP>2s%^AZYZlS)P8IU0#j>ATmg-7(b`}a2aaEowSWstWGlxojp)aY znWJupIWLFiAu*i>+UHLHw@GK8sw^+@tyJJcfJg&IR47En{6NuRp`t!3UDY(>rY&=_ zcT7eB4z4Z(8Xy&$s8WjG6!iR23F#eX9Qad%tv74+`uc2MaVA1U@4BtQU`_j!YN7`2 z$-QlhF?#4B$*MBzx7pkkH?Pj$)#jH?YxaOw-i*J5#5uXU6OR%EJxW^%171)LwiJ8m zIai8)Wt(CG!`9Gj1-?c*aKbH8&mb;H&u%a7x-hF!CAtw{gq_ps0-L^M(am-+hpG6p8ArU+fuS~sUeE;)ny&=W z99(6-fS`o%GJ3L$VYD_%K-RQ(TZAgB+njq%{&liS-+gQj zg`^%Pe-~!%t5RD6bxDv$+fso+M!-WWhlxi zh{&IX&7S(^X0gdfnK_2ph>AP-$6oEbD@EFXfE3gQ`r=vdau0?&`zh*=AO$C7l0^$V`!?GQ!Wu$f66b1~z!GjMSk^<$&2%FmmA=7>>Xw|U?`dWO z@;lCLu1k=_CP#cX*z}dQbCm}(=o-Pq8GIoBxVCAw^8jiBK2aZ)FDBU?c_`q(ij_*$ zpq3>v+4ceof~@BJ8~{@8c^%@{@mgS1)^P|sqFpgx*jX!~+Ao+*R$DMurVFDXf@RdX zjVIJq%j{qG%(e(qb1*bl+{t$?(IC&QLD)4}ze2kzhi*6ujiR9#EV3-dN%6jp=JD;L z$=|H6QA&YBY&#LQn^VwSb;CL#5;W4`Qn#ZA)43Auel@o;B)|PfCjFk7Tjk#Om+vg3 z-9Bk%re3fAfE?|{2ElJLCK(e1Oa`QfY(bM6#uxz3L5wKM&-;40`SM7KrtpucL&~@$ zLS+$Q8J^(3RkP_pg*_H*0BPx)Z0#GNnh-9$)-XSA|3x6AVE}8vI8{-w_y8$Xd4fiM zoTV}Js>B|r!rp2Qw31SLdF+EMW)VMVIWYSZq&P03*BOukt}cX^$@#tTv8}{51O@g4EU0`0O5HM)81q`>2mD^ zkf^@nadkQD5ymjO4kFZW5UrdF8qIdA(5n?};0^4nt6Kam=4<<0hSN^J7NW7il(2d# z;dHtib;q^r@fthqy9EQ#cNk7P_@XsD0~2BIm8Vj44eM+340C$a3V@@3Y(%yc_jcY`t*jmiQvX)+C~5#tRT_N)AOT{htKZs7>8t9Dml z#1#~>0&yG|k#Y}cgqB!0V@g3RbVk_H9Buj_cU3f@MRVEiTWbjGT!+2yH~Ofxk4VN2 zBmhfyv1Xp$Ufm1W?j+Ta@)M7vRy0IJCe0>b3?`{nXNwINBt6zPNpRT{wJBGx9FYRaN%(QAc0_C)M7OJ4rFJ-(SPK`RGA z8QOyYXxiGA^xMzk!iOD@_atOoS1_a7%egR+FB7bIvOG8Xf|BE4ng(B!(mn~?{#ILe z0ChQe-zDOky(-ll1$dC=og5kN#Pw%1anJX3Cj7)HI7RgOT}Ty*bvNk5S$6r2Y@CHi zN?1A!4b0}V6xAg@F(~^)2%rM9i`5&%7vc;noAO}L=_hY{KZ|| z6cVv3mS>t4tchhjtz%5uf zMbrWzr#yRr?T0n`>S9J8`7#5^fb-A#Lb#&fB-Mg2H-wqsK@1y@J`Ucfp4gDuY*7oq zA7Qe-K+?wjvj9eV6?#()}z#yvicqVI58-G~^z$o7;c;;L! z@6$)0VlZb-YaImy=&QRL4w_7YuVgv@9p2o{BMn(Wmq~OF0Ku)4|5*>sx6#f7egw`_xnmx6C0sDQIOQsz*$SJ1P=d(V3$und(9fl!hAM&C5HqfGO3ES5(nvNBQ-$g z1#}Zkejk*Vo0slCvdt9^$PpQ?&s6^mFr;2m*#3Fs08sZh=9N+2K`aBJd6S7fcwtE( z{Z^#5ZU#NMkulxTz2f$IGLI^!j4@$0D+OX2$YDBgwAX!G7nJ~eL~k@yn!|_V#m7_l z)_@F4Y%QmRDV7jSXlK5MJcMLgBB=1yt4@1t=1V7IT;V-DY&puk3< zEQ6>pU4AbnAZpeggHzSrIKfW1&MT3( zt-bL5ah|Bs->P?4`;*EbiJPG2v$zR9#xAt(rFsbGMZlJANT}lNEg&nEDiqkV=p3%=v1fxLUd2uOs~OvroTB2+MtWDR^hmIJC0BFsHBQv`E(c}1hIdW zFglq?(zH15N|GIm0uGup-7k(M#uZ@2fK^MxXih>(#d|!AS`AFD6_)4O>fLNlCjoq~X-O&TM{A7T&ppZF+10gb{WFR}F zja51ZWcS%B0yoFek1#$7Xo;P{M3RG3zo0g-SFnK_!a&-x;Mh1qds7rEk*&<7%Z}MN zLu(W@Y0`YK1cPQsngrd_~o>|F`I z2*x!@-)|q3s$eHN z)`%+y=2s&MTY&O1Sy(0cA}>w|YQZK$f(RSj)`G(I0jC@@Nn?IMYz;4>h(-|}Xkmy9 zk)Y`DyZV$@MsN8Lr{o?e{b_z05(V?z3fq&-b*+=53M|>2DzYR(sEAVB23ok@H z82k)x5B`eDywXbOQ)n9g^!?=6wlYF^vI?@OBsz`T{XE?f%AKHYrj`GP2Hubn>2Eh1 zL`vAtrDyxRW~35@0sZ2M{{{lNF)#?5rj4;H5oCq*VFP++4vTA>s17~x0E!WVPKWFV zY%aC5FM*D-ci1OwxL=-?WwfkQ#p9xefp|Q6I#8Z17%@{kBaC*{n$dYO~af+ zy1&Cf4_699K5q6zVgwDdwe^Q6)Pr&-6EIirCOF7ZUZ|(CtmDZVc-GcOCl)r#zqtjR zAXVAsT1Nw_%s3WRsDeiR(7lvN!@@M?Kbj%`(q{glbnfm@UP++Y%nYa!Xl1dXC58={?g#3d}^ zhXS`DsSZ5|ohZkGpX3BTZaUeYl>+`R3*g5P9in_@?_BvXV^bLd7|sL4&LxmnsS3P) zSdWh>R26iLkG`=3d3HP7<`C?)qLTDJH8QAP@&EO zBk5|GT%PC2Fr>A=1!yxoH;OT$F}0f=A`D^-;RA$^{v7`hXTU7T7z?oE;nXnUO(ob8 zrlL>Ml~JbyA-yc#ODmgbntb6^Tr>8ar<`lCazGGz82|fiOb}}PZccf|AcT=~f)2w| zZf{eJe`)44!}Q1}6L`EB>ns(zw^WG&f+PTxmc7qzH%H`VZ;WJTmy4_s|Eg(;`QNrF zWH^wXXP?#&K)Z&WepKHxJ)o|qzc&CBI8K8Qri9@u2O?f&Blxqj3r{jdYL6m75M%4t zk&e0I0)`I?*RQmG(uFBa!W()c!psy1g)p3^}S;?YuJz@hKS0^?*!TLeI0OdqpmV9g`56ILhC}d zT;C^)g}^?fFZyhVCfF?WW#O2*S0av<0Q&?bs6XZu;oLCtV)S+?^2^r^zE) zMo>UXi}q0q$_I2S5L+}*GEiFo3Odt?ZC)2zUV@_&gaWWwqk}!Y`x7qVxds>C;s(lV zluK&g@2c4#=9*_oS$fieQ^X!ahjj@?sD~3fY1vvi3|UHVC}+lr3+GiL`#vtGQadFj zxtv7B0`l}MaKihTj-dT0f;c;oE=wD5agslaXxgBw*!qr?=Ea<+BKsS!E#5F-rrisO z45-m;z+?Mg^5&Ohev0o(S4sxW*p>ZW=6iJU;(FGWAHcI~awpMqtK8r5cgcO|ZI_82 zq0$;X3_U+Q^;UAxXW!bd+}8j6?++Mk%@o&#ta+)UUfHmB4)c6F-*kR~xJ)L&RbuL` z=pq*ItNW!nylB6_)zuiYWXg1bSjtU;VpSi*=G}#ywhehSgncZJN7KV1 z7s}H-RG@EGpuw!wmk#)q%rwR8WMd~ zM-#IsS|zLdy7K$jPU2UA>T==bgS{Em`&a?-`&$wJ#B7#=JXH4Vk&HnVu={ezzwfRI z?VW<$df@Xc+H@GGI~Sw22K-*8*>em+B5Od$xLmnMV}U~`bkElp`mAEyUI-@;q{+tN zb-n+gQ$>yUOCDq?YL*rs#InqSv~>9#I*0@LEC`n_OKP3UN=OhXH#Vc%Vz^}g-uh0B zlI@k=;hOtLQlFK%I&|J=Qq0p|{0tG{-V%6ht(fnbpYjpBm@4bF!<*-P}X7oi1*_v$yOyLo~jS3uA~ ze!KjwNyXk&5#~8~AsFY<>N+H0glU(?91xk1UFZrq*#<949f8`fnz4!Tc@4fCXi(ML~2Nj?vat0>A)7}&2@iBHjP z75-O0hiG?}?@&H?WA|R>Hd|M+0FD2Q07#SyyeS!n^Q+G+o-+$OETwPT1W;ix*>cJ{F$##M7Elv(AU>0d;$uiPcX$)$F;|% zS*tm@SO#wi)*4SuFhw*-3A(3l&p@aB^QObwIfC874FBJ_udh8GULTh@-OGH#88rop zz}uxv(ExJzjGy}UY0b+R4sYE#_?vTT%h?YvTja-97nZGYY%iMU$i%K7(KWwsinbA` z;jgf1(RIsF&j^QeMP;o0G#w81J>BJtPVug1eeZJ{pqFv0J$JqequPf?7gZ+uR}ir770@xnx^oDcUrq2 z?Tg3apl)>LoC0D2JRXa`qBt|R3^djXSm?%*93kW;?q21ucq?({Z?qzPQDvd+RRdV0 zeryLiLoxK7-(cQNrt2#XQd5;zAcIfS;PZ=odVKEXSQDQKGt}Y$2|vdkpWvf_w~EEt zDj0_zw*jz&>Vx7JF444{#GpS1^w;3{rH6~xV>-(vl`WU~b238~L^D#_J8Xzoj6eYr zjjES%p;hZ;nTyAGI+CD_LF=HVB$X?@MVn16s`A6ZR4~jdN&dV?Y#Msbq5ynRvg<{u z;mQ|7;0IhIRDip%o6bcsxVL2$SZ;-%GR)1oFg*p3S_iNcJ^=!7&#W&>sYsIyiuC(D zqiN~-RdqUp30%RK3SUt9_2c`?c|Wjkst)^mS0Mv4E+~D-MqNJ#KX+deTEoaqQ*vfH zw0GApErIj%u4kJGE$Bw%mqoH(j^mrNnVs5HNCCMp+>WW+b+^--wR;x#cQ%(+e5Re8 z`@_*)Z=~qTM{bTF$jP&FewfE=86#|82D|WQ*Zb0oubV+ zzZ%G4j;@N;J-lx6b-P9CO8R@0v+22Y%9uq1XSLS*<2~znXZhmD;X!-T_}oa9hcAv@ z{|w-$Oxd+CM57edy1B2_^5<4m_uU55f}iBHuTIF(?N91XdboRG@pT4_bs%J5QyDxD z$oF_6K8DE~t1MoUJGJYx1a=7;lvh&ugQ~j`udXaDKC?QBgGUCmR1@yKfgPZGt_`ny z6ppzlX?tKgY=KB9F0UE0k7NmG5b8mO?iYVD$k-bs)6mA;dY#5hbo7_Bu!Xy|cV^7e zG8Z|nq_}jyU~;c{TFrrcl~{De+|4^MulhCv6&+mLRr$TG-bhnt4h{YhNadFX!_dAt z2|l1uYi9D8NNFt~F9e1T<5WIZX6;$sX~YiU?*0$CT-_5Vyz2#);y#}ham<|s=njrE z?($HG#0(SCn`=w~2?B#FT4;$PX5WKirDw*kX7tpwhH8F^39FVe0Jq$=bE`N|OyNDo zs1sH#Y_5u*Ca1eyIUmwjMfnK_rru+IYxULCfo^i=9WUMw+Y>k4^XKm5_jn*`uTPuC zndbN@2%d%tVxS}wu1h?md1LToM@qEv$yIqukIK#e7r`7h?t%uka0 z^}_)t4B09<@mhwKn!+_A{ohA-nB$@)}k=;hCzmm4Hu)Ui!8kFuIH+J=F;hdgL-|XET*|fP zbxzIx*@aaTpTDRP;}Xv`tUF)XP{gud;k9shnB`RE zCkFhHO5Bl4{)ZKq8Lc_yZYPf)(5vvk2`+QfkSJb6MR<|LGE`n*;XV4IdkF0YtA*10 zhFdK+;t^-Kef)lO=etEALf)+SyC@J8znHK;BCDqMysF<~QO)YK_s?7;6>z+$3Jnr- zqEbc3*FmT&Sh~XGAE@!YGEn0m4%6t*KIEGd^fsq#EIZOE7nt}?OoByFKn9>xl`6*M45KpZhIvZa@s?2*C8aKM0@~T!FfL z?I@~jyi-+|@kzEjfb9><>Ev~@w%mZyg6?r$Vq+hNz-P>}qHl@VIJOZ4q_F^1=07B| z3*9za*v-wmh-x(Dx0Lvlg705g&%Cl!U+Fp;Ncl!tV48Gzr=C|2YuCLXVku5Ht2^j* z(UL^TV#8Z`s4xyWGLNY<0&IaiH)UhE)8P1IXgGSV0SrCxa4fQDvAalrRq+~U7>szi zhY2(q1>1Qr=1e`AX8NHsPInU13mwl9?IG!^=xy{sD7jZhLNR>Dxh(T{UHjm`_u9hD z)KF9o*+CCQ7D(0qjGn3?nik!lHMZIq{;$tBfKGC#s#UMfCVs2wh1zHSK*Qa6*H68S zS=+q9#k)pgW=P(jY8q85fSZJa$vX_1L!}6UcSf0|9`1Dfbb<2|9lpFR04pgGE=G|v z$sGUr8&l_QMy4~{v4@vK-b?)WbgZKAVgKF@NONYsVRQe%G0lvV;8fpnktg@?CLz;ZC7wLIZ3uv#6LUKra7fvgP>98zJ)lj% zpX3QBWeVGthMqHdwHu?%)6K~?EmVsKi$7PZk45Jk+ zr#&N5V{-^??NjOUW3?1XfhY4#_wD{3MIdSNaZmy(8aRBx zo-mk1CU5sOwj+CH;c{^3`RAN1QcCX09foimOAx3R6wsjd_r8 zQ`hJz`1*S#dtFoQs3}fJv9Vbg@>|?Wwh%nAA{eoiA+w-6kh+;T&h5!b= zQqHPdw3z_HX4MAaefFR|$_vr!bjX@C1T~m9bke6mdiOWIRL<`Ij zA@EE{Par~}F8;c(HtMcrdl6CgVTxe_^`N)DhRyz z<|Z7sAD9t^%q-19C!&<-$DUfxjH)r+eoqQm0dvY0C8=eralf)?D*pMRO)MaRzsEiE z>+3-DO^^R#|Krof^Yw}}yP(R24P?}CFP2YLVM#v3A7Q~<@3EhMIk&ql`|IX%^C2`e z^K=;ki0(0sL6%U1c!xvTr2E8;&1z4FZTCU_wO?Vk@Y8NNA zO8l?>BU$u|g+~@Bxoj?CQ$hpkH%|KGvKjM8{qLWSZnB-;!i;39R%!_?~p?4SFq+0}A%X3P11DOm-bt?@hl1`FS8 z?Cb)eQ1=$vXGBZ>Y1}Rl3PxAJE8+mD$Y!K4ko^^QonH*j5_j|2)+-)C#M3HVH4<)` z!p9dGlJdcvi_};!FOzi-42Qd$rA3!V|5cWfB1hE|{IFW65WSUyDBUJ_sD8i9vydfy zU&W(qtY1-dzT-s=Ru=gH)>Jto%r{Ydprue4+q6@>{TT4Z4WhTdbUmkKG! zm3n@3@0}8A>YK2QbAWsU9d06yp&)G?Sa$~JKj0X@R z@J^eOahfeimdlOVp>5RW&7li_RTV){ZZ!gE6QM~hXCp-qXgl`;?7x~#ut}sm}Ra1*5Ey7|eJnlmB*CKMn^+?3OhoRZZ$M{sa4GWU(S!l8<)E>v{t=FTrY&5e4#dICOg-bj7^I8Rz5CvD|4Q9CDv>Odw7(m?KR#UTj21iL9<*Pdu7a?fGcs<$meTZ7*ZLP^nu>% zsanZe30dean`$T5VW}v!omndmY{;nno~Cm&IY9053|38Ui}D&Nn3$(M+nXtlh?=jiJn6%o2n0R|?Ey{}gym>wl;sr?2u^tpA$PI*ED5tVoMs-Q%ef?Zs z9{v1%qqKks71zyUiGJ+m5X7d`b4_nqxC*?y!BvOOQ%9BqGoQo&yDg?L`^t9MK#s}^ z0VGDXomzbXoiSW?n!Uc?p_5ZTmV4UvIj*h%T}3&y%n+Obm%uH~Cv835CuWm2ZoyT( zhUo|Nn4ME=MIaFKcw+1YbVJrkLIB#>nk3#@TYf|q%)h=035H`a&o-#>2Bcr{OGM|c zEzmSde7!)-^K)l#O&OAG0*y#|KLS=ovDzr)#<+49#SqB!zU)-1BGl+s()CsKiP#^l z*Ev4Wv$JZ!^sEM@n&UpFkWuvS!eRsb><>cIaIa=O0j2rL>QSchfY8?C4TgCz4lkfc z-VcdnYv8mw`0Oi$P~R*=`0;zL0y)8->-qkYLU%z>j$a^^S zpkt$ZUiBzj3C~n}tH*W%&?!@p0VZ^rJV|Gin3a3&aRu6JIwTfTav@0)^qQ=0LKUi5Czyp|KlVE@Za9GJ5w@*@2kKT>4kr&oWp8_T?Ogf@+SG3S(M1$;RblpvD9*! zUJt;otQ0Y!jnD%dZsNl{3LgtA$I544vsrsmHz-58eSrNEvAcEYNo#Y^i%-w2>D3ahmqsx8m4%8;r_jIV@vLnZkNXhve_OQzT)EPJ!t zJUaYt>dGyk@Aot;wnR9fXf|B362*YpK`5QVORrmI9lcu*q~k$YJvkB#}j4F!JjZjzvrr*R!k4l(_gI(!Oi%tt-n; zAWA*D0E2{!fVMXX(9X;s^5&*;$g|zw;q4BrqTcqhIyn_K#hp&t8`$@17NjDx+B8>> z2O(-K<1UcokG0VB~0)So5Jo90U#SR2%#PH0H&O76{>i&{H&FJ@=I z+n05SRmL)9-ZK+}9bjo;LVVOvW4J~AGN491CC98#qU3oDPA0MbPWeNoEA7@IVO6q2 zCFDq5Z(Q3Emd$E>p-rYUAO$G*tJ~b`XsJ`BgA7_9;}keeUP<+wmJGO-`WMNop$v(G z;~95fGJ82!C1>2=((0P6Cs|Jj@&k=jANzcE=8=wOM`zEJtL!MaASpGN=xXN5cd;WuCEN&4%yqmhS_h%|<@~Fpz&@Fy%DCZ)iqXd6s5e!=CzhK+)Wn zg;X9Vg5|J$?y)Zu2rYJOR@l4~ko+b8lfv&R$lv=9PxfiP?oafeBmBBWf8TaR-%g7= zDB`Yucn?=v#+Rzow4GIoW=J?>D^2q1D-k~z?<)!_3 zp!{nviES@6!d-g91Is-B?(zn8IAOZ?z{bsisiLfl(HMSExk>de3StOo+p zHjLhkS z>k&M5bzO(r)AzPP9C$0Y92o+ZgAWSlcLN*Fql%HO-tV+JCX67w#4<$kv#qCq>iT=# zt8=`!c;BK)FV`n}o9fM7<@-8nmO-1zgM>tHTmBmjfdzzL;>Tv@X2EPpsI0*k3o{Nd zNJk;#g7!2mP38Fxaohb)B%Wu^Z#fx_t)rnN_@S=`896-XMvvwCmJLaHHdpd$Nk49W zuT^ibpCfM&>RGWWpBLOHbvauqAHcw9wO6{(jp2>`gX`|MV2S6tI$zpRNa3-RsgLGkPT} z0KKBXF7`CS<)a^wY4%lBb|tcS{dRUE7^6JaM`iZB!<;5+=M&J5INheu2W5&W0-OBU z$QB}R*|RxC==zn#t*$>xjh@*dfiz~G=M&93%uTzb_<4W9wX#ZxQyiaqn|H&S)|JDW z4bvv4&6YHFb!XvkZ%h7t>*zS`>&ku@5$EtRd+vA1>I2k^rBepWyo^Q;K!h@qRlhrQ zT|~7KD*R@fXgbzw1uN%s+Uy{B5g|*U^pq4_AWq`r3}fK%!yOk!CgbhAetcf})ZF7!c9gknK*0sd!fstMrmRidc zSbeCgwM8_uiN3S{PZgw-QDdr#wd$vF9}SZGNGNBCAkyX^fz2F$J!acVpGb50h*yw( z7}f2Hi$Ko39uJ!SR6`qaxv|x2H#NZOF}Tt<&t7xr{+gqQn;I`+ntA}9hd5s79aDZn=!|35DCL}l z4YsiBOe}#u_EJ4wRt7YtjV=$Ay~Q2#zRw}2P0uV6f9dXX<`9eW{!~GUs?HUZ#bu^Y z3g+7p(glp)Q45KZs~s{{6_)7w0&S(bBwW4AHyoZSOgK@0wMWUIz17ou(=_M*E8+h! zs5PKD=t@hRV$OjykL|Wf26A(Y_tgLkHwSU2bV`a46ZiEUyX>)Zvz|$+Zmz4JD>V(A z97oB!wSykC4l2!0H)vA5z6x(54X=saa~G6LgOgOn0?T|I7~Na^()=HtnP0c}=MS;D zy5CB9E#Bkw~gw?DoMr8ymQ~bgw4?xpm zK>EA_K){Utxj+^m2jx)8!C;M($*ew;=WTXD5iJaxR?BfSPM&QYhwhBI6FVQ8Nr4fz zA_Bk8!Z2|(Ws6fTjJ;B9fw#2FO-@H`Lh9`?;V6k)6M_3-^^J37(r1wV7?PP2oAfMz zEo86IYF&+6SA0vPaIw5VnCG*Aq+=wEPtJP`q$L8E_=ApIgsCDu@2!!b3Y_WjSJF`C z+bd%DA>iN6^FBTb{T<8F6XuQQso_5E`RPs57cJtUb_-I+c)h683%8NWa3f};4$WnW zPacXnTHX$~QQ5d%ptJKA_CPi)TOj5k!nhFtIvY^SU3O|9DGq<<7MNDF6011ks6yUH zpUJw0Ulq?{B%VnO=Uaql8yPC{7Ods%AwUuJEy zECa`l>v!AT&n5G~YwYWA-?QmP#nMJ*x+<}qU@yb|=)mXe0$Mv6Q(J$8{0VL;*;Y1f zX%MBGwk^Zp-C zXB8Glv_>=Up+2r}MKpt-BMG%qCg6-%Pyqb^f-jSLqWN5@%Ue@{rALdz^;z$P|k9 zp5XX(`+=YLcRmXv&yyE=wE^2!K$Ekg#uqV!0vfEe`9)RoLIQl}r6jS_&5qhRxz)0_ zrTRZ{D5E8w_C|Ww5m_C8{Oqa9$4sJ#)n>{sVVwl*Bo<<{M_Ft zGnWXCB<9i(70~L?dDpWA&9SL62BL!w4D!_dkUS!J-Yb8F_bzc*TerSOJHpjy*iH?S zo&TjhP*qEuJ<`BtNYNQ8ez*6HU$|5#+Mg%sx*btmaJ+sZJbcBkpbbt`Um7%I{vLw; zK6tJLkvq)ZRt*?6Qni=VMu3zobRy7{f`l?x7YRh1`2wO^kyfcO7wNkaQt*Q9>fS=% zd|AVj7<3EES@WW9{_bd-+0-Ph&s%~q1@@P{%$7ZIc3 znXuVuMLvSuk7CUxDD=+nrGPUv?1PY48KIfbO+Z*_L}&ZQ90=M4+AH;S&kR!aP}pd5 zbPds)-340S7L5swgy6g`V}~7ah@8bI9(CW37g**|F5PndhN+&8e2@R~b>_;Wr}?qz zMAqSR(f%P%phWAi<=`Vf%nVppG}p;AvtE1BGnsr)nL*6H((K+?I`=W( zV2NF}`t{klpGR(uzi$tUjFf&29?roHzngGRCzZQU!gg9Yjb48cT=$=?bI^oR#@ee8 zZXN}z7ioK&ZjNl}6^XrUH{!6&yRZvo9b9^0@?~#{xb8s3O_HQ$w*>(C)1mAm#jxus zy*R=z?${_p*4#JNOY96BV8-)~I-DZcxHB5Z%!nMc0H7(y(N~p=py=9b{gAOd9hQU0 z;WRgRFjNoQRu@}kp{(f(+SM?fID&$S9eIkj+B|J1Eu41^p2-G61{(YPmmN_h#FzD!!a@881Ds?$#jIre)UL zO^n|-$16}`CX8L|X!xe_$WBhTkSMdG`{+e*h1)slSK*p;qL=j4I-@Q_*`$zj&88Gy znbgt5z2;{xmH7>Z_+)Z(UBZnGJJifym2o?k)L%dqAz~KYCC+HI&hAIWB#GTo$+c$I ztP0+uOIr<$`_RF7C(cicfjy@Yxs)04Nti@l5DjQd6@M<&E{j<@l;wf@KyWPEe`2Z#JC?8h zov5bk+b;*WcBJI=d>EcE)CnEYI^#VYSD8(-8gHMG*$Iy*C&5Y*{cALgKA2Be&~%qj zQkY1S^KL|!VI56rC@FmOHUtI9iPQYS+nu8N8sZoMAFl}=#v1{w6%vJeiEu$Unci-l0E5T1*Z@-h!L(y z!&>BZ+>+~uDcS}-log8L^cFuzlk*#-;Vwmp^Y9B+1Ydp$APBN{hXRBvd_WnsF~axs_RcID*5K8Du#IvN@>PymsW3|Ht=BiUFh;Rj=NvbsgPWB{Dk z4B9F{sq@@^>7TAw8h8O_BB>AnPZdBX^Ha+XbH$o0%$A2vT05PA>#A!5!BntjTGg+W z7I2)YtE)>=Q|mlD{gI_pd4C2bnsKKJ_&X>ywiU^puIwN0UzP)$xM$Z~KHbwgI1fe#;ump(aUFVu zZE|4U^}tle7%|ih&@s;szSF21&$r0Z0yfb+rRf)05IO5pqP#(8Ta>SQMwVB}r)zNS zLVwiv{}v$C(D>iW1QV+a^O(tz#0HNJkLsKscTr2coWIB6P_X*6U)=PIGFZJ#oPnBp zpnEc`N|#Z3iQ;>RNn!hGKs;zCQeolJYhf{6*fcZrl@^`AYvtdDc0(iq8h0wekf))t zL=SSJM=x2M1s_kozLFnL4@E~$X}!+&J&@`|9FJrYS72?1Fp;tqyjQGb7P|`CeBYP1 z_S-67_vrV>voq(1d&L!llO96vIa}N~*25$dvl9Nu=ZBmqHwfFhW~8%999v@*LXVtt zhx7cZm{#7mPh-Z#)qHvyh1G=g0fs$O#g`iWRBiiMY;n#3un`8$2su4jV@DpWxiD)l z8noMAxtt)rFkW;PHQaw_B16E%R`21^JC!iv=ZC*$A`}M@kBD5r^fc`dY;Ulwx-_3}f$7Jig656~Wv z918E@bdX3irriGG`3DLEZLj12mC8fNXv}ZF)Pfl3sj%(yLl*)?c7zGdMGY*ngcE)- zfU8h{VNdi`WU_$Gu~6a#b9)t&K-kShG?Ng~ZB>ZoBDYj>7rbL@bGbMuD8f=yES9;I zLKPn6>PHn<2LBk-j0ncq;}(N>^cAk%NggY|Ra5%?L%u6qaTLV0U=_BAdgy5bx1^YD zG~XU2ouBUiSbv6glWI?QW58p#y-xe%X1*XU+c5Dg?S7771+!}3E5uD`7wT|vAAK`(j z#-gw)-A^aFs7A~Al_)uf}XE#wDy+W9RJAC9`oH$#Z!sMqzM@tUIwKL5gPg^Knn zMxQs>AB|t=S0spVBfKBtpMOZrsSkd`b&;O9Gx@kHu@(Mr-ScT~twk?}WyQM96P9k) z?U41F%qpmZ^3GKr#c_SaVUE!+I7hNoOUlQ?umi%>I z+fE?RZBD;#kTVm-(>>_l7sSYjdX&Pz(W8xuyW8>hid!>KE#YSG(F>Pp$mp_~s)bTX ztF~A8#$?tMx)C}y1}9T0`@WY_P~ocHI2<#(($g0MtHo+LhuCn!le`Rg)`3jcNP z(A^-&%=Q@hru!IZ+)--Og4~)4_ne9Th?Cc!ygBR7-?7SCu*<`e@9xBIGR0GL>l__M z%`9!!d9OlC9cFA#xtLJT^dqsfqO}9NCPvS|3{szR7>N%ae;yGO`xTuAh)m}tH6^Eb zzo`rXk>9MoAWdzRkE3^hEg#dduVjf*B9VV{&qC(6!QwVAtG?whB!xVmFbpebLO^If;+w}C0_*-RY!C2+_$2Va|h{0Q44H+R}+|VQkHTm68qnI2o)stpLxZD zHZ9$$O@POQ>$LVtK%}U@dF|B+)Ma^vO+muEj3421<4TZ$?a2)!^&=U^W$jp-y{BUj z2xYzRxIszv&lN~{!}6%~!S z$gv4)(MCK()4sn>IMmlfX-{r;6HPkJ{VW4*v(HbJet#;48_2*JUwyTHnb;y=Sdeab zI!zk!E`Cdp&sVPOT-)Wb05(_H{C~TJA|#C|gVFbnRk@<7&HOlC*G)n0lk}>OobieB z!jRHubp3@2yG{wbMz>_tgGDcC8gnPYg;W96uh2?GPfkU#IlMl#=)W+M9Lve+!HON5 z>{*QT9%HKiI1}8&dj9aYY#?-SZxABSZu+jsecW{VNcz5Pdw9Md%WxU<@=g7OyTO%_ zXK9~$2u86`a21zohtOY8e4gFaI@0s~AbvaI2GyR^6xb;9Ys+!rRFy`tDs2llAj3po z^IVjg;BeCZnF$gAW%nHz0k?m?d27W^QgX>0)>5Bz$ePyzGhRCtGf!%@N;^}}getgX znd-iOn3F*9D(yiB8s^xQ9|+wBVNXJbhK~x?{i>RjohJO7WFiEmpPq>IaLJlbUo5%7 z?581oi}$)AJsX6L^&P0D?@&OgtK?K>T=5hw%hrwYZJ{W}M(~D|g;Bbm9`B$E+I1+5 zqf%#Gh1?@YN4d7?5m|;JipH8MOOdR3wWd9IOv*tZbJz64a>5@6(Pe*qU9!bxk`9%{ z0%ItqRv>iWEfr;-!>&_yNUXbVQxS_}5u(}W&oy8d(rsm~_?QL1#qWz`c_470si6ro zTLAT7nKRjNl_@%?$d+nh5BaQUtGw{*)BH~Nw~EI2QDa<%bpApU&-#Hl&O(d8eI=u- zVpSd8?1Kia9YZt#nlz?gY^FddvHt@c8mYenI9;i`6rkH)mB=i86N_D6_b|W{loZQP zG&=7*nU9N3Zjl*BvQx4iy(9R+4E7 zg0rwNNnc_)xHtb@3YMwkmijJ#P2o-gCL=yQJXcVL`)P303D6jj;VG3KvV0g6?p4d*8DvRXhP z_!l!9Ny)}LFOsw@|H7x-5#z?_aLxUEsLQxbhT?e9_B4EjArK{ zkUq&q`T(Xp;hKiTRxl6BzdK$}5TXKVMd@R{PI5ay26Ec>GyA-~M>_@29X=8|g#(Q} z)B=6udjI-3dDc$8sqT&o5Phk$WOq{ki;U#h8Ew_=gP6lCk}- zF~sgC#6a$MWr}$xmGS3r)JKGQJGj^Fcj63Q-`pt|Qqix;i%nZbjm*KM8ox4>~s~b}Cyb*5DIkcWz@87?}4TZ9!=EO9+qi5X} z;M>P@@)h;fqwP-_duzh8rLHb|VYypCPh(*lon~#;o<({InNSB^#?UbsaZ%+qJ%CI{ z`T)*4Q8up&QzAk;oef3}^Li>glTM!1oUON>I=#U4$OYrE_0M0r0yXr~Re8GIWLElA z8^ahT1iC3RC=a6;K0Lk3jBs{~cz0}vDX8ii@8=v%^{G=?vo5;AF}17h#Ww)zacwFx ztJ~k1Icj>HUoh$g0|sc7VS&R6-YFKVx^8@h&XX}O##ODC?L=`10YHawZt^IEVt zoo>x-KRD8pXInM?B+H>uKe#x;GpJ-wDPuPO_<|UZHi!Smu~GX#T{{1AurIFOZ=sT8 zEU6R(l*y$kgYI<@+S8AjeTy|g!4x(LYHV;-Tq9&=;=R6@mPg{v*tZV z=h12*ibXuEkE!3Nju!TWS~@1Sly3F@sjf16^K*}YSDDXb&Ukydt@2SSFc<9kcwix_d%S0S zCqu?NnQ4)t2wvt7bF0y`XJ!77=%6~ zOZXKU43Wu5ch@@` zF#=wnd1fb-St$4v<7$-6X|M*G^}ws00k_TBYYf(XPx{5)_pQGV7VPZ?=N|DB5NfbR z^xGC+v$Wc<%{SpUHH;!5ZR#aVV9(}swX{9{_ICxCi#@UhA{U!cC`zyJfWuC5%O?0Z@>GdLC(>s&W$=|tS&%xGyxWP!LVnQP>- z9i>x{ntJnRws@=m>HQb|gb1nTlGf|5{vDs4fU+%Sc3_dUj=ag^;ZFoXfx$s%0=cuv zj74AOc2RI=M^qHy^)Pcy9!K(OCQ*ZA12*@bWyOh8O7jS}>E)M#oOR3h*t8w!hFj}S z8PQJ6Vk+Vm&;s|b*4_5jeTwb8QobhGy+u_~GdKc%dg)@@W%>KEpL)tqcP9_VPlI~= z`|GE15gSy?LJxFKdtVltgt*_E%9@?qYWRmJsbt7d|NHmE5YrQegbL4r?0H7v{twQL zCd&zaO4TfJeUx=B;awW4wB`=mWzibF-COKhHZ5SON?oXAvWi7wNt~N-rk~kCyROzy zlZRlITxvmaP&8|(_F&*L0)Y?(nCuagP>0G#K;;hwgmJSw6}Mh)0yByYt@om_uCou} z>X1_DA}fjvWH;!`l@oh;X@GrsKu0l>vjXHE-YevV2iu8Km}*yEAuFzd>4b}h&mWRHClWM-!NO2oG^^LE6m@lN z)32pb#8?sl6;hy&3y!epY4U1WdU6@%jLoCH0+x)LO*%6rb&{f@3v_EjG$<@caetzM!9Q@4xr^m=jd`k`RS z86-;DC3U58imx=DsdWXMHi6Z5!JV_ zzh`6VdzRYVkwUK!o=dN~w<=PWv_kZ1p1))6Q<^ft$m!1mHRll%h8e_k(fJB0mORd=RS#5d-dY;2TKb z;!euYx%tm))uqPsVoG!}6&LqY(m7NagQp)@YVc9+n^m#GVQ!Ob?GTZBw6^>BN1Zob za+h;Y7Hro-f0U=Xyg&yZC!@K{LbizHP-L#3uj#|~OScVbiA%C7S&JZw0r4MediHPF=oUYC zTatE^=)22%(PylRa(-VodheG@RnNf0g=Z#iO2%0zD7G{-kIF~pZ4Hz{ z;l8EBFJ09NG2U!>{o22Q;lwFcHy<&_*4N0xLacyx@m4nBxLTRmxSN0WV%)8|e`H4t z1GFI+)RS-#aDa}3%$;;0p__rxsVd2#edqdgSWk((`f}6)MPJ{Sv9K}D|D|2xpSL^tx+}aeOr2HhJB{dJJYjzXtt)L|!q=Q_)@fF+J$N9_ZHm#`EN6c}} z#H&Wb!SyS`#DA$M2NV^@^_L*7nc54cL6n%5`~9x3-YtKOVG7AkAO{MMzhy7N8P810 zGR|^yYxT_`Fz19>s$rRZ&NX_RH526FSnVwr)8ltRyTsd;v-EHw-DAgPNG!KJUxfD) zHh9i&2qpI>Gl#|2)F@2qkC$EMb>md{LknSvxz+#px+g{6_^?w~mVPt&-e)IS_Cw61 zlQBJwu$yV)(6KzX2t{S(=fsKWFHm@zjMcu?BtIvDeJkH@ZmSltC4K}!#NQ#KBKBIy zU%Yq)2zKrQ66*iVEf|}LZLp_)u1Nv<4QEmI1>Sg=6TeVdOvYPc5<9@|JUhah;+QSxw8o^%{OPdw(UDPd|t#J0?b$Lea?bnK0j zz(6TAtkeHv0a%9gns#V+JCE&^qIZiN$KhkkPQU?6@xBzRw6ah9yAlc&{q3U1`m*qo z$vy3-lz5$Dzzqr5$bRgK)b$GdD|!CcXsb)Qdy(8mr_Y>yJfgQwqzY{ZzgoQR!a~y!2<2cnP}a<^`cjF z&J#jW>s1qzFQ>O|!J>i?9?<1e#RfkzGuDr9gu4#DiFHN)LFV7GGHDX%)HpOU6rOgP ztHXLW|4`wBK=d=oXl|#Yxg%2_rJzSSKH0Id6!+%!R)>)9H#8s6t^zH>{CzX!sQg1n z7zHo%>5-wD($(}-eeXic>!=wGWH8={iSgHOPOBSa?p0* ziKx|9b-LIQHnjkmeVBvOSzAs|!%wvVxwkCK-FTkg4~FZ5NQOx!1FQifdD$b)!p!Xd zVC!?p@GBsOAHti9<>j#AUP;4sU3jgwIK3s#m#dvs*3G_HK+#z6(CIf^)Y@E2B6SG$ z#wbA)y5HA+P(F~TuRjJe>R{}$9{1{)I@=E90$F}%3C@ca3C$sK)Fq7UKuKw zIu_P8Je!m@B7eC}W>~>XBum;I{Ehok<~)RdytC zDgq7Kik>+UrPknxm$qskwT-Q>n1>%12mp2%;?>xEOyu%Im|W&%(k%+Y+vuKS*nc~7 z_beQ-xy5)6(F`2b8j{2ftzR=xFIV6GoK{?8IQy%suJc@?!e;HeVJm-^d5Y zMbk$WvgjglBIO|VM(5gO?S!y@xNnk!XSXzLSl>eFl-401{HwelSAyUUG=+oVli@sI155P+sujo0?TmsJ<$MaLG_ z&MffKBX{pg(EU3kqp>Dhu^J3Ujdt-t`&W_T0+C~3m9yf!!jiGwH}A6qA(5&H&54m3 zjfk)k@?YTGZX%D~Z<8#e&EF{zzsMpipH@Ytame!vB8G~jk#NhKg*gMA(;@P)2agIP zLYAvSR61JV+|!E= zYMe4%n$aTqWyZyH=ZrPvrqB6y9CcrnD+hvDDkeJ^>@>Q(5i6)?Fv(u$x^MPfBp56A zT{bj^pH>O-7&~?DY{okypmD2W*0K<@p}8|;1ZZUrrl2)-Wzxdh5JMgyu9q!7=Mabj zG{u1W+S*vZ`Jn|Mol&xr9i6XreGwQ&bRgEJqe&OfvzH|NcI)(2dA_~I5D8*ueq2rl zlUr3ah6ZD$$#d`#rK?WNqB7R3_8!cofg%I$>9Unjc&s3&AO_aE=TMg{!GycFt>Wj- zFmKDRo*f&R8pRfA%eF(1UkjkjHG>+GU9oI~f-{M9 zdqVkbw7bNXIBag%u-d5NiFN8njr_u>QFA*A5(XVko#$VaTHVsT9JrD1t|W$bzh77# zf4^cpyxk*6i((iQgR<%4z4E4ZZ)s}_ZO$RWoLd^nAt^-fujy7Iy_e$8V0ZLBvawxV z{O?UvPX|&73QS*utd!o(4XVrJl@haCs!e{&YXx@Ce0@L&3%^OI2YG+ku6X#NR>)9b z`1~3D&-)FuFO=fhoI1@M5+x)FoNcM?-_+g;Qh8El4=yMqj0>gt@H{&&o2!$DOULc;CQRn$L)u8k;<8lH7P< z!%-n7h6>~bCKGB)F(F|UjQ5MEGBs;$4Nuzat19NQjuTQeDRkV5%2} z&~jkEWvlq9LrEJ?4Q%sH=}kfRyUW}%xwCT2mQ*x% zpYvBq#lnToNw(kB=V{O>ibT@2NK^vVp1SHAjR1;dG@6CLW1EV@VLS z`o|g}I|Z{RI#ju-rj)B|zXy}IwUjR=fO-sp25wUSE+as)Ti&i|?P*PeM9mS=W=EOV?aPLb-3*Kw`O08KVE3(k0IIbksgT2WK+Mr6&motIa9>#QIzg(0dCs} zyWJj|16fM5-`c{+H6I5dn~w7g$fD} zmgC$`V^wjNU&-)PhJdT076zU;J`EfPI$BBRAzcv@bxOv z7$G1t0m|3V!SGJ06H%oe4HvzNnaJrqoL+#qp#W4oDd3uu^@Nc>m;evDWNLpF1nepN zZH{rq-CHokm~D{^f+ey#y)O=jA%FAuDAi|lzua93RF-%diJS&^*0ME@+x%DitfKp) z$JG>nZFJAdH|VyoEhjg7w91Z@PXjM82Q6xpR!~s^dfO6Q>07gRh?7t^Np(^nTXm?C zf16L+RJ{~L|9f-&XR-Ww5FmrFXIm0r7R&EDH$>^w;8$oKWg;rVTM^(f5??`WcMKS=s6 zxwW4~mF*G6?KSi%fAC)~@iX;Db7|G+;ETUZGID`-hH93`hPnClYAWqphn0m%*KoSV zNhzeSkk*KZbS3@GHo?e|53AcWqkc^R>D|qZ5l~qosKo9gnSR-<<~t68wQ4)*7%a8l zDDa%H_~;XS(p0*-D8U6c@xX9kaEiu1D|<8P)1fFdD{}U;ug58cOr$XBW~rfe$h@zPp*C}^G*`_V{i$Vc+>3v-*nvOn>cghr6b62$pcytF4#XvkgkviDkns zNEhNfKI80{oGVuK%9fD4t3whAllNHx zhATYa{N2s@=V9*)E2!Ji=(@=cYVQO$XYE5f9de_HCg2f(L7dI=ENn|6JmX-R^|UJw z)BV14!O$i6cxot`LPqid>v6M|wT7qv<5eMdJAC2hFM&tI$nCg6ySYn+Eo3yO4}vt6 zk%dF@)D;i*xbw~3;`Ji;%>PJEpH&!zWLI}#c-~DZEAKVH6d5&YddxFzqun#qHL(=^ zm16o@rz89m%1|E}ys%GeeR7orPU`X4E`@n-d$n2PSAuL7)1If;cVgBO;&Sr5?IG zHdANlIlygiNt~5H?0@YbU328Uv3K5rgzTb7Z!wFfzJN6+V9nw(Z_K=2=k9od6xYGh zhSY&K=Rx2x!T6#Hc>0Ri`x!?BbHuv|(7eelH=O@ol^hL9`(uW|#kqIZ$WLFy zUvb(^RJs1v5XZ#jZQvxzQNSWry_F5yd#w=w*X~6qSrkJsKvb*SUncOryj#+UJDPI1 z7)&G0+*2lJYRX}8#?)*6mHy{plVWPVpOPrXoOA%j>Ev3pE*Y&lAr#ECLTeXI9HkEX zMkzi2ocWqW=1aqsG;O!r$$=0*q1B?-9O?Eubgvl|04X2j)_}`Kz@l`bPvR>B2s(Ib z(N~o*7oq?#9?MIWh3FOQ5)Gc7gTB)|kr;e03@Lkzb#$94_W*N4^YxV1Jfoqn2w+)W zhU~lOlk~9#Oi8xI<)N=iTLP^wl_P$zI;4>S#hx;Ezxx4Qbi9>+aT1Wwl53MQ6p&vY zO%oP|+cB)qQ7i$NTk3A_X^Ez%>{nJ+;Ae;UhzPmPp*7Be!;&Teo&yJR4)Gs_xby}! zej4U7E|*44fy{4^SPrqmfA#-8#l}X({gh*B#F?x0Cb^~Zl~CG`aB~F?F-egafAW+I zc10QVVTFz;!mY@>0Io&hn^m(2Oq@J3qMb<$>K%QNYcu6gU6CWNtWP z4iiOY{iyo{?#9`S!Khg(Zv5P|363<%M!RaGe^<ncS2NC-vDY>EK6f^5A6Z}PCjgeR!#AH9FQoCeNguhI48 z#Ws~8rMW`DoMvKO3=~LarbRnfMTb^g0UTN zDcS9nOqjX5GMX--Y%tUN1HJExN18Ute2{~)8>hNaw@(S^2c=(YHF!P^cu_)e&o<+# zT^*BlUSI>IjshfUE5P8h%ajD*;8Cw-Q&uFZZ{#|LT;yhf3V!0Ere;To_b69z(iVq& zJIvJ}=0)`|K&_p1$lAwag6L;>5_UI6063M1-C8Xsf~;s&qHnL=)bjl>U~G+MZ;$xw z!pO${)orC;Omn}p@_Ca=X?9d0u#vJ*Vy+v`S0UEhW7HC_h*t3l zmR6^2)I4e7L}#UTJq3S~DZ5+hj9eK989P{RvkK_z!6vU+6^G&PSkwN%nSXM!`1Gg+ z!$}8^wThBaueF-<4Tb-Wfn?P}f449V85y(9g!QP5`ZLWqA@B)~xt%|8e!V7J!Iq|4 z`ZoY`8BOnmNR4MXmCgqP4>&W2mCvYf5J1tZ!B~Cm+a+b2{iy z*)M+t%X$sw-J(i=$>Q-%^YN@n^Vxg633CHzOE=p4aG9ciUyV4)`^zkdz2=(VswH*w zS-EW1dgX9`=hLU?ec`6Iz!1|&#ZD{%W)7&-kGj_hW~R-B?_P`Mu$+npRgP#gEBTVq zKAnKjcNHE>0)dr%8GGCc*ljx@7W%Ly4AlUjrN5dPh1jEt2Et%ZP$cop--ERb2y9Qd z?bZ>{7J?IB2FiX8e?l&B?pD9SYZngKOTHd$0c^#*C(=|ib42FyXo z)J$wLhV_Lz$!QJEFDjy6q*2RrRW!fnWM>2&bt0Lu=-#2%TN3!GnOKB$#3=AfKY5hT zO<@W4!R4VjolM6MhRZr@loD1P05MT)q#5S$H1TREywADc{~Sv?cqVv%q@{2c(&pnDsSJU6@;de0StYxOUzMWrrOhIHjoU8G#6V!?G7~k2dq4`F=!nG zDQYy^-cuP+PrsOFj$Q$E!qVF?$BKq#A_FbnD{hW0QKB=V;S@g6CoZ~TnE?S55T?is zYIC7)>Jgx+iQ_t>EjHCJ&&jFCm_|X9%f^)_KX0DXVs_J+T;dDLxIV{ghTtEvD5V}m zeozjm@ySChWn^{qi{UwWgX*9w@Lv`d?CQceZ4ArtwijuYMjt#CRlLyAlL>~kYW~9u z_`jHpDoTifYR}Ih5RTxOth`2QO^6DNv96`{O9EU?F*tx$f)T#cJ=SGib$trk`G)MO z+f`Qo{h-ZbI@y*^g>dGh^x%9+W=!uM?2p|7{)4vXVce;Z4W@1H=N*nWUth1(_gx}- zh&tEl5iT;`FCoK1sK_{MKg|q>>70@SY43vlRK2^(=5P7mFNxpyeOs~!H#H>iMia6S z59JD5qle>PrHa*{rvecksaO2thP6KjM1mcO?y9o2#fzUY!iTk0q+tCE%UERmN)g-7kt zcZoy8o#rVswSwZoVH=d18-0LU&dqP*!VHQ{COA~TSW;}dK-*niB#rfNL$kYoMKr{0 zcwkI=A>l`CCiO*;VKD_t*KTsUuv~8EOn2TeF7Q4c&YX&*uskKA&#_)Q`V1$y4d64-*2ChJ|hd5B5eO7<~D7|k~z~@@;SP& zEaPO(W(^;!Ol0;v2CbD7k8in~6Eef!EOExDd8-oHDnI+;B!Arh;jS;tE>o1n@burd zJ))~cHVecVdc3ISr%D91T%3HL^qzdu8@v?bNZFL2pfHyva`RYZDy-HRe0t*ci&_M( zwe>&NV3~r0q&Z=m9UYb#<*Q6{jRcVQ_u|RxW@*zqT7LCv6MClVbBX49G}L+`0c6H```O>jW;B!A~so4`IfObNhMR9tdrl*bJtm4yo1E&D;#K;)IJ)Yu@ILry5S1mVNvO@Y^_Z0DYB?P1ygE7|Y@U zH(Br|($`^_Tl3BP!E#qP)vaL-PY4+JSOdo2st?Pniq6EMKH*2;2p1X?=bs}2=D}4) zuU}%kWqn7^+TFb*B{>%=Mi_n*TwpIf@~L(Gi-lHr36kBEgDBH&$J@DmdA%HlEVXoMto@N)VpcF{=1uYpfwUF6kgL*sT?kkFd= znnahjs#srqskk)g7NIknW|Z#YUNhfsRP(_+e6ug34ui;hF*3 zm(Sd;X+=U$?6cN)BJ;hCYI?+YZ9NO%C7w<9sg6h*#IJ28D#Y%CjqaDs*@&5V0squM zlPu~N|HAoX_g!{@GGxH4Pgpif38Pa^VL(I((@-%23rnlch}J)$PBFyvu{yRAR|)!f zGBRNIM{aJ;yau1LNr?vMOz+>!W_Ac!RzyyldQ#7FE(iP@JEozAN{EuUoB$=lS#%BC-dspo+ioS(KAfHQd$ z+0EVeX8&NFheXNT46BS^L(lvNR=j zqFoUy-!%sz5k5oD6(em_`+x$h-(Uu8lpzP&9;KkAk9uAOK?S;Vq7NK%zun9T)2ACz zg51u;I(tQ*)k$HAZf=CJv2fTUvUw_5ajT~$Jd-m=qQp3Y;~g3dsKf8fkh`ooaYyac z5C+ihK_$;?H3gBc5}a2>Zar~)>*)DXuxwPN0%gpnM=}P51Hf_$f4sOb1W_11XFRa`-oW5}JrRd0x|Dx#Q{YvEd ztH9{)bV{&=RFmHnyO;jI2-S1+SvUTS zp%-e5a+Zb%i9As)r%v_2csAc6zhjkRIT)PP$4N%b%h^l#{TnuV%>GB;%4Y;Ajl(fK zez~Fp&3MJj4cl~`ntT3=z4Zw@@hKODqF6{&v!ZI0p6#&}!w?{Vg+fwn6o@+zW~q37 z{9y%qGjae=B(D~tf#4AV4du7frSixfiuwEWMl75-G0t21;}}~?8KYym2TmpP@ZtF$ zszEoY^j&i<_#f3>c|k*h-#3NxbJimUQDr~Olq9S=N`reT6V?rbRg)0PvpDk<%Mq8D z5RcJZ;Rxp0v6GrUCoXpNg|_!X;d8iIhdY(wtSB(mqK4l5Qx#X-q-io8zxVtYyEmVd z371Pl5SbfiYHPY)Qce%05Y)@!TxN^B&&V^G)gKjgBPXcrBoqVW zhdQ%Ud!g+6l=r)Yb7&8@v@=rXrinf!^_4Y+>Ike}kRaIcTWxTe%P|00q$SJ$7w_`) z@o1^8&;5>h_k@w?&t*;jW0^+5^Caci=_IESO^*4~&`h_&`!N+a&%IroDLqi1 zAbHwuTvjsDbxg0d)^R+SHybMDCxq<@F?2|Y&au?jNc~fITMo>mz!`J&`FevQEy-=3 zMN4C?kUX9VeZ)qT=TNvw!~YA+CL=Cw&Tf=?5Qn5UE|FpaWJR{cTluf3zbOqF&aQ^S z85w47TAWdEQQmt%Kf8)eKf6rw4g*azb!=bFFOp{HVMA)e3-lY_Cg|8=+-e=L>NTVP z!>L5NvKPxF2QZSED&#eVEfvSdJGGf1M1I=Oz~$`!G8Rxn+z`R<%mFuDc@&yrqOkLp>P+&c5al;MZKX6ozT_@ua)WTEALrtgArTVPmbZd?{`3a;l0SmTZN)C$D!J zbt7D^@5?VG^We%{FAOf${{7_;#a}%YWOMn)Pb$Dg55x?v{T^g1^7?}cXde@Vv6GlO z72S`LlH!C1MH1&DBPW>=g^jijIS;+u5>WM_`aLpH7Q?czmDtqoo;B^*L*gw7zp&?i zY;DToKch;gVvW187%nIZm1{2)m!k*c^4RSWR044p*fL9Bz+k=mIo9RW%dNuf%5^rx(4rB77YSK+}^VmwItvjny(2);f zN_&c3nQJKcUoBV&U3yi``Qadu5kiG714y27TiCiwV_*lqoLX@C+@#mPgi0ib<^1{M zbX1?AwasniZAE>zzFv)-RRPUaAgrBS7ccQITjHFMtrqax^5l~dxbnGQlQ;}KpO1;( z79S>OH#6I0C-u$?q4*9nqYm|~e`fFNC09Z$G?lG6`bM)sRM^^76l~T7Y&W9X<|MdK z^ES2q`zW{V>8V~Q%gID6SDB$J_wvxl#3f{mT1#?85dSLl#uuQ(nVWx5wy!5xa5Y5R zHy@w-$5Q{wWHuW|&riM2qKAQFQV*2D@qFi2ystunyhLW60D)LlzdW&Tts|~bwdD|N?!sJrg8!cCk+$(rq)X(0q{3vo^sjY&Taze`S^&EjNJ!p z4&{Z$JiG0Dd_sS*i;ofIpVpvsU3$A)e&+~kGM+dU3C=o?Y#>31!)zJ%%Isn<-t~xN zkBay~z{hpEX#Rc<0-~3;dI&;MFKTr}CY_GIE9|6-nSAXQHi&6*Op`8i{M|5|)f~gA za`cXCka~POPhWEJ98WjON$;b(_R>V7n5E|W`Eckhp7JnlJ*$NPY=SSMUlGOf%S;1R>_s0~1{q)IUFE=s25QFz?cZ?@jykK0$=>(}A*C zoKl+23FqMM)JxCuMo7iAK?XTCQ@4D$Mwl;&IV%357$F>CXC>D3?eutbslCa6fZ3-< zR#tYY+5RhkoSC`4!ax*VytV*y6I6BqO^Z%_?d_uaie48@t|M(Gi%`I@sP%-_9z&ej z{tGLrLuQ9{L zW^)!BA+I#|!$r|NZ3C67R14c@_N(c7L9WU4nla^6`bTJ)u0H+!)}7+*eERJ6 z<&$8c<4V8w3A9iF)p}OXq>~RvbOqilnig}U{T|nqLofX#SDikT_-Xp&?6uA0|FedW z$Fa*Ee~c@GLPH~7;FL9dK^)|WoX2S;#=M|HWNM??F`Um-PyYrx!!BQ}Qp;q3~66k`j=FpBOl0hu3YP1UWY zzKCf2ed?!nX5dFDpK0iG*2tY2;ui?oE=p`Fote4Hlk0i5vH!!?SB6E|Zf(yD44op~ zNHe4~NC}FhA}|9ILzf^a-QC@dqzoO>-5@C`AdP@D((#SY^X&cY{l4$7dybi7{;Ye& zd7bCF)&jAt5M2l`H!qV}#hI;B9D-6qH(D~q-kLJp$^oO$#yF=!uqh&~YLq7_&z?vW z2{_ND$qFe5tTX2qGVG01FX4RM(<)E9lDT}LlNx#^bM)DRNws9+z3L7EO7! zDjdD02{m1QqV!G@n7HE_w5vTk7zAqDay?tKgy+JI-DdIhf*o@rgNLs5<9 z7feP>)xf#7^WJO0``RIeGK==Wz&a!d6Z`OK+Ym00b>?8{mDLXk1#IWnje1|(Y`sb~ z>wkNtpyoMmQ0j|HW%cu~|6(nO&vE@!^Wk^O8RhjBJSI!rGyZLA?i3R2- z;{1FW(hZ3dnBFM#g-(1K4E&T0b+tm@s_(#r(7gd@74Z}97sM{8`@FS7<^Svh$*fWZ z3)Eg_X8!6o7NQ!A;@2SPi7Q9a(z>ZAnt|Y{z5yv^)<>yIMtuZn1{!E<{x8@0Lyt-# z9I@wU>MHG*X)dHAi*1`|D6~M@X<*ZAwN{Cor-j~0gc0n`s9TfMCn#SLEjY)+zaH&t zIFzTHY2ih3cmy^~#X2*I>CV0kn-WxX3mAj_5?!#(n%{Pr*7m-`9Et4+z8FbQ$cT4VQEy4!K1%tKyQ#b1tamiDA{%?$cM(LZ>1WC; z9^JxZ-yr(?#QFSYi1@mOn@_Tu9|aoE8+L5<`I*VVYddY?2J{Jn2pSpUkva7>(Yo+Pd9$lZYAbu%vgRlUD83(+{tGDc>4(lZ+3sy zA|bOA?~Mp$U;Uyn(@&~%!`DU}H(jEVv%a65P}G5bJKYLW$cdXLaaR^+NwE?_~sD^wxGtv!x||e~RqLjbCH!#-QFh zGigarPH&JoiQ9;#rN(vP)^ZTRNhYXaWnql!pT2`!)NNQq3&l%en=dKpSs(nfXh$7W z2{%}Hkb;J~C|>AN((Q_Yx~+%aa57A($>?ni=soBr+a@U zY`F8+BKz=O^`ms)0pj1F@W1jAPpc{8jGDaOwZH!IZx|!itoXLPEERL@ruTPhhA`_S1xf*x1MX3`?w(Wm zW23&8=RX^szEOuNcd+Px8nmb1;68Aw^^!uZWL){fqh_QJ*YmTS>!3drl5^Ed^h1q@ zdd)m*Bbfq_NDNtW{<#t0-Gu6apL}t`bhx3I$899wn3{*2m9O{Wh_rwBrN#Q!ki@tG zrfKzUQ`v>ZWQ81XEf=wJ`al2G=kgs+PMUU`WgqGJAl|`a+W{DAG6=HocrYm6*Pe zr}NM52#wXq1BAnqE^as8C*VboP9oc)?vJOwpM9a#hwFu;uBJ~pI{F>5oJ6@Ny5=%F z8z=;S*HDku+@Zn$I5W8(>^#~2uw!t2_i3L;WU*)6y@PS)p z!JU$Kjis?w7V_7~`re1L;$qq=VjM3y6;Orh3wZ|&mNlb=T8hbGKT#dWe2pcA#ba5m zNcV`aVe+b++25q7!{*mLOA3=b(>NG|#0$ayP$Nq9TY*~%O&+_Qu29`4!GxLqG?qKj zniz1OpZ@%5G_PJVzsjc+J3sAH{}N@ox{13jQesujnJ ziG7~j7lZdJV~mN_BkN89!ef;q=nmStgN))_4O^3Pe6{ zN4T^$8a*C$dIk3da* z@u-A3>DgRUtXgG)G$#W?!nty}O#0UkUn~oNRDmDk8d398W@JSPf)`tkTbLGIS#CY?ApAtYVYVnHJ5MK^o_VVtLanVFZyEi1LycF<^b}HtJ zFXV)gpVgSD~kfK-cT>j*7ycNi!jQg)8B{_5n1~uQ9?fhQ0xISe0aM`N#aPeSv*qXEIfI;8S7e9}eFZ8N?Z$z6rHNF0K3an#RUvF^War zqu}%TIgag~3|go={V3w&(R0rHl@zoYHH=^%tz2cMD#rqwk~RJ z^z;fT)jJ0+pB#RG62RQ&O~fLX)0+q-bWZyBBd<-Ol6w7Frn0))Ks!APD@Yu-4*v|OLFm+6tG_y8bgagv{xIVY;N&osQ zwL!_qvr%#0coeM>v2eC!-mH29iIQ11)6<+TriYuScj92JwwU#iA}gj@EE4n=4_51= z(O10LHYs;Tcn=0fx>H--P4BGUc0A?*D*=&@%ag}EIlnhspT4VNgJUfkfhYBkJhGh8 zD;K*`x4FF@@;<5KIG4VnCE@y-REr^wKjNK8PpfCf|Es4GEDcr;Ic;Oz}MH2Fl0$fdjfY{%Y2o{chMD;y+UT)^vH73eeF@m z@8W6VP6`#mZ}DhVq}m@QwBI+qJD?nkz$7up;aCnWzZ@gD=dvXT(TlD;1?4C-&Nph= z?b5=D0QA0zSyULW<)BhcxIqTQK3K2AXEc1?VpX19yaXkWf5iG6cU&kGXn2tQe3U%i z;pWH75eFP`hX~`$0lI?kOx8NRi$zfz!Bez;`Ds__L)&gew3C@rn3za8J`G9O@BbXjqv8CDAD2LklP^9tVBuS{c2V92On zr~3*Smc zkrb;>nITu)ek28=+P=EAo>B7I(9qOo1cWoP0M_x!7gepYCCuElx3{==8uch_1}2aC z#z*7Lw?GbhBi*V+Ee%3yLc^+vH;d+W1-cm1wt+tttq?d;#Is-{Zbmij7wXjUWYYQd$>X`J1IO-DGs>sc>{pDhJy0RG=11X@w4o{5^pBYcjr}bQaLWKSC z3aQ^2DG>u8NyO}_@cr8=#g2c{@L;;cX}g3>MX~N3!$RwU}3Ea z{Lzg^bfwq>0;$3rEYDm&@WtquA}T~s2Gj>vYgs7xzm^43@cEt+;P@LPmfoIsUFRS+kx1keo&LnBN!jdVJDd4|{r z(vY3lhYR=+T*H)&PWjIN7jOs~Bj zWP8n)X)nv95L_cTz*`k0rmqzK%*L`?V&`MHk&@L^qz#4qo|fI)0$PD*7{jJxBdrxh zw5vu-W>38lgw|9Q9ot^XJFcF~2S|(m6A7AsBEd_nUhwZoubM}b60WA_2H1GVLn;Hh;jb(kq{W&y{wiL0}&+HS{^W&%d~ zoIfs5)-}x1#|qW?2)7HJXjIYPcbq{t{5;albTcVh) zmrAz1{K#g|=VD0>_@*9{Y8N>-O3zs4)k6;*_wVlo^*S!TOiEV>9DCl~Eqp8S%Xet9 zP;<1NQ|BJ`(!!c+zO7zPE}Qws>rdG`yg9Y`{;AHgSVzMlHF|bLN8#;?0a{WR&pS9^ z8@1=>8y?=OeHdtm?Rho2DZ{T!JeR=!`r3YkSZi3T;Vn0K*sp;Xyj@ZA4TDGeYn*qz zixoeHH?to$JnhUS9Yi^{&C8v!sKAKJ6grk-MhzZ-|9mcFWdRyY$!QRR- zu%^oXy(UUi%a&Fa!T~~%+4xW(G7tPv^(bb;2(a#c%Raw9^{=XOVaZ?1TsN@i-p1v| zXtx??&a^R4P*;71`&(q`@LXai_Ap5`de6Nw!r`*1d35{xO*8Fb(hYU`(&P;XtIE!G zoki@z0`w^FJ@&udo8_&~gI}%jpQMk>F|UYIdR6UNv3|6XjbYfByg|1yC?d75^QKFF z8O-<{BDU)&|%V@KcW;aj%A?R$&jfK_A2`JC!Y1d6t!rz0Tz!6W64NM>DUN4T03CJN-Z#qN+B+HH(HM_+DqOS0X<&LA$ z#}kbm;H|oIQxWLZ`!k4(a#^|8j=^=$GBZTd2#EX(7fOOw~fuz z;O7++WBj?wMt>F8F9-mNJ%_*HF9@oCHd21MKMt)`RW%uJiCHBhd3UKM7-TX6kgmbT zK-2%RoUr*7cQ83DX0($?`!gV(z!fNa>-59t;QH?P8f$*)!j$tAyNrZpqJwEa=`3>+ zQ(uHKk?9Mrol&O#sB)si@Vb96tc3_N@hEJw#l1n!s#w0SyUnp#d8dACV{KRII-Ude z&S~?8Y3>hABaSm;D-orJ6 zW344z;upCK-K?gq1;h(hV&|DNEDzttz1kMr$w8bOcSgI^i$|6d=WZvup19dgDf7V< zO*xl6`sMG`J+W%yT-c+Y{+-t;UdFt$%TE?ffs3`>;uY zam?q(eE&+~*{^{3Z18IaUPGpdC0oboguZm4NeRisL5w6p9&Q8J0q=sbf=S6U57s}R zu|@qQk2M1>`YR*>cl40Rv-jM19Xj^C-KwqqqhRy{NQ@&F@9k3>TahOGo)P3zJAr>Q>BKJkw zkEQ9BH;Wh@*W9Tp-S1YfYzisB7%eOz{jXK%=rt&Ad0~U}3ZouZaltN)@cF`G(G$zSQD)KDm9nT(rID z9#6xWdTmMuAqF}7VQD|Bd;cyTX7=}~=Fgdv2iyij`ln}A#VCmlG9~E8fex%5eqmci z09NCf7jacp3hZp@)>Y6ufR*&Qzl|8sadSZ zU%`$uE)0CfFEnbE>yc}orOTAq!prIC6j-Awm@bg{Y{KcSL7WUkhC}=LL|L>Yk+!cw zZUn%b?_e!zWe@coA>9lrT#?}7y;6)^I086iQ5DGhh~Ncf0afcor9@XL*>NQ(f_9y8 zSQsugX8?o|8rx&9ej6D9j--s;&UXN~8bntTnlMZOb?`TV{Gr2@_jydnsUhqDlb@98 zz|q$)_Bg0h$HR>Z9(K2PA3mfigpopv`Ge(KCB4NCWn3su?uxug?>oC2l{D>oHTBF#;FTzRVxybtx z`-Wh-gs1ZEKu_B)IyzRG*IzH8zwmtm?S9$_;|@g4y-(whp>(hr&F66~%y}gi(a*a* zwRY-J_AK>Jf&R-le?PLH1MfLzy@tU*j zN(q+gp-;jzG}(mC7KFi%>LPL3X7+gUa(i+6?LV=_tlEZ2)~*rluW-{OS!^{&QHR9R?nb*VvQMN>c&<)*~AOUW9a#kH%$y`h~~DVuUAK_v|I!Z$iC}cw*mNGi!dhqwPmXf7*)1Brh|PZh}CzPP8YZuf#oGf*Gq(! zsYv&|`7QVq33sk|p67rsI&fA=I*H>zki`{CWbdeXXm3?Y%ms;_sJEp-IZ)yQd%7kw z`7fCQWP@sN+xh#yam&BW;^FZptUQ#hW&eP6G~$(6k7$+K^Q&JzZ`J&K6nNpU_{oNT z-YQVspihcEi(k$u>U)KXjiTL`P^#vA_F9luQWKlAi82U4S98ouNt4HF_vX1RllJ{$ zsN!YsQqhg0(V;Js`KP+K!+EaQ#q%G{?_{6-6qL7OTh^NFM+YV-#?!AnR>;)Qz@LE% z>)PW8br*we!9U49+7`W|2mQ9{aPAw;E2X>1p_$QXacD`gL%@}Z``z&973Q$^-YP=o z+;FSH-mo@$V0@8kh@9knt&5Z|9>aNUh&ex#AzC-+G^^E`@F%s|2k3$*mhcEkhqd6j zBETf(^G*Hj2!~BXZAKt*)-=QLA;okF;$!P+fAGf*#k+9{XT1o4e`oT)crPCC&v^LY zKbYHywWH!N>T82)pQ&L~l#!A#?;F`1ftb$T0-ay`ilJ?O%ZcBD-J&{)*=!ZSEZOLE2Elv@@qey$Pc}Iemp{?$?_5M z!|ZMItXrWz5R_t&_*yT2A1uR&kEZ+DD*w2S&!3=kAzTf@iDFYGpWA@ylIXx&{?im| z0BMFoZc38~??7H+ST4=J3l_aM9#!p$ccjBJr2`S^O!KY2w8)>@t*X1d_2uXiAIehd z<@vlEmk$>$>->y zkwvRmQs*>SXBnXQ`s+{Fy2q;|O{j^d^Giz%jO@}5w_x9%_?>4obX3^KQnLb_r^L?h zww_sRI`?k2n4wIu*KQAbzfI|#LM5-wl#h0nVik{m$#t$lHFXkJ?jN8P;XjQA^K&mk zb73jYOC;98bA|44ws2$!{#+*gLD|={cu!80^DG-4+B=8bf4+_}OZG(R=)m?ciopVZ zRSj#eQCQ~PH-7^LlYC9oVo14STLV)d-?FtA<|$JV<|EUIE(PG@)r23l!^n*4$_g09 z{OZw)V$Lcb$GyD{$<|!>(y~8VUz7EvuBq(yxoML%4u{bHFw;E@h@$O{h^_mJSY1IO zwiWg%Hn{#xPjCLWKfNrAIw(B*5#5NP?9?AZHI1@(NiGMYOrWv<$T> zeZE{$c<}T~9R!A^+B^b9-#16ctwY)cA83>$k}TaNjb8RTvKmuYIM#t9Pk>|*a2&M~ z8X_B_k#wA&LtusB+||eWB)PT9_yuR9kHMS;eld>S1ale3$C$d`O^`D60?nnE-AMm}y=zAec`ipgb2AQ*X?mCHDDc3xlH1UuOy2RvH^DyccPVhrD5J#i+=*p`$0^ zEO~6&tNWfd2^!%XC~jneOA!B_j~vMR1z$+^)#UBb^_!9(ugWe7 zyy>|#YMGE>-_j3{@CCDi_dZKY%HklXmQ^97y4t>ko^pI04o|rTY=x7~dtuk4A$lrqO%C$`~Ia|mob-5QCRxD0f6HIi{+Y51* z(;N4`XEc4@y{w@>T=1Uh-ky8f8Z9XqM?3Lvw&h=>i!~P6c#|^u-#)e?2o^VMDDx^` z>_mk4_8D;Ui?%yqM#ovf951N( zLcTWz7GeSp5ugyX1)Ank>*78^`+%O$V2K6j^q{+x@};GJ9OulW4wusb7Ypd3sl>?s zVsj?6+$5mnz_zN8D%Um=v5L-*-gfr?e0CGk9@y6U@i_%ctWJbtNNA9AKsN!)8|oy( z*n|^TEzTKZA{LGNBirXRA1Vg>>~$3i#QnNZjCt`$Gx%h3SY#WWk{Ht=05*yFUbCVBuh>CUiRE5@|2~pp6kC+!jA+bXm2Z-wN4iREBTI< z`Je@ui8E=NIl1w*bnFCuxX6!$A3bV(d)iQ#!ZJrZRE-1ecFM4Y6>AXS(0I%G;}Zxe zRRx@YJc`q^enbXqL%i@`r{MW{E&MX_jX3M@QocXfT_lgB(XJYOXE>1z@f>K8xyC8FF2KpKJZh+TSN@eA**S6L(c`!p+ zh)()G8UUeks$>z;A!z>cqg>4ZEtI;U>mNnbZR!7+O%C~*;^&avRYXhBfpybV#` z-+%V3y`t(ZgT-xIkmet8;XjSGNQuM{OX*MpY+j_vxL*JRQNL6q2?rJjyaJ*b^7Rr) zrPW~X&=cHVb^1Cka5@PZl@dZe=Gp5GRSs!;-O4Ay3lf8G=vl*~cprQTdD~H*oC;j$ z!+W^L%R1{ORfHUm=cq<7W!br3T{TrTe&0uJ1qiUsAhPR=@#O=l#A2r3Jzu8dwMsUOK zs{xTIjmQ!W0USu_qC)9au>uMMR0$2?JJ(2tMEj*Qakp{)RA|Ap^{^zRh={mod@0mu z-l`+9Qaf4N=kncMON9NLU1`wqPxiD}D#%{auG9QHYR`gJ;vr4haQD9Gil*MsycCvj zTO13FujD;{sX~_S4z|=59Ac=zn5WqIgsg)+Y2bziu`5q z1DFaT9|N?(inCcoK@}5X(ms{7)!3t<8Qd9$PBsdIk&{o!l3x8H1oR~ADXO_%N+r?! z8hGT_Wp)x#kzXfj>^3BqLd<%puv&zA)DY!`<2^h1?WNi%sNURSB}r1uQ9!C|jUS zqlN+gI3s3%xu+8XX9-h;S*^o$Qqzk3tQYK3Q0|XWOA{o*gOFN6M~Tz`=OmQCZ=75l zX8>RM;=U3Ya=wyeeG;XmLeY(A@pNW-Sfm}kx07D}g}d?jt*q^ZZeS!Y0@3GVB3|&w zj7ot9P_8p5U!WGV6v^azZ~KzwuzY|BW>Pk5Z<*LTZl*q=-{j%Nn-FSJt ztYCf1s|^{o9Q)6x|4a1xqqlf^Kd+bgQ?d22Zt0)dx&(z6DpK);L@FJiS|PlaUc z-Zr_pKG6bh4=tKvYzQS%{%#e-6&L_Rg<`h&$q}#XMg|KvzS(O6$Rp>pYn#!NB=vPO zoaKFoqc3!{^1ySPW!QiE#AEQ%aTT8Fl14D7DEY`Wv*d9vV_W(r4kp>57lV3+j0wFV z8~Pu}oaR0ZD&y~^l#w3i)l-2CgQu=0Fo>L$!)1;Gy$;MCi@wf^&)ZumGjVQ zOcJyK(DGA)?B)CJ2CV=YjG*Z7-#u!)kP3`@+ZXf;<7n8Zl>^;1FU{ zf*$G^%K*TBV+QumtgoBE>J^fK<;sDRBps|;K*bt>1nT$p$;4qxZ0rkXx{7FRdzXb6 zp+i8eN|QZag8-F*T;*9B!!uZl32-6o>UEecRHrP-*u9KP)fu`;ZfIg%k^CkpksZ-+ zL~Gj4=4uizDzU5S+4%iJ`B~B7?=1xmWR?CegSKh?IndTrEDQeOiJaf~6w_13u`l(n zhd9ndR0(9Q^5kD&pm{g7vy=@hk~>%AO9FAij{CWd^f!m&bhToqGp)5=`E~aDs1b4r z;7wkt!N6H&bN*vqAHB1Axn{X6GTW{SU!{7VS!JPV&4ONdDZEo6G+lL+-eJ$6z{9Aa z2=N7%LI4QiLIDy(JvJ=E*B4p@E?I)bMpGa~RmKfeF7;*y% z6$QOtnFGs%iN9#GUb&OWTcyNKpwcPU9fLY^2?1QRQ6?oR$uGq?DhCWR5X68orV@G; zO%c*OJpy~Lq+%;RkiCZj+cR)f&G~7g*4UN3`#%EGKV2Tkhi@%t$J@VXnDfKm1>g21 zn5vx4HVkOml8C3k;zAR#@kmq4?BQB@ln|#adJ1n97=mgWE4^~Gsi7sah`=%+>Ch|$ zgfpVT87^$UQmw4au_>%wTVc;wDdL4~ zF`a1&UvL6@+oA!+tRGCSEEe#FS$N)d@jzj3zpcgd=0%?wiw_Oa?a%z6p37Omi%0u1~jg3pn}QY1ln z*tyZ+$aUJG*aoP8O&=ovFJ^EjFi${uc_7YD8juQ7r0c-4yN1W)I%(o!J5*JEqrm10 zup}yw3SVIlo)+G0L=ojtlRgM5eSdC{7$~gO-Xf9oaC!GyrTlvG*V&usx{j0Zq<1v| z%a#1t^w6@H*lmpS`}KI`tNY_1@dd!Z=Z@b5T)Cs;VNdfb=EY79dza?>{^9KYgU$0$ z`V-|!0@jc}w3Py}{NkMyi+Ec@+XR0tfX=rR{>^;&=TeEIeoO3Dx==^~_;ubBK&?+m z#Hvlo{9?l9VfNsogH#4cWT6scs)MGjr$T~~nQ|v$o&dqrvev66(M@biF_1Zq1rI(h zgImkN1SkkqRwHCO8pxy<4Vv=H1Fi_l@lZj(fqTj#0Z6 z=wmh&RA!*;C$C7n0{m<1>OnmgfJ-G}gaheB@ge~H8Y5!F2@z*aBE&-;Uw;L+4LQ&usm>Kz8k@qr7>D-zm{mYK_Jl`1F9^`xFNvVndS*+(~34aU;`@S^B8z+{LN&{pGjM}QwB>@3+ZxQ zkui3aWVM+ynz01t8jMh#=TBjlooZpE6rX5sn(hbasxrz0+Hjmdyh;4o+n8b=*-PD> zqZBpv^5meFsl8PsNq;$GV9y_WC(?JtFU;X80Q(aU>=`Q42o~@PD>W1`?drDLbi2Qk z)I?s+y=~GsBCG|YFI-i!5p2U;$R>Q4SmN=ux(7GDFgN;#`}=nz98%#4{G;#$eikf5 zLUa#ZECMw~pRQvpRn9o;xUd|FuRM8#hRUsCu{HW$@uP$)LR23MKn`?ZDch>>UE%qo z&T_~zS4O4=%AiEPU2*0#S}TKk5$htQ;DSL>bLy?}C}%b$I!zoHn4?rUZN>5{sHv1m z69rI;3wiDmcxANA>o7nDvjJOX2C`%`^kl7NVb)+2e!Ip3u=l$_Ylmc3KK3;l;vjGU zno@h8ag5-+V`Q)Z7f0GNg77B}vZEQruUryg*^Q4zdq19riUn=hFJ}#WcUHb4J_vNL z9B^}3jD6ZOw2Kd{Tp9Y=f8zhTUE2!>+U57YTmx8LZ|Ank+(BY!1~g5Ssv3gP6rCkc zb+>Yg3R=>+%@iUw)cHPE{x`w%hv&(bMWUT-Sxw4se|(M|yo}C_5gP--e+p-iOOe|{ zNPnV#S)r$RaRRDD*&h(MrR^v$dd(`ozw@NT#`?1pvSlSSge(~9CMqOqCeMX)0wOc+Q(?%7iOXk&W;M7s!DilqVG*Eios5! zaJ?cbjL5H)HJEx_4J!#sE{>w3%m9O%45_g{Hjo1EamXso=Im44V9{Zh2RhD7`5aV^ zKWZYdCL>B=t3VGZGm7NACLrywU$qWhgz>g@64(peVdYkNyM%<_hJi^e_zT zH%iqJ%y0Il>#xuo$X`kj7mXr#7bd8EG#^i;!tZf;R)Vnp&@GSYJN^{Uyr8Nd$CKTF}S%R7}Am@J20mn;wd*=Dg`GlzzE3+TOVHx z_5Qt*C0=w9A;XxIfAn^;qbwpDkKv8AA0oaFrq@+)q>niuYJpeqeP8iITz^S;s0qmu zOZ;P%1%RgSuW}7zchBed_wNOeVy|0XDkkr* zQl=}5F;X6xv=oJ1n*Sf6tAun!+QQ_zzsPGT;*?bqweYLQ0@{4yqDc-qL_K4c_~us| zmwi5Xo&`Liv4($;#gc0hiwK(dg!i z8EBBw6#|#11FAHz`(Pol#JM=-0a{s>@*G?-X#l&*^6w-Dizxv1SCt)xL#!eGdvF`M z>PB`*RT86LGn^|u(M~;ChL9_uwkJ(nuPU2?{#>)XyMU-uWNGm#@>GeX%&3W3ca+x< zW+KN2sI)vs5qbaO#QuS521a^f`G6z6;yy{XvLS=&X(r`LAT|=_x@sd|ikt|V9Cl({ zlP~?lJ0N_O3sF-Kwa2)Y2#=Th%8MatPepBbzM9L$O%QmB1d0`kz!R)sYPB1`x@ld4ZUioRXRlwV!`HXY-8QOv z$T2(i_q&O;-$$2XI74Hw;H(<4rYnfaQL_Dm^ z#~~*Z#T@IoHNv~+F|_MvJvo6yH(Z?t@I*O9h!gEb1PUFK45Z%K3dbOnxYzb!su@L< z2&O!70znCpbMB(j!32{)l>%T&s9N*4d}R1T28nVZi5eljfyV(deZ?}8U5u~~B8r0Q zxoMmOfem6?t_AULmuCxqj35f$qT$6=4!O+|xHfyUwy&TLKHN32ElD$$c|o4^Y^+&? z4eU@=X`31_jpyqPb+_{1mm)N-uCC5AG?FA+$E77k2j^qHDPfNtpraKC-9MGmgWM?!M@>vy{G7Q<=Or`sLGhK1`q_9Ra(ch zsG~68fsL$>USPJ2yCz>C!j#Do^g7bc>aFXectV?L(6OvGtFEi zu>l37bSx4SNGzSyp=&E{IbSv`0j^>ja;rTKq*VlW%B!gQZi&mb$z5tu`&aK&fvJ<$%?GAe$}wxeS5 zMRC`~$2k+U#JtYeXqBU)lEMk2o2jy`ii5!-3IofnXzBLz>}Zf^V<7dL|ssHKR~@)ptebSg86R2h1M%N8$HI-mV-Q5YS9lEBG+Uw+7GX|P!sPQOnZo4(iHG*r7P~r~! z_ow{fLOcEVWTRg}_S~4CKYc2&Jngs|ORIsZtIh%C zAV5-LIp*Q`lxV)wBB;4k3pUg^=(;YB`TX>4^N{3CYQ&vc^E=7^RZuQ@{v7F2^kx?R z7|a%Iv&Qa=##0oDU*@22a|Q_w*nzrq(^% z>|Jhb5fzUAG!>N5-CF5?g4`qVDx;jNcTTczh{s%lAF_#3vVq+7ZlytEQ#R1OPwZO% zHaT*dViE6opq6ZO#27J#S?J`pXd+anbWO3gFygwRKqsa7)+)`grW^L ziJD}Vyda{Rp_J`T0#acsY7kPnjq{790~G$}iVVG~kP=HKK3(wMI&luuTO5MkjsxH# zdd(Fv0KueFIg|$`(Z%$Sn-P25mjb2ouc}PBXx><=I4}1W7^%QVVKi#+yotrE=f}6= zj}fgkkgkr-?A@~J- zhpq_apd}{@B?s}<>M`>o_Lq&pkI37|Y;)4eM&PjIES}eks3SB0EGJ(MjvM1p_r2)*f9Sq_MQY2-y zJpS5NY*f!brcK_MtgfBbuHur{Gp*QrmkHl(rB?-VupG(YJ@~%u+*R24{4}oH8P^p_ zu~bCAJ30UPNP0!=XsyR0sL2M(GR)OUV=#Hi=s z1fwH=vOX4>$4N(w(oh=Q6_vU7ij;JFx03fvt-}sGAIrbFnadh6GWM-#e|~}?hWI?Q z`jku#$|u_%LZVgKXRqQ$g}=ha+|Y?jdoL>^QwAW>AkWxJ{+ejusnMN+szF8Bx%`HP z=RiXq+WmL{nXLv(0-{#TY5n*7Ic&zby|=Alu$qqWF)8>M9+lGX4{>6fuDV4(c%{8qrQclf<)14*|8XQ+ zr2V6SW;+{j{82#NiviLhO|+kHXnB<$1&9MB;%B5@pdW4={ibYmIc|=CXUahv9EToP zpWHs&6CTg<&M>R;Q^D1xstAs=&6xtF4r+(;6f^V4090nFn>xrt{aV&AicX*-Q_ugS z>#KvJZo9CT?(S|7c1b}>6e$U%S$640IwYlI36YkN20?16rMnxE?r!M@LGWAOnQ!KM z-{<+}o?(W6e|w*Eu5+&II(L%nb5I8lrpGRK*c<%EWB6Cd&N7bRGZq@#FILFt7EZPy z06q%0D#?NfUGJqwG03oqF5J1Q3_RA1yq3az*14DPegJCqTydnDD~D*GmQyX^Jt$K! zcMb7SO|(`%Sv(N=b-doxM0ISh?NVY2-jBFb6`6ZozZK$D^+v=UcMq2;`KRreK$0Vm z`IXG9Hqr1u>)x(rhacIULG}Fe|MaH5D7ap6xx^Un*wyQW^;pL(u%&T37b3%1dqQa$ zSs}kxf(#xnbblg6-9>7ive$3caNr5J!}2($I@Unh~6igfd(W6P;yz z-6ltF+@W+VyyfhCUD1`HVo-D_FkzTCmv?A7Q-C0GXPu(IT_x?To;FpM&9IA;1@F3Dj|q(j7Y1+>)9V#+6uJ`{+HQ7 zMvV~lN_@y59EF^TR)PuRbOrwxWjjUN?5@myHu6g++Y5Lh?$o9gDXsU+-jQ=9~ z%D;6idR@|};%3>8Kwn6823wctMQSMczL3HD?D`E7a4HhU@aIcXt2m8Z;JycVhN>G7 zuA(go=K7GlTAj7!kcNw(`xwV(XTb+IkD8`{P!z6=AdsK&9zK;Ce*Ra`@o+PvE1}B& z3@(sZa{KQ$8TRw6b44cKTT$}U4h~qT0PPvxEAo??zB~@F8VgwXC%~kZBdta~>KV4H z$WJ#U58FonxLYyt!iS4yY8+#%8`SmLl%SAy2XVf)Yt5+wGc?*?_S=2mCzV}DnMtStZ#4r zzbq>9n~49#isI9Cjek?^CNR#5%rl>$oJR64YS=6b43&kLp+MwoMp#Fh65cJvtykjY zxCdE+HM`J$kV7evu-w!h!^0CUb)V(opwBNLTCqE!h6;-(F-L*UQAkTn+gO3YY6TH>_rFy;o>yGrox& zS9P4Oh=Vc+O!ujT9udB& zt{39zrM(WwcW&Meucn;QR(&UU@T&!%byErS2VTDjrpOS{m=20vmw%7#<<5P7!nd8$ zsv<6CH!N=#F-c%rklgtq1pls)jOynG4eO2$;r5lLM%Iz`c6fN{d0ZhCD|lu`^VN`d zXj}gjp_Plj(IW$E6m5OU7XliU-MUTMcUAtU;+*TEo{D!5rXFp`P!!$mvQO zIX-rpD{`gN_L{NN*5w}`Ez3DY3$abM-9OcW_j2>-H#}mJ3fpFb@+|PmZeRoK0n3Cbt)+-;0=a zVV||IMv!&$loF-MACzuJwb7%PJhXX+9T==+isX;epn6~cbSwL0GJuy|AA%lDl9GmZ zh{;Ns)3I~ftBs~}PFAHLiLcWwp*%3uPkSFgzTT)euQcEZs9~I{T7$m)J%W zBz+X~KIv~Cyk33eq|^Vyh1wM^R$LiKk%$lr++M=q@=7MpgDbIhs0d31DfY*&~o!={Ey z(9WsMr?nAwQ_8w!_gzt2#|DpmKVFu!S0z&Xv!F|9AVnTh-XwMST5IWAfzLY&-TZ@I z<(JloA5h$`l{@%FxxG$4%af!vB}1V=Yw0G%1MA`=o6|aS3#G&3#K9yzTaphL0AUsb z>~6q}e#Gu)(VV0{OK?M7?y0GV7RPN zkCE=1TpFT%aYb0W& z4`css!%eLP=>su}Dc2$*&oUnlNYb_4voIDX2m%=u)(# z!pXCa?Qcm#ke`}t#Db+9b^(!g#}}bYJ)jnV767p)p=bxkp7l~Jg>#xvhP1NrQ7+-Q z5HjUpBd?a3D;tSMXTlRs&2<<=_k+wjL_+uN&+J~ILlMCjyWMX-dBcR|GT=jBu@H~O zkDMx!`lLJW-*rD42*1YkPt#<5zLGXaIT%8B^Vyfv{Z5#|{BFzY%fTAsx3`lIPVd6= zY$oYSDEMxk= zYeuQz6kr`jr|Iqc{`5fTFg7YtoX!yT#;%%aaui9JXRZK#;)h`%pFpd|a)SPq_R7nZ z9fIa+)_?Z)q<`m{94#FBU%5}Gxd9VvbFzr)Ml9ZYbIMN2Hl2lnF{oKD_A%pYKbqLZ zeN{1<+BGZe`YxPJv#U;dK%?`=Tsn?=u$(4574a5#4lA0nkqrt4xtFgy&L1cQ>1NRRAlN zbH9Dfz3cQ_06ArF1T-+%+?OyuyGUo|Lu=?HUdpzlJAbJBjGhkIPTZY;#6%|cPs5=Y z3S@sF!n*z$-vIw;N|nfY`K$9a$3e=(aJP{B0mpyj@YCMEqqis@%Q_RSH5J{CNs@q@ z`!Bh;yl2xm0gxWzwluE8pI?Hp4+%$5fgp63a1~Sf+G$d|vF5JKD1Q)e&cC3O2DZX^_4j zJu{Kmk7#S-ZWLmkqcG&# zyEp)RI%k-}_HNRS$%F8bEIs_yh4dRD(e+S;lj_!G9>;^Au-uzUW)*)N? z1o@gHY+x`ni&bHU=r0d8{?WdIydY4*i|N~_lG`FU73OlvgnK(kL7MQr;`219DObC6 zhsRAo_qlEs`TX~POhDT3|IUwSP6oj?xV}2LUZpuNSF~lGO7qZ%Ge2`Bw%OMluyzL? z0t^HhXJBuL*Q8>cHP=JSVGfrrd@xf1bYYhn$n*F(Y>o~bzZ#s6B7J08rVdHH+@YqB zMEi0+7C2%f2NSOhE>~9NcC+t#_9q%pQ!Y@UuM&EX?FhqwSU5-pumXuZ*z4;+Uxb3K z*M(miwoFhGS^j3wVry(A8MviCUdXB)8L7{HX6`QW>lmcc^iD%4neHd2*S6%y4Cx2m z{(OGV1^OP>aoV9$QLJ;+*+)yz$!NN(t4LTBi-6X*!1|z$6Spck^@qPWVb7-^RpX`$ z>p;YNC=std*}@Yo=%Q4-m|2~Y7tx{v7Gj_Z4do(2r0Vd-DVS2(pnwvOGN{MOqn_&|^m>BUs%b5PY##FaK`1Jdgl zBV7tYI?XU>3@WFB$5Y&lGX}PsRcx{uS^X)?+Ljg+1YUo1#VEFS99r=FVYzw6hQkxl zn52T`GizAzLbLfT!e*@gU1-w2m(Md^puVX=%+vHp>L0l+=~ymkl~RPfZXZmex|Kl7 zkBTcqPDZwY+%y(SRTHhz0%T~|#15RT3lHJOc3XGJh;^G^z~&GPS!8+KZ~cEtV7feY%2 z_+pr#AM=`~Wim5v47+o|2F8)2>`eEGivR$x`y|{UxnV}~?(Lc@wx?_p1!iT}Mz0pG zVL(ifw@LK2nP6w8I_?vmHJUYC>2K;rAtEygsAX~eq?iE1M_MY&-{ma3?I(ldQ7J;l z&ngL7g)(NtErm`S;r2rlA%@U^YdPCRY|Ly9(B?|Q!>I?bKzSi&usxGh62mK zzzh4p;F3>SR_(aJ|Lr!_#szmM$8w~hX3nDO^G6bkD=hQIL;3ULJht}M);Qh!!t?!8 znUze#t`DUVos-rIkLO^+b%hFE(cuH3l1&0^mwM}7UiJ))?;=BA{ zeg@`jMop3FC?uv@!sU2k{`|2@u_0m7Qa&W;6CHs~X4c^JndDEyjsn5F`>#3 z>LhXLyLZ6dy&p}Kz$WoJ{JRCxv2rz;^8sg>@2z444ENlU{A(|G6Fk~TrT&E_tuIF2 zCZ~(m#qzg7?b;}2k&sPR5=&x25=UaW&dfM4^m!HWFA~%ywLU3``FI&I%1XHNRpPTd zfK_Bvbnl}Z@bc9Ph9F{3Z=eC<#%*B$(lZn6@ZmG=eY$DR(nf)#2_#frCA0H|1wylu zyiQ4pkhZ<&$&*wSTfes;cMmb-ikWeJm7_zS?KC0AuMgqYh>NXa@&o$BQMY%AHIscd zp0bx0+=e3vXtc4?gyxmZkxUg6*R+eCo7ASq_E2UNQ}`y`UaYyzCUy5kXt;*Nsa+6RhoE6JbiY*y z%0O4beA@lFU_a`z@J-jei!pIf!S6^DvzPvN%`X;^9Nzy}HGD6SKB2pv0Q5Hit+n^S zwTMr$z#d9;h#b$Sc$gM0O4$ZA7uiN=mw)W56;l{&7eWkRjKfp)Ut=0=6vFZ0I-K#YFHkx+ERDYmK5#wBg@`GwixD&UMQ@uZ2mU&b&i)qYE6#Nm z?XAXX#gdy6kn!x5_^_t*o6_=HeQL_h@87KuZi{a2pBzh@_}_g0zGCT_J+7}K#>Bf|K-3R(h+^gG z`XI~&KMupW_Z~nD%o;1JAkgh5+<5997z2n8X5nk1Y7#^RkXk1tNrM1XSrBTgkAV

@G0tI-*gFfutXQR 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 O{m9EGOBYKTL;oLC$2&>@ literal 0 HcmV?d00001 diff --git a/05-week-4--big-o-notation/00-day-1--introduction-to-big-o-notation/README.md b/05-week-4--big-o-notation/00-day-1--introduction-to-big-o-notation/README.md new file mode 100644 index 00000000..5f47b5c5 --- /dev/null +++ b/05-week-4--big-o-notation/00-day-1--introduction-to-big-o-notation/README.md @@ -0,0 +1,177 @@ +# Day 1: Introduction to Big O Notation + +Let's say we were trying to solve a problem and we weren't sure which solution to choose. We might think about which solution is easier to code or understand, but we could also think about which solution runs faster. That last case is where Big O notation (calculating time complexity) comes in! + +## What is Big O Notation? + +Big O notation describes the amount of time it takes for a procedure to run relative to its input. For example, if the input is a string of one character: how long will it take? If the input is 1,000 characters, how long then? + +It describes the runtime abstractly in terms of the input size and the number of operations that will occur, rather than milliseconds or other units of time. Specifically, it describes the way in which the runtime grows as the input grows. Here are some examples of what Big O notation looks like: O(n), O(1), O(n2). We'll get into what this means in a moment. For now, know that n refers to the size of the input or the input itself, e.g. the length of a string or an array or a value itself, such as an integer. + +## Calculate for the Worst Case + +Before we get technical, let's use going to the grocery store as an analogy for calculating time complexity. + +### Grocery Store + +So we're at the store looking for chocolate chips. The best case is that we walk in, and BAM, those chocolate chips are right there in front of us. The worst case is that we end up walking up and down every single aisle, until finally we find them. That last case is what we're interested in, and we could then describe our chocolate chip search in terms of the number of aisles in the grocery store: O(aisles), because our search time grows as the number of aisles grows. In other words, the amount of time it takes to find chocolatey morsels of goodness depends on the number of aisles in the store. + +If there were 5 aisles, we could say O(5), but what if the grocery store added or removed aisles? We'd have to update our notation to the new value, e.g. O(20). This is why it's better to say O(aisles): it covers any number of aisles. + +### Finding an Element in an Array + +Let's say we have an unsorted array of elements and our function needs to find and return a specific element. That element could be at the 0th index or it could be at the last index or not in there at all, so we iterate over the array until we find it: + +``` +function findElement(arr, target): + iterate over arr: + if element == target: + return true + + return false +``` + +We're interested in the worst case, which is when the element is not in the array. In that case we must iterate over the entire array before returning false. We can refer to the number of elements as n, which means Big O for this function is O(n). The time it takes to run directly relates to the array's length. + +## Calculate for the Weakest Link + +Big O does not concern itself with every little detail in a procedure. Instead, it cares most about the part of the procedure that will take the longest. In other words, we find the part that will take the longest (the weakest link) and calculate Big O for that part. + +### Grocery Store + +Let's think back to our chocolate chip hunt. We discussed walking the aisles to search for those sweet nuggets, but we didn't talk about going to the store or walking home. Let's pretend we live one minute away from the store, so walking there always takes one minute. The time it takes to walk the aisles, on the other hand, depends on where the chocolate chips are. We don't need to concern ourselves with the time it takes to walk because it's not the weakest link: it's always the same amount of time. Walking the aisles is the weakest link because it has the potential to take up the most time. + +### Finding a Duplicate Element in an Array + +Let's say we need to check if there's a duplicate of the 0th element in an array elsewhere in that same array. Our algorithm might look like this: + +``` +function findDuplicate(arr): + zeroth_element = arr[0] + + iterate over arr starting at index 1: + if element == zeroth_element: + return true + + return false +``` + +We need not concern ourselves with the time it takes to grab the 0th element or return true or false - those tasks always take the same amount of time, and therefore, are not the weakest link. The weakest link is the iteration over the array, which depends on the length of the array, so it has the potential to take up the most time. If the array is one element long: great, it'll be super fast. But if it contains one million elements, that's going to take some time. Since the amount of time directly correlates with the length of the array (which we call n), Big O for this algorithm is O(n). + +## Drop the Coefficients + +When calculating time complexity, we don't concern ourselves with coefficients (the numbers that come before variables in mathematics, e.g. 2n or 5x). Let's look at a pseudocode example to see what this might look like: + +``` +function find_lowest_and_highest(arr): + result = [] + result << iterate and find minimum in arr + result << iterate and find maximum in arr + + return result +``` + +This code actually has two weakest links: iterating to find the maximum value and iterating to find the minimum value. Both of those procedures have a time complexity of O(n), since the minimum or maximum values could be at the end of the array in the worst case. We could say that the time complexity of find_lowest_and_highest is 2O(n), since the weakest link runs twice. However, Big O simply does not care about that, so we drop the coefficients and declare that this function runs in O(n) time. + +## Common Time Complexities + +It's a lot easier to calculate Big O if you know how the most common runtimes are defined. Please note that we aren't listing all of the possibilities here. + +### Constant Time: O(1) + +Constant time is the best time! Algorithms or procedures that run in O(1) time take the same amount of time to run regardless of the size of the input (like walking to the store to get chocolate chips). Some examples of constant time procedures include: + +- Mathematical operations, such as adding or subtracting numbers +- Accessing an element in an array at a specific index, e.g. array[2] +- Accessing a value in a Hash (Object in JS, Dictionary in Python) using a key +- Returning a value +- Printing a value (e.g. to the console or command line) + +As an example, it doesn't matter if you're accessing the 2nd or 1,000th element in an array when you're accessing it by its index number - it'll take the same amount of time either way! + +``` +function find_by_index(arr, index): + print arr[index] + return arr[index] +``` + +### Linear Time: O(n) + +Linear time is also good. The runtime for algorithms that run in O(n) time is proportional to the size of the input, e.g. 1 x input size or 3 x input size. Earlier we mentioned that finding an item in an array takes O(n) time because the item could be at the very end or not in there at all, which means we must iterate over the length of the array in the worst case. Some examples of linear time procedures include: + +- Iterating over an array, e.g. to find a target value +- Iterating over a string +- Printing each character or element of an array or string, respectively, one by one + +``` +function say_hi_to_everyone(names): + iterate over names: + print "hi " + name +``` + +### Quadratic Time: O(n2) + +Quadratic time is not good, but sometimes unavoidable. The runtime is defined as the square of the input's size. For example, if we had a quadratic time algorithm that took an array as an input: for an input of length 1, there would be 1 operation, but for an input of length 10, there would be 100 operations. Some examples of algorithms that take quadratic time include: + +- Bubble sort +- Selection sort +- Insertion sort +- Some algorithms that contain a loop nested in another loop + +``` +function nested_loop_quadratic_time(arr): + iterate over arr: + iterate over arr: + perform some operation +``` + +In the above example, the outer loop iterates over the entire input array. For each element in the input array, it then iterates over the entire array again. For an array of length 2, there are 2 \* 2 (or 4) operations, but for an array of length 10, there are 10 \* 10 (or 100) operations. + +### Logarithmic Time: O(log n) + +Logarithmic time is fantastic! It's not quite as good as constant time, but it is faster than linear time. If an algorithm runs in O(log n) time, time increases linearly while the input increases exponentially. Let's pretend we have some operation that takes 1 second to handle an input containing 10 elements. When the input has 100 elements, that operation will take 2 seconds, and 1,000 elements will take 3 seconds! That's fast! + +An algorithm may be logarithmic if: + +- The weakest link always runs less than n times +- Each time the input is operated upon, the size of the input is divided by some number + +An example of an O(log n) algorithm is: + +- Binary search + +``` +function useless_log_n_loop(arr): + n = length of arr + + while n > 0: + print arr[n] + n = n / 2 + round down n to nearest integer +``` + +### Graph of Common Time Complexities + +![Image of Big O Graph with Time vs Input](Big-O-graph.png) + +## Need to Know + +When we calculate Big O for a procedure, there are some runtimes we just need to know (or look up). For example, it's important to know the runtime for accessing an element in an array or accessing a value in a Hash (aka Object or Dictionary). Take some time to review this [resource](https://www.bigocheatsheet.com/) (bookmark it!), which includes the best, average, and worst case time complexity for common operations and algorithms. For now, the most important data structures to pay attention to are arrays and hash tables. + +## Note on Recursion + +When calculating Big O for recursive functions, we compare the total stack frames over time to the size of the input. + +``` +function count(stop_count, count = 0): + if count >= stop_count: + return 'done' + + return count(stop_count, count + 1) +``` + +For the above function the total number of frames added to the stack over time is directly proportional to the `stop_count`, so Big O is O(n). + +## Conclusion + +Calculating Big O for a procedure can help you decide between several solutions or improve a solution you've already thought of. It takes time and practice to get used to Big O notation. In the coming days, we'll be asking you to calculate the time complexity for problems you've already solved. We'll also show you our own calculations to help you along. diff --git a/05-week-4--big-o-notation/01-day-2--introduction-to-space-complexity/README.md b/05-week-4--big-o-notation/01-day-2--introduction-to-space-complexity/README.md new file mode 100644 index 00000000..b07bacfc --- /dev/null +++ b/05-week-4--big-o-notation/01-day-2--introduction-to-space-complexity/README.md @@ -0,0 +1,139 @@ +# Day 2: Introduction to Space Complexity + +Space complexity measures how much working memory an algorithm requires. Specifically it measures how the space requirements grow as the input grows. Sound familiar? If this reminds you of time complexity, you're correct! We use the same Big O notation to describe how much space a procedure needs in the worst case. + +Just like time complexity, we calculate space complexity when we're considering competing solutions or when we have specific space requirements we must meet. In game development, for example, engineers are often allocated upper limits for how much space each process may use, such as running the audio engine or rendering certain types of effects. + +If you're still struggling with the concept of time complexity, you might want to take 15 minutes to research Big O and get more comfortable with it before moving forward. Here are two resources you might wisht to read: +- [Interview Cake: Big O Notation](https://www.interviewcake.com/article/java/big-o-notation-time-and-space-complexity) +- [Rob Bell: A Beginner's Guide to Big O Notation](https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/) + +## Refresher + +The important things to remember when calculating time complexity are the same for space complexity: +- Calculate for the worst case +- Focus on the weakest link (the part that will take up the most space) +- Ignore the other details + +### Common Notations + +Here are some of the commonly used Big O values, though there are more, in order from most desirable to least desirable: + +1. Constant O(1): The amount of space required never changes, regardless of the input +2. Logarithmic O(log n): As the size of the input increases exponentially, the amount of space required grows linearly +3. Linear O(n): The amount of space required is equal to the size of the input +4. Quadratic O(n2): The amount of space required is the square of the input + +## Calculating Space Complexity + +When we calculate space complexity, we consider the size of the input as well as the extra space we're allocating for the algorithm to complete successfully. Let's take a look at some examples to see what this means. + +### Constant Space O(1) + +``` +function add(x, y): + return x + y +``` + +This function adds two numbers and returns the result. The inputs will be integers, and the return value will also be an integer. It doesn't matter what those integers are, the space requirements will always be the same for any given inputs. + +### Logarithmic Space O(log n) + +``` +/* for sorted arrays only */ + +function binary_search(array, target): + if array is empty: + return false + + middle = array[array length / 2] + + if middle == target: + return true + + if middle < target: + return binary_search(left half of array) + else: + return binary_search(right half of array) +``` + +The function above is recursive and requires logarithmic space: as the input size grows exponentially, the space required grows linearly. + +Each time it recurses it cuts the input array in half. If you recall from the time complexity reading, an algorithm _might_ take O(log n) runtime if the input is consistently being divided. The same is true for space complexity. + +Since the above method is recursive, we can think of the space in terms of the number of stack frames required for any input. If the target value isn't in the input array, the number of frames will be as follows: + +| Input Length | Frames | +|--------|--------| +| 1 | 1 | +| 2 | 2 | +| 3 | 2 | +| 4 | 3 | +| 5 | 3 | +| 10 | 4 | + +### Linear Space O(n) + +``` +function sum_array(array): + sum = 0 + + iterate over array: + sum = sum + array element + + return sum +``` + +This procedure stores an integer variable and requires an input array to run. If we were to code this fully using a `for` or `while` loop, we'd also have to store another variable for the iteration (the one commonly known as `i`). + +The integer variables, such as `sum` and `i` would require constant space, since they'll only ever store a single integer each. The input array, however, will have varying space requirements because its length is not fixed. The function could be called with an array that's empty or contains 1,000 elements. Therefore, this procedure requires O(n) space: the input array is the weakest link! + +### Quadratic Space O(n2) + +``` +/* a really useless function */ + +function quadratic_recurse(num): + total_times = num * num + + function recurse(count): + if count == total_times: + return + + recurse(count + 1) + + recurse(0) +``` + +This function is recursive and requires quadratic space. Once again, we can think of the required space in terms of total stack frames. If the input number is 1, 1 stack frame is required. If the input is 2, 4 stack frames, and if the input is 4, 16 stack frames are required. + +## Recursive Gotcha + +When thinking about the space complexity of a recursive function, we need to consider how deep the recursion will go in the worst case. In other words, we aren't interested in the total number of stack frames over time, but rather, the deepest depth or the largest number of frames that will be on the stack at any given time. Keep in mind that the stack grows and shrinks as recursive calls are made and then begin returning. A recursive call increases the stack, while hitting a return statement reduces its size. + +``` +function big_sum(array): + total = 0 + + function add(count): + if count == array length: + return + + iterate over each element in array: + total = total + element + add(count + 1) + + add(0) + return total +``` + +The above function adds array length number of frames to the stack for every element in the input array. Let's say the input array is `[1, 2]`. `add` will recurse with a `count` of 1, and will then recurse again with a `count` of 2, so two frames are on the stack. At this point the `count` equals the array length, so the frame will be popped from the stack, reducing its size. As it turns out, the largest number of frames on the stack (or the deepest depth), equals O(n) - i.e. the length fo the input array - for this function. + +## Conclusion + +We can use Big O notation to represent the space complexity of an algorithm, similar to how we use it for time complexity. To calculate the space complexity, we must consider all of the data required for the algorithm to run. We can then pinpoint the weakest link with the worst case in mind and use that to determine Big O. And don't forget, we have to consider how much space the input requires! + +## Further Resources + +- [Understanding Space Complexity](https://www.baeldung.com/cs/space-complexity) +- [Space Complexity of Algorithms](https://www.studytonight.com/data-structures/space-complexity-of-algorithms#) \ No newline at end of file diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/.gitignore b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/README.md b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/README.md new file mode 100644 index 00000000..5c53b014 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/README.md @@ -0,0 +1,87 @@ +# Days 1-2: Implement a Stack Class + +A stack is a data structure where items are processed in last-in-first-out order (LIFO). Similar to a stack of pancakes, where the last pancake placed on the stack is eaten first, the last item placed on the stack is removed and operated upon first. The last item on the stack is known as the **top**, and the first item that was pushed on the stack is known as the **base**. This means that the base is removed from the stack last. + +![pancake stack](./pancakes.png) + +We use stacks to solve certain algorithm problems. We also think of recursive problems in terms of a stack, since each recursive call results in a stack frame being added to the stack: those frames are then processed and removed in LIFO order! If you are tackling a problem and you see that it must be solved depth-first, this is a good clue that you'll either be using recursion or implementing a stack. Depth-first means that we go as deep as we can before we start processing data (LIFO order). + +## Wait! This Sounds A Lot Like an Array! + +We can actually implement a Stack class using an Array as the underlying data structure! Arrays provide all of the methods we need for the core functionality of a Stack. Some of the methods we'll be adding to our Stack class include: `push`, `pop`, `peek`, `isEmpty`, and `print`. Do any of those sound familiar? + +However, it's important to note that an Array doesn't have to be the underlying data structure. It could be another data structure, such as a Linked List (don't worry if you don't know what that is). When calculating Big O for a Stack, we always need to consider what the underlying data structure is since that'll affect our calculations. + +## Implement the Stack Class + +The Stack class already has two attributes: the `stack` itself (an Array) and a `limit`, which is an Integer representing the total number of items allowed in the Stack at one time. + +Add the following methods to the Stack class: + +### `push(item)` + +`push` adds an item to the top of the Stack. If the Stack is full, the item should not be pushed and an Error should be thrown. + +### `pop` + +`pop` removes the item at the top of the Stack and returns it. Don't worry if `pop` is called on an empty stack. It's OK for it to return the default return value, such as `undefined` or `nil`. + +### `peek` + +`peek` returns the item at the top of the Stack without removing it. If the Stack is empty, use the default return value, e.g. `undefined` or `nil`. + +### `isEmpty` + +`isEmpty` returns `true` if the Stack is empty, otherwise `false`. + +### `isFull` + +`isFull` returns `true` if no more space is available in the Stack, otherwise `false`. + +### `size` + +`size` returns the number of items currently on the Stack. + +### `search(target)` + +`search` returns an Integer representing how far the target item is from the top of the stack. If the item is not in the Stack, return `-1`. Example: + +``` +// Stack = 1, 2, 3, 4, 5 <-top + +stack.search(5) => 0 +stack.search(4) => 1 +stack.search(6) => -1 +``` + +### `print` + +`print` prints the contents of the stack. It does not return them! You may print them however you wish. + +We've provided starter code for some languages. Choose whichever language you like. Once again, we recommend writing your own tests first and then running the test suites. + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/package.json b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/package.json new file mode 100644 index 00000000..c46ffedc --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "stack", + "version": "1.0.0", + "description": "stack class", + "main": "stack.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/stack.js b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/stack.js new file mode 100644 index 00000000..62df33d9 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/stack.js @@ -0,0 +1,56 @@ +class Stack { + constructor() { + this.stack = []; + // this is an arbitrary value to make testing easier + // 1,024 would be way too high to test! + this.limit = 10; + } + + // add item to top of stack if not full + // if full throw error + push(item) { + + } + + // remove item from top of stack and return it + pop() { + + } + + // return item at top of stack without removing it + peek() { + + } + + // return true if stack is empty, otherwise false + isEmpty() { + + } + + // return true if stack is full, otherwise false + isFull() { + + } + + // return number of items in stack + size() { + + } + + // return -1 if item not in stack, otherwise integer representing + // how far it is from the top + search(target) { + + } + + // print contents of stack: do not return the stack itself! + print() { + + } +} + +if (require.main === module) { + // add your own tests in here +} + +module.exports = Stack; diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/tests/stack.test.js b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/tests/stack.test.js new file mode 100644 index 00000000..7decb52e --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/javascript/tests/stack.test.js @@ -0,0 +1,71 @@ +const Stack = require('../stack'); +const stack = new Stack(); +const stackWithItems = new Stack; +const fullStack = new Stack(); + +stackWithItems.stack = [1, 2, 3, 4, 5]; +fullStack.stack = [0,1,2,3,4,5,6,7,8,9]; + +test('size() returns 0 when the stack is empty', () => { + expect(stack.size()).toBe(0); +}); + +test('size() returns the correct number when the stack is not empty', () => { + expect(stackWithItems.size()).toBe(5); +}); + +test('isEmpty() returns true when the stack is empty', () => { + expect(stack.isEmpty()).toBe(true); +}); + +test('isEmpty() returns false when the stack has items', () => { + expect(stackWithItems.isEmpty()).toBe(false); +}); + +test('isFull() returns false when the stack has less than 10 items', () => { + expect(stack.isFull()).toBe(false); + expect(stackWithItems.isFull()).toBe(false); +}); + +test('isFull() returns true when the stack has 10 items', () => { + expect(fullStack.isFull()).toBe(true); +}); + +test('peek() returns the last item on the stack without removing it', () => { + expect(stackWithItems.peek()).toBe(5); + expect(stackWithItems.size()).toBe(5); +}); + +test('pop() returns the last item on the stack and removes it', () => { + expect(stackWithItems.pop()).toBe(5); + expect(stackWithItems.size()).toBe(4); + stackWithItems.push(5); +}); + +test('push() pushes an item onto the stack if it\'s not full', () => { + stackWithItems.push(6); + + expect(stackWithItems.size()).toBe(6); + expect(stackWithItems.peek()).toBe(6); + stackWithItems.pop(); +}); + +test('push() throws an exception if the stack is full', () => { + expect(() => { + fullStack.push(10); + }).toThrow(Error); +}); + +test('search() returns the distance between the top and the target element', () => { + expect(stackWithItems.search(5)).toBe(0); + expect(stackWithItems.search(4)).toBe(1); + expect(stackWithItems.search(1)).toBe(4); +}); + +test('search() returns -1 when the target is not in the stack', () => { + expect(stackWithItems.search(7)).toBe(-1); +}); + +test('print() does not return the stack array itself', () => { + expect(stack.print()).not.toBe(stack.stack); +}); diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/pancakes.png b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/pancakes.png new file mode 100644 index 0000000000000000000000000000000000000000..ece9dde24f2e30ab4305b1d870e443c850b8f44f GIT binary patch literal 509400 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%0DN)6WWaf(G*%cEni#@w=Em-#mEXRFrb^1 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

    >!Mfb+WOUx0U&8 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

    S@`n9X5RhqC4cyt+4zxA(boU|TJdlnY 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 CvPmoG3>x$3wYp`3BapyWL7_ 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 literal 0 HcmV?d00001 diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/.rspec b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/Gemfile b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/spec/spec_helper.rb b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/spec/stack_spec.rb b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/spec/stack_spec.rb new file mode 100644 index 00000000..d5e94a2b --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/spec/stack_spec.rb @@ -0,0 +1,100 @@ +require './stack.rb' + +class Stack + attr_accessor :stack +end + +RSpec.describe 'Stack' do + let(:stack) { Stack.new } + + context '#size' do + it 'returns 0 when the stack is empty' do + expect(stack.size).to eq(0) + end + + it 'returns the correct size when items are in the stack' do + stack.stack = [1, 2, 3] + + expect(stack.size).to eq(3) + end + end + + context '#isEmpty?' do + it 'returns true when the stack is empty' do + expect(stack.isEmpty?).to be true + end + + it 'returns false when items are in the stack' do + stack.stack = [1] + + expect(stack.isEmpty?).to be false + end + end + + context '#isFull?' do + it 'returns false when the stack has less than 10 items' do + expect(stack.isFull?).to be false + end + + it 'returns true when the stack has 10 items' do + stack.stack = [1,2,3,4,5,6,7,8,9,10] + + expect(stack.isFull?).to be true + end + end + + context '#peek' do + it 'returns the last item on the stack without removing it' do + stack.stack = [1, 2, 3] + + expect(stack.peek).to eq(3) + expect(stack.size).to eq(3) + end + end + + context '#pop' do + it 'returns the last item on the stack and removes it' do + stack.stack = [1, 2, 3] + + expect(stack.pop).to eq(3) + expect(stack.size).to eq(2) + end + end + + context '#push' do + it 'pushes an item onto the stack if it\'s not full' do + stack.push(0) + + expect(stack.size).to eq(1) + expect(stack.peek).to eq(0) + end + + it 'throws an exception if the stack is full' do + stack.stack = [0,1,2,3,4,5,6,7,8,9] + + expect { stack.push(10) }.to raise_error + end + end + + context '#search' do + it 'returns the distance between the top and the target element' do + stack.stack = [1, 2, 3, 4, 5] + + expect(stack.search(5)).to eq(0) + expect(stack.search(4)).to eq(1) + expect(stack.search(1)).to eq(4) + end + + it 'returns -1 when the target is not in the stack' do + stack.stack = [1, 2, 3, 4, 5] + + expect(stack.search(7)).to eq(-1) + end + end + + context '#print' do + it 'does not return the stack array itself' do + expect(stack.print).to_not be(stack.stack) + end + end +end \ No newline at end of file diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/stack.rb b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/stack.rb new file mode 100644 index 00000000..df949718 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/ruby/stack.rb @@ -0,0 +1,49 @@ +class Stack + attr_reader :limit + + def initialize + @stack = [] + # this is an arbitrary value to make testing easier + # 1,024 would be way too high to test! + @limit = 10 + end + + # add item to top of stack if not full + # if full, throw error + def push(item) + end + + # remove item from top of stack and return it + def pop + end + + # return item at top of stack without removing it + def peek + end + + # return true if stack is empty, otherwise false + def isEmpty? + end + + # return true if stack is full, otherwise false + def isFull? + end + + # return number of items in stack + def size + end + + # return -1 if item not in stack, otherwise integer representing + # how far it is from the top + def search(target) + end + + # print contents of stack: do not return the stack itself! + def print + end +end + +if __FILE__ == $PROGRAM_NAME + # Don't forget to add your tests! +end + diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/solutions/stack.js b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/solutions/stack.js new file mode 100644 index 00000000..807ef529 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/solutions/stack.js @@ -0,0 +1,113 @@ +class Stack { + constructor() { + this.stack = []; + // this is an arbitrary value to make testing easier + // 1,024 would be way too high to test! + this.limit = 10; + } + + // add item to top of stack if not full + push(item) { + if (!this.isFull()) { + this.stack.push(item); + } else { + throw new Error('Stack is full!'); + } + } + + // remove item from top of stack + pop() { + return this.stack.pop(); + } + + // return item at top of stack without removing it + peek() { + return this.stack[this.size() - 1]; + } + + // return true if stack is empty, otherwise false + isEmpty() { + return this.size() === 0; + } + + // return true if stack is full, otherwise false + isFull() { + return this.size() === this.limit; + } + + // return number of items in stack + size() { + return this.stack.length; + } + + // return -1 if item not in stack, otherwise integer representing + // how far it is from the top + search(target) { + for (let i = -1; i >= -this.size(); --i) { + if (this.stack[this.size() + i] === target) { + return Math.abs(i) - 1; + } + } + + return -1; + } + + // print contents of stack: do not return the stack itself! + print() { + console.log(this.stack.join(' <- ')); + } +} + +if (require.main === module) { + // add your own tests in here + const stack = new Stack(); + + console.log('size', stack.size()); + console.log('is empty?', stack.isEmpty()); + console.log('is full?', stack.isFull()); + console.log('find 5', stack.search(5)); + console.log('peek while empty', stack.peek()); + + for (let i = 0; i < 5; ++i) { + stack.push(i); + } + + console.log('ADD ITEMS 0 TO 4'); + console.log('size', stack.size()); + console.log('is empty?', stack.isEmpty()); + console.log('is full?', stack.isFull()); + console.log('find 3', stack.search(3)); + console.log('peek', stack.peek()); + stack.print(); + + for (let i = 5; i < 10; ++i) { + stack.push(i); + } + + console.log('ADD ITEMS 5 TO 9'); + console.log('size', stack.size()); + console.log('is empty?', stack.isEmpty()); + console.log('is full?', stack.isFull()); + console.log('find 3', stack.search(3)); + console.log('peek', stack.peek()); + stack.print(); + + console.log('pop', stack.pop()); + console.log('size', stack.size()); + console.log('is empty?', stack.isEmpty()); + console.log('is full?', stack.isFull()); + console.log('peek', stack.peek()); + stack.print(); + + console.log('GENERATE ERROR'); + stack.push(9); + + try { + stack.push(10); + } catch(err) { + console.log(err); + stack.print(); + } +} + +module.exports = Stack; diff --git a/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/solutions/stack.rb b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/solutions/stack.rb new file mode 100644 index 00000000..1d39cc19 --- /dev/null +++ b/06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class/solutions/stack.rb @@ -0,0 +1,110 @@ +class Stack + attr_reader :limit + + def initialize + @stack = [] + # this is an arbitrary value to make testing easier + # 1,024 would be way too high to test! + @limit = 10 + end + + # add item to top of stack if not full + # if full, throw error + def push(item) + raise 'Stack is full' if isFull? + + @stack.push(item) + end + + # remove item from top of stack and return it + def pop + @stack.pop + end + + # return item at top of stack without removing it + def peek + @stack.last + end + + # return true if stack is empty, otherwise false + def isEmpty? + size.zero? + end + + # return true if stack is full, otherwise false + def isFull? + size === @limit + end + + # return number of items in stack + def size + @stack.length + end + + # return -1 if item not in stack, otherwise integer representing + # how far it is from the top + def search(target) + @stack.each_with_index do |item, idx| + return size - idx - 1 if item == target + end + + -1 + end + + # print contents of stack: do not return the stack itself! + def print + puts @stack.join(' <- ') + end +end + +if __FILE__ == $PROGRAM_NAME + stack = Stack.new; + + puts "'size': #{stack.size}" + puts "'is empty?': #{stack.isEmpty?}" + puts "'is full?': #{stack.isFull?}" + puts "'find 5': #{stack.search(5)}" + puts "'peek while empty': #{stack.peek}" + + (0...5).each do |num| + stack.push(num) + end + + puts "'ADD ITEMS 0 TO 4'" + puts "'size': #{stack.size}" + puts "'is empty?': #{stack.isEmpty?}" + puts "'is full?': #{stack.isFull?}" + puts "'find 3': #{stack.search(3)}" + puts "'peek': #{stack.peek}" + stack.print + + (5..9).each do |num| + stack.push(num) + end + + puts 'ADD ITEMS 5 TO 9' + puts "'size': #{stack.size}" + puts "'is empty?': #{stack.isEmpty?}" + puts "'is full?': #{stack.isFull?}" + puts "'find 3': #{stack.search(3)}" + puts "'peek': #{stack.peek}" + stack.print + + puts "'pop': #{stack.pop}" + puts "'size': #{stack.size}" + puts "'is empty?': #{stack.isEmpty?}" + puts "'is full?': #{stack.isFull?}" + puts "'peek': #{stack.peek}" + stack.print + + puts'GENERATE ERROR' + stack.push(9) + + begin + stack.push(10) + rescue StandardError => e + puts e.message + stack.print + end +end + diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/.gitignore b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/README.md b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/README.md new file mode 100644 index 00000000..c1c692cb --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/README.md @@ -0,0 +1,83 @@ +# Days 3-4: Implement a Queue Class + +A queue is a data structure where items are processed in first-in-first-out order (FIFO). It has two ends: a front and a rear. The front is where items are dequeued from first, while items at the rear are handled last. Items are added to the rear of the queue until the queue is full. A queue operates a lot like a queue at the checkout of a grocery store. Customers join at the end of the line and are served at the front of the line. + +![grocery queue](./grocery_store.jpg) + +We can implement a Queue class using an Array as the underlying data structure! Arrays provide all of the methods we need for the core functionality of a Queue. Some of the methods we'll be adding to our Queue class include: `enqueue`, `dequeue`, `peek`, `isEmpty`, and `print`. + +However, it's important to note that an Array doesn't have to be the underlying data structure. It could be another data structure, such as a Linked List (don't worry if you don't know what that is). When calculating Big O for a Queue, we always need to consider what the underlying data structure is since that'll affect our calculations. + +## Implement the Queue Class + +The Queue class already has two attributes: the `queue` itself (an Array) and a `limit`, which is an Integer representing the total number of items allowed in the `queue` at one time. + +Add the following methods to the class: + +### `enqueue(item)` + +`enqueue` adds an item to the back of the queue. If the queue is full, the item should not be pushed and an Error should be thrown. + +### `dequeue` + +`dequeue` removes the item at the front of the queue and returns it. Don't worry if `dequeue` is called on an empty queue. It's OK for it to return the default return value, such as `undefined` or `nil`. + +### `peek` + +`peek` returns the item at the front of the queue without removing it. If the queue is empty, use the default return value, e.g. `undefined` or `nil`. + +### `isEmpty` + +`isEmpty` returns `true` if the queue is empty, otherwise `false`. + +### `isFull` + +`isFull` returns `true` if no more space is available in the queue, otherwise `false`. + +### `size` + +`size` returns the number of items currently in the queue. + +### `search(target)` + +`search` returns an Integer representing how far the target item is from the front of the queue. If the item is not in the queue, return `-1`. Example: + +``` +// queue = 1, 2, 3, 4, 5 <- rear + +queue.search(5) => 4 +queue.search(4) => 3 +queue.search(6) => -1 +``` + +### `print` + +`print` prints the contents of the queue. It does not return them! You may print them however you wish. + +We've provided starter code for some languages. Choose whichever language you like. Once again, we recommend writing your own tests first and then running the test suites. + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/grocery_store.jpg b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/grocery_store.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e6830ee74ad2e4c5b70ebb1f44aa08c2bf7cefe GIT binary patch literal 55818 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 z { + expect(queue.size()).toBe(0); +}); + +test('size() returns the correct number when the queue is not empty', () => { + expect(queueWithItems.size()).toBe(5); +}); + +test('isEmpty() returns true when the queue is empty', () => { + expect(queue.isEmpty()).toBe(true); +}); + +test('isEmpty() returns false when the queue has items', () => { + expect(queueWithItems.isEmpty()).toBe(false); +}); + +test('isFull() returns false when the queue has less than 10 items', () => { + expect(queue.isFull()).toBe(false); + expect(queueWithItems.isFull()).toBe(false); +}); + +test('isFull() returns true when the queue has 10 items', () => { + expect(fullQueue.isFull()).toBe(true); +}); + +test('peek() returns the frontmost item in the queue without removing it', () => { + expect(queueWithItems.peek()).toBe(1); + expect(queueWithItems.size()).toBe(5); +}); + +test('dequeue() returns the first item in the queue and removes it', () => { + expect(queueWithItems.dequeue()).toBe(1); + expect(queueWithItems.size()).toBe(4); + queueWithItems.queue.unshift(1); +}); + +test('enqueue() pushes an item onto the queue if it\'s not full', () => { + queueWithItems.enqueue(6); + + expect(queueWithItems.size()).toBe(6); + expect(queueWithItems.peek()).toBe(1); + queueWithItems.queue.pop(); +}); + +test('enqueue() throws an exception if the queue is full', () => { + expect(() => { + fullQueue.enqueue(10); + }).toThrow(Error); +}); + +test('search() returns the distance between the front and the target element', () => { + expect(queueWithItems.search(5)).toBe(4); + expect(queueWithItems.search(4)).toBe(3); + expect(queueWithItems.search(1)).toBe(0); +}); + +test('search() returns -1 when the target is not in the queue', () => { + expect(queueWithItems.search(7)).toBe(-1); +}); + +test('print() does not return the queue array itself', () => { + expect(queue.print()).not.toBe(queue.queue); +}); diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/.rspec b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/Gemfile b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/queue.rb b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/queue.rb new file mode 100644 index 00000000..fee25564 --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/queue.rb @@ -0,0 +1,49 @@ +class Queue + attr_reader :limit + + def initialize + @queue = [] + # this is an arbitrary value to make testing easier + # 1,024 would be way too high to test! + @limit = 10 + end + + # add item to rear of queue if not full + # if full, throw error + def enqueue(item) + end + + # remove item from front of queue and return it + def dequeue + end + + # return item at front of queue without removing it + def peek + end + + # return true if queue is empty, otherwise false + def isEmpty? + end + + # return true if queue is full, otherwise false + def isFull? + end + + # return number of items in queue + def size + end + + # return -1 if item not in queue, otherwise integer representing + # how far it is from the front + def search(target) + end + + # print contents of queue: do not return the queue itself! + def print + end +end + +if __FILE__ == $PROGRAM_NAME + # Don't forget to add your tests! +end + diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/spec/queue_spec.rb b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/spec/queue_spec.rb new file mode 100644 index 00000000..c76b6922 --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/spec/queue_spec.rb @@ -0,0 +1,101 @@ +require './queue.rb' + +class Queue + attr_accessor :queue +end + +RSpec.describe 'Queue' do + let(:queue) { Queue.new } + + context '#size' do + it 'returns 0 when the queue is empty' do + expect(queue.size).to eq(0) + end + + it 'returns the correct size when items are in the queue' do + queue.queue = [1, 2, 3] + + expect(queue.size).to eq(3) + end + end + + context '#isEmpty?' do + it 'returns true when the queue is empty' do + expect(queue.isEmpty?).to be true + end + + it 'returns false when items are in the queue' do + queue.queue = [1] + + expect(queue.isEmpty?).to be false + end + end + + context '#isFull?' do + it 'returns false when the queue has less than 10 items' do + expect(queue.isFull?).to be false + end + + it 'returns true when the queue has 10 items' do + queue.queue = [1,2,3,4,5,6,7,8,9,10] + + expect(queue.isFull?).to be true + end + end + + context '#peek' do + it 'returns the frontmost item in the queue without removing it' do + queue.queue = [1, 2, 3] + + expect(queue.peek).to eq(1) + expect(queue.size).to eq(3) + end + end + + context '#dequeue' do + it 'returns the first item in the queue and removes it' do + queue.queue = [1, 2, 3] + + expect(queue.dequeue).to eq(1) + expect(queue.size).to eq(2) + end + end + + context '#enqueue' do + it 'pushes an item onto the queue if it\'s not full' do + queue.queue = [1, 2, 3] + queue.enqueue(0) + + expect(queue.size).to eq(4) + expect(queue.peek).to eq(1) + end + + it 'throws an exception if the queue is full' do + queue.queue = [0,1,2,3,4,5,6,7,8,9] + + expect { queue.enqueue(10) }.to raise_error + end + end + + context '#search' do + it 'returns the distance between the front and the target element' do + queue.queue = [1, 2, 3, 4, 5] + + expect(queue.search(5)).to eq(4) + expect(queue.search(4)).to eq(3) + expect(queue.search(1)).to eq(0) + end + + it 'returns -1 when the target is not in the queue' do + queue.queue = [1, 2, 3, 4, 5] + + expect(queue.search(7)).to eq(-1) + end + end + + context '#print' do + it 'does not return the queue array itself' do + expect(queue.print).to_not be(queue.queue) + end + end +end \ No newline at end of file diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/spec/spec_helper.rb b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/solutions/queue.js b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/solutions/queue.js new file mode 100644 index 00000000..f272776e --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/solutions/queue.js @@ -0,0 +1,107 @@ +class Queue { + constructor() { + this.queue = []; + // this is an arbitrary value to make testing easier + // 1,024 would be way too high to test! + this.limit = 10; + } + + // add item to rear of queue if not full + enqueue(item) { + if (!this.isFull()) { + this.queue.push(item); + } else { + throw new Error('Queue is full!'); + } + } + + // remove item from front of queue + dequeue() { + return this.queue.shift(); + } + + // return item at front of queue without removing it + peek() { + return this.queue[0]; + } + + // return true if queue is empty, otherwise false + isEmpty() { + return this.size() === 0; + } + + // return true if queue is full, otherwise false + isFull() { + return this.size() === this.limit; + } + + // return number of items in queue + size() { + return this.queue.length; + } + + // return -1 if item not in queue, otherwise integer representing + // how far it is from the front + search(target) { + return this.queue.indexOf(target); + } + + // print contents of queue: do not return the queue itself! + print() { + console.log(this.queue.join(' -> ')); + } +} + +if (require.main === module) { + // add your own tests in here + const queue = new Queue(); + + console.log('size', queue.size()); + console.log('is empty?', queue.isEmpty()); + console.log('is full?', queue.isFull()); + console.log('find 5', queue.search(5)); + console.log('peek while empty', queue.peek()); + + for (let i = 0; i < 5; ++i) { + queue.enqueue(i); + } + + console.log('ADD ITEMS 0 TO 4'); + console.log('size', queue.size()); + console.log('is empty?', queue.isEmpty()); + console.log('is full?', queue.isFull()); + console.log('find 3', queue.search(3)); + console.log('peek', queue.peek()); + queue.print(); + + for (let i = 5; i < 10; ++i) { + queue.enqueue(i); + } + + console.log('ADD ITEMS 5 TO 9'); + console.log('size', queue.size()); + console.log('is empty?', queue.isEmpty()); + console.log('is full?', queue.isFull()); + console.log('find 3', queue.search(3)); + console.log('peek', queue.peek()); + queue.print(); + + console.log('dequeue', queue.dequeue()); + console.log('size', queue.size()); + console.log('is empty?', queue.isEmpty()); + console.log('is full?', queue.isFull()); + console.log('peek', queue.peek()); + queue.print(); + + console.log('GENERATE ERROR'); + queue.enqueue(10); + + try { + queue.enqueue(11); + } catch(err) { + console.log(err); + queue.print(); + } +} + +module.exports = Queue; diff --git a/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/solutions/queue.rb b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/solutions/queue.rb new file mode 100644 index 00000000..1ae39aa9 --- /dev/null +++ b/06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class/solutions/queue.rb @@ -0,0 +1,106 @@ +class Queue + attr_reader :limit + + def initialize + @queue = [] + # this is an arbitrary value to make testing easier + # 1,024 would be way too high to test! + @limit = 10 + end + + # add item to rear of queue if not full + # if full, throw error + def enqueue(item) + raise 'Queue is full' if isFull? + + @queue.push(item) + end + + # remove item from front of queue and return it + def dequeue + @queue.shift + end + + # return item at front of queue without removing it + def peek + @queue.first + end + + # return true if queue is empty, otherwise false + def isEmpty? + size.zero? + end + + # return true if queue is full, otherwise false + def isFull? + size === @limit + end + + # return number of items in queue + def size + @queue.length + end + + # return -1 if item not in queue, otherwise integer representing + # how far it is from the front + def search(target) + @queue.index(target) || -1 + end + + # print contents of queue: do not return the queue itself! + def print + puts @queue.join(' -> ') + end +end + +if __FILE__ == $PROGRAM_NAME + queue = Queue.new; + + puts "'size': #{queue.size}" + puts "'is empty?': #{queue.isEmpty?}" + puts "'is full?': #{queue.isFull?}" + puts "'find 5': #{queue.search(5)}" + puts "'peek while empty': #{queue.peek}" + + (0...5).each do |num| + queue.enqueue(num) + end + + puts "'ADD ITEMS 0 TO 4'" + puts "'size': #{queue.size}" + puts "'is empty?': #{queue.isEmpty?}" + puts "'is full?': #{queue.isFull?}" + puts "'find 3': #{queue.search(3)}" + puts "'peek': #{queue.peek}" + queue.print + + (5..9).each do |num| + queue.enqueue(num) + end + + puts 'ADD ITEMS 5 TO 9' + puts "'size': #{queue.size}" + puts "'is empty?': #{queue.isEmpty?}" + puts "'is full?': #{queue.isFull?}" + puts "'find 3': #{queue.search(3)}" + puts "'peek': #{queue.peek}" + queue.print + + puts "'dequeue': #{queue.dequeue}" + puts "'size': #{queue.size}" + puts "'is empty?': #{queue.isEmpty?}" + puts "'is full?': #{queue.isFull?}" + puts "'peek': #{queue.peek}" + queue.print + + puts'GENERATE ERROR' + queue.enqueue(10) + + begin + queue.enqueue(11) + rescue StandardError => e + puts e.message + queue.print + end +end + diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/.gitignore b/06-week-5--big-o-continued/02-day-5--implement-a-set/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/README.md b/06-week-5--big-o-continued/02-day-5--implement-a-set/README.md new file mode 100644 index 00000000..d87a94ec --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/README.md @@ -0,0 +1,117 @@ +# Day 5: What Is a Set? + +A Set is a data structure that can store any number of unique values or elements. That means there are no repeating elements in a Set. Many languages provide Sets as part of the core language, but today, we'll be building our own MySet class by using a Hash/Object as the underlying data structure. We've chosen a Hash/Object because that data structure only allows unique keys. + +``` +// Convert an Array to a Set + +array = [1, 3, 1, 2] +set = new Set from array +=> {1, 3, 2} +``` + +## Implement the MySet class + +We have already declared a class called `MySet` in the starter files and provided the underlying data structure: a Hash/Object called `data`. You'll need to build out all of the methods. Do not worry about the ordering of items in the Set. They can be in any order. + +Be aware that these methods may go by different names in different languages. This is one way to implement a Set, there are others! We are basing our's on JavaScript's Set class. + +### Initialization, e.g. `constructor(iterable)` or `#initialize(iterable)` + +We should be able to initialize a new empty MySet, or one with an iterable, such as an Array or String. When a new MySet is initialized with an Array or String, only its unique contents should be added to MySet. Use a value of `true` for each key: `{ dog: true }`. + +``` +// Values in Hash omitted for conciseness +new MySet() +=> MySet data = {} +new MySet(Array [1, 2, 1, 3]) +=> MySet data = {1, 2, 3} +new MySet(String 'hello') +=> MySet data = {'h', 'e', 'l', 'o'} +``` + +An error should be thrown if a user tries to initialize a new MySet with anything other than nothing, a String or an Array. + +### `size` + +Returns the number of items in the MySet instance. + +### `add(item)` + +Add an item to a MySet instance. Remember, only unique items should exist in MySet. When adding an item, the item is added as is. Return the MySet instance. + +``` +my_set = new MySet() +my_set.add('caat') +=> MySet data = { 'caat' } + +next_set = new MySet('doooog') +next_set.add('caarp') +=> MySet data = { 'd', 'o', 'g', 'caarp' } +next_set.add(12) +=> MySet data = { 'd', 'o', 'g', 'caarp', 12 } +``` + +**_Note on JS: Arrays cannot be keys for JS Objects. They will be converted to strings by default like so: `[1, 2] => '1,2'`. Don't worry about this. We'll ensure our tests allow for this. For now, just be aware that actual Sets most certainly can handle Arrays!_** + +### `delete(item)` + +Removes the item from the MySet instance. If the removal was successful, return `true`. If the item was not removed (i.e. it wasn't in there), return `false`. + +``` +my_set = new MySet('aabb') +my_set.delete('a') +=> true +my_set.delete('z') +=> false +``` + +**_Note on JS: Don't worry about handling Arrays here!_** + +### `has(item)` + +If the item is in the MySet instance, return `true`, otherwise `false`. + +**_Note on JS: Don't worry about handling Arrays here!_** + +### `entries` + +Returns an Array containing all of the values in the MySet instance. + +``` +my_set = new MySet('aabb') +my_set.entries() +=> ['a', 'b'] +``` + +**_Note on JS: Don't worry about handling Arrays (which were meant to be keys in `this.data`) here!_** + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/my_set.js b/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/my_set.js new file mode 100644 index 00000000..21032e5e --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/my_set.js @@ -0,0 +1,47 @@ +class MySet { + // throw an error if called with anything other than string, array or nothing + // if an iterable is provided only its unique values should be in data + // strings and arrays will need to be broken down by their elements/characters + constructor(iterable) { + this.data = {}; + } + + // return number of elements in MySet + size() { + + } + + // add an item to MySet as is + // don't worry about arrays here! + // return the MySet instance + add(item) { + + } + + // delete an item from MySet + // don't worry about arrays here! + // return true if successful, otherwise false + delete(item) { + + } + + // return true if in MySet, otherwise false + // don't worry about arrays here! + has(item) { + + } + + // return data as an array + // don't worry about arrays here! + entries() { + + } +} + +if (require.main === module) { + // add your own tests in here + +} + +module.exports = MySet; + diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/package.json b/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/package.json new file mode 100644 index 00000000..6874fef6 --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "myset", + "version": "1.0.0", + "description": "set class", + "main": "my_set.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/tests/my_set.test.js b/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/tests/my_set.test.js new file mode 100644 index 00000000..1ae1deb4 --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/javascript/tests/my_set.test.js @@ -0,0 +1,57 @@ +const MySet = require('../my_set'); + +let emptySet = new MySet(); +let dataSet = new MySet('hello'); + +test('initialize(iterator = nil) raises an exception if the argument is not nothing, an array, or a string', () => { + expect(() => { + new MySet(1); + }).toThrow(Error); +}); + +test('initialize(iterator = nil) populates @data with keys when given an Array or String', () => { + const arraySet = new MySet([1, 2, 1, 3]); + const sortedArraySet = Object.keys(arraySet.data).sort(); + const sortedDataSet = Object.keys(dataSet.data).sort(); + + expect(sortedArraySet).toEqual(["1", "2", "3"]); + expect(sortedDataSet.join('')).toBe('ehlo'); +}); + +test('size() returns the number of items in the set', () => { + expect(emptySet.size()).toBe(0); + expect(dataSet.size()).toBe(4); +}); + +test('add(item) adds the item to the set', () => { + emptySet.add('cat'); + + expect(emptySet.data['cat']).toBe(true); +}); + +test('add(item) returns the instance of MySet', () => { + expect(emptySet.add('cat')).toBe(emptySet); +}); + +test('has(item) returns true if the item is in the set', () => { + expect(dataSet.has('h')).toBe(true); +}); + +test('has(item) returns false if the item is not in the set', () => { + expect(dataSet.has('z')).toBe(false); +}); + +test('delete(item) returns true upon successful deletion', () => { + expect(dataSet.delete('h')).toBe(true); +}); + +test('delete(item) returns false if item was not found', () => { + expect(dataSet.delete('iiii')).toBe(false); +}); + +test('entries() returns an array of all of the unique keys in data', () => { + const test = new MySet('aaabb'); + const letters = Object.keys(test.data).sort(); + + expect(letters.join('')).toBe('ab'); +}); diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/.rspec b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/Gemfile b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/my_set.rb b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/my_set.rb new file mode 100644 index 00000000..09507d31 --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/my_set.rb @@ -0,0 +1,37 @@ +class MySet + attr_reader :data + # throw an error if called with anything other than string, array or nothing + # if an iterable is provided only its unique values should be in data + # strings and arrays will need to be broken down by their elements/characters + def initialize(iterable = nil) + @data = {} + end + + # return number of elements in MySet + def size + end + + # add an item to MySet as is + # return the MySet instance + def add(item) + end + + # delete an item from MySet + # return true if successful otherwise false + def delete(item) + end + + # return true if in MySet, otherwise false + def has(item) + end + + # return data as an array + def entries + end +end + +if __FILE__ == $PROGRAM_NAME + # Don't forget to add your own! +end + + diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/spec/my_set_spec.rb b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/spec/my_set_spec.rb new file mode 100644 index 00000000..82f948d1 --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/spec/my_set_spec.rb @@ -0,0 +1,65 @@ +require './my_set' + +RSpec.describe 'MySet' do + let(:empty_set) { MySet.new } + let(:data_set) { MySet.new('hello') } + + context '#initialize(iterator = nil)' do + it 'raises an exception if the argument is not nothing, an array, or a string' do + expect { MySet.new(1) }.to raise_exception + end + + it 'populates @data with keys when given an Array or String' do + array_set = MySet.new([1, 2, 1, 3]) + string_set = MySet.new('hello') + + expect(array_set.data.keys.sort).to eq([1, 2, 3].sort) + expect(string_set.data.keys.sort).to eq('helo'.chars.sort) + end + end + + context '#size' do + it 'returns the number of items in the set' do + expect(empty_set.size).to eq(0) + expect(data_set.size).to eq(4) + end + end + + context '#add(item)' do + it 'adds the item to the set' do + empty_set.add('cat') + expect(empty_set.data['cat']).to eq(true) + end + + it 'returns the instance of MySet' do + expect(empty_set.add('cat')).to eq(empty_set) + end + end + + context '#has(item)' do + it 'returns true if the item is in the set' do + expect(data_set.has('h')).to be true + end + + it 'returns false if the item is not in the set' do + expect(data_set.has('z')).to be false + end + end + + context '#delete(item)' do + it 'returns true upon successful deletion' do + expect(data_set.delete('l')).to be true + end + + it 'returns false if the item could not be deleted' do + expect(data_set.delete('z')).to be false + end + end + + context '#entries' do + it 'returns an array of all of the unique keys in data' do + expect(data_set.entries.sort).to eq('helo'.chars.sort) + expect(empty_set.entries).to eq([]) + end + end +end diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/spec/spec_helper.rb b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/solutions/my_set.js b/06-week-5--big-o-continued/02-day-5--implement-a-set/solutions/my_set.js new file mode 100644 index 00000000..f9e1a9cc --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/solutions/my_set.js @@ -0,0 +1,90 @@ +class MySet { + // throw an error if called with anything other than string, array or nothing + // if an iterable is provided only its unique values should be in data + // strings and arrays will need to be broken down by their elements/characters + constructor(iterable) { + if (!(iterable === undefined || + Array.isArray(iterable) || + typeof iterable === 'string')) { + throw new Error('MySet only accepts iterables or nothing on initialization!'); + } + + this.data = {}; + + if (iterable) { + for (const el of iterable) { + this.data[el] = true; + } + } + } + + // return number of elements in MySet + size() { + return this.entries().length; + } + + // add an item to MySet as is + // don't worry about arrays here! + add(item) { + this.data[item] = true; + return this; + } + + // delete an item from MySet + // don't worry about arrays here! + delete(item) { + if (this.has(item)) { + delete this.data[item]; + return true; + } + + return false; + } + + // return true if in MySet, otherwise false + // don't worry about arrays here! + has(item) { + return !!this.data[item]; + } + + // return data as an array + // don't worry about arrays here! + entries() { + return Object.keys(this.data); + } +} + +if (require.main === module) { + let mySet = new MySet(); + console.log('empty', mySet); + console.log('size', mySet.size()); + console.log('entries', mySet.entries()); + + mySet = new MySet([1, 2, 1, 3]); + console.log('with array [1, 2, 1, 3]', mySet); + console.log('size', mySet.size()); + console.log('entries', mySet.entries()); + + mySet = new MySet('hello'); + console.log('with string hello', mySet); + console.log('size', mySet.size()); + console.log('entries', mySet.entries()); + + console.log(''); + console.log('ADD STUFF'); + console.log(mySet.add('adding')); + console.log(mySet.add(5)); + + console.log(''); + console.log('HAS STUFF'); + console.log(mySet.has('adding')); + console.log(mySet.has(10000)); + + console.log(''); + console.log('DELETE STUFF'); + console.log(mySet.delete('adding')); + console.log(mySet.delete(10000)); +} + +module.exports = MySet; + diff --git a/06-week-5--big-o-continued/02-day-5--implement-a-set/solutions/my_set.rb b/06-week-5--big-o-continued/02-day-5--implement-a-set/solutions/my_set.rb new file mode 100644 index 00000000..5c16300d --- /dev/null +++ b/06-week-5--big-o-continued/02-day-5--implement-a-set/solutions/my_set.rb @@ -0,0 +1,82 @@ +class MySet + attr_reader :data + # throw an error if called with anything other than string, array or nothing + # if an iterable is provided only its unique values should be in data + # strings and arrays will need to be broken down by their elements/characters + def initialize(iterable = nil) + raise 'MySet only accepts iterables or nothing on initialization!' unless + iterable.nil? || iterable.kind_of?(Array) || iterable.kind_of?(String) + + @data = {} + + unless iterable.nil? + items = iterable.kind_of?(String) ? iterable.split('') : iterable + + items.each { |el| @data[el] = true } + end + end + + # return number of elements in MySet + def size + entries.length + end + + # add an item to MySet as is + # return the MySet instance + def add(item) + @data[item] = true + self + end + + # delete an item from MySet + # return true if successful otherwise false + def delete(item) + !!@data.delete(item) + end + + # return true if in MySet, otherwise false + def has(item) + !!@data[item] + end + + # return data as an array + def entries + @data.keys + end +end + +if __FILE__ == $PROGRAM_NAME + mySet = MySet.new + puts "'empty', #{mySet.data}" + puts "'size', #{mySet.size}" + puts "'entries', #{mySet.entries}" + + mySet = MySet.new([1, 2, 1, 3]) + puts "'with array [1, 2, 1, 3]', #{mySet.data}" + puts "'size', #{mySet.size}" + puts "'entries', #{mySet.entries}" + + mySet = MySet.new('hello') + puts "'with string hello', #{mySet.data}" + puts "'size', #{mySet.size}" + puts "'entries',#{mySet.entries}" + + puts '' + puts 'ADD STUFF' + puts mySet.add('adding') + print mySet.data + puts + puts mySet.add(5) + print mySet.data + puts + + puts '' + puts 'HAS STUFF' + puts mySet.has('adding') + puts mySet.has(10000) + + puts '' + puts 'DELETE STUFF' + puts mySet.delete('adding') + puts mySet.delete(10000) +end diff --git a/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/.gitignore b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/README.md b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/README.md new file mode 100644 index 00000000..271cd566 --- /dev/null +++ b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/README.md @@ -0,0 +1,369 @@ +# Days 1-2: Implement a Linked List + +Today we'll be implementing a Linked List, more specifically a singly-linked list, or simple linked list (it goes by several names). A Linked List consists of Nodes, which are connected to one another. It is similar to an Array in that it consists of elements, or Nodes, which are in a specific order. + +![Linked List](./linked_list.png) + +We may choose to use Linked Lists in place of other data structures when we need fast insertion and deletion of data. The Node at the beginning of the list is called the `head`, while the Node at the end is called the `tail`. + +## What Is a Node? + +A Node is an object that has two attributes: `value` and `next`. The `value` stores the data that we might be interested in retrieving, such as an Integer, Array, String, or some other object. The `next` attribute points to the next Node, i.e. its value is the next Node. + +``` +array = [1, 2] +head = new Node(value: 1) +nextNode = new Node(value: 2) +head.next = nextNode +// head -> nextNode +``` + +The very last Node in the Linked List will point to nothing, so its `next` value may be `undefined`, `null`, `nil`, etc. It depends on the language being used and on the implementation of the Node class. + +## How Do We Track the Starting Node of a Linked List? + +It is common to declare another class called LinkedList when using Linked Lists. The LinkedList class stores the `head` Node, aka the start of the list. As long as we know where the list starts, we can always traverse it, which is why this class contains so little data! + +``` +head = new Node(value: 'i am the beginning!') +list = new LinkedList(head) +``` + +> A note on online algorithm challenges: When completing challenges online, such as through LeetCode, you might be provided with only the head Node, rather than a LinkedList class. + +## How Do We Visit Each Node? + +Iterables, like Arrays, provide instance methods that allow us to traverse them, and we can also traverse them using loops and indices. Linked Lists are a little different. Nodes do not have indexes: they just point to the next Node, or to nothing if it's the last node in the list (the `tail`). This means we have to go to the `head` Node, ask it what's next, go there, and repeat! + +Here's an example using people waiting in a queue to get into a club to dance to some sick beats! In order, the queue consists of Janzz, Murray, and Lakshmi. + +``` +You: "Hey Janzz! Who's next?" +Janzz: "Murray" +You: "Hey Murray! Who's next?" +Murray: "Lakshmi" +You: "Hey Lakshmi! Who's next?" +Lakshmi: [awkward silence] +``` + +We're not giving you the code here because we want you to figure out how to traverse a Linked List for yourself later on. We believe in you! + +## Summary + +A LinkedList is a data structure consisting of Nodes. The `head` Node denotes the start of the list. Each Node has two attributes: `value` and `next`. `value` stores the data we might be interested in retrieving, while `next` points to the next Node in the list. The last Node, called the `tail`, in the list points to nothing (e.g. `next` is `null`), and that's how we know it's the end! + +We can use another class called LinkedList to track the `head` of the list. + +## Implement a Linked List + +Please note that in Ruby we'll be using `next_node` instead of `next` as the `Node` attribute. This is to avoid confusing syntax, since next is a reserved keyword in Ruby. It also leads to confusing syntax highlighting as a result. In short, wherever you see `next`, think `next_node` for Ruby. + +### 1. Declare the `Node` Class + +A `Node` has two attributes: `value` and `next`. `value` can store anything, while `next` will either point to the next `Node` or to nothing. + +Provide default values for both `value` and `next` so that a new Node can be instantiated without any arguments. In JS, the default values for both should be `null`, while they should both be `nil` in Ruby. Choose a comparable value if coding in other languages. + +When instantiating a new `Node`, the arguments in order should be: `value`, `next`. + +``` +node = new Node() +node.value +=> null or nil +node.next +=> null or nil + +node = new Node('hi', new Node('bye')) +node.value +=> 'hi' +node.next +=> Instance of Node with value of 'bye' +``` + +### 2. Declare the `LinkedList` Class + +The `LinkedList` class tracks the `head` of the list, so we know where it begins. It should have one attribute: `head`. Provide a default value for `head` of `null` or `nil`, or some other falsy value. + +``` +node = new Node() +list = new LinkedList(node) +list.head +=> Instance of Node + +emptyList = new LinkedList() +list.head +=> null or nil +``` + +### 3. Spend a Few Minutes Playing With Your Linked List + +See if you can recreate the following Arrays as Linked Lists using your classes, where the 0th element denotes the `head` of the list: + +``` +characters = ['Hamtaro', 'Walter White'] +drinks = ['Coffee', 'Manhattan', 'Brandy Sour'] +``` + +You can test this manually like so: + +``` +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +print list.head.value +print list.head.next.value +print list.head.next.next +``` + +### 4. Add `iterate` Method to `LinkedList` + +For now, we'll build part of the `iterate` method but not all of it. The `iterate` method traverses the entire `LinkedList`. To ensure that it's working, we'll print the value of each `Node`. Later we'll remove this functionality and update the method to take a callback. + +Remember, the `head` is the first `Node` in the list, and the next one is stored in its `next` attribute. We can go to each `Node` by visiting all of the `next`s. When `next` is equal to a falsy value, such as `null` or `nil`, we've reached the end of the list. At the end of the iteration, return the `head`. + +``` +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +list.iterate() +=> 'hi again' +=> 'but why?' +=> Node with value 'hi again' +``` + +### 5. Modify the `iterate(callback)` Method to Take a Callback + +Change the `iterate` method, so that it takes a callback (a function) as an argument. + +Replace the print statements in the `iterate` method with a call to the callback. When calling the callback, provide the current Node as an argument to the callback. You can test if this is working by calling `iterate` on the list with a callback that prints the value of each Node. + +Hint: Rubyists might be interested in learning about passing blocks and using `yield`. + +``` +function printNode(node): + print node.value + +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +list.iterate(printNode) +=> 'hi again' +=> 'but why?' +=> Node with value 'hi again' +``` + +### 6. Add `print` method to `LinkedList` + +The `print` method should print each Node value on its own line. Use the `iterate` method in the `print` method. + +``` +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +list.print() +=> 'hi again' +=> 'but why?' +``` + +### 7. Add `find(target)` method to `LinkedList` + +The `find` method searches for a `Node` with the `target` value. If the `Node` is found, it returns that `Node`. Otherwise, it returns a falsy value such as `null` or `nil`. Use the `iterate` method to keep your code short and DRY. + +``` +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +list.find('but why?') +=> Node with value 'but why?' + +list.find('tell me secrets') +=> null or nil, etc. +``` + +### 8. Add `addFirst(node)` method to `LinkedList` + +`addFirst` takes a Node as an argument and adds it as the `head` of the Linked List. No existing Nodes are removed. + +This method adds only 1 Node to the list. + +``` +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +list.addFirst(new Node('I am first now')) +list.print() +=> 'I am first now' +=> 'hi again' +=> 'but why?' +``` + +### 9. Add `addLast(node)` method to `LinkedList` + +`addLast` takes a Node as an argument and adds it at the end of the Linked List (i.e. it will be the tail). No existing Nodes are removed. The `iterate` method can help you here. + +This method adds only 1 Node to the list. + +``` +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +list.addLast(new Node('I am last')) +list.print() +=> 'hi again' +=> 'but why?' +=> 'I am last' +``` + +### 10. Add `removeFirst` method to `LinkedList` + +`removeFirst` removes the first (head) Node in the list and returns the node that was removed. + +Hint: Try not to overthink this. Removing the head takes one line of code. You'll need a little bit more code to handle returning the node that was removed, however. + +``` +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +list.removeFirst() +=> Node with value 'hi again' +list.print() +=> 'but why?' +``` + +### 11. Add `removeLast` method to `LinkedList` + +`removeLast` removes the last (tail) Node in the list and returns the removed Node. + +Hint: The `iterate` method might be helpful here. + +``` +head = new Node('hi again', new Node('but why?')) +list = new LinkedList(head) +list.removeLast() +=> Node with value 'but why?' +list.print() +=> 'hi again' +``` + +### 12. Add `replace(index, node)` to `LinkedList` + +Replace the Node at the given `index` with the given `node`. `replace` should work on all Node indexes. Nodes are zero-indexed. + +Don't worry about handling invalid indexes, such as -1 or those that go beyond the size of the list. + +Return the inserted Node. + +Hint: The `iterate` method might be helpful here. You may wish to modify it by adding the ability to count, or you can declare the count within `replace` and update it in the callback passed to `iterate`. Or you can create an `iterate_with_count` method and use that (and that method can call the `iterate` method). So many options! + +``` +head = new Node('one', new Node('two', new Node('three'))) +list = new LinkedList(head) +list.replace(0, '1') +=> Node with value '1' +// list is now '1' -> 'two' -> 'three' + +list.replace(1, '2') +=> Node with value '2' +// list is now '1' -> '2' -> 'three' + +list.replace(2, '3') +=> Node with value '3' +// list is now '1' -> '2' -> '3' +``` + +### 13. Add `insert(index, node)` to `LinkedList` + +Insert the given `node` at the given `index` in the `LinkedList`. No nodes should be removed or replaced! This method inserts only 1 Node into the list. + +Ensure you can handle all valid `index` values: 0 to last index + 1 in list. Don't worry about invalid index values. + +Hint: `iterate` may be helpful once more. + +``` +head = new Node('one', new Node('two', new Node('three'))) +list = new LinkedList(head) +list.insert(1, new Node('inserted at 1')) +// list is now 'one' -> 'inserted at 1' -> 'two' -> 'three' +``` + +``` +head = new Node('one', new Node('two', new Node('three'))) +list = new LinkedList(head) +list.insert(0, new Node('inserted at 0')) +// list is now 'inserted at 0' -> 'one' -> 'two' -> 'three' +``` + +``` +head = new Node('one', new Node('two', new Node('three'))) +list = new LinkedList(head) +list.insert(3, new Node('inserted at 3')) +// list is now 'one' -> 'two' -> 'three' -> 'inserted at 3' +``` + +### 14. Add `remove(index)` to `LinkedList` + +Remove the `Node` at the given `index` and return the removed `Node`. Don't worry about invalid indices, such as -1 or those that go beyond the size of the list. + +Hint: Good ol' `iterate`...again! + +``` +head = new Node('one', new Node('two', new Node('three'))) +list = new LinkedList(head) + +list.remove(1) +=> Node with value 'two' +// list is now 'one' -> 'three' + +list.remove(1) +=> Node with value 'three' +// list is now 'one' + +list.remove(0) +=> Node with value 'one' +// list is empty :( +``` + +### 15. Add `clear` to `LinkedList` + +Clear the Linked List. + +``` +head = new Node('one', new Node('two', new Node('three'))) +list = new LinkedList(head) + +list.clear() +list.print() +// nothing happens because it's empty +list.head +=> null or nil +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, and optionally explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/linked_list.js b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/linked_list.js new file mode 100644 index 00000000..3276629c --- /dev/null +++ b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/linked_list.js @@ -0,0 +1,75 @@ +class LinkedList { + constructor() { + + } + + iterate() { + + } + + // print each node's value on its own line + // use your iterate method to be DRY! Don't get caught in the code rain, brrr. + print() { + + } + + // find the node with the target value and return it + // if not found return null, use your iterate method to be DRY! + find(target) { + + } + + // add the node to the start of the list, no nodes should be removed + addFirst(node) { + + } + + // add node to end of list, no nodes should be removed + // you may wish to use the iterate method + addLast(node) { + + } + + // remove the first Node in the list and update head + // and return the removed node + removeFirst() { + + } + + // remove the tail node, iterate may be helpful + // return the node you just removed + removeLast() { + + } + + // replace the node at the given index with the given node + replace(idx, node) { + + } + + // insert the node at the given index + // no existing nodes should be removed or replaced + insert(idx, node) { + + } + + // remove the node at the given index, and return it + remove(idx) { + + } +} + +class Node { + constructor() { + + } +} + +if (require.main === module) { + // add your own tests in here + +} + +module.exports = { + Node, LinkedList +}; diff --git a/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/package.json b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/package.json new file mode 100644 index 00000000..60d1adf6 --- /dev/null +++ b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "linked_list", + "version": "1.0.0", + "description": "linked list", + "main": "linked_list.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/tests/linked_list.test.js b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/tests/linked_list.test.js new file mode 100644 index 00000000..5e83a4b0 --- /dev/null +++ b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/javascript/tests/linked_list.test.js @@ -0,0 +1,292 @@ +const { Node, LinkedList } = require("../linked_list"); + +describe("Node", () => { + const makeNode = () => new Node("hi", "there"); + const emptyNode = new Node(); + + test("sets an attribute called value to the argument on initialization", () => { + expect(makeNode().value).toBe("hi"); + }); + + test("sets an attribute called next to the argument on initialization", () => { + expect(makeNode().next).toBe("there"); + }); + + test("sets an attribute called value to null on initialization when there is no argument", () => { + expect(emptyNode.value).toBe(null); + }); + + test("sets an attribute called next to null on initialization when there is no argument", () => { + expect(emptyNode.next).toBe(null); + }); +}); + +describe("LinkedList", () => { + const nodeFour = new Node("four"); + const nodeThree = new Node("three", nodeFour); + const nodeTwo = new Node("two", nodeThree); + const nodeOne = new Node("one", nodeTwo); + const justOne = new Node("just one"); + + let emptyList = new LinkedList(); + let oneItemList = new LinkedList(justOne); + let linkedList = new LinkedList(nodeOne); + + const consoleLog = console.log; + const LLValues = ["one", "two", "three", "four"]; + + beforeEach(() => { + console.log = consoleLog; + + const values = ["one", "two", "three", "four", "just one"]; + const nodes = [nodeOne, nodeTwo, nodeThree, nodeFour, justOne]; + + nodes.forEach((node, i) => { + node.value = values[i]; + }); + + emptyList.head = null; + + oneItemList.head = justOne; + justOne.next = null; + + linkedList.head = nodeOne; + nodeOne.next = nodeTwo; + nodeTwo.next = nodeThree; + nodeThree.next = nodeFour; + nodeFour.next = null; + }); + + test("head is null if no argument provided on initialization", () => { + expect(emptyList.head).toBe(null); + }); + + test("head is set to the argument if provided on initialization", () => { + expect(oneItemList.head).toBe(justOne); + }); + + describe("iterate()", () => { + test("iterate() calls the provided callback on every node with the node as an argument to the callback", () => { + const values = []; + linkedList.iterate((node) => values.push(node)); + + expect(values.length).toBe(4); + expect(values[3]).toBe(nodeFour); + }); + + test("iterate() can handle an empty list", () => { + const values = []; + emptyList.iterate((node) => values.push(node)); + + expect(values.length).toBe(0); + }); + + test("iterate() can handle a list with one node", () => { + const values = []; + oneItemList.iterate((node) => values.push(node)); + + expect(values.length).toBe(1); + expect(values[0]).toBe(justOne); + }); + }); + + describe("print()", () => { + let consoleOutput = []; + const mockOutput = output => consoleOutput.push(output); + beforeEach(() => (console.log = mockOutput)); + afterEach(() => (consoleOutput = [])); + + test("prints nothing at all when the list is empty", () => { + emptyList.print(); + + expect(consoleOutput.length).toBe(0); + }); + + test("prints a single line for a list with one node", () => { + oneItemList.print(); + + expect(consoleOutput[0]).toBe(justOne.value); + }); + + test("prints all nodes", () => { + linkedList.print(); + + expect(consoleOutput).toEqual(LLValues); + }); + }); + + describe("find()", () => { + test("returns null when the list is empty", () => { + expect(emptyList.find(4)).toBe(null); + }); + + test("returns the correct Node when a Node with that value is in the list", () => { + expect(linkedList.find("two")).toBe(nodeTwo); + }); + + test("returns null when the value is not in the list", () => { + expect(linkedList.find("nope")).toBe(null); + }); + }); + + describe("addFirst()", () => { + test("adds the given Node to the beginning of the list without removing any", () => { + const newNode = new Node("I'm new"); + oneItemList.addFirst(newNode); + + expect(oneItemList.head).toBe(newNode); + expect(oneItemList.head.next).toBe(justOne); + }); + + test("adds the given node to an empty list", () => { + const newNode = new Node("I'm new"); + emptyList.addFirst(newNode); + + expect(emptyList.head).toBe(newNode); + expect(emptyList.head.next).toBe(null); + }); + }); + + describe("addLast()", () => { + test("adds the given Node to the end of the list without removing any", () => { + const newNode = new Node("I'm new"); + oneItemList.addLast(newNode); + + expect(oneItemList.head).toBe(justOne); + expect(oneItemList.head.next).toBe(newNode); + }); + + test("adds the given node to an empty list", () => { + const newNode = new Node("I'm new"); + emptyList.addLast(newNode); + + expect(emptyList.head).toBe(newNode); + expect(emptyList.head.next).toBe(null); + }); + }); + + describe("removeFirst()", () => { + test("removes and returns the head of the list", () => { + expect(linkedList.removeFirst()).toBe(nodeOne); + }); + + test("updates the head to the correct Node", () => { + linkedList.removeFirst(); + + expect(linkedList.head).toBe(nodeTwo); + expect(linkedList.head.next).toBe(nodeThree); + }); + + test("does not produce an error when called on an empty list", () => { + expect(() => emptyList.removeFirst()).not.toThrow(Error); + }); + }); + + describe("removeLast()", () => { + test("removes and returns the tail of the list", () => { + expect(linkedList.removeLast()).toBe(nodeFour); + expect(linkedList.head.next.next.next).toBe(null); + }); + + test("makes the node before the old tail the new tail", () => { + linkedList.removeLast(); + + expect(linkedList.head.next.next).toBe(nodeThree); + }); + + test("does not produce an error when called on an empty list", () => { + expect(() => emptyList.removeLast()).not.toThrow(Error); + }); + }); + + describe("replace()", () => { + test("returns the inserted node", () => { + const newNode = new Node("replacing"); + + expect(linkedList.replace(0, newNode)).toBe(newNode); + }); + + test("replaces the correct nodes at the correct indexes", () => { + const zero = new Node("replace at 0"); + const one = new Node("replace at 1"); + const two = new Node("replace at 2"); + const three = new Node("replace at 3"); + + [zero, one, two, three].forEach((node, i) => { linkedList.replace(i, node) }); + + expect(linkedList.head).toBe(zero); + expect(linkedList.head.next).toBe(one); + expect(linkedList.head.next.next).toBe(two); + expect(linkedList.head.next.next.next).toBe(three); + expect(linkedList.head.next.next.next.next).toBe(null); + }); + }); + + describe("insert()", () => { + test("can insert a node at the beginning of the list", () => { + const newNode = new Node("hi"); + oneItemList.insert(0, newNode); + + expect(oneItemList.head).toBe(newNode); + expect(oneItemList.head.next).toBe(justOne); + expect(oneItemList.head.next.next).toBe(null); + }); + + test("can insert a node at the very end of the list (making a new tail)", () => { + const newNode = new Node("hi"); + oneItemList.insert(1, newNode); + + expect(oneItemList.head).toBe(justOne); + expect(oneItemList.head.next).toBe(newNode); + expect(oneItemList.head.next.next).toBe(null); + }); + + test("can insert a node in the middle of a list", () => { + const newNode = new Node("hi"); + linkedList.insert(2, newNode); + + expect(linkedList.head.next).toBe(nodeTwo); + expect(linkedList.head.next.next).toBe(newNode); + expect(linkedList.head.next.next.next).toBe(nodeThree); + }); + }); + + describe("remove()", () => { + let consoleOutput = []; + const mockOutput = output => consoleOutput.push(output); + beforeEach(() => (console.log = mockOutput)); + afterEach(() => (consoleOutput = [])); + + test("returns the removed node", () => { + expect(linkedList.remove(3)).toBe(nodeFour); + }); + + test("removes the correct node", () => { + const removed = linkedList.remove(1); + let found = false; + + linkedList.iterate(node => { + if (node === removed) { + founds = true; + } + }); + + expect(found).toBe(false); + }); + + test("keeps the list intact when a node is removed", () => { + linkedList.remove(2); + linkedList.print(); + + expect(consoleOutput).toEqual(['one', 'two', 'four']); + }); + }); + + describe("clear()", () => { + test("empties the list", () => { + linkedList.clear(); + + expect(linkedList.head).toBe(null); + }); + }); +}); diff --git a/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/linked_list.png b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/linked_list.png new file mode 100644 index 0000000000000000000000000000000000000000..0c241dc52ea4f8f8e099e87f77bdcd97d984a85f GIT binary patch literal 4035 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 Ly+xHd{PzC< "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/solutions/linked_list.js b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/solutions/linked_list.js new file mode 100644 index 00000000..b806aecf --- /dev/null +++ b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/solutions/linked_list.js @@ -0,0 +1,320 @@ +class LinkedList { + constructor(head = null) { + this.head = head; + } + + iterate(callback) { + let count = 0; + let temp = this.head; + + while (temp !== null) { + const result = callback(temp, count); + + if (result === true) { + return temp; + } + + ++count; + temp = temp.next; + } + + return this.head; + } + + // print each node's value on its own line + // use your iterate method to be DRY! Don't get caught in the code rain, brrr. + print() { + this.iterate(node => console.log(node.value)); + } + + // find the node with the target value and return it + // if not found return null, use your iterate method to be DRY! + find(target) { + let result = null; + + this.iterate(node => { + if (node.value === target) { + result = node; + + return true; + } + }); + + return result; + } + + // add the node to the start of the list, no nodes should be removed + addFirst(node) { + node.next = this.head; + this.head = node; + } + + // add node to end of list, no nodes should be removed + // you may wish to use the iterate method + addLast(node) { + if (this.head === null) { + this.head = node; + return; + } + + this.iterate(currNode => { + if (currNode.next === null) { + currNode.next = node; + return true; + } + }); + } + + // remove the first Node in the list and update head + // and return the removed node + removeFirst() { + const oldHead = this.head; + + if (this.head !== null) { + this.head = this.head.next; + } + + return oldHead; + } + + // remove the tail node, iterate may be helpful + // return the node you just removed + removeLast() { + if (this.head === null || this.head.next === null) { + return this.removeFirst(); + } + + let oldTail = null; + + this.iterate(node => { + if (node.next.next === null) { + oldTail = node.next; + node.next = null; + return true; + } + }); + + return oldTail; + } + + // replace the node at the given index with the given node + replace(idx, node) { + if (idx === 0) { + this.removeFirst(); + this.addFirst(node); + return node; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + node.next = currNode.next.next; + currNode.next = node; + + return true; + } + }); + + return node; + } + + // insert the node at the given index + // no existing nodes should be removed or replaced + insert(idx, node) { + if (idx === 0) { + this.addFirst(node); + return; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + const oldNext = currNode.next; + currNode.next = node; + node.next = oldNext; + + return true; + } + }); + } + + // remove the node at the given index, and return it + remove(idx) { + if (idx === 0) { + return this.removeFirst(); + } + + let oldNode = null; + + this.iterate((node, count) => { + if (count === idx - 1) { + oldNode = node.next; + node.next = node.next.next; + + return true; + } + }); + + return oldNode; + } + + clear() { + this.head = null; + } +} + +class Node { + constructor(value = null, next = null) { + this.value = value; + this.next = next; + } +} + +if (require.main === module) { + let head = new Node('one', new Node('two', new Node('three', new Node('four')))); + let list = new LinkedList(head); + let emptyList = new LinkedList(); + let oneItemList = new LinkedList(new Node('just one')); + + console.log("Print one to four"); + list.print(); + console.log("-----------------------------"); + + console.log("Handle empty list print"); + emptyList.print(); + console.log("-----------------------------"); + + console.log("Handle one item list print"); + oneItemList.print(); + console.log("-----------------------------"); + + console.log(`Find four`); + console.log(`${list.find('four').value}`); + console.log(`Find non-existent value`); + console.log(`Nothing: ${list.find(50)}`); + console.log(`Find in empty list: ${emptyList.find(20)}`); + console.log(`Find just one in one item list: ${oneItemList.find('just one').value}`); + console.log(`Find nothing in one item list: ${oneItemList.find('nothing')}`); + console.log("-----------------------------"); + + console.log("Add zero as head"); + list.addFirst(new Node('zero')); + list.print(); + console.log("-----------------------------"); + + console.log("Add zero as head to empty list"); + emptyList.addFirst(new Node('zero')); + emptyList.print(); + emptyList.head = null; + console.log("-----------------------------"); + + console.log("Add zero as head to one item list"); + oneItemList.addFirst(new Node('zero')); + oneItemList.print(); + oneItemList.head = oneItemList.head.next; + console.log("-----------------------------"); + + console.log("Add five as tail"); + list.addLast(new Node('five')); + list.print(); + console.log("-----------------------------"); + + console.log("Add whaaa as tail to empty list"); + emptyList.addLast(new Node('whaaa')); + emptyList.print(); + emptyList.head = null; + console.log("-----------------------------"); + + console.log("Add whaaa as tail to one item list"); + oneItemList.addLast(new Node('whaaa')); + oneItemList.print(); + oneItemList.head.next = null; + console.log("-----------------------------"); + + console.log("Remove first node zero and return it"); + console.log(`${list.removeFirst().value} was removed`); + list.print(); + console.log("-----------------------------"); + + console.log("Remove first node from an empty list"); + console.log(`${emptyList.removeFirst()} was removed`); + emptyList.print(); + console.log("-----------------------------"); + + console.log("Remove first node from one item list"); + console.log(`${oneItemList.removeFirst().value} was removed`); + oneItemList.print(); + oneItemList.head = new Node('just one'); + console.log("-----------------------------"); + + console.log("Remove last node five and return it"); + console.log(`${list.removeLast().value} was removed`); + list.print(); + console.log("-----------------------------"); + + console.log("Remove last node from empty list and return it"); + console.log(`${emptyList.removeLast()} was removed`); + emptyList.print(); + console.log("-----------------------------"); + + console.log("Remove last node from one item list and return it"); + console.log(`${oneItemList.removeLast().value} was removed`); + oneItemList.print(); + oneItemList.head = new Node('just one'); + console.log("-----------------------------"); + + console.log("Replace node at index and return inserted node"); + console.log(`replace middle two with 2: ${list.replace(1, new Node('2')).value}`); + list.print(); + console.log(`replace zeroth one with 1: ${list.replace(0, new Node('1')).value}`); + list.print(); + console.log(`replace tail four with 4: ${list.replace(3, new Node('4')).value}`); + list.print(); + console.log(`replace middle three with 3: ${list.replace(2, new Node('3')).value}`); + list.print(); + console.log("-----------------------------"); + + console.log("Insert node at index"); + console.log("Insert at 0"); + list.insert(0, new Node('zero')); + list.print(); + list.removeFirst(); + + console.log("Insert at 2"); + list.insert(2, new Node('two')); + list.print(); + + console.log("Insert at 4"); + list.insert(4, new Node('four')); + list.print(); + + console.log("Insert at 6"); + list.insert(6, new Node('six')); + list.print(); + list.removeLast(); + + console.log("Insert at 0 in empty list"); + emptyList.insert(0, new Node('zero')); + emptyList.print(); + emptyList.removeFirst(); + console.log("-----------------------------"); + + head = new Node('one', new Node('two', new Node('three', new Node('four')))); + list = new LinkedList(head); + + console.log("Remove the node at the index and return it"); + console.log(`Remove two: ${list.remove(1).value}`); + console.log(`Remove tail four: ${list.remove(2).value}`); + console.log(`Remove three: ${list.remove(1).value}`); + console.log(`Remove one: ${list.remove(0).value}`); + list.print(); + console.log("-----------------------------"); + + console.log("Clear a list"); + head = new Node('one', new Node('two', new Node('three', new Node('four')))); + list = new LinkedList(head); + list.clear(); + list.print(); +} + +module.exports = { + Node, LinkedList +}; diff --git a/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/solutions/linked_list.rb b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/solutions/linked_list.rb new file mode 100644 index 00000000..52562c12 --- /dev/null +++ b/07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list/solutions/linked_list.rb @@ -0,0 +1,245 @@ +class LinkedList + attr_accessor :head + + def initialize(head = nil) + @head = head + end + + def iterate + count = 0 + temp = @head + + until temp.nil? + yield(temp, count) + temp = temp.next_node + count += 1 + end + + @head + end + + def print + iterate { |node| puts node.value } + end + + def find(target) + iterate do |node| + return node if node.value == target + end + + nil + end + + def add_first(node) + node.next_node = @head + @head = node + end + + def add_last(node) + if @head.nil? + @head = node + return + end + + iterate do |curr_node| + if curr_node.next_node.nil? + curr_node.next_node = node + return + end + end + end + + def remove_first + old_head = @head + @head = @head.next_node unless @head.nil? + old_head + end + + def remove_last + return remove_first if @head.nil? || @head.next_node.nil? + + iterate do |node| + if node.next_node.next_node.nil? + old_tail = node.next_node + node.next_node = nil + return old_tail + end + end + end + + def replace(idx, node) + if idx.zero? + remove_first + add_first(node) + return node + end + + iterate do |curr_node, count| + if count == idx - 1 + node.next_node = curr_node.next_node.next_node + curr_node.next_node = node + return node + end + end + end + + def insert(idx, node) + if idx.zero? + add_first(node) + return + end + + iterate do |curr_node, count| + if count == idx - 1 + old_next = curr_node.next_node + curr_node.next_node = node + node.next_node = old_next + return + end + end + end + + def remove(idx) + if idx.zero? + return remove_first + end + + iterate do |node, count| + if count == idx - 1 + old_node = node.next_node + node.next_node = node.next_node.next_node + return old_node + end + end + end + + def clear + @head = nil + end +end + +class Node + attr_accessor :value, :next_node + + def initialize(value = nil, next_node = nil) + @value = value + @next_node = next_node + end +end + +if __FILE__ == $PROGRAM_NAME + head = Node.new('one', Node.new('two', Node.new('three', Node.new('four')))) + list = LinkedList.new(head) + empty_list = LinkedList.new + + puts "Print one to four" + list.print + puts "-----------------------------" + + puts "Print empty list" + empty_list.print + puts "-----------------------------" + + puts "Find four" + puts "#{list.find('four').value}" + puts "Find non-existent value" + puts "Nothing: #{list.find(50)}" + puts "-----------------------------" + + puts "Find four in empty list" + puts "#{empty_list.find('four')}" + puts "-----------------------------" + + puts "Add zero as head" + list.add_first(Node.new('zero')) + list.print + puts "-----------------------------" + + puts "Add zero as head to empty list" + empty_list.add_first(Node.new('zero')) + empty_list.print + empty_list.head = nil + puts "-----------------------------" + + puts "Add five as tail" + list.add_last(Node.new('five')) + list.print + puts "-----------------------------" + + puts "Add five as tail to empty list" + empty_list.add_last(Node.new('five')) + empty_list.print + empty_list.head = nil + puts "-----------------------------" + + puts "Remove first node zero and return it" + puts "#{list.remove_first.value} was removed" + list.print + puts "-----------------------------" + + puts "Remove first node from an empty list" + puts "#{empty_list.remove_first} was removed" + empty_list.print + puts "-----------------------------" + + puts "Remove last node five and return it" + puts "#{list.remove_last.value} was removed" + list.print + puts "-----------------------------" + + puts "Remove last node from empty list and return it" + puts "#{empty_list.remove_last} was removed" + empty_list.print + puts "-----------------------------" + + puts "Replace node at index and return inserted node" + puts "replace middle two with 2: #{list.replace(1, Node.new('2')).value}" + list.print + puts "replace zeroth one with 1: #{list.replace(0, Node.new('1')).value}" + list.print + puts "replace tail four with 4: #{list.replace(3, Node.new('4')).value}" + list.print + puts "replace middle three with 3: #{list.replace(2, Node.new('3')).value}" + list.print + puts "-----------------------------" + + puts "Insert node at index" + puts "Insert at 0" + list.insert(0, Node.new('zero')) + list.print + list.remove_first + + puts "Insert at 2" + list.insert(2, Node.new('two')) + list.print + + puts "Insert at 4" + list.insert(4, Node.new('four')) + list.print + + puts "Insert at 6" + list.insert(6, Node.new('six')) + list.print + list.remove_last + puts "-----------------------------" + + head = Node.new('one', Node.new('two', Node.new('three', Node.new('four')))) + list = LinkedList.new(head) + + puts "Remove the node at the index and return it" + puts "Remove two: #{list.remove(1).value}" + puts "Remove tail four: #{list.remove(2).value}" + puts "Remove three: #{list.remove(1).value}" + puts "Remove one: #{list.remove(0).value}" + list.print + puts "-----------------------------" + + puts "Clear a list" + head = Node.new('one', Node.new('two', Node.new('three', Node.new('four')))) + list = LinkedList.new(head) + list.clear + list.print +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/07-week-6--foundational-data-structures/01-day-3--underneath-arrays/README.md b/07-week-6--foundational-data-structures/01-day-3--underneath-arrays/README.md new file mode 100644 index 00000000..9db4a41e --- /dev/null +++ b/07-week-6--foundational-data-structures/01-day-3--underneath-arrays/README.md @@ -0,0 +1,98 @@ +# Arrays + +## Introduction + +While you may be familiar with arrays, chances are you have not considered what happens when our computer either manipulates an array by adding or removing elements, or retrieves information from an array. In this lesson, we'll consider what happens when we retrieve or manipulate data in an array. + +## Arrays - under the hood + +When we initialize an array in a programming language, the language +allocates space in memory for your array, and then points that starting variable to that address in memory. Then the program assigns a fixed amount of memory for each element. + +![](https://s3.amazonaws.com/learn-verified/objects-tenElementArray.gif) + +So let's say my array say starts at memory address 100. And assume that the programming language allocates 8 bits for each element in the array. And that it allocates enough space for ten elements evenly spaced in memory. + +Now, let's try to think through how a computer program retrieves an element at a specific index. + +```javascript +let my_arr = ["a"]; + +my_arr[0] = "a"; +``` + +Well, we first initialize the array and assign the letter 'a' as the first element, the programming language associates the letter "a" to a specific space in memory. In our example, address 100. So then, when we call `my_arr[0]` all the program has to do is go to address 100, and retrieve the element. + +So now, what do you think happens if we call `my_arr[3]`, to return what is in that slot. If the `my_arr` begins at address 100, and we allocate eight bits of space for each, what address does the program go to to retrieve the element at index 3? + +Is there a formula that we can come up with for retrieval? Yes, it's algebra. + +```javascript +my_arr[3] + +100 + 3*8 = 124 +``` + +![](https://s3-us-west-2.amazonaws.com/curriculum-content/web-development/algorithms/mailboxes.jpg) + +So our programming language knows that if eight bits are allocated to each element, and then to retrieve an element at a specific index, the program simply visits an address by using the following formula: + +- memoryLocationOfElement = arrayStartAddress + indexNumber \* bit_allocation + +### Manipulating array elements + +Now that we talked about retrieving elements from an array, let's talk about removing elements from an array. + +```javascript +let arr = [1, 24, 48, 9]; +arr.pop; +// 9 + +arr; +// [1, 24, 48] +``` + +Performing an operation like pop is fairly simple. Again let's assume that our array begins at memory address 100. + +| memory address | 100 | 108 | 116 | 124 | +| -------------- | :-: | --: | --: | --: | +| arr | 1 | 24 | 48 | 9 | +| arr.pop | 1 | 24 | 48 | X | + +So removing from the end of the array, is not so bad. But removing an element from the beginning involves a lot more. + +| memory address | 100 | 108 | 116 | 124 | +| -------------- | :-: | --: | --: | --: | +| arr | 1 | 24 | 48 | 9 | +| arr.shift | 24 | 48 | 9 | X | + +Looking at the chart above, shifting involves moving every remaining element to a new space in memory. The cost is equal to the number of elements in the array. So the time complexity of shifting is big O(n). Note that to add elements to the beginning of the array also will cost big O(n) as every subsequent element would have to move to different spot in memory. + +| memory address | 100 | 108 | 116 | 124 | 132 | +| -------------- | :-: | --: | --: | --: | --: | +| arr | 1 | 24 | 48 | 9 | | +| arr.unshift(5) | 5 | 1 | 24 | 48 | 9 | + +So unshifting is big O(n) and shifting is big O(n). However, popping and finding elements take the same amount of time regardless the size of the array. That is, the time complexity is big O(1), meaning that the cost of the operation does not depend on the number of elements in the array. + +### A second problem: too many elements + +Remember that to retrieve information from an array, we simply need to apply the formula `startingAddress + index * bitAllocation` and go to the corresponding address. Well, one problem that occurs with having all of these contiguous elements, is that we must allocate a specific amount of space, say enough space for 10 elements. And now we have to think about what occurs when we want to add eleven elements? + +| memory address | 100 | 108 | 116 | 124 | 132 | 140 | +| -------------- | :-: | --: | --: | --: | --: | -------: | +| arr | 1 | 24 | 48 | 9 | 32 | song.mp3 | +| arr.push(5) | 1 | 24 | 48 | 9 | 32 | song.mp3 | + +Do you see our problem? We want to push another element, but something else is on those eight bits. If we move our new element to a different location, our formula for retrieving elements no longer works. Instead what we do, is copy our array into a new location in memory where there is enough space. However, notice that the cost of doing this is big O(n) as we must incur a cost for each element we copy over. + +| new memory address with wide open space | 300 | 308 | 316 | 324 | 332 | 340 | +| --------------------------------------- | :-: | --: | --: | --: | --: | --: | +| arr | 1 | 24 | 48 | 9 | 32 | | +| arr.push(5) | 1 | 24 | 48 | 9 | 32 | 5 | + +### Summary + +We saw in this section that some of the strengths and weaknesses of using an array. Retrieving elements by index and adding elements to the end of the array has a time complexity of big O(1), while adding or removing elements at the beginning of an array is big O(n). We also saw that because operations in our array rely on using neighboring locations in memory, we can run out of space. + +But do not despair, there is alternative data structure that does not rely on elements having contiguous memory addresses and is less costly for adding and removing elements from the beginning. That is a linked list. We will learn about it in the next section. diff --git a/07-week-6--foundational-data-structures/02-day-4--underneath-hashes/README.md b/07-week-6--foundational-data-structures/02-day-4--underneath-hashes/README.md new file mode 100644 index 00000000..75524218 --- /dev/null +++ b/07-week-6--foundational-data-structures/02-day-4--underneath-hashes/README.md @@ -0,0 +1,104 @@ +# Hash Table + +## Objectives + +- Learn the components of a hash table. +- Learn about collisions and how to resolve them. +- Learn the role of a hash function and the attributes of a good hash function. + +## Hash Tables + +![](https://s3.amazonaws.com/learn-verified/reintroduce-415x400.png) + +Now it's time to formally introduce you to the hash. A hash table is where information related to a key is assigned to a specific index. + +For a hash to work, we use a **hash function** to determine where exactly to store a information related to that key. Later, use the same hash function to determine where to search for a given key. + +## A library as an analogy + +One way to think about how hashes relate to hash functions is thinking about how we find a book in a library. We do this by telling a librarian the title and author of a book, and the librarian tells us precisely where to find the book. + +![](https://s3-us-west-2.amazonaws.com/curriculum-content/algorithms/dewey-decimal-arrangement.jpg) + +So here our key is the title and author of the book, which then responds with a card catalogue id. The cart catalogue id (which comes from the Dewey Decimal System above) tells us exactly where to find the book. If the book is there, we have our book and all of the information inside. If nothing is there, there is no book. + +So let's start with inserting some books. We have the following books: _The Bible_, _Alexander Hamilton_, _Introduction to Physics_, and _War and Peace_. Based on our hash function, we store the books in the following locations: + +| Index | Book | +| ----- | :-----------------------: | +| 000 | | +| 100 | | +| 200 | _The Bible_ | +| 300 | | +| 400 | | +| 500 | _Introduction to Physics_ | +| 600 | | +| 700 | | +| 800 | _War and Peace_ | +| 900 | _Alexander Hamilton_ | + +You will see that while the Dewey Decimal System assigns us one of a range of numbers, we adapt its formula to store each book at the lowest number possible for each section. So based on that, The Bible is assigned 200, because it falls under religion. Accordingly, we also assign Introduction to Physics number 500, War and Peace 800 and Alexander Hamilton 900. + +Because we assigned each of our books according to this formula, when we retrieve a book, we do not need to look through every index to find our books, instead we just look at the place of the book based on the Dewey Decimal System. + +![](https://s3.amazonaws.com/learn-verified/geroge-peabody-library-horizontal-large-gallery.jpg) + +> A massive library + +So we use our formula to tell us both where to insert a book. + +And we also use our formula to know if a book exists in our collection. If someone asks us if _Eloquent Javascript_ is in our hash table, we simply visit our index at location 600, see that nothing is there, and can confidently reply that the book is not located there. Because our formula tells us where to retrieve a book we are able to retrieve and insert an element in constant time. + +So with a hash table, we look at the data in our key, run it through our hash function to determine where to place the element and associated data. Later, we also use the information in the key, run it through our hash function to tell us where to retrieve this data. With this process we achieve our goal of constant time for inserting and retrieving elements irrespective of the number of elements in our collection. + +### The Problem: Collision + +Our hash table currently looks like the following: + +| Index | Book | +| ----- | :-----------------------: | +| 000 | | +| 100 | | +| 200 | _The Bible_ | +| 300 | | +| 400 | | +| 500 | _Introduction to Physics_ | +| 600 | | +| 700 | | +| 800 | _War and Peace_ | +| 900 | _Alexander Hamilton_ | + +Now what happens if we need to store another book, this time _Introduction to Biology_. Well, our adapted Dewey Decimal System tells us to store the key at precisely index 500. The only problem is that the slot is already filled. We have just encountered a **collision**. A collision is where our hash function outputs an index that already is assigned to another key in our hash table. + +To handle our collision we apply a technique called _separate chaining_. With separate chaining, each index points to a linked list. So in our example above we could place both _Introduction to Physics_ and _Introduction to Biology_ in the place linked list is located at index 500. Applying the separate chaining technique, our hash table looks like the following: + +| Index | Book | +| ----- | :----------------------------------------------------------: | +| 000 | | +| 100 | | +| 200 | [ "*The Bible*" ] | +| 300 | | +| 400 | | +| 500 | [ "*Introduction to Physics*", "*Introduction to Biology*" ] | +| 600 | | +| 700 | | +| 800 | [ "*War and Peace*" ] | +| 900 | [ "*Alexander Hamilton*" ] | + +Note that in the worse case scenario, all of our inserted elements collide and we have to traverse a linked list of length n to retrieve an element, so we have O(n). However, on average collisions do not occur, so we retrieve constant time for lookup, insertion and deletion _on average_. + +## Choosing a good hash function + +Going forward, we should choose a hash function that minimizes the chance of a collision occurring. Some properties of a good hash function. + +1. Makes use of all information provided by a given key to maximize the number of possible hash values. Note that the real Dewey Decimal System does a better job at this: different titles by different authors map to different values. +2. Maps similar keys to very different values - making collisions much less likely. +3. Also hash function called frequently so should employ simple and quick introductions. + +## Summary + +In this function we learned about hash tables. Hash tables place the value of an element into a hash function which outputs a hash value. The hash value determines where to place the element. Because a hash function produces the same hash value for a given element, it also gives us fast lookup time to retrieve an element. + +When a hash function outputs the same hash value for two different elements we have a collision. We can resolve a collision by employing separate chaining where each hash value points to a linked list, and when there is a collision we attach the element to the linked list. + +Because retrieving elements from a linked list is O(n), we try to choose a hash function that avoids collisions. Because we must use our hash function to insert, delete, and retrieve elements we also choose a fast hash function. diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/.gitignore b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/README.md b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/README.md new file mode 100644 index 00000000..08a76fbc --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/README.md @@ -0,0 +1,51 @@ +# Bonus Algorithm: Recursive Reverse a String + +For this task, you'll need to reverse a string...**recursively**! Your method will receive one argument, a string, and be expected to output that string with its letters in reverse order. + +``` +Input: "hi" +Output: "ih" + +Input: "catbaby" +Output: "ybabtac" +``` + +**Do not call any type of built-in reverse method!** + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/package.json b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/package.json new file mode 100644 index 00000000..df161685 --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "reverse_string", + "version": "1.0.0", + "description": "reverse a string", + "main": "reverse_string.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} \ No newline at end of file diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/reverse_string.js b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/reverse_string.js new file mode 100644 index 00000000..e82e621c --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/reverse_string.js @@ -0,0 +1,19 @@ +function reverseString(str) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: 'ih'"); + console.log("=>", reverseString('ih')); + + console.log(""); + + console.log("Expecting: 'ybabtac'"); + console.log("=>", reverseString('catbaby')); +} + +module.exports = reverseString; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/tests/reverse_string.test.js b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/tests/reverse_string.test.js new file mode 100644 index 00000000..9b2e65cd --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/javascript/tests/reverse_string.test.js @@ -0,0 +1,21 @@ +const reverseString = require('../reverse_string'); + +test("can handle an empty string", () => { + expect(reverseString("")).toBe(""); +}); + +test("can handle a single character", () => { + expect(reverseString("a")).toBe("a"); +}); + +test("can handle two characters", () => { + expect(reverseString("ab")).toBe("ba"); +}); + +test("can handle three characters", () => { + expect(reverseString("cat")).toBe("tac"); +}); + +test("can handle many characters", () => { + expect(reverseString("sham-meow")).toBe("sham-meow".split("").reverse().join("")); +}); diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/.rspec b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/Gemfile b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/reverse_string.rb b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/reverse_string.rb new file mode 100644 index 00000000..99487efc --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/reverse_string.rb @@ -0,0 +1,18 @@ +def reverse_string(str) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: 'ih'" + puts "=>", reverse_string('hi') + + puts + + puts "Expecting: 'ybabtac'" + puts "=>", reverse_string('catbaby') + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution \ No newline at end of file diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/spec/reverse_string_spec.rb b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/spec/reverse_string_spec.rb new file mode 100644 index 00000000..f906e168 --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/spec/reverse_string_spec.rb @@ -0,0 +1,23 @@ +require './reverse_string' + +RSpec.describe '#reverse_string' do + it "can handle an empty string" do + expect(reverse_string('')).to eq('') + end + + it "can handle a single character" do + expect(reverse_string('a')).to eq('a') + end + + it "can handle two characters" do + expect(reverse_string('ab')).to eq('ba') + end + + it "can handle three characters" do + expect(reverse_string('cat')).to eq('tac') + end + + it "can handle many characters" do + expect(reverse_string('sham-meow')).to eq('sham-meow'.reverse) + end +end \ No newline at end of file diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/spec/spec_helper.rb b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/solutions/reverse_string.js b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/solutions/reverse_string.js new file mode 100644 index 00000000..011924df --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/solutions/reverse_string.js @@ -0,0 +1,48 @@ +function reverseString(str) { + if (str.length < 2) { + return str; + } + + return reverseString(str.slice(1)) + str[0]; +} + +console.log("Expecting: 'ih'"); +console.log(reverseString('hi')); + +console.log(""); + +console.log("Expecting: 'ybabtac'"); +console.log(reverseString('catbaby')); + +console.log(""); + +console.log("Expecting: 'a'"); +console.log(reverseString('a')); + +console.log(""); + +console.log("Expecting: '' (empty string)"); +console.log(reverseString('')); + +// Please add your pseudocode to this file +/******************************************************************************************* + * return string if length == 1 or is empty + * + * return reverse_string(string - 0th char) + 0th char + * *****************************************************************************************/ + + +// And a written explanation of your solution +/******************************************************************************************* + * First I thought about the base case: if the string is empty or just one character, + * we can return it as is. Next, I thought about if the string were 2 characters. In + * that case, I need to return str[1] + str[0] for it to be reversed. Since recursion + * is depth-first, i.e. it goes as deep as possible before it starts returning up the + * stack, that means the algorithm won't start returning until it hits the last character + * in the string. Let's pretend the string is 'hi'. On the first frame we recurse with 'i' + * as the argument. This hits the base case, so 'i' returns. In the previous frame, the + * 0th character is 'h', so I just need to put the 'h' after the 'i' that's returned from + * the recursive call: reverse_string('i') + 'h'. This holds true for strings of any length + * because as each frame returns up the stack, the 0th character in each previous frame is + * the character that comes right before the one that was returned. + * *******************************************************************************************/ diff --git a/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/solutions/reverse_string.rb b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/solutions/reverse_string.rb new file mode 100644 index 00000000..3121a7fb --- /dev/null +++ b/07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse/solutions/reverse_string.rb @@ -0,0 +1,43 @@ +def reverse_string(str) + return str if str.length < 2 + + reverse_string(str[1..-1]) + str[0] +end + +puts "Expecting: 'ih'" +puts reverse_string('hi') + +puts + +puts "Expecting: 'ybabtac'" +puts reverse_string('catbaby') + +puts + +puts "Expecting: '' (empty string)" +puts reverse_string('') + +puts + +puts "Expecting: 'a'" +puts reverse_string('a') + +############################################################################ +# return string if length == 1 or is empty +# +# return reverse_string(string - 0th char) + 0th char +############################################################################ + +############################################################################ +# First I thought about the base case: if the string is empty or just one character, +# we can return it as is. Next, I thought about if the string were 2 characters. In +# that case, I need to return str[1] + str[0] for it to be reversed. Since recursion +# is depth-first, i.e. it goes as deep as possible before it starts returning up the +# stack, that means the algorithm won't start returning until it hits the last character +# in the string. Let's pretend the string is 'hi'. On the first frame we recurse with 'i' +# as the argument. This hits the base case, so 'i' returns. In the previous frame, the +# 0th character is 'h', so I just need to put the 'h' after the 'i' that's returned from +# the recursive call: reverse_string('i') + 'h'. This holds true for strings of any length +# because as each frame returns up the stack, the 0th character in each previous frame is +# the character that comes right before the one that was returned. +############################################################################ \ No newline at end of file diff --git a/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/.gitignore b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/README.md b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/README.md new file mode 100644 index 00000000..b7308785 --- /dev/null +++ b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/README.md @@ -0,0 +1,119 @@ +# Bonus: Modify the Linked List to Track Tail and Size + +Today we'll be modifying the Linked List we created earlier to track its `tail` and `size`. You can use your solution or ours as starter code. We've included ours in the starter files if you wish to use it. + +Note that this is a pretty strange implementation of a Linked List and there are those who would say: "Ermahgerd! What have you done?!" We're trying to stretch our skills here: that's what we've done! + +![Linked List](./linked_list.png) + +## Refresher in Case You Forgot About Our Old List Friend + +A Linked List is a data structure consisting of Nodes. The `head` Node denotes the start of the list. Each Node has two attributes: `value` and `next`. `value` stores the data we might be interested in retrieving, while `next` points to the next Node in the list. The last Node, called the `tail`, in the list points to nothing (e.g. `next` is `null`), and that's how we know it's the end! + +We can use another class called `LinkedList` to track the `head` of the list. + +## Modify the `LinkedList` Class + +We'll be tracking the `tail` and `size` of the list. There are a number of ways to implement these features with varying time complexities. Create helper methods if needed. Make sure you can explain to yourself and others why you chose the approach you took. + +For any method, such as adding or removing a Node, assume that only valid inputs will be provided, such as valid indices. + +Also make the following assumptions: + +- Upon initialization of a new list, a user might provide a Node that is already connected to other Nodes, i.e. the `head` Node being provided has a `next` attribute that points to another Node, and that Node might point to another Node. +- Any time a Node is added via any other method, such as `add_first` or `insert`, that Node is not yet connected to any other Nodes, i.e. its `next` value is `null` or `nil` or some other falsy value. + +As you modify the class, think about what the time complexity is for any methods you add or modify. + +We've included all of the original tests in the test suites to ensure all of the methods continue to work as expected as you modify them. + +### 1. Track the `tail` + +Add an attribute to `LinkedList` called `tail`. When an empty list is initialized, `tail` should be a falsy value, such as `null` or `nil`. As Nodes are added and removed, the `tail` should be updated to reflect the current `tail`. Think about which methods in the class may affect the `tail` of the list. + +``` +list = new LinkedList +list.tail +=> null or nil + +node = new Node('it meee') +list.add_first(node) +list.tail +=> Node with value 'it meee' + +list.remove_first +=> Node with value 'it meee' +list.tail +=> null or nil + +another_list = new LinkedList(node) +another_list.tail +=> Node with value 'it meee' +``` + +### 2. Track the `size` + +Add an attribute to `LinkedList` called `size`. When an empty list is initialized, `size` should be `0`. As Nodes are added and removed, the `size` should be updated to reflect the current `size`. Think about which methods in the class may affect the `size` of the list. + +``` +list = new LinkedList +list.size +=> 0 + +node = new Node('it meee') +list.add_first(node) +list.size +=> 1 + +list.remove_first +=> Node with value 'it meee' +list.size +=> 0 + +list.add_first(node) +list.add_first(new Node('it not meee')) +list.size +=> 2 +``` + +### 3. Super Bonus Refactor + +Once you can track the `tail` and `size` successfully, go through the `LinkedList` methods and see if you can refactor any to be more time-efficient. + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, and explain your solution, and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/linked_list.js b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/linked_list.js new file mode 100644 index 00000000..358ff327 --- /dev/null +++ b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/linked_list.js @@ -0,0 +1,181 @@ +class LinkedList { + constructor(head = null) { + this.head = head; + } + + iterate(callback) { + let count = 0; + let temp = this.head; + + while (temp !== null) { + const result = callback(temp, count); + + if (result === true) { + return temp; + } + + ++count; + temp = temp.next; + } + + return this.head; + } + + // print each node's value on its own line + // use your iterate method to be DRY! Don't get caught in the code rain, brrr. + print() { + this.iterate(node => console.log(node.value)); + } + + // find the node with the target value and return it + // if not found return null, use your iterate method to be DRY! + find(target) { + let result = null; + + this.iterate(node => { + if (node.value === target) { + result = node; + + return true; + } + }); + + return result; + } + + // add the node to the start of the list, no nodes should be removed + addFirst(node) { + node.next = this.head; + this.head = node; + } + + // add node to end of list, no nodes should be removed + // you may wish to use the iterate method + addLast(node) { + if (this.head === null) { + this.head = node; + return; + } + + this.iterate(currNode => { + if (currNode.next === null) { + currNode.next = node; + return true; + } + }); + } + + // remove the first Node in the list and update head + // and return the removed node + removeFirst() { + const oldHead = this.head; + + if (this.head !== null) { + this.head = this.head.next; + } + + return oldHead; + } + + // remove the tail node, iterate may be helpful + // return the node you just removed + removeLast() { + if (this.head === null || this.head.next === null) { + return this.removeFirst(); + } + + let oldTail = null; + + this.iterate(node => { + if (node.next.next === null) { + oldTail = node.next; + node.next = null; + return true; + } + }); + + return oldTail; + } + + // replace the node at the given index with the given node + replace(idx, node) { + if (idx === 0) { + this.removeFirst(); + this.addFirst(node); + return node; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + node.next = currNode.next.next; + currNode.next = node; + + return true; + } + }); + + return node; + } + + // insert the node at the given index + // no existing nodes should be removed or replaced + insert(idx, node) { + if (idx === 0) { + this.addFirst(node); + return; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + const oldNext = currNode.next; + currNode.next = node; + node.next = oldNext; + + return true; + } + }); + } + + // remove the node at the given index, and return it + remove(idx) { + if (idx === 0) { + return this.removeFirst(); + } + + let oldNode = null; + + this.iterate((node, count) => { + if (count === idx - 1) { + oldNode = node.next; + node.next = node.next.next; + + return true; + } + }); + + return oldNode; + } + + clear() { + this.head = null; + } +} + +class Node { + constructor(value = null, next = null) { + this.value = value; + this.next = next; + } +} + +if (require.main === module) { + let head = new Node('one', new Node('two', new Node('three', new Node('four')))); + let list = new LinkedList(head); + let emptyList = new LinkedList(); + let oneItemList = new LinkedList(new Node('just one')); + +} + +module.exports = { + Node, LinkedList +}; diff --git a/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/package.json b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/package.json new file mode 100644 index 00000000..60d1adf6 --- /dev/null +++ b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "linked_list", + "version": "1.0.0", + "description": "linked list", + "main": "linked_list.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/tests/linked_list.test.js b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/tests/linked_list.test.js new file mode 100644 index 00000000..c88f5522 --- /dev/null +++ b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/javascript/tests/linked_list.test.js @@ -0,0 +1,430 @@ +const { Node, LinkedList } = require("../linked_list"); + +describe("Node", () => { + const makeNode = () => new Node("hi", "there"); + const emptyNode = new Node(); + + test("sets an attribute called value to the argument on initialization", () => { + expect(makeNode().value).toBe("hi"); + }); + + test("sets an attribute called next to the argument on initialization", () => { + expect(makeNode().next).toBe("there"); + }); + + test("sets an attribute called value to null on initialization when there is no argument", () => { + expect(emptyNode.value).toBe(null); + }); + + test("sets an attribute called next to null on initialization when there is no argument", () => { + expect(emptyNode.next).toBe(null); + }); +}); + +describe("LinkedList", () => { + const nodeFour = new Node("four"); + const nodeThree = new Node("three", nodeFour); + const nodeTwo = new Node("two", nodeThree); + const nodeOne = new Node("one", nodeTwo); + const justOne = new Node("just one"); + + let emptyList = new LinkedList(); + let oneItemList = new LinkedList(justOne); + let linkedList = new LinkedList(nodeOne); + + const consoleLog = console.log; + const LLValues = ["one", "two", "three", "four"]; + + beforeEach(() => { + console.log = consoleLog; + + const values = ["one", "two", "three", "four", "just one"]; + const nodes = [nodeOne, nodeTwo, nodeThree, nodeFour, justOne]; + + nodes.forEach((node, i) => { + node.value = values[i]; + }); + + emptyList = new LinkedList(); + + justOne.next = null; + oneItemList = new LinkedList(justOne); + + nodeOne.next = nodeTwo; + nodeTwo.next = nodeThree; + nodeThree.next = nodeFour; + nodeFour.next = null; + linkedList = new LinkedList(nodeOne); + }); + + test("head is null if no argument provided on initialization", () => { + expect(emptyList.head).toBe(null); + }); + + test("head is set to the argument if provided on initialization", () => { + expect(oneItemList.head).toBe(justOne); + }); + + describe("iterate()", () => { + test("iterate() calls the provided callback on every node with the node as an argument to the callback", () => { + const values = []; + linkedList.iterate((node) => values.push(node)); + + expect(values.length).toBe(4); + expect(values[3]).toBe(nodeFour); + }); + + test("iterate() can handle an empty list", () => { + const values = []; + emptyList.iterate((node) => values.push(node)); + + expect(values.length).toBe(0); + }); + + test("iterate() can handle a list with one node", () => { + const values = []; + oneItemList.iterate((node) => values.push(node)); + + expect(values.length).toBe(1); + expect(values[0]).toBe(justOne); + }); + }); + + describe("print()", () => { + let consoleOutput = []; + const mockOutput = output => consoleOutput.push(output); + beforeEach(() => (console.log = mockOutput)); + afterEach(() => (consoleOutput = [])); + + test("prints nothing at all when the list is empty", () => { + emptyList.print(); + + expect(consoleOutput.length).toBe(0); + }); + + test("prints a single line for a list with one node", () => { + oneItemList.print(); + + expect(consoleOutput[0]).toBe(justOne.value); + }); + + test("prints all nodes", () => { + linkedList.print(); + + expect(consoleOutput).toEqual(LLValues); + }); + }); + + describe("find()", () => { + test("returns null when the list is empty", () => { + expect(emptyList.find(4)).toBe(null); + }); + + test("returns the correct Node when a Node with that value is in the list", () => { + expect(linkedList.find("two")).toBe(nodeTwo); + }); + + test("returns null when the value is not in the list", () => { + expect(linkedList.find("nope")).toBe(null); + }); + }); + + describe("addFirst()", () => { + test("adds the given Node to the beginning of the list without removing any", () => { + const newNode = new Node("I'm new"); + oneItemList.addFirst(newNode); + + expect(oneItemList.head).toBe(newNode); + expect(oneItemList.head.next).toBe(justOne); + }); + + test("adds the given node to an empty list", () => { + const newNode = new Node("I'm new"); + emptyList.addFirst(newNode); + + expect(emptyList.head).toBe(newNode); + expect(emptyList.head.next).toBe(null); + }); + }); + + describe("addLast()", () => { + test("adds the given Node to the end of the list without removing any", () => { + const newNode = new Node("I'm new"); + oneItemList.addLast(newNode); + + expect(oneItemList.head).toBe(justOne); + expect(oneItemList.head.next).toBe(newNode); + }); + + test("adds the given node to an empty list", () => { + const newNode = new Node("I'm new"); + emptyList.addLast(newNode); + + expect(emptyList.head).toBe(newNode); + expect(emptyList.head.next).toBe(null); + }); + }); + + describe("removeFirst()", () => { + test("removes and returns the head of the list", () => { + expect(linkedList.removeFirst()).toBe(nodeOne); + }); + + test("updates the head to the correct Node", () => { + linkedList.removeFirst(); + + expect(linkedList.head).toBe(nodeTwo); + expect(linkedList.head.next).toBe(nodeThree); + }); + + test("does not produce an error when called on an empty list", () => { + expect(() => emptyList.removeFirst()).not.toThrow(Error); + }); + }); + + describe("removeLast()", () => { + test("removes and returns the tail of the list", () => { + expect(linkedList.removeLast()).toBe(nodeFour); + expect(linkedList.head.next.next.next).toBe(null); + }); + + test("makes the node before the old tail the new tail", () => { + linkedList.removeLast(); + + expect(linkedList.head.next.next).toBe(nodeThree); + }); + + test("does not produce an error when called on an empty list", () => { + expect(() => emptyList.removeLast()).not.toThrow(Error); + }); + }); + + describe("replace()", () => { + test("returns the inserted node", () => { + const newNode = new Node("replacing"); + + expect(linkedList.replace(0, newNode)).toBe(newNode); + }); + + test("replaces the correct nodes at the correct indexes", () => { + const zero = new Node("replace at 0"); + const one = new Node("replace at 1"); + const two = new Node("replace at 2"); + const three = new Node("replace at 3"); + + [zero, one, two, three].forEach((node, i) => { linkedList.replace(i, node) }); + + expect(linkedList.head).toBe(zero); + expect(linkedList.head.next).toBe(one); + expect(linkedList.head.next.next).toBe(two); + expect(linkedList.head.next.next.next).toBe(three); + expect(linkedList.head.next.next.next.next).toBe(null); + }); + }); + + describe("insert()", () => { + test("can insert a node at the beginning of the list", () => { + const newNode = new Node("hi"); + oneItemList.insert(0, newNode); + + expect(oneItemList.head).toBe(newNode); + expect(oneItemList.head.next).toBe(justOne); + expect(oneItemList.head.next.next).toBe(null); + }); + + test("can insert a node at the very end of the list (making a new tail)", () => { + const newNode = new Node("hi"); + oneItemList.insert(1, newNode); + + expect(oneItemList.head).toBe(justOne); + expect(oneItemList.head.next).toBe(newNode); + expect(oneItemList.head.next.next).toBe(null); + }); + + test("can insert a node in the middle of a list", () => { + const newNode = new Node("hi"); + linkedList.insert(2, newNode); + + expect(linkedList.head.next).toBe(nodeTwo); + expect(linkedList.head.next.next).toBe(newNode); + expect(linkedList.head.next.next.next).toBe(nodeThree); + }); + }); + + describe("remove()", () => { + let consoleOutput = []; + const mockOutput = output => consoleOutput.push(output); + beforeEach(() => (console.log = mockOutput)); + afterEach(() => (consoleOutput = [])); + + test("returns the removed node", () => { + expect(linkedList.remove(3)).toBe(nodeFour); + }); + + test("removes the correct node", () => { + const removed = linkedList.remove(1); + let found = false; + + linkedList.iterate(node => { + if (node === removed) { + founds = true; + } + }); + + expect(found).toBe(false); + }); + + test("keeps the list intact when a node is removed", () => { + linkedList.remove(2); + linkedList.print(); + + expect(consoleOutput).toEqual(['one', 'two', 'four']); + }); + }); + + describe("clear()", () => { + test("empties the list", () => { + linkedList.clear(); + + expect(linkedList.head).toBe(null); + }); + }); + + describe("tail", () => { + test("is null for an empty list", () => { + expect(emptyList.tail).toBe(null); + }); + + test("is a Node when a Node is provided on list initialization", () => { + expect(oneItemList.tail).toBe(oneItemList.head); + }); + + test("is the last Node when a Node connected to other Nodes is provided on initialization", () => { + expect(linkedList.tail.value).toBe("four"); + }); + + test("is the correct Node when #addFirst is called on a list", () => { + [emptyList, oneItemList, linkedList].forEach(l => l.addFirst(new Node('testing'))); + + expect(emptyList.tail.value).toBe("testing"); + expect(oneItemList.tail.value).toBe("just one"); + expect(linkedList.tail.value).toBe("four"); + }); + + test("is the correct Node when #addLast is called on a list", () => { + [emptyList, oneItemList, linkedList].forEach(l => l.addLast(new Node('testing'))); + + expect(emptyList.tail.value).toBe("testing"); + expect(oneItemList.tail.value).toBe("testing"); + expect(linkedList.tail.value).toBe("testing"); + }); + + test("is the correct Node when #removeFirst is called on a list", () => { + [emptyList, oneItemList, linkedList].forEach(l => l.removeFirst()); + + expect(emptyList.tail).toBe(null); + expect(oneItemList.tail).toBe(null); + expect(linkedList.tail.value).toBe("four"); + }); + + test("is the correct Node when #removeLast is called on a list", () => { + [emptyList, oneItemList, linkedList].forEach(l => l.removeLast()); + + expect(emptyList.tail).toBe(null); + expect(oneItemList.tail).toBe(null); + expect(linkedList.tail.value).toBe("three"); + }); + + test("is the correct Node when #replace is called on a list", () => { + linkedList.replace(3, new Node('should be me')); + linkedList.replace(1, new Node('hi')); + + expect(linkedList.tail.value).toBe("should be me"); + }); + + test("is the correct Node when #insert is called on a list", () => { + linkedList.insert(3, new Node('should not be me')); + linkedList.insert(5, new Node('should be me')); + linkedList.insert(1, new Node('hi')); + + expect(linkedList.tail.value).toBe("should be me"); + }); + + test("is the correct Node when #remove is called", () => { + linkedList.remove(0); + expect(linkedList.tail.value).toBe("four"); + + linkedList.remove(1); + expect(linkedList.tail.value).toBe("four"); + + linkedList.remove(1); + expect(linkedList.tail.value).toBe("two"); + }); + }); + + describe("size", () => { + test("should be 0 when a new empty list is initialized", () => { + expect(emptyList.size).toBe(0); + }); + + test("should be the corrrect value when a new list is initialized with Node/s", () => { + expect(oneItemList.size).toBe(1); + expect(linkedList.size).toBe(4); + }); + + test("increases when a Node is added first or last", () => { + emptyList.addFirst(new Node('hi')); + emptyList.addLast(new Node("bye")); + emptyList.addFirst(new Node("stuff")); + + expect(emptyList.size).toBe(3); + }); + + test("decreases when a Node is removed from the head or tail", () => { + linkedList.removeFirst(); + linkedList.removeLast(); + linkedList.removeLast(); + + expect(linkedList.size).toBe(1); + }); + + test("does not go below 0", () => { + oneItemList.removeLast(); + oneItemList.removeLast(); + oneItemList.removeFirst(); + oneItemList.removeFirst(); + + expect(oneItemList.size).toBe(0); + }); + + test("increases when a Node is inserted", () => { + oneItemList.insert(0, new Node("hi")); + oneItemList.insert(1, new Node("hi")); + + expect(oneItemList.size).toBe(3); + }); + + test("decreases when a Node is removed at an index", () => { + linkedList.remove(0); + linkedList.remove(2); + + expect(linkedList.size).toBe(2); + }); + + test("does not go below 0 when a Node is removed at an index", () => { + linkedList.remove(0); + linkedList.remove(0); + linkedList.remove(0); + linkedList.remove(0); + linkedList.remove(0); + + expect(linkedList.size).toBe(0); + }); + + test("is set to 0 when a list is cleared", () => { + linkedList.clear(); + + expect(linkedList.size).toBe(0); + }); + }); +}); diff --git a/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/linked_list.png b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/linked_list.png new file mode 100644 index 0000000000000000000000000000000000000000..0c241dc52ea4f8f8e099e87f77bdcd97d984a85f GIT binary patch literal 4035 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 Ly+xHd{PzC< "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/solutions/linked_list.js b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/solutions/linked_list.js new file mode 100644 index 00000000..59de2232 --- /dev/null +++ b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/solutions/linked_list.js @@ -0,0 +1,366 @@ +class LinkedList { + constructor(head = null) { + this.head = head; + this.tail = null; + this.size = 0; + // worst case O(n) for setting tail on initializing new list + this.setTailAndSize(); + } + + // helper method for setting tail when list goes from empty to not empty + // upon initialization + // will be O(n) because user could add Node connected to other Nodes + setTailAndSize() { + this.size = 0; + + this.iterate((node) => { + this.tail = node; + this.updateSize('+'); + }); + } + + // helper method for updating size + updateSize(operation) { + operation === '+' ? ++this.size : --this.size; + } + + iterate(callback) { + let count = 0; + let temp = this.head; + + while (temp !== null) { + const result = callback(temp, count); + + if (result === true) { + return temp; + } + + ++count; + temp = temp.next; + } + + return this.head; + } + + // print each node's value on its own line + // use your iterate method to be DRY! Don't get caught in the code rain, brrr. + print() { + this.iterate(node => console.log(node.value)); + } + + // find the node with the target value and return it + // if not found return null, use your iterate method to be DRY! + find(target) { + let result = null; + + this.iterate(node => { + if (node.value === target) { + result = node; + + return true; + } + }); + + return result; + } + + // add the node to the start of the list, no nodes should be removed + addFirst(node) { + // O(1) operation: the tail will only be set if the list is empty + if (this.head === null) { + this.tail = node; + } + + node.next = this.head; + this.head = node; + + // increase size: O(1) + this.updateSize('+'); + } + + // add node to end of list, no nodes should be removed + // you may wish to use the iterate method + addLast(node) { + if (this.head === null) { + this.addFirst(node); + return; + } + + this.tail.next = node; + // O(1) operation to set tail + this.tail = node; + // increase size: O(1) + this.updateSize('+'); + + // if (this.head === null) { + // this.head = node; + // } + + // this.iterate(currNode => { + // if (currNode.next === null) { + // currNode.next = node; + // return true; + // } + // }); + } + + // remove the first Node in the list and update head + // and return the removed node + removeFirst() { + const oldHead = this.head; + + if (this.head !== null) { + this.head = this.head.next; + this.updateSize('-'); + } + + // if list goes from 1 Node to empty, update tail O(1) + if (this.head === null) { + this.tail = null; + } + + return oldHead; + } + + // remove the tail node, iterate may be helpful + // return the node you just removed + removeLast() { + if (this.head === null || this.head.next === null) { + return this.removeFirst(); + } + + let oldTail = null; + + this.iterate(node => { + if (node.next.next === null) { + oldTail = node.next; + node.next = null; + return true; + } + }); + + // Could also set the tail inside iterate above + // O(n) operation + this.setTailAndSize(); + + return oldTail; + } + + // replace the node at the given index with the given node + replace(idx, node) { + if (idx === 0) { + this.removeFirst(); + this.addFirst(node); + return node; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + node.next = currNode.next.next; + currNode.next = node; + + // If tail is being replaced O(1) + if (node.next === null) { + this.tail = node; + } + + return true; + } + }); + + return node; + } + + // insert the node at the given index + // no existing nodes should be removed or replaced + insert(idx, node) { + if (idx === 0) { + this.addFirst(node); + return; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + const oldNext = currNode.next; + currNode.next = node; + node.next = oldNext; + + // if new node is inserted at the very end, O(1) + if (oldNext === null) { + this.tail = node; + } + + return true; + } + }); + + this.updateSize('+'); + } + + // remove the node at the given index, and return it + remove(idx) { + if (idx === 0) { + return this.removeFirst(); + } + + let oldNode = null; + + this.iterate((node, count) => { + if (count === idx - 1) { + oldNode = node.next; + node.next = node.next.next; + // if tail was removed, update tail + if (node.next === null) { + this.tail = node; + } + + return true; + } + }); + + this.updateSize('-'); + + return oldNode; + } + + clear() { + this.head = null; + // null tail for empty list + this.tail = null; + this.size = 0; + } +} + +class Node { + constructor(value = null, next = null) { + this.value = value; + this.next = next; + } +} + +if (require.main === module) { + let head = new Node('one', new Node('two', new Node('three', new Node('four')))); + let list = new LinkedList(head); + let emptyList = new LinkedList(); + let oneItemList = new LinkedList(new Node('just one')); + + console.log("CHECK FOR CORRECT TAIL ON INIT"); + console.log(`Should be 'four': ${list.tail.value}`); + console.log(`Should be 'null': ${emptyList.tail}`); + console.log(`Should be 'just one': ${oneItemList.tail.value}`); + console.log("---------------------------------------------------"); + + console.log("CHECK FOR CORRECT TAIL ON ADD FIRST"); + list.addFirst(new Node('beans')); + emptyList.addFirst(new Node('beans')); + oneItemList.addFirst(new Node('beans')); + console.log(`Should be 'four': ${list.tail.value}`); + console.log(`Should be 'beans': ${emptyList.tail.value}`); + console.log(`Should be 'just one': ${oneItemList.tail.value}`); + [list, emptyList, oneItemList].forEach(l => l.removeFirst()); + console.log("---------------------------------------------------"); + + console.log("CHECK FOR CORRECT TAIL ON ADD LAST"); + list.addLast(new Node('beans')); + emptyList.addLast(new Node('beans')); + oneItemList.addLast(new Node('beans')); + console.log(`Should be 'beans': ${list.tail.value}`); + console.log(`Should be 'beans': ${emptyList.tail.value}`); + console.log(`Should be 'beans': ${oneItemList.tail.value}`); + [list, emptyList, oneItemList].forEach(l => { + l.removeLast(); + l.setTailAndSize(); + }); + console.log("---------------------------------------------------"); + + console.log("CHECK FOR CORRECT TAIL ON REMOVE FIRST"); + let removed = list.removeFirst(); + let removedAgain = oneItemList.removeFirst(); + emptyList.removeFirst(); + console.log(`Should be 'four': ${list.tail.value}`); + console.log(`Should be 'null': ${emptyList.tail}`); + console.log(`Should be 'null': ${oneItemList.tail}`); + list.addFirst(removed); + oneItemList.addFirst(removedAgain); + console.log("---------------------------------------------------"); + + console.log("CHECK FOR CORRECT TAIL ON REMOVE LAST"); + removed = list.removeLast(); + removedAgain = oneItemList.removeLast(); + emptyList.removeLast(); + console.log(`Should be 'three': ${list.tail.value}`); + console.log(`Should be 'null': ${emptyList.tail}`); + console.log(`Should be 'null': ${oneItemList.tail}`); + list.addLast(removed); + oneItemList.addLast(removedAgain); + console.log("---------------------------------------------------"); + + console.log("CHECK FOR CORRECT TAIL ON REPLACE"); + let nodeTwo = new Node('two'); + let nodeOne = new Node('one', nodeTwo); + let replaceList = new LinkedList(nodeOne); + + replaceList.replace(0, new Node('hi')); + console.log(`Should be two: ${replaceList.tail.value}`); + replaceList.replace(1, new Node('bye')); + console.log(`Should be bye: ${replaceList.tail.value}`); + console.log("---------------------------------------------------"); + + console.log("CHECK FOR CORRECT TAIL ON INSERT"); + nodeTwo = new Node('two'); + nodeOne = new Node('one', nodeTwo); + insertList = new LinkedList(nodeOne); + + insertList.insert(0, new Node('hi')); + // hi -> one -> two + console.log(`Should be two: ${insertList.tail.value}`); + insertList.insert(1, new Node('bye')); + // hi -> bye -> one -> two + console.log(`Should be two: ${insertList.tail.value}`); + insertList.insert(4, new Node('last')); + // hi -> bye -> one -> two -> last + console.log(`Should be last: ${insertList.tail.value}`); + console.log("---------------------------------------------------"); + + console.log("CHECK FOR CORRECT TAIL ON REMOVE"); + // one -> two -> three -> four + list.remove(1); + // one -> three -> four + console.log(`Should be four: ${list.tail.value}`); + list.remove(2); + // one -> three + console.log(`Should be three: ${list.tail.value}`); + list.insert(1, new Node('two')); + list.addLast(new Node('four')); + console.log("---------------------------------------------------"); + + console.log("CHECK FOR CORRECT TAIL ON CLEAR"); + list.clear(); + console.log(`Should be null: ${list.tail}`); + head = new Node('one', new Node('two', new Node('three', new Node('four')))); + list = new LinkedList(head); + console.log("---------------------------------------------------"); + + console.log("CHECKING SIZE"); + console.log(`New empty list should be 0: ${new LinkedList().size}`); + console.log(`New list with one Node should be 1: ${new LinkedList(new Node('hi')).size}`); + console.log(`New list with 3 nodes should be 3: ${new LinkedList(new Node('hi', new Node('bye', new Node('what')))).size}`); + list.addFirst(new Node('s')); + console.log(`On addFirst should be 5: ${list.size}`); + list.addLast(new Node('b')); + console.log(`On addLast should be 6: ${list.size}`); + list.removeFirst(); + console.log(`On removeFirst should be 5: ${list.size}`); + list.removeLast(); + console.log(`On removeLast should be 4: ${list.size}`); + list.insert(1, new Node('stuff')); + console.log(`On insert should be 5: ${list.size}`); + list.remove(1); + console.log(`On remove should be 4: ${list.size}`); + list.clear(); + console.log(`On clear should be 0: ${list.size}`); +} + +module.exports = { + Node, LinkedList +}; diff --git a/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/solutions/linked_list.rb b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/solutions/linked_list.rb new file mode 100644 index 00000000..c31e0276 --- /dev/null +++ b/07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size/solutions/linked_list.rb @@ -0,0 +1,309 @@ +class LinkedList + attr_accessor :head + attr_reader :size, :tail + + def initialize(head = nil) + @head = head + @tail = head + @size = 0 + + set_size_and_tail + end + + def set_size_and_tail + @size = 0 + + iterate do |node| + @tail = node + update_size('+') + end + end + + def update_size(operation) + operation === '+' ? @size += 1 : @size -= 1 + end + + def iterate + count = 0 + temp = @head + + until temp.nil? + yield(temp, count) + temp = temp.next_node + count += 1 + end + + @head + end + + def print + iterate { |node| puts node.value } + end + + def find(target) + iterate do |node| + return node if node.value == target + end + + nil + end + + def add_first(node) + if @head.nil? + @tail = node + end + + node.next_node = @head + @head = node + + update_size('+') + end + + def add_last(node) + if @head.nil? + add_first(node) + return + end + + @tail.next_node = node + @tail = node + update_size('+') + + # if @head.nil? + # @head = node + # end + + # iterate do |curr_node| + # if curr_node.next_node.nil? + # curr_node.next_node = node + # return + # end + # end + end + + def remove_first + old_head = @head + + unless @head.nil? + @head = @head.next_node + update_size('-') + end + + if @head.nil? + @tail = nil + end + + old_head + end + + def remove_last + return remove_first if @head.nil? || @head.next_node.nil? + + update_size('-') + + iterate do |node| + if node.next_node.next_node.nil? + old_tail = node.next_node + node.next_node = nil + @tail = node + return old_tail + end + end + end + + def replace(idx, node) + if idx.zero? + remove_first + add_first(node) + return node + end + + iterate do |curr_node, count| + if count == idx - 1 + node.next_node = curr_node.next_node.next_node + curr_node.next_node = node + + @tail = node if node.next_node.nil? + + return node + end + end + end + + def insert(idx, node) + if idx.zero? + add_first(node) + return + end + + update_size('+') + + iterate do |curr_node, count| + if count == idx - 1 + old_next = curr_node.next_node + curr_node.next_node = node + node.next_node = old_next + + @tail = node if node.next_node.nil? + + return + end + end + end + + def remove(idx) + return remove_first if idx.zero? + + update_size('-') + + iterate do |node, count| + if count == idx - 1 + old_node = node.next_node + node.next_node = node.next_node.next_node + + @tail = node if node.next_node.nil? + + return old_node + end + end + end + + def clear + @head = nil + @tail = nil + @size = 0 + end +end + +class Node + attr_accessor :value, :next_node + + def initialize(value = nil, next_node = nil) + @value = value + @next_node = next_node + end +end + +if __FILE__ == $PROGRAM_NAME + head = Node.new('one', Node.new('two', Node.new('three', Node.new('four')))) + list = LinkedList.new(head) + empty_list = LinkedList.new + one_item_list = LinkedList.new(Node.new('just one')) + + puts("CHECK FOR CORRECT TAIL ON INIT"); + puts("Should be 'four': #{list.tail.value}"); + puts("Should be 'null': #{empty_list.tail}"); + puts("Should be 'just one': #{one_item_list.tail.value}"); + puts("---------------------------------------------------"); + + puts("CHECK FOR CORRECT TAIL ON ADD FIRST"); + list.add_first(Node.new('beans')) + empty_list.add_first(Node.new('beans')) + one_item_list.add_first(Node.new('beans')) + puts("Should be 'four': #{list.tail.value}") + puts("Should be 'beans': #{empty_list.tail.value}") + puts("Should be 'just one': #{one_item_list.tail.value}") + [list, empty_list, one_item_list].each { |l| l.remove_first } + puts("---------------------------------------------------") + + puts("CHECK FOR CORRECT TAIL ON ADD LAST") + list.add_last(Node.new('beans')) + empty_list.add_last(Node.new('beans')) + one_item_list.add_last(Node.new('beans')) + puts("Should be 'beans': #{list.tail.value}") + puts("Should be 'beans': #{empty_list.tail.value}") + puts("Should be 'beans': #{one_item_list.tail.value}") + [list, empty_list, one_item_list].each do |l| + l.remove_last + l.set_size_and_tail + end + puts("---------------------------------------------------") + + puts("CHECK FOR CORRECT TAIL ON REMOVE FIRST") + removed = list.remove_first + removed_again = one_item_list.remove_first + empty_list.remove_first + puts("Should be 'four': #{list.tail.value}") + puts("Should be 'null': #{empty_list.tail}") + puts("Should be 'null': #{one_item_list.tail}") + list.add_first(removed) + one_item_list.add_first(removed_again) + puts("---------------------------------------------------") + + puts("CHECK FOR CORRECT TAIL ON REMOVE LAST") + removed = list.remove_last + removed_again = one_item_list.remove_last + empty_list.remove_last + puts("Should be 'three': #{list.tail.value}") + puts("Should be 'null': #{empty_list.tail}") + puts("Should be 'null': #{one_item_list.tail}") + list.add_last(removed) + one_item_list.add_last(removed_again) + puts("---------------------------------------------------") + + puts("CHECK FOR CORRECT TAIL ON REPLACE") + node_two = Node.new('two') + node_one = Node.new('one', node_two) + replace_list = LinkedList.new(node_one) + + replace_list.replace(0, Node.new('hi')) + puts("Should be two: #{replace_list.tail.value}") + replace_list.replace(1, Node.new('bye')) + puts("Should be bye: #{replace_list.tail.value}") + puts("---------------------------------------------------") + + puts("CHECK FOR CORRECT TAIL ON INSERT") + node_two = Node.new('two') + node_one = Node.new('one', node_two) + insert_list = LinkedList.new(node_one) + + insert_list.insert(0, Node.new('hi')) + # hi -> one -> two + puts("Should be two: #{insert_list.tail.value}") + insert_list.insert(1, Node.new('bye')) + # hi -> bye -> one -> two + puts("Should be two: #{insert_list.tail.value}") + insert_list.insert(4, Node.new('last')) + # hi -> bye -> one -> two -> last + puts("Should be last: #{insert_list.tail.value}") + puts("---------------------------------------------------") + + puts("CHECK FOR CORRECT TAIL ON REMOVE") + # one -> two -> three -> four + list.remove(1) + # one -> three -> four + puts("Should be four: #{list.tail.value}") + list.remove(2) + # one -> three + puts("Should be three: #{list.tail.value}") + list.insert(1, Node.new('two')) + list.add_last(Node.new('four')) + puts("---------------------------------------------------") + + puts("CHECK FOR CORRECT TAIL ON CLEAR") + list.clear + puts("Should be null: #{list.tail}") + head = Node.new('one', Node.new('two', Node.new('three', Node.new('four')))) + list = LinkedList.new(head) + puts("---------------------------------------------------") + + puts("CHECKING SIZE") + puts("New empty list should be 0: #{LinkedList.new.size}") + puts("New list with one Node should be 1: #{LinkedList.new(Node.new('hi')).size}") + puts("New list with 3 nodes should be 3: #{LinkedList.new(Node.new('hi', Node.new('bye', Node.new('what')))).size}") + list.add_first(Node.new('s')) + puts("On addFirst should be 5: #{list.size}") + list.add_last(Node.new('b')) + puts("On addLast should be 6: #{list.size}") + list.remove_first + puts("On removeFirst should be 5: #{list.size}") + list.remove_last + puts("On removeLast should be 4: #{list.size}") + list.insert(1, Node.new('stuff')) + puts("On insert should be 5: #{list.size}") + list.remove(1) + puts("On remove should be 4: #{list.size}") + list.clear + puts("On clear should be 0: #{list.size}") +end + diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/.gitignore b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/README.md b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/README.md new file mode 100644 index 00000000..c0c7adb5 --- /dev/null +++ b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/README.md @@ -0,0 +1,90 @@ +# Bonus: Build a Doubly Linked List + +Today we'll be implementing a Doubly Linked List. A Doubly Linked List is like a singly-linked list, except it has an extra attribute on each Node: a `prev` pointer that points to the previous Node. + +![Linked List](./linked_list.png) + +## Implement a Doubly Linked List + +For this challenge, assume that only one Node is added at a time, including upon initialization of a new list. + +### 1. Modify the `Node` Class + +Each node should have a pointer called `prev` that points to the Node that comes before it. If no Node comes before it, it should be a falsy value, such as `null` in JS or `nil` in Ruby. + +``` +node = new Node('first') +node.prev +=> nil or null + +node.prev = new Node('zeroth') +node.prev +=> Node with value 'zeroth' +``` + +### 2. Modify the `LinkedList` Class + +Look through the methods and determine which need to be modified in order to ensure that a Node's `prev` attribute always points to the correct Node. + +``` +list = new LinkedList +list.add_first(new Node('zeroth')) +list.head +=> Node with value 'zeroth' +list.head.prev +=> nil or null + +list.add_first(new Node('less than zero')) +list.head +=> Node with value 'less than zero' +list.head.next +=> Node with value 'zeroth' +list.head.next.prev +=> Node with value 'less than zero' + +list.remove_first +list.head +=> Node with value 'zeroth' +list.head.prev +=> nil or null +``` + +Use the language of your choosing. We've included code from the original LinkedList implementation. You may also copy and paste your own. + +We've also included the original LinkedList tests, so you can ensure that your code still functions correctly. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/doubly_linked_list.js b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/doubly_linked_list.js new file mode 100644 index 00000000..622ca4c3 --- /dev/null +++ b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/doubly_linked_list.js @@ -0,0 +1,178 @@ +class DoublyLinkedList { + constructor(head = null) { + this.head = head; + } + + iterate(callback) { + let count = 0; + let temp = this.head; + + while (temp !== null) { + const result = callback(temp, count); + + if (result === true) { + return temp; + } + + ++count; + temp = temp.next; + } + + return this.head; + } + + // print each node's value on its own line + // use your iterate method to be DRY! Don't get caught in the code rain, brrr. + print() { + this.iterate(node => console.log(node.value)); + } + + // find the node with the target value and return it + // if not found return null, use your iterate method to be DRY! + find(target) { + let result = null; + + this.iterate(node => { + if (node.value === target) { + result = node; + + return true; + } + }); + + return result; + } + + // add the node to the start of the list, no nodes should be removed + addFirst(node) { + node.next = this.head; + this.head = node; + } + + // add node to end of list, no nodes should be removed + // you may wish to use the iterate method + addLast(node) { + if (this.head === null) { + this.head = node; + return; + } + + this.iterate(currNode => { + if (currNode.next === null) { + currNode.next = node; + return true; + } + }); + } + + // remove the first Node in the list and update head + // and return the removed node + removeFirst() { + const oldHead = this.head; + + if (this.head !== null) { + this.head = this.head.next; + } + + return oldHead; + } + + // remove the tail node, iterate may be helpful + // return the node you just removed + removeLast() { + if (this.head === null || this.head.next === null) { + return this.removeFirst(); + } + + let oldTail = null; + + this.iterate(node => { + if (node.next.next === null) { + oldTail = node.next; + node.next = null; + return true; + } + }); + + return oldTail; + } + + // replace the node at the given index with the given node + replace(idx, node) { + if (idx === 0) { + this.removeFirst(); + this.addFirst(node); + return node; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + node.next = currNode.next.next; + currNode.next = node; + + return true; + } + }); + + return node; + } + + // insert the node at the given index + // no existing nodes should be removed or replaced + insert(idx, node) { + if (idx === 0) { + this.addFirst(node); + return; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + const oldNext = currNode.next; + currNode.next = node; + node.next = oldNext; + + return true; + } + }); + } + + // remove the node at the given index, and return it + remove(idx) { + if (idx === 0) { + return this.removeFirst(); + } + + let oldNode = null; + + this.iterate((node, count) => { + if (count === idx - 1) { + oldNode = node.next; + node.next = node.next.next; + + return true; + } + }); + + return oldNode; + } + + clear() { + this.head = null; + } +} + +class Node { + constructor(value = null, next = null) { + this.value = value; + this.next = next; + } +} + +if (require.main === module) { + // add your own tests in here + +} + +module.exports = { + Node, DoublyLinkedList +}; diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/package.json b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/package.json new file mode 100644 index 00000000..ce623a87 --- /dev/null +++ b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "doubly_linked_list", + "version": "1.0.0", + "description": "doubly linked list", + "main": "doubly_linked_list.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/tests/doubly_linked_list.test.js b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/tests/doubly_linked_list.test.js new file mode 100644 index 00000000..c84bfafc --- /dev/null +++ b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/javascript/tests/doubly_linked_list.test.js @@ -0,0 +1,414 @@ +const { Node, DoublyLinkedList } = require("../doubly_linked_list"); + +describe("Node", () => { + const makeNode = () => new Node("hi", "there"); + const emptyNode = new Node(); + + test("sets an attribute called value to the argument on initialization", () => { + expect(makeNode().value).toBe("hi"); + }); + + test("sets an attribute called next to the argument on initialization", () => { + expect(makeNode().next).toBe("there"); + }); + + test("sets an attribute called value to null on initialization when there is no argument", () => { + expect(emptyNode.value).toBe(null); + }); + + test("sets an attribute called next to null on initialization when there is no argument", () => { + expect(emptyNode.next).toBe(null); + }); +}); + +describe("LinkedList", () => { + const nodeFour = new Node("four"); + const nodeThree = new Node("three", nodeFour); + const nodeTwo = new Node("two", nodeThree); + const nodeOne = new Node("one", nodeTwo); + const justOne = new Node("just one"); + + let emptyList = new DoublyLinkedList(); + let oneItemList = new DoublyLinkedList(justOne); + let linkedList = new DoublyLinkedList(nodeOne); + + const consoleLog = console.log; + const LLValues = ["one", "two", "three", "four"]; + + beforeEach(() => { + console.log = consoleLog; + + const values = ["one", "two", "three", "four", "just one"]; + const nodes = [nodeOne, nodeTwo, nodeThree, nodeFour, justOne]; + + nodes.forEach((node, i) => { + node.value = values[i]; + }); + + emptyList.head = null; + + oneItemList.head = justOne; + justOne.next = null; + + linkedList.head = nodeOne; + nodeOne.next = nodeTwo; + nodeTwo.next = nodeThree; + nodeThree.next = nodeFour; + nodeFour.next = null; + }); + + test("head is null if no argument provided on initialization", () => { + expect(emptyList.head).toBe(null); + }); + + test("head is set to the argument if provided on initialization", () => { + expect(oneItemList.head).toBe(justOne); + }); + + describe("iterate()", () => { + test("iterate() calls the provided callback on every node with the node as an argument to the callback", () => { + const values = []; + linkedList.iterate((node) => values.push(node)); + + expect(values.length).toBe(4); + expect(values[3]).toBe(nodeFour); + }); + + test("iterate() can handle an empty list", () => { + const values = []; + emptyList.iterate((node) => values.push(node)); + + expect(values.length).toBe(0); + }); + + test("iterate() can handle a list with one node", () => { + const values = []; + oneItemList.iterate((node) => values.push(node)); + + expect(values.length).toBe(1); + expect(values[0]).toBe(justOne); + }); + }); + + describe("print()", () => { + let consoleOutput = []; + const mockOutput = output => consoleOutput.push(output); + beforeEach(() => (console.log = mockOutput)); + afterEach(() => (consoleOutput = [])); + + test("prints nothing at all when the list is empty", () => { + emptyList.print(); + + expect(consoleOutput.length).toBe(0); + }); + + test("prints a single line for a list with one node", () => { + oneItemList.print(); + + expect(consoleOutput[0]).toBe(justOne.value); + }); + + test("prints all nodes", () => { + linkedList.print(); + + expect(consoleOutput).toEqual(LLValues); + }); + }); + + describe("find()", () => { + test("returns null when the list is empty", () => { + expect(emptyList.find(4)).toBe(null); + }); + + test("returns the correct Node when a Node with that value is in the list", () => { + expect(linkedList.find("two")).toBe(nodeTwo); + }); + + test("returns null when the value is not in the list", () => { + expect(linkedList.find("nope")).toBe(null); + }); + }); + + describe("addFirst()", () => { + test("adds the given Node to the beginning of the list without removing any", () => { + const newNode = new Node("I'm new"); + oneItemList.addFirst(newNode); + + expect(oneItemList.head).toBe(newNode); + expect(oneItemList.head.next).toBe(justOne); + }); + + test("adds the given node to an empty list", () => { + const newNode = new Node("I'm new"); + emptyList.addFirst(newNode); + + expect(emptyList.head).toBe(newNode); + expect(emptyList.head.next).toBe(null); + }); + }); + + describe("addLast()", () => { + test("adds the given Node to the end of the list without removing any", () => { + const newNode = new Node("I'm new"); + oneItemList.addLast(newNode); + + expect(oneItemList.head).toBe(justOne); + expect(oneItemList.head.next).toBe(newNode); + }); + + test("adds the given node to an empty list", () => { + const newNode = new Node("I'm new"); + emptyList.addLast(newNode); + + expect(emptyList.head).toBe(newNode); + expect(emptyList.head.next).toBe(null); + }); + }); + + describe("removeFirst()", () => { + test("removes and returns the head of the list", () => { + expect(linkedList.removeFirst()).toBe(nodeOne); + }); + + test("updates the head to the correct Node", () => { + linkedList.removeFirst(); + + expect(linkedList.head).toBe(nodeTwo); + expect(linkedList.head.next).toBe(nodeThree); + }); + + test("does not produce an error when called on an empty list", () => { + expect(() => emptyList.removeFirst()).not.toThrow(Error); + }); + }); + + describe("removeLast()", () => { + test("removes and returns the tail of the list", () => { + expect(linkedList.removeLast()).toBe(nodeFour); + expect(linkedList.head.next.next.next).toBe(null); + }); + + test("makes the node before the old tail the new tail", () => { + linkedList.removeLast(); + + expect(linkedList.head.next.next).toBe(nodeThree); + }); + + test("does not produce an error when called on an empty list", () => { + expect(() => emptyList.removeLast()).not.toThrow(Error); + }); + }); + + describe("replace()", () => { + test("returns the inserted node", () => { + const newNode = new Node("replacing"); + + expect(linkedList.replace(0, newNode)).toBe(newNode); + }); + + test("replaces the correct nodes at the correct indexes", () => { + const zero = new Node("replace at 0"); + const one = new Node("replace at 1"); + const two = new Node("replace at 2"); + const three = new Node("replace at 3"); + + [zero, one, two, three].forEach((node, i) => { linkedList.replace(i, node) }); + + expect(linkedList.head).toBe(zero); + expect(linkedList.head.next).toBe(one); + expect(linkedList.head.next.next).toBe(two); + expect(linkedList.head.next.next.next).toBe(three); + expect(linkedList.head.next.next.next.next).toBe(null); + }); + }); + + describe("insert()", () => { + test("can insert a node at the beginning of the list", () => { + const newNode = new Node("hi"); + oneItemList.insert(0, newNode); + + expect(oneItemList.head).toBe(newNode); + expect(oneItemList.head.next).toBe(justOne); + expect(oneItemList.head.next.next).toBe(null); + }); + + test("can insert a node at the very end of the list (making a new tail)", () => { + const newNode = new Node("hi"); + oneItemList.insert(1, newNode); + + expect(oneItemList.head).toBe(justOne); + expect(oneItemList.head.next).toBe(newNode); + expect(oneItemList.head.next.next).toBe(null); + }); + + test("can insert a node in the middle of a list", () => { + const newNode = new Node("hi"); + linkedList.insert(2, newNode); + + expect(linkedList.head.next).toBe(nodeTwo); + expect(linkedList.head.next.next).toBe(newNode); + expect(linkedList.head.next.next.next).toBe(nodeThree); + }); + }); + + describe("remove()", () => { + let consoleOutput = []; + const mockOutput = output => consoleOutput.push(output); + beforeEach(() => (console.log = mockOutput)); + afterEach(() => (consoleOutput = [])); + + test("returns the removed node", () => { + expect(linkedList.remove(3)).toBe(nodeFour); + }); + + test("removes the correct node", () => { + const removed = linkedList.remove(1); + let found = false; + + linkedList.iterate(node => { + if (node === removed) { + founds = true; + } + }); + + expect(found).toBe(false); + }); + + test("keeps the list intact when a node is removed", () => { + linkedList.remove(2); + linkedList.print(); + + expect(consoleOutput).toEqual(['one', 'two', 'four']); + }); + }); + + describe("clear()", () => { + test("empties the list", () => { + linkedList.clear(); + + expect(linkedList.head).toBe(null); + }); + }); +}); + +describe("updating prev properly", () => { + let node = new Node('one'); + let list = new DoublyLinkedList(node); + let head = new Node('one'); + let tail = new Node('two'); + let twoList = new DoublyLinkedList(head); + twoList.addLast(tail); + + beforeEach(() => { + node = new Node('one'); + list = new DoublyLinkedList(node); + head = new Node('one'); + tail = new Node('two'); + twoList = new DoublyLinkedList(head); + twoList.addLast(tail); + }); + + describe("addFirst()", () => { + test("updates the former head's previous node to the node being added", () => { + list.addFirst(new Node('zero')); + + expect(list.head.next).toBe(node); + expect(node.prev.value).toBe('zero'); + }); + }); + + describe("addLast()", () => { + test("updates the former head's previous node to the node being added", () => { + const lastNode = new Node('two'); + list.addLast(lastNode); + + expect(lastNode.prev).toBe(list.head); + }); + }); + + describe("removeFirst()", () => { + test("updates the new head's prev to null", () => { + twoList.removeFirst(); + + expect(twoList.head.prev).toBe(null); + }); + }); + + describe("replace()", () => { + test("head's prev is null when the head is replaced", () => { + twoList.replace(0, new Node('new one')); + + expect(twoList.head.prev).toBe(null); + }); + + test("node after head's prev is new head when the head is replaced", () => { + twoList.replace(0, new Node('new one')); + + expect(twoList.head.next.prev.value).toBe('new one'); + }); + + test("sets the tail's prev when the tail is replaced", () => { + twoList.replace(1, new Node('new one')); + + expect(twoList.head.next.prev.value).toBe('one'); + }); + + test("sets the middle node's prev when it is replaced", () => { + twoList.addFirst(new Node('zero')); + twoList.replace(1, new Node('special')); + + expect(twoList.head.next.prev.value).toBe('zero'); + }); + + test("sets the next node's prev when a node replaced", () => { + twoList.addFirst(new Node('zero')); + twoList.replace(1, new Node('special')); + + expect(twoList.head.next.next.prev.value).toBe('special'); + }); + }); + + describe("insert", () => { + test("sets prev correctly when a node is inserted at index 0", () => { + twoList.insert(0, new Node('zero')); + + expect(twoList.head.prev).toBe(null); + expect(twoList.head.next.prev.value).toBe('zero'); + }); + + test("sets prev correctly when a node is inserted as the new tail", () => { + twoList.insert(2, new Node('tail')); + + expect(twoList.head.next.next.prev.value).toBe('two'); + }); + + test("sets prev correctly when a node is inserted in the middle", () => { + const newNode = new Node('1.5'); + twoList.insert(1, newNode); + + expect(twoList.head.next.prev).toBe(head); + expect(twoList.head.next.next.prev).toBe(newNode); + }); + }); + + describe("remove()", () => { + test("sets the new head's prev to null when removing the original head", () => { + twoList.remove(0); + + expect(twoList.head.prev).toBe(null); + }); + + test("sets the next node's prev correctly when removing a middle node", () => { + twoList.addFirst(new Node('zero')); + twoList.remove(1); + + expect(twoList.head.next.prev.value).toBe('zero'); + }); + + test("leaves prev alone when removing the tail", () => { + twoList.remove(1); + + expect(twoList.head.prev).toBe(null); + }); + }); +}); diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/linked_list.png b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/linked_list.png new file mode 100644 index 0000000000000000000000000000000000000000..fece04392a7bafa0613bfbe70378855e588221cb GIT binary patch literal 30144 zcmZ6yby!s27dJ{tgM@TRcO#)Rh;%F6E#2MSAuu$9v?3tgAV>}{Lr4n}10&Ksfbbr_ zzkBcdJogWV6MOBwYOnQKd+(E|t@(xkml_uZ1%*IGSy2}S1y2^Z9>m4~emx|T2Z4VW z4ssfDC@5dk@$Rjj0Qb*rlyx;wP=eS{P$FVbP;P-o5eO6%UjY=9eM=OSmw6~C6dpxg zI+DN(G;6gtiYSlq>687y9hQ%Z#%ruioToVC;^7x;_9!SmV=9Vr`T;A4#r{Rlh8N;W z&Ac#Gk}$?O60q&Fp6kf!f9Kh~2^>zb9t@D{#kCiVUgWmKBzyfjii7JT8VRd%#`ApE z=DWY&geE67p_&NopXbtl@4oq5yZHY2U9i93u2uTsHT|GT$+m@16yyB17L^?KCReJ_ zbLN1kT^V_7|KB4NLQ(8Io7n$eFo~UfOtHk4qT*)G6M7ua<&7bd$7cM0f5am(9RI(Y ze~;6iqZpC z5L&+31Y;q2`FYEnp*M!m2BGF;{f~AJ)voFw3DXL`%QKlTcDX?NRwoW-N}+Z4z2N-i z*G<1O9-YMWYzZl92L+L(ZD-|^n~Ct)PM){x{G(3FuAj{Ubs!=W5Oc!WSUMf@@OMgr zaY1FxXHhAeT<8k9kIEw+If9H384jC{31LQvSeD?{dQabx;WF0rKtTTT+n4b?kA* zFXK(;YS5k>YLGW#jx$74VtER65WXjwuK>i=vlR6F89f=3$0nF7LaeN~L)P!9{!$0P;}w>3-1q73vh5)3fF#9LycfH*&t zC-wd|6<+3SkC4u19bBc5zC$IzWMqX4LYei$frfNFJlaPgeNJ z=0A3cAirtZ2ONo5QU#6z+lQT=uwI| zLF1GFSwh~M`U2oeS?FE3t-F9FWw#ZlG_zNx?yePU_4b=sm{AAji|N|YDSqy6SjYDK*FY*(P0R9 zL_)+YA3&Nk#sWO0WiyTnlVwv$iqFa^-Nu2oD(X=piw?^f>dL2XJf_m2NZ>K1MZr zfYX7QzJXln>|7(@dB?!DkAt(L28j=oBqf`Sdzs0{Gw)5b78ZnUVs0tJ2Nj@A0t+XH ztk^G%{MUdz0{Ce^;#Kr4Po&N6quAZK}=cEa&W2pX* zS^Br)LL={bvjH2*F&ByowsD=-0YbDVWP=&9G3eq&cJ{twAP|NyS5`R_BF^azZluva zvqbs{4!IU-3Fa#S;|>ezr+jVY{$WQANXo~E^HOj&tCW-sY{hJrM{N87gD!dOgys6I zMjg{-VUiIqCfPP-E$Wdqp1Z2?$v2x3>^T`e=y;O@zi{5eg zr#$)hd2r9u)Lw)>Y9BC2P}QuI4jiu88AjlAKW=y zB3%3Y95A5eSP~T~^)C!+h$LWs)17W?oLfc}nAOsA8FqGAifph<4hDhZXjq@t|5P&a zwl!h6B&&$|KVtE$_qlhs8>R2+j!>3%3JbIjV&0L5pJFHF8Zz>vJ|4U-0F;xTjORcjb_?+4k z*Ph&bjB7quOCfJd2|pV}qT4(~e(fXCmOjY*$##aaq)sT|Vuc4#Mf%p+ynsg@iTqEVS6%0U%A3InlAIy^Y|qYEVlv4fnGD zx!WKWmoBJazRLcgKVEMz*UQ^*>ixpkB32%IoaE)*K$F$cWq;f^r}16UL`(zOm2MB> z7V!nNny#wLx<`ZyXJXDq<5~B_;pKa-sqC^0ng-H({(!KXT$v;nLm8V~rLJe*TxcS7 z+afA3BoMW()xyZ-v8_mlYt%@oXY!Op63?@|g0jn`FU#xCl8q)q?1htMq)w!{6(AjV z{M(wogp7({4tYAD?TE-n!54HdRXO*y*{vZ;#O;(iKKv@!A$`RH!P zU@~U&Vc6pBM|?X@1=b1eI4=Ei%(u1ER{CnnO^&kYd}w}xAAW~GSmHm%w{c(47$`@O z%imcKh1tUGwGizO|$V8GPSViWI}I1V1z&<7!>n zXM|WK%3#Mn)p5@J33!Z(L9`)QcFOV_7ULo0ClnB5GFhFi0q*G9q&*~*tcH~O@Q;pI z{d2Qy@|IsO&+>-ELZ&Lj;Z^dh^8GW}r1|xlEWpe`7cz?K8wvvyYjHoJk8}HM2DAxkQW&XW>f2ZcrJpw^QUNcnyU-ri|b3EJ3J9IqXr`99@VYwm~E zqWuCN^6%aL1hb51j(X*uzYgpDGgm}jG2FpAr(2=1K z&f!$Ik-o$K{FmNdFxfxyqsTUk<_<=|clB(;!pH5$r9p}mJJX5NvQ@T=FVq)13ckFI zF;>}NQU`C$w_70&WO_GgwUeSpf-BPGjS<%oE(IQF>|P{O*6Y0QwsGq%*)4=~(~XL^ zPDx0?YMxYDwaz$w+o@R)3r&VY}OQ4(qwNZ*TXNtgXPqxwsN z`_hWU4lzL#X5C=-`AR5~yCzS5*_)L1m|{2tk&mx-rdH69w$H_?u;-Bqp!;6=+)_pW z!XIbA8$g07We$kCwLB$G*JWxyGipl9;Ggsh)3h%ubY^+Wyt-CG(aCw`K=?bg;>)5) zBea%$<%laF;+iv}u5c#75{Y*V*EJcQRnj0ka(*BnkjcckiJ6P06h^w_4qWV`u0h6H%$s{Yrv-Dg z7P0?3jN$RTWLS-mbH$eamsB>la@i-ur`*`L+NF|T}7o`gwYrI1)fES5(ml#$4Ua?)5ETG zb5@z_V>Ti0l)S@~KL)T7(Ze$JcS%MJgHRtPTdkgYexU?4%9zsA@MbY}$vhH|KY!}j zkb%|Go4svZWfX*-zMZ5^i!edkM5R+Px;-KP!?PljzFKSSNCjmPTtBYVG``HiY7rYl zU*X+zl-fbK9@m`t}Xb+4fa&R40LTdbH@C|Afn7Ow!-UAdi3TTh1 zo|M@LkfWjpYk3TNx`KM|jL!t!CGs+*g8%LB=|UI2#&$CPuUQ5Xf|@wXEt*>aWD*uX zHL*8QrvgfHdcKc8x!O6Qr_fC;>6w;6Z5t3>-_s?ml!AV38(1Ha{D!ME!&#s1-OZ9_ z5c7Hd5J;Q>leR$_q{eu;6c?_NRJT3F<{{hP<(gc1U3uw-SP=D*nP6u4-YBaKPyu1< z#C=A_I+>~`qO~KK5vsm?a2r3{gcp8-B@l^h=^p5GO{iUG7Q;=dGj9l}kUf87KbOV) z7f>)h~lmK?gci^OO6#V_gV8#G#>$0#Jhi$#Zy>=CN?7m3IXK=Zk)Hv{FQ0n zt}Y>5x6f7!bH$FG!GrKeX9_>=_c*s{HJ)uNLf#XD!w-_G%_zMvz8Hbxp@2NQ9vYj9 zg6T({Xz7qV!F1}OWeA0-lJE3pG+H{{AK@6dq(U!R_z%(XZWx#8Cq51!?RW#}F&s-i z%1M3PJhex(b+hxp3``$u#ibn<;pIUSpK@~l zuN4v59{dnWVmRs|-*4u%DmRW8kH{eWZLK5TlV2{ZP*~K5fJg!=x3c0MEe1mP3fjz1 z$QeJmP_Cv^+I730BApI^v9_>pC$P!Yck3FlrXN6HcVD$IKlzBXv?o7vo`&+ssfB5# z2;uM2gk=L@ol4%J&zcRSEn@x0ZM}?FgHm7CW6Jiy9-9C$jiuA~Yq&FJ<0gs^`Nyb5 zrRzZRNeDESXwY2qmlU}dX(dzJu29-stwwm|9KMb4kdqwEdeYewXcar@O=MqLFm&e$ zBIqJ35};ts^&%j3;!^l-i`L7`;wbYcrv0oGws%;xS#f`mfL zOF66!OmR**;O&wPB^;F~ehJ?9cS1*Hq@EShDyU{Z>YK*O3z+tn9hm}m$CS{@>Vr&dX1WD=xtCekBkD4 z$krJl77PhjA+PBJ>%gTACNsi5@7!8KHM^w_aN%!oZgU%N_nvt)G&Nk*W4U7#TNBWQ z9zOXgG;xR2Os#&xG4wpF+Pg2WNe-yUG4gnV1fyp}(w4dkGeydUZI-x6Srz$geouO) zq%yUqjXmIBGe^%#; zA*%P3L5V*nxA3l*)QLdI(*6y7_h=HpbrBd(vkuk7g+1hgO@tUH%MH%FdH5_*pK8-a z@JjMV1I4R4f7m9ev7*cBM0m}c{zmR%9a*o0#BnA;Aw z-lkPhY(OMcnlm0~zbVu;m(?{(r~*x}L3!j!SZkU2lIl+REJ-*;R9WEWfS2&m&*r}( z?+@xw%(SB(2G~h_D(>$qcJ|O{hsAmnQen5=XW``X7`dA2{LiHuHtF|0UUA!%WE&0g z&f60e&hk_j35j4cx@?J$P!N^2pI}^e6g&~qny7=L?t2J_R~u;((`N|+li>v+rW4P% z-pR6db&_FF(fIT|)Cm7F6@!jfCLBI()lA1HqZ@TJjg>9%psxsl`Xda;rCx}QCiRIIiRR@w@ z>lMB-Vm+^zB8<~XH<(jj3lQbCQw7{UaXf^k%@2d&luW}m7rU>b{g?$&*qd3ZBIKmY zRaeHm5n~S8pN=mY=8M*f-PyY-g6PrGw;mdqn13Q=YUY^G5vk-PsF5S!(k&o4u*Z6J z6aTi(7PbGB=Cd8g)7tMSZfQX-w@HwDbA3<~VB?ZHfP$&E9Yl$uq7z7kOi z92!n%OB3(f8uJ1tx7pJNck_(-QMHo_JL0{FSG@w#7=z{=naKhqhaDfW#m+0wXXTVvc09tS>eq}1VcUCfvZCa{{~K`l%*Nc58+_LQ|3 zDK4|3K&}w!kWzm~gD zQb~H>Ri9uIro%t~i9#f;YhoY+E`u9lqBfU0nopZ4yclHkU9AXidGb-Pj9IG2jZ#kV zfy`5Cj5+-hzoJe9E5j@>-FEP?KJ%PGC*vPPv=3g6_jppuF3|Nb?4jv@ z&nr8(|AND(NN_)n*w&Lc{B?0MZAl|r$|8V0|?azIwr;yvZH|c1>aqmOR zqu=}sqR}Hvj8B&2V$sQ6l%P2#jg5z{}Z8z1e`om6ec;kI_j$9%EIP>zU8Ubg&0uu@XNJgX9Mg~^VA7zxR>?l*!G zJoBvkV*f)8%}0()Af@+-Tg{(tPxM?JAKqV9B}cOo1 ziwP^Lu_38C>dUsLKJGk^A6Kdl;~jBg*P{zKZV6R)4LCv|O;e$Rx>MV8TdIfHiW#>G0CV zg1@7&%(n^=e8b?zQf=7ZQh?cbI<$*2pKUj#ug~E$blpzF5SP|a>aI+0m%4Hcghv|Z z3DXr?&?}!hb#m}s({x#3%g%Hz;2@0#5%o}h(TgHFQ!8(7jXDs}c>l~PyVbxmR^hZ= z*eJqnNIrh#uJFUBc%Zp}Uc|JGiSZT~!_i7Z`-x+o{+LZMGk$${AzBNt5Yfs9fns9A zw1usyt&=c*4*DXO8PI$hU_QLU_x}%y6q@rScrQUgP{H|j+kP1>&pL6b$3((M=2&@NDugr0N7E^E?%YlK)H zu&$RDedk}JXZ(}C?O0;pu5NRVaUy0SbyHqj%^jfRNxseDZsN3f%4HN;4_bm|hCnS< z<6ZM7zpg<<^GDtppL3(r_RR4>hlHAxqtEjY^3*FANS$g`%5MhhiQWCro(inqSkfK| zlr%5pKT0G!q-1~_;KMK%FR@U{y|=HM%w()9Fn$hsd zWmChdN0tG8gl^xO+9chlxHfpQ58=KP$izfCO9jNAFK_GImBaT;E}hFLhH452uG_jZ zKItS_HpkUY+A`u9LEd?BXi~k`E!`H+A;k@p4WM@SC{xc9eREDe8u#TG{^Tf=z3A{_ zx3a<(Hc3bXNC4)gZ?R1VLtQ`rSI6xwfp ze6UTR+pcal#Q+xm5;){}O7*vnw0=vN?g-;01h zb{x7Fz$tTF8WKp1{*^6xkZGi+)RxVrJ0a!oefH;3QDMxB%oHtg`nN=IhvA5;B=uy} z-t_ScewHhDU(BYa4C;+SKRV%8m_9m3cK$K1t36xPMyD$%VL6n)-?x0PS9y>pLtimF zNI(sxbl$p%FjX2pO_7Y$@znisluE=At=sU|)(;=SQ*WgfqwxqX{vUDWO?tFvDIVV< zn;}0iC?>nLEdMVuzAAIHaFZzdl%#?^GE>X|kI~GVGvg#bJ$%OoY&U$z2tJ(aHTZ=v zM@ZhPAowW}72XOrKf;;GTISm8atV`#QBs)~%Ie4ucOZR&P@o)HXAx>%#Qp{Tmzatu zz}`mRDKTe@6{N_)6dtdBkoINLQ2K3hbsQv~{M3jABF!IRDK4BJbg=<^D=NF#u%CuU zUR@=zIBeuuz+%U5JeZLuLoQU~SL;1#z60{wnS{RVuWkdnZ4-)Fs#ZBYx=g+onoyzJ z0NQxsq;Fu)Mz*CTI}U8!vKpng@bsRWaZ@5|h>HHYY>d7jz^$5_$JyU2iB%O)xg{P< zfHm2> zhSS7>b?1-MtSOpIkezAxV<0?zRBxS5GVh7^KsU|>nfJm55z^f6C+~{M>*-~LF%Y;t z2SIH&--DZhaHVV!(I-9K$)HdhGr=(&oNJeYZ`ezi(TV1BS96`1>+$JY%rdf^GCIq{ z_NzNpruN~#fF*@?K`*`S#Z{$~t|u?`oPYOV&AG3+X89mnEgN7+jso1x_Cop?9^2^A zzP?$ELhy6>cNxavmwT5Yl*3Al(3H`$W+OD8H(^>{O%&>n4uFEJ8c=#;IVFe4Xq_{$ zC-6{%7;JRO#kmCpryEYQTK4nu(R@_mUI+H$w@Ek|ZrVnn{EY3F%q%@$A`>gA$2l)m zXEQ_X(k;T;ZD2c1;4fU{fjBXMgXmap+^{`@-jHFC9xrV&La1vPeL+1JY`Lspy&&|gL$iYr6Tc8qw? zkGTRVE1l29PB&@)B>05~`>97+xi|B3?qx8yY%r@_Fu%-b(c`nr4s`x%bkf?={)PBQ zPt;&q>0QB)*Ez5im`DllZL!eWw}@xfzYg(j(d5JRB1dTDB_=*75Eddo5NsSBhmU=ra6uxn zqs^ro7rN6JYsX{P@X}1RZcj3-<>b3$I?d9dPH)l-)EfGx4mxnIpE;uck(O*pmC(d+ zY-7Ji=~QA)LU6p_Y0@EO+x}tFu&{VIJ{#qE^4`D`htbc05<4l)g?%Y6MrqfBQ9A!T zp*#G0@YYYWK?>ZAfHXamB8bEE^EfHR^1*YnqYWPwS2M{QvGJK;*jFDVe2Un4Bef?5 zZuk1^>U0=nv=FRMU3oi&-i1*dkmBT$Xchk>WxK7zi7NTcYnF9o2B^(&oGtnh)=hU6{Nl$Xrz-x+xe#FXDlt3d>|arM<>qliH@L6a(=g zK(NfV7Ox|HMew0dRiEduRKa~CKu-G!;);0D+a08XlZLU22YcI*Z$aYdN$5T|Je03t zUBN8tU?TleODb``nw+(SI3nov7CUMer&beJq;!82qabr12>!RGC7L~GsQ`=%nJdLoIo(s{p{@(otAU zYs6o2FD0QkBkgRY7>;=*XNJ8=&Rdc%{cuS!5RN!2;}4!WjAzZ?&_w3bI_&7SVQ>)u z6OGRmiX3Agh5{sbk6Wxz>DB)-$u8O$E}`U(3FVk8C6fT<%VAZq-IPhSX_W;ALNp{t zKYe2q!J+f4^SS9{xsB}kB4oumy4aKbZ+YZZ*{pE{u$pK@@Sz_?2 zVcSdJz|&{RB>mX3y-cUcD4{&%ACjJzLY6pQEjqmWF1B9%v6>h6BZ^rzs>-xtvH4cK z{zW{BSqZA3)Wa80zinfeG-7n_dj+9}$V^AeL*b`RAJNJ?T8Wx#gR$0(aeO^O7I zT%W!-dR>X3gy#JOVU2J3MwPd8)M=!Riw^ZxMeTUhC(lhViuULZur(HH7bdgreQP>F zulIafEAjclLrFVV0NRDlz2jOyDe3hWw(}Luc!31+U&akUB6i>Rw}iaGJ0m^ z@x5)M##t5;1!%|CBT0-{lfQvYfFzGgw%y)}nimRxt6(Ev%`9v3q~uoS4MrkrUxNWl z6@W(8zPE|o-rLus*C%$^^X!SE8C;$T1o z_4XMA`BAKVy|gXfeI*@35M8Kx==3AkBY2H1Ed#0$nP*fLE5n&O?{Ka>P7L zL_Q>03C+j)qO}IulC36U5>Y??jArCZKhuJe-bg~*6JXvXb}A(i-&OmW;nLv%>8%-2 zx=;>64}(n+xR~st`Pe~n>2u$uzOVRA?C`$#qo4_pD;;UVPSuzf*mQpU*F`7)k2?31wwDs9g4>%f*l$;X{gejtS#Z;!)+r4H?48L)6X8crLY>+{@BI-w~o&W=Wt2L&p3&)-%*O+9SN8cMUD!ED) zg*;VKn?Io8IzJl{c?avIo%r_NE1HE> zH4wn(aqc9Grt9XOyD~4Yjqt2cn+~z3JgdO%R+SpYrdc z^}{Jxwou)!56(t2;WP?u(FR?mym8?u$5qHDtI2=Q6fzNefMbSg-l!4Pm$k|0>o2x< z_O(_Ir}-vXkC_GG?~(yd-=QHSC`_}@y$``w$k(ti3F-3}RJ8f>hIWKywd($DzA}6M zJcy@#$y_wTRVp=6v|qa`ReJ4peOG2GEfoJq3|JR>5%*kOS>Q)KaH?} z=L=6;ILL2YkGIYL5)e_ryRW?L3+qv(%wm&CbW5s;t&kRV@d+Upb%|on^I=LI<=gMy zIR_zYWK(Ln}L?Utd&rXux~jIKy!qY6k*LEGqaQ zhAZQB(zb5o{K3h{KIsb3-jSV)j-`^%%H%TN;rVsiM@fHLeI z=g6!Uz1>@RF^feAzsN6$NOX?k2MC#Dx!lUa-EiT}k6eGw;wrJd+p&5h{5@+ENN`N| zyxF$(rRIFl(|s>SR^F=~a>F}=O>Ps1G_spD3T8c`@omP{iT!DJeE%1`Ws8bxu*E8) zbuz27bNXp-)*7b?F}B@Pit0004oz2!UxV4DXrfluG4~;^BV*9zi%m}xi`g~iM~8Hd zslB$*Q=akB7Mt9ZKf+1I>n>Qy_96DcOEK1x(@ri1>`gNt8%{+lIaN4Sb+Tr&!N98M zn?SCe@K4GT6G2CU1~H3{<9rr|t=Pv)^rOPb1~-K`s0i;?-ZrROx9w+=m%1^beP2K_ zHQz8ktx99{mGY-1O3s52er-Mq#3Q5p7yg)A~q>Wbc6QSKr?? zd{y7BWA7OoC(Jg^^rVGg<}VuPH!bz?YJaI47|rF?i2o3fiZ`F=!W=)00~O)Y&7aUO z6UwPo&AHdgsom05{Z-x(e-~=?-0K%Bp6~)bKyCP^e@B`A<3vg&naO;o8GHKZ&A`I){tMHwbIDvrhdDl+6@#

    g)%c&JourR`mL8zTW&_isCCFSW)wG0AV?(2=XorOMmypaL!kiFk ziwXWQ^sBR{kA`a;#~?PsO12lZa=e6l9&dC}e-6h_imdA%b}p7>aSJ7h_N6D7e6tR| zEvf&^d)=Zci+Is$9`;Lc)V#!P^sgj%a}iz68l8scUW{8OmP@~q@P&Ah@jN(}*?r7( z(s6{^y*AD%pnJHQ@_1tSdln)2YQJ|c+q(y7VE{k4t-l11j;j-ONW!9c6-s&AJp{wVr9Zu(;)SaB6i3F>P?fjC}}7VGJ$f?IgUq2`#cze&vqy zqn4W~OTlp%xdt&&w<&hr3w!alJgu1}92%mqVir?MOLx2>Qc=vR@Ir{0MN@ELq-D_! zf|WRJWFI};89beP792ZKXf%?kIjx+(hq; zINp_&|56WpmgVsl_bN8k#({dVEAN~Ez(GDN2)4SUjM6E!HphOHpK%RzG_(HkJu}g% zfoK7ddJSI zgr>JEqb0s}?N2?ss7nF9Hf*U=Uh(C6@6>wyPYVDPPColQ6#C#mGaYFoX32y}=A;m= zB*1=x6dkD6w|!E%774uYgU~!p(~RIy8;HMbe+wg>yp^HK=YVG>igZ5~ z12ZBt9|z5BRJGdzD=>5a9S&&5cPTu^aI7IM5MW{cx5wK+$sx1KE$iSdDojf^8}Bgo zeNhCp>%$OeU-B$qB_UTeLNkWx-bUwqzFHjUQmY%b_ljyp7Y8=3mpIpv4Al+ew`DlA zPQ$RD45yCQkSR8n7X4URiw6sqA_@|_>oA|mW0T$384L(-?F6LZvvYz>g$x80uAd64 zMM!@iX%DW;wMY%PTjW9QV&dkh`>}A@72=9qnxqFb5!@xP{3AKZ8 z0QV?bt1Oh_;b8JyuW)khMWK6`uPEI&5!9dpJgG36xA=}uyMSHpk52NL!rAF@AS8w=wQ}m3ejbDM<@iM_Q!h-7B!8y+31P9PwuIr}k zcE|k_&vo2a=z~%#9cPk#EMky(=}imrRRdwM=e#|!vwXC0+m+A4$b#MwsEtn*$stuy zc7hS88sAlqZdCVN(F@c7y(dgQ{EgRps#>$R8k9d(NqaP?^WHl$PTk@Iq(O3uN`DvQ z$R>!y-Nz8+wXHF%jcl^BRm$iH5lBwNTT^?l9_BbK=Z@hj(#jZ@{mh*^Kyak#*tl)xHxb#IY#!GQ@;`%5zOJ%_BGT{yTHg z_p%F{XEda@g_?1I;UAM$T)p_Ajd{|WBtDt)fCt_Kn?(u{adtk+%28>#r42Y0_ogY$$SmaA zPEy136w9w8Z=Z5Nsrcw>Nq*Y7F`U%E1OEES8ZQmC8thFAupp}%pNQqwHOshPf-9o`p^6|A=*l;XJ}ynH^VWANViAn-+o!!M%6BazQkS$nK=W7|5Q zwD|(9yrF)yAO;X%5~>DZ9UF85lvv3q1Zt!iU}3qi`k^77?a-IqR|gJH)1CA$W17u^ z22eaQCtW375zb#7*kmv(QYpIpDzf6(-V^<9{BUZjMv%5GM?QjFFYB>3{khte=kyJ_ z{TCPTFg10Jt##OKt2y=YPnleg_+Is`cl)y`Sldb+yi?(3LES8#@8?EZZHnC$xb(xl zpG6xEChNB@J+ib1Xn*Dgz>&@S=g`4UzCP#A!N%?Z=@RvHf0RqCSR1g;2+|#KUM_4; zI3khZVa~Q~?(e&@r>*qv&nc-`<-~RiWg*aE@eiInyXGLhkzQT^#38n}zP_}($M|u- z@#vj<7e&IvUN~neY3$(pDIyDkk2#aDO*tr(d|c$TMvzpv{r79G*w*ejX!y$B2}H{e zQX<<}Q1hluy_Rzzj22HT@7NHcP~yg-9AY0(*}irTyrY)Z){*RLZRB`w2r z6ZaJE04$_7CJ@%)3qOnr%+v{PXfwB51r6-%RpHw|VVE7dJa5%HEtMLY5^*APVvMGl z`b%r`)q(yPt0Hx@>t(FC2I+i+aCCQ#nu)okSxPU|sPAE)fX-C%9eMTbRo!&c()!E8 ztnD1_<@QS<&;;$_)=XM?PuzD|VNkq8l1(7f?hyFSDgW!Xln?%a5j45;fHD5<{fObi z&}+{PUSmZQ5Nk8~Mf1tT#*j&*q~3Ci@2TStwBnj++Yy1)OB?#3^ZO~oTk7j7wV>RV zTrhO+FavF054mgsY}?}84&VUi%o_+(?oC0j@`qh811>(n$2$0h@b+pb7RrBuTh-kJ zMm<6BJ`*(ImEwc_nNKsablfL9f;o@nnAO5rUxs$5f-zvPC&YSJt>bh;|eGh}BkO4EzwxVO;D~IGiC8BzihmlV&P(OL&$uy=|wcy0yOT{Gv z-!LU}a>(>=FOJyV)sFxt>K)lI)x+u`boXOIakDGi46s!mnBhKgDtee?CWldvid1r_ zL`j9FPANs0ExXO{H@t3Ji}$<=^VgxH(rm^DD*RKX_j$i6fk>KqO?@ovV`BZe(^WT(jCZ+U~ozbId@GGCj1utMMa zW)PEh)^YgLOxj!{CVx%E9TM8!#3IWpwRWkJG$tu}!ULVnR_mArKXZEli1Z4XT_V`t z4mY%~GPM6JZ@$EPv>oKsvlvj?xpTtiKAV8oS+p{ea^sfX|5_p&zK=gZUvf&4EYQx$2j87$=Yig1<<}!Vyy+HI;JsavpiB~~BwF*Cd z^V&7l&=0J+E*zr#3EHDA)M-nfxU0V(vu&%jpg+Y++D{mI8Zsit7S>G09=4?GK_kJb z*ZI?En5RT^$gzxI^Xt9U{l9mdBY{P4=!F9li4V?d$oGtk(oM}5rK&XMckC35!>kJ2 zHE)~SlsHLkosYLMH_)p({bZa zrsfP3SEi}JQLhy9p|_~cu11%En@ru5HtJ>*9bw2d9iC@K?kKm&_2z$Uzo=9!ML~q_NqI2p7 zq_3V0m|Mu4tV90hHt3cNd*53O9_QGdqB*dh^cMI1bCu>@asG4ndMixkz`{%Fdm*Ch zJ8Nxtzaf3{yie&i z_IN?~LC7TpvWtqIMRerw!s5)11IJ3sV&!}djTl^p?H;)?87-o zA1S=~Hp;h)KG$Y9of_K6!=(|PpZmQ!p&PrN!KFAqDu`{)Wn6cjq|N;e9GMCa>R!7B z1+1-4mlfRSempqwE?W2tBEiYgjq)dHS(K4(Sd;^*$b~=Hh=z`}y;5O&&BYfYSMClN z)%&fMi-uY5*GT%s@=i!-c>1W7g=*aUrjh7!5U^~!M7Jn^Uc0I5I^9;MV1t#mz^#9a zpMH1$lkXa-m6|_iR_eKZ5Q~X02;_m|XeM-ZUEv@0&WJ5Yf~3lfkKvsOFCGKr;-TU4 z^6?u97hz!_@83jMJ7>7&r@p4n5tWkTiL~FQLiWD0_z9+p*jy$cQDsUJMj;oiYuB%& zmdm6W8l}TuKb#|zOrctnRzw7s!mxmb)AcCH`jl;6KSr6kCYX@1U^E_yNQ_;mWf2cF%Pg!o{cA`@>B-#Nbwp*O0*9oJ#mnI30?3DEpHNE z1XO=R4T=(4zO&aJ>EFpB!pt*>Eu#ht!~I4~6|x;}#n?%6$43Ywu@-odYY9Ql?w*>sl>XZg zv#{tP{N{;$XG$Qiy}o^=)E{-LonpLuMkl7kYDjTqrHY-lWDvZU`%22~OFN_ZAm;?B z=YdcE_Gtg;)>t9O;n?XU&bQ2|mj-tsdg-f$wT$9T+mkj$rhY=XeX()WX9n15eZ-rh zgEph3(Dg>Cune$G%r9WC`{#ge80Mo2Y#bYgGK`p7YUJBnI15rDC}zWfJ^G&VxToB{ z=uF2z{9U8prn5-bqh&FnD&yh8auW7%-k2OJ z1NubYzCegdJ#qH=iy!j23no!#3Z7!`01GO$eb>@nzt|CG9i=c2oy>?gRlH+B8=W@> zf?H_f+jm;jmk&I_)k9Y7%{OyfWBf0D6oDO(fQ@1L{uOVm59(xK=(%i2$@rzdYK>nQ z3HS@#At4vcFVOd*FAeqQbFP~aRvmuU>GUz{;3q@q#0lHagKzT8=eMmEy)KXTtoNN3 z_Hit_0_t#b8*XsLIwRS6u3f>xc<4WGP5W>V$J~OVp83NH8CgYBjthd35BiHx#qH37 z`@t^RB^MeqSA3l-DUj~4^~S#JJoksYp1|$D^n7h&yV^1JJ>QJ0W@QfQfxRIdzL%19 z+XhsUDeQr3)>?@jsM)i7`jETd2EqeJM`_oA`w04ssnB|Q_gC&7B%^0cH0bu@eLbY) zA=_R`N{1T^Q8xoARuxZK5R}Ek47A@c-p4H{#Xi}T9t(MS=I?koF`xoN3HOxo6))sB zr7=ww)VBG=9x~>)n09HAzly@QCjkjHamf);AMOq7m?P7=vqcu{Z6ENeu*Wq;;jI0V z(t4M=xMSv1n!&6XCBPNhQ{&fxRD z*SXGz^I^FK*36zYGi&0W`~Lk`*fn%N9*NpaJ3klusXmVDZt=AUe(fp#+u|vmf$;P_ zmi@iKeoS>8dMW9kvEmv|5i%~tQ2OdzncNzpx*CFaf@+|?z>-++|Aslel#{_aK(r6Ivf1`>TnDG*#O=}SGS8jMjx05K#-IxV z=HtuPYJx|?Ll-dt6TK&JfliJE%*TmC+Xz1$koO$WiT>gn&OV;3oW1un`E5bqHvYIh z0ZWW5Bf*wA@o|fcPH6OoV@>W^+6KNH>}GCH>Dc?eWS_<+HVMh@t~^PNJq^x(I;-5q zKU3$N;YO^XGbCitoqvUh8o09SvcZ2)4N>)&??^UC=q>o_w=kk>kD6Du;mgW@HrOpN zdJ0OuojCN!?d!EF%S^_RU!_0&BWbn)MmAr%=efBfK&QyNZBatnZ!1?g%sI_Q~y(=0qaiG)7Sj@CjDS zpDwf7WmVf*-gM>kQ$9smh=kL9RG3KadLVl{5|WQ%kJ*v^=tYIuQ(C1V+IrMyzA%pFsA!bW)eW+y+(|31w1+Q#{&Q5~&-CRrz@cN??CZWVGigVczvZuxyq)mXY4jOnSNTthDGw(RGs0;Pf(xuJ(y z6_X*?+o|ow2BWPN?xDrc zN&M%Y!7LwKPS zSo_zv%1-yeCY|1ZbP8g6zm16!n+c{fil=dmpjF3i<=L7N~wkUouP)pHn z=wrgCbTci<-7aFSwqgGih z%Kn+kp6eB7tVHD;Z^dt_CG@6N#rwsbzW2jdhcNk3b81p2W?q zq+PGBk00NA0{o*|m#;@J)4E!O)3v}+(~EogiijdMGvJKcO`F2H*z`lV z`*PBw;wGS)fBEUKDNzBlB#-h(QW@2V=Sjs_-u4!l0Xz{u71y@X;>a`gLT%GXmwmiP zj2z9YLO5uz>tp@G=S{F@PK@*zk~WiW(1@=uqNUl)@Im(K9@eTa(o!3;)+pKTM( zA%A#A>>`%+T_W3_`g@YBS;#Mvd)Y1FyonWg%%*J0JRfYxz7ihE?y}c?;J@^bNLEy@ zXLzDjyu;AygZFC+Yq86@uZbsw^YTp>1WbH})N!~AlP!J3siCHIZ4~^|VJQ-SzX;8} zJ^|-nWN3Zw+`y7%2zie5e(Nn(UTEnV?+miwTkuc@_$#P>#in~F@o4UpjNzz$vZH{K za$qW=Gli7Scz}e z%2f~S`|w)|8K{iB|3v-_>mFk&>t)P1PLe^4ZB67{N|(=_DdivCF|lt}B6i@zK7}*t zkK(2Tm22U8OjatsKmBJn+u>60oOk#cdYn!5snazsh3j&{tAymIC2re}J<2#Mcp1_T z^8;e}_yPA`Z2{d&-A}QRII2I`dCkNpoICr^{rD3y;u^j8gpz+c`RRNgDZ@Zhm-C!! zCA5uk1=VV9|Gqh9%bN{aCcCmY=DqM?-0$}vyiHV*3^zlUEd^xYaXANq`_q!vt@;fx z1mh}w<*CDG$r>)@A60`hS+oUlDLtWQGN+c+us@_D>3CKjg+Any+GjePnpPn%3Qg2^ z@V(UOzO@NokU36K9=NSJrr~%ZVZ@?pK;6No+TZoD#4$&u57( zI+?NR{{%T!CX3jcQfCfW5H{GGmD3r0Odnv@bBRFq4AMRdfsvIv9CbBo_wG;08+8TD)oa{|@n$&-=&jbA1W33}0rpHEqhS zrQX3G3iVcIl6}FAf+qfCb8cbH&8+a?EJ5*c$B+5mllq9%Pb)e~N?08(9y*6H3pLfH z>12^~4@W=su?Cq=bj`V(ia-AK_Ws}Sxv6G*9X4yGp92Bb?HaW$9`8`U;~7_O9Jb9j4V$HIorw^bO`a?r&R5>4X zF?*i3H2n(dd$03I&9{rs$$EA~%-u3JX2ap5(8Oes2u<|01M44+47co39>fWOOi#LC zr{*k6?{YWnhRfV&?zws$xG6Xa1V@esMeJam7?Y4^JopTQ?4>I?HmOatrxnH{>u+a~ zQ#D)qnS**=pMBXAeO?>3u5b;tbe*yeZILTulQ&F23HJQ>Kd1MYblF`HmU;<8ojzve zGl)4i$82oC^^e_42nUVRKD8Jm3}qS)+n zg58bhREfHTc?la&CX5O)sQj60Oi`AJLX&77Hmk2q5Z`6zY~u!ZR!XhhYcny!%lKl` zm&&Qh?!(r)Jfy$%?TsByT)?j1KY2x$^rbV|*erajZNtl7+w(8%odYxU$;^1x7-ZO0 zxql3gMS|FhsAa^yRSwDB{I|sQx>aC<`$jHYZ&MC_Nar9B(qofCOKr{hbLiQqJnPRH zN2=oQ>T2HoroLVHDesp01FcO5D#Q1MleC__Zxcwo6GgW$J&SG`SG`|d5{Pe_E#R=F zlO`F?Ou{O?e@*?gP|b*=OCVMkVvn?7UU};srmh4h@!0(a5nm4CQ3hEL6Bf*KY%FWVC<9g<^in_?=MwA*wT zWyc>KxFbCcn=Hn@iJKncs;5q~A`#Z_%V#TQ-r-eDMQ-OWlwb~TEa_>!4N|*|js=K# zKeM(a=yc9FeEWWfEnIzZR_jSh=plj%X=oauLPzijbPgV^ylA@%&9p2PA5#HeN;-d~>tFv3MxW^J8C~)f)2@ zPAmmpa%E83;nk9wGWKh)7s}%D*W64PrnnyAhNjuublPFJUp%}yB!IhmnhWw~^9|My zf|@!b_#&_uB$M_o@;-w7^O=1njy!2WB9tI#r@@}vnJK}D4v#q0&*I_jJ@TEcJPJX; zhKEBsyW^?HE>*qHr9|K({&0M`D1rvq_ZO~>3VbHq{g&_5)^636F^9cC9>3m8<7@c~ ztYe~WY*V|uVD{COyszN18twvqhe<^|DJ|#nTFOi+4de1+=F*md%E#YY7azk*ggC^cYEb;bz5jVk({5~?cXD+9Rk2ly&ubyfL)0tg?!m6YtuaQi z4$QzZcSPE<6B%>+cvOnfieN~ypST)FNpZHiM*M)o%2DYTvgSbc!z&e4LnKqCn;}`+ zia=hywjaF#PD{*^_VWZ?`uPw(hIPBD7<_k#Xm^?}@WPJnYj6{;Eg(EQ2B)mf^in$U z;<@+HeOLjr*51fZ6B$kUN{p^WaZ3yWd*5lGY}?H~vE0Zuc(Y7y(U28|Asqa(2Q6#o z!%&J}8nd{uiRq6P5ar2SqLb55U|>@OJeY6g;eKqgCYpMEJQP;Gb`Yt+oSftD77Vw- zX~w{}wuw$GM2?^)ACzQf{lT~r;o}jqQi{-W-&w=k69lz3LDK-|jn@JhnU|r-+@s@+ z#mDHBeze4>Adq6n)5Tvc_nlYD4ZS!rQ3*0G&x>N2ZTVi;YUy!~6Ip}6aBbKJI!p3> zXxf$RauI?dtF8S7U2NKP;2)BnaS~j5S785xhd^2@nskv)NuuxkB@q5>Fd>pX%S>#D zD8FDT#yev0bo*#JFqznhSiMX|*L(dY{F;O@4g<-ZK@^tpT_-|bFiXKZI*dDbe{bD0 zr$j{u#U_zkC2-WNSi1avV0x|D(k02J?AO+{OyHsl2oo?E=0kW12}83vNUv6Q1%WMo zKJT?t46#nOJBmTBz?CtiOQvZK4@0o`rtf;I_? zBi{AYtKQ=mo{(o@#C2sG7+SQ7CQqwL9w!xWN2mrJ+e69qb*$epTEz<%U4&||o%?s` zwkjoTi8iJ8ze2z%qS;_k(5h-0{rgGxFRpX|wW1#TovB zcP}^@=Zm0OK zs`;S~9)i@Wv;g?XC%C_R@i^3V@rf0d-(@!i)awtTCMzw@^g9lbpYKnD{pS)>-W?$N zEn~rCS1zX}5Gl!Swh$?af_D)Ov&PnLQW!PnG={E6kOlea*ATI{-u=d`i>wV2Mq3;W z7(8(eqEX`j^3VY$inOQ0r46C-Q8D`mNJyH;WVc4R3M~|3f@D4hri{4 z8{)g#lFL!-Ek09$wNV@K`z6(ud~|`m%bpU$y|*}8*z!AZPnDHHNUCGb^iMn7?fo(z zG3w>t71vnh&3Vw_faaEqDKpwLDLZQZ{afEa(E3;Kxsjk`4MJ0a+wJ}Xxx1;ilkhX? zNEGJ5PyDG1)Y}~%q;f=qO}?8y;!j9MxfOq~0Nlb&=L=Jb_DvVFJdK+SFgrTpAGx83 zeKG3f@n3y17Aq2N>HAH?gl8mebeW6k>l1f#yaovDPtpn$r*if@zLelHIiA67F z%Xw1PJz`oV>A5;%mlcOvc(!}BNag5X1$g*4PxiPk>;2;RsmSt(hsFL5neJiwg?*h| zA-C;Ys2l*+eLnmluO%vo1TZ)K z;;J%gBm2MYm7zGuV{LCopKM|D9eYCpr9#cb-$`>p#l;A>&Uu8A9#82L0ZdRrG$OWY zus269;%%ZwkQmzjSis;h?>o9(;f~Jv7yYw@$bxagq8pP$cU8>i)qPc4V&+oikV>OG z68K`g0f@6?YxQtxHkQh5&qY3miW5Vh&C~7PV9Hn-EU7R(It}vr4Bg2p9x`xoj20yR z5kK~I)@O4@hhmG7n7y0?ZiK%}0yiXRExVBx3;DhG25Y;2cI}6{N9T}_!UF>sDEs^2*n{1!7wq*l+xXxpXC>Mb3)$8 zle~O-+|XNtZ>da3e4juF-s2_|Yd*&*#Vs2Gh@mrNp9Nz}f9i zqoBRvI;WR(?tJe_-ucpW+}dN?r^m!^>myKIuJ4G*9n%y`i9z6ftR{*z$!e!pTf7}) zouZyaT-%)Fns&E2^5sKPg1mE1R`0NAItX)j0h`s~qfE@(C$l2=x5KOa2lckz4^?W8 z*r*{nldMMJXfV=(mp2lh+adHYwUm7N6H`9$iY#IY!x#HHlODd8qB7M2={jFCfeA4L=o9W zWLrh^hjI+*O5-#!OOQTS&AqBA6v4)1vA}6@P(HJwu9gq4O>Y&J z`Cf4*Y_y`)b6FQgX3+DdUC@#{?vl;wh288hhev{fi@a*o7mC+XWNyMT8uURBX2GU4-Uxp0vXRF44utg+M`L;eOsR>~|3JNt14nt)PXfcyD0Zd44$CUxS6r$H z`LisK&G8mox8730J=iAfeFWwveS!c5jP3=l^)}Oz)x0y961I^lo2;z99h~^@o(0wh zkmh`l&Bi*{qp*o*4@ydCh)xA8FO(VNMh&DOK6w&7&$@p_a^mfNJoDO1;@o{B4Hy*n zUsJv{XpPO~(>gaV^c$8v z>zP-a9KH)HpYw~oG`b0r-V%2RM5XET8NohR0t-&Ea83a!2lBl93nMc|%C6eoWvW<< zFN#pMbGMk016m6gfK{ELl=a{U&0HY%JmAlO^y4{<*?nxu&E+XH;&k(~rg%Pj%^?Rz zb=C+JP2!9JBd6uKfc<+;jH~5I8@!PK?qFBZmNn>Whu{@3fHxZ_!z=6Sx2AVlgmCLtFw+{I2dn4{y}>ESBl03}$)kHr9@Y#z#Op}z#p zU$nKzx1)p3(Zhg?%K>SBO+EJ_OG)hI;HTR7o}V|P`kJ`&DP73CYYL=&Tpm2IO+~Gi z&>wuaLiVh7m@}@8zPSz?n#IQ$XQ263bThali@8${1i~;c`hpTzU27lKNkn(W$a_%7 zC2B9Js03Viavbft6`@-T_Qo`Pi=g?S6=g3L;7`PIEv$XhWHGK@0$Q%U72b%MDC-^Z z8w)Cc`iaSP7%~tBO9AGPx&ED-?rVIxM{cANP^$6M1+HVSRK|s2Mo?2D&y6ZS7qZlt z*GnS&>>u#$d8H>~f1R|sP`Fgi&b!ViT6ctqwSJ6|%^!9^`Q=C&|3HLt-AQz6hp2Tk zh-CihM50lw1@LO}{{Sj2T;PMxGl?b|aqaUcu+^)~V~~)kirmlAZ+DXv1uWPVj`LYO zVt4i}=Q27`@pO6e)(s6kY5PoNeGZEv7*q)RLQK@sPClS1ql0%DNyaf#u{8CNGp>St z4^ry};$}){(!MTqwU zU8~_2I3Eu^7qq$&sBpWR2rtK+_2TxM`T>OtnCCBzb9`lXAZaH_p`Sh2I-(F^`RzqM z@@*y$e$)%VJ^yg-N;?N=B?601tE(_EG&KKck8TUmjPw4Osw2I!Xjuv7zZwwp{1-MU zn&BP`qn|=$rjUmu7nkLKn`dpj3uEJw`UQXE6TueXXEMjj{agF&iIVSha87>X(l#8w zv4YMWX5e@nq~wSrR3Jo|_^=ku%GuT0B9DDsnobJ#Vt{~-f-_*;L|HEdwIP`&?Pks? zfLbf)I&M;t0)Vsu6whzG@uvuk^D-&oLakUa(cZ_^YEoggB9=yYD}*#|>F1DUF_LQf z)5$gT*gTwMz-Ss&P1*ySmOnb}fah9Z_rpmEG$xaZv&hE8#r0#@x*(N0g%7#)ShhP8 ztJ(a^@FSE=3ksP5Q&)fU8`nu}_BSk2x`1=5zH33;G~3}bU6GQ^X2Nkogd-ivYt#4H z)J|b%j0qx7WO%{fd3{MrJ?YJ?E1Z1afCA+YDPIt*NdyGP#j#xdZfOYqR!iRPA4I=E zOdV3&uFVf72TuP%82cG3Cc!|V9id)@oJ5vD;1XmJCKdSFEmS6ECDNNGX zp@WsMbx{s6+R!^ZX58TYUr$w+zXzD7J9}!5RBxy)GwFGokE?C*=!A* zY^!CTo{`Ucr-U2yK+f+^$v`A~BPFavA7je95=;5chL<$3pEeNXI%k}u zYB8Y)-(Yb`5x7gjiZF0pk(13IKMc16iYhDR#R#nR@jh5l$5ZU1sJ>mk`*|5K@{lg? z4;HYGev^OO>ca#V`t-mzt>7tKKI=L1M?QB!LB16FjZ=X}U7Zy1nQpCj8P5?anmfVz z{MUh)uq>sc*=I%iP;_D3V|Mm!>NCceSrsc$oW$INzeQl?OqwUCxdp~O4cypswci~& zHD*#ecDsprx4EHQ8BlfQQZpQR$?Yfqd+jjMpzw3<&}%l}ue$1%nL5G%7T7&#et$Xs z;--Y&k8~)9B;_jGpGd<~*|oEbK6EjUKGZ1QpFlEjOT5+!xJ`cH z!gfR-D!tu}?rNrE8+FV;ACrLR69z8n4+(fw5=((uPnZ($JV4yy*$PLl{`Pc5?fNXU zL{ma&1(|V#w^%?&y6Bm|sCW(WDc&o4|20e?^#R&gg_9<(6yW4b^3cVa-Obf51w$so$iu# zXP%Gszs8X=+-3 z8f{DK%?0F9SdD|>zR6RbZR2MsQ!kA^3ha?2s}nf_P^Sc)_3_Ca>FatFk!b;pIU_{D z$YUNLIgt3T9Q;O5H}$2u#WhA-3)ma|Bj%H|kz4M<^Bn_u z_D2=3vQ+>Aeoe=E$V)7a{8L9VcNO}i#k1gPl?aibDwk2pSI{CAlPhEDsMk8zKZVy1;zGu!0D~Xe%~W5sL$9 zN9-pN-K=4*yH(;xKc2U9+E}?gzBk1X>q|0zc_>`UABB&Y@e7^iMv8-z;p|q<Tj(NUDeL(-drzXZJX& z^9Bidd%$WP^V2l{YulkW==)j2n-x!sStZaoF--AP2_(z^_o{gC_lRF-%=%!f7Hpxl zYRsMZX3sd~g!UJ*b24u3z2+9d-H=}N(}PvI(U0|wrR>ZY`PvWHY+@*0p4sraS7jE7_D%Eq-(5KsChk>53fr;xbT5hzN4d+K6G#P zsYgq_P+)DN2rZ>)BY`_0fT?9Z*NZ6!=Wg%N;9}eF8o5P@FkBHXMCXeDY`cvoRW2)I z*^^Mo^n1LOcZy)vKoNz$iIY;6WJBUFBZ$K&Ix3{gsP+P<+MX+wDG4{|(kwvo8k+2RNokdn}ffo>T>13WzCy z^xK_BnfquO?4(qXRMrDHMs$3RVp`BDm{4S1wBkf(KKZsxzT&ImSsOn6=rGVf3^arA zW>09FfWT*0z^G2CS$4U5Us*>~O4^PxeT2{VW6~-}V9;4_+s!Y!f|iFw7McNh1<>}L zo@=*-g@d;dD>eD}=RAD9i?lUn2!uLg#8}H-xu~1W667F!xlFPo?f68Ps)#`bA`4PU zMv~NQOjOiC_d&Q5)*-!TsA#Gs8|5zhBA~GZAD_gwdoL!RP>7^k8?ON36d4;vZk+95iHJWl3<(^=1ia7TWpymP;#c$ylB=ajUzF08NBGSGI`W+eHts zQWk~ispCtUzvMjDlbi{oRu}C&xEbx5%ww{G$E$Om?z$6-Gy=_jPL9w&L-JJXbS)cmI773~5*V-*)aT$AAR&YEc@e}#^{DuwS zs-973Rfm7S8PS`rigH-50H%7nzSX@nd2#Res*Lu{Vxdx>USr#;34U(8AJFvK6np-Q z{y`t+RcFnB>LuwiMioiIeFN{>c1PU~aRxw|B$o>a)}-iydB!sVY`7&!I!kUS`*^TT zC{HK_TshhfG4By=T?m+5X-my|v0{oTVr&ey>t4pA5tYE$-x_u)S{@@WRZ;<>Jf7r5 zlx`R!?Lr@KM65_^gD|e<+AHOC`q&a*q<}Z!SCgEl`uaaHiR3q8^z?N1wuzuRf9*@OmAO<@_Drzy>_)) za8jflTM=Zl5`YGpQ78c+hpgfhmyd)+AF44bKJH=g}W_z3MGvUwNxL9c+E7J`|POi zQ?9tnVXGhlB@7y*ULj#pKCG~JYknMVXP9A^nwiSdF>I{o1GT<>A4 zM8OC!9gsh$qztGE2`fJhIT4$GCQ(8wuHY{kNpB5miLoNkrY5#Jpo;1HT>m;ezM4Pl zpW4PJdF(H0>?4}}*FXEn?#viikM9k8<@;J%fCWY9F2lG&iB0hKD0;H3*KmGu|x$E#2YR=%6&)brnu?|A4OS)*3} z`iIxBoeRo#%6tulpE%sIl zlU|%41x;x6t758Vv4Rb&iZ{W^S`Yo91TIxx3rU{n%83(xWz_4b3TkDaC&M&_o3|vv z&OCdjDn&r>Ezo=-O4NCU9PQ_J(bq5NWKQSy_BWXONR<9?p=s0`;}o~!$sdW|Z9!lK zXo>2q%tD`?v{z5iFE8B(#xD8({_0{o;yNFE5T`O=j5udMS4!~)-GghLd)#%2K3xVB zO*U%Ul*WTWjM^Lz7i_CmH0DaQ6d~YH5$F%qFkT8!{2OAMHywsV2!K)vtt_kpOSBLz z7G(MAIe?${KE)7pLDV~T^982{@5~>RyviW)Pq^!xpv5p?W18G4BaNwQ>vJ7TwM&)sAf@J*`S{#zD^U(Fw+pJ?Si zZfr%ECm>-xu9hbiRWJ%xR{U3u^8U5Y#v%V&w0=mRyY6?GJplWY70ed>r{@%;K`+MC zjl3fVk3xqhUqB@N_c<DMB_=Cw|jB^Q|^H z@*-*c8rwAgCTp~ty7ni)6#Ab~og@W4)pIutzLZDcT zCXoMKrs1Eo*$UD@wTQg~uGoX38NMuIC9ka^$ObRU8Ir3ZTJtir$vmO3K37IEmz67r z5c8gp6;Tl6?dhI+lf|1TAfg!TuSoD97DGJS$z*CL7GW6mP`gpWcf_@S`7r-S=}pMaT?xQn?Ab^L(a|(z)bh$VGb%xyg*9H%X%{#ry5hxz|8!aG=Bbz5A z$*Kp(GJw&fHf|uRCl)>j_4xv-qtm6;L~6U*s2>P4EJGp$$PU0T8%h7+#-958$a>o? zpTJ!Lbkyn=#XQe6lv}5NZ9!p)3&N-Npc%v9ArUPVw-Xn=z_y3xu@ty*A+sKU&L8}- zCg{cH1OE+O`>x_2E|Nze;ozy#)PTa#GVa3$ALt6Qiee|`=7O(71|g0ZTE;LUAn_m_ zdb6N(T+RO9h`ayRitt$gKj@)?C&wYqij3MoUk{yT75-0lL8K!a62<;X9&W5B2VVgv z@apWBKaE(PsRvJMJO#xYt;~!=#DIf#@$I#425Ux|$3Pg)ZD9zSKbAspDuLK&-K`A@ zI)XBam6(U-7V{uG)ydt9;H{Ya@D45S;&#&f>!lUNDeG1;4NUUEWrl~WXsFw3^kPE8 z4|sQAMS(Z}A_xA_{-MKN?xF2WUFYqAQ z2hJ_5{0s;-w38H9saQTFWMiScI;HpQr-*gNy~pw6&~^6wfu!GB zLauMl7jcnLeZe*TAaqD$Z-KR8jzSaKkFb~={qK#y3u(}Q?FE- z{U)=U03+>X0av^cZvwu-dL+C=<3fJZIle$Dmm~i>khye(aT%)_g)0ZH@&2wK>`0~l zGjLp{&UgAbo9*EFcSHVO-`9h13{?%kr8hW>M_Nf6hDGw*8dAE8bVHax5o+zM$vLga z^hy~82qU7-4e3d$CT0LxPt6Tp(hkDk;ZcONB)eKD+o7MnsrAtf4jxmfDW%{(`)VGH z!d%*VfZt=`9mmWxgo!WhpiPApoz_pN{qPz+RN=pW=pJOQ{`Uv)n-#z#2i^7m{)WHv z9vLqa`<3@1>>ZFfWpJ0)aW^-0w-AK7T7VA(2p2aWJC^`E_X|xf0YL~v@Wl&OE-pbX luG{`k@c$=)gOj<9rT70o0W2BM9wb1JlU9CJCTSA special -> two + expect(two_list.head.next_node.prev_node.value).to eq('zero') + end + + it "sets the next node's prev_node when a node replaced" do + two_list.add_first(Node.new('zero')) + two_list.replace(1, Node.new('special')) + + # zero -> special -> two + expect(two_list.head.next_node.next_node.prev_node.value).to eq('special') + end + end + + context "#insert" do + it "sets prev_node correctly when a node is inserted at index 0" do + two_list.insert(0, Node.new('zero')) + + expect(two_list.head.prev_node).to be_nil + expect(two_list.head.next_node.prev_node.value).to eq('zero') + end + + it "sets prev_node correctly when a node is inserted as the new tail" do + two_list.insert(2, Node.new('tail')) + + expect(two_list.head.next_node.next_node.prev_node.value).to eq('two') + end + + it "sets prev_node correctly when a node is inserted in the middle" do + new_node = Node.new('1.5') + two_list.insert(1, new_node) + + expect(two_list.head.next_node.prev_node).to be(head) + expect(two_list.head.next_node.next_node.prev_node).to be(new_node) + end + end + + context "#remove" do + it "sets the new head's prev_node to nil when removing the original head" do + two_list.remove(0) + + expect(two_list.head.prev_node).to be_nil + end + + it "sets the next node's prev_node correctly when removing a middle node" do + two_list.add_first(Node.new('zero')) + # zero -> one -> two + two_list.remove(1) + # zero -> two + + expect(two_list.head.next_node.prev_node.value).to eq('zero') + end + + it "leaves the prev_node alone when removing the tail" do + two_list.remove(1) + + expect(two_list.head.prev_node).to be_nil + end + end +end diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/ruby/spec/spec_helper.rb b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/solutions/doubly_linked_list.js b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/solutions/doubly_linked_list.js new file mode 100644 index 00000000..bf296838 --- /dev/null +++ b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/solutions/doubly_linked_list.js @@ -0,0 +1,301 @@ +class DoublyLinkedList { + constructor(head = null) { + this.head = head; + } + + iterate(callback) { + let count = 0; + let temp = this.head; + + while (temp !== null) { + const result = callback(temp, count); + + if (result === true) { + return temp; + } + + ++count; + temp = temp.next; + } + + return this.head; + } + + // print each node's value on its own line + // use your iterate method to be DRY! Don't get caught in the code rain, brrr. + print() { + this.iterate(node => console.log(node.value)); + } + + // find the node with the target value and return it + // if not found return null, use your iterate method to be DRY! + find(target) { + let result = null; + + this.iterate(node => { + if (node.value === target) { + result = node; + + return true; + } + }); + + return result; + } + + // add the node to the start of the list, no nodes should be removed + // MODIFY TO UPDATE PREV + addFirst(node) { + node.next = this.head; + + if (this.head !== null) { + this.head.prev = node; + } + + this.head = node; + } + + // add node to end of list, no nodes should be removed + // you may wish to use the iterate method + // MODIFY TO UPDATE PREV + addLast(node) { + if (this.head === null) { + this.head = node; + return; + } + + this.iterate(currNode => { + if (currNode.next === null) { + currNode.next = node; + node.prev = currNode; + return true; + } + }); + } + + // remove the first Node in the list and update head + // and return the removed node + // MODIFY TO UPDATE PREV + removeFirst() { + const oldHead = this.head; + + if (this.head !== null) { + this.head = this.head.next; + } + + if (this.head !== null) { + this.head.prev = null; + } + + return oldHead; + } + + // remove the tail node, iterate may be helpful + // return the node you just removed + removeLast() { + if (this.head === null || this.head.next === null) { + return this.removeFirst(); + } + + let oldTail = null; + + this.iterate(node => { + if (node.next.next === null) { + oldTail = node.next; + node.next = null; + return true; + } + }); + + return oldTail; + } + + // replace the node at the given index with the given node + // MODIFY TO UPDATE PREV + replace(idx, node) { + if (idx === 0) { + this.removeFirst(); + this.addFirst(node); + return node; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + node.next = currNode.next.next; + currNode.next = node; + node.prev = currNode; + + if (currNode.next.next !== null) { + currNode.next.next.prev = node; + } + + return true; + } + }); + + return node; + } + + // insert the node at the given index + // no existing nodes should be removed or replaced + // MODIFY TO UPDATE PREV + insert(idx, node) { + if (idx === 0) { + this.addFirst(node); + return; + } + + this.iterate((currNode, count) => { + if (count === idx - 1) { + const oldNext = currNode.next; + currNode.next = node; + node.next = oldNext; + node.prev = currNode; + + if (oldNext !== null) { + oldNext.prev = node; + } + + return true; + } + }); + } + + // remove the node at the given index, and return it + // MODIFY TO UPDATE PREV + remove(idx) { + if (idx === 0) { + return this.removeFirst(); + } + + let oldNode = null; + + this.iterate((node, count) => { + if (count === idx - 1) { + oldNode = node.next; + node.next = node.next.next; + + if (node.next !== null) { + node.next.prev = node; + } + + return true; + } + }); + + return oldNode; + } + + clear() { + this.head = null; + } +} + +class Node { + constructor(value = null, next = null, prev = null) { + this.value = value; + this.next = next; + this.prev = prev; + } +} + +if (require.main === module) { + let node = new Node('one'); + node.prev = new Node('zero'); + + console.log("NODE TESTING PREV VALUES"); + console.log(`Node prev value is zero: ${node.prev.value}`); + console.log(`Node prev.prev is null: ${node.prev.prev}`); + console.log("---------------------------------------------------------"); + + node = new Node('one'); + let list = new DoublyLinkedList(node); + list.addFirst(new Node('zero')); + + console.log("TEST PREV WHEN CALLING ADD FIRST"); + console.log(`Node prev value is zero: ${node.prev.value}`); + console.log(`Node prev.next value is one: ${node.prev.next.value}`); + console.log("---------------------------------------------------------"); + + let lastNode = new Node('last'); + list.addLast(lastNode); + console.log("TEST PREV WHEN CALLING ADD LAST"); + console.log(`Last node prev value is one: ${lastNode.prev.value}`); + console.log("---------------------------------------------------------"); + + console.log("TEST PREV WHEN CALLING REMOVE FIRST"); + list.removeFirst(); + console.log(`Head node's prev should be null: ${list.head.prev}`); + console.log("---------------------------------------------------------"); + + // one -> last + list.replace(0, new Node('zero')); + console.log("TEST PREV WHEN REPLACING HEAD"); + console.log(`Head node's prev is null: ${list.head.prev}`); + + // zero -> last + list.replace(1, new Node('one')); + console.log("TEST PREV WHEN REPLACING TAIL"); + console.log(`Tail node's prev is zero: ${list.head.next.prev.value}`); + + let head = new Node('zero'); + let one = new Node('one'); + let two = new Node('two'); + head.next = one + one.next = two + one.prev = head + two.prev = one + list = new DoublyLinkedList(head); + + // zero -> one -> two + replacing = new Node('replacing'); + list.replace(1, replacing) + // zero -> replacing -> two + console.log("TEST PREV WHEN REPLACING MIDDLE NODE"); + console.log(`Middle node prev value is zero: ${replacing.prev.value}`); + console.log(`Last node prev value is replacing: ${two.prev.value}`); + console.log("---------------------------------------------------------"); + + // zero -> replacing -> two + node = new Node('insert'); + list.insert(0, node); + // insert -> zero -> replacing -> two + console.log("TEST PREV WHEN INSERTING 0TH NODE"); + console.log(`Head node prev is null: ${list.head.prev}`); + console.log(`Head node next.prev value is insert: ${list.head.next.prev.value}`); + + node = new Node('at tail'); + list.insert(4, node); + // insert -> zero -> replacing -> two -> at tail + console.log("TEST PREV WHEN INSERTING TAIL NODE"); + console.log(`Tail node prev is two: ${node.prev.value}`); + + node = new Node('in middle'); + list.insert(2, node); + // insert -> zero -> in middle -> replacing -> two -> at tail + console.log("TEST PREV WHEN INSERTING IN MIDDLE"); + console.log(`Middle node prev value is zero: ${node.prev.value}`); + console.log(`Middle node next.prev is in middle: ${node.next.prev.value}`); + console.log("---------------------------------------------------------"); + + // insert -> zero -> in middle -> replacing -> two -> at tail + list.remove(0); + // zero -> in middle -> replacing -> two -> at tail + console.log("TEST PREV WHEN REMOVING 0TH NODE"); + console.log(`Head node's prev value is null: ${list.head.prev}`); + + list.remove(2); + // zero -> in middle -> two -> at tail + console.log("TEST PREV WHEN REMOVING IN MIDDLE"); + console.log(`Node at index 2 prev's value is in middle: ${list.head.next.next.prev.value}`); + + list.remove(3); + // zero -> in middle -> two + console.log("TEST PREV WHEN REMOVING TAIL"); + console.log(`Tail node's prev should still point to node with value in middle: ${list.head.next.next.prev.value}`); + console.log("---------------------------------------------------------"); +} + +module.exports = { + Node, DoublyLinkedList +}; diff --git a/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/solutions/doubly_linked_list.rb b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/solutions/doubly_linked_list.rb new file mode 100644 index 00000000..d9477ecc --- /dev/null +++ b/07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list/solutions/doubly_linked_list.rb @@ -0,0 +1,249 @@ +class DoublyLinkedList + attr_accessor :head + + def initialize(head = nil) + @head = head + end + + def iterate + count = 0 + temp = @head + + until temp.nil? + yield(temp, count) + temp = temp.next_node + count += 1 + end + + @head + end + + def print + iterate { |node| puts node.value } + end + + def find(target) + iterate do |node| + return node if node.value == target + end + + nil + end + + # MODIFY TO UPDATE PREV_NODE + def add_first(node) + node.next_node = @head + @head.prev_node = node unless @head.nil? + @head = node + end + + # MODIFY TO UPDATE PREV_NODE + def add_last(node) + if @head.nil? + @head = node + return + end + + iterate do |curr_node| + if curr_node.next_node.nil? + curr_node.next_node = node + node.prev_node = curr_node + return + end + end + end + + # MODIFY TO UPDATE PREV_NODE + def remove_first + old_head = @head + @head = @head.next_node unless @head.nil? + @head.prev_node = nil unless @head.nil? + old_head + end + + def remove_last + return remove_first if @head.nil? || @head.next_node.nil? + + iterate do |node| + if node.next_node.next_node.nil? + old_tail = node.next_node + node.next_node = nil + return old_tail + end + end + end + + # MODIFY TO UPDATE PREV_NODE + def replace(idx, node) + if idx.zero? + remove_first + add_first(node) + return node + end + + iterate do |curr_node, count| + if count == idx - 1 + node.next_node = curr_node.next_node.next_node + curr_node.next_node = node + node.prev_node = curr_node + + unless curr_node.next_node.next_node.nil? + curr_node.next_node.next_node.prev_node = node + end + + return node + end + end + end + + # MODIFY TO UPDATE PREV_NODE + def insert(idx, node) + if idx.zero? + add_first(node) + return + end + + iterate do |curr_node, count| + if count == idx - 1 + old_next = curr_node.next_node + curr_node.next_node = node + node.next_node = old_next + old_next.prev_node = node unless old_next.nil? + node.prev_node = curr_node + + return + end + end + end + + # MODIFY TO UPDATE PREV_NODE + def remove(idx) + if idx.zero? + return remove_first + end + + iterate do |node, count| + if count == idx - 1 + old_node = node.next_node + node.next_node = node.next_node.next_node + node.next_node.prev_node = node unless node.next_node.nil? + + return old_node + end + end + end + + def clear + @head = nil + end +end + +class Node + attr_accessor :value, :next_node, :prev_node + + def initialize(value = nil, next_node = nil, prev_node = nil) + @value = value + @next_node = next_node + @prev_node = nil + end +end + +if __FILE__ == $PROGRAM_NAME + node = Node.new('one') + node.prev_node = Node.new('zero') + + puts "NODE TESTING PREV VALUES" + puts "Node prev value is zero: #{node.prev_node.value}" + puts "Node prev.prev is null: #{node.prev_node.prev_node}" + puts "---------------------------------------------------------" + + node = Node.new('one') + list = DoublyLinkedList.new(node) + list.add_first(Node.new('zero')) + + puts "TEST PREV WHEN CALLING ADD FIRST" + puts "Node prev value is zero: #{node.prev_node.value}" + puts "Node prev.next value is one: #{node.prev_node.next_node.value}" + puts "---------------------------------------------------------" + + last_node = Node.new('last') + list.add_last(last_node) + puts "TEST PREV WHEN CALLING ADD LAST" + puts "Last node prev value is one: #{last_node.prev_node.value}" + puts "---------------------------------------------------------" + + puts "TEST PREV WHEN CALLING REMOVE FIRST" + list.remove_first + puts "Head node's prev should be nil: #{list.head.prev_node}" + puts "---------------------------------------------------------" + + # one -> last + list.replace(0, Node.new('zero')) + puts "TEST PREV WHEN REPLACING HEAD" + puts "Head node's prev is null: #{list.head.prev_node}" + + # zero -> last + list.replace(1, Node.new('one')) + puts "TEST PREV WHEN REPLACING TAIL" + puts "Tail node's prev is zero: #{list.head.next_node.prev_node.value}" + + head = Node.new('zero') + one = Node.new('one') + two = Node.new('two') + head.next_node = one + one.next_node = two + one.prev_node = head + two.prev_node = one + list = DoublyLinkedList.new(head) + + # zero -> one -> two + replacing = Node.new('replacing') + list.replace(1, replacing) + # zero -> replacing -> two + puts "TEST PREV WHEN REPLACING MIDDLE NODE" + puts "Middle node prev value is zero: #{replacing.prev_node.value}" + puts "Last node prev value is replacing: #{two.prev_node.value}" + puts "---------------------------------------------------------" + + # zero -> replacing -> two + node = Node.new('insert') + list.insert(0, node) + # insert -> zero -> replacing -> two + puts "TEST PREV WHEN INSERTING 0TH NODE" + puts "Head node prev is null: #{list.head.prev_node}" + puts "Head node next.prev value is insert: #{list.head.next_node.prev_node.value}" + + node = Node.new('at tail') + list.insert(4, node) + # insert -> zero -> replacing -> two -> at tail + puts "TEST PREV WHEN INSERTING TAIL NODE" + puts "Tail node prev is two: #{node.prev_node.value}" + + node = Node.new('in middle') + list.insert(2, node) + # insert -> zero -> in middle -> replacing -> two -> at tail + puts "TEST PREV WHEN INSERTING IN MIDDLE" + puts "Middle node prev value is zero: #{node.prev_node.value}" + puts "Middle node next.prev is in middle: #{node.next_node.prev_node.value}" + puts "---------------------------------------------------------" + + # insert -> zero -> in middle -> replacing -> two -> at tail + list.remove(0) + # zero -> in middle -> replacing -> two -> at tail + puts "TEST PREV WHEN REMOVING 0TH NODE" + puts "Head node's prev value is nil: #{list.head.prev_node}" + + list.remove(2) + # zero -> in middle -> two -> at tail + puts "TEST PREV WHEN REMOVING IN MIDDLE" + puts "Node at index 2 prev's value is in middle: #{list.head.next_node.next_node.prev_node.value}" + + list.remove(3) + # zero -> in middle -> two + puts "TEST PREV WHEN REMOVING TAIL" + puts "Tail node's prev should still point to node with value in middle: #{list.head.next_node.next_node.prev_node.value}" + puts "---------------------------------------------------------" +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/08-pairing-exercise-2/00-whiteboard-big-o/README.md b/08-pairing-exercise-2/00-whiteboard-big-o/README.md new file mode 100644 index 00000000..fb22aa86 --- /dev/null +++ b/08-pairing-exercise-2/00-whiteboard-big-o/README.md @@ -0,0 +1,22 @@ +# Whiteboard Big O + +## Introduction + +For this activity, you and your partner will take turns calculating the time +complexity using Big O notation for a problem you solved previously. Think of +this exercise as being more collaborative and less formal than other +whiteboarding exercises. In other words, you and your partner should communicate +freely and work together to come up with the appropriate calculation. + +## Instructions + +- You and your partner should each choose a different problem that you've + already solved +- Share your solution to the chosen problem either on a whiteboard or via a + screenshare +- Determine the time complexity for your solution + - Explain your thinking and work with your partner to come up with the answer + - Take turns typing or whiteboarding + - Plan to start the conversation and whiteboard/type when evaluating your + own solution + - Remember to use the correct notation, e.g. O(n) or O(1) diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/.gitignore b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/README.md b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/README.md new file mode 100644 index 00000000..8ec5081d --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/README.md @@ -0,0 +1,91 @@ +# Days 1-2: Bubble Sort + +Bubble sort is considered one of the simpler sorting algorithms, and it is highly efficient at handling already sorted lists. While it performs well for sorted lists and short lists, it does not perform well for longer lists. As a result, the sorting functions built into programming languages do not use bubble sort. + +``` +Input: [3, 2, 1, 4] +Output: [1, 2, 3, 4] + +Input: [] +Output: [] +``` + +## How Does Bubble Sort Work? + +Bubble sort sorts a list in place. In other words, it does not create a new Array; instead, it modifies the Array that was passed to the function as an argument. + +To achieve this in-place sorting, bubble sort swaps elements when they are in the incorrect order. When no swaps occur, the Array is considered sorted. This algorithm iterates over an Array over and over until it is sorted. If the input Array is already sorted, it iterates over it only once because no swaps occur. + +Let's look at a step-by-step example with an unsorted list: + +``` +Input: [2, 3, 1] +// 2 is less than 3, so it stays where it is +// But 1 is less than 3 so those two values are swapped +Pass 1: [2, 1, 3] + +// 1 is less than 2, so those values are swapped +// 2 is less than 3, so those values stay as is +Pass 2: [1, 2, 3] + +// On this final pass, no swaps occur, so Array is sorted +Pass 3: [1, 2, 3] +``` + +And here's what happens with a sorted list: + +``` +Input: [1, 2, 3] + +// No swaps occur when iterating over Array +// Input Array is returned as is +Pass 1: [1, 2, 3] +``` + +## Implement Bubble Sort + +Given what you know about bubble sort, implement your own version. Remember, we need to sort the Array in place, so there's no need to declare a new Array and push to it: be sure to return the input Array with its values in order. + +Lastly, you may wish to look up how to swap values in whichever language you choose to solve the problem in. Some languages, like Ruby and JavaScript, provide shortcuts! + +When you write up the explanation of your solution, don't forget to calculate Big O for its time complexity. + +Also take some time to think about what you learned by solving this challenge. What problem solving techniques did you use, coding or otherwise? How can they help you solve other problems? + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/bubble_sort.js b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/bubble_sort.js new file mode 100644 index 00000000..bf6d925d --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/bubble_sort.js @@ -0,0 +1,29 @@ +function bubbleSort(arr) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [1, 2, 3, 4]"); + console.log("=>", bubbleSort([3, 2, 1, 4])); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log("=>", bubbleSort([1, 2, 3])); + + console.log(""); + + console.log("Expecting: []"); + console.log("=>", bubbleSort([])); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log("=>", bubbleSort([2, 3, 1])); +} + +module.exports = bubbleSort; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/package.json b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/package.json new file mode 100644 index 00000000..0ff1defc --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "bubble_sort", + "version": "1.0.0", + "description": "bubble sort", + "main": "bubble_sort.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/tests/bubble_sort.test.js b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/tests/bubble_sort.test.js new file mode 100644 index 00000000..82f8ca1e --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/javascript/tests/bubble_sort.test.js @@ -0,0 +1,40 @@ +const bubbleSort = require("../bubble_sort"); + +test("returns the provided empty Array when it's provided as an argument", () => { + const input = []; + + expect(bubbleSort(input)).toBe(input); + expect(bubbleSort(input)).toStrictEqual([]); +}); + +test("can handle an Array containing a single element", () => { + const input = [4]; + + expect(bubbleSort(input)).toBe(input); + expect(bubbleSort(input)).toStrictEqual([4]); +}); + +test("can handle an Array containing two elements", () => { + const input = [5, 2]; + + expect(bubbleSort(input)).toBe(input); + expect(bubbleSort(input)).toStrictEqual([2, 5]); +}); + +test("can handle an Array containing three elements", () => { + const input = [5, 2, 1]; + + expect(bubbleSort(input)).toBe(input); + expect(bubbleSort(input)).toStrictEqual([1, 2, 5]); +}); + +test("can handle an Array containing many elements", () => { + const input = [6, -2, 0, 8, 7, 8, 6, 0, 5, 1]; + + expect(bubbleSort(input)).toBe(input); + expect(bubbleSort(input)).toStrictEqual([-2, 0, 0, 1, 5, 6, 6, 7, 8, 8]); +}); + +test("can handle a sorted Array", () => { + expect(bubbleSort([-10, 1, 2, 3, 4])).toStrictEqual([-10, 1, 2, 3, 4]); +}); diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/.rspec b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/Gemfile b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/bubble_sort.rb b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/bubble_sort.rb new file mode 100644 index 00000000..7b53493b --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/bubble_sort.rb @@ -0,0 +1,32 @@ +def bubble_sort(arr) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [1, 2, 3, 4]" + print "=> " + print bubble_sort([3, 2, 1, 4]) + + puts + + puts "Expecting: [1, 2, 3]" + print "=> " + print bubble_sort([1, 2, 3]) + + puts + + puts "Expecting: []" + print "=> " + print bubble_sort([]) + + puts + + puts "Expecting: [1, 2, 3]" + print "=> " + print bubble_sort([2, 3, 1]) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/spec/bubble_sort_spec.rb b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/spec/bubble_sort_spec.rb new file mode 100644 index 00000000..702b99a9 --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/spec/bubble_sort_spec.rb @@ -0,0 +1,45 @@ +require "./bubble_sort.rb" + +RSpec.describe "bubble_sort" do + it "returns the provided empty Array when it's provided as an argument" do + input = [] + + expect(bubble_sort(input)).to be(input) + end + + it "returns an empty Array when the given an empty Array as an argument" do + expect(bubble_sort([])).to eq([]) + end + + it "can handle an Array containing a single element" do + input = [4] + + expect(bubble_sort(input)).to be(input) + expect(bubble_sort(input)).to eq([4]) + end + + it "can handle an Array containing two elements" do + input = [5, 2] + + expect(bubble_sort(input)).to be(input) + expect(bubble_sort(input)).to eq([2, 5]) + end + + it "can handle an Array containing three elements" do + input = [5, 2, 1] + + expect(bubble_sort(input)).to be(input) + expect(bubble_sort(input)).to eq([1, 2, 5]) + end + + it "can handle an Array containing many elements" do + input = [6, -2, 0, 8, 7, 8, 6, 0, 5, 1] + + expect(bubble_sort(input)).to be(input) + expect(bubble_sort(input)).to eq([-2, 0, 0, 1, 5, 6, 6, 7, 8, 8]) + end + + it "can handle a sorted Array" do + expect(bubble_sort([-10, 1, 2, 3, 4])).to eq([-10, 1, 2, 3, 4]) + end +end \ No newline at end of file diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/spec/spec_helper.rb b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/solutions/bubble_sort.js b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/solutions/bubble_sort.js new file mode 100644 index 00000000..90e1087b --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/solutions/bubble_sort.js @@ -0,0 +1,91 @@ +function bubbleSort(arr) { + let sorted = false; + + while (!sorted) { + sorted = true; + + arr.forEach((num, idx) => { + if (idx === arr.length - 1) { + return; + } + + if (num > arr[idx + 1]) { + [arr[idx], arr[idx + 1]] = [arr[idx + 1], arr[idx]]; + sorted = false; + } + }); + } + + return arr; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [1, 2, 3, 4]"); + console.log(bubbleSort([3, 2, 1, 4])); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log(bubbleSort([1, 2, 3])); + + console.log(""); + + console.log("Expecting: []"); + console.log(bubbleSort([])); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log(bubbleSort([2, 3, 1])); + + console.log(""); + + console.log("Expecting: [1]"); + console.log(bubbleSort([1])); + + console.log(""); + + console.log("Expecting: [1, 3]"); + console.log(bubbleSort([3, 1])); + + console.log(""); + + console.log("Expecting: [-2, 0, 0, 1, 5, 6, 6, 7, 8, 8]"); + console.log(bubbleSort([6, -2, 0, 8, 7, 8, 6, 0, 5, 1])); +} + +module.exports = bubbleSort; + +// Please add your pseudocode to this file +// And a written explanation of your solution +// Please add your pseudocode to this file +/************************************************************************************/ +// initialize boolean sorted to false +// +// while sorted is false: +// sorted = true +// iterate over array with index tracking: +// if current element is larger than next element: +// swap those elements in place +// sorted = false +// +// return input array +/************************************************************************************/ + +// And a written explanation of your solution +/************************************************************************************/ +// Since we need to iterate over the array over and over until it's sorted, we need +// to track if it's sorted, so we initialize a Boolean to false to do exactly that. +// Next we need to use a while loop (or something similar) that runs until the Array +// is sorted. This allows us to iterate over the Array as many times as needed. +// Since we want to set sorted to false only if a swap happens, we'll set it to true +// before iterating over the Array. When we iterate over the Array, we always go +// over the whole thing. We compare the value we're iterating over to the next one, +// and if the first one is more than the next one, we swap them. We also set sorted +// to false because of the swap. We'll eventually get to a point where there are no +// swaps and at that point, sorted will remain true and when the iteration ends, +// we'll exit the outer loop and return the Array. +// Big O for time complexity is O(n^2) quadratic time because of the loop within a loop. +// In the worst case we'll end up going over the whole Array roughly once per element. +/************************************************************************************/ \ No newline at end of file diff --git a/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/solutions/bubble_sort.rb b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/solutions/bubble_sort.rb new file mode 100644 index 00000000..4e032df5 --- /dev/null +++ b/09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort/solutions/bubble_sort.rb @@ -0,0 +1,86 @@ +def bubble_sort(arr) + sorted = false + + until sorted + sorted = true + + arr.each_with_index do |num, idx| + break if idx == arr.length - 1 + + if num > arr[idx + 1] + arr[idx], arr[idx + 1] = arr[idx + 1], arr[idx] + sorted = false + end + end + end + + arr +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [1, 2, 3, 4]" + print bubble_sort([3, 2, 1, 4]) + + puts + + puts "Expecting: [1, 2, 3]" + print bubble_sort([1, 2, 3]) + + puts + + puts "Expecting: []" + print bubble_sort([]) + + puts + + puts "Expecting: [1, 2, 3]" + print bubble_sort([2, 3, 1]) + + # Don't forget to add your own! + + puts + + puts "Expecting: [1]" + print bubble_sort([1]) + + puts + + puts "Expecting: [1, 3]" + print bubble_sort([3, 1]) + + puts + + puts "Expecting: [-2, 0, 0, 1, 5, 6, 6, 7, 8, 8]" + print bubble_sort([6, -2, 0, 8, 7, 8, 6, 0, 5, 1]) +end + +# Please add your pseudocode to this file +################################################################################## +# initialize boolean sorted to false +# +# while sorted is false: +# sorted = true +# iterate over array with index tracking: +# if current element is larger than next element: +# swap those elements in place +# sorted = false +# +# return input array +################################################################################## + +# And a written explanation of your solution +################################################################################## +# Since we need to iterate over the array over and over until it's sorted, we need +# to track if it's sorted, so we initialize a Boolean to false to do exactly that. +# Next we need to use a while loop (or something similar) that runs until the Array +# is sorted. This allows us to iterate over the Array as many times as needed. +# Since we want to set sorted to false only if a swap happens, we'll set it to true +# before iterating over the Array. When we iterate over the Array, we always go +# over the whole thing. We compare the value we're iterating over to the next one, +# and if the first one is more than the next one, we swap them. We also set sorted +# to false because of the swap. We'll eventually get to a point where there are no +# swaps and at that point, sorted will remain true and when the iteration ends, +# we'll exit the outer loop and return the Array. +# Big O for time complexity is O(n^2) quadratic time because of the loop within a loop. +# In the worst case we'll end up going over the whole Array roughly once per element. +################################################################################## \ No newline at end of file diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/.gitignore b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/README.md b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/README.md new file mode 100644 index 00000000..feb61cf2 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/README.md @@ -0,0 +1,224 @@ +# Days 3-5: Merge Sort + +Merge sort is an efficient sorting algorithm that uses a divide and conquer approach to sorting elements. In other words, it sorts small subsets of the list, merges those subsets, sorts those, and carries on until the whole list has been sorted. It is commonly implemented as a recursive algorithm. + +![Merge Sort animation](./merge_sort.gif) + +## How Does Merge Sort Work? + +![Merge Sort image](./merge_sort.png) + +Let's say we have an Array consisting of four elements. First, we divide that into two Arrays of two elements each. Since this is not the smallest possible division, we then divide those into four Arrays total consisting of one element each: + +``` +[4, 3, 2, 1] +[4, 3] [2, 1] +[4] [3] [2] [1] +``` + +Next, we sort and combine those elements until we have a merged and sorted list: + +``` +Sort [4] with [3] => [3, 4] +Sort [2] with [1] => [1, 2] +Sort [3, 4] with [1, 2] => [1, 2, 3, 4] +``` + +It is common to declare two functions (or more) when implementing a merge sort. The main function is recursive: it divides the list and merges the sorted pieces. It calls a helper function, which might be recursive or iterative. The helper function merges the pieces of the list into a sorted list, and returns it. + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +You should also think of what the time complexity is for this algorithm. This is a tough one because you have to think about both the recursive process and the iterative process to come up with an answer for Big O. You might want to search the web for this one. Check out this [StackExchange discussion](https://softwareengineering.stackexchange.com/questions/297160/why-is-mergesort-olog-n). + +## 1. Implement the Helper Function `merge` + +`merge` takes two arguments, both of which are Arrays. **Each of those Arrays will already be sorted.** It then merges those Arrays into one sorted Array and returns it. It merges and sorts them by comparing the first element of each Array. The smallest one is removed and pushed onto a new result Array. It does this until one of the Arrays is empty, and then pushes any remaining values onto the result. + +Here is an example of what happens during this process: + +``` +input 1 = [1, 2] +input 2 = [0, 6] +result = [] + +Is 1 < 0? + No. Remove 0 and push onto result. + +input 1 = [1, 2] +input 2 = [6] +result = [0] + +Is 1 < 6? + Yes. Remove 1 and push onto result. + +input 1 = [2] +input 2 = [6] +result = [0, 1] + +Is 2 < 6? + Yes. Remove 2 and push onto result. + +input 1 = [] +input 2 = [6] +result = [0, 1, 2] + +input 1 is empty, add remainder of input 2 to result: +result = [0, 1, 2, 6] +``` + +Be sure to test your `merge` method with Arrays of different sizes to ensure it's working. What sizes might those Arrays be? Will both inputs always be the same size? If your `merge` method is working, it'll return a sorted list: + +``` +merge([0, 1], [-2, 4]) +=> [-2, 0, 1, 4] +``` + +And remember, each argument Array to `merge` will already be sorted: + +``` +// Valid inputs +merge([2, 10], [9, 10, 12]) + +// Invalid inputs +merge([10, 3], [10, 9, 2]) +``` + +Do not worry about invalid inputs! Just ensure your method works for valid inputs before moving on. You'll need to rely on your own testing skills here! You've got this! + +## 2. Implement the Main Function `merge_sort`/`mergeSort` + +The main function recursively divides the unsorted input array into pieces until those pieces are as small as possible. It then feeds those pieces to the `merge` helper method. It then combines the results from calling `merge` into one final sorted list that is returned. + +Let's take this step by step by breaking this process down into chunks we can test. Keep in mind that you'll be responsible for testing each step. Our tests will only check the final result of calling the main method. + +**1. Add the base case** + +We want to divide the input into its smallest possible subsets. What length or lengths might the smallest possible subset be? You can also ask yourself: "What might the smallest possible input be?" or "When do I want to stop dividing the Array and return it?" or "What inputs would already be considered sorted no matter what their contents are?" + +If you're feeling rusty on recursion: the base case, often an `if` statement, is responsible for stopping the recursive calls. + +Test your code. If it's working you'll get the following result: + +``` +Input [] +Output: [] + +Input: [1] +Output: [1] + +Input: [1, 2] +Output: undefined or nil (i.e. default return value for the language you're using) +``` + +**2. Find the middle** + +Store the middle index of the input Array in a variable. Print or return it to check that it's correct. Make sure it's an integer! + +``` +Input: [] +Output: [] // never reaches the middle calculation + +Input: [1] +Output: [1] // never reaches the middle calculation + +Input: [1, 2] +Output: 1 + +Input: [1, 2, 3] +Output: 1 +``` + +Once that's working, be sure to remove any print or return statements you used to test your code. + +**3. Divide the Array** + +Divide the Array into two parts: one part stores all the values up to the middle, and the other part stores all the values from the middle onwards. These are often called `left` and `right`. + +Test your work by printing or returning the two parts. Make sure all of the values from the input are present. + +``` +Input: [1, 2, 3, 4] +Left: [1, 2] +Right: [3, 4] + +Input: [1, 2, 3] +Left: [1] +Right: [2, 3] +// Left [1, 2] and Right [3] is also valid +``` + +Once that's working, be sure to remove any print or return statements you used to test your code. + +**4. Divide more!** + +Earlier, we said that we need to keep dividing the input until it is divided into the smallest possible pieces. Another way of thinking of this is that we need to keep dividing the input until we hit the base case we declared earlier. + +Right now, we are only dividing the list into a `left` side and a `right` side once. How can we keep dividing the list until it's as small as possible? What do we need to do? + +You can test your code by printing the values stored in left and right. If the print statement/s are the very last line/s in your code, you should see the following print out: + +``` +merge_sort([1, 2, 3, 4]) +=> [1] +=> [2] +=> [3] +=> [4] +``` + +Once that's working, be sure to remove any print or return statements you used to test your code. + +**5. Sort and merge** + +We still haven't called our helper method `merge`, and it's getting lonely. If you recall from earlier in this README, `merge` takes two sorted lists and sorts and merges them into one list. What might we do with this method? What might we provide to it as arguments? + +At the end of this step, you should be done! + +``` +merge_sort([1, 2, 3]) +=> [1, 2, 3] + +merge_sort([-10, 5, 100, -100]) +=> [-100, -10, 5, 100] +``` + +**6. Take some time to think** + +Take some time to understand what's happening as the algorithm recurses. What does the stack look like? What's in each frame? Can you plot it out on paper for small inputs? Try plotting it out when the input Array has 2 elements, 3 elements, or 4 elements. You can also watch your solution in action using this [tool](http://pythontutor.com/visualize.html#mode=edit): don't forget to choose the right language, and then call your function with an argument! + +Also think about the problem solving techniques you used. How can you use what you've learned to solve other problems? What did you learn about recursion/recursive programming? + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/merge_sort.js b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/merge_sort.js new file mode 100644 index 00000000..2b75a606 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/merge_sort.js @@ -0,0 +1,28 @@ +function merge(arr1, arr2) { + // type your code here +} + +function mergeSort(arr) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [1, 2]"); + console.log("=>", mergeSort([2, 1])); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log("=>", mergeSort([1, 2, 3])); + + console.log(""); + + console.log("Expecting: [-10, 0, 2, 2, 5, 10, 20]"); + console.log("=>", mergeSort([10, -10, 0, 2, 20, 5, 2])); +} + +module.exports = mergeSort; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/package.json b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/package.json new file mode 100644 index 00000000..ed686838 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "merge_sort", + "version": "1.0.0", + "description": "merge sort", + "main": "merge_sort.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/tests/merge_sort.test.js b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/tests/merge_sort.test.js new file mode 100644 index 00000000..8de5ea94 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/javascript/tests/merge_sort.test.js @@ -0,0 +1,35 @@ +const mergeSort = require("../merge_sort"); + +test("can sort an empty Array", () => { + expect(mergeSort([])).toEqual([]); +}); + +test("can sort an Array with one element", () => { + expect(mergeSort([2])).toEqual([2]); +}); + +test("can sort an Array with two elements", () => { + expect(mergeSort([5, 3])).toEqual([3, 5]); +}); + +test("can sort an Array with three elements", () => { + expect(mergeSort([10, -1, 5])).toEqual([-1, 5, 10]); +}); + +test("can sort a large Array with an even number of elements", () => { + const arr = [90, 4, 5, -100, 5, 78, 3, 19, 1000, -900, 54, 34, 3, 5]; + + expect(mergeSort(arr)).toEqual(arr.sort((a, b) => a - b)); +}); + +test("can sort a large Array with an odd number of elements", () => { + const arr = [90, 4, 5, -100, 5, 78, 19, 1000, -900, 54, 34, 3, 5]; + + expect(mergeSort(arr)).toEqual(arr.sort((a, b) => a - b)); +}); + +test("can handle an already sorted Array", () => { + const arr = [-10, -5, 4, 6, 7]; + + expect(mergeSort(arr)).toEqual(arr); +}); diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/merge_sort.gif b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/merge_sort.gif new file mode 100644 index 0000000000000000000000000000000000000000..daa0c86b2df3e19322e15a13271fd39e1d0cae4f GIT binary patch literal 94355 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�Rt+KU)15MC-)0VZuG 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 literal 0 HcmV?d00001 diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/merge_sort.png b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/merge_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..f6256be6f0acaa8d30c5ca02ba3587ede99c9eef GIT binary patch literal 38796 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 z z3k%Xc0@-CFhbBOAeJgb9%`IB$iSf)jDDE`@X4eoB$`Q^ z>sQ~_`zl=UE>wdB7E}o79`!XZWkD{q`)rX(Ok2Jfg{Ce#4d>j$MIZ1 zOTVU(5ev?h5LE~vJ>Xz=R-jPVKkZ=6z87E6KRg_SJkX}+EC!|@Ty_Hr$2R0C+%Z*J zTG|{Kwl?@r+w`2$dRd$(q0&(iXkJPL$cI5RIpy64WCsbW=PThBOZHt}N*>hZm_{cQ zC_P4wng>W^680^dA&FX{IRr1R`lm5b16~Mq&CJ+~$1|uz-fAfm9E}Eyd5?Erk+q1^ z#B1sIaB|9xRq%Fv0uTlO!I!llW1uJfy1)NQQ_c+YzBIJ(WBBIoFaQ4M4xuIB4p&1M zf+J%vh|7n8qs|^oX8}%;0kfBa;w*Xa#wyaQMZz#BT@i(lLqtb}X?72^Y$67>xn^v{ z{TK8Mb|87%ndC$|5?u_X`}bDuRTvbA%C!f?EBzseg@o^8`3c^Na5mG{zo!5miGoPX zE5AlM51eJs^5@qkx+*!OMPYw#f$k;T;l{B}V+%B@xmCWKA%KCLHijE!

    bTf#GI@ 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 Nxye}L", merge_sort([2, 1]) + + puts + + puts "Expecting: [1, 2, 3]" + puts "=>", merge_sort([1, 2, 3]) + + puts + + puts "Expecting: [-10, 0, 2, 2, 5, 10, 20]" + puts "=>", merge_sort([10, -10, 0, 2, 20, 5, 2]) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/spec/merge_sort_spec.rb b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/spec/merge_sort_spec.rb new file mode 100644 index 00000000..f0e263e7 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/spec/merge_sort_spec.rb @@ -0,0 +1,37 @@ +require "./merge_sort.rb" + +RSpec.describe "merge_sort" do + it "can sort an empty Array" do + expect(merge_sort([])).to eq([]) + end + + it "can sort an Array with one element" do + expect(merge_sort([2])).to eq([2]) + end + + it "can sort an Array with two elements" do + expect(merge_sort([5, 3])).to eq([3, 5]) + end + + it "can sort an Array with three elements" do + expect(merge_sort([10, -1, 5])).to eq([-1, 5, 10]) + end + + it "can sort a large Array with an even number of elements" do + arr = [90, 4, 5, -100, 5, 78, 3, 19, 1000, -900, 54, 34, 3, 5] + + expect(merge_sort(arr)).to eq(arr.sort) + end + + it "can sort a large Array with an odd number of elements" do + arr = [90, 4, 5, -100, 5, 78, 19, 1000, -900, 54, 34, 3, 5] + + expect(merge_sort(arr)).to eq(arr.sort) + end + + it "can handle an already sorted Array" do + arr = [-10, -5, 4, 6, 7] + + expect(merge_sort(arr)).to eq(arr) + end +end \ No newline at end of file diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/spec/spec_helper.rb b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/solutions/merge_sort.js b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/solutions/merge_sort.js new file mode 100644 index 00000000..ed8c5fd4 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/solutions/merge_sort.js @@ -0,0 +1,89 @@ +function merge(arr1, arr2) { + const result = []; + + while (arr1.length && arr2.length) { + result.push((arr1[0] < arr2[0]) ? arr1.shift() : arr2.shift()); + } + + return [...result, ...arr1, ...arr2]; +} + +function mergeSort(arr) { + if (arr.length < 2) { + return arr; + } + + const middle = Math.floor(arr.length / 2); + const left = mergeSort(arr.slice(0, middle)); + const right = mergeSort(arr.slice(middle)); + + return merge(left, right); +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [1, 2]"); + console.log(mergeSort([2, 1])); + + console.log(""); + + console.log("Expecting: [1, 2, 3]"); + console.log(mergeSort([1, 2, 3])); + + console.log(""); + + console.log("Expecting: [-10, 0, 2, 2, 5, 10, 20]"); + console.log(mergeSort([10, -10, 0, 2, 20, 5, 2])); + + console.log(""); + + console.log("Expecting: []"); + console.log(mergeSort([])); + + console.log(""); + + console.log("Expecting: [3]"); + console.log(mergeSort([3])); +} + +module.exports = mergeSort; + +// Please add your pseudocode to this file +/**************************************************************************** + * return array if length < 2 + * + * initialize middle by rounding down length / 2 + * initialize left with first half of array (0 to middle, exclusive) + * initialize right with second half (middle to end inclusive) + * + * recursively divide left and store it in left + * recursively divide right and store it in right + * + * return the result of sorting and merging left and right + * **************************************************************************/ + +// And a written explanation of your solution +/**************************************************************************** + * I started by thinking about when I'd want to return the input as is. If the + * input is 1 element or less, I can just return it, so I made that my base case. + * Next I divided the input into the left half and the right half. Since it needs + * to be divided until each side of the list is as small as possible, I placed + * my recursive calls there, so that the left and right would be divided until + * they hit the base case. If I think about a small input, such as a list with + * only 2 numbers, it would recurse like so: + * Initial call: mergeSort([2, 1]) + * left = mergeSort([2]) + * // Pause ^, and then return [2] up the stack, and store in left + * right = mergeSort([1]) + * // Pause ^, and then return [1] up the stack, and store in right + * + * My list still needs to be sorted and merged. So now I can call my helper + * function: merge(left, right) => merge([2], [1]) => [1, 2] + * + * Since my helper function sorts and merges lists, I can return its result. + * If the list is larger than 2 elements, it'll return the sorted portion up + * the stack to the previous frame, where it'll then be merged with the other + * portion of the list that was sorted and merged. It'll keep on doing this + * until there are no frames left on the stack, resulting in it returning the + * entire list as one sorted array. + * **************************************************************************/ \ No newline at end of file diff --git a/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/solutions/merge_sort.rb b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/solutions/merge_sort.rb new file mode 100644 index 00000000..b19f07f4 --- /dev/null +++ b/09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort/solutions/merge_sort.rb @@ -0,0 +1,85 @@ +def merge(arr1, arr2) + result = [] + + while arr1.length > 0 && arr2.length > 0 + result.push arr1.first < arr2.first ? arr1.shift : arr2.shift + end + + result + arr1 + arr2 +end + +def merge_sort(arr) + return arr if arr.length < 2 + + middle = arr.length / 2 + left = merge_sort(arr[0...middle]) + right = merge_sort(arr[middle..-1]) + + merge(left, right) +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [1, 2]" + print merge_sort([2, 1]) + + puts + + puts "Expecting: [1, 2, 3]" + print merge_sort([1, 2, 3]) + + puts + + puts "Expecting: [-10, 0, 2, 2, 5, 10, 20]" + print merge_sort([10, -10, 0, 2, 20, 5, 2]) + + # Don't forget to add your own! + puts + + puts "Expecting: []" + print merge_sort([]) + + puts + + puts "Expecting: [3]" + print merge_sort([3]) +end + +# Please add your pseudocode to this file +################################################################################# +# return array if length < 2 +# +# initialize middle by rounding down length / 2 +# initialize left with first half of array (0 to middle, exclusive) +# initialize right with second half (middle to end inclusive) +# +# recursively divide left and store it in left +# recursively divide right and store it in right +# +# return the result of sorting and merging left and right +################################################################################# + +# And a written explanation of your solution +################################################################################# +# I started by thinking about when I'd want to return the input as is. If the +# input is 1 element or less, I can just return it, so I made that my base case. +# Next I divided the input into the left half and the right half. Since it needs +# to be divided until each side of the list is as small as possible, I placed +# my recursive calls there, so that the left and right would be divided until +# they hit the base case. If I think about a small input, such as a list with +# only 2 numbers, it would recurse like so: +# Initial call: mergeSort([2, 1]) +# left = mergeSort([2]) +# // Pause ^, and then return [2] up the stack, and store in left +# right = mergeSort([1]) +# // Pause ^, and then return [1] up the stack, and store in right +# +# My list still needs to be sorted and merged. So now I can call my helper +# function: merge(left, right) => merge([2], [1]) => [1, 2] +# +# Since my helper function sorts and merges lists, I can return its result. +# If the list is larger than 2 elements, it'll return the sorted portion up +# the stack to the previous frame, where it'll then be merged with the other +# portion of the list that was sorted and merged. It'll keep on doing this +# until there are no frames left on the stack, resulting in it returning the +# entire list as one sorted array. +################################################################################# diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/.gitignore b/10-week-8--searching/00-days-1-to-3--binary-search/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/10-week-8--searching/00-days-1-to-3--binary-search/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/README.md b/10-week-8--searching/00-days-1-to-3--binary-search/README.md new file mode 100644 index 00000000..2e92f3b6 --- /dev/null +++ b/10-week-8--searching/00-days-1-to-3--binary-search/README.md @@ -0,0 +1,153 @@ +# Days 1-3: Binary Search + +Binary search is a recursive algorithm that searches a sorted list for a target value. For a sorted list, it is faster than iterating over the entire list until the target is found, since a binary search will not visit every single element in the list. Keep in mind that we perform binary searches on sorted datasets only! + +## How Does It Work? + +Hopefully, you are old enough to remember the phone book (a large alphabetically-ordered directory of businesses and residents of a county or town and their phone numbers) because we're about to dive deep into its pages! + +![Phone Book](./phone_book.jpeg) + +Let's imagine we're searching for Deirdre Xanadu and we're trying to find the page with the "X" names (let's pretend there's only one page of them). Since Deirdre's last name starts with an "X", she'll probably be close to the end of the phonebook. With our good ol' iterative search, we can start at page 1 or the last page, and look at every page until we find our Xanadacious friend. Starting at page 1 will be quick if there are barely any people whose last names start with the letters "A" through "X", and starting at the last page will only be quick if barely any residents' last names start with letters "Z" through "X". In the worst case, Deirdre will be on the last page or first page, depending on where we start our search, and we will have visited every page. + +![Binary Search](./binary_search.gif) + +Now let's use a binary search. Instead of starting on the first or last page, we start in the middle of the book. Let's say the last names on this page start with "M". "M" comes before "X", so we take the second half of the book in our hands, locate the middle page of that portion, and go straight there. Let's say we land on the page of "Y" names. "X" comes before "Y", so we take the part of the book with "M" names up to the part with the "Y" names in our hands, find the middle and go there. Let's say we land on "X": we can check that page for Deirdre Xanadu. We found our friend without going to every page! + +Here's a summary of the process we just used to find Xanadu: + +``` +Go to middle of phone book +Last names start with "M" +Is "M" == "X": + No. +Is "M" < "X": + Yes. Need to search half going from "M" to "Z". + +Go to middle of portion of phone book ("M" to "Z"): +Last names start with "Y" +Is "Y" == "X": + No. +Is "Y" < "X": + No. Need to search first half of portion from "M" to "Y" + +Go to middle of portion of phone book ("M" to "Y") +Last names start with "X" +Is "X" == "X" + Yes! Find Xanadu's entry! +``` + +From the above example, you may notice that we keep dividing the input into two parts: a left side containing everything that comes before the middle, and a right side containing everything after the middle. We then check if the target value we're searching for is less or more than the middle. If the target is less than the middle value, we search the left side. If it's more than the middle, we search the right side. As we search, our input gets smaller and smaller until we either find the target or there is nothing left to search. + +Let's take a look at another example: + +``` +List: [1, 2, 3, 4, 5] +Target: 1 + +Middle: 3 +Is Middle == Target: + No. +Is Middle < Target: + No. +Left: [1, 2] +Search Left for Target + +Middle: 2 +Is Middle == Target: + No. +Is Middle < Target: + No. +Left: [1] +Search Left for Target + +Middle: 1 +Is Middle == Target: + Yes! Return true +``` + +## Implement a Binary Search That Returns True or False + +Let's try something different today. Below you'll find pseudocode for binary search. Your job is to remove the pseudo part! Assume we're only searching for integers. + +``` +function binary_search(array, target): + return false if array is empty + + initialize integer variable middle with middle index of input array + initialize integer variable middle_value with middle value from array + + return true if middle_value == target + + if middle_value > target: + return binary_search(left half of input, target) + else: + return binary_search(right half of input, target) +``` + +And here are some test cases to consider: + +``` +Input: arr = [1, 2, 3], target = 3 +Output: true + +Input: arr = [3, 5, 9], target = 10 +Output: false +``` + +Once you've got that working, take a moment to think. What is the worst-case time complexity for this algorithm? How does that compare to an iterative search. Why does this only work with sorted inputs? + +Also take some time to plot out what's happening on paper using a small input as an example. Maybe try to plot the following: + +- Input: arr = [-10, 4, 9, 30, 31], target: 30 +- Input: arr = [1, 2, 3], target: 5 + +## Bonus: Return the Index of the Target + +Can you modify the algorithm to return the index of the target? If the target isn't in the input Array, return -1. For the bonus, copy your code from earlier into the function called `binary_search_index`/`binarySearchIndex`, and then modify it. That way all of the tests will run correctly. + +``` +Input: arr = [1, 2, 3], target = 1 +Output: 0 + +Input: arr = [4, 7, 20], target = 100 +Output: -1 +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/binary_search.gif b/10-week-8--searching/00-days-1-to-3--binary-search/binary_search.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f701de0cc8825a776c06c50e3915f92e520f23c GIT binary patch literal 163527 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

    -rhN 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%0D;lq2B& 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 j7~gwAMLNk8M@dnEqglivQw", binarySearch([1, 2, 3], 3)); + + console.log(""); + + console.log("Expecting: false"); + console.log("=>", binarySearch([3, 5, 9], 10)); + + // UNCOMMENT FOR BONUS + // console.log(""); + // console.log("Expecting: 0"); + // console.log("=>", binarySearchIndex([1, 2, 3], 1)); + + // console.log(""); + + // console.log("Expecting: -1"); + // console.log("=>", binarySearchIndex([4, 7, 20], 100)); +} + +module.exports = { + binarySearch, + binarySearchIndex +}; + +// Add a written explanation of your solution diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/javascript/package.json b/10-week-8--searching/00-days-1-to-3--binary-search/javascript/package.json new file mode 100644 index 00000000..3a21ca0e --- /dev/null +++ b/10-week-8--searching/00-days-1-to-3--binary-search/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "binary_search", + "version": "1.0.0", + "description": "binary search", + "main": "binary_search.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/javascript/tests/binary_search.test.js b/10-week-8--searching/00-days-1-to-3--binary-search/javascript/tests/binary_search.test.js new file mode 100644 index 00000000..a1918ea8 --- /dev/null +++ b/10-week-8--searching/00-days-1-to-3--binary-search/javascript/tests/binary_search.test.js @@ -0,0 +1,68 @@ +const { binarySearch, binarySearchIndex} = require("../../solutions/binary_search"); + +describe("binarySearch", () => { + test("can handle an empty input list", () => { + expect(binarySearch([], 10)).toBe(false); + }); + + test("can handle a list with one item", () => { + expect(binarySearch([10], 10)).toBe(true); + expect(binarySearch([9], 10)).toBe(false); + }); + + test("can handle a list with two items", () => { + expect(binarySearch([1, 5], 5)).toBe(true); + expect(binarySearch([1, 5], 10)).toBe(false); + }); + + test("can find a value on the left edge of a long list", () => { + expect(binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 1)).toBe(true); + }); + + test("can find a value on the right edge of a long list", () => { + expect(binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 12)).toBe(true); + }); + + test("can find a value somewhere outside the middle in a long list", () => { + expect(binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 10)).toBe(true); + expect(binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 3)).toBe(true); + }); + + test("returns false when the item isn't in a long list", () => { + expect(binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 100)).toBe(false); + }); +}); + + +describe("binarySearchIndex", () => { + test("can handle an empty input list", () => { + expect(binarySearchIndex([], 10)).toBe(-1); + }); + + test("can handle a list with one item", () => { + expect(binarySearchIndex([10], 10)).toBe(0); + expect(binarySearchIndex([9], 10)).toBe(-1); + }); + + test("can handle a list with two items", () => { + expect(binarySearchIndex([1, 5], 5)).toBe(1); + expect(binarySearchIndex([1, 5], 10)).toBe(-1); + }); + + test("can find a value on the left edge of a long list", () => { + expect(binarySearchIndex([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 1)).toBe(0); + }); + + test("can find a value on the right edge of a long list", () => { + expect(binarySearchIndex([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 12)).toBe(11); + }); + + test("can find a value somewhere outside the middle in a long list", () => { + expect(binarySearchIndex([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 10)).toBe(9); + expect(binarySearchIndex([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 3)).toBe(2); + }); + + test("returns -1 when the item isn't in a long list", () => { + expect(binarySearchIndex([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 100)).toBe(-1); + }); +}); diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/phone_book.jpeg b/10-week-8--searching/00-days-1-to-3--binary-search/phone_book.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..38132a468ef1286561148e10fd82a075047ad050 GIT binary patch literal 80104 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", binary_search([1, 2, 3], 3) + + puts + + puts "Expecting: false" + puts "=>", binary_search([3, 5, 9], 10) + + # Don't forget to add your own! + + # UNCOMMENT FOR BONUS + # puts + # puts "Expecting: 0" + # puts "=>", binary_search_index([1, 2, 3], 1) + + # puts + + # puts "Expecting: -1" + # puts "=>", binary_search_index([4, 7, 20], 100) +end + +# Add a written explanation of your solution diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/ruby/spec/binary_search_spec.rb b/10-week-8--searching/00-days-1-to-3--binary-search/ruby/spec/binary_search_spec.rb new file mode 100644 index 00000000..0e8b612a --- /dev/null +++ b/10-week-8--searching/00-days-1-to-3--binary-search/ruby/spec/binary_search_spec.rb @@ -0,0 +1,67 @@ +require "../solutions/binary_search.rb" + +RSpec.describe "binary_search" do + it "can handle an empty input list" do + expect(binary_search([], 10)).to be false + end + + it "can handle a list with one item" do + expect(binary_search([10], 10)).to be true + expect(binary_search([9], 10)).to be false + end + + it "can handle a list with two items" do + expect(binary_search([1, 5], 5)).to be true + expect(binary_search([1, 5], 10)).to be false + end + + it "can find a value on the left edge of a long list" do + expect(binary_search([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 1)).to be true + end + + it "can find a value on the right edge of a long list" do + expect(binary_search([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 12)).to be true + end + + it "can find a value somewhere outside the middle in a long list" do + expect(binary_search([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 10)).to be true + expect(binary_search([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 3)).to be true + end + + it "returns false when the item isn't in a long list" do + expect(binary_search([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 100)).to be false + end +end + +RSpec.describe "binary_search_index" do + it "can handle an empty input list" do + expect(binary_search_index([], 10)).to eq(-1) + end + + it "can handle a list with one item" do + expect(binary_search_index([10], 10)).to eq(0) + expect(binary_search_index([9], 10)).to eq(-1) + end + + it "can handle a list with two items" do + expect(binary_search_index([1, 5], 5)).to eq(1) + expect(binary_search_index([1, 5], 10)).to eq(-1) + end + + it "can find a value on the left edge of a long list" do + expect(binary_search_index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 1)).to eq(0) + end + + it "can find a value on the right edge of a long list" do + expect(binary_search_index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 12)).to eq(11) + end + + it "can find a value somewhere outside the middle in a long list" do + expect(binary_search_index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 10)).to eq(9) + expect(binary_search_index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 3)).to eq(2) + end + + it "returns -1 when the item isn't in a long list" do + expect(binary_search_index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 100)).to eq(-1) + end +end \ No newline at end of file diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/ruby/spec/spec_helper.rb b/10-week-8--searching/00-days-1-to-3--binary-search/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/10-week-8--searching/00-days-1-to-3--binary-search/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/solutions/binary_search.js b/10-week-8--searching/00-days-1-to-3--binary-search/solutions/binary_search.js new file mode 100644 index 00000000..733edfb1 --- /dev/null +++ b/10-week-8--searching/00-days-1-to-3--binary-search/solutions/binary_search.js @@ -0,0 +1,164 @@ +function binarySearch(arr, target) { + if (arr.length === 0) { + return false; + } + + const middle = Math.floor(arr.length / 2); + const middleValue = arr[middle]; + + if (middleValue === target) { + return true; + } + + const searchSide = middleValue > target ? + arr.slice(0, middle) : arr.slice(middle + 1); + + return binarySearch(searchSide, target); +} + +// BONUS: MODIFY YOUR CODE TO RETURN THE INDEX OF THE TARGET, -1 IF NOT FOUND +function binarySearchIndex(arr, target) { + if (arr.length === 0) { + return -1; + } + + const middle = Math.floor(arr.length / 2); + const middleValue = arr[middle]; + + if (middleValue === target) { + return middle; + } + + if (middleValue > target) { + return binarySearchIndex(arr.slice(0, middle), target); + } else { + const idx = binarySearchIndex(arr.slice(middle + 1), target); + + if (idx === -1) { + return -1; + } + + return idx + middle + 1; + } +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: true"); + console.log("=>", binarySearch([1, 2, 3], 3)); + + console.log(""); + + console.log("Expecting: false"); + console.log("=>", binarySearch([3, 5, 9], 10)); + + console.log(""); + + console.log("Expecting: true"); + console.log("=>", binarySearch([3, 5, 9, 20], 3)); + + console.log(""); + + console.log("Expecting: false"); + console.log("=>", binarySearch([3, 5, 9, 20], -10)); + + console.log(""); + + console.log("Expecting: true"); + console.log("=>", binarySearch([3, 5, 9, 20], 9)); + + console.log(""); + + console.log("Expecting: false"); + console.log("=>", binarySearch([], 9)); + + // UNCOMMENT FOR BONUS + console.log(""); + console.log("Expecting: 0"); + console.log("=>", binarySearchIndex([1, 2, 3], 1)); + + console.log(""); + + console.log("Expecting: -1"); + console.log("=>", binarySearchIndex([4, 7, 20], 100)); + + console.log(""); + + console.log("Expecting: 6"); + console.log("=>", binarySearchIndex([1, 2, 3, 4, 5, 6, 7, 8], 7)); + + console.log(""); + + console.log("Expecting: 4"); + console.log("=>", binarySearchIndex([4, 7, 20, 30, 40], 40)); + + console.log(""); + + console.log("Expecting: 2"); + console.log("=>", binarySearchIndex([1, 2, 3, 4, 5, 6, 7, 8], 3)); +} + +module.exports = { + binarySearch, + binarySearchIndex +}; + +// Add a written explanation of your solution +/**************************************************************************************** + * Big O time complexity is O(log n) because the input is divided on each recursive call. + * Let's assume we're searching for a value not in the list. The following number of + * recursive calls are made for the following input sizes: + * Input size 1 => Recursive calls 1 + * Input size 2 => Recursive calls 2 + * Input size 3 => Recursive calls 2 + * Input size 4 => Recursive calls 3 + * Input size 10 => Recursive calls 4 + * + * The true/false algorithm is already explained in the README so I'll explain the bonus. + * To find the index, we have to return the middle index when the target is found, otherwise + * return -1. This is simple when the function only searches left. We can just return the middle, + * or rather the result of calling the function on the left side. Things get a little complicated + * when we search the right side. Since we're always dividing the input into smaller and smaller + * subsets, it means the middle on each recursive call will no longer reflect the actual location + * of the target when searching the right side. This is because the input only contains the right + * half of the previous input. We also need to make sure we return -1 if the target isn't found. + * + * So for the right side, we store the result of the recursive call in a variable. This will be the + * middle idx when the target is found or -1. If it's -1, we need to return that value. Otherwise, + * we return the result of adding the idx to the middle value in that frame and then add one. We add + * one because we removed the middle value from the input when we made the recursive call, and we need + * to make up for that. Let's take a look at a small example: + * + * arr = [1, 2, 3], target = 3, expected output = 2 + * + * If we don't add the middle or 1, we'll get 0 as the result, which is incorrect: + * Initial call: [1, 2, 3] + * Middle: 1 + * Middle value: 2 + * Go Right + * + * Recursive call 1: [3] + * Middle: 0 + * Middle value: 3 + * Found + * Return Middle up stack: 0 + * + * Initial call receives 0 + * Return 0 + * + * Now let's see what happens when we add the middle + 1 every time we go right: + * Initial call: [1, 2, 3] + * Middle: 1 + * Middle value: 2 + * Go Right + * + * Recursive call 1: [3] + * Middle: 0 + * Middle value: 3 + * Found + * Return Middle up stack: 0 + * + * Initial call receives 0 + * Adds Middle and 1 to 0: 0 + 1 (<- value of Middle at initial call) + 1 + * Returns 2 + * ****************************************************************************************/ \ No newline at end of file diff --git a/10-week-8--searching/00-days-1-to-3--binary-search/solutions/binary_search.rb b/10-week-8--searching/00-days-1-to-3--binary-search/solutions/binary_search.rb new file mode 100644 index 00000000..86426756 --- /dev/null +++ b/10-week-8--searching/00-days-1-to-3--binary-search/solutions/binary_search.rb @@ -0,0 +1,150 @@ +def binary_search(arr, target) + return false if arr.empty? + + middle = arr.length / 2 + middle_value = arr[middle] + + return true if middle_value == target + + search_side = middle_value > target ? arr[0...middle] : arr[middle + 1..-1] + + return binary_search(search_side, target) +end + +# BONUS: MODIFY YOUR CODE TO RETURN THE INDEX OF THE TARGET, -1 IF NOT FOUND +def binary_search_index(arr, target) + return -1 if arr.empty? + + middle = arr.length / 2 + middle_value = arr[middle] + + return middle if middle_value == target + + if middle_value > target + return binary_search_index(arr[0...middle], target) + else + idx = binary_search_index(arr[middle + 1..-1], target) + + return -1 if idx == -1 + + return idx + middle + 1 + end +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: true" + puts "=>", binary_search([1, 2, 3], 3) + + puts + + puts "Expecting: false" + puts "=>", binary_search([3, 5, 9], 10) + + puts + + puts "Expecting: true" + puts "=>", binary_search([3, 5, 9, 20], 3) + + puts + + puts "Expecting: false" + puts "=>", binary_search([3, 5, 9, 20], -10) + + puts + + puts "Expecting: true" + puts "=>", binary_search([3, 5, 9, 20], 9) + + puts + + puts "Expecting: false" + puts "=>", binary_search([], 9) + + # Don't forget to add your own! + + # UNCOMMENT FOR BONUS + puts + + puts "Expecting: 0" + puts "=>", binary_search_index([1, 2, 3], 1) + + puts + + puts "Expecting: -1" + puts "=>", binary_search_index([4, 7, 20], 100) + + puts + + puts "Expecting: 6" + puts "=>", binary_search_index([1, 2, 3, 4, 5, 6, 7, 8], 7) + + puts + + puts "Expecting: 4" + puts "=>", binary_search_index([4, 7, 20, 30, 40], 40) + + puts + + puts "Expecting: 2" + puts "=>", binary_search_index([1, 2, 3, 4, 5, 6, 7, 8], 3) +end + +# Add a written explanation of your solution +######################################################################################################## + # Big O time complexity is O(log n) because the input is divided on each recursive call. + # Let's assume we're searching for a value not in the list. The following number of + # recursive calls are made for the following input sizes: + # Input size 1 => Recursive calls 1 + # Input size 2 => Recursive calls 2 + # Input size 3 => Recursive calls 2 + # Input size 4 => Recursive calls 3 + # Input size 10 => Recursive calls 4 + # + # The true/false algorithm is already explained in the README so I'll explain the bonus. + # To find the index, we have to return the middle index when the target is found, otherwise + # return -1. This is simple when the function only searches left. We can just return the middle, + # or rather the result of calling the function on the left side. Things get a little complicated + # when we search the right side. Since we're always dividing the input into smaller and smaller + # subsets, it means the middle on each recursive call will no longer reflect the actual location + # of the target when searching the right side. This is because the input only contains the right + # half of the previous input. We also need to make sure we return -1 if the target isn't found. + # + # So for the right side, we store the result of the recursive call in a variable. This will be the + # middle idx when the target is found or -1. If it's -1, we need to return that value. Otherwise, + # we return the result of adding the idx to the middle value in that frame and then add one. We add + # one because we removed the middle value from the input when we made the recursive call, and we need + # to make up for that. Let's take a look at a small example: + # + # arr = [1, 2, 3], target = 3, expected output = 2 + # + # If we don't add the middle or 1, we'll get 0 as the result, which is incorrect: + # Initial call: [1, 2, 3] + # Middle: 1 + # Middle value: 2 + # Go Right + # + # Recursive call 1: [3] + # Middle: 0 + # Middle value: 3 + # Found + # Return Middle up stack: 0 + # + # Initial call receives 0 + # Return 0 + # + # Now let's see what happens when we add the middle + 1 every time we go right: + # Initial call: [1, 2, 3] + # Middle: 1 + # Middle value: 2 + # Go Right + # + # Recursive call 1: [3] + # Middle: 0 + # Middle value: 3 + # Found + # Return Middle up stack: 0 + # + # Initial call receives 0 + # Adds Middle and 1 to 0: 0 + 1 (<- value of Middle at initial call) + 1 + # Returns 2 +######################################################################################################## \ No newline at end of file diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/.gitignore b/10-week-8--searching/01-day-4--manual-binary-tree/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/README.md b/10-week-8--searching/01-day-4--manual-binary-tree/README.md new file mode 100644 index 00000000..ce461e06 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/README.md @@ -0,0 +1,182 @@ +# Day 4: What Is a Binary Search Tree? + +![Valid tree](./valid_tree.png) + +A binary search tree (BST) is a data structure consisting of nodes: it's called a Binary Search Tree because each node has at most two child Nodes and because its nodes are arranged in a specific order that makes it possible to search quickly. + +Each node has two attributes, often called `left` and `right`, and an additional attribute that stores the `value` of that node. The `left` Node contains a `value` less than the parent node, and the `right` node contains a value that is greater than or equal to the parent node. Any node that has at least one child node is called a parent node, and any node that doesn't have any children is called a leaf node. The node at the top of the tree is called the root node. + +``` +left_node = new Node(1) +=> Node with value 1, left is null or nil, right is null or nil + +right_node = new Node(3) +=> Node with value 3, left is null or nil, right is null or nil + +// Both left_node and right_node are leaf nodes since they have no children + +root_node = new Node(2, left_node, right_node) +=> Node with value 2, left is Node with value 1, right is Node with value 3 +// This is the top of the tree, so it is the root, and because it has children, it's also a parent node +``` + +It is important to note that a BST is not the same as a binary tree. A BST is a type of binary tree that follows specific rules, such as the ability to traverse it in such a way that its nodes' values are output in sorted order. A binary tree, in contrast, can have nodes that are in no specific order whatsoever. + +``` +bst_in_order_traversal(bst_root) +=> [-1, 3, 5, 10] + +binary_tree_in_order_traversal(bt_root) +=> [10, -20, 3, 0, 7] +``` + +## Important Terms + +- root: The top node of the tree, the one where we begin traversing the tree (similar to the zeroth element in an Array). May or may not have children. +- parent: Any node that has at least one child, i.e. its `left` or `right` attribute, or both, point to another node. +- left: An attribute on every node in the tree. The node will have a value lesser than its parent. If it doesn't point to another node, it will be null or nil or some other falsy value. +- right: An attribute on every node in the tree. The node will have a value greater than or equal to its parent. If it doesn't point to another node, it will be null or nil or some other falsy value. +- leaf: A node that has no children. +- subtree: Any time we see a parent node, other than the root node, we can refer to that node and all that branch off of it as a subtree. This is similar to how you think of a portion of an Array as a subset of that Array. + +## BST Rules + +For a BST to be valid, it must adhere to certain rules: + +1. Each node has a maximum of two children (`left` and/or `right` nodes). +2. Every parent node contains a value that is greater than the value of its `left` node and less than the value of its `right` node. +3. All nodes of a left subtree are less than the root node. +4. All nodes of a right subtree are greater than the root node. +5. All subtrees are also valid BSTs. This is just another way of rephrasing points 3 and 4 above. + +It's important to note that a tree with only a root node is considered valid. An empty tree is also valid - weird, but true. + +``` +root = new Node(7) +is_valid_bst(root) +=> true + +is_valid_bst(null) +=> true + +is_valid_bst("If this is true, then I've gone bananas!") +=> false +// guess we've not gone bananas! +``` + +### Examples of Valid BSTs + +![valid trees](./valid_trees.png) + +Both of these binary trees are valid BSTs. + +The left tree is valid because: + +- Every node value to the left of the root is less than the value of the root. Every node value to the right of the root is greater than the root's value. +- The same is true for all subtrees. For example, if we start at the node with value 5, the node to its left is less than 5 and the node to its right is greater than 5. + +The right tree is valid because: + +- All of the nodes to the right of the root (value 5) are greater than the root. +- As we go down the right side, each right node is greater than its parent node. + +### Examples of Invalid BSTs + +![invalid trees](./invalid_trees.png) + +Both of these trees are invalid BSTs. + +The left tree is invalid because: + +- The node with value 11 is greater than the root node with value 10. The node with value 11 is to the left of the root and needs to be less than 10 and greater than 5. +- The node with value 1 is less than the root node. Since it's on the right side of the tree, it needs to be greater than 10 and less than 16. If we consider the node 12 and all of its child nodes as a subtree, then we also notice that the node with value of 1 needs to be greater than 12. In summary, this misplaced node needs to be greater than 12 and less than 16. + +The right tree is invalid because: + +- The node with value 25 is to the right of the node with value 30, meaning that its value must be greater than 30. + +## Implement a BST + +For this challenge, we'll be creating the `Node` class with the appropriate attributes and then we'll manually create valid BSTs to ensure that we understand the rules of BSTs. Our tests will check that your manually created BSTs are valid. We will not be creating a parent class to track the `root`. + +Use the language of your choosing. We've included starter files for some languages where you can optionally pseudocode, explain your solution and code. + +**_Feel free to run our tests whenever you like for this challenge! It can be hard to validate a BST on your own, especially if you're a newbie._** + +### Create the `Node` class + +A `Node` should have three attributes: `left`, `right`, `value`. When initializing a new Node, it should take three arguments: `value`, `left`, and `right`. + +When a new `Node` is initialized without a `left` node, `left` should be set to an appropriate falsy value by default. The same applies to the `right` node. Expect that every `Node` will be initialized with a `value`. + +``` +node = new Node(7) +=> Node: value = 7, left = null / nil, right = null / nil + +left = new Node(4) +right = new Node(10) +root = new Node(7, left, right) +=> Node: value = 7, left = Node with value 4, right = Node with value 10 +``` + +### Manually Create Valid BSTs + +Let's manually create some BSTs using the `Node` class we just declared. For this part, we'll have several methods with unique names, and it'll be your job to create the BST and return the `root` node. Our tests will then traverse the tree and determine if it's valid. + +You will be given an Array of values in sorted order, which you'll use to create your tree. Drawing the tree on paper can make it easier to understand how the nodes connect to one another. Be aware, that there is almost always more than one way to create a valid BST from a list of values. You get to decide how! In other words, you get to decide which node in the list to use as the root. + +Example: + +``` +list = [1, 2, 3] +/* i want my tree to look like this: + 2 + 1 3 +*/ + +function one_to_three_bst() { + left = new Node(1) + right = new Node(3) + root = new Node(2, left, right) + + return root +} +``` + +You can find the methods and their accompanying lists in the starter files. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/invalid_trees.png b/10-week-8--searching/01-day-4--manual-binary-tree/invalid_trees.png new file mode 100644 index 0000000000000000000000000000000000000000..f73482e244800e01c04896838deca7ced0c9b56f GIT binary patch literal 31391 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 VvA(xk@ZxCa+{|^Qph+O~x literal 0 HcmV?d00001 diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/javascript/binary_tree.js b/10-week-8--searching/01-day-4--manual-binary-tree/javascript/binary_tree.js new file mode 100644 index 00000000..14dd9232 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/javascript/binary_tree.js @@ -0,0 +1,35 @@ +class Node { + constructor() { + // add your Node class code + } +} + +// list = [1, 4, 7] +function oneToSeven() { + // manually create the BST + // then return the root node +} + +// list = [10, 40, 45, 46, 50] +function tenToFifty() { + +} + +// list = [-20, -19, -17, -15, 0, 1, 2, 10] +function negativeToPositive() { + +} + +if (require.main === module) { + // add your own tests in here if you want +} + +module.exports = { + Node, + oneToSeven, + tenToFifty, + negativeToPositive +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/javascript/package.json b/10-week-8--searching/01-day-4--manual-binary-tree/javascript/package.json new file mode 100644 index 00000000..b18a5a25 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "binary_tree", + "version": "1.0.0", + "description": "binary tree", + "main": "binary_tree.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/javascript/tests/binary_tree.test.js b/10-week-8--searching/01-day-4--manual-binary-tree/javascript/tests/binary_tree.test.js new file mode 100644 index 00000000..c17ce3fc --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/javascript/tests/binary_tree.test.js @@ -0,0 +1,65 @@ +const { Node, oneToSeven, tenToFifty, negativeToPositive } = require("../binary_tree"); + +describe("Node", () => { + const node = new Node(10); + + test("sets the value when a new Node is initialized", () => { + expect(node.value).toBe(10); + }); + + test("sets the left and right node attributes to null when no nodes are provided", () => { + expect(node.left).toBe(null); + expect(node.right).toBe(null); + }); + + + test("sets the left and right nodes attributes when they are provided", () => { + const left = new Node(1); + const right = new Node(10); + const root = new Node(5, left, right); + + expect(root.left).toBe(left); + expect(root.right).toBe(right); + }); +}); + +function bstToArray(root) { + if (root === null) { + return []; + } + + const stack = [root]; + const sorted = []; + + while (stack.length) { + const node = stack[stack.length - 1]; + + if (node.left !== null) { + stack.push(node.left); + node.left = null; + continue; + } + + sorted.push(stack.pop().value); + + if (node.right !== null) { + stack.push(node.right); + } + } + + return sorted; +} + +describe("Manual BSTs", () => { + test("oneToSeven() returns the root node of a valid BST", () => { + expect(bstToArray(oneToSeven())).toEqual([1, 4, 7]); + }); + + test("tenToFifty() returns the root node of a valid BST", () => { + expect(bstToArray(tenToFifty())).toEqual([10, 40, 45, 46, 50]); + }); + + test("negativeToPositive()", () => { + expect(bstToArray(negativeToPositive())).toEqual([-20, -19, -17, -15, 0, 1, 2, 10]); + }); +}); diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/ruby/.rspec b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/ruby/Gemfile b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/ruby/binary_tree.rb b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/binary_tree.rb new file mode 100644 index 00000000..4c10eb41 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/binary_tree.rb @@ -0,0 +1,30 @@ +class Node + attr_accessor :value, :left, :right + + def initialize() + # add your Node class code + end +end + +# list = [1, 4, 7] +def one_to_seven + # manually create the BST + # then return the root node +end + +# list = [10, 40, 45, 46, 50] +def ten_to_fifty + +end + +# list = [-20, -19, -17, -15, 0, 1, 2, 10] +def negative_to_positive + +end + +if __FILE__ == $PROGRAM_NAME + # Add your own tests if you want +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/ruby/spec/binary_tree_spec.rb b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/spec/binary_tree_spec.rb new file mode 100644 index 00000000..1b7cefbb --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/spec/binary_tree_spec.rb @@ -0,0 +1,70 @@ +require "./binary_tree" + +describe "Node" do + let(:node) { Node.new(10) } + + it "sets the value when a new Node is initialized" do + expect(node.value).to eq(10) + end + + it "sets the left and right node attributes to nil when no nodes are provided" do + expect(node.left).to be_nil + expect(node.right).to be_nil + end + + it "sets the left and right nodes attributes when they are provided" do + left = Node.new(1) + right = Node.new(10) + root = Node.new(5, left, right) + + expect(root.left).to be(left) + expect(root.right).to be(right) + end +end + +def bst_to_array(root) + if (root == nil) + return [] + end + + stack = [root] + sorted = [] + + while stack.length > 0 + node = stack.last + + if (node.left != nil) + stack.push(node.left) + node.left = nil + next + end + + sorted.push(stack.pop().value) + + if (node.right != nil) + stack.push(node.right) + end + end + + sorted +end + +describe "Manual BSTs" do + describe "one_to_seven" do + it "returns the root node of a valid BST" do + expect(bst_to_array(one_to_seven)).to eq([1, 4, 7]) + end + end + + describe "ten_to_fifty" do + it "returns the root node of a valid BST" do + expect(bst_to_array(ten_to_fifty)).to eq([10, 40, 45, 46, 50]) + end + end + + describe "negative_to_positive" do + it "returns the root node of a valid BST" do + expect(bst_to_array(negative_to_positive)).to eq([-20, -19, -17, -15, 0, 1, 2, 10]) + end + end +end diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/ruby/spec/spec_helper.rb b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/solutions/binary_tree.js b/10-week-8--searching/01-day-4--manual-binary-tree/solutions/binary_tree.js new file mode 100644 index 00000000..e31f6bdf --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/solutions/binary_tree.js @@ -0,0 +1,77 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +// list = [1, 4, 7] +// 4 +// 1 7 +function oneToSeven() { + const left = new Node(1); + const right = new Node(7); + + return new Node(4, left, right); +} + +// list = [10, 40, 45, 46, 50] +// 45 +// 40 50 +// 10 46 +function tenToFifty() { + const tenNode = new Node(10); + const fortyNode = new Node(40, tenNode); + const fortySixNode = new Node(46); + const fiftyNode = new Node(50, fortySixNode); + + return new Node(45, fortyNode, fiftyNode); +} + +// YOU COULD ALSO DO THIS (THERE ARE MORE WAYS STILL!) +// BUT WE GENERALLY DON'T WANT TO MAKE TREES LIKE THIS, YOU'LL FIND OUT WHY LATER +// 10 +// 40 +// 45 +// 46 +// 50 +// function tenToFifty() { +// const fifty = new Node(50); +// const fortySix = new Node(46, null, fifty); +// const fortyFive = new Node(45, null, fortySix); +// const forty = new Node(40, null, fortyFive); + +// return new Node(10, null, forty); +// } + +// list = [-20, -19, -17, -15, 0, 1, 2, 10] +// -15 +// -19 2 +// -20 -17 0 10 +// 1 +function negativeToPositive() { + const nTwenty = new Node(-20); + const nSeventeen = new Node(-17); + const nNineteen = new Node(-19, nTwenty, nSeventeen); + const one = new Node(1); + const zero = new Node(0, null, one); + const ten = new Node(10); + const two = new Node(2, zero, ten); + + return new Node(-15, nNineteen, two); +} + +if (require.main === module) { + // add your own tests in here if you want +} + +module.exports = { + Node, + oneToSeven, + tenToFifty, + negativeToPositive +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/solutions/binary_tree.rb b/10-week-8--searching/01-day-4--manual-binary-tree/solutions/binary_tree.rb new file mode 100644 index 00000000..1517def2 --- /dev/null +++ b/10-week-8--searching/01-day-4--manual-binary-tree/solutions/binary_tree.rb @@ -0,0 +1,72 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +# list = [1, 4, 7] +# 4 +# 1 7 +def one_to_seven + left = Node.new(1) + right = Node.new(7) + + Node.new(4, left, right) +end + +# list = [10, 40, 45, 46, 50] +# 45 +# 40 50 +# 10 46 +def ten_to_fifty + tenNode = Node.new(10) + fortyNode = Node.new(40, tenNode) + fortySixNode = Node.new(46) + fiftyNode = Node.new(50, fortySixNode) + + Node.new(45, fortyNode, fiftyNode) +end + +# YOU COULD ALSO DO THIS (THERE ARE MORE WAYS STILL!) +# BUT WE GENERALLY DON'T WANT TO MAKE TREES LIKE THIS, YOU'LL FIND OUT WHY LATER +# 10 +# 40 +# 45 +# 46 +# 50 +# def tenToFifty +# fifty = Node.new(50) +# fortySix = Node.new(46, nil, fifty) +# fortyFive = Node.new(45, nil, fortySix) +# forty = Node.new(40, nil, fortyFive) + +# Node.new(10, nil, forty) +# end + +# list = [-20, -19, -17, -15, 0, 1, 2, 10] +# -15 +# -19 2 +# -20 -17 0 10 +# 1 +def negative_to_positive + nTwenty = Node.new(-20) + nSeventeen = Node.new(-17) + nNineteen = Node.new(-19, nTwenty, nSeventeen) + one = Node.new(1) + zero = Node.new(0, nil, one) + ten = Node.new(10) + two = Node.new(2, zero, ten) + + Node.new(-15, nNineteen, two) +end + +if __FILE__ == $PROGRAM_NAME + # Add your own tests if you want +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/valid_tree.png b/10-week-8--searching/01-day-4--manual-binary-tree/valid_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b3f28451de86a48a60c6705f037287af77e23c GIT binary patch literal 48311 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 literal 0 HcmV?d00001 diff --git a/10-week-8--searching/01-day-4--manual-binary-tree/valid_trees.png b/10-week-8--searching/01-day-4--manual-binary-tree/valid_trees.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf1fe455ada65700a751fa50808d9fd7307b599 GIT binary patch literal 24534 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 literal 0 HcmV?d00001 diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/.gitignore b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/README.md b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/README.md new file mode 100644 index 00000000..730a4e5a --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/README.md @@ -0,0 +1,106 @@ +# Day 5: Balanced and Unbalanced Binary Trees + +![Balanced and unbalanced tree](./valid_trees.png) + +Binary trees can be balanced or unbalanced. In the image above, the left tree is balanced, while the right tree is unbalanced. For the left tree, the left subtree is the same height as the right subtree, making it balanced. For the right tree, there is only a right subtree, making it unbalanced. + +## How to Calculate the Height of a Tree + +We can look at a visualization of a tree and intuitively determine whether its left and right subtrees are the same height, much the same way as we determine whether two people are the same height. But, when it comes to trees, we actually have a more specific definition of height and it can be measured numerically, just like your own height! + +![Tree height](./tree_height.png) + +For a binary tree, the height is defined as the distance from the root node (where the tree starts) to the furthest leaf node (a node without any children). To calculate the height we count up the layers (or depth) of nodes (not all of the nodes), and then subtract 1, since we aren't supposed to include the root node in the height. This means that the height for both trees in the image at the top of this reading is 2. + +## How to Determine If a Tree Is Balanced or Unbalanced + +A tree is considered balanced if its right subtree and left subtree are the same height or they have a difference of 1. All other trees are unbalanced. Here are two examples of balanced trees: + +``` + 0 10 + / \ / \ +-10 20 0 20 + / + 19 +``` + +Visually, it is quite easy to determine whether a tree is balanced or not. We look at the left and right sides and can almost immediately tell that they're the same, or roughly the same, height. In code, however, we have to traverse the left subtree and determine its depth, and then traverse the right subtree and determine its depth. Lastly, we compare those depths. We won't be coding this today, but we will be revisiting this in a later challenge. + +## Why Should We Balance a Tree? + +![Two trees to compare](./tree_compare.png) + +Take a look at the two trees above. Let's imagine that we want to see if the value 16 is in these trees. + +For the left tree, which is balanced, we can do the following: + +- Go to 10. +- Is 10 more or less than 16? It's less! +- Go right, to 12. +- Is 12 more or less than 16? It's less! +- Go right, to 16! found it. + +Notice that we didn't have to visit the left subtree at all, which means this algorithm would have a Big O run time of less than O(n)! We'll let you think about what the specific run time might be :) Or Google it. Or if you're familiar with the binary search algorithm, does this remind you of that? (Shh, writer, you're giving the answer away!) + +For the right tree, which is unabalanced, we have to visit every single node before we get to 16. This has a Big O run time of O(n), which is not as good as the balanced tree. + +So why do we want to aim for balanced trees!? All together now: To save time! (<- You can scream it in your head if you want, or out loud. You do you.) + +## Practice Building Balanced Trees Manually + +For practice, let's manually build balanced trees from lists. We'll include several methods in the starter files which you'll fill out. For each method, return the root node. Our tests will then check if the tree is balanced or unbalanced, and if it's a valid BST. Remember, a tree is balanced if the left and right subtrees have a height difference of 0 or 1. Note that there may be more than one way to create a balanced BST from the lists. + +Example: + +``` +list = [1, 2, 3] +/* i want my tree to look like this: + 2 + 1 3 +*/ + +function one_to_three_bst(): + left = new Node(1) + right = new Node(3) + root = new Node(2, left, right) + + return root +``` + +Use the language of your choosing. We've included starter files for some languages where you can optionally pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/balancing.js b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/balancing.js new file mode 100644 index 00000000..db989d7d --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/balancing.js @@ -0,0 +1,30 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +// list = [3, 5, 6, 9, 10, 20] +function threeToTwenty() { + +} + +// list = [10, 11, 30, 100, 200] +function tenToTwoHundred() { + +} + +if (require.main === module) { + // add tests in here if you need them +} + +module.exports = { + Node, + threeToTwenty, + tenToTwoHundred +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/package.json b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/package.json new file mode 100644 index 00000000..9f821b16 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "balancing", + "version": "1.0.0", + "description": "balanced vs unbalanced trees", + "main": "balancing.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/tests/balancing.test.js b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/tests/balancing.test.js new file mode 100644 index 00000000..83a1ac39 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/tests/balancing.test.js @@ -0,0 +1,24 @@ +const { threeToTwenty, tenToTwoHundred } = require("../../solutions/balancing"); +const { bstToArray, isBalanced } = require("./validation_methods"); + +describe("balanced BSTs", () => { + describe("threeToTwenty", () => { + test("returns the root node of a valid BST", () => { + expect(bstToArray(threeToTwenty())).toStrictEqual([3, 5, 6, 9, 10, 20]); + }); + + test("returns the root of a balanced BST", () => { + expect(isBalanced(threeToTwenty())).toBe(true); + }); + }); + + describe("tenToTwoHundred", () => { + test("returns the root node of a valid BST", () => { + expect(bstToArray(tenToTwoHundred())).toStrictEqual([10, 11, 30, 100, 200]); + }); + + test("returns the root of a balanced BST", () => { + expect(isBalanced(tenToTwoHundred())).toBe(true); + }); + }); +}); diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/tests/validation_methods.js b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/tests/validation_methods.js new file mode 100644 index 00000000..1bd6e0e6 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/javascript/tests/validation_methods.js @@ -0,0 +1,65 @@ +function bstToArray(root) { + if (root === null) { + return []; + } + + const stack = [root]; + const sorted = []; + + while (stack.length) { + const node = stack[stack.length - 1]; + + if (node.left !== null) { + stack.push(node.left); + node.left = null; + continue; + } + + sorted.push(stack.pop().value); + + if (node.right !== null) { + stack.push(node.right); + } + } + + return sorted; +} + +function isBalanced(root) { + if (root === null) { + return true; + } + + const leftHeight = branchHeight(root.left); + const rightHeight = branchHeight(root.right); + + return Math.abs(leftHeight - rightHeight) < 2; +} + +function branchHeight(root) { + let queue = root === null ? [] : [root]; + let count = 0; + + while(queue.length) { + ++count; + + queue = queue.reduce((accum, node) => { + if (node.left) { + accum.push(node.left); + } + + if (node.right) { + accum.push(node.right); + } + + return accum; + }, []); + } + + return count; +} + +module.exports = { + bstToArray, + isBalanced +}; \ No newline at end of file diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/.rspec b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/Gemfile b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/balancing.rb b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/balancing.rb new file mode 100644 index 00000000..d32b5995 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/balancing.rb @@ -0,0 +1,26 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +# list = [3, 5, 6, 9, 10, 20] +def three_to_twenty + +end + +# list = [10, 11, 30, 100, 200] +def ten_to_two_hundred + +end + +if __FILE__ == $PROGRAM_NAME + # Add tests if you need them +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/balancing_spec.rb b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/balancing_spec.rb new file mode 100644 index 00000000..bf7cda12 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/balancing_spec.rb @@ -0,0 +1,24 @@ +require "./balancing" +require "./spec/validation_methods" + +RSpec.describe "balanced BSTs" do + context "three_to_twenty" do + it "returns the root node of a valid BST" do + expect(Validator.bst_to_array(three_to_twenty)).to eq([3, 5, 6, 9, 10, 20]) + end + + it "returns the root of a balanced BST" do + expect(Validator.balanced?(three_to_twenty)).to be true + end + end + + context "ten_to_two_hundred" do + it "returns the root node of a valid BST" do + expect(Validator.bst_to_array(ten_to_two_hundred)).to eq([10, 11, 30, 100, 200]) + end + + it "returns the root of a balanced BST" do + expect(Validator.balanced?(ten_to_two_hundred)).to be true + end + end +end \ No newline at end of file diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/spec_helper.rb b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/validation_methods.rb b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/validation_methods.rb new file mode 100644 index 00000000..fe480346 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/ruby/spec/validation_methods.rb @@ -0,0 +1,56 @@ +class Validator + def self.bst_to_array(root) + if (root == nil) + return [] + end + + stack = [root] + sorted = [] + + while stack.length > 0 + node = stack.last + + if (node.left != nil) + stack.push(node.left) + node.left = nil + next + end + + sorted.push(stack.pop().value) + + if (node.right != nil) + stack.push(node.right) + end + end + + sorted + end + + def self.balanced?(root) + return true if root.nil? + + left_height = branch_height(root.left) + right_height = branch_height(root.right) + + (left_height - right_height).abs < 2 + end + + def self.branch_height(root) + queue = root.nil? ? [] : [root] + count = 0 + + until queue.empty? + count += 1 + + queue = queue.reduce([]) do |accum, node| + accum << node.left if node.left + accum << node.right if node.right + accum + end + end + + count + end +end + + diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/solutions/balancing.js b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/solutions/balancing.js new file mode 100644 index 00000000..c034a8da --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/solutions/balancing.js @@ -0,0 +1,47 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +// list = [3, 5, 6, 9, 10, 20] +// 6 +// 5 10 +// 3 9 20 +function threeToTwenty() { + const three = new Node(3); + const five = new Node(5, three); + const nine = new Node(9); + const twenty = new Node(20); + const ten = new Node(10, nine, twenty); + + return new Node(6, five, ten); +} + +// list = [10, 11, 30, 100, 200] +// 30 +// 11 100 +// 10 200 +function tenToTwoHundred() { + const ten = new Node(10); + const eleven = new Node(11, ten); + const two_hundred = new Node(200); + const hundred = new Node(100, null, two_hundred); + + return new Node(30, eleven, hundred); +} + +if (require.main === module) { + // add tests in here if you need them +} + +module.exports = { + Node, + threeToTwenty, + tenToTwoHundred +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/solutions/balancing.rb b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/solutions/balancing.rb new file mode 100644 index 00000000..eb3eff19 --- /dev/null +++ b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/solutions/balancing.rb @@ -0,0 +1,43 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +# list = [3, 5, 6, 9, 10, 20] +# 6 +# 5 10 +# 3 9 20 +def three_to_twenty + three = Node.new(3) + five = Node.new(5, three) + nine = Node.new(9) + twenty = Node.new(20) + ten = Node.new(10, nine, twenty) + + Node.new(6, five, ten) +end + +# list = [10, 11, 30, 100, 200] +# 30 +# 11 100 +# 10 200 +def ten_to_two_hundred + ten = Node.new(10) + eleven = Node.new(11, ten) + two_hundred = Node.new(200) + hundred = Node.new(100, nil, two_hundred) + + Node.new(30, eleven, hundred) +end + +if __FILE__ == $PROGRAM_NAME + # Add tests if you need them +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/tree_compare.png b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/tree_compare.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5f9bc7e608e1ea5c210fe8f265261f91192aee GIT binary patch literal 39210 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 J6+P$h{|A7~1O)&9 literal 0 HcmV?d00001 diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/tree_height.png b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/tree_height.png new file mode 100644 index 0000000000000000000000000000000000000000..85d085c0ebf21a4d7a5003494713afb778a6eaf0 GIT binary patch literal 9916 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 literal 0 HcmV?d00001 diff --git a/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/valid_trees.png b/10-week-8--searching/02-day-5--build-a-binary-tree---balancing/valid_trees.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf1fe455ada65700a751fa50808d9fd7307b599 GIT binary patch literal 24534 zcmZsD2RN4h`!-St*~!XIM)r7+z1L%JlD&ECJ+rq8DI}4VEvqszLoz}}D3pX0A;Npz zeZRl|@q7R8dmP-Ap8LK(>sse|UJ`ZCD#Yh$&tqX>5v!>x>S1BwjA3D6)8LkerYRTm%GoQDVYo|9sxs(ca_V2a53W z!vn5rS=%~$_W0JobXpU493mg*xp9N z8OES2A|%EuBnm&is-bG2rO7U+0DpILcD08;RP1eCJ&{`!oV-2V;U~%{QC@ytVL@Sj zUKH|jeQO76Z|DDd3Nj^oUu(yIrh{>DuyOT5^Q+o>IBTe5#GSnyt^b*ZzrDAQv!};D z9}^Jbg*n3W1lfg@VDbK4C3uwczw08W@96A{<~J5p2oO+rK`V&cIKeQHmw8yjxc;uM z4lK^aHFJTBtCq2c zu%Iq{!Zuhz-Cj^5SUgx**-;_bNyAWAOF`X)Ukz=l1jCUx)ittKa1~T{5kVX4p_ELO zjSWoXU2J_^{FPOF6%}-Bh0Hwd#C?JUokRpg0*r;_L<59W{REwbgdP0@oYd{Km95bZ zC^=UJ4L?0cYa?qlFLs#;SF~Fwyt7o#y$eh3U;C@YF-)v^2UY%N@o1x!h!lOE_%k|uF7z*;nHkxE|v8ajIZt}rZX0c&k94>gRaiMpVZiJgNn z#?D&L&mI0pIoQ+LRm?}t*w@n!Y*SEP)L8_KOIc7&SkXpQN7+nHTi!N^U&T|;R8<)4 zK^`p^XsfHQ;fg{F={PGoE9u#53I!`T8rq9!dDyA@qBZUOjGX+O4b8+|QMO_(N+#N> zKEBR^_J)R@CJypG?wYC?H4_03WK_mMA}DVgaYq+1aa#>ndvQTA4Fv&TOrV&Dj)s?~ zwGBqo*+odpQ=1_ zaeIDc4Q~+>WqwU-Rds7!c`pHsm!VvshlsMAqpydVikhh?M$^^6RalE3ts#uI7FF?g zMZ@?FR4{U;Vm@wi#9c~xy8KM^NKZ8HHwVO48>V^t-7%>Y$BQB@sdaZP2En_{pAyhT~l z+1nrGYHA>&DCBQvucNOk>IXmdGPbof@Zfi_whM4G3|5oZHg<$hX{iU;nR%OtI~fXy z`iNps7*A6N2XI+%!+*TiUl#`d{x<{&DaD4ybYo#LVW}y~83f+g%qPr4PagI&j=kYv zZZ%N$Cj4S&XXEY6^;+sSxnt4oOty$r^V>tkw?ottSlI4(=&8jD$FixETX=Kk#85s? zQ>Q*=@9-1>57>$v@>es7`U*YCXaiQ(CAKP}(h-w&D&pW5N}UVm4v|4JT*ZRu*1 z-?ypP)K;O)55zpP86^D&7G8#|E_L1VUKt=0_usgecRffi>Ebo6-el?=y%Ke`R`1nf zo8Bb7XD){2hLzcDSFWfZAO2!s5RzoYCTIHlb?`uzOkzwJkG%F_XUFNWr)isS`BRfR zdFjJ7)^f||P4BAAjgQT%%tX{wRWp9B4splRqzTbGp~f*~A59oh7}>pz8P>UG&m64> zqOZR^jHo_&xn5CO>^$*gyxv};+_&5xmXRho*Li(TI zJmAo}FPwSfWpFu#%f)|JfC>8>!DwPr0jD|9)u`shaPz)YI*yr{nepe~_B1qnQhSDT zh3sJy^y=-@Xi%8KM(2sXXLYr<|K7jNiY+k~Zecj`S{J8<31!oRKhx?{N_6?UNv!^w z9w}PTVfa$HUP+Rjon0AWBG3OU#Se-?3I-X4CeoWYn1cRvM!v_&ske7`ecjbG^H92R z#B^8AoFmd15hf(a!20_o8;ZN8*x#S7jdvHT-hKD$gbJ5oMX@|8!%|^CdgC(w=KGf+ z&6>G_u`}0wt@zW@aaAL6Rb^dqe2bplxO@Svg7a4T=xI_wfvEfawijQXMQfz*&-MinSM%UMyjsdI;kDQI0n@5^*&t3RxJ0(6B4Z zxC8yiDp)zbw{PFZ6`OyV*T*}RC3pDz@YlB?_~slS=T?+f!MR8Z!#hhlgG=xpnN2EY zrcsPQ*yWvSo8Pz3YRpuX3CrZG^Q}Jizt$&>L|*&Dt`m{NEpj?fm2r4sjW>Vd)P}so zUs`eeHdS>yH@AGc)8dlWmy!I{aSgt#loTTBV8Z>CVYw z)y1P?`|MxE#Ng5eZyVhS+1t>~A@ZWlzjtq~s>`R5ZAlK<&7~r*fv79891^2LZ(o05 ziwqs*%Q9qSo)IkV$d*Ao8HK;ZhX3e1D$#-S z9u~TY>}S2x7z+yvHhFC%?B%t{fh($=_OO?hH?aJ_^G3PPHK}#S5wDIuQrNoCbLQp4 zh?C#-4sU47Z@g^7QyyZz9oY^?Q(eg*tm+P{(7#9LnuJN$~- z>NpMOG_5a=qyg)fb^CkIyZ1ct+Fy|)kXHFhKwP=de{&YG7d156|EYG3f204VS?kV- zr2WJbtsD6`{aQHH$ic>^(zO&*xX{T0qr8Um+Tn!?7KglLo3HNqSe`z7*)B|1^jW={ z8&b9;wHM)C_h4G5qUX4ZyloGnz_rReW%)u%5!HV=L^J%)50yCYdxh~CY4!F)gSSYe zoj!3Iv17wwbMc@nWZ~M6VFb(E>*n&lAVB6c^)$DWvp6BaD|BEq>fnd{P&Q3Of{0oq zZcI|y?^Ian`AauA;G})y9{AC(xil>F*1%L;{q9vVA3C(m0fdslucZ&Se49U>g#TWp zmdj3)IXUQlCIEhSn-;cK`Gx>jQSh7l;tP4OSreCW)NX!g^BZq))HXhA1P-6Wv;FrI zI|qlss^$e+FNSSe6f3Jj{>iJvD&5C%!k!BjQWM2$6#dgAuegOAhBLt6Bp1Xa*|7PL z>8uz&W~rdQcHi~_Ss{g%IX)ZqinApc_TcbG<(X%$IR@1hrhdntlKCnK)6QnC4&@NO zLbGJ;FGh5XF3t&v*{wMtmcKUEo%VU=3c*1VEb3!E4!8)}5KBR{newqjaXlc|{k~|$ zWl+X+2Jb>+Yw7$OR-#X^s-(M&>QvOP6Q#lbS%m)RUEifyP2?ybE$){W&D4FY{90@= z^l^9^59<3bpiUcfz&W`2 z{CID!L?Qly=>D$pj!GJRW^pka#45-36BhBYfy;uvYdVIflg3tA4?Nm9|M1X%y)WWg zaoYZ^`Z+GgH+0stRfOf|;amj*Olf2T<6FeX{3wBS@-li_P6F0^`1GvGC#ERw>K1wS zKm8qON{gF{E-lgOY#b5-0=l9e^H)h@ejk3T*^x@BO@jTsVVQD0aJw+iZ^{&{sU&^0 zA@p^!GUqTS7FU%?5O$ch`2t)Vd+#420qLz7hV24*nL+vOq(ro;D(2~Q*wJ3>(c#wf z?*T>Aaw=$p$ez`vvDe1 za(@s6z`pzE$bHpP6>retlXNBW58ma}Us(wG?&l`$vE$=bw2^>o!v@i8 zXQ?c~rGVxkCI_rO;CDkn4*ps=`AZ0Z&Wr6Yizql3Xv9vLUqrvUzv<7-@0tQ#^XbBTn#; zbX1N^B!=9x9=62zs%csJ`tAMvq%!FlT9p!lk(nBI#ztz0;V?Q2l8PlEr4v zT-M3TxE8$n8GdJz)<{F{SQ$RDLEnfWAB~TkODYprV_aC9Wujs z!=+0p9DUb7 zdo(WuSMpf2=)}4fmzKJw-;J-Y_#Mpqx?4-aL$robzn+_9o(d*#7(TgOA&M`QkfTIU|+b zb*t>M9QQ@ZRB=4|d1$?g>iCgF^J8~>{4{=zWx&=v&537^I;+F%>sR-bIGh{!_~6|m zN(nUMfd&4v&g(K_o(nvX``opPI5s@_v!l&v+18ltRGv_=T945oLvk@^+}n|J&0m;v z!+!KqbMFye46N`itGi&7gmuFL|V$U^-&)Gwg6T6Vm&b zju=+@jVBL0^dihhWKKif`Sr;RACxS~5`pErW06-L+=YJX+#<0$^!I9xUXz~izw>OX&W-u{H+G34`B zsx&;FzmBi{Kz>C03;nf=8r0!tol8uOko1^+Tm87S!M6S0HvKgeA6M^O(W-BtvwD`= z7>pu_*zUp$6X8S0;XY+698%kjXAHmU`Qk@ho>w2ux`)z_PrW``J_8xdKM$7ED<6LR z2~Z)Qy{r}_N8yn)ganG*qv#v#3j8vR-!>Y)8|Wo-aX<>2OoFux4%%qVM^B~2<}tUD5@GYL zX{ev-*4C(`T>5xeFR0!4O`{Y09usT?E|1YK#{bTkP9Eg-3dz$xg|ns#x$HHM+&7t# z9r$a7CJFRoR9pr+rNf(Z%{fZR7gukkG-EzI4=|RA*nBo!3?Z$W50{G2(hBE7Cob5} zm78@HG6YL!YM>~+ot^#pErA(7_dq(Ukcu2*&qd+4khB@&&KoHbcfEk%W(VcXx(pOS z*KVC7KA&8}W7%dP;kV9~Ag63XSMP($_h~OwDrKptX^Q^Np};Y_uQ5!Z%o<5TF|W5+ zYpu{&5p^tuYqZTg4_Q&C;8KrT=T+=xDqV%;>zJiTrbfH(3ok!D67!fhfrKsVnbp9aRid0q8$C=fLB&s$-KcODgN;tFE2|9tzKtw0%kN1US`(v zWW$mbr^RHVOqX@0-aeU)jm=3|Fd!~Ev>`vq>Dt~4h&r0rf9cl zz)64pXXd#BZUzTc&2=FmArZRVoo+d^r%>joD=WwC>itBb!8VPrZwWAQv_j%{mr? zh0gd}e{E!5=5jilWc};gbdK0Upu+3W<-PFai`Sy#qITG$S_t57l>Gn7M`+1p3#MP+ z;TWngtSnYcB&SUsUU; zr@jz(Q%4d+cEO#Qz4iN8Cd@qg%+;7ZRuZZKEoHk!e$qBCsBd${Ja4q4CHyzaeh#u& zAvi*$7p!^eNK#VS7)@PV0YvO?t-SPE%D9-@29M;=cG*jIT(l^f?}&)#2_20mVaz^9 zOgqp`A_ErT`-A)3NHVS)6u$2UOv)2nl3&;9#)I?s#}|J7Llhe|o{-ABc6Vw{h{7+3 z6#WyDoAddDh`XyYZ#H_waC*=$^FrD^?IA8bEWo>gGDsWl(bTij!6TZmxgP8?M$rg4 z3@DID71tXv#WynY(tRSgc5$h=%VRpeopYgmN?Ar@>p*bosJ3$CJB zCyd)Ha$Xs_hS4uHZ_YM4kSz&XzrxLWv|K;LtAEUN%s{V( zn!Z74C+D^=wLj0=LY6MSN6A8NyuLVuR(dDvfxW18AKmyp z`z}R&Qs*6QX-<5rP6FR5vuEBSgmT%^VTY=aSlG?Cc-_v(xM|qj^z7Ch#xjzvg_q{r ztA&763GDxZGPNQ(4xV0M;Wue0(AT>vj6KP>^vS;K4JPbIN!>f)OBf?Cy+02-ohg>%K7EXiSg}EplL=W8p*v7b; z{#p3Qc~#r9c-JK*&4c&1sy;pWz?BeCAmLXb!K{q0@<7zxjZVGNs0z2H%xnA&Ku0%I zkmB@{qLP8_-Yc_Uh-p<{+As#Zq=74$Dl1U980O$FCweLGUFi7}_UA`GPH*=}z9b>< zry0wsYRk&;@60)V5S`zZsMsymJ`X)T-sh60MN9G$)`54ugdEEblrGuiy_dDw;fQTC zU!l(=#Kq7?PdNVhju@~VE@Yk*G5Sc_hAy~X9-|Hw(iOluvR87I3%)#k%46E(mdj&W zuZW)s0~&hp)Lvyh#ox ziWy6#4KTQM-nd1GCC5!gdD;j}n z>hRK(?*llg&Bl?(&*iax-=40qs^KL&{P?b)DuGO*_pFNDH`!2MJ-yp#g=G^}*%0u3 zRDNU+lFDWuaN%8Lftj6)V#UBIAf(*K;DqhXIO2Jnpfyok5gK8-Oh+&uuo&jOyQZ5fe;vRx{p2MGqTJI-Ji3^W5XU}AV1M_RrSmU|>W^u&n$zDL;W!293e*hxJ z`_DX|D00k-X}nIPR9=EAHyhr`iFdzO9A_XaH92k|EA05!wB)ov2n+T@2n%4mVGiT% z_b%i+S@E!P=w6DtEEPPUEpyCP({Ump*D8y}l`$|Cb>Ot}%7Gc1JRu)!$=0!-L#@*V zHo5A`;9et3q_C^bUdU>eaU-qq=($_((H7aC9z+&aUH{@r4YQerI^#CP5XcQ0Y_!tJ zWRr>klTo+QuM;bH9&zBR1Z!ck1zCaad!cQ~}UlwKtBwVOOa=dX875^ZJ3oc{4y zRb@rDc`f&4M=hPy60y^?kfAuN3OXjuOcEk zQO$EimzZd1Xqt$24t^|qcN2@LrqYV6l$RFNmyn3M@I|%yd>LFDdpxP6&{N-U-Ximf zec+2)rzA43{AWMEseV-qv9r(AD%5@`tyiwcP9x@#hvaxNKczzU1|Zk6hcGK>KS+rX zKlZkL*W6K~IhOvpn)iiY*Za?8?BH%I5jK%)OM7mSe3?#_x*d4|9$nGRg&RQRTO?Jx z*K#!{JNpT*HRS(8XIMw1dLWalY%#Vt7lj+}Vigc5!wZN-OJq6zkdC@|%}f=NQz8b5 zce{2iGMcQ*XV{jwVG(~#dI!4*`WA^;Rma@!QA zfS#g}^miNH85kKcy5I}2t^M#l0VKNqVu@^~N=Ppdu#GdbdK`PyeU)>H6*~e!Q#+=O zr)S0zr~K>{i(RLyaZ0@)L(lF>Zj+j{3jeKCh%&6VdwnlPC;ad$hhHLTj#^=G|0g~i z&zHZlnSL>RdhDeuZ1(XaK{=s=BWekNeHYA>S!wQg;*_(9cgkuXo#);05{)B0;S~Ut z?smtM3_%`6G$8}En8YJ+x2Y!+5AQXAz*N=&{HAUCP z`z>tG?1wIzz6h*Seq0}LHNmUew80@Nhd5w!wuF9-*Rl;NVucL`eDmp~&h^Pk!wtz# zkNG*cIBcthN z&qa%`-yuRh;wAgUMm|EJv5n7^N8n8MQT1(s)Ptk$=-rI229^<2863j<%!!GKa+cx! zpS3t<1>R*!M(f~uU#>B49+`07uu)3f4L~Xb_~w?&254D1Ulzf84)?z^x;BK4;Ne0B za}ED%(9RpNR+*D#nb6v&c{l_pdDxRZ&U2FWk(bwE(2eJk-$7-BAd(!h22Wqb>#O|f z3IVk7?ipggJ}6gAC$G=_;Ey8Yd!Z9Y!Z>m)5KzrD91DPGCsO#B)m(DRYd>`zPxKE; z&2+cQ+59PNw&F1CZxCJl>V3^Q&p@Z+nvvE>Mmx400}b$F6jR>#37!Y)o>UWzMhY%M5qskVg%$8;E{g7ohdiazhJb!^pX z(MPOe;Tt3tuX>$@Z5b>@wEVXOz|fv43%s`-+8V%oRg{cwT|#Gk7iDKx8lRZ3q>sH} z2_S@SeSJOAYWkGx3VrG%Zi~!Miq(_a*}?ZWbil=mNcS!kzE7M98c!6}7%n>W>^N>x zpKJ13R!%nC1;T&*UFO(h6^#d?niIXCS zue8kl3^@b;HuN%wMEvKGfq2I$+0qHW$9WilY26h9MI^XqX4vpk>Av|+Au;wjxA#vE zq9FJ>UXrYL)lNVe>%2Q4ff>QS)@ec_pIz68JnH^4?iFzlzyejKzq6mifgEIx8e;77 z#R>fZ-QUaUGJq>!*As;!sxWi?h5rNUkvEclEZaTwN)YrrZ zSwY{mC#6UhelYs@e{)SzYRD_=|9vGEV&sb#0Obz%1nBlH&u5O2>pPlRS&yM|7icDH z#PbTdWQu<@r1JqGWfc)A&mcJ%f2=}st*=|oM7wkIxXyK&x7?z& z{{DMNCdzoRs0|hZmx+JTqVzbS%9s^9{qsepDxUI@(iTa-P6O-TSMI_qU3`@v(IP2d zQl-P`$#IE%?0G@VQfJF--KUS%-Eps3)2|ny{XxNDdGij+6nxSHst>&%`dYk}?cn3H zc`5x;%%U0Tk>*EdtmRRr%BPPEk}~twfE|cw=wV{}2Gmvt!WqTV%E^(QDs)k|Lmh=w z=k%t|Fnj(6iigPTcVqt!1qLEiUwlP$3zBGF1_|HV;+KK6U6t#xgw$N6!ctOF1yAUM z_I^!U<%s)y*1?%4o89vLw0k1Uf)U{976zP^J1FF=sxXSOX#l*z4%q5jZf%YZVO2`w+ zEtjdMoE;~Jm4Co7=s~p>c)w}WbfqT7r#@ugWA5-~_ZB(EHezG0neY17@9jst8(1pd zMQ^3{E#yRrV(d~GBt;o(GeUX8qoyCBd$)ZeT3nxRd_dAWm(VJ>q);J#=u>qp$WWXNFhNK zZ(AD`Id{~ZKw1`cRiGuaOCN?ygbJLW5obyc2DHCL%5JiQ_fKQw$8Ncn zm+f^DWB4Tp9j8Y!U8~ZRq1e5yqd-rIx2Xf0=3Bp!f@{MBySX!3mOz_NlfSl>!c+cn zPtDwkoH6|15!3W0jbk1&Bz8HUdXvB0UxYkouH~V7Es~n6}8|6~AeJq28&bWDpbeQEMI4IPT{e3nY(sC$yw& z?d^dWFID4^kYLqtX<^uL_9btzyL6kqzmgtx-h;X?wCyF%-v0N!6aHmI)~273G!QJZ zcZMUngTcO!1|Dm9+^>$UJHqPmJSi{=WFmmfaNYynzn`ld>-?5J)4c2UQWw{dw%l3I zNFhN%JHU9?S$v>`D2BCER}wM1`h=lUQR&^Q^6|u`?)CFd6R8_#>d;l8zkhmfFUcWH zB#%ig)06{GNZJe@k3zY-g2#7~$LL+iP>T1I%9grGJw4U4dA`z`Z;?!oHrS? zg4Tf5VQ;xfU%r$a&=G#@eN5|8iZ7XHun=*2EFa<7@2x|Yg>Gcq_OPLhZ7*Jb&CL?sr zbh){?X#^FNO*Zq4hciMd#njlPRJu@~bMd{{j*iAky#;h+h0X;hAI@E->{ovE~_rio(1pEe~=5YQ5icJHl7X;m3YxQH3%6yCR>z~OVd6{Ka6?QGz zuom}w4bHcR9pO-6Ile8ph7cO*9ecB`W> zs#M|Q$*46I>Rdhn>i7QHhYf*3XH{AYGgR%`U1l50U!7Hv6cI5zj<6%4k?<`$JgsRz ztWX!D^Ck!uL52u)V730nj^Vi-|^U6`guP(RlFN6@TMv+`c&HcyV_$V+x zwT#j6)ODjMtr1g97r(D5Y2DkFrF3#V@;*nth2Yg|_?3YtzrRf8v(v}qLwrr+Az1Vs zOZ4vki`#e*Kt2X{v$Q`20;Xv<{hv`Z z@2dy{H*eO$eY0^Xb%Y^c-nuc^;ujRIulnQ9$acP#q)xciS1x#dOK0WHK<32jzC|f| zH|Ab9h_3I11`c+%yGg#7XXSl$2K0yzs!kuf)xa;&=tkDKi&Ye29(XFW6M*HfLb-Jp zkWFzbDmTrmO&{NB<-D5fYI_EQlIv6z3zcnL=RNMyIh?{E<*gpZ~;? ze|4S_t>eIWV_Hi=S|GbIC&+g9xQ$T)=16!EWToly$*iAVKh# zpbvZT)B|1-f!0|l5=w78z8R7fNZS*w5wdSQLqab~_ zVa*N8WBSr@Oke)hVFhiDSprF+cX(8Hh^z+<6O+_F=LY>E*dp2C?mxB$eE|MtY%wY+ zp8}>YY%)HdHK_)p>Q*)LX*iGi;3TgUCG+ZOfd-L%{Us5%@r+iu(MWe%(>;#a3l(Iu zih1vVAT5ibF-alo-24o5S;aQR#Rv){yKDcO-6bxOVRqOKL4~QGvzz&93wW~IfB?kD z-p90_M&Vt~0Dh!0#q?_Cr~J$dB%aB-f#g-`#1o1Bm}}d_4H`MTTrttTm#}*rSd}Ns zH7NU(d(Hew;qls8N8Q(jq{*)1Nc1Simv!eV{}Fm6x!roMlqQD^~1-%}8u_8R1Iz&%Gtxe|W@<-cKK;>)h*z!>8J$-R+C{|5cxd!c-%_-P!j zNKly)edX_DsHw&lW{fs+MGjI0_Ym04Hytf|-ij$Uq^g zn@AuFD7DH{w6->qM3xDzu{Dk(4^NhfEog;|BM^z=<-!Y)EEdxDnp3jJQ zJtWE7MNAXtLL(s_$47{|yeq3E3S4Ui^>ADS36(*Qrlctd_BdwMLWJh2Jr+N)Nr;F{ zZVSnkqd>g;%ZzY*nWu{l<`ndyRVKQX1NH4a0lXv_=rCmAH7p9z`h*N3GTTmA|Ohn*JxVV4VUmn;D0NzX75|Gl* z+#n3%$&3sG09d{E>eaK&5x|)9sQ#XKtdd@+`CvyFipX0>-NmnKB?wmja<|HI|4GzW zRI31AEZ2xjrsnf6mSK=^p03Vs(?pD(A+B4%Ni*_DVY&C?sA?x7UZxFugd~N!W#^Dm zoxU7|gvME#ADj(YRIcQdQe0(b<~)88v@^d}5Eh()wI7e@makx^B0$NZ4YHrCFkTw* z8x)Io5!Ev<#qVcJZF(`X5Fw;nII4i$8FX#4O1oO2gHGOxE>9Q148;2|d-u(IvPU@vm&2ZMiRX=iSM_ig_h~ zSE&68o1&kK6pkFW>oO7Bee@$=VAUW@O}gQ{+lU>7D{0v@|HSn2-d7j4St(xFqN5<}8_ z{!@M_I=@2DlPTsgh+}@o)mwL;Q&U$b58VN%v)Ww2z5|De(^hW$rjHCYWX>Pc_Y zMn=kfr_`La32hm}3m|KKZ0L}zdUi$<6Z9Pr8zYXFEle4Cd2UC;K(lf~3eBbX81Sd{ zan^cIN~0yG<;GyJuBP;Kh72tHmR6Zsv09asEt2X>phyUT@vmPFsoB%yFq_CS2Y%nX zkVEqx6QlsoAL)9`HED^L5mNKs1sX&hu!Rx;ib1YnqgLR&5;QV6cpDO=*HD)hJB<~M zm+Ny-q4iz{`zhEemdtrP*Wwgp@z09I&0|^WJL#OSJ^k}kdi~vD9V0m=8p_W6!i|U0 zfJe7vL%YS9<9GVnobf{0(HR7Jod~D&pAMMwk2*VG`1&)1gE@SBK-S-eP{AF4DQzG6 z9}KRf{@*-n!cbp_v87*@u=}h*KC1t|))Fk2H)wS#b?zdv+U&1CXvh?vKCWR4XOX}qz9hdAP4_p&}SM1Rn;98eFPWTn9XCu&?Bp^NeHhH-9cN%O+SaWeUIsx5Sg0gkp z$PZZ1y|4=jAQyi93YP z*^P;7Eh1C!%pR{#1Vsu_$?rIzm)Jl@(%@YP)u(+sHltJ&{e)5yWhQhc{B|KX#j?( zHhX-CPP?_UFOF?t@>j!*4nP``z5|n6u|GAOMmCYybj#(g=#Q?%T@OrQ&GRh@YUM)5 zoPqRIilCl{xn!PWKBDwg1e9p3)+w^_AEOE+WK{5a6(B|?9}_x`)qYhp#~pVPLLk`Z z-`mY&F&1IJCY2cpHKp)tUjQl`?Z(c-w&aL2FqwAXR7S%hb{*l@1CaZlyHdX$_^Q~i z@OGskA@&6TNq5h@(NN0#=(jd1m-sw|UVNO*+K2<&lgy;vE^!c8<+Z^q?hw~)`fK2l zqL6Sx-wmxAqh<=SXMeO~3L(#1)2Uh5a9C^)G$ zsxzmyz)Np~HWQctEd`+>ip|bhX=qVGbm>%QQm31F#t4=^A^mQKp~6C!6u&W8Q^#Zr^s>dSmrwdF2F%N7hO-d3k0TmXS6n#!t1g z0k_HH1J~=$_29MI z(uaV>tU1pP%U%^LOxM{M1)TOP+t39#1e;|T>I*{ZP$^?{8a%}ep7Jc)v3P1t(Y*6_ zrpjfq6_L0zmUT8tgl2XWnfNJ}1mxQx6%GPzD1IVtsP@hGwbnmDZ&223{e6-00{fK3<%_}JuC2=M_`aimZsH1}XA8t(`Kf<#_|dl6_Bt($j$^bv zETna#ehAlUDxbH}t2D7ehP*Z#9tJ0^S)@PTsZ@A%vv<$<8;U&`bS0CVWLC`*a(`;1 zo80G~e0rS2YgzGgUBd8>-E*{ntqh1;0Q!ToEKMZow@w*xE4ERVu9=FDjsx2mIf2p} zX|UtL8AWa%U&SKwf9DTv&)Rry(XFwo-%SYdhjc&L&ffkt)X}&#e4se0kah#|s{~+Z zuVyQqGbGXng`o!@<3UEG|0LyFSnb#V?&p#G%AXikX~YjU5N9#EPm7wky%)s++92lw zgGAZE8gMCQvn1~GdUcNBZGNnk{A{$(mc9RrYUdnc9zeOSD=uFYujkm9Z`H?`C1cK8o`0p*_m8eE6Pn}H zG&O~#8WAa}u~k?Jy;EpLU5hqWsW&M2$a}o|DB6|-=KLZ`P&nN9OUbsNAb!`SxTcjd z=I^|$tX6lK;2;M%AC~4rc}}ReI(O(qT<%VBnL`_g0W}V2G8|`}TEV}rJn(FXa0lS9 z^{&8_PbAht@KW>_5DQW3dxkfExL3H%>`t(B8H?U|{uJq-oHv_f6SRUjymad&KZO;CnWw{*$td$XDm(^+1JO0(|&5OL90a z=4%DWf}gZsI@{&{%bYW9;5?3wa%?ciRs`imBW1egXwf+)>XyNfm=ACoA-%K;Vh@Uw3Oym62Tqb7|3}m`? zc@XeJW`tgO0iNrJ$Ve#zd!)%eBzQ5?0-j&wYAscw8ib4qn1+ddi~*^V*9eGCD!gI+ zcC8QjHYMytU$e!N{53!`bk%cs5iT{Y#*z4;@?jZ3{*`>^pv^Z2r2A^!y56c|_)GPZ z?#&;bjB|hHfu#XmyHa=e;!z3~uOuQZ=vCR@oSWW{c<8(=Ep!vzZ-`8Qq=S=#7Ofh4 zp304^Il+^5N{Uzo?0qu2GvuNtxhx9r)8ikWKx9m^Mc;g`8q^eV8vf|cN3G|nj_=Z? z56dJ{Js<(AIhCI1TdpIQ*1$Q7@R=Lg*6$PhxL-l|`TY}Df=?QSXgm@wk&{Y#NPnfo zPSAY;dCoc^nfo;7`bPgXoLa9xZ<2gpk5+ljjPadH&&g%EpZlvPYrs-K3-gw{&D68& z&~PDLcu))u2h8w`4u=jB<6wB2JQsN(WiQ!mtHauuAjA1{wDGs4w;f49cQoiH6P525 z|Es7D^-3JQ%JNSaZIVFB-IEa~^QT`fL?O%_Q*{H#1ZJxxH9Bv&U+L_4`{&55A+hc^ z7IId9_wv3=R4zJ!_BK<Df=|&n0$NHR?1?~|uGDqD* z6ge1QxEE<*0Q`?lL`1}4Ej$bZ3MoNAicLX@VO6^JHE7JAl@9{X#1n?g*WL2~Le==p z^8(QWWEyklP`vd0s^@n;m6C(!EJe$opF@+*z5pR4s1(LSUF z6Y1JcDvO;s|4`8rDok2Yx2y3N7zDe;GW?*4FcfOcR0BxnGIplj#~Uq|x#j0XM$}91 zH+n5s%F&4dUaD5ek62@M0}bXEQUT#6g-sL9?#cnbI4E12?l(^-tx)ai2zU=evyerPiEt zpZ_cSP({wDCYho5*g+rC6;z@#V3UGHNkq+K!UVoRXb;PEMn1C1^)k2n^mQSzhlQyR zO10_4pv?kcS2&rcO|ecD9fOJC8+H9F{frTISK||z3ni~f7Fkblx@RS`opqLNo81C!(3M&Q$}t|1K60zdj%li#^j2g@sTRHQ zzSB$XrD`V2;K_%pjb8ty(nu*jG+zPCLTVDag57bAY7@Ymijb5E(2&U#zJ96{vd_Ruo_u>|St1;wEOz(FN%evbM- zGfk4mE4r21>^hBRI)3o4u%qY4Wncu6-z1^`L{m4O=ql=7m)aqP_I2hgE<2wi@8vt!tdxXDkq6(COlDHjP|%r`-D3 z#|W3yzV?yuX7Nv`Lsg+$;^Gh(wGBm|7a>`SQkJoNWhPt7h%CvHEsP>0B-txVGj@uxW{DUrvhQi4 z&>$&8*|(ZxD_eQqx1R6wea>@!zjNmJ!?|PRu`KLDe09u%7ZIU%EOlF+Rh1XwhFJOp z5NRSXzHPwOznulSid@syXm;iTxwRj&<_;G;Gc-Z@p}m#^W)L~w=t*r85{d*FM&WLWitTQF4DQ448Z4Daho3>ys!0oyN^-WtD~w2e0)>iV zVN=-F*RV5Z<5Uo-F%&cNV+}y;I)ZzSy5Aiu+g}Os2wJvKG!<8kd2=Jq<-(Z@+#7!S zOoI`Bk>^rz$fF2k23`v8i6NK%LZtgP+bC95#vTGhdc11lKhEY9o-JuMTj_s6n2HtX z^byj!>GLDskJofNRX-OWPJ$lL)V+SiY3bAQ5kHtOs4STN(rD_S7fDHc`>7}R0Bxqdg=Xv}}Oa-T#I>?kYq>x1& zkhdU{!vlDns^X1R@2Zig19vLyk9R;rTgWvDcm%7>fiYQFE$jse&!yXtZt=NPyW;Oi zj#8UC)W#Ex;U=YrVGJ=FwC8;(OkJ3G`qM_6x%^3pkdYa?56xBQ^H)9MZhcD?S0Ko~Sz&QE>;jUsD4oM@I|~Nmo$W(Y{!VN&m*Zs9x$0 z(NZzjIOs3AxzfR~Qp}v@I$SmaKkgYxACCtM$*~DU^O08ntm93Q82cRG*^ed9J(!eP zYD;KMJ|f_&gmL_i|4AlGO*1BR%Zbl-Em$1xGyENDD(yyDRoJ-K4XB?miF$YiJVlf> z0g(cqyB$UUZYcQU7V%2rS47J(r`Y-sZZU|q3hFn0U1xODZ|0+J^Gm*MZ4U`uR<*W| z<(TyE(&i9e&zK7Jgn%k-KQ6TOTr$h!Ui>HK zEaLU&R2BW-n2GuZ8CDKVVg78TX~1~7)=LOxP7T&nAWn`d`-N{ZLZ!^p15ik)6;y~#wr;5bp}QOX&p?qj*t`^F0TC2 z2Qgk7KhYHeR&xVe={DL$o+4W$;S}bw?^GOZ6|A#u3iasM4ZqpgM&;d75Jg`nr%JAg zhMYyNK)ninjQ$L*%ZOER%kzy`)om)d$4L=#gl4~PyN}Do0nLmv)if)dJZ<@MxWG+g z|C@ow-1-%o(zwyNgU#9p|5Fs`O2QqHHqf(CPEKRo@OV7CA^X-HNVpFuzKSx(f7Z#f zJ?_mRzN8WjnWKZj-LbqDd`FWn>|XI-5WZ1B1|>E{)&#F@!f?nro|pkhYSOkX;}8mA zT;(??cc5XUfj43fkX$md-ofpV(NE@YMaPDxiaL)Pm*Vob54>z zvtJ|@QLS7)AO#YhS86kuDxp2|-z(A#iox|f2N#S$rRl{#vvY7iNvN&DLX_7 zvp(4j5cyD7ed*NuDqR>3wmiW-z%W#sq*V-g`2kkm8#5;wvCB{rhOcd}zC3@88aS<` zJ#!+!Oh={_9ja`l@{A|>(0NK3?mvMRk9ClXo7b8=^{&COjgtV#Prb_Mdy$}sxt%D< zZa?j>K6b*!zUGb7Le+6j+dupO_J(p=G%IL*R78KpfcJ$#Kc%MpVwrD+n|dl2@ml!D z7Of`?@@4y2!gM*^{iy2C%9$?e=pV%fLHjMa*|9PDjRAQ-pp>)vxzj*go4-X==asd$ zLn~_h=-k!5i!EG+dO*dX3O>MJi&jT=~jc39$uO*-EdF|_Q^ zux@}*WC}2of|j*|0-(StVp;n1J5ghY5J5d`WO1|U)a=Q)#l^)lh^aZs)tx7}DeLq% zU0!~69FE)XXL@RC(FopX{#9s=;#Zn7hxNQ!&5Ndz!1P}{dk7hNo)HO7mjYX^%G%Uo z)`@(jiE#uLk^*^0OKh@?=_^^s;lO|IN3dpf$Wy=+>j7i`HXsY51{^9@Uk$y^xb<^1 zYhS!TiRf;56IeT&h%qQgNVr_>aX0);vz{GMZ_64)L=+wx$u2g_cHTWP2jljnrHGL2 z@ZRm2rGB52j_zpbe6gc$S_bLt^Uh9vzaZ&SA%0rj89UIv>)85kpNu&*p$#bigLtJ| zboLi5Qywzzel(4uDIIn5eF3wz3#2mlLDlt(?~fcgus2-XB=+m}du-k?R_rkoUFC!N zD~?xi+AJ?>#mdGVFf`1~04HB>%(u6a9o;48N~nZy6&5(31B z8KKFVlkFZ!3FFZ12-S<=DLK!xPP|0R3R#tBe|oO` z(sZl+ttT7kknX6oYfKBBJf&36)sVBiWSsb0l<^Zk>nSIj#@f;Ldy=#`ZU;$bPFkCf zyyjTGHt9<36I_v6__fBsboAW_Cz-NAm+-~aI(H=-zCC1(QO0(g8qm0#eK>|Ai=``k z&`woy=d~#REXjnQ$bN}6)`J|3sD-HMo0Yf~^jvrAY8Z_@JS2PXmUqwkY|?fe)3^*f zDJAgh*o*Pg!v5o0XC716%UcW2I{YGN*l{C6MEw5_5un1s%lM0lqCT43WUIFluVIm6 z85u(R^5KkFksfh%5Y&KZ_K-W?()`l#hd_SXdr(dep2s?p?7n4b$<+SoiF=c8@yZ(t znUA72!HjbPKE}yi17N`;`j zXyW6ZfKHjF>&#}>_ z=bJ8nnbT*QiL|ATXuu7aQ_NxrIOm-)=&zjX%_0i^tu2~@k;*Lg!cGa}_snHDoV|=* z%rywqxV506%Xy|LQ1=1rk$`ouu9GCPSSKUdVJ}gA`B;VY#)3`K1H^l;p~^KYc&#l^a zgS^Ud`f)uI7}~0vR-`x zPz1ux^E4muF;M^L6W167JP=7@k>p#8y_Qifcq5Nc)5Sk+6{aM73o(q_k z-RH1aRu(VyQE!3xK`GGma12~*mHtHZ_C;EQLqg3soa=*SQTx1fvq5(0oC&WSdA@zPSEKU2gX%b& zvy0*gp0mHq`sWwLWDW$+dHjASc-Zw&1IAi^fdOLvsAtZd9YU>|-Y|)BSD*H1jGJG0 zeW<}C>Ot%pb^Lh2N$|M`;1$3xS_4=Uwo@ayffb1`d@*sD=iKG!EXKrnk$%cYrHek^ zWuE<&7HM`j{fF;wD#~WK5>2{oR|C5f5{cF_Z_P2C6k8q zjym-+>yi$|{HEWC6F<9%SO^n>lGR#_nP|xZ(3K#rb7!{{pOceQ>THv<;Sh@y`Vn}Z z0+fyh;co-VR^1JV{I7kQf{OV{@sD{%2=Wwn19b=ec{R>&s<>wxvP4oeTwcHOpKf?XyM9$U2jj&>V?M3K)RT z&Q#*5&pGb>t7XNdnr=&T$fW z%JXhq6C-j>!E@geLUQJHT|Y?P(NCdnZ^?dP5UeDujDtYW5G1&)^`yv&rM@yQqTIKc z!=OGNy0 z)4jKxAkifQA9P#62Y7=N*xu$j?b_*`mbYmvMm0W|bx6rw$n>L zF5l`h2^xiu-O2gu$Dcq>L|K#o#*Jlj+62$H4*Q|T5X74SdgG|K56$092!E(0LB&_4 zu)TDY*xX;4r0{`f8w#;p5~Xvf46WOz*gjcN|0@nucIRVR*iaG>)c_FL<)dSbWLUFT zNs8CK0E-^j^Yu#-s#YI)G|)z}S90v6BJ!FO=(@ZPPVvHO{`_p}amK?o|hGQ$j8y8sY^>BP=(4U0%U4WkZ z+s0v9Dp_g2oA(oYPXmT=ZrO`IqIJ7k>pQ#E$2A}fP5UKKE})^My9fW9FifIQ{+0)U zlEVo0kNdf2-#kRQjM`YMkkU}(-%moV+tr-ogNOoXJkbVHViDiRxqotEPtKnbe{;pm zEcqZzQ^^M{#DG6Zf(f?JBOX*KY8TzUbeO~MTz?La&))?1JCzxv2?~JP%HE9yNqr}U zqnN}M3sRX@*kku0I4lIs6a_sreVG5`dg7t;HqZ@9KqWP2mlv9Kcu8uD6W1LBE;{s! z!2cO{JJWLSgHn#$)?XStP_55CnBzYL>)|@#8ODs$1L24l7JLRGJJrG=!?$pITA)2Khd(t8`9tnAapfYbNB?j|G!^D1SYJR*7%9C0)vz=$$!q`yA5TEST1UOUVel~ zM_Ba8tC1HKnva}>*Xi{MM2+$16)cPj&4GWP+jV^usSkf2ZH`)}AV-@|ylVTeqXSXv q$d#NsrZyV!Uq|<$*0Um3H!5qlNqu(|-3)pCn@(uswJ12-(0>8ImbuRW literal 0 HcmV?d00001 diff --git a/11-pairing-exercise-3/00-pair-programming/README.md b/11-pairing-exercise-3/00-pair-programming/README.md new file mode 100644 index 00000000..3f2b486c --- /dev/null +++ b/11-pairing-exercise-3/00-pair-programming/README.md @@ -0,0 +1,26 @@ +# Pair Programming + +## Introduction + +For this activity, you will pair up and complete a challenge from the previous +exercises pair-programming style! In other words, one of you will be the driver +and the other will be the navigator, and then you will switch. Remember to be +patient with one another and to keep the lines of communication open. If one of +you becomes quiet for an extended period of time, ask a question to help keep +things moving. + +## Instructions + +- Choose a problem from the previous exercises that you were unable to solve, + have not tried yet, or struggled with a lot +- If you are the navigator, you will guide the driver by doing the following: + - Communicate in simple and small steps what code should be written + - Explain why you're making those decisions + - Inform the driver when they're misunderstanding your directions or are making syntactical errors + - Point out any improvements that can be made to the code + - If time allows and problem has been solved, guide the driver through a refactor to improve the code +- If you are the driver, you will write code according to the navigator's instructions: + - Ask questions when you don't understand the what or the why + - If you disagree with a decision, diplomatically state your disagreement and why + - Be the typist + - Stay focused on the current task diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/.gitignore b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/README.md b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/README.md new file mode 100644 index 00000000..0e4359c0 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/README.md @@ -0,0 +1,83 @@ +# Days 1 to 2: Level-Order aka Breadth-First Tree Traversal + +![Trees](./trees.png) + +There are a number of different ways to traverse a tree, or in other words, travel down a tree from its root node all the way through to its leaf nodes or to a target node. Today we'll be focusing on a type of traversal called level-order or breadth-first tree traversal, which can be used with any type of tree data structure. Typically, it is implemented iteratively. + +## What is level-order tree traversal? + +With level-order traversal we start at the root and then move down the tree one level, or layer, at a time. You can think of it as being similar to a printer: it outputs its ink in rows until the image is complete. You can also think of it as being similar to typing a document: you type one line going from left to right, and then move down to the next and repeat. + +Take a moment to look at the trees at the top of this README. If we were to perform a level-order traversal of the left tree and print out each value, we would get: 10, 5, 12, 3, 6, 16. For the tree on the right: 5, 30, 60. + +## But Why? + +Let's say we had our data stored in a tree, but it wasn't a binary search tree (a BST requires its nodes to be ordered). In this tree the values of our nodes can be stored in any order: + +![Trees](./unordered_tree.png) + +Now, let's say we want to find the shortest path to the node with a value of 30. That node could be anywhere! On the left side or the right side. If we do a level-order traversal (breadth-first search aka BFS), we can stop searching once we reach the correct depth. In contrast, if we were to go all the way down one path, before coming back up to the root and going down a different path, we could end up going much further down the tree than we need to. + +There are other uses for a level-order tree traversal, but we'll let you research that when you're ready to do so. + +## Perform a Level-Order Tree Traversal + +For this challenge, we're going to write a method that takes the root node of a tree, performs a level-order traversal, and returns an array representing each layer of the tree. The array will contain the values of the nodes, rather than the nodes themselves: + +``` + 1 + / \ + 2 3 + +level_order_traversal(root) +=> [1, 2, 3] +``` + +``` + 10 + / \ + 20 30 + / \ + 9 22 + +level_order_traversal(root) +=> [10, 20, 30, 9, 22] +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/package.json b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/package.json new file mode 100644 index 00000000..a59017f0 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "level_order_tree_traversal", + "version": "1.0.0", + "description": "level order tree traversal", + "main": "tree_traversal_bfs.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/tests/tree_traversal_bfs.test.js b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/tests/tree_traversal_bfs.test.js new file mode 100644 index 00000000..43c3c911 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/tests/tree_traversal_bfs.test.js @@ -0,0 +1,40 @@ +const { Node, levelOrderTraversal } = require("../tree_traversal_bfs"); + +describe("levelOrderTraversal", () => { + test("can handle an empty tree", () => { + expect(levelOrderTraversal(null)).toEqual([]); + }); + + test("can handle a single node, e.g. just the root", () => { + expect(levelOrderTraversal(new Node(5))).toEqual([5]); + }); + + test("can handle a tree with several nodes", () => { + expect(levelOrderTraversal(new Node(1, new Node(2), new Node(3)))).toEqual([1, 2, 3]); + expect(levelOrderTraversal(new Node(10, new Node(20, new Node(9), new Node(22)), new Node(30)))).toEqual([10, 20, 30, 9, 22]); + expect(levelOrderTraversal(new Node(10, + new Node(9, + new Node(8, + new Node(7, + new Node(32)), + new Node(6, null, + new Node(33))), + new Node(12, + new Node(11), + new Node(40))), + new Node(11, + new Node(20, + new Node(4), + new Node(90)), + new Node(30, + new Node(9), + new Node(89, null, + new Node(90, null, + new Node(34)))))))).toEqual([10, 9, 11, 8, 12, 20, 30, 7, 6, 11, 40, 4, 90, 9, 89, 32, 33, 90, 34]); + }); + + test("can handle a one-sided tree", () => { + expect(levelOrderTraversal(new Node(10, null, new Node(11, null, new Node(12, null, new Node(12)))))).toEqual([10, 11, 12, 12]); + expect(levelOrderTraversal(new Node(1, new Node(2, new Node(3, new Node(4)))))).toEqual([1, 2, 3, 4]); + }); +}); \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/tree_traversal_bfs.js b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/tree_traversal_bfs.js new file mode 100644 index 00000000..92e0cd4b --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/javascript/tree_traversal_bfs.js @@ -0,0 +1,33 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +function levelOrderTraversal(root) { + // type your code here +} + +if (require.main === module) { + let root = new Node(1, new Node(2), new Node(3)); + // add your own tests in here + console.log("Expecting: [[1], [2, 3]]"); + console.log(levelOrderTraversal(root)); + + console.log(""); + + root = new Node(10, new Node(20, new Node(9), new Node(22)), new Node(30)); + + console.log("Expecting: [[10], [20, 30], [9, 22]]"); + console.log(levelOrderTraversal(root)); +} + +module.exports = { + Node, + levelOrderTraversal +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/.rspec b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/Gemfile b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/spec/spec_helper.rb b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/spec/tree_traversal_bfs_spec.rb b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/spec/tree_traversal_bfs_spec.rb new file mode 100644 index 00000000..c1691ee3 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/spec/tree_traversal_bfs_spec.rb @@ -0,0 +1,40 @@ +require "./tree_traversal_bfs" + +RSpec.describe "level_order_traversal" do + it "can handle an empty tree" do + expect(level_order_traversal(nil)).to eq([]) + end + + it "can handle a tree that has only a root node" do + expect(level_order_traversal(Node.new(5))).to eq([5]) + end + + it "can handle a tree with several nodes" do + expect(level_order_traversal(Node.new(1, Node.new(2), Node.new(3)))).to eq([1, 2, 3]) + expect(level_order_traversal(Node.new(10, Node.new(20, Node.new(9), Node.new(22)), Node.new(30)))).to eq([10, 20, 30, 9, 22]) + expect(level_order_traversal(Node.new(10, + Node.new(9, + Node.new(8, + Node.new(7, + Node.new(32)), + Node.new(6, nil, + Node.new(33))), + Node.new(12, + Node.new(11), + Node.new(40))), + Node.new(11, + Node.new(20, + Node.new(4), + Node.new(90)), + Node.new(30, + Node.new(9), + Node.new(89, nil, + Node.new(90, nil, + Node.new(34)))))))).to eq([10, 9, 11, 8, 12, 20, 30, 7, 6, 11, 40, 4, 90, 9, 89, 32, 33, 90, 34]) + end + + it "can handle a one-sided tree" do + expect(level_order_traversal(Node.new(10, nil, Node.new(11, nil, Node.new(12, nil, Node.new(12)))))).to eq([10, 11, 12, 12]) + expect(level_order_traversal(Node.new(1, Node.new(2, Node.new(3, Node.new(4)))))).to eq([1, 2, 3, 4]) + end +end \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/tree_traversal_bfs.rb b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/tree_traversal_bfs.rb new file mode 100644 index 00000000..614c0f0e --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/ruby/tree_traversal_bfs.rb @@ -0,0 +1,36 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +def level_order_traversal(root) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + root = Node.new(1, Node.new(2), Node.new(3)); + + puts "Expecting: [[1], [2, 3]]" + print level_order_traversal(root) + + puts + puts + + root = Node.new(10, Node.new(20, Node.new(9), Node.new(22)), Node.new(30)) + + puts "Expecting: [[10], [20, 30], [9, 22]]" + print level_order_traversal(root) + + puts + puts + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/solutions/tree_traversal_bfs.js b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/solutions/tree_traversal_bfs.js new file mode 100644 index 00000000..b47ed64d --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/solutions/tree_traversal_bfs.js @@ -0,0 +1,99 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +function levelOrderTraversal(root) { + let queue = root !== null ? [root] : []; + let result = []; + + while (queue.length) { + const node = queue.shift(); + + result.push(node); + + if (node.left) { + queue.push(node.left); + } + + if (node.right) { + queue.push(node.right); + } + } + + return result.map(node => node.value); +} + +if (require.main === module) { + let root = new Node(1, new Node(2), new Node(3)); + // add your own tests in here + console.log("Expecting: [1, 2, 3]"); + console.log(levelOrderTraversal(root)); + + console.log(""); + + root = new Node(10, new Node(20, new Node(9), new Node(22)), new Node(30)); + + console.log("Expecting: [10, 20, 30, 9, 22]"); + console.log(levelOrderTraversal(root)); + + console.log(""); + + root = null; + + console.log("Expecting: []"); + console.log(levelOrderTraversal(root)); + + console.log(""); + + root = new Node(10); + + console.log("Expecting: [10]"); + console.log(levelOrderTraversal(root)); + + console.log(""); + + root = new Node(10, new Node(9, new Node(8, new Node(7, new Node(32)), new Node(6, null, new Node(33))), new Node(12, new Node(11), new Node(40))), new Node(11, new Node(20, new Node(4), new Node(90)), new Node(30, new Node(9), new Node(89, null, new Node(90, null, new Node(34)))))); + + console.log("Expecting: [10, 9, 11, 8, 12, 20, 30, 7, 6, 11, 40, 4, 90, 9, 89, 32, 33, 90, 34]"); + console.log(levelOrderTraversal(root)); + + console.log(""); + + root = new Node(10, null, new Node(11, null, new Node(12, null, new Node(12)))); + + console.log("Expecting: [10, 11, 12, 12]"); + console.log(levelOrderTraversal(root)); +} + +module.exports = { + Node, + levelOrderTraversal +}; + +// Please add your pseudocode to this file +/****************************************************************************************** */ +// if root is nil: return empty array +// else: initialize a queue with the root +// initialize an empty array to store result +// +// loop until the queue is empty: +// store first node in queue in variable node +// add node to result array +// add node's left and right nodes to queue if not falsy, in that order +// +// return result +/****************************************************************************************** */ + +// And a written explanation of your solution +/****************************************************************************************** */ +// We can solve this problem by using a queue. Each time we process a node, we puts its left +// and right nodes into the queue for future processing. So starting at the root, we put it +// in the queue. We iterate over the queue: the node is added to a result array. If the node +// being processed has a left and/or right node, those are pushed onto the queue. We continue +// until the queue is empty. To return the values associated with the nodes in the result, we +// use map to return an array containing the values in the correct order. +/****************************************************************************************** */ diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/solutions/tree_traversal_bfs.rb b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/solutions/tree_traversal_bfs.rb new file mode 100644 index 00000000..7f193682 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/solutions/tree_traversal_bfs.rb @@ -0,0 +1,99 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +def level_order_traversal(root) + queue = root.nil? ? [] : [root] + result = [] + + while queue.length > 0 + node = queue.shift + + result << node + queue << node.left unless node.left.nil? + queue << node.right unless node.right.nil? + end + + result.map { |node| node.value } +end + + +if __FILE__ == $PROGRAM_NAME + root = Node.new(1, Node.new(2), Node.new(3)); + + puts "Expecting: [1, 2, 3]" + print level_order_traversal(root) + + puts + puts + + root = Node.new(10, Node.new(20, Node.new(9), Node.new(22)), Node.new(30)) + + puts "Expecting: [10, 20, 30, 9, 22]" + print level_order_traversal(root) + + # Don't forget to add your own! + puts + puts + + root = nil + + puts "Expecting: []" + print level_order_traversal(root) + + puts + puts + + root = Node.new(10) + + puts "Expecting: [10]" + print level_order_traversal(root) + + puts + puts + + root = Node.new(10, Node.new(9, Node.new(8, Node.new(7, Node.new(32)), Node.new(6, nil, Node.new(33))), Node.new(12, Node.new(11), Node.new(40))), Node.new(11, Node.new(20, Node.new(4), Node.new(90)), Node.new(30, Node.new(9), Node.new(89, nil, Node.new(90, nil, Node.new(34)))))) + + puts "Expecting: [10, 9, 11, 8, 12, 20, 30, 7, 6, 11, 40, 4, 90, 9, 89, 32, 33, 90, 34]" + print level_order_traversal(root) + + puts + puts + + root = Node.new(10, nil, Node.new(11, nil, Node.new(12, nil, Node.new(12)))) + + puts "Expecting: [10, 11, 12, 12]" + print level_order_traversal(root) + + puts +end + +# Please add your pseudocode to this file +############################################################################################## +# if root is nil: return empty array +# else: initialize a queue with the root +# initialize an empty array to store result +# +# loop until the queue is empty: +# store first node in queue in variable node +# add node to result array +# add node's left and right nodes to queue if not falsy, in that order +# +# return result +############################################################################################## + +# And a written explanation of your solution +############################################################################################## +# We can solve this problem by using a queue. Each time we process a node, we puts its left +# and right nodes into the queue for future processing. So starting at the root, we put it +# in the queue. We iterate over the queue: the node is added to a result array. If the node +# being processed has a left and/or right node, those are pushed onto the queue. We continue +# until the queue is empty. To return the values associated with the nodes in the result, we +# use map to return an array containing the values in the correct order. +############################################################################################## \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/trees.png b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/trees.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf1fe455ada65700a751fa50808d9fd7307b599 GIT binary patch literal 24534 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 literal 0 HcmV?d00001 diff --git a/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/unordered_tree.png b/12-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first/unordered_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..1c44303ec2742e599207aa711940754533afb478 GIT binary patch literal 23039 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 [-10, 2, 20] +``` + +``` + 10 + / \ + 0 20 + \ \ + 5 30 + +in_order_traversal(root) +=> [0, 5, 10, 20, 30] +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/package.json b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/package.json new file mode 100644 index 00000000..dfabab9b --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "inorder_traversal", + "version": "1.0.0", + "description": "in order traversal", + "main": "tree_traversal_inorder.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/tests/tree_traversal_inorder.test.js b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/tests/tree_traversal_inorder.test.js new file mode 100644 index 00000000..18905c42 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/tests/tree_traversal_inorder.test.js @@ -0,0 +1,33 @@ +const { Node, treeTraversalInorder } = require("../tree_traversal_inorder"); + +describe("treeTraversalInorder", () => { + test("can handle an empty tree", () => { + expect(treeTraversalInorder(null)).toEqual([]); + }); + + test("can handle a tree with a single root node", () => { + expect(treeTraversalInorder(new Node(5))).toEqual([5]); + }); + + test("can handle small balanced trees", () => { + const root = new Node(2, new Node(-10), new Node(20)); + const rootTwo = new Node(10, new Node(0, null, new Node(5)), new Node(20, null, new Node(30))); + + expect(treeTraversalInorder(root)).toEqual([-10, 2, 20]); + expect(treeTraversalInorder(rootTwo)).toEqual([0, 5, 10, 20, 30]); + }); + + test("can handle unbalanced trees", () => { + const root = new Node(0, null, new Node(1, null, new Node(2, null, new Node(3, null, new Node(4))))); + const rootTwo = new Node(10, new Node(9, new Node(8, new Node(7, new Node(6, new Node(5)))))); + + expect(treeTraversalInorder(root)).toEqual([0, 1, 2, 3, 4]); + expect(treeTraversalInorder(rootTwo)).toEqual([5, 6, 7, 8, 9, 10]); + }); + + test("can handle a larger tree", () => { + const root = new Node(30, new Node(10, null, new Node(20, null, new Node(25, new Node(24)))), new Node(50, new Node(40, new Node(39)), new Node(55, new Node(54), new Node(56, null, new Node(60))))); + + expect(treeTraversalInorder(root)).toEqual([10, 20, 24, 25, 30, 39, 40, 50, 54, 55, 56, 60]); + }); +}); diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/tree_traversal_inorder.js b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/tree_traversal_inorder.js new file mode 100644 index 00000000..0ac4c12a --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/javascript/tree_traversal_inorder.js @@ -0,0 +1,32 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +function treeTraversalInorder(root) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + let root = new Node(2, new Node(-10), new Node(20)); + console.log("Expecting: [-10, 2, 20]"); + console.log(treeTraversalInorder(root)); + + console.log(""); + + root = new Node(10, new Node(0, null, new Node(5)), new Node(20, null, new Node(30))); + console.log("Expecting: [0, 5, 10, 20, 30] "); + console.log(treeTraversalInorder(root)); +} + +module.exports = { + Node, + treeTraversalInorder +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/.rspec b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/Gemfile b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/spec/spec_helper.rb b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/spec/tree_traversal_inorder_spec.rb b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/spec/tree_traversal_inorder_spec.rb new file mode 100644 index 00000000..8ce92551 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/spec/tree_traversal_inorder_spec.rb @@ -0,0 +1,33 @@ +require "./tree_traversal_inorder" + +RSpec.describe "tree_traversal_inorder" do + it "can handle an empty tree" do + expect(tree_traversal_inorder(nil)).to eq([]) + end + + it "can handle a tree with a single root node" do + expect(tree_traversal_inorder(Node.new(5))).to eq([5]) + end + + it "can handle small balanced trees" do + root = Node.new(2, Node.new(-10), Node.new(20)) + root_two = Node.new(10, Node.new(0, nil, Node.new(5)), Node.new(20, nil, Node.new(30))) + + expect(tree_traversal_inorder(root)).to eq([-10, 2, 20]) + expect(tree_traversal_inorder(root_two)).to eq([0, 5, 10, 20, 30]) + end + + it "can handle unbalanced trees" do + root = Node.new(0, nil, Node.new(1, nil, Node.new(2, nil, Node.new(3, nil, Node.new(4))))) + root_two = Node.new(10, Node.new(9, Node.new(8, Node.new(7, Node.new(6, Node.new(5)))))) + + expect(tree_traversal_inorder(root)).to eq([0, 1, 2, 3, 4]) + expect(tree_traversal_inorder(root_two)).to eq([5, 6, 7, 8, 9, 10]) + end + + it "can handle a larger tree" do + root = Node.new(30, Node.new(10, nil, Node.new(20, nil, Node.new(25, Node.new(24)))), Node.new(50, Node.new(40, Node.new(39)), Node.new(55, Node.new(54), Node.new(56, nil, Node.new(60))))) + + expect(tree_traversal_inorder(root)).to eq([10, 20, 24, 25, 30, 39, 40, 50, 54, 55, 56, 60]) + end +end \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/tree_traversal_inorder.rb b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/tree_traversal_inorder.rb new file mode 100644 index 00000000..b595696e --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/ruby/tree_traversal_inorder.rb @@ -0,0 +1,32 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +def tree_traversal_inorder(root) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + root = Node.new(2, Node.new(-10), Node.new(20)) + puts "Expecting: [-10, 2, 20]" + print tree_traversal_inorder(root) + puts + + puts + + root = Node.new(10, Node.new(0, nil, Node.new(5)), Node.new(20, nil, Node.new(30))) + puts "Expecting: [0, 5, 10, 20, 30] " + print tree_traversal_inorder(root) + puts + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/solutions/tree_traversal_inorder.js b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/solutions/tree_traversal_inorder.js new file mode 100644 index 00000000..fd617374 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/solutions/tree_traversal_inorder.js @@ -0,0 +1,138 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +// Recursive solution +function treeTraversalInorder(root, result = []) { + if (root === null) { + return []; + } + + treeTraversalInorder(root.left, result); + result.push(root.value); + treeTraversalInorder(root.right, result); + + return result; +} + +// Iterative solution +// function treeTraversalInorder(root) { +// const queue = root ? [root] : []; +// const result = []; + +// while (queue.length > 0) { +// const node = queue[0]; + +// if (node.left && !node.done) { +// queue.unshift(node.left); +// node.done = true; +// continue; +// } + +// delete node.done; +// result.push(node.value); +// queue.shift(); + +// if (node.right) { +// queue.unshift(node.right); +// } +// } + +// return result; +// } + +if (require.main === module) { + // add your own tests in here + let root = new Node(2, new Node(-10), new Node(20)); + console.log("Expecting: [-10, 2, 20]"); + console.log(treeTraversalInorder(root)); + + console.log(""); + + root = new Node(10, new Node(0, null, new Node(5)), new Node(20, null, new Node(30))); + console.log("Expecting: [0, 5, 10, 20, 30] "); + console.log(treeTraversalInorder(root)); + + console.log(""); + + root = new Node(1, null, new Node(3, new Node(2))); + console.log("Expecting: [1, 2, 3]"); + console.log(treeTraversalInorder(root)); + + console.log(""); + + console.log("Expecting: []"); + console.log(treeTraversalInorder(null)); + + console.log(""); + + root = new Node(30, new Node(10, null, new Node(20)), new Node(50, new Node(40))); + console.log("Expecting: [10, 20, 30, 40, 50]"); + console.log(treeTraversalInorder(root)); + + console.log(""); +} + +module.exports = { + Node, + treeTraversalInorder +}; + +// Please add your pseudocode to this file (recursive) +/*************************************************************************** + * initialize result to empty array + * + * function in_order(root): + * return empty array if root is falsy + * + * in_order(left side) + * push root value onto result + * in_order(right side) + * + * return result + * *************************************************************************/ + +// Please add your pseudocode to this file (iterative) +/*************************************************************************** + * return empty array if root is falsy + * initialize queue with array containing root + * initialize result to empty array + * + * while queue contains nodes: + * node = first node in queue + * + * if node has left node and not yet seen / done: + * add left node to beginning of queue + * add attribute done and set to true (to mark as visited) + * continue with loop + * + * remove done attribute from node + * add node value to end of result + * remove node from start of queue + * + * if node has right node: + * add right node to beginning of queue + * + * return result + * *************************************************************************/ + +// And a written explanation of your solution (recursive + iterative) +/*************************************************************************** + * If we continuously go left from the root until there is no left node left + * to visit, we will have traveled to the lowest possible value that branches + * off of that node. Once we've done that we can push that value onto an array + * and we can then start looking at the right nodes. We repeat this process of + * always going as far to the left as possible before going right until there + * are no nodes left to visit. For the iterative version, we added an attribute + * to mark that we had already visited a node's left node to avoid an infinite + * loop. Otherwise, if we visited a node's left node, then processed that same + * node again, we'd go left all over again in an endless loop. I'm sure there are + * other ways to solve this iteratively, such as putting the node in a set, which + * I did in the Ruby version, but this is how I did it to shake things up a bit. + * *************************************************************************/ + + // Big O for both solutions is O(n). Each node will be visited at least once. \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/solutions/tree_traversal_inorder.rb b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/solutions/tree_traversal_inorder.rb new file mode 100644 index 00000000..1e4d34d6 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/solutions/tree_traversal_inorder.rb @@ -0,0 +1,140 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +# Recursive solution +def tree_traversal_inorder(root, result = []) + return [] if root.nil? + + tree_traversal_inorder(root.left, result) + result << root.value + tree_traversal_inorder(root.right, result) + + result +end + +# Iterative solution +# require 'set' + +# def tree_traversal_inorder(root) +# return [] if root.nil? +# queue = [root] +# result = [] +# visited = Set.new + +# until queue.empty? +# node = queue.first + +# if !node.left.nil? && !visited.include?(node) +# queue.unshift(node.left) +# visited.add(node) +# next +# end + +# result << node.value +# queue.shift + +# unless node.right.nil? +# queue.unshift(node.right) +# end +# end + +# result +# end + +if __FILE__ == $PROGRAM_NAME + root = Node.new(2, Node.new(-10), Node.new(20)) + puts "Expecting: [-10, 2, 20]" + print tree_traversal_inorder(root) + puts + + puts + + root = Node.new(10, Node.new(0, nil, Node.new(5)), Node.new(20, nil, Node.new(30))) + puts "Expecting: [0, 5, 10, 20, 30]" + print tree_traversal_inorder(root) + puts + + # Don't forget to add your own! + puts + + root = Node.new(1, nil, Node.new(3, Node.new(2))) + puts "Expecting: [1, 2, 3]" + print tree_traversal_inorder(root) + puts + + puts + + root = nil + puts "Expecting: []" + print tree_traversal_inorder(root) + puts + + puts + + root = Node.new(30, Node.new(10, nil, Node.new(20)), Node.new(50, Node.new(40))) + puts "Expecting: [10, 20, 30, 40, 50]" + print tree_traversal_inorder(root) + puts +end + +## Please add your pseudocode to this file (recursive) +############################################################################ + # initialize result to empty array + # + # function in_order(root): + # return empty array if root is falsy + # + # in_order(left side) + # push root value onto result + # in_order(right side) + # + # return result + # ########################################################################## + +## Please add your pseudocode to this file (iterative) +############################################################################ + # return empty array if root is falsy + # initialize queue with array containing root + # initialize result to empty array + # initialize visited to new set + # + # while queue contains nodes: + # node = first node in queue + # + # if node has left node and set does not contain node: + # add left node to beginning of queue + # add node to set + # continue with loop + # + # add node value to end of result + # remove node from start of queue + # + # if node has right node: + # add right node to beginning of queue + # + # return result + # ########################################################################## + +## And a written explanation of your solution (recursive + iterative) +############################################################################ + # If we continuously go left from the root until there is no left node left + # to visit, we will have traveled to the lowest possible value that branches + # off of that node. Once we've done that we can push that value onto an array + # and we can then start looking at the right nodes. We repeat this process of + # always going as far to the left as possible before going right until there + # are no nodes left to visit. For the iterative version, we add the node to a + # set to mark that we had already visited a node's left node to avoid an infinite + # loop. Otherwise, if we visited a node's left node, then processed that same + # node again, we'd go left all over again in an endless loop. I'm sure there are + # other ways to solve this iteratively, but this is how I did it. + # ########################################################################## + + + # Big O for both solutions is O(n). Each node will be visited at least once. \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/trees.png b/12-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order/trees.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf1fe455ada65700a751fa50808d9fd7307b599 GIT binary patch literal 24534 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 literal 0 HcmV?d00001 diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/.gitignore b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/README.md b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/README.md new file mode 100644 index 00000000..61162a94 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/README.md @@ -0,0 +1,55 @@ +# Day 5: Find a Target Value in a Binary Search Tree + +Given a binary search tree (BST), find the node with the target value and return the node. If the node does not exist in the tree return a falsy value, such as `null` or `nil`. + +``` + 1 + / \ +-1 2 + +Input: root node, target = 2 +Output: Node with value 2 + +Input: root node, target = 5 +Output: null or nil +``` + +What is the time complexity of your solution? How does the complexity differ for a balanced tree versus an unbalanced tree? + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/find_target.js b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/find_target.js new file mode 100644 index 00000000..98597f62 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/find_target.js @@ -0,0 +1,28 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +function findTarget(root, target) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + const root = new Node(1, new Node(-1), new Node(2)); + console.log("Expecting: Node with value 2"); + console.log(findTarget(root, 2)); + + console.log(""); + + console.log("Expecting: null"); + console.log(findTarget(root, 5)); +} + +module.exports = { findTarget, Node }; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/package.json b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/package.json new file mode 100644 index 00000000..3e4a311b --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "find_target", + "version": "1.0.0", + "description": "find target node in BST", + "main": "find_target.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/tests/find_target.test.js b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/tests/find_target.test.js new file mode 100644 index 00000000..ae40a688 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/javascript/tests/find_target.test.js @@ -0,0 +1,35 @@ +const { Node, findTarget } = require("../find_target"); + +describe("findTarget", () => { + test("can handle an empty tree", () => { + expect(findTarget(null, 5)).toBe(null); + }); + + test("can handle a tree with only a root node", () => { + const root = new Node(5); + + expect(findTarget(root, 5)).toBe(root); + expect(findTarget(root, 7)).toBe(null); + }); + + test("can find the target node in a small balanced tree", () => { + const root = new Node(1, new Node(-1), new Node(2)); + + expect(findTarget(root, 2)).toBe(root.right); + }); + + test("returns the correct result for unbalanced trees", () => { + const root = new Node(10, new Node(9, new Node(8, new Node(7)))); + const root_two = new Node(1,null, new Node(2,null, new Node(3,null, new Node(4,null, new Node(5))))); + + expect(findTarget(root, 8)).toBe(root.left.left); + expect(findTarget(root_two, 5)).toBe(root_two.right.right.right.right); + }); + + test("returns the correct result for a larger tree", () => { + const root = new Node(10, new Node(7, new Node(6, new Node(4)), new Node(8)), new Node(14, new Node(11), new Node(18,null, new Node(20)))) + + expect(findTarget(root, 20)).toBe(root.right.right.right); + expect(findTarget(root, 5)).toBe(null); + }); +}); diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/.rspec b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/Gemfile b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/find_target.rb b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/find_target.rb new file mode 100644 index 00000000..d5d579f5 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/find_target.rb @@ -0,0 +1,29 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +def find_target(root, target) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + root = Node.new(1, Node.new(-1), Node.new(2)) + puts "Expecting: Node with value 2" + puts find_target(root, 2).inspect + + puts + + puts "Expecting: nil" + puts find_target(root, 5).inspect + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/spec/find_target_spec.rb b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/spec/find_target_spec.rb new file mode 100644 index 00000000..c5c9b061 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/spec/find_target_spec.rb @@ -0,0 +1,35 @@ +require "./find_target" + +RSpec.describe "find_target" do + it "can handle an empty tree" do + expect(find_target(nil, 5)).to be nil + end + + it "can handle a tree with only a root node" do + root = Node.new(5) + + expect(find_target(root, 5)).to be(root) + expect(find_target(root, 7)).to be nil + end + + it "can find the target node in a small balanced tree" do + root = Node.new(1, Node.new(-1), Node.new(2)) + + expect(find_target(root, 2)).to be root.right + end + + it "returns the correct result for unbalanced trees" do + root = Node.new(10, Node.new(9, Node.new(8, Node.new(7)))) + root_two = Node.new(1, nil, Node.new(2, nil, Node.new(3, nil, Node.new(4, nil, Node.new(5))))) + + expect(find_target(root, 8)).to be root.left.left + expect(find_target(root_two, 5)).to be root_two.right.right.right.right + end + + it "returns the correct result for a larger tree" do + root = Node.new(10, Node.new(7, Node.new(6, Node.new(4)), Node.new(8)), Node.new(14, Node.new(11), Node.new(18, nil, Node.new(20)))) + + expect(find_target(root, 20)).to be root.right.right.right + expect(find_target(root, 5)).to be nil + end +end \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/spec/spec_helper.rb b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/solutions/find_target.js b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/solutions/find_target.js new file mode 100644 index 00000000..2e6d263f --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/solutions/find_target.js @@ -0,0 +1,91 @@ +class Node { + constructor(value, left = null, right = null) { + this.value = value; + this.left = left; + this.right = right; + } +} + +function findTarget(root, target) { + if (!root) { + return null; + } + + if (root.value === target) { + return root; + } + + if (root.value > target) { + return findTarget(root.left, target); + } else { + return findTarget(root.right, target); + } +} + +if (require.main === module) { + // add your own tests in here + let root = new Node(1, new Node(-1), new Node(2)); + console.log("Expecting: Node with value 2"); + console.log(findTarget(root, 2)); + + console.log(""); + + console.log("Expecting: null"); + console.log(findTarget(root, 5)); + + console.log(""); + + root = null; + console.log("Expecting: null"); + console.log(findTarget(root, 2)); + + console.log(""); + + root = new Node(10, new Node(9, new Node(8, new Node(7)))); + console.log("Expecting: Node with value 8"); + console.log(findTarget(root, 8)); + + console.log(""); + + root = new Node(1, null, new Node(2, null, new Node(3, null, new Node(4, null, new Node(5))))); + console.log("Expecting: Node with value 5"); + console.log(findTarget(root, 5)); + + console.log(""); + + root = new Node(10, new Node(7, new Node(6, new Node(4)), new Node(8)), new Node(14, new Node(11), new Node(18, null, new Node(20)))); + console.log("Expecting: Node with value 20"); + console.log(findTarget(root, 20)); + + console.log(""); + + console.log("Expecting: null"); + console.log(findTarget(root, 5)); +} + +module.exports = { findTarget, Node }; + +// Please add your pseudocode to this file +/**************************************************************************** + * return null or nil if root is falsy + * + * return node if node value == target value + * + * if node value > target: + * return result of recursing with node.left + * else: + * return result of recursing with node.right + * *************************************************************************/ + +// And a written explanation of your solution +/**************************************************************************** + * This is very similar to using a binary search on a sorted array. First we + * check if the root is a node. If it isn't we just return null or nil. If it + * is a node and its value is the same as the target, we return the node. If + * the value is higher than target, we recursively traverse the left side of + * the tree. Otherwise we traverse the right side if the value is less than + * the target. + * **************************************************************************/ + + // Time complexity for a balanced tree is O (log n), since we are dividing the input on each recursion + // For an unbalanced tree, it's O(n), since we must visit all nodes in the worst case \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/solutions/find_target.rb b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/solutions/find_target.rb new file mode 100644 index 00000000..af22807a --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree/solutions/find_target.rb @@ -0,0 +1,80 @@ +class Node + attr_accessor :value, :left, :right + + def initialize(value, left = nil, right = nil) + @value = value + @left = left + @right = right + end +end + +def find_target(root, target) + return nil if root.nil? + return root if root.value == target + + if root.value > target + return find_target(root.left, target) + else + return find_target(root.right, target) + end +end + +if __FILE__ == $PROGRAM_NAME + root = Node.new(1, Node.new(-1), Node.new(2)) + puts "Expecting: Node with value 2" + puts find_target(root, 2).inspect + + puts + + puts "Expecting: nil" + puts find_target(root, 5).inspect + + puts + + # Don't forget to add your own! + root = Node.new(10, Node.new(9, Node.new(8, Node.new(7)))) + puts "Expecting: Node with value 8" + puts find_target(root, 8).inspect + + puts + + root = Node.new(1, nil, Node.new(2, nil, Node.new(3, nil, Node.new(4, nil, Node.new(5))))) + puts "Expecting: Node with value 5" + puts find_target(root, 5).inspect + + puts + + root = Node.new(10, Node.new(7, Node.new(6, Node.new(4)), Node.new(8)), Node.new(14, Node.new(11), Node.new(18, nil, Node.new(20)))) + puts "Expecting: Node with value 20" + puts find_target(root, 20).inspect + + puts + + puts "Expecting: nil" + puts find_target(root, 5).inspect +end + +# Please add your pseudocode to this file +############################################################################################### + # return null or nil if root is falsy + # + # return node if node value == target value + # + # if node value > target: + # return result of recursing with node.left + # else: + # return result of recursing with node.right +############################################################################################### + +# And a written explanation of your solution +############################################################################################### + # This is very similar to using a binary search on a sorted array. First we + # check if the root is a node. If it isn't we just return null or nil. If it + # is a node and its value is the same as the target, we return the node. If + # the value is higher than target, we recursively traverse the left side of + # the tree. Otherwise we traverse the right side if the value is less than + # the target. +############################################################################################### + + # Time complexity for a balanced tree is O (log n), since we are dividing the input on each recursion + # For an unbalanced tree, it's O(n), since we must visit all nodes in the worst case diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/.gitignore b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/README.md b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/README.md new file mode 100644 index 00000000..b368f684 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/README.md @@ -0,0 +1,130 @@ +# Bonus: Quicksort + +![quicksort animation](./quick_sort_partition_animation.gif) + +Quicksort is an efficient divide and conquer algorithm for sorting data. It can sort in place, i.e. it does not require us to push data to a new data structure, and it's typically implemented as a recursive algorithm. Note that there are a number of ways to implement a quicksort. + +## How Does Quicksort Work? + +The quicksort algorithm requires us to choose a pivot element in the array. The pivot can be at any point, such as the start, middle, or end. Next, we sort all of the elements that are less than the pivot to the left of the pivot, and all of the elements that are greater than the pivot to the right. Once this is done, the pivot is at the correct location. We then repeat this process on the left and right sides until the whole list is sorted. + +In the diagram below, notice how the number 4, which is the pivot, is sorted to the correct location before the recursive call is made (branching denotes the recursive calls). First, we check if 1 is more than 4. It isn't so we move to the next value: 7. 7 is more than 4, so it is swapped with the element before 4 (which is 5), and 4 is then swapped with 7. This continues until every element before the pivot has been evaulated. + +![diagram of quicksort in action](./quicksort_diagram.png) + +## Performance + +In the worst case, quicksort runs in quadratic time: O(n^2). This will happen when we choose the rightmost element as the pivot for an already sorted list. The average run time, however, is logarithmic: O(n log n). + +We can improve the performance of our quicksort algorithm by choosing the middle element as the pivot instead. We can potentially gain further improvements by sampling three or more elements and choosing the median as the pivot. However, choosing too many elements for sampling will likely degrade performance, so it really is a balancing act. + +## Implement Quicksort + +We'll implement the quicksort algorithm in two parts. First we'll make the helper function that sorts elements to the right or left of the pivot. Once that's working, we'll work on the main function that calls the helper function. Our tests will test the main function. It'll be up to you to ensure the helper function works. + +### 1. `partition(array, low, high)` + +The helper method `partition` takes three arguments: the `array` to operate upon, and a `low` and a `high`, which are integers denoting which portion of the array requires sorting. It returns the final index of the pivot element and performs the following operations: + +1. Choose the rightmost element as the pivot +2. Declare a variable called `pivotIndex` or `pivot_index` and set it equal to the value of `high` +3. Iterate over the array starting at the `low` index and ending at the `pivotIndex` + - If an element to the left of the pivot is less than or equal to the pivot, continue + - If an element to the left of the pivot is greater than the pivot: + - Swap it with the element just before the pivot, and then swap the pivot with that element (i.e. the pivot will now be at its original index - 1) + - Decrement the `pivotIndex`, since the pivot has been moved to the left by one place + - If an element is equal to the pivot, leave it in place +4. Return the `pivotIndex` + +Your function should sort the array in place. This means you should not be creating a new array at any point. You'll also need to decide how to best iterate over the array. Think about which element needs to be compared to the pivot at any given time. + +``` +array = [3, 2, 1, 4] +partition(array, 0, 3) +=> 3 +// array = [3, 2, 1, 4] + +array = [3, 2, 1, 2] +partition(array, 0, 3) +=> 2 +// array = [1, 2, 2, 3] + +array = [2, -10, 7, 0, 1, 3] +partition(array, 0, 5) +=> 4 +// array = [2, -10, 1, 0, 3, 7] + +array = [2, -10, 7, 0, 1, 3] +partition(array, 1, 3) +=> 2 +// array = [2, -10, 0, 7, 1, 3] +``` + +To determine whether your function is working, check if all elements lower than the pivot are to the pivot's left, while all elements greater than the pivot are to its right. Be sure to look at the correct subset of the array when using values other than 0 and the array's length - 1 as the `low` and `high`. Finally, the method will return the final index of the pivot element. + +### 2. `quicksort(array, low, high)` + +This is the main method that returns a sorted array. Once again, it sorts the array in place - it does not create any new arrays. It achieves this by partitioning the array using the helper method from earlier, and then recursively processing all elements to the left of the pivot and all elements to the right of the pivot. The steps are: + +1. If `low` is less than `high` + - Partition the array using the `low` and `high` values + - Store the result of calling `partition` in a variable (recall that the result is the final index of the pivot) + - Recurse with the left side of the array (use `low` and `high` to specify the starting and stopping points) + - Recurse with the right side of the array (use `low` and `high` to specify the starting and stopping points) +2. Else return the array + +``` +arr = [3, 2, 1, 4] +quicksort(arr, 0, 3) +=> [1, 2, 3, 4] + +arr = [1, 2, 2, 3, 4] +quicksort(arr, 0, 4) +=> [1, 2, 2, 3, 4] +``` + +### Bonus: Reduce the Number of Swaps + +Our algorithm for `partition` always performs two swaps when a number higher than the pivot is encountered. Can you modify the algorithm so that it performs only one swap in this case? It should then perform one final swap to put the pivot in the correct location before returning the pivot index. Take a look at the gif at the top of this README if you need to see it in action. + +### Super Bonus: Choose the Middle Element as the Pivot + +Can you modify the algorithm to use the middle element as the pivot? There's more than one way to achieve this functionality! What about using the median of several values? Or a random element? + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/package.json b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/package.json new file mode 100644 index 00000000..0530cdaa --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "quicksort", + "version": "1.0.0", + "description": "quicksort", + "main": "quicksort.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/quicksort.js b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/quicksort.js new file mode 100644 index 00000000..ef227edf --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/quicksort.js @@ -0,0 +1,23 @@ +function partition(array, low, high) { + // type your code in here +} + +function quicksort(array, low = 0, high = array.length - 1) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [1, 2, 3, 4]"); + console.log(quicksort([3, 2, 1, 4])); + + console.log(""); + + console.log("Expecting: [1, 2, 2, 3, 4]"); + console.log(quicksort([1, 2, 2, 3, 4])); +} + +module.exports = quicksort; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/tests/quicksort.test.js b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/tests/quicksort.test.js new file mode 100644 index 00000000..f2100374 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/javascript/tests/quicksort.test.js @@ -0,0 +1,49 @@ +const quicksort = require("../quicksort"); + +describe("quicksort", () => { + it("returns the same array that was passed in", () => { + const arrOne = []; + const arrTwo = [1, 2, 3, 4]; + + expect(quicksort(arrOne)).toBe(arrOne); + expect(quicksort(arrTwo)).toBe(arrTwo); + }); + + it("returns an empty array when passed an empty array", () => { + expect(quicksort([])).toEqual([]); + }); + + it("can sort an array with a single element", () => { + expect(quicksort([2])).toEqual([2]); + }); + + it("can sort an array with two elements", () => { + expect(quicksort([2, 1])).toEqual([1, 2]); + }); + + it("can sort an array with three elements", () => { + expect(quicksort([2, 1, 3])).toEqual([1, 2, 3]); + }); + + it("can sort an array with more than three elements", () => { + expect(quicksort([4, 2, 1, 3])).toEqual([1, 2, 3, 4]); + expect(quicksort([4, 2, 6, 5, 1, 3])).toEqual([1, 2, 3, 4, 5, 6]); + }); + + it("can sort a sorted array", () => { + expect(quicksort([1, 2, 3, 4, 5, 6])).toEqual([1, 2, 3, 4, 5, 6]); + }); + + it("can sort a reverse sorted array", () => { + expect(quicksort([6, 5, 4, 3, 2, 1])).toEqual([1, 2, 3, 4, 5, 6]); + }); + + it("can sort an array with many elements", () => { + const arr = []; + for (let i = 0; i < 1000; ++i) { + arr.push(Math.random() * 1000); + } + + expect(quicksort(arr)).toEqual(arr.sort((a, b) => a - b)); + }); +}); diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/quick_sort_partition_animation.gif b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/quick_sort_partition_animation.gif new file mode 100644 index 0000000000000000000000000000000000000000..14b37f0e47274f86db16eaa2a7c0474a8e26f301 GIT binary patch literal 151599 zcmeFZWl&w;8s>S$advhF1OkgIs&A+1 zFTC9YeS`jtOau(*57csBj?oPn=sqtm-TthoTTQ2cq9{pes7r{cNO7>R!2kgOz~3Ro zkMextvWjef8~9%xSlGYgf7`$NH2?0tpCS3N7!9a}J%k{ooIHs8{PWyD@8zHQ^3Qts zXP@|I|NJ`#{y881IXC}5x)(gcB5DGl0H%NKME|-L0brr;2V~1T_>M>0pvK@R^Uqn< zWk2nXe>pIXfB&-X_Ve899NL-VAj3o$Jy75{XeW?8QSx1`Qm<;E!e#i>EAuiu>kKo}StSQrFu5QwUmuy?R) zN&#^U`%fQN?+C>l-t6-9mdr-~8pr19A|68T!1jgY?))4AEC}{)1pq>LLwE*|KZF=} zi^2lm#HiRPvW3mw@UzNA?XqA&sMi#oh@w=GKn!RqjrqcRr=ZSra3iQ-b@yDV;GfhATHAdJJXdGCPU=}72cAQ0Zc-Xa()^eIBkaoK(GK3 zb_P9#?WpSp{++?c%i~3B$y^E@Ph*y;TKjXgAfg7=pi+tKEk(;ZauG|9QrtROiq)1c zmN=g-7;@=&%k|a`sUNi*4SIYeP%`ir^gkz4Pg{H#=E<1PG~!43X{?^RJT8p@IYZ=H zYFx~FRV(UryPJp*h>xv2VRAHxop^gZZt*nT%UskDbha9|Q`+x(rj1G;X|D6)8m1vV zT4C3ZiY<*>Lq0=KQQQ zeO8QnQ289-;Bu@NV$C-+IbvZGEXNKdx8&VUHGs~0*a0T?f~kCKA>Qw9#y>nb;6ik0 z6h8uGoE0y&?c2ZYy|==Id`JH%AucNxEo{_duK0$XPzbvL8@Qe91VPwK`EnqMm13){i-Qj*V1fJm_ClJ@>AUBk@>>%$4&(T4Cj5Nbx zL4uaeVPT48*Rw#ilbQkA@{`&Tp5qf}-GnsbY5k0r?PfI`(JQZx}vcInBoVBiJ7Vg2NtMm;K}N|ru$TXLI80B z;Xx_@q5G5TanWmHhd;P{?oJajbi&^e&`2_Gra!EosI-bpq2A8k!o6@vvY2@{%n|Rj z*UihZ4*E@+#lO3mB6@#Vzht{VQa|hPN0=KyzR0j?!Wi1%j3^>raK9#Yj94ceDDkBk zUYGXmhTYeUzj<3&V$97jfyx^dI!U9L^|+-Ok^Z>!X3Z9JkpI!}X*WyV-W@)&`0RSG zUq!e(0N#W}aH4!)e*H}3-ri576KXIz*NeA)eTYw8B{Yt1m@|1j;p8K9OK##IeA_+k z0=S!XIBUNeQHG2o?e9lhR5%ry>WZ=b`U5b~0#Oa2vlPRC>3RJ=CN^mMG%BpT(#L zRv$a}L`MfpI4Z^;)Jyj5g-_rE{FOfz-wslT%)mJNRJhj(6*U=wx&%HI2H-!0v zffGgXcHi<)C6MHlY~om94hrz(QwP->r^3&>^65?ZhskS$z!fucEZ<58=T0~hJ1Ta; z^jE`%Mwnl_SF%|HQb%r?(`I4!xCJTY?d;Xl8>uaM3Lh06gQwH? zCHL88OGgBgAhH_6Gsze!SWb6_b%SgznLDatIV)pH`^E#+h(1dt%bP-B( z|H<5Kk&JE_sav~!DUz}MxYT{69{pzLWSbtQ5J|{wKJv3jzTrUKJ1r(Nl*3w7 zkx_$sZpc1oUIftnQtzxA@)v~JDgzZ_4)+fLV$;ua`xqbbLW z&yK5U)!z`rs1dcPrHpEp-d`fGygyFN9Nocpc~}0KUSGH10=2RH9kaS0N8_Z2R`aLZ z@o%gV^XnMN!x-8I%MMt;#YE1Qd` zo~<#+T=#Z}zz~_5b8nhmb?#|f%@1X4tQ}?Y!itE@1nRWD%rZ?}sV)sI6?DMto&8E` zUOGbNYXe3p8g)b%z?n5vo0YS;)iA8(I4AyePL-v?NJpR4eK0eR*p+tI&+f`PD5EaA zv|t7=u6m@Dx7Ij#8;5WA+0VCw;hBOzFKg3{!FC}vC~=V;I#j) zM&V&9Vb)wq{Ie_zIK0nzY)Sr!ovoDO#fBQoV=_bQHi5*e?p3;FzS7dZHo8N5J=}S& zE6Gu6%HOtTqj9Xkh?`9@(vYP*a$?2u)N}fHG2D1(G4DeKPxOJqLV~>Z@7Hd96J4SLwFrQ`j?-#uy$qWS_5XdYCunEOQEvifZd% z#_Vd}(CF#jnqpH0m|CoLzPRvIeA^fP;dSgn)h&+P_<6+!#a4GijrMz?a^`i)KH(l} zKj&B>l*D#p>$!XdjknL+?pv-3UfnZ%qZ2)2wcz>FYRAtb-x`>2&dGYTenpR=g&%JH zhSRF8PM?%)ckGRNDpwDT9%l2-tbUih_PoG5b*wUhen^}adaQGGbj+>NFz}uTym74R z+FLdI>K**FZ$w$%bm=DJ9ZUT9pxBi0sCryU_+y+$Cs%H!EuQ7{8=h+!I(naSVLaKJJDsKD{QS%F8n5r_1iH`d_}nWvL}c9d>&scw`rH1#C*sT7 z1k|v0?dhS(=W5>l70(k%%6CNDySrHR7art%A9BeHDVkS(&*wWGq6Te(5a{?4r9e<0 zEOBHY(0I>23Ax!`$F?3H&j7hHYQMKT*`EnA{WnJ8_2LQC60sTqtXwkjy#a~e1F&`i z_z(mAsRPAQWFjT`lL9|Jt4J@Xe>8@b@of;ZtCwar4+`T7BGU+R=nZoD9%P6Z{3+Ci znhj5-S3<#2^1_Km9acml&_6$3(q=$d6I;qTH2BO+3cwXIP8H&i!jGKr!J?T+sX2h2 zE6^xT%q%o8LI+n?hA);{_9HkLX@@3AM+ioYML;Hq3p+@{UxJ7{RPH9!8Ade!0V*k) zAbNKl5|bhc?3H}14J$PZhYOS>p^_|V7JZl&sgU854HTrgV9u-yUZRRfm=^AxjIePM z8qNP_{Q@+KhQFO_xga3_Zl5zklXZ<-`k1LFh7tc6^Qf5PgDw&Hj91Xqk&bG z;lCCYG~5bQAGmlE~u|aW1HM7F}~>SR0I4Spclx z2T{(&eJCcVw&RlbFj-VuK%R@t!R{%csVU(tDL)odq8?LXKBrhBrX=X5Cb_4kq^72| zq-HFpW<93n5Txbtrxoa?6}hLCq^6a%q*W}Y{d`QTCP=U4Pp{WaZ*)&@PEBuZNpD|F z|Mi&ONs!UapV6zE(eIuykeV^nk}&x%Qa3 zL6Eh@pS7c#wdbC7keYSWl66uF#`yaO_a6fKhk*VepnnMH9|HP^fc_z%e+cLw0{Vx5 z{vn`$2eRU~p)7WOQtNVsdJFW_E6VVR31BWp!bJXLoP^ z;PB}9z?Cr7GoutW)Pi z@|ZO#qMl=+Og29ZqG*c-*gppWM6PI~;XeQa(1Le3tS=6%p*OVuQsi9=s zPA}6oxwK)Jmkt=Kc-cKV+*kygWo)SQ?x>+Wuq*HuIdf5yS+T?#>4M8PS#))vKRhq6 zEQup%RD%vy7+K(E08qi|mGxfK77kdakG@>4Pkg=>Yl4NZ)ZTo#JrK|MX{^2FdVeBc zK3l1y_4at7&USsQqs{dM(QX)#&49td5Hx`G{#@MY?79V({9@$;kJqPb{fZ`shOz@F zAiNP9>P~mK@TI%6mIF*)zd8)l$>Mp$cP_IR% z_8L7+qSu{!K@t(X&3?Fz)VQ-F+lPP&J{fnppn`yD_5fP& zR|6^qWhhp!Be9-Ime(qhdZwwa2plrQl?Jy_D}PI}wg1vXnLgVpKNKide8E6}4yV04 zblM!^r~fr;^q2nEHasS{Q_vJG>LKV}Zes%}os{A&&G@^sR{~(5qM(%gUxD2A27sdTK z5g-h^h5mU#ob1;`D0{&Is)ddO{x8-LfeKRe2yicz)?~OOF(p=MiWC#nUNu4v)fBG- zzaJs#T{ucaUV{u`zb|vm4}%vp3IKW%K(x4>=UW123(D-1shCIDf6g9PTpxZ-nI+33*df+FbJ+xb8rtgvnY6$V zsj?F_`gDy!w?4Hb#Tzxc#00rsdRaCBGkisZCP+%jH%q&fd>S+H#HAOj#4nOGnrUIU zh+>>+3dqQ%)f{QIPv5i~sK>cpcMEm9;Th{Ck?1)eX@(F-GH00R1jo6RPP(R&_Y5pk zdA5gZcCO^)N~wjuBB_Ydo`^)6Vk<@=0UrG}Vs@FRulZBeOpf?`@le4@N*Dd#JVnnCwWTmkaFf~H=vM$%y%70scfy53+I z{B1B&KCaqtHNYg>OfDJ3I$4c-=m**#_dO;&>Cc7gjEZrwBL>l`wt5rk$RQlEgvY#@ zi<3*JbXgSdhU8_-vZ^w$i!E!d-*^PnWgBk`(tGK}I-Zp23Nhn|4RB^t@KpJ5_yH~qU%`ads?n&Cqg5W9>*#gs%B$RtfT+U<(l#O(8gMw zNNpT6TV$CiFI(A2nB~tc+n34A++sUF7W}c}*t_ye@*`gJ)LnB-JB`=2y!Iu0V_C~A zv#W@$Vd}#DuTf3>z!kdHOdLm8HE(s>WfY^Ay<{b9mU7+7tAzU2xE8N63lG-e#XHI( znWfdAUh)DplJF17C%1OruAj8ae@Hi{4O(AH9@ETJxKvT|9E=efK;Y3i)X<9z^)awk zt}1Y|xyRPkLCc1OO*m4kr*uEG4dffr<`qsAEmVaD7mh3!>I;Q!GKXyCIsR}BfskVo zKeZ8jds^lERZxs$pGRAhdydkXdpP?B ztm7R`6(m?JL6o9P@X>ORobSSC1Ln z+wY~knMdj&nzJ=o&YB%UhbKl<&iZK1Inb383%a)1$zLuFPMN1)UEAh5tR$*^4Nh8r zJ+0iHIp=LpGUCo$jkOt-RrZ8?;U;*l6WO{NY_G0*u?lU91YNTn2^~1Bd+y==b|3th zb>#!4+9pySC>%H7-h6J)<#3Ikfid!~`ndk|z~k97`@yUNuf0|}m>!A(R^Hp zP$~1B_8%hB%S7d$+s6!#Jzsq;3&*`?CCBd*2u*g5#0A20qa0g4y4C!GwoHaWwRc!E zA9d-t?wUlLD|_AwN)TS&ljpDm^>p-IDc3-Ia>uP&iy6aveA%)1pss{K9mc?TNC>YW zEST4i$~UTqFb0OJX40Fo$D=%es}6`gR?JW~Ewr)EHTj2IMxDEdmk8fY5aHslhlGK` z4KTm&d6UdTtKzrR&3gsI7rd?VU4n}&AB<`Z<_Um!IdModdt3#uKhaTlVzF>ctH=(} zNg?u{O?xUA@QJ{1ortlr!)Pjic?nAh)tl80)q;hK_=u+i&HRH~VKt4w!QG&50i3}` zo54Ab!8)N5L;(TR8zH~C{aqGV_dfj1OL_ZtQ!F zLNESdK{|Bs{tU5*{>g43ocJ;|oKQi19gq|yU68+*T{qBuigth(Y&#t~u1y)%&F;Yw zp|2Lv<`&VhKvDVNRTWCtqr>PE2Xw~_|0*6q)Jeu;yE5k#HiwU+~fID;{{scg%;yKJjRO>B#84TNa`j? zyC=w`CdjoUC@dx@Jtn9S7$>UnCu-;>YPl!sq$cXMBpNIx8a*Z&6C|1PCzyWe^|8@{=vx~nqc_Ji@n;c{g&X$)E;6!3y)fB!oScAw(J2_s)T z5&#``-_iV*-5X0SM(7p7u{#*bq<_TlSe!qi&-J>{uFFW51=Ej4h|)QYGhs{^K(P?8 zAqsK7MtcuFlIsM*s+42!O;{aIS7^1UIpcKF>j3rP9%R$GPZzWme~;Og-HrRfs2u(Z z>TA@~&GReJifH4VGyJWMpxakgaWd5%j3g7UH&DYd6l12FNPMTV(w1t)zm{fQzA#by z9<{T)gyl$g$Y?lAv90lRx!LJ>ZM3cFe7!ROh3vn94tMk%Dg(T(lb22DcfX@ls+43| zgH9!DiE^U=K;yG04S5974fgO^SjcP;nxX$usg@tJW~J}bOs(rXHXNu&WQq0~ta2$p z0Ww%Yg{lGrlA2*fO><39e**#tJz+9F8dH|7I;R8|XI>1OiGE8Y@x?Sp$b|)l(q;M1 zH6yHr1g{{7{!st&u*N-yNR`hfFm_-ZF)vKF2;e~rrJ_8N6-|w%b&1b(dk-p1ij}aL z&(~pZy*H0~XY)|#ZxQT94VWXQp^3-(&cCKXk;X$CYN4c?hxF8ku>YeI6+a*H^6nwR zT&f;nTT5w8cF)VI$oL0DMrnf%?nRZaOVw21NdXXA+w`fp4-pGcN}S=*<&iaJX~m!k zAZB=@;G(~6DUz_+Gok%~1-yV@-I31v%hhDK>NE6>h^>r(%lT{9Wq2qXJTmJ@H9KWe zn_makFp)zuKIG_Yf0v!m#UFBY@N5qr*x;%FO&@TCj9}{F0N|RpyB_6RwyWx6A+s|Y z6NTw;LMTeayP4!orlV}bO_?K|QpvVq9m3>$b(;C8JnGl2Y?j$DUHWw5JR$KFu%W3P zoyj#XIbOjtwwv1j9j=HzrxOH+4RKxbx<74NM_KUJE@scZ;DFOFeC1ix;9;KKQekZG zGK`TRAsY(N_PK%X5}N;=ePDZ;w{ zJP_VN3Nut-(r5fR574sERfK=}!&{#GHEBSC#iJt906Q;r1>8%VRTU-dWfFD*{vb5< zE!ur2oA|M$LjV&a(n^wYOJSk}ag8n5ekC^n!q+3LcI6iLy#S4wKvv0-JwCZ0lbRcQ zXx`!~CX^|UlDTi-y!o3a_Q3?>J+?H9OMVhc`!1u|&X8`uW3nf#<+~t);*P?pP#Vlk z1VS2lUcJxB2i8T*zK=szTJdRPy?b2Su%pN_oXIspw1jQB3VENgGFIC6_z|o}?TV%| znUD4an+TMh$FMS)G4}}u7l%A+oibk{iiD1l#+^}Ta_%Ip#eP33L$b!@p13GQ77xZD z0vb>+kRn)uS#L7LNW=5Apjcc=K+WqXRi0D^7%9blBGTg~e-@=w)-YT(MO?Y)9SvCa zGxC(fukjQN%|k?;vdMrXuHuioB}!IHQ$@5~rL3b?@P27>x#5r!l{RgB8eHxSe|xbx zbvf-0{zj}>g>s#1h6zYqqbD4PwauvR!Ny%g{SsG2!_BnK$&zZup=J{1GUL=1GFROa zlayJ9tu9EDvttYM=U?+&he``%)_S6hqVs5yMUo;-k)cNZ^~gp*u*B1kr(R4j{Fsk1 zXZmW!Bg2L%2vu;QjVGv{2L}F=DhjVi&}37yFri70z)~yxT@4=*%ayff*@pPtPZTHz zqXV4&GGE_UHCGg3wvr*i5j6DH+MQ^tPw561Zxuf;-Pdw+k|qb(T~xTRSUtbAR+q~r zw{|ytF1l!2Xl-pQHzqlE9~>V3McUX9pqAlVKCItzMAtON%%mGjyMEK%)B+oP@az-P z1u7^3^f#YS(l2fFd{Ayb?9il7M9E3Zb#)m@tTwfZV16`8=~9_ptVFflhTEU-jOWebxKu$&Gla-LELkRH8+-rsly@+x|>~;TI>^^(x+5 zL0uCYkE(bTT^fi2`6}u-V;M>PVNj4X+?IP_6Nn$*WBpT4go=6jwkXtq{jScG zU1%S$?KbH&%bCp?X$FF6o#K6CFK_y2*a)w`5V3cyg-)|$6kVzE{*ExhiR1(JJ;78D ztxJg4@v^Gbg;DVbC-{zM;HdOy|B$6)Bi*P9GnMBgUF(;5j)pB=BHV?rBF8^-|n!Dt??x15`#o@Y4vr*^cBm@f&x9pQDkM;jhDw!ZiP>Z9P#!v z`bxh1V{*7LHSFyUZgr?Vw8;-$?(G|1X3O)S;>Azv5q24E`cti1^;Kq2l+7k&l1}Uh z?O~*oV$wVO?YY$p02;mhx+aOwjuEX}wou9J7{M^=I9DCqvs3jpp*A+hxW}-~SEF^_ zJ-D&Pq`{!Os({t~K6~cYX#18A%P(iD!-+jkg-eAnI$fKuZC!;=O%ATj+a!OU{)BjF z^Xd!XC-q;e+!5K@(WQ@b2W#&k3?FC0c+FY3UL9P%=$qlc?#ZA_AABRdAHUZ9hOEu? z^V8VU{BXu)M-R(7CG=NCy3@M#Y)fS(iJSiU{Y{-wg}aN_?o0dcNR=O~ zk>|_LeaT$R6n;NdlM&s~y}K8zy4`(kcwXJs)-}$#ay=uu->D+>hR(vhIG=@R)bIPg zY70O=LJ$xja1Z>z5)HZ_wWnlD@?;2NvptTrAAB<;%?Uyv<3|$ehg#y7I1N#~g}ev5 zW6HRb;`=i;`(gdjkirQ-+0}rv@I=OUrql6yPS&MF2RXXf)4Zsrp?@E1D>ka*yc z0td>L@DL^ibTtL6I|oWG1lm~zO$7%@@j%F|1MmidL=S=t!NDdACMpYtYC86M58gB~ z!P1ESUk`#65JQ~6Au=*Sau5C>w_w#2|Cc6uE*WW$1BipGP%CwSe`tt}I;C+5f4!sv zbGM;a3UB`(VC0TPA&gw6hD6E(f7*j=R=sF8I6Rk6G~XH;UOy9-<|Ic*9afg0P|ox5 z+g~%BhQ#(CAs?;?hkEh)l8AK22(g)ncI$`+KFRn8-tqz)8VJs=dT80TaVUQyLT@ELxZC)u-+}WwvL}wQ zDKlby+mZ!aqO%L4@Unuu;<4yEB1_GDxPbyhfojAWQe?2=q;Y%{NbFSfkvnzt^pAE^ zX5xZ}+>D2ObYVckM}ZZI_=S}C({9`K`~+%82}CC--hPQP@eCMU7o@!?eEASvV@7tB z9QLFm!HdKnHqCFA8ofeAWA(`MBM~9{Ye~;53h|tO*8ZiV{_{UL8;?ASIxVJEA2#tP}{C;{LIi%(lgr zu$Yq6oEn40o8Xj&;J~Xv&qrL!!r;J&`<|T0!s)VDCcWpxg#_x@XWjv5=4h7`8JfWq~1PEbqct zI4IJYMOo%bv%nNt$JU_LtE`Jf^c8W(Iq?eD>8b3u$7}#$4oDyeRxbzMBWD^@{Jtdz zbtwn!Dd#<5E~Y>(wq7o-M=pL^E@5jf@lr17Q!Y7S9;HAYwO$^rM;X(^B8 zDUXdXpF<#@OD~_tBcCrVU!XN#Xes~0Q@$u+fw(|{q+WrvM}bUQfm~~W!cu|KQ-KO$ zp_)LUhF+nTN1;wyp(u>4R$!5UUN>&p_3XeLB@!%iyjE{2XL&D;~P7HfUpekIp+KTFd$Z0AB3N# z29ZgU3E_~EgSCRd7$fwewpx||vavvXQe9k3ssL80er%+K!sTpj^a>n*tO{6=;$V^{ za^v1Kj4Xl!PS}G5AoE+FoZE_;6-ELGTX};X|D7fvTK!4Ug#TJ*fC^Y_u8Yk*GGdS& zb!yjN5%?=qRzAq{?+1>hWxh@#_d+}yO#7T&!~E=Enl3@qG~#vZ;yB&wN~BDX*=fDo zu+9VZF)i0BNJ{N5@Jg^yxR(kd&OGtvapM??KDK0VfB3Yix7a`c)w++x1ORzPLz3)s z`tHO4XmToQegoJaP55w)N{9ntzaMOdkOzaeLaCFix5B_hC0pT4jR#v1Z2jQvA6#?R z+mU=j4_NOI-mtTS8xcDD@Lah_#YsVZ#aQ$YkFZ*=hILR^pe+l>KF-A}mm*MGiRUmk-Jbg> z;SckDY#!OWCq+6sd(Spx1GHQuj``CkZM3H|k4b;@bK}czoFDGahqNCBFR&4_U+kuu z6us8w5PUmNSDMO&7HCHLzpc~_-+4XmL5AF;_x^aOBye?e6_awxDEBWVEl2&FGF_d3CQl?Q9;}R^LxLFY#}o zSUd<(^*ey%?9#Cm`TA(J$ivM!^Uy^QC4o@!%dlRc8Gh+NFJ%%&n3cg6-e9vdW07h& z^-3PJm9Lv8Z8FN*%MAC{x`AQs+Yfu#9kNYIY4O@vKF1SM5?MA$cGH?@?e7KD=${8f zwH#xjz4S0iQU}PwV`9B#%)!x(vT~Mj3HiinWY=IBEu*Q#Dh(=1!Ov|{Q8}?iOgr?N zsdCwsYDqPLRHS|_@}H!q5*m+l(ZA4x46cwB#gC_}eFhmi7Ya3AD2(Y7gK$b3g3>!Q zB4k>Fik@S`(`Ku zQHJ^e->2eDpO=5OO0*ZDRp?2%ut*Ap}xhgPysFG5P)t0#kcX?K#tSEvVt~pLKa;q|?`$vS5X0#e90+q@F ziKQyOWlCSg?{oY#M;tPrjl7W?vYkjO>=L8=jvbw++lsB{N%At}%PD^a~oOSPVwZ9ap?DEs}i_*6M?5hoz1s9&qxDv}AOOJF2 zXSRkCN-*E5yuX}`S_>%t5iDYxdUMBFYQ?WOo<(*5aUH!K9h{f-s^(Q59cJ#a(Tr9)^>Gj4}jfsSE##y6Fqj?GRGBo=w<_=j)jt z5$``}`DR_i7~JlVgb%TCf=n&!Pc zyZ&CYi$2S#V57oPhVya8u;V&`>UBD6QC*n3=r)IfdfQ;!z2t%6*a!GT$Ncy-FUMk2 znCN*}>8x$I!3-(N9r}EA#W$x&f9#MdteDqY{JRaUHdVwtIU7;1$B5=c4Wq--a2!jH z)U>_|MR8|-=&4gE=_0afcE|1dQ6f0&qDqx`k;&<_CpGG>h+qGsX#V^VUgmu@Jk4P* z!~OhPh8l#@{_uPGjocEpP4ju=S67tNIT~l@rmBK(apQ#BYrV<8c7^u!d*bt$EE|)n zG}=CYJslQDrQ`YrUDB{eFVB&>t!p-Uo6cTnpZ!Jhxk=`S{oCG3x~530YUziQeAB_h z6Q4(u!Z*&6>;}yT;-lH!m6J;P1o~IoMPNb;M^2AT2T6p-XbgjbUWCHA?;pW_K(=d_ z@{e=RKuTub=j1Vtjtlp-=S4$)mx1Tit7x+JO%iFh(XSs&;tgNAiPkSh$lk7DB!sA` z$lT`4eqCk#_Bv43-V-{rUp{iy`SjuU?78M1ozF{`mG2xozpOmN z`g8c-dLn1C8|aC??=wuiL}d{to1`oZANLjSH>3vz6tGHeorH>{>r*nzK@)JRP7KXV z?03FsG!GZyfdCnpA0|O8-OmpR%Reb!jM|Nel*@0*g$Ky2V&#Y5?n{#b~js2@Sm+d?A}!U&=4^JWr%u!69rg=X`4mn4EF&4SSK znRTtXrLcm%^M&o{Jl3%Sh^y%jP{8kV-_GB1#1~`MkA6v}G?EFD?Iy7aJVj~>Pj+A1VAjWsxnc-6m~O$$1gUiJNMMY^7y>XD^)VbF2T+12elaDao*T-J zMU$XLZ|Wa~M-Ju~1as7dMmxsqPeqe#&<23$<3N_-YV_`yV5!duOtN&+{qeSrVEh;; zSgZwXrWTh{7ca!0AVLtYOTdal&ciT4t#pN=0!ob9jyFq1k;8=fjRUYuO{yTL&h4kV zNTT{r)hLzfCt~t{s7Cjjv{6X!8usF1AE~D`Q^&~hQXWx7Q{&T1QSI+i#{fxr|4})F z1VaJ>VO^zFiN=dbq!$}w*?$IJs$z@#^BZ3#HMbyX4Zhhda2IOjfla0`Co8(tMUY-)3wUV>9LP>Wh^opjA;+tMF{a40VA&0hjf`}D z!ARsM$W&6ad{dx)3cLM!i|)sUQvxSDP76---`-Aa4uIq;hCMj}zVUwZ`Bgr73l+tXHkB(*Ou3EMG``twS;8HRj1s8INi*{HkZL)@s18s_Ja9CUb;Y@;M zh9jw{6}-zq;h-8pBw&_+R*xBkxZB~Xj9R=WrL@qX#}BFYk_}0Qf_p-U{vX*U8X1^ zUO=jV)^?9E?81E-4P&ZreJf)qnm0u`{yF{BTGrG$wp0#h&G0WZs{Z(_?V^AA40Ob? ze3(UH?J)z)Njp0KUC2>Q(h816smvt0u&J)~*%UNrLfKxbhEI`Zs`#{dhEmhlgJ$68 zMZ6!*mJJs|Y^(U&P^D(DS}6mlgFL`^J#xiBKBu}LY+Ul`6?9TJPO5y1H{1gMif<&D zZD#<7OecIYsz7ymQ(pg8yg#F{tqoKq68yq7uhV98<6zRXlsbekQE|5f$0T~3N_T() zP!*Yfb((ehWav`v5#H9c=!Ws)s>jV=vbyp4wxeOjciWI}E9!XFtvLkUh_4ldzz`?6mFa59*lAesF-f_JX25)b5oR& zdviU-(!t@}AL%KF%)Lufu~aP5{#3T5b(YoapLibS?fV1$&0BHFSBm^`DVpqUC-diT z*V$DGAD^Ys`E!;#hh#Rg-*fk53`Zc$wX>My)GG`X=TN~M09FY%ESi!Zyxj(fY(M~k zw90R|?$c}5J=x)A;P*F162RYj+jCx8vmUK{%q*LytRtOe;twJylS1QUU zoeu<-Dgh%-`Utll{eXcJzP|}XAE)9tXjs_8h{mNOt?YGnK?y~C+5AejNopxwH@l=YE&N}?A?ePxfbY_~5cq}Z zthJThasV}VrLmOmX5gF%)*oEIqj(#M?R0n4v@so%6MZI=18_VyzV@X$G;bC)NhA}o zw2=BZy@s$vyzQY3g3PE0Y6pu($c%8kIsoMdix`_yM_Pe7Ks2_nk{$PP_?^03+(Hz? zl;(t@iklo$Gjy>C!uWh84RaWqS+~3=)q*Sg5}L>obI?^bo^ItC6of*SQ>HCpSw#e>W*gpY#Qp!Xi6?54>u$H|M`=0?n!e5+NHnGtTB)U%xWJZI#8%sk z$?!K1L2t?NR-cp*>`H&UIxpv3R%=>jO;AKKmW9i*3s-_mW@|WaDqk}1k7DH>p|QE< zLf_btXghCNw;M)nd21Th7EaIVdQ?&5GF%FPx5aLw(aKfqW7C^H8Zi!owdfu`_c*?@RPmG?a~-3Fj1ST0M%u*Uo_A`8Q+sR#2K>=i$x^=8B0h6KmquIjm`Gy1?N z;dz-Xk7`wFSlD6ot3q=yZS!o2R~P-Y+P*a1O8DHp^phbn)MI$Kh08B?@HFF4kitNq zE9t03q>U|`;?5Eu#l6)Z%%H){JNei#SG2N9 zeqzIl5`M z$)TU_t9!$a&-IQx-&-)kxd4Y&{yhB+$$lJrYFO!IlE11nyE+O@IDh=wR&6;OTKjP5qG? zwN$5@9aB8z`D0OOxrpgGI|+y3sd1KT(6qAK(%^0p4?WcnWYyo~GJ8NEeyd_YAupa! zf(RqoULLsAFVws~j&8OaGDp7T+d1==T18bxKDX@h`qnLMlAK4mKCTAbB^4nd*Q9ys z&6?tI>MZ^|vt=QcCy;y^NidR@lh+5RuhDO%>N_{}ES3{lP`E_!)VH7OP5UPunJfRS z@St=41GOZEJgm9u+9H8nJ_@#QD9;TCERH7Y*g)ye>#Tps{tNzoiKd z)2=HBU@1P(O85*UjI;0Q|9IG-<`ay6I|(KteJFDD>CGYIIb|JrhKCVp>1Dl_AcNi> z+&tfup3lpJaGwEGzkiL2csQZ+2#u@y8qRzYpahtRZKsxY8`KzKK28vkw zsU8GA(gkWF1}TRIX@enBZVn$0Jjn_Ii)+P&HN^O_Irub!xeJ29y}{Hw!9oSXf?N{5 z+Y*L|tl~31Rp!_)RKZXxF$`=WKYY;u9nmEiu@J=2uu!Z51VNmc(E0!|*9R8jf)FZl z0r%~YTye&OZDBP`k*#a~?S76U^$&$9&=1#U;n$O4F;p}a_~EBL#!{go<}<*ID{S&W z2$f`Lj~N!ac!-IF=+^3ZSYZcT9Se8st7Du_fOv!~2Xey;v#e^Zn1GFxtm$Olmil@>~PzcoiXKKT6 zOLXslq&CQsS&64_>!Lbartd$Zfa{WvTTmS?v&JvL!IarU0MoleRLA(^?3cy=PCR4V zpdc5efPX^POcemPPx9xaKo~HeJsc?)L(uCRfv`3)M}- zabz;Vr<{*R`G7l<4HJED3@mHMggt`7cv0Fr|D2&3Rzo#rgCis%y`l<-BI`0_W!Vn>1E?|Q{99>s2H#U8E2UQ5M3PsI?z5`Te`K)sS+kCM=|lJM4&A4?@sPbD#g zrEvnK33{df@ZbNqV(b3}|M8K>S*QRga~okrxe6ggFmad`sSPsY00pTb?AG8C$Y1RZ zU$`rgUOt|+PwqXzU+t}e`}70JRD3CHp66g51z{t221c$;PU^+6Jg`|92)ocS%?JdB z10`{V9&A7L(leNm%DS6tjs}x8RVYx??iD!wapW<(`zH50w>WQ&IT0e$+$!JG{?3Er zWU*d-zc+I0biJ^hoi{UG_b>kidIv~nz3g3`+UdSwj}tlX46-*3nY*|Ai~qca_mqkn zEw{p2q<<dMr1G<$i_9Uz ze_`*PyX*Y_ecd@@v`J&5jcwaTW81bd;~CqwZMCr*8;#92PLs}^@9(UA)>>nqeb%3Q ztTFbpxUc(qzpf8`jnLKvu%QN}+OEJ`Mc5M3Fu{mS4__rpP}|U=LV#Vja`j>dKjv{> z>+wyaAoqPGR`8E|JHP5eF7UO6&CW`of&J#MbN1~uX#(JiGe+gm?&jch+PCtsa$!9F zg}!D0pYYDM@X$)Br9=I-h~3v^6x zsN%QNjq7Q?kPB4}8szg^7&+KpTMH~^bGLE!eYd{(PKRf@5#>Q%c6DLRx3eX2j+**I?2iU%WJ{2 z3PLIder%Z9Inf7wTz2d>r!dSG(zoTbe)KU50O1D{r>Pa%Evs;Fa$z4Jfm{3w=bWDs zrXi-UrTFz%G^&h+-B-7LPE^P%Gng>v%Rx+sI2CPTq$NAq+-!#=hhTWDeP|JStF#cK z%?*puW@lC3e_%!_fhQ~2_AcB?%o%8SCYm#o5-a>l zXf=7dWT5Jj^6pF-?K>w;f2yQ6n^~|uV-u>-GG&l~$XO08r$XcRDFwJJAKZKdXuwwt>)nfUT%OxTOuk{#b|~mMRrQNliBqRa7rqA*SFn?`VKb*Lh1V zr+cPoXi^%CtQB>1f(PaMfDHKP1dUM%H`P_={OWKuENgG|{ z?R}!6&P!jz%AuhYR>dpVwiv~GU#uTXD^h)yl4PJ>i{eim0hguG(MD0ID^cB071>5t zN@t+AR!P>(GnJc4t|knN1t9F3C@G3iS3FfxHT|v8F}+l!*jb~sR;gS^j$H4vq%H=* z(5W$7Y&3RBm1WaiX`GOymq?-W;Y6MW`EZuHZB@&0q-l=}YBZ<%e^|HR1h_|v2WX&Q ze7&l`>*N77MnS?D0TohTONTiHwfC#6Jbjm{z91B@d}Oq=Jp7y*?Af+gTU$+CsyWcm z*1E4=rQ0y7vpS&JTh&{lZfdJMStLb1jxJ|KHKDIhq**D~Pu*_Cw+ZZ!CqGTXkxS8K zJA!g{6U73U#IkawsBm~0VmbQtCt>}8^Xg-FzZ7pi+PL}It_wfS6S{kTC?o_+;N*I*&c0)gBi{{Sf+Uz+L^+YGohg=pwhnUBBe(-gXOSpf!u> z(w-%|qK9~-t1REypwN}2xEy&QLFJoh50+#xX1sN4)DPp%Szs#}6x@^G_;mc>Xbk$mQ=x0YK)3RAZ%&dGtcj8`+ z*M6NW2B?l{b6IZ`j z^D^F^_|>4&0v zOA_aWGtTcV?_Q6QN&gj}ZNBl-%h|;5Z?nYezK8xO56Qj(Mq36s2Njb{N%7nlF3m6m};Ld4$G3PzDZRbrc?S^ebaw- zM#aBrow2^M6f$2DI-bqkenk=@iJxnKdX&Nb>qfc#XJItpbr%wF>4$cZUdX)4Oi zE^3KO%AUf?mJ&`&9*))$P7W=GxbUe*I0dfdyPzINxY2w@$ z68u?~&oG=?#YxbntT@V8v)nN<`$^;>$@HqRC5!x53-O?NQnx(_4W)OIH#MG#Nixno z!|0b}yg@qI=G2*vq$#MhJTeKrAsQuP#S&#tt1Vjfp%&ME|ncFwPGa~ zLvs8C2Gb9=D7D1c)Q7luC>j%!cb{jOitZ5h8yGjA5xU2-o5~}@9Q2EQBhVq4YC|M^sgY& z_k3T~JO4GM(+HFQfAAk7@BhMopUvO-&l-l9HOF7rB-lGoF##t)4B;j+=c*Fs!aCcX z6z4t?0-MBv5H~>m=M)A~ndi-H1AKw0YeR5yEs!In`S2f)C$q?j-^HLyA!kB1aYLb- za5DX1A*XN(VMvmN6Nb$$=|7Cf3e+^lAfI^mhegb^pBa#fA=Jfo%D8gI=<-2$tiO0$ zEd;b!is?wTeMHR3f(SsLu`Yn62;Oim&iDaA1lz!p@cv}!byXq!V)=;@;V9gR-C*U)SsZzSIK<8lZHc|9dU`{z=RKA2|^HFC^tVq#i2#o1_$8 z0Lnx*4e69v0?NLaBkBK7Nx3?)NCQeYrT~8+1)1xx`& zEXuxa*xtLO^aLhIZU0vXqW_YVgb0{n1oQ8b5(Z`&N<|nhGFlsf+&b7#7EbJEqNJeb z%KsxNdHjWczDvqZ5>*7Bf0LA%>K5;k(k5J{Ec8D}%Ab*zX=cGUrTKwzkx9wegb0>} z;c09A*`cfx6e;oRG?i&aGG04K$S*^f&>wI~|CN@ftt^1+>er-xOIiLWEl*by!Wse0 zs++E=t`jO;vw*ew(t6&|_%N|pj|qc}**Jwhz6i;~T&1yV9$KCNR!cL;G1T`P@Rhf1 zOuQsl5fmVvRi2dD3Rl6C`eLdgQ8x$!@22Ihd!LS?uc3Yk>WY+8+GSk;3#)9Mx<1%> z(#h^R*dD`;a?0C#&j!QS4Rx#31bN_?^4og1p=>se4%7Mtc}OJnoDcf3*09!78s41t zvu96$Y*|SPK;Pce@~%K6yR?FCVs0d1Z`hTZy9$;+p-YoPoC5tS%BXUSd1#sfwhEs^ z%J1v+b^3m-G>5-kFPM$e-n&|rzn!h`FfcrJiN0g)jMuS#ACyJDcW|HTN9M;J3#HQX zjVA0oqi*oRdfjRaSDuCf`Z76BjgOAeGvv^kMv>>(aP4Jj%$hFX4j3|-+Yowqdf7GO zhoM!1$d8oacE&+v7c`l(Le6$-ZQIUwV}@+lzgzGpz;B{Af{OGuoh}~ZE@=g(P`!OW zpy6ut`t{}UnRdr7LJ40z`N75VisrCHg!L<8nr-((d$}k! zk#QI7IPgr!>2Vnxw0mNk7?h&Rb9KXU9(5!BAhEj4^#(5MiDP7Yh)hyWV*T(G279!7IwfV$urbBoNfB-8H zw50ni9Cr&){i3YqRjhUVk_rO8wM+B#()7gpX>@-h2T<7QCy|l-nfRwtTAKgb8 z5JOvm8hauuWP#Hwe?*J_M%kK`)Kr$hQKO5s0x~$vZ)K$`Ct|Huyso6{NE)q%KeLgG zFxTugm@9K+pph1jj`uY{CPzuZZXHyGXfc;@56Z;`1s-)T|5*7ei zA777)H?xPeP9O;Dq8gCWl;SbgIy7OO)zUim8y8!H2X@v#0%>El%7fL5!rsyJWuw8& zxqPtp+)7GvTa<%T5^-n z-5e`TF&W)5mVE9?NwzsuAJ0{HI2Bv}LyS}VXEVzqPcGy2?6KX-hQ==Te4~Z9EvaJo zS~2z9C^t%6*LaN~jEisSLeaDLVvF%-@R2~`MU5dno?|es^>h|bK}BA!um@`A=Cs7> z2)>|`bK`)~hvU_9tbm&)J33>45Sxv!LS;}8p-}@3uKmo`O`>-zJ%shKtwX=gn{i6- zuL)1|Tq&OE(jODVsf>{?%etQMJ0n*bw+6~@AT?AA^g>q7mIMJ@Jq91soq*2hD%ecv z%Hw4?uFg6uvfq$ERo|1Q)|5#(LA%)g$+?WNrCC)A>!ed!bH!2FS-o%dMJ!t;EL3W} z3%$)69JgK7Ej+_@(YJ&=HSDC19b4)Xu-@Op!QnPK%l+NA8lo%h{sO{JD zZ}7WBMm7!V2kfl4d>Up6IEvZ)?P^ISR@+h?GnPuVX5uE6*Uj%AH|3c;&J~u4GT6Fe zXscMZU#80O?I}D%IO#AnTQhtv&e8O{%Oxuvz@zUnCDU@$^nx3!0h6i{JQ%~;0lDNc^N20 zAnpM~8fk~bx*{$-Sg${L4~tB2qyFNe+>7(5=g}b#r0YEqU~=h4do6t6_V1&jaAy`G zzO5d4UGz!2m|4Aa@KkC$T=RSOmQr1s&El!3Ht;EZB)f_B=s8il=G%@mxM^b{EJpfH zGl0S9P9PPxyGZt=+pKm!Y}xsXuvcro^upOK_NY+Oyhc=)6*$alAuA#C4{j;WgZ^ww!%|H?n|z8;*vb!b6N9MPaW zP2o&F#+18v2@Cl)j}relt2de!x%hKv-!IlW8C#81#;$v>{qIB_2IPE(eD$>+J!bq*>vp zl?YB)K0JX?aDzy|ET5%=U*Kh5HG>48L5E4fac;qc)EakcArF{}oMTG4Tp;U_;A+nx z=ky@{3P0S|Wq7}i4xQvouZsn&?-41s$ z?hwr^;usTL$tQB}Z6f92x{e^B14>WNRXl> zE~$fGx`nTeTAULYKb}lDnjEbr9`|)FGVdh%qY2apGwuO3uB4zi2UFfjT!GhS?kFvu zphr6ZZS5P|7_FJy0DkbDgY zFr|RmPwTu*+4f4Pb&1?U2k9VkjQr+49H0#6p~hMSi?=cyuWcSHXcE|vupmOY-sYz}q=kan<27nepIWb8zk-yVn zmNLGYyl8Bay^JiF@&w4a>=%GV@y{(lo2vpc;8tll~5S+3Fk``Y#Rqcf(bj- z84R6Ip=SaP#(I(PCx>VNH+vUMbMk*$`0Zlz14G5Cgbme8`nEfp*q# zTp~EAqCiO&attG^d)!ibBlP#FUvXinzD<&07n~6q>CRUi*3bMssXUs%GCCt&A7^&5 zMj}ul?qz>DcLsufNV&+bBy}A)BvXPo9n3fp zoX8-&(5eb*Wn!DJ#Fq23xO#~g#`_hjHgHH}{B65sPC7)bja3Es>P26%<84^R8}X{n z;L?3?H-OmcXn4cFDqGiuHB(5*jQQJO@zb-=J15|FIE-Wp%cp^?RwlS?J~bxIn6I$4 z3?l!KZa5OFbQi2yQI4VwXVy6FW>ihSHN~}w;Ph$sHQD=WtB&JSZCFCZ3orDmECR)^ zdI9DJ7~ckj>;|Onh7TJJD1RD05j3LnHDc;EV*57YzMoNbHxh0%68~u=C20D>*F>({ zMCsc^o!vy+-9*39#Qopz5;q+P4-E~E&_A9H4+DULdC%D_q#{6LjzW!1Z>*yuz`)D{ z5Y}OUi>E$N(8rj-6~OE~0{rhOc=-9}rypk!_i#Ku${-^_Gq^b*^9kxtZqTRw3<41S zrl=G0Xb@Sr^6oI06tZTNBi#41!3PTEgR95QfoMF8*aUw_Qb}(Z_AN&>S5P602eBm* zR&jHQEaL5fgehL!wx|Wg+s9mdIK7StAie{1g1X*v`fi&Fk*=k%a+B3Dp~7Ta?MA!P z{zR@^dtGAP?(eg$$@co~?;vPoV)>4S-9a!0oxxN`t_PE!t~kIeZ%9bG^pfc0{jBS0WwJ`MiwO zoxfG4pm_oXX?Y7y7scKrbM;g2g;u+L*A=aB8$*#!wEf3K7SdCxlu-& z@{?9zAuF&FkEGO5!QfQEDlCdo`3w>cXP`9s0sbvc9n3O|$)*VY9I${QclFs+A&K2( zcqWmDv#B^10|vAoKRnfr88!5z`hi#br{%uC?Z>Z0RwDfP#(^ z7(G!$C4M&axwv3~;f|xv%k0ofY*t0groQgKy%h>$RSHb+6+>v7$nwC;mZJI8 zRjU*%^Psa6G^rxQ_^iyojWlKSv|X4yZdGH7LCE^NG-13ct7Ttn&$!PsgVPes62_)Z z48(>%HIzWo1F?5&V7y@IE)sG_P7Rv9lCa5P=6D8rQUy3YD! zwL6Ni_ZRJ#W8~>I7zhNBdcP;g&O?87OE%KGPELvI^|R?r^EWGADSm32=Dl6Gd_O?;9*i|nk3n&XPB%Umx^(ecduE}^Z;YaiC_s_i-F z@iUGuVl|fSAGf?#a$Op6aLrABg5VvBzjAIDyYGOv1-t~q2oCM`5_B`0x<1bkdGGnU zD)T_L(vh#Y;g5(0y^p=(@v7k@Gq)bjY6xyTGVyRrK~S)Z4u38?jvf9$H5bEQE#u|b zF09q!%F(v{pTJ0!lp~+g}#pr)3#=jagrWCkE z&d7HTdTbggVJVQwjl{LLW-q@fq zvoe&DI&w|Uunr{yxqq9%z7q6ua|zADE6h>L^WF4l4%}9`|M^Ge#A=0W+yzW2-%RF! zciV#M9{GDspz?>kXj3-yR7S}i-uJ}}iqxBmJ`q)GJ z$mofZZrM>bF?bHZs>2@@JkNnFP$@yxH6JB-Q^aI$EwBF~oYXd5K-7CE1*@Z)T{m5l zBTgg#i+zz7i=$M;zEak*YccO7#h&|zHMwV(T)CjSz3^qRvbn5U9sW|a^iq{d@`PHG z&V7|tbd}nqv^qK%v(|R<469vsp?;a8#+9gAYqD#lZn;&_X}GFnIg2mutge>K%hqV2 zYNdzMBg!T0!ZaUOdqUA8GIf|<62}(M>ap0sAzp)k*}Xc2pIE2RYHRb0R{I<8a(y)e ztr5?;c3^N?c+p3ob?gcNz}^S6b`^#W=i3Z6SauKzE;wkDnCU9ScDaU}9;`50>R=Up zik>XGa!%ZcoA;-2Sz5|=sZG(-fMV>?Hm(!af!n(L$e_SMFA z#QxqDIAUZgTpdOA{Ji|ldXmXG_FSh2Hd0<=BFVR}dUkrt(%;MmJB*-)n`P;;|3*R2 z>pZdaIiS6lu#JFQR^9+H9>{?=j>%%A8%KCc^`gzrneZcx+wRe8IYz=)~w%} ze~iMgV6)xk+hSk19AfrxOuvw~&LNvMf!7$3ELp+{bN>`m8Nil-=m>ZnhT3yx*pYT6>O> zExP)7dpQD_GPVa3vAcP9r|msn32*G6wK6x41RtR%5l(@)*z=ok*6<#ax?-xY6A})0 z--r1w1U}~MZ0I-Fmu8y=w)3sJHG9_lvfus1*|U9Xz~hk$@!ECYe>rlva_Hm3F|f)h z-Zfi(o-5Qd6ieR#P+2nPO?2ePJ7&jp!UD(lHTBwL{*;{HlD}m3N@}6I z6FAISd5-hiT8nccNL)X15W1y)9DJ-i-s+NdWErx*`1!~mJv6=N;z}ZGwfyEafr#Bc z(*Ad*9tUt>MAD!OKcVZY+GB5Nsh@_!ON&X&e*)pu&cK;@>iYgNBpksre_z{w;4qo# z-R-=4Px)!*T=3?l&U-S@-z(kH-rOG2_6w%KN|CB#FS}m#W1~IaOvul0V|c35XiF<- zOrArnQNeZ1I`bE5&!>iM0q@(SQUZqjA}on`h3`o+_-*N%dT85Axy_1 zmR9=3$$BHB;lAl!%fleoCu1gy2)|W7ira8!aD))G{>}oWU7B?*beLI&w~1A_hF92M zcfL0^vBG0Bm=Um(yD7GrP5n{?=|Lo#c+>|oNYq70)X_p{sf4|SxK=Ahz~}ogtJ0`l z=%`wEaDIkI=~#66NpvMbOf|K0>q%5Yg-{c>ON*C!TZcf0m9~3(^xSIn!c+7TZp;dI z%;b~Wt9wkuQdn1Otl(12@@-63YHT}o%qci-x+3m!EbdS`X38q&X9nLmuJE3f>H)66 zk(bUDZv4$yJcK#{IL`maD&hB7?44G8yK6iFv&XGgLdilrjavc+PXYo>qI^UmPGzFs zSmbbr^M}Zo9cqtfX%%d1V|y*l7Op75&O~B7p8LWOZ1!Z7Lz;OUEdq|DE@&ePngF{N zt<^il&`_o1c992irC&obGUF+7c+yIp5XCrlMRJamx1r?L5HTU1Xc0UuG4BXTae1Rk zsZsVc3UY;<(6m9dw7H?Qg-|86%&!`esU6VDSrwARUs0pOWE;q-^I_zQQe^$cWkO_R zO@7ISp2{-di4c{f2dT@p4<~n$yJV4JKZk0pV#+I818JO7KD0=Q%cMCUWL~IBXP-)2 zSc{Y)rv7%x)J)A>6Hjk7O<#oK=PJ&~)uN{ok@dSxzhTGwrk#QuoT1B}Q-~<4EuOVY zCfe;S+e;%iWtG$9E%}}>!Ecb1PE00m6~$h^JOs89YXoHD}^hq1qgoek6H_E7Xz1E(@w@k z&u9cteNbWX1x{RnVZn-YX5?5C{O}V6b(KnEWG>Gjp{G-&t%LOCPM~SC>>f;kBY8o} zDS5=8a3+TEM;pPi5b=p-d1783Zk=LYq!RiGHZ-?lXVVhS7aoF7ylAw7scbGcY;qQ4 z1+l6{$WBG(LwsA95(h@vc(W{wXB?Dlh1d;fX1p8%*zH8>ciMP5%r@GCjx+AN)YXWWt zP}!{mrTFpyu+DUL-IuAvaqj=5h~WK^mJ_OPcKx zW~je^#uxK#>=JE}kb~inqnr7JibdC?!qN=*mUox$(T7)Fwm6Uu zW+8;V<|{fX8Y^5h8{I^Q4PU2LwFXLxH{R{Hpp(Yknf&YU1naz!N$VXTJ?C%1XPJO0e4$ueDVW1Zf-~n@U^8onQ zr!$DhJL7{KNLT~lQL*{kX7E6^R{+`2W(8tasOdO!a-6t~0mKgwswh2-IMJ4f(Gs+l z(TmlFcy!UY9P6^Y?&ObboOG5DN^o>N8o|IYX;V9gk>+y5=&$4B7f13Lc$ZDnV*XR!V^y;+H=d{`n4hU#J+Aa0^ckk&_w>hZ~A>s+e(LNU(PASZx5DTQb zip*BWXBp^qyYB?|po^XKF1ibeL}MlE{lt(o!9_+>-8NYCdkLLKt|gI$1UwJlSdu^j z!eEB;KshB;8lREBoFKBGNJR8`u)fqz-i=cZfJE-RY!NN%mto+xGsOOBGw4?JR)CM>iukZ35JV_oGyd#c5CuBR_F`@G)d*!Wkk>H^C z;j|(@_h|2#`k#&Q5Q^_b%Zh{VC2|Mj9gInSL!AtK3FGTcpAJarBs;JNC_1L;kO()$ zb^Ubf+fDwq`}-uf_x(Tah@%>5lM(WIhf^T@o+XYE zs4evvvujM7fKd+GDJqwXABj0^Q`6R@MKktDAn7)?o6LP9xO8CoX zB5+0Bj{SBMC)GnvNFgK6?vj+mgr`eY3@(yUnNNxjJ$T{v9@AJ>q+}%&*?20PkcKLc zw<1SjEFR0&=WI;h?IvRu;gOfcR?XNcG-uHCo)qnBN{wWXM6~FflC}tm#XXoNeDspD zQ*`3pxZCFtK~!|)ZOA#0x8PV?nX>Gf51XeK*??=9zPCn7Ni{ORjTI2n$+?{uxQskqDC^I zu#}WyRn=VA7xRAKm6It{sr-;!EOPl(5wm!vfzh`}&C5}(EK#ktB&*)6(^{p)P^s0v zzVyPA66RS;q-D;dS(?@wX_;!P1KX`J(1z9E=x(d$7`4!tS6gSGziS{N{B<;oxe+{U zhYsn|{(+s?oPSUMNrX=)StqRqD)vHiA8&c2?i#r8sSkSU0o1jo+Txspx7T#|qfc;J zL1ppM(OFmK5pPZ_mF#k}31{g3gJ)wJgbi-XhkWZ81>3g=3t^J5T(1lG*a2wWkY9t} zh$#3-)MQR#cH9oK<7o~X(X#)mbEdN^u=Dva*B)wCq{%yF(bnx7|t0x)TG%aVy2Q{uxaUA}h{dy^*gN8Hx#e!~(x zCa&y{gVx>!otx21X?FB4Ii)y9?*Ub{rUF$N{iZ(fvj3^=Mz>(e_{jBhmjZ9RSs`O> zp0DTr=T!hSc*_gv6D#Sq*qF0VEhGTL>6q`2(hqdIrhBc|qZrB++!SjT(Jeo&d7Z;< zP0r@@@)$In{f`SM4~!1mA;ur;y{8DVuglm3xMVeXmvcwlc6UOId9yXV;uM>TNox0B zw(1jx!1-5E##WI&1x*JGE>KtJaT3KT9mA#WZ4xy$n?46i-B<2ejc;3w(J#Z5aE{@} zDSCGC<;#}Xp5+XL?aIe#8(SKU+usy+FER<1?^T&0oMU}lGQMKy{IhlDc8jqBJJcYxDsV<$t)~qI=VeUdSz^@G za~Sxi!@2&|(eM$={ZRstlnn7Rv>j|&rR#~uCipfy9u8PX!x3JO`e|vGpEb}w{5bw~ z+5$oKO7|$#wNoz6b+A`=V3a#)th4Tl*;MD;N%6*wC%`r)e$}7ju`6Pb=BFVB&nkuz zsD&ZQNsM(XV9J5l_8H%45!Pt#Q9ZjqLe?VGBWmD*xZO&o%)0j2_vq_LS2)j>XPc!! z`+QeAlBfdcXDWui0_e`Rtyj+pSX&|3bDbTo3`c zFAA8>aK!nol_+_w4e~iK*I%vqPe1f%SxYMa%vqIi+{_!zyAOnJf20Zd(eb^ZONLbt$rB8AS#K- ztzxj#FgTJsB=J2}n+%Rht%xc-@iYyKta9hed9usX`dZ*6P*kB+@&v8{NB2?-v?IiP zU*%7Giju~OzGI6fn)P$zh#5iJ5aN|Qcai9kY!>&m&C>wC%_y={Q#?GNhe&IC**QVmM9z>dc^Ck`efW#RvvY;P)?QNopVAcH)Rn*IKRJX1K|P1Y<^Sywv^CRCR7 zSpvQxaT`I7i-rgJcZz7LlzgT_AUn_zM#@DkX%8bqcKnO)vw}}$Qsj7&KVp(DhqQ`J zg8DPc^&qfO4VCX%+;3D&btr9xO=e_2bDm5bi!@EaO@jY(#(VE7J5t0SN+PdB%*#4j zkQ}UfDna?)6epGZ#hiVvCL-^abudWl)*_5ED=b4UjC+$RtR^xwo{5h2u_}_Em|VDo zoR;@Fl7A4@MO%$=k+V@8YS)??+|IA#N30;Iz1(Z`M9B1R1%*d^3;SCu?60F4wM<>5Lu8Wa$bW-O~_qN`?Vz2^PSdKSNSp0{>Ur*_$=_Wjg)z3cz)+Pe7v=63)0 zk2H=0p-5#u;?kHLCMMHdl5#62K~0e{#%{uZ03x6a$4?(Bc!B^>SkQ`fgtQ{$fO7QE zB1}@3!>@&M@#sN#JD?RHbx;!;ZNYIUKwOFbZDO%>tl`UCo!Lh7Sx~<2SD#p3K>aGa zXs-`LCs)`~nGCSwL&5@s7GjL{5xt8_AD~ug@UH|J7QnO@KA{Q5$lGi`F;^2^;4KMc zKE=nC{dohk#R`eh^&6J9OOwfX@vY#;%jYJ$X?ZqO9DTMMN5r)1FC$YrR1JB8i<5>J?wU7#dL#ZN(4jHW>8n{`GvKw-I1k-6!O?4gy)-x>c*6Y5NcotWst80 z9;XTbN~e$5>|@fy4rt)%Uz6VsqL3T+|1!7B`XVkC1XEC2$Ov_Fl8!8?@I=OFj<+i6 zCj}J(vY@@Q>X*0MeV_blB9)oJD``X?rfX|F1Oe96VUIFxbJ-8z%zPp#GYnY9OS2tK zXtYA{m8~su4Mz|~(|v#A9iFvr94pumxvTHEm~SRUpw!k<7|(Hr2HPshvl#EiZ28^)*LlOLf>O)|d@r zRY=r%SXO7Ykf!e=I#xL|qS4ij3q?A$t+mTo8#M;c{QFgNJiR?FaRQt+Gu@xkI=?><_hGk0|Z618uA|A|0Q|=<;fyRCQPy z;6vnYM(RCc`sGPNHtqYcKK!|!D3r|!(mWq|Pd?qy-ei0m3Ku?+&uO}7E~mbA%N*~6 z6Cj+M!}k;!kdAm|0C{rQpD)1M(6?5r-J0Dm)xa?<4r&qztj?HuhB>SLTk`1>K_=A! z!IHk&iUQUMThI@Vr8VcvyE^|r{w|^X$UkXIRVD48s+5j%WjgPL%48nvr9yGQpR<~BgQnfCjl1q0 zHUa7OQ$cuCqp4i3>pG}f-(}`5ajf{)nar6Vd8J20+i5!z5&kSW|G&z(`tYIpS-kMTK-`V)u@VG<5Q7=TB+D8fv9<`la8$n5KT!9_N7YQvSdOk$n8kZhvrB z%#(Y{RI>`3B~v*up`}yMIVGX4s4vq*7*$hcH^F$CNh=|9`2LDYY4vxLGx@yrs?vnJ zT%yDHy+v6KqezY_e?&DE{H`UiPKt>A$7=Z>PwGnvr)6?WR6puk>bx0BUEdb*zCP>l zE`cK`)jH)B+s{-g1+lA)3T^e@nrSNcuxiaqPxA6$=O%5iONfT!Wf7~?W82hoVnhO$LDGP?; z8^unY*-{;|KbE?qx!#-L`L}ZaYgs&-owc*n?-AM6fg9&PH;+2HKfKjOwd>G5aB>Wb zjj(_aH`VUH@U$#mu6&gX$-lsFiOSWz0%2sbwYBVHn%v}*hUs7DnD^RLBeC2MTFi#rjf>+OD4iv* zQne~%`&xnQ)k>w2`aGqn4I{DV{X(HaX@3EXh#tlv&V_YIhx%rM2ySB6;oJpSJvt6=Co=!agQHd&cLA=~yPn9>9sQ>G z*zH~N^Zm?XE-IixLTUPU?@Woq_DqIfEw0dTQ@R%-c#G%xxGPpL$yZ zHv=)-87FwJKDmI>)@{FQ>-v*6aNX~)_~Bdv)u{edafMjO4>pFLlrEoEci& zzK6FRt&J>{TFqJr|9BYbHt<$R!?mVMqdLic@GDZ^Hd}$$e&9N~u%z_NXWj3D?@*Y$ z)TDp8sd-$QLS=cNn|gx{5o+%;oVpGnG1$8XJZsYgLW;{XUm)=QKr4S}us>{tKm3?~ z@39|-XW&&*;K`nQ&|)Athd_4FekYJ&@-ekpS%O% zLAcZ$bXJ}}7lUys0+^|TF;+no9r9Eafizl@EMO1z_ap6-;P-(qwsfeJR)~xhNT@=B zyyLwI1^g4Dq)IM9(=2y6!qMLtX1pM-r4=ge8m5^NwlgHbhrq&GULFy{D5fZ^NB+5Ay!F>?n4VK^?l68K<#7_yg#}F`P4-oGcY9SXvW*1IGAgx?s zPdE`sKN0?*7Ac(^iAD}4E0;la16!|(By&NaUXy4NB;?LqC7QknodD3wW2yzoY$VLQ>ZWlxDI6bexlN$smw$8M_OTBYvtK_68pA}t;!4Ifa~oiI z8ZX2ulgT8pCBl;??2M`^i^h@nB_Wkbd~pS;i11^j@P4vp0c5iNS&h^V;q=fl6u=Yw zg4b8HR-U46q9oHYwLvs4N8)WF@G~qW!Gz*2psG(4t>*hC7i& zp#BGYZ{ZXN*k|c>3Q1cEyRcL>2H3Cs8G-CH{| zH8WdvtLD~J?O*Y}r_T934_Qt$3^9aqjxTQkoVVnYxAH%cPoO-cuH0>c{9V5MeQ^Gv zPyTUM{%KeK`D*^xE7G!Ek0EY<|x8WQtsz`uNs@xOgH8M1g`LTxlcmT zJ6^8PrBo1oTCfZ*iAH1$RJx%{o6P32QtoaMH>w~vX2GqKUNiNg9|LIkiDl1>AgCAlvnd`AAT9LBoz0RUtKkL>x=bRt;5 zcYih?kY_5(G$#`HtG1hN>yB)h!a`zmm}OmFb(n46esY-OJPJC>bzibM%JV*~I?DII zKRGJ!Pmvr-frGm`$ZVp+$w;Ty^`I+mJ031YRTigL^kBla6;n-GJwADJ3vgEF);?lYgT|4+rsvGozg-P} z%3e4&HWZzf=elMASerSGS2z&24QPl21TX45)R^^&J8j;L9DoaNR}ci^#Z(na{y44X71`fzoLJ@! zO!6JoJ#4|#k?X@}=l3%vrp-EZb~{JnWUV98=9BH&)V$qWCp}EwheBUs3tm^#tc)7= z#9S_(dhA$)pL-JuJReUFo00Bq{J%2ye9M`?dq&(&VBk5cStd%F+{?BK4=Id#JSdCNOmq$MqKtKYFmEg+K)(t7Pk%RuL zFtp$9CxuZlV$c_-rvhOS_~tp%o^9HG;4@9&9BPau%5vZ0pF}z~$^tm2b`Ai1Jlr>R z6IifU-wzyB);_mc!~wi^49_HInp_oCbzZh3xdu;$-zG@m%>!FiR{*SUJ5&7DR9K3# zT3mt~e}8ife#HD0>H;K(sk0ge;5NQ-c1f{gk;rLLW}-Hci$B!hzbP^gRe^wRL&U&N z0VdpdDZsh$73m`m*KSCS!?UCLOc&^;i9Jx!9k_^ zvTq>ndjKj;XY6)$%ZIR%GPzh zs6Ed%rf5kUo+V*gjVZLMn8hwK_RV%e-ES|fjB~t8*+bney9Ujw8#1nh?Aro|l^r8E z3!MfFH)kz{S&6PbDMQ5P3t>I11RrdeeV5$)ABMNt2)a`Oi*H^F4&jdZ>a5ff+UE=4 zwdi<3db18F^JyQrsDx?dXA|Tba$z=)6-0bzlOVT+6ws<)rgC#B@<*jy3N{IS(MsJX z$82?OT6BvC>b@jg3=hq-B*vj?u~`Sc;Z5{PFX7}1KC(63cgxGt+*pmfZ+m~gQ>wGY z1)nOMup(Do{Z(83+IkNo!8{^|Z_O#6AyJO+4sxE_=cKYM!u>Hw#Dq^G(#JJh^&@Q# zwDX=bzao`4TR`o!NVL<-ln^A}=P>lt(`S~XTT~aLqgbD`;k3{!xRygRY?x|R8&eiV zEtGII-_z*TzO_fK2N#rgG2j5R?@FUjf$@9VO=zzt@ zgT7&l8N>v;Rp$)OZoU#ums>Y9G`TzM0M5j5!Cz^*M|P{9(r6T*6r&Hnqt&a7_O?F$ zOsVK&S14Z9@#T@)IV(Z05igc^^nI*?bBI3f@~uF)H<^(!GtuOw`(+|ywPQZbdKV9t0%jkxBA0t^dlwWONNVM7`>u5re-rZ3vH zU1J}f#?|sU{1Ocs9|t?f91)y-zJmns+|Zj7MaucFHNyX(IrOqf5omatOYw$N(H28ba{v<79bF zKa?%+?hG`+scnuxQy2ed%08IVcda0X!Y=2Py5j!Fj;k@XJWef2=AI+dcu%?3y9!i%NkkRic38tTN}&iUXXZ|= zGv7r!o~&cUhJ;NEHZRI*ZrGmz8al>416E4ObQF ztxbdohUMRXo!-|>Huy84xvpPkuCiq;n9vGER`^}M_nT04iJ(6_VP5|;XS6Jt$lo@)PzG{e8_$Sfj;tvI;iK`BgSfRGRuaUHy7e*sorA_9VI-Ez#I(C-4SmivZCY0d^ zJiO){bWomXYM9tXjd4Ui4jm0ZCLh5VFWE8o$0%+}UT%#g^@0age~plj&LLD<5W|)b zQVVY=Y^aV|s9I>KVo7MCm+xw8FnuKtBN7aA6oj)f(GC5C6d_|BVMZ6R*`e|_(&b4FCv6P3*Nvda3?uFg z%byRw$j~5!SA`!72OUT7!bX}&hJPuI433B-m5rnti=sJ>Vnd4Np^N5=a*>WAg>*v7 ztU{s|G_up=3N@AfW<&zuR7)~n`3hEKtH$KYj-x{|qd6s_MkTQuM&&akW!C0pG_?5q zG(|t_$~c$G42;PP9mfK$aoXtQJ9Kp$WjVrI17f(aMTb>2!X&?1OWkWo{mS55e3V?1 zebe40NH)boL#5_BRg{L~rjVp_jxqd;#Lzs%*)&BthQ(pc5=p5fc)}9ts3fr16JhoR zt~yn&y#ZJ&ae|VbgY0DIEh_d4B%@IT=1sAVp;8X}@sFX&h~{x{aB-P$lL9ls!eQ0- zK7doYsB?UL%^{#rsQ{duP$$0Nkeh7NqY%1Lvefm>T<4nL~~j+lQ;l%+zint*qs&z2fIfZ74EtG?{?;nT##;>Q z$|DWVJ||F>5AcWX6Kz?dVfbd0Rc5g;U0<^wUS+yFIZ zy2m@>U>mprKsFWxxwLgU?CmTUh^l0XgxQvXe)3J|Ft1_^L0 zsg(y(YQ}zYJpnY!lsLxw1~X^_RA((Ox`!&1^JqLU+p=5f0O>&IdXgFLCiz@ZzYN?qTGE2f8mQMXI1SIlBtYzHByg;VkdPp`{1 zt&{f&@kUo`&7L8Myzrw+MFxmFK9{&*Ri-}a0t2-7CUj&aNFZ(GR8G%DT zV%L7`qbJbcYWqL1SRPjHB?#Vo?`d-~$^yV-rxd|So}WM9Mo4YJ;D$2su9&m_kjmPJ z`%x7BBi+FB2``ProIoqX-1h`C6?;(UFk8RR>i_}XcAO^Xr&4E#qS-X~(Ad*9*ec&Q z+h;S+7NPqni;R)3qR5~x(h}YUX5tvkd>0MWja8OE0eUib4hCay^HG7Rp|+=0mFa}L ze#D(RC)&Va`m@^BCBmA_P$Ph`Zu|YIo$l4=D!aTsTm^;3` zcidRJ8jnFehlXXx?P}FEM}0fpTGvK~s;crF+o*x;np7ARMpaSZ^|aj^q-eJX(95rc zbc&p>?o0%8ifhkWeh+_;(z(9dCDx3lgPLDf9ZuBLfMqxHb7UHlQ8S3^CdlkHlt9nk zL8VWgI!>FI%Np!K!pKogV0Go#$9q)!#wSX`OKbiZTxIZ$1JA+st)^IPZjv49ZEXuP z1pJzBua6s8&|J=5YtFTFu$!L%UA%cRUa*^&O<=8V*JKpbc^kcFEY!-<4z6g_F`J8N^R4VL$k-cRrzH2oF2eO)!Pd)My}&~Rb2 z2Rq~Nyx}Q9*NP+xBkO!DJ!w8LnAy-xs+pS@KvWuH*7vgB<;V20&L|@6uQb9CC>T6W z#Eb>;A7Z|_mIFCI-|;at>P686KlR=QO3-OsKy|jgFOnG)0}ppqlmnlG8$^67FH3?p z9?xFU`5&c*L^$sO-|&9lN<;Q?qk}kJHtqH+`r+#vLRu-w;BqQDk=dQOFlzJQ$?$Vv zDXvUDv>Ns8FF#yEG2|tQe=lEt5~ZKlUtj4`0DdM)=Z&Cx8*1c+dMQCyh%y2z#G=zD(w6 z79-K1*Npt^QAVC$Jp~$OenHwLD~&ss1e7$#`nfW$$;Fg)sy=f<(NIHq-mZpvu7m_ z*`l+?O?_K(w(ZNAN+Bz zT*@R%KOAVQSyHQ|?Y8KmK#NP;t!omNZcE6^Y?S`^uzr;-qY_q1{8k>_&Gs?bND5TR zwfdwGsus>X$0)BE!9N#8dO+9IeJYpdF>5Pjq3JI7y~W;_p=&Hg#PYyat42CQkITK* zj^r&CRBPpRbJc&HJJq+WUP`;Cuj?4JHEyb6{+v!#9#>>*qxiMV`=W+k9$lWoi$k+U zvP~2&5sfGLc33Gpw8*LZw~a7 z$L*H`OOOrM4>(k>FR*`^{M$xwVHxmyPYHE3cdpZ6r{cO-iGq=&Ooal=N_z@k>b>=4 z>8mBJ6i@kdt@J0G+nK!vj@#s&B}&zL*dKe*aP{rq*KQ*{=nf`eT(vj9Y<<^T(cy^D z3N+)|KOkIfnJr^Ct2Qvs7ym`4Hj?O$+_f?f_5!%JFvqN}0K=xw1!q^U{IJ|%`DjEy*Jd7c2$-fq%3+WrP5e&pNxn#U&s<|NtkCU9W%xO+q zNON>FqaHYT;`HR4#e=43h4aKhmoz#4a`HErq2_@MZSE<2=Psc!ir=tw_3?c4&+D#> zz2whiUZ@%S?r))P*?TqWR~;VZYzjAVcEmhSf<3tM)^1~RU#RajZL&P7nko)`pgBzn zLe@2?qx5P*+gNAiZC6^awraav`j}EM18TKZ_3GHi>fw#M&&*#h1 zM5Vk!ozSmqbnKhnBPW>1RVj?vUS_|G_O=M3FW!)l&|JqFgpi!oyjAshy%si_n=hf~ z`!FiXJNfPHNx${6r3CQjv6pe}t6ndh@+kEr1)Y`}KHKhWD--N|KjlnD+-kxoL)1lh zJ{>V6`FY;`D7%yHm8Fz<>Q+E>aAL{ziD0~JYd3O1I%DDUh`);q-)9BQ_xy$@!Y<`! z?kiF%o#7bk&XHu@3KG7)Kad^Ss_;mLr1mifrYSUC$Re8b#dlYIvOJ*;IT!jAsKX^X zE0GbY(4K4B9eirdG9R_LyR|k{3Kwwx_CKizD8LJP^a?`e4MKekLic9>ix~2r zjvYfbWa4W8jJFVMxaXypQUPx8o4DcQSTN;rFg0BWt#t@!j16ZDg6FMp#uLn!8sOj_ zocC6)Nd!H(`yKLxFn2=ujzh(e!Z2Wi@p(PjWrIn^G_Slu#dX7KIzsPdAirsOd6B{; z$5?eL!&#z&Wi!J#bc4B&$X}_Xjc>VA!~D%kq;@hyRCN8Fti8-zl~IZmE4zz;%t==35yadjS628^W&8b@CL|OL_Rc2DtN1k?ud1?ieWB@ zwPkSSR*K=@Mr&fl^l`k#;DrfRMG5X>i>F0#(7H!|6lL|3Q2rY#^3#pvD3tGSOKh53 ztgS3p|D)8!jno5HoXQQ)4_L+i#~2tYTsTgc*WJi|NuiP1s17p;9Bkq>YhLs;Y=}4e zQl{AGP<-hM`*#V!6<&eFN69yVN*aDFX1@^ihxk1=g={yzURmBTI`+LGu1IUz&c|4o z)kKQa#LX4HPSn|Pj+WXwGg znUi>8Fq`7IWrxda!mcTo#FLv)8uuqkD7smilY}oBHk6Pu+Otxq8;P^!n8gty8Z(!M zb;TqL<|>}EBx>OtQ^&hh2f2f2uuE9IN`x@z+@-Z?)PLBl`@x=kV2R1lihOytQpVtD9&yL=lGiffh{ogeAIncBzWWeHAA_|>eQ^k zRNp~)mCjTMrs)hD!um@s8=mpd@1(FN6)tm@TCTmec@4>`M=&;ua|a|w z!Qw{GE=}3SVz$N6e&*wFDe-F(kd-gXbxx5yC5&z&ct$QWMk&wU#sha?-HMU=%raZ} z=Gf|$X#>;EfYd*dsa#-a5X37yP>{idm2Iq*VgHUv<=@$MV*TrFXViZ`&d+}x%=Z5* zCl>sRoan;|Aj!k}K;Aep|CST=XyLYFb}OgTXuvW4$mA9PAn5zM6~a5fDz9!){^lw) z^806+rt+lhR_pa-pmQ}z|37k~j@Kz?R;I%bVr8JF(L_hBJiu9oo-~W#B5an4S|8V+ z;HwUD93R#n|IT~$QHuFF={$`)xTQLWUZZEsPULyO-?a#$wky?{UdqV`M?UZP9q#xH z-k4y(r!g6#3T%E-ZnHvfFN7I6ljb|3l~^xf7tY?N!lcyYpTu`vxs8PweRYktRlCnXmiUwH zc~k!>RW1DRq3`)?OAiV^2woc(^`cE`samXh$@HbRaPd=ro%U9sz5}9_qtt2lxuso3 z9Y5%8hmK546uWzxZey zT#gW$*Rr*5g)^|0lbP9-AzT2#?5(s`23=Nx?~!{t}a zA30Y~^m%AWs)vQyeqYV2C~V-4u(b%{AxvmHw2jHB)!j8!uq#|In|znKFfh-E4^f#e zpQ>3%1u;EX;vL`KY=u;anxEyO0-G!OE z8Z!S0vvtA~=057CuU|bXZ20Qo7y3P~s~>j%4QA`dAxn)c^jF&XRDRMtq&n(h%X#=i zv0-=p1(^KzRrKYS=SjCtKg~61wi5B}?9X>MSL{;Oc$ZxYUvAE}VTFwQsqynR6gL>A zIu!dl$j(k}!VYq+$5S0z>uA@LSs1??9M;Y42=v`;6}vbjj|&cZ)53Sn?q$?5~P zLuB2G29`8ZQS@fK@LMHkI zBEG7VJ8N^UI0ni}ueBZonXRG|V%>~zRb#|E{Wc~(u#&zFZ!+lt2jk+%5)t_p@|*PT zb&twQqh`AR9PKHIaX>QCbF;|{Ic8K0A7sT6Ysol;TEWmNvQpw!{}rj2_8?Zn2Ru|n?C zbG=RyYIW5M&E%T+q1!L1zmdj05fLn4_a!a`n z#+7`1vGTWT&Dk@aID{N$t&WJr_!p5gSlUxF($LDqL&j&Ey4iE#4y^co;i_Vw-M*S^ zMNiIEn{s&a*8&S&`fCVPQxM26^OjTOkH76Q$q6e^IY^|U1RTtnh1cq6+JLCOXr&oi zv{tNCS2YAaPl^HWz~Vyb@?O-K!28oAZnrp1d5Xnf?rFJR`l12Nl^w;IZmGxT`vaBg z87afm^g2T5yYjn$q?iQ&jY}}BsK!*7F9SV&&7?P^Tf=zVyb3V})g*aMCwJ+f%5mpR zkTyfDnv0t`rtWAT?hLnt-$O@kWW!{f5NsaPME7?5qW0a5H5vw6;bv`Ft&b2}-xoL0 zjqOauQ42FOeW_42r=~`Jjvmmf)uAc@Y934-H9q7l3%9Th$Ss@G_u$SCeBJ!MUVXh$ z*xcILCC}K(-lGmhUt(LlTT)r~+`Lf7ERjlPg4ow^&L1*Z*D;7{wCRy8$@eE7W1d+p zM~@9}G1oQne&WvIAJNz=#hyTFPLC-rh|EFfc(!i{YIdfpp&Cz8jmI<>1e~_+^w)NY2 z=DBB9xiKkfm!SJ6wu+~r>_2w(;+9rK3{NH&=t=?Ak8-uU=zYJ+@Lv5BUy)w9~JTevY#kzI>|0qw%Ql8?nqRUhOT*XI{MW)zxhv ztY9Q{yZ3Z3Q+5RQbKYDKW3F?1Ea}QqjQ}`r*Q?N{p zSsK#uwJ5~3IDmWKSIvJ{9Q*S zWjuFokLzKI>r0y}=>8)L2f~ina?j_d3zKY-#mzKn`wGmfwsd|M>}q zjC%5y381}D)q2Ch>Fn;G2gs4vdLY05F09DH{HDk6KNlyjV*)`B^byqhv;N%W{ zIBJ-gEK{S3`d$*n9U9tOAcdU~f*IjWo#8Dj z5p9nV4#SX&Uy!oLsJc5vIW?R7VF_%_=w?hwsbNX3WWV?u$9IIRtoR8!No8~H zbxP&oOl*V2*xNy=FHy>(K(SeKabfc~gy1-;FmYDRAe&Ti(uIUyD`M1CiFe0>NEFI6 z3-MdB5=qBExOvcNtH?1D1Kh1syoAWTgwS6%5wsMMvH2u4Fv*8ik)0Hw-7wLuPSL-! zqST_oQrJowt=LD_5f~EWsvqNxhs0Hf6DIajrb|-vI8tccCE?Ul-@;rS|*h6R1r;QKztC+h>vpyWUMn94Sk1`nrT z2;wHH;z5z)BvTc5utfxP^S~#n5$_jYrK2Z2?X+0{PGi&e}gl%^Bvc_@v5 z%PyH0af#a&a)y2}tzx=#b?kVU*Ce9!0>+L4k}Dc%3sC+p-6Jx{4U-Nrrtk(#i`q^1 zCnf#QNr9cI@Gf5wc69;nDGfBG2>BF<#PJW>ZIDKRI5Ktn3`wN808vbFM?V$Y6{Xm2 zajPg53?!XFl}e!bU%+hNuKxt8(>b$C<-1E2*Gk{6|5ORf)cMO;u4owK%ZA7cN21I6 zO?+r4%GBmGOis~Yp3BVE%B)<=tO%)X|BZ38k{!zeQsS+LayDE346F>WMV2fk03s7= zvz26vVUZ5vSYqmj@}mTOGz+1}cV@#@f*QrQl_l#T2Vvlg{KD}#A-Qua;R?g5%%ex~ zs3O>nz+U}Gkf$a%lw4h~jg_!gO%uYeGep=NgZ+m65jU%8NXCbR@Eewp`9IgBUEyK3 zW37DT^lkbS?dv?ThHUSall_TvQw-P1R2aszeDM^iov?k&iJ%2U)^LP-(B+YE)q4vFPO()+l}{Q zWv=i0xIy$LIH0fY=q5KC-(AJL{yKKtDk4u>VG4sD{ZCge$=pT)guK)*s$7=;kQg-t zy&l%x;=HOzgCZAgVy37!)fP6t=E*27LbpRPJ4@$O6?3&#!;U_MW7+$UYvSwf3>0Yt zWG~!Bqlu*|^IV^O4h@ZEO%6W#9ywTN#HYqf?GZUIO7$l(x=PL&C~;Fo%`pr-LFI_d=>O@0HTd$02pxz9TF4wkQaw&#xw@k+{$l=Q zjqER0{Vkc1wHsI6>>mr(!g5|4c&dLcShqOo;bAJHPHXbZb;}UyXb>1`LDJDcnD(t_ zdi8Fje!GUg^6D~#vTVKcisC?3y4R-3>&jEaHhQ89V;*?@0ofU&*i01-QU&p(oGr$)^R#lqMN{~I_$Tcp9`9MlcE9mg0&Cfn^gn1Ms-~ zvnKb~A=}1O4Lh9;PlVn<60ae{_)Xn;{~89*B}6*F?RFS!9UweAMN~A%@8N>CTUX-> zx}c?F%sH7j{K$qJfzgHHZ&{L*>If$Whk>A8iC6Bhibi!p3iDT481&=B)z5Jn}nl=4p`Mvv90F&cj;gZ~4-(K&j+)ciWXuxVc^Qk@=lp>Aq zCNDAMkA}&>J8Nd-?l6d_h6%taW8m&rj8y!K@egj2rP+d6S*`` zhxtIHx!7Mj@%TEaU0TiT{Pm0$jQU;jZxR;I5_>(+$+8@FH=+YKmIZT$_JoEf8?+_t zfC&nc*5^)5|87o$p~0tUYFVG5{=1Ac96aTLGoQ&RdB{GSs_2@)!F3>c#HU3tb?nYz zSvG8m-9{kq)u&j_9xS zUr*8^_rg`Dx${AeTn*3jVd5_%I`56z5_L}YRUY>d#^J< zs#Ysgs{09+Mq5jdp$Sg^y#JW6aqo24b5(6^Mjl0Y0Q(o?Nj47)(&9OjDGH+s-|y0(5<3fWBJeqGoXpjSY@8i9IM_?XWL_lucy@>SHZ`rw@JyEbXM!3Z;%&n)>ZSW(CAL$32Oh8ueHQ@ zM1_4G57e*Cqd!mD%|ya*ng0jjG)zftqw$4~Mi9ThkEK`7tl+6@jn8*C53l5-Z-+)2 z_8awPjg3xugkS$ijnYAwf*QbIl!bC;zerplYOZsVjq6f}@wwXCR@ykhl5aHS*OQAzA+1t1{znME9le%6}bDqayYO!E3D2Ju|IteNw7OQ z)tf%nZtT;KHwruxJZ{u~aT*JFXxCX9_O$Zb5O~SZ_-Ht$v-}*5C}bZ0zTYeQkYKoM z+Ne5c@${@)v75c#n9(y}Fa7M%;p<-)KxBX|BJN7ohnt-KFJOyN=+zoS?~S&T&o`5- z(ha*WRy=-B8&vg{Mi`+)5V~_I>E@xIn&`l%kP84@7Ku};LQ_+&$HmJIWZeXtK}oCt+J3Fp{E=9 z;2OD$6=g>mZ6OhDViv6*8r>Kf!BiFz`N*-l%;Ku6h z>U3-1jTzdHE?D6x!dDd4j*YjDxrM~6l*G_IXd3Ir9fgI9SVVO^sybH&v}P)l9mn>| z3Jo3y8g(jlS*Vei2A?26#cZ*$n!O zEnvWw>2-sncFmVS#h+J|xqF=<@|1lznu@r<|A~OdXC5mhOQ8~(*T5p{{wD1CQ-%it zWe~TbTML8QUX+eT4)t(m!;O^@Y@Pvfc7<4;sZE{@M~X{o?%jM3_$V^lM^R>@j||`iW^81Z>tdCc!Pji$&^(hpR<1pE!WKS23>&6f4&@#T zF)JfAB0tp-kT$dsosy0C1Hs=eF2kRdIakwd;jM4snispLnoh`D;H^h7ay&9HD&l548JYtt0*QL3XDN@*)S`n8b3^|E1k&%YK%DMRTqo}CY|GRxievf zD}RN%UWKP`h4_p}CL*=4qSc)yW z{!t}#qLRM2GD{DQW%mDN*IfNS{bq15g<&;awJ&OIcM14cb=`I~E<2veN5Y0C%;E^D zd#RclR`P>3qU0iS5f=h8EyGNd+8kDL@&Qs~HcVu70{Im32}*(7iQ250oCY>`6*ZDp zHUcNMnza}d<5}D_m-@?8@;kQrRlWN3ZQ?pJ*Y-~YkSZKOjJhjd6j*l4C;9p?Haw7e z=q7*Z%NlZJRenQAsqHC&6D6JmdpV*$@+p7QXVoU$|4hQd{L;)y)WR;%!l~cF?bpJa z)571=BDmfn{L&&y)GA(s@ZS&M`u|UPi;qNHNxlt$2r!-zXClu-6bpEo(44begXI7e z$<=VdCjFDyQcm3Q@>WN1a7Zw>X&}JaVu?=7rJ_wr*;s}=ERrmrCqO${qAem9?8c~) z1Q!vrf5NFSQRoM3%%vZ&HwFM*4{Q0|D#nMcMGm3-qGvme3d;$ag3Tui%~-r0_Qb37 zMo>E^qxNRqD@&-ARJ!45H>(4mwxKdBQ{0^m+q9A+jd$o(t84=t7&VOdoEM8CcnbmCp6To~k&h*U@o zcm?WV952fP;lc-kFsZD?f5)HES#QH z9w+Es0LP3(%l{cw-_AJS%G(=eKtrCIFasnMdrZ>28xD`L0)f2>))Pf!DIU4$Xj#y`7=r* zIxDi6Le`%jJ_=bc&kbvuV!PkGP6NlzN1c2F?!JnAnYsV*#pd;7lI#YCr~3xSAxM$0 z{{dIG;Sc&4+yHVaFcv|ubR!|4%P;e~@M|xMdPAuF3;8d>u>p*T#;`uhPp|Zky~ygU zVVh>#Fhh8(NXp-xn5ppF%e}D_<^rm;LRj-68uUdNvXMW|zdx@@wwFY(!DWK3M^-EZRHF zgrbl8M9cW{s<_f=WmFb4T+z&O%GZ7w3%m4S5WT3UYe0c!nTe{8yvF5Rh8gERU3iz2 z-qN*ALzo5bxQ?P3WFoy|*pT^6(qf2!l{_?TNniD(V2CoBRpe^Hu7RguIgOcXw`0y( zMj&J4nVPe#Y0iDnrR1QUn)5@_N^ZET8(#a`=zthVcGsoiQJ?BO-+Cl~L#QG>JzsQJ zdL)FCtrBoO{~GgJsxKYX(dR(>vckU9+<1kBTIT^ut6 zA?j#~?=;$0*CcW=P;&+x?-edpC89Wk1^-4esEtfvHvtFd?$`uA5rd1=Kuhx+Xkod_X8KitOeTOGtvjj8WwzQ zZ;Go+TFa-Z#HXNXD==Dx2;5D*bIO0ICUu9U-E}lDPI42v83rb98}la4&2pZ;7GalB zk&(QgVzwQpA5k!t`gq0;FTdvgNs9v(2Bc|jwVuL`)=*17UVYe2zs-J8CPDI@fQbh> ztGrNt^-5r*cr&;TXHTb)fdxIqTa3y1DTIzSKWmzo(G@ipi+n zjIZ?^TQa!q)A`(!GVaBIhIc8y4c2|rX(qWgg46?uh-sE6GrS1U|lr)}A=(52Bbkr{4Kd$g*Bnf``;o^V)*$zv^Bz?u-TGu9T~DF?K)2rpJ>F+XEiyy zhFRMn!aNS*tIb)AAW=P1kIO&d$MK2$sEJOqP7v+0fMwCooYZd5%~e-HT@tckit?+qEg4ZMyzQ4XPnd0!$j^2!nN0VzZ|l5Pm~9lr(0_ z?~iT~IzOX2nQngX`k_}Qq-b|}9o>{$C4TF5NybuLBMr~DLi1v_sJpzO7lPGl4R z%@NZa_@ZN7VoK&X>+x$=$}pS-+6uVB&=x8Y#a=eY{p#Ner-VrDctoq#$HVs(k^5sO z7o{~9H9nW1r5ZY~a&BY*xFUeS+Jfkj-p-4U_L!X~ik**_U0{VxD2fdfr7SrL0USW` z5kqTBLpVBFxsV`@v=9|ph?+G-BMPDw6^dK|c`p+tFz@3R7M5KarXU+if}|#N6n0U; zEn@AjQyJDT4le2hVsNV0wo3HOO86m3Ho;0snv1BI$0UM?v z?=JBDtq4XmXk{+>44WV3L^AG17^#XoX`c7Z-b00)lv(`BH|)k+&LO%9lRO(G8YL03 zIK~g0XZ{Ef&_|Bv!{%2^<}CN-2B)U!b8xeT3hGkw+jntUg42+Z*;97}Z27o-eTe4g zU1oW?9EPB=Q9J{)sWicv`h2O(a2zv`bcILO=@LN|FgJ`D8x)zFJtUrZD8aG|%CyRs zKtO$S#9I>0SrpA?&1v6G0mBBE%?yq@#XD{GhlLvNqI1C*`yM9NWBz8 zvmr3bnA9okAP6R>H-+hCG+pRmsyTaszbku^>ubT|Q@(%?&~>gLZ7`ScLm|urE?hRy zz_kzwrGS8<05O~H}cLH5OjvnpFuC8n+}lc#-0%u|N1R(8-&XJCslvQxC}oXE;1toXl&;OvUI zU?v-R661*vE7uj+{gm_l6=XBm0lpu&K31YrWR71^M(va*$yY|XU?WrDbsdxk6IPiN z;UrB6$jstoo)ScNzoL$~m|21GdRs{Rfa)ny<$oJ->z*;AG02C2#KmTMOD(zuAheNB zn9U)Tj#+qJzF1tpFr!XCG}~hOxJZje)JpH9SL@Y$+fI+#!5yzA>T>xX?7d}Iod4ft zSyi~ZySuvvDBRs4xI=K4!rk57y>Lr#55YAg5Foe&Cy+4w{-MxC&$dg&CuUB#H z@8_Je3ErhPpqZ1^D^fOW67m2=M->}q=5gIM>Zhjh_7vaM)-{9?S#G5gOfY9tg;OTQ zp%#S-W~MeA4dJN%CbgZa0RWq9pS;H%3}+3A9Q_)dkWt4%?Rj<^ZHGh*u&a)+S`p&u z54re4TeGM;TMSO>U4G?dyW`Rli{>NY{~2n1O(ABRp~(8plTSno1hw^-G>Ki491OM* z{%G?TZkIM{mknr_&u>@kYggWCSAFJcS10Mv6zR}5>d+17(9iEM?CUVz>M(uoFeB-- z5b3ls>a+>yw9D^w=<9Ua>YV-Gr{w?Plsu8_@rsU0NcG=UW&gjVXe1rle<*r0bLU?a zZ2&)M-^l?PV)oE2>{;43Yp1wTBr92QU9WVM!zSPGq~AcwH{y8kNVWwQ7t+=6-am+{{V4;FtMiP5=V|i7EevW9KF|~YETHg=tSPtHu#!w>dGyKj z|8EqH3Yz}!Dca!#{?zs zFa`6sI$jN>eTzH;)D53pjWlz&kid^SIJ#A**_RxS;oBArjg$Thr6)6-C%05dFGCrt z8(QGJv)&eHxfv>d^&uXz)=l72NN{|7foJplh%7HqiKOIG*EFY`U2(003TC}qh8IQK z>|;~g(jLUK9cc9IH9zNT>!EU7TDMB?=i8hy{Jad{onRB_cA*(FUGjamdNUvR5cFYV zJk^QORfR24UzW~!~fW))&^GB4);9EqIlPJJhw4VJCFkZk#v>rSEIP17iQ*LNu_VA?t zazW{pTa#7qd+iloOYNWgwafP3k3W%Pc&=1DUPTAGx|*9o$UHH;`Z{GHzCU!xn?vfM zedJFMz0bw>R$V=pUU3jm133uIm*s^F5{QYrwr6VlZd68|{$j@Lqo^%qg;=vFp4H}U zOxGuD`paqD1stbw1#BlSBlB8 zpXo2f^==$Zj>r?R;_*iUnIo>2IIU%Jd~1Cf(pUdq)`ucLhSF;CDL}13JtP)L5KCOH zpHBQRW)?`!U?L*)D3DhM73sOJ-29bWvUfx|ft$RXz(=g)4iU>|8=7wPmW33=@N&`z zxrui_7Se)I_v!d@6~unHrC_nr(xSo3$vC8>O7G7wD#T7GoHVBu?4!_I6V0s7E@pK^ zkT6a$OzR}oWmI`mFt5ePy>C)VYvLtm72BA?1*PS-N6@oZ*3OtTHD!;(;&F!i^_i#b zq;8<%ai>ppTMK)nFZWxMf7wumM_$ZZYmgurd8&1GU;6Nk6exIXkmi==;qcRwL3o2m zB}{dxw2J@cO#%*? zp$ynnBmCgdMXEOqD`Z1)oUcUqAGTIb)2egxGzhUT(QiM{fU>F8>{Fdc(ySYMMKJ~P!xvtcjkt*2uV-xO!D z5{?}Y)wYheq3BzlioLHjQZZ}#R@;jp4>6{vs{cCsd*&auHt5QYqb_E zMrQl@ZQJ>?oRg#sYCtoyaJADzP1m)H9zk#K2*Av^5Cn1BligBhBIx;K>9V9c-CTxN zV(QHV$ckVIm31$voG4&0=zbO{v|ctxKdJ@7&O>x!*LyXeYXh7EN^187N{2xl%`xuU z1mAr=7UAJTWc$Rnh6TqDS62MHPqy1qItTJUm#4ljka_U;asm269LMeeKw61G>r94W z<)7_);(QY1NsQm)#>G=#@PnC%45{^yL8x6bT3S=HnG(J&7+|MrkZ-2BOuxn%F<%?2 zNUn+N%N`-co2E#d`!z^pLg(qk=Tm$WM_}^wp84Cz{|1z6oEYtRwS9G33w{{ZyMO-QZz#Eur3l3Abi` z{|05VpixX#bD77iT`SYux(xem6MT@w^%>t5!4gXo`S!8Hxbt$UDgi=SB%k_M&*pc6HzWxFfXm)Hxyx=a}u(qw;*8T#JXlTntJyMpdY}-`jZjUAX^};UN zucgDT`{Q{#zFxpx?}v8}-s!qZ{p!?9;#Thv-U)Mj?=p|b-KXfcHa5=JZ=Fj%K+kUi z!2yHc%fjM&i(cc5^47L`v>XA&I2RD?wz%H4yT`2Fnd2myrwy?=njQ`EV`p1qB@Wo@ z6)(DLBWszBtb5|j%r==VY~Zm5r1TZ%-$<{4EU;Q^qsU_ zcnkclKBK<+c^&D1@P1|J;pNt1#}dI!oTQ+2`#1 z?BKt@7z@^O=)t8;tToo&{d{)U~yhtUlmd%)m$l?%o6FhZ|(mo4rQ)$;hG-rF`r zt?XI8@HVYtHe`50)qBk`cD{JxgNs(P|3ygPSkYS6q{r#~!cuVKW>8S)RJM!T?ziPj ze!`c5z|Ggt@BNPsS#<9*0;Tpml9mHI?gF_g4Hnk~(IhMaJGB(`RD=21*0PMs)|`Ga zXji6FoF4|$t_Axb1aDFYkmm${&!jV;3b=XDF_&TIkoPGGb-YzHLcLuUXLdLaSi4T}_CPcHVBILdD>)fq~@kNiZyV!9qym1wb=2hz-Y8d0{y5r2(u{x(?;H|5WykO^+$K1lY? zPW~YV*9JEEE=|_+QN^qke9J5KB%kmcBgTyj=EF^)m=vYlkfMG{1^R)J6$H%oL&o>P z*iYifmgZhk?>O;P5%&|DxFs2Eg@LqSlng1!DG9K>1bTbg?zQ0Eh#DepI>|C6nf5Cv zk6PvySLU%My`GxuTmuJTihpS&nO;cLB$i+II2DFSoF+EqY(b2%xja&iK#$_FBm*IC zdXIY;G8yE>%oE+o|ey79qH6GHR-ZA_hz{Fjp z@F6}4yTl$CQVo01kbyZIjDq(tg9c0#6bhuo5vKRxN!;Kn$t4B(32`sTui5791n!pZt*GF2@Y5Qf3g&_Zliw%Rmhs8sQ&!D}I#7VD+E zd4W{c+o(xOIGYns2`Qj>K}cw77`Rr(YPC^PO)ZY<#XjiHPqojUufQo@4!Dew{k!;1 zqYMN9@uW*J`KR)dQ8F^tFH{|a2QasgzfgzIv(&2n5$PL`B%HFs3l;R@=ON&{h3MQj)`?Be&+C{jOY zM5QQ&pjH2649Rg*#5%9qzqk7Td`gadBlA?DqbqveSgg3|%2jm&sS_*+J^DdrWo}35 z#ua_)Ter&){lkwMyal5C6SPlDuQ=D>ntxNB{<{W65$zaQC*_WH99o+VsvG017iT8L z)4=IAtgNd=?U<&N)2PSMES4LhbT_A*IKVVCZ@?+R>!@oOUl1`VHJX_x>f|Hh`$eue zIsZ@+XgE9w_tyrvc#vr%@aDcL)JUyjmxWeiw^pCf=0BU5 zABPAKhRIG&T4?$xNAgfrLh*rH&EXovCyIqwr_E8V{9nzR0QJq@;Vq;hxFY;GbOHF| zrQ|-*P2ql+6T5-fx~;9d#Qf6!I1{NY{VjZJ$Ak)CN@;g`W@JkJEsV9+j@Q3(j8&c9Tm_WliwZJ*PXD{ zo%GzDLei5a(vxA-lNHdDli!oq*Hf_7Q}o<3^S^=ozXG`>G7$JG>P{n3A_ak=5`vY0 zP|p7o@g_h?jp#bCv?UXk2hUg3FrZX4X^3aCDP@WsQ#(9HgMq+SS z*eyHH3;^IZMF25&jb)LW$DAZ`*O`i+?lJtjzrdLmDmN1@JFB_PF{e9Sf4`8YSBRSx0lvXqhb+Dh$94yq#-||o zHP?%l3KAfE1o*z-A87?o<;>}7Nr!xB?#;8Rb=qnER~W-6YEtL ztokw)tNiJ(udXm9u7TH3P;{uyruPGa>Y5Chbep8&G8-yS9zv_Sp@z6MgwjNg&0ayj zCF{zujhr+(bOCQlm}x_sB@c}zK!thLJ?u*7SMQl~#q2sO92itWvwzl!>)Ctvqh>;D zSQG!XPAtNqR95sRR%O_H^O8Q^-?`Mk;u|+teHIU(R)ZI4urC+n+PWIWh-Yc-BDC$V zY$6$~cOIt%ceL6N$J9YUD7Yop)2v-*&}ozc(Z;sV-s)^{A!2yfbKk^`u7L+lEVuI~ z+=In%K`ITm{X)IM=ZoqBjYCW7EQK_q*!#vEi{iFddhSLdfxK`n7Lzv{)X6H6@9nzS zyx{qnuCBj&erk|#5j-UsE^P_^%D?HbgvYxOfz#w|$Qb##!;FBov3ng;ossZPa_~P-4OkH4cfMC>_YHm z|0K5ALM`@qaaHYjYc`{FdHG)6!{yyl-evXc-*Wr+aB-lwESRga8H*XQ{z;eDDfh_ z#zib_qf{MiYXt60CVGU(q2$)Yz%vf;>a6^f}`n8h^#AM-=1!>5@TNO^yqG zDF(r8OzF_k{6)jvAaz>1;nYTxj zYGB)Px!sc4;$vo%RCieCZx1-s2xqOC+j72(+6bomseCZS$y=%g@aHpqw*SVRq#$a` zuh*mEQnyr)KEz;k%QQ<$y;R&+@U~9e^OpEtO8ZrSD%@e9_UMIEa1dc9PS>jzckl5U zHH%v#isY}dy0TcfqReQ8ulOZO__hfDpjuJOK_d-4Bm11!?omoHY_|cYijJ@Lf}D9S z=H9dHU89{k$M4|;ch7Rc^BQGarqsHgOi(45>zYYHzS6*)7lkuVow+bJvzlJ>TG^z-(^wAdbigyADTdjphi zfhiG(dL4PiBNoodaOL!U8MWRghjZu9u{gagPUWWVKaB%W==WF2?#9ob8w@8)JI>$0xd`KYEHd+wk*bn{Gj2{Bla>;t!y9b2m@?hj00l>f&fM_Sj?$tBL z7JW2(cAsl1os&e`eCMZU6W3n_PI`V+22)C_r$(=u)>|o=jrYPA{gf|;K#H_3qWdgo zMO1<=O2i5KZ@P1WTR77xu+9ucTicwE*gaFIj2te^etZ3m3zM|cM<$N1-a<(45O^g3 zC&bPUxv1bi^+y)oGw!I4udD5{wKMwYJe9@O_R|rD%LVYRX$DMR5vzZjp@zFVzY5z( zsb#XzeI!nM7r2BO@2jbEu3L1P_2aUUbu6^=tfU$RiYXQ;t%2sv;bGj3UU}MnTXi-d3md3$4J^ChDZV6*0G z!|zoo{3G3pVP_NVdzC}%*|g2)yr-WA#-8_I`9(M_FIG%+SLm$DuyVV+bDclwLe0OI z<(sy%3G|Kpc|WaVFu>Z=*l(1y`rUbY%b-XAaw=x5($>EQV~Z3(@``ILtf^O6#=_c# zP7XD%Z`y@}{5~=37cc@_^AGGRMoFVW6PoLRqWk~=rEh0+!zPQJY&G#dWQ{Q)e!q*VNM3Eq9 zx{Ky;#RlIuG+Bor%~K$w!z2vf5@j81TCH_D90te;n4^iB0!NKnMh)WVLp}B7GF_GU zybSccKwa`CN0G;%sORvg!t&^xk?8cj=;ZRK=FunxKB5mXk<(R?9{O@#cF~7n(f2Sh zaWt{!;8-KeSRI;}ToQE!$nQ9@p^p?~)TYf|wve7$2V_+uj{p9goqTki73XSHnHO&b8Amo^KULz9x?=<2cDk@*6gJu}z_NUvVB+ z>8V?BS10LbPW)~c|DvvJ-M;i$H+ujr$s>bU1gw0Nw!C9o%G^?lP=@?x?UZM(6s3q% zdn$#$>%xE1mB_RRt!R}jBjgZrQ_R|BEN{c_m(o~!WZ9X-IAdkFH>jNvRqCLJtl6;)>T(tjZx#zt_6G$C&tqEQ9(k;ccTn1Fr`y!rHAy}k z=JxVbTxl@|jVx1nF~E)#$Fjila7KE%6fPaF2NjljRd$v6D zgS>cUC=)e=f&ErKVFN#IL%p0P*9c4iOD%M7DN4ALBLK_Qk0jA-pU--mg@BzU$(vt3 zCHN)`>XH{936-V?6f#>CU@Y?yQVLet@s9TJhe)Sq2uW-oi@xXK+szf-JLdDAN@@0^ z0ePUK3ls1+wDkc&>j0L*E@O+qjmBhVfWW35$FlWZ4Wj*b|-NVlJuP8J*<|@SD z9B#|s2oplzWPJ(Cg+_9cmT=-T8@*U?(J+*f)#1S2NRYIZsDaC1{l!0y$fB6#{lMWN zmCgk)%XQN*FF?INL0OEw%Zt*=p_b*M4orW0NF|6X3Nsn|xLFsZSSYVpWgVEpiST8J zE5?5SVSiW1A+r)dSoJrVCw^3@O;^w_WEK)s#toxrlvUCVGBW#D^_wyJffyZ5syeP1 zz{D_777YId$Rp~ieWj{n@@nFGYZCs`OX`oj3C0lez?zh*I+Q4}5ymY1Rd|z9izR9H zLix(<;ea{0So@Q*4mXswIu4z)8mpQMBU-q&)4#quufF%+yri300Zby!n`l&?tRrz4 zLz}?8)>;TwaB?XIF~Wj)2^rNH|z`--Z_6x-&GHNm|ZJMbQ3ri&+e13DLLfNq0 zlS83YrBIX^=%XtcX3M-65Vd351H?+z8;6L6XwfZ<3AFd& zsTWnT-t^sRdtoYvGqA4Rf#5K=N^=vhmYbHAt7FSYAF60Q-uljp#}#QSpy72=mHqIur&EHY0(TvN9&m z8$D+B;mu!~jty#Ijcl7!3gUQ=j!9$&PzS?!u99-Txq|AkFU72$C>cKkfgo60*Zv?-!Ge0*i&2K^}4~lFoo`!s^K#G+m zfTJPbq;kkB=Z8t zYSAkWr;XjKb=eK}x|EJSJ@71NO&oWML(T2T^$m?i!o&x!`7^Qs>sedo5_PqWHua6b z=3aj0_TnfO_ULcpzZcbhRBbW!@Z<(S-XuSi|44%zFZ)pj16<&;i`0)>)9YAVyWJfm zzSnNiH?YC9n5#FmV{X-DwKb~{{~E(_biEkEs@G|3#`j=#9wH)bxSDFc~0yj47F`ryx`yGyGbU;wWC*`zq zhx7B^Z$TqMyhuW_0{$nUOKZv6;_ABE zcLiBD#f^^$SumrQ_Lu2K&&!p9%WRw`uwUb!=tb}G1IbAm3C(hV;5nnFpJKjyh9vzip7j1*)O@_%>kV(OX75IS)t zWWK>AMJf}L1A8Wr_PL_M&MX=42%{(vR6*cm`GJ+4+hfn=Jrfl@ZaQ2 z7MQVS3n^LpYv$L-(KA)|%sFV@aiy z)M8&3Jrvc5RPPO@rMWYJxZU5p7P))U3&Yh(z4y*2gyFN3Jm^t};ax7m7_*gT z>J^Aj8Z3t4QPUP2qvNSkD&KMd=#iE%BQ#V18TV?SxLPdi2ONgv9Ta}>ITSH;eEQ@g zI{F33n%4FQHQ)VEbnyJ4@C^~w@U9XtidY{lHN2_uMRv z)!!UAq%+OUv*VWQ6hE|e=S}O%2(#Xhu5|bwpILO==}d!k8muxKsI;afdR&-Uk+s*1 z#`rb`r`wx`P3*ta;Wh`VR0f8=q79jSP%IjO>Vz(~o;n%HY-l&a>ZHi%`1mNP*Yjs` zFKIg3&-A@}p^dL`7^-U#t!H_e?0QodeP}v6m0PUyF%Udp2WVDm=_al~3GuQ+TpkK? z9R!97<1WpI(oOQWS8OFnApL||8ZQ#r#T=1Wq%3~Kcie(K#@nk_11QTaRSx}m8F^ae z&-b2oTBzXRy%MJtE3hQwGn5#b7q))Ui2&R`y5Y)9I|>tC)&2)+e2VIIW84b%6~I z&|NwXM=mAuUgepoYZ>TkaJcg3BfsB3xGuBqO57ePNAG|fnzK`Bfkj4;o=zyfCtUzb z+k)R&T^wF32HKX{N)<8p!AwikVWzntiprdOtAYMz7R61&offc)P4Dk4c3Y9o_)J`# zr^{G2+os~=7nj@Rc@+BysoD8x1MkYid@Exvp{;XCw(5tMc2NCvy(*XmVJmODY7%Y5 zzsSSTKxKJ!JYcnHZ&BLuPw!EfS?@sOg@>$Mb^yiPS246Zrc^QQYY4tRKe}^A@~oYq z(C>+-MBdUHADsdDuZzSJyjm#vN6WIgeZ}w{t*xvdc7;Xz7MaxE|0q1|I>=2er*Cq9 z7{3JF_E%EkH`Lj`3g3)SYYe}qw;v{TJZR}8>}Mgc=?V#~iODY5%2s8w4^lpNGcq## zE`H%B`S-3_#Ym6aaW`1)@8NXkANv#Zwai}Wn}U#Ob_wR2b5)PafmT1$59|<+Uud_2 z>1_v?x7Uiu-|)_l`xp`Ao z&n=e|=bc(Lmk;A!Y_r4*SJhmq`tfr7%vV$~OE3u39_H5j$WVACy65vHq)8xz#O)}$ z5__fk+M$xcsan{XOKDvAY$p5Tfaot*S;dZ>i$Ybuqn}`>*qI2B7nFL@!({>)k?%?4|(PU6kcrUq^Njgd;(SX zbd(<~Eb+WH+zle`aV*w?NnqI@)(e>p0&OE>SzM0$d?m*os;Q_M4hhj~)`mt|1A zz!tP}FFDCsw<&t1vUiNW(iP%0LtuAaFiH=YSN|QyZR!F}T99;_|7hyXXo|u*m>~ij ze+$Ml;BfX#rkUrr!7+Bnm4xS2L-X{y152dhfQ2{Yz_oJ1J?g^t3UMRi@fGQ}^2w7{ zuaarF46cg-mb^0L5vr(rl-%YiX-jFqS}C(w8O?oBMqIGIAKu?1X~1!s?Xp;3c``{x z)+KiOHFvtCBv&l9Ale4Fw2iKp4#3T^87KlcX;xkh07?2XiZx=SP=wlg#r?fGPYHNKL1> zZn-i^c+#pi3aF3y*vf&n=?craK*=01O9fX&kJ$Ec5pJy-SevcQ67j&9$&%uLxt94_aoR%9FNEdDU3Y}}zG@S*mKh^-v*v9Z?7v}o z9;Rz9W63nySzGy#KgK6whADIO3E`NTR167jqT1gLV%WIgR!WH>-PT^TMdC(!uEunY zMxn6AhD~(64(r)c-m+hK30zv-C&kOII*PyW3`3h@TAMf*nwqE4YpO`RZEW9{;#WW6 zaZ_R6{6>5B$GveNEceUX?!|N9YT6eraMEaLS|A>i6oorQYn&qGAIHXH!ESNG#puI8 z&ToQ?7d`}%5NKU=j8YlWLG)=;9QoyHOte!nM@orAlr7GT-s- znhdN_WxP;W1FZh74t-E>!=~!GH|rY6`+t5X|2Hfr!Uh7Uo?sDm0IvX6z}t5VoCE-1 zUoj^Y>IVc*KlijGzVBDvfvU}0myi9yUoM|tA)#U65s^{RF|l#+ z35iL`DXD4c8JStxIk|cH1%*Y$C8cHM6_r)hHMMnbjMUWJ(h6;B@96C6?&rsRdnA48Q;Y9V?DJR+2CTNNBTEqeAx12IsYlt3m!6 zRS5Ymifj^*YmYM+QB=w^r=>!L`*B@mYrJ`P68MW=w!p8=ju3R;9a*sYxo9+G9#QI# zO*=Dz`vD{7W2X*C*V8DQO5e7FwJ^nI=}qd|*|^o^x;I^@L;$Dj;(K$lJ=4|v{SyQR zgwkW&-^^XD1Fl*biyyc#G(K*DLV$xgJ>K`|V*YVEbM;2=LJND( z&Kav{*3gS0e81^udU3q7_;YD>wb4qE8vNd~;_9#%Qk+14XLWtdF#O8s+ z=R?eMrSt{zGlpql>mEr);M>&f{;LEIi&*MOPCYsQupMoVdZ5FbO3M=#fB8sYqP+`9 znTstN^j($TdJ0G7xf`{N;eKq@wTS&8=%pOEa}{k)0;a-Ta-Yl@Q4>Zb2T|}&q3-=i z#-2z$KS!25y7?UBN_cB?@=M)pgx<7r-H3b1lfF~6MHL^*H7Z4~qnOGJq5NoIPWIpS zS@BuDG}1J?;3FrhIvRkG;9o3?;FTl9V({HMxCHzMt{(nXHW?|7n*4%|HRi{?%%HEZ%b&dAGPLo zu!QgOGUxQ|J6qGjgwI zPOt{u;Ms~%+a{As9fzd&zmszF3hNDed=XEc#YeEjGP%u~$p}ncRBAqx{H(OsKRZiw zWqkKV!l+~pc}H`wZT9HJ;eNxe+WCH|Pd8-&_)q`+tLK{Y!?xGNAAJOJC8ERc5CnF? z9Zmm)4qYLPrpF(VBO{>`r>yKfI|_XQL+in6O@6Nj&hdy{Uwxz5d%xj2TzT(1R5$$| zkh7fk*{GZN=zS0!j+pqb{`*D$!^QJu9|t60%>rS2Xe}my=K0#;rU9r~63;$xi>mJc z6wR~c5Y#*ZHU4>UbAJuw-w8?9K13SR4!)nW9aOtrn)u*zS9|f5_vW!V(F*=*|1E9s zA_4(HEBlR=8h>glrL>cfD&C{h5a)qBuE>ky_* zvllg2={@&)1+wXU80)PW?4JoK)s9~#FUsc&-5zNX6jk2+5$Thqf`xl9Fvr`eNWPHRE zXs#fP#qen*X4o3vh_ky=PJ7f7e$|ur)$EQ<-Bp10S@wURGhy5@xw{5QSI|%pb<0oh zB||Dq|JXp~_@RiYHfL5h{7e!;dDlM3@+-ZHW)qPy*s*^NNtrd>U29tp*kH1W zSufJEuYVnIyspl0&Rs`3xgD@9Fw*d`Yk7@{R`Ld{5m6@%zIzC;IUz*CQYPo|49h^+ zh{YV_W>)vx)M~o8tu`58)|Js)uKQ6AQfPEgEf)S<)5)uBBj#8=&Mej#)uCks zcdGZxe~oh?vq77WMRTuLw^Pciqye?TaO}5U--cJS`83P>x3GoD1mQxG7`sHC_ z-6R*41|_%|{n@$m)~j0whr8a*sm|5rs>Xa9k$Bx<`op#=R5qlSbluH4zD`dtn~08x z@hbjW$3!HXD;lR!IeJ!m;p<7M*1P&GNB7m9O1?(dB?aRP;xMugzt*_bQK5gd1 zY<5_ETc!`}Wq5%A>YrKdYujT~mT45=>V4#f?i&qN zcpS{0}@<);w@V4bod!=OP506r% z1Pg2VO_Hqp?+HjTgTS*UO1K*Qa*Q8G-|F5v8m1YwH)}tYll1|A?l`xD3s)H1h~~LP zyqX*vwZ`3O1`oronz&d`J|)6^{tNFpK=Ad_{o3;L^IxoHF17))FNxb2A>6GLiJvG= zf62{#ytT7LNVkoDHpdfa2V%u&TA{l7P9c6P-EiDaZ0mM{HPjA^oxOSt(*JQ9brYjt z?8>YK-aW*=iX?c=J{a8HTDdV5Y*352(mc)oUaM;?>00N=D;d;}zwfy%>TGLM-Ke-A z{=MGr!hOTbVDTmQQbXq3hy%u8?aH@KZGl0fSFA~riQ(kUM#Gz9G?+uIL*Xywrse@w zqgRj{=%Vu!`Nx9(Ty!_rT=NboN7-q5P)muRvzK89V>x*|W1MM$r#?-QWrgQGDb!@;?Jz2+9M6z4l#X z4{$L77X}{#UYpCEPn6(r!?N63wOr5yEb{Knjk-K04qc=XxLI0l0lGmwqkXI`R~#Rr+XSGIC$ag}i5g=!0-6yBMt=NFRJGAFD&e zD+2KMLTt1!Ul~G_pm;M;UZptxLscFaw!ygv5VR-)D{P#KdodXV!Ob-X6}g}<*}gFk zA0Db$DHyHkDqOESgNhm6sn&S?)$!h#Wu)bLZKJH8A><6F@vWVwt;*g_EWi3P)+;JI&YB73XQSHd*HJt9G}VT3uMCU!x) zT5PoXuVF#a0Z>C`G)Sbd0hw=iY6kAqEwTugYhE}H=Un+qzOaxman zkL}3S_ktl1-}AkE)qBcuNSa_A2p@;6JF+asZ(Be?#yzg4CNT{r*z_oHr(0fSEpeYQ zc=5)(fzf}_H<;5m+GZ4205PPloUN^!HexkCNZ#_r&GISR@>w8;jUfJ~b(m#j;M){i z+-OSVeu}9Tq_rdLrQKp3&qS2hBuXZM!YtuqWJFG7$|u-V1L-s!t2A}m)J?dEO{-Ld z*wl9wrtqVwsH16LD$=NsB7ckpi3quhF&R*9=;Ow!u`6iaGo%lK(*rHjXCl(2YSZ^4 zUelOqGwG!>sot`4d>L$h@dUZ1@-d<_d9$wE8ZDj$v;;V|HK^^7e4dvzTu-CxR zFSMn*8#ydq=;L6X)>{c$I9Z}R1$)@yjCL9P`Jyh`aw(Yd3{M%s-}0<=CJ~ylFUQi) zQ)Y|Hw5uu^;{Y_u5~G*%)P8~mJD#m2$_HbtfU3|h)w zJC2sx-)L(`|EE90#__Qsy1Wj@XjDP~b_4`fpscIw=Y+@kM(n zlu&WS2p#`CKI!#*j5vAb-^!815;VUJYL}IjHi71Q5_(Gthfo2MD}Fcdt6GItQL~mz zA`dk+6@HzekR*&yII&Di9B*uSUCIcsg1Bl&Tg>2uPY9+?A-wKen_R<49TJs9C6mf< zy5i76Eu)!gwuh?`OsL8YP(iD4)j^I_f^T!0mwSYp{HAfozpPQQN!haLH-JyWQb+{c zc*M*%0n@zC+`KK^^otpP?1=mO2?kb}D2po>;SIi}2KV}OBa9;+4o(S;D<^z@%V-L^ z0T&F42q%6(E8%}Eq2b5NVUj?pMWD1sQ2GEUV?LC*56Zd){l8d36Zs!Y;Hv-kO5iTf zovtKZ?jl{DM*l;6-LdQce>-dcE5zOeAdY+=`47bYws!9M-w+#wI1jrFn4c->Az_Rr zh57-y>2SL_O8Fx}bgVT0Aa*Da{lzgxoh&r=4YBRt5IaHmUx@w4vDcD}DEilu9{LYr z_pfZ-bD66FV19&>3f)vKaQ^8Ist{_-7mEd!lI=0v)#z~SPis(OCe=qY9CfpUTQ2H0 ze0aaqCE~dM2V!@*#5E}X&k*~YV;AD5|3GZ(nI~cl$(mg0pK}trVfUmio)~jg?*df^ zz`TwtmGAdl+44tDHu>%L=3E0FP?tZl-J+v|1>BHFlDjyYNbSyk&g@BMrvwTk?|iN| z5*RY>xj(1vrFca*jdFt0gEwY7xb4@YP{Hq*(dyqt)3F!9R$t@-M{h zDtw2S=DOnzbA3%xd})OGG2^+@t12VxPE%;#Lp%z95c<6*nA$5{UD@;&e`#J-jl3YX*Wb<`C$9BM)D0#Q^Z>#=2I zwitIoB?gmagRL6d2yJI6-XZEqWMvUYCvZ(r5PH5L_6@idp1%AH>W?1K@@0y{5mlv| zVAj}Un%i`8Z;qd1iAxb5hKzTFtljB$(lWH*4%i`^vRN;A=1e`@_VAhAZE0 z6iJeABRNdP{eDLAIUR!K&H3Hy&w`OH9(eqT(WfKh0GFRq2#h6zZ?XA#e_+c5`|}x; zqvZEz^1YWK1tV+l@5}rz4WVP11n*xe2)=%Oy!LzuZ@ZqAYo6=Cli>Jst$Ex|shu^$_{xiQXo|{+gxq^5YG$L^Q>4dc;9Lm{}v}wPcr~q&Y**gWyBE*E_}%^ z;mwY#U`}I5!lWCBSe%KG5x1n|{?`z>#T5OccQy^p?Wd{uV{cMGt_d_joo)xk4n_KU#YK%r6iexT@7$2V{y2Vl>p0r%}WjN$xI%4LeK+S<^a;Y?;NPB?-JeQ{N*s<2&|^nHi>Le!GoFp{GSZ zx%c!4|FukM#ih8;+MVtpO3(eAu*K7g|2ZD9EziZDo;%&XUx6$wXN-15U}&SmRu-Cl z6k$TwWdV8uq!gG~Ds*%sO`mKpWF~*L#tI@Vo@Rasp^e? zZ%R+Uz86VtQ*RD(crDpAdXLlk!~`)!79!t{Etm4wNWj0;!aL8C)tc^58@MX%pT*r5 zr7R9?(RQTcV>;kf)J*YjFMoH(B;iq~)lqs|MQ_NY`74w(M_juK$7@+L_oSxmq8&ui zNUt8vtexboQ$N{yvY!;EU76KUt182w&84tViLKLMvuCd^C#-jJo6%(4$ZWhIyPBW3 z(rhPlsAMUyzR}2+qv_?S|KQKx^K+%i3vSwk>RG>pv$NG%%+UsT%E(ov;~h;VsZ#xW zbwGHv-dBdrT8Cw068{QneafQrD!erqteaMfH)MxbueV-=-%ty8;SjmCIsI|9E5Fg% zUF&zP0={nJ*{hYKMMyM-wbQwUJ*kO3Q+5YJ#yQaQ=0c&BSqw0CZc)ejRhJ|hb=)K& zFUp96>|9a+#HIEzGCzvBKHv0{vyb~vOo;C%$1-5DPw$~pl+=_t#?FGbM*v9ucLAUB z93Mdf%FY)dlj;P8pZu_WURJr&8QNSzzOCadS1?DZfU9w5LU?i(KY?`$0fQOCtGi1* z82fKdNjbzbBOkUWD^Pof4nK;Ja|bhb?{mWujg5h^eSwswgw6T@B9n`whD;OC?&7e% zR||K>0Uz+ZB4txgu27$(#r5&j&|>zE!|GJD)&&V{}1-wf+-Gg-PWXWNeIC;5Zqmw z#@z|-?lkTm8X9+Z_XdJ{fZz_nH35Qq2rfzbviCW4WY?X!HB~cHb*t{b_}2HX^*k4d zeU9|ZWa(d??RUq$J(VY%GgND>>(*Z2_rcVz zinA2eueR47u}a@YJ z%O`f@Wpw9%U)(c;i0yu^-^1-2LhKFMmsX5M@OfyT_wkR^Xz#@n>Az}6Wv;naLQ>CcY-x~KIldEtIq9l%g5PuzQ4f2 z)`k2?H$9-Zc#p25oOGP0Fn42a`YLa}!|z zXxQQ13)$6_sEbYJODmfU!%*uGZ0LqCUvZXTDzrXh z5S=+$^OT81Vw4;4JbnrffKytsjy@j-1gw~*$eH%Y1rFmOAdT2=d-+!^`|T11lX?Ut z2zcsiIw1-;uIT!u@gf`!1+A|H<)T^O5c``R&=vdGFo%D%A9SeX#5`frG~< z8;sb&5Ql2TSzr_XdVfpb5)V^2N!8Soo?DBe{xI zgtEv-fDc#?!y>@^@X#&Y&`$%DM@6Eu?IG^+0yd=(AK$0|BD|&Hn2)+qF(bew6o^|U z^nImWL!^%_L*N&^xL_jDPj+U)3})7qF@_6ou$J-T+oMeeX`2ZBMV*Nii+ScQ4taB?)OM>GCFth$#j) zJ7Qm6^RPpKTHymJQzE&(G?jf44~aC#xC*U;D!qQn+w7Fv(g;@jWKjkGitxzV;aGIP zR8p-}isEP6wfwifu*B(X`M@eR}ieLA=!b8xnyp+{zC=6o&`MS*%2)& zuI2K$0C>#M5cS=V#)U%80Ey6BFYK;nK;Mm60fy?!3QdPk;u$IbT2LAnBqwJDP{3DN zOf8;?md4IW4%LuhN|#|;k|DT!yLGH(*+QW8a%OMA!7@-H#%FufmsAV+u;@|xH?5TO zM3HAb4{}rb;sbc!5`U>hd)BOm-6Dy`smBy!&O=+EFqpTWt+WXRJZWo@TS+!%14n5K z30v@gm45K0t=K|R32b>&m0d0kE=3+HG_+E&BrOG7RVb6@;p!_)WeeC?@i8yR6LFQk zm*l@0;$N4lAVdaMHVY`0RiS}^@uVP89>QdB6)`72rJ{TWi2b*jqu`#PMhvK=RCWy? z4s@as`*4!qjzs=86_Kh0NQJ~lM#D>a$<;&}+;Rd?^r+z+tR!lvXEK z_Mem!=Qwp6(08r_h~{c%3}jg~d8e6c9inR0kZ?5cs<(WK-dN&)nn1LgEBT>_gN28L zU|Dx)@CtcQjHiL~H+TJwLH(V7{XAnBxi9;$rVk~*a zUeV1|@E<#)Am~fZHF5-K6uhc$SZIr4-&N7auhdEAi_BU1x?j83+2aq;&?CI zYAN$@Vs{*IpZ8w>OP(564&R^;GJ1M3r(<{;G1eL115MI*l4!&LIpzgpED-~UxW>aj zsN{afWwfZ@hr{9fodC+h9;lW`o4pc`8xa?W|oGr`6q_5T+y5trF7(AZYj#VBEkWQ=MQHko>)oBA%Q3LAhCfxZcWu{lCsYloB_-Fr!j#1^%2J`33mX&u6 zzqE_bgble{^V+W`+duUkS7u_@BaXP(4P0hn>-GjW+*Z-g)X7ibhVT#tk)+Eje*CpWbr zK(Y7OiD9y|JI`@rgX@nC%qn5u@rtVknBE~oa4TWz47LcJI*==qaFqHIk~r${D5X zvp+E7h7}p@vG9;6ncQ6^R~ymY8z>-(6}YpH=Ebtv!jx=wt}-Y*_nyk^d$-MA1j%m? zI6IFfOjSKHS8Mkf(*?HA^ zi+LvE`L@%R*hK*Yv8*;c9P&Gx%uQvh-UO+{Y*OcPFH3 z_}y^ysZlmH(sc2{%X#&bSl$~M8GO(d)Cx+{pK50WRcAzCS_*}iwYwV>T;g~!NxVMT zAcRn|POvdwEoRYu_xsdvN#~@m7~k#-UhGybXE9#~ixv)Nsv6&l%=*Kw9^6^~Ht>Cd z8#$Ob@)6|RUF#e~!(J4>taUM?H6$o!eA@df9~ud?bW~16Waw5gbztEl>9pT!TSUB7 z=&FTtt3iAQi*vvEoEF}mT6~RMoa1%j#eMx%7Av!m|06xCYYz+j(xWz^8l|jHqo(N+ zx)C)(n9rCGbFf~T?_Ex7l!Z>&YHzGL5G*s8z_aa4@RhW4Q3+wiD8!^cDw?5$MO-LV zxHf>kQC$iFErVM}w-2Y^t`%1_*Q`xFHpq0lWGm$wyv|+5j~kObJ*9@jr#{|4vcO01 z`vMzTTtf&_M)J7gy|^yy-skY|JI8gx=q$Zf2r1T==t@ZmPFmUH3>Hbpj5dODXUw8f zCPM4!Z*$IsiB3#3{FqrwxtP4r$Uq-39yASLyVW{E^Gu&SrQV6SI-fe2>VLoMM>5HR z7L#u$ar?EUJad?;8(40n6O=3voJZUrq@7u?jxBy?of>eYyOY&{ealxo?h@L(a)uNi zU``%f4HmuW0@sL(dKDsl2UqIx60HgCiK2m7}=9naHBn+IRL`n2U9He<^I zSK^jQKDZC%Nppw3*6M@Yq0f?#a~n3GZty@;f8)On z(3f-@-^O+kVC2qW*_J4)VTv z#^A;E#hn2b*m!*aTDJa%a46WY3qM~Aew*D-F){gJc4CfYfqAa&)_bJ&^_OzDvA(f` zrjbDbJv70_7(S_jJ!-6p^#|#dGkK+kI}PQv=-@6H_s0?SgGACl=*ADBD46`e%`Ruux) z&6_uVu7R)ZO0F;7ea# zZpiYO>`%@%t;-}&aqIW;6m`H%xSoprrPk71S+%Q5fxE*GW9>pu_o8pJ zgb{ps2^e`1A5>oswGC*&Pi>G}v{1O59rjCuYb+QiDm2w2gkvz2DK(@Q`2)Fpz&pDD zYGR0hT?j3@8uJklPhMDTHCQkzL~1pZnh;6`gx+WbP`U;@gn8#JK!hJ4EUVCHyf7y8 z@XXy%8YJkCv@k_R4rMzjnTJs8)o`H>F+II-ts|(8JkUsw)2+%_?jhXVm&bBd&Q_0e zBo)$%Br?z*?BpBn(!u9&6kz}i4v>FAk9(Sg$@x66``MWcCz}Ub%4AdtX!1(iq)F%7 z3Ckf%7DP!GWkrLb@Mvvhk<&I&ojt8&pcLO~m=r+bG*uGcN}|qOmcA^uNH6GTb1bb@ z?Aygy=CIh7D9NIil{dO*;}IY?Rg~FNd=AKVu^@4)8BgpfZc`RdOB;{B7mvithG-@J zxcl)2F*7&AXcVuL@FPdf^aOJAeEL_kVj&wM>4@9 zcSxxqYFYAi6hlgA0!kKWSdw+-h{%9PBm^n|>P)h07E_htqZAa>Ak2k08 z@wo>drB45XCxAWpwavYA^xjGOC9LxbY;YyhZKv<;dtb_@kEy%L?MmP;Bz|t@vbRrB z$K!T-j8$d=BG~gW3?>}-#8|D7+c5FkG4T+?1Y9w)UUw>POU3g)0?xBUX*^?kO5P{B z$K=h+5l8_CG;mK48KOP1-;!kHbY|~SGt407RFnXgsI$wn0hRjvN8FizxP@yU8KRG~ z&zltQ5JhP_vy__H{3V$}OBiPunR*{{#hL+e+4cVK}6vl znwxPLmPAP&Cxjh{TZ9NILN+Ku^)EutDZ=b30<43cAB%8Ei*Z54_y)y<{>8*O#iU)u z1|Liwe8Pp)%kZNFgvmunQt9Q|{P}%J#dj?;m>wCE> zS8-wBWsKi)LR#p8u3oiiN`6DIq|1$GegA7e(=yy51B~bg@)_tu6lin?Pg-OsoyB7klCK3i%Ijk(1enr(W7Sg{s3_jh8Tj0L>0~fTw zhnv%|>4azi8~G?L*OFVmzu#N)UjCRrw?yVLiji3esWcuA(P;WXYrqL{k`Y&C*dfw4 z=zd?BVbhO7m}bL6S{0?P;-yBd4J;>~e+}-*`hm=<0m-z*n=L1!p(VMq#FO@mk^nQY z!ANP5({5?;0M6s8nI;h!k}3@8|1gP(g&2GD_`uDCQyfhPhcgg;1GoJf)j93340EpCcpQj zx=IHO5&zUy;xArDa;B(T-(G@(SUHGG#%xesu~-dnnoO7gd>WU;Vln75!C|Uj*0`%d z3FChb@x(*V-Pf!vuesnXLesrvE zyng&BV&VZDc&uaFJ}LRHVXNNH65VfBPTf8q3^-hl(lV@DYCM$~Hua2gEAOddGOG1W z@vb;tPxEr%H1`rDIUp9JkhNaT4uEHOXXQsf_YV*Ye0MRxuRLp6P$TmRVqH1a~_+-1H024pE}^`so!M}dVf~tgvy0(S`e%{K~&z~<= zlJx|xE!3o>+p}FhJ-Cn7On^NpDLk!|WKMo)^;08qwP7rgkQ6|{-%V;} z(()sB^svg^TY-Y#d-Mzn;~08Zkz`jt=vbIUWwE)$zFKc7isa7o>C$0zWGW=eHrSe(C1Exk<&R357aCbLo;Lig(G!Z)*XfD0{j7z4 zc{T<-Ifr>Rpc=nC2ls`n)iWF6ANCV2>$T|~n)I}X`U3{e&G|>jRUnj!naPgkm+Enx z;M=FKfK@!`6F!5O)X@jOx@LIl;?R*y&5=?(_hJdAik&>!liHPxC-Sc2k>qPqwG8aV za+G~qIR?f4nEC7cKQ{*gzmB_7W2nk0E$8$PDhZ{kCo672xVF`Ni;3Uo?Y(}iG}sY0 zCP;E{^9QOg)W$Tls3n{Fu7PFW6B1QprdQ)gG55@@7gI4M8G~>2)SM5OQp|CkoZ}T- zO{{eD+nfOsAeyroi+R_Qw2F)CI9rPylCB$q$}`NFhQKQ(?d4M#ap`2IBo9rTo3@2w zN{L0If8*CD2i<~4U3C$mWu&I4hx$IF%9phhr zE~1-Q+AP~|~bniR!M%*-;RbIur8H(frt zZ()cA`{&=AhRx~5us(tH1I{e(o=$0_e`Naeq;4G_%tRu$X%K$~k zXAjkj;d?lEYfJU@PUHb;{Lk9U3KWAX3GTL543MBbv~~5{yLx7xg{)F!@;aKjT9}rq z!&}UYnRw=3pN(y8a^^lG@cx9E2j`d#L%xOlmi1XvQ8`WY@!$T-l4@I}a#qSBbQ~q% zxxlmG*oQ94I_7-y1Hk4)&+&c!*kmQT$g~I!`ub9a+MLuCf`VVlud9YK;KaMpmXi0|$ zCP3fq6+8u1i+#BY9R2z2+s}`mMZHevP>ruGW*9u|Wdpj_M439?%tP9z12O_mXto)i z7n_u-;1i@@9uWqEOP2KEhpw@Af${1PeM=n!Z3xStj){Qp?V(E_s_kLBF-C=!-hq?D zAqY}V7-}t0tLfswU_p~9!bC3?z^^IAATGZm#t|jPv?|K8D&mu_#;L1up&NQX;;^U* zWkk1RvxYF?L%&*vO(2Dd9YK3MptR*scOv6w&rl`#a23Wd4w*32u(095@cz;;UAyp( z-7uruxUj`T}S0)MMI?`1W@1s zsZkNZz5!)N0@r}Rt7a;LqtIB!$X5BtcDu-Uy_nBO0_|Z?%8VGE)CjU7P$<4+lxG}% zn0#QGTnN4&>P;M^OlFo*JfzIwdurTjmdI39oJ))RfF4hRRx~3Dffc@_@r{(FRuGe? zjNe{@9&(~lnGDgY=o6C7$%FLms)#bJ-j6ETJw`;;CMh~kDX~SVpcYBSG&!EMB#9O` zHmfAzGO0cpi7u(6_q;=l5wIQJ*~ zK}tRB5T~*N(nSj~*aJ7Bgm{k=Q_+(QCAbzOlSP<7bAtjX$H`dwQh}O+ID+t0mKLFW zD>_bm8HMBc@0KF(vy+welh3b3)H;(vcA~FS1;~p;8Lg7vJ(3c1q?e`As>6h1kOV#S zg%f!weDsAk1||6xGaJm4-Ta8Q31Xqggk}mNZ<_dNfYFVmAURLO+E4=HWf4;-VCTJ9 zn0r=FV`jXiASo3eq9?a&YD(!^=5nLVgGV+|QnvY{;B;!LZF9C#X?lrNjyFcyU5msQ zs3^lW&pZtW=$Mll$_66gezeHRD&-vXAg*2mPAQ~ag|K-tQP116vmf&fb#gVj=aH5I z$fa;AQ@Nb(x*DHqX}K&WZvq((D8b;1;b==gT$~V*3+LT>)|hi{t6o$PkL~{EOZ-uql@pVUe=O zAr@!sV5RIJGWnMb<1mqSA%>;UJ&u<&nGu9bB3U6a{+m4{Y7zd5D;AEh^N z*T2%R{~=cXkCpF#6)XS8%J)CuTOe4P0W8BGmX!m`>4N30!wR1MU93!o1Nc9w@V}?R z#(!l$amsA>H6gJxp#vLU`fF*_&KcmxdAiUXM8rkf@>Ki}7yz6sT2#CPgk%6JD<5y) z@pKL&z$zWG%>>C7K%+vKAAz zy_^H|+?b0m7tIjS=bPzf{CSnovtX@M8|}iw&gShiUB@1K_lE_rZ?q$8OzjLaBu4B( zL`O&envta6F)bLmWSA|k-y<-b_{9GHH{g-dDa`nbKEFSv^%7q{+|*xms`HNU>hstL=0ru!?<|e z`6`GNXO>D=<(y$ZP3tM#6m3gidp|>Cz>^N`?$7XkmiG7iGF0;vg^ElJXPm4ou+ExR zE@?N(VU|f~5?!8;x8GJW(O#8x;m41i5;}-EW!w54=ZF-Y`1xjs~z-e9gGUmc3g1r~y%g{&{ zLq35K$gy$i0+tC!Ej{r+Y00a2azveDmN{>eu=aC8tp!h>w~+ju0Mz^=yLFwlonCxC zV^4A}8>c3d)aY*mUG(nuz$BD*ehFPvk^P=H>u(yc=5U&%j%yeol|H!~at+FL8N?$x z<>&~;oMP)IK_+Y%T}&C;c-gCVvkj5-m9ckoj{dGg%u?B=#WY3Lsh(K;Xalep_Bd@u z(YDTW(;Xvq7ZZmu4jxWDl8=$YHsgP1V5Kdm;YFHg6?%M|;4uW;i1~QzR1fszO z`v%_m&-thxV?s~AE+dLGHeVU*N_~380j%|$A^j0Wtz#?mDiVJ&HdGT`l^jH647dUM5@ z#wk*K1&;AL&n1|Ll_Kl|hb4FBk{!QUQ2hbQif7EF1cmKATo5a$_`3jO;!5#fqmxNz zq$Fkirg5ato=~j2N~z?vVx>G*I0)fRTe75O60lS>DY;6|My_BM7*sUxn$K*Krf0KV z8=v0h&Mc(`5CjO4fK@B9hQh4*p`Fv_I@g(7$`#zXg4wnoRWs*n_kRI96%@eNIX@S7 zk(oN>yt)$d3x#QcXlANki#?DR_6Yr}H98x}-83I=v>*=y451n_xRj6EoI;FsQqv2V6vOUL_(BKL6qTuqa3I2qG$P^Y9-@3y^0z~rHXpZ6K&Ei*$)!<=E41GW;-67Df2Pn4C&xE z*85AkC>88h<@UOUoi#s;yr3E?$8|;3OgHEeFpDcDo&Z#mJ+@oeQ=pypz>Wk{^sH99 z@oy7LuS>@?NR8ca4bdsWW;!_Cf=GDb@UWvm(I#^{y|)~|>`YyJ&abeysq z`HEOoj-cURJ535(Qx)XngZ2ODJ(^flmdFe=nPhc51nDv4d$(6vJIG6wY}{8bm0YQ0 z8Qb&e`OPr53ht;n<7H+(c;5$DAUP{BVy$Nr64f80D0wUiseWL~f{7K|%a1&3X3w2j zGpet2J2%w{Oq>-avpL(R7|6gxW$Fp|wJW?GjP}`mUMSA0A*tNzsXIiY@M*h*z(CV< zM8Q$fO{e5|M?(u(c&p?`mec^lrrM^PdVvb=y)wk_F%oDaT>MMMsSYnMaUZ8e3P?1p z#(36MV5)*yDPkA;E(`pt4|CYvca+Y+B*b%6gzzdcH_-6?=eCyaTNn6qpd-ZtY1Zs7 zOV2>$Ydf|=W^weev}}|oiz(S~dee%A^0%KCCm8oRZ2snDEi3PoIQwLlZl1YDPOi<0 z0y{YB+_Wk3O!XuVYP%FCz2 zsWq0(>X|vWwa0}2rA;sgrw?p%7x8K>4myvFc>~nP;_I}GSCi3JSR~lGisL(5`|139 ziVKVDvw<D!cVoi^zB{oK3L z;yu>S9gX9yu=2~9;i=1_th_^=ny2q*q8bu!ZeALB-A2jzzO_#emw1&OvlV+jOz+!I zT@Rl3`AqJ59Gn$BE;zpQZ2Z7eiuQLGq{@pb-p7%tm?npd#>v_tQWD=`K_+WaIY0$Nr&#dC(`E&^^{;Kn)2YnW+by7DM*JU z1j*Ooz7k>y4c^)FenR8mTnT>lz<0L-IXhHA^ASa_0#eukiR?lMs`#)wl=tyNs_((a z$dFrsP>BWGpY0*n43Ky7P^zO)VZ2aUVm*5F5XMz@yj4kH6*uT1l!O?%iX41x1r5~< z69k6QYKHFZLB%@QCFJE;J0SW|A<9Prl&fLJdVHow;c7=*s`6pNz;JDJ9$jB{YevrT zAAVDVeB62vb96pS#t5GdUR&aD7h+@khu~au3x^K(-wa{gEz&ah0h_7PAWsP~PpRY% zDcT#)!&E8n41w6JXwTiKJRpDUk+cJ`3^Tf#R3lt`>RRF%Pf}b<;*-4O)Tn5kuT*uG zI18^o3{O(2OuR%deAOdLj~oB#S`39d?qNYJ7ESEJQk2w6Onfg+z)DOhP3$fMw67VT z-5e*a9d#-x?lA;NFA<*41kGzwbUXlQ)!*@$M|YG8CCZCkj3qShCN!=J?V}4nrzQ-0 zB;*_k5A!5s?x3 zs2w2pI=Le>KHoPvvpHUy7=$7TDqo<|;)!&%3>xL(9o9^af%2+arbaCAYL=!(SPC)- zN{BP1)=8!Ml)9|>a!*L57+8|lLQ~!n!$B)4Np#}r3>ZlU&0NHgplqnb+uc;PW;0W! zL?t9nOQu+HnCPt@AGIdKMnr<_8sG0KZW9uItWFLa5`H9@{OW>Op9Uynht7w|vU32i zh8UCC#EjdV8gP{vxGVl~mxW$10j9x%LtAsi$iiCM~fIccalMII)3KIo z;1fV~t+e*ie>NK5;gCv6omL?xNOA&mVa~+#J>g3YgxXx6zMODxt*nrfg2g<@WS5{! zoxiP=V!F7zdY0(xmBn-;arh6)6`cy37|b9yik&%fV=g@H9AY0(rCSc>LI}Poi10%f zZkZeZ%Yih=0CT~OGPb`mAeq?2fMxu! z)n)$G|ILv^TGIro`ETr}^_t$Nnm*Fn0niKfxOT+9b}XlMqN{dly>{lQcGe&Df4^N4 z`|$gebCGZmwlQ^T8A}-#>hL4n>9i44r%4e%d-hG_G0NBkVHPn@G|<*a{%J|A{%5lM z_Oy7sEx|usah^MWtkP}#1D6g2KD5A)B^cc!rDCU^L3DRk9oMF{oxnATyvhUeHhe9k zDC{K>qMPe>GXJ3WX~BB3wNQqKox=OxppHGd0yUu3@8_w^OR^l-eMy!8baWi5k3M?U z(}GYGmsAA(p7WK6C-#uvT91_W5aUD&1b<8`?SCXo_x*ciRRI2xggw!=Z4pnCNQY_| zu1?3c&wJ~C#~1xyCrdVJJ}F;hCy+kYg>J-dD%uYV@X zfwD|AwZAg^8QPooAwdT2Ockc8{s;$Ic8YxIp=4Az);WgE!xgB`y%>jSI-yDX`9=nU zw5UJU#uibB&9Ak47_z{J>GqCYG+CO zbzx+BBHS{&5&!uoGG#F3UBSCT?H4DcSkX*Frb|7dDg&@3(AoV9Q{PNiFsPl4zy)4= z$srnah+@(k-15k>4o6rO>l}BXUj%Of-rCio%#=Y6VvBkZ*Icp$wM#ss_SbQ_E`~DXQjlIf?DX2VI~S1vgjEgF%tXt4@d-> zU? zqzX1#S~xxp2CjmV=DIr&*0RO23!GvkY>sZcv0}6CRJPv4&3uc$Pn^s2#YzV+y`OfI zE45>qz#A`o+0zu***?;n*2FOzSHUjVH))#Foas1KvD>R4>5n~I04HO(yE*>s?tPW> zb!dYM#X!{lA|+=>no+Qk=_~AqNAR0`6Y2cXuivz_;9h@)4-w`C)p|(M@-g@E{mbS> z8r0l0iRe~8dWJEk*i04FKm*YvE7Qau;P!YaUJA%ZqOTRv@ zkOhlRz9KMUT3XcPBjB!b$2C$l&Pgoe9aIg{a0x_;eN9A_9$Ke~d_F{||Cd_e%j!_| zU_V&9?}~tlWLAsQD-Velp{9qwr~*habB(^pa)Wbcap$QS0I}AHqg!qW&#%!UuUS+k zX=C0^J`?LPSi4uzE@uxq*8Wny_A8E8v`l9Av|^7vFl4w^f^1*Nw0fz%4lK;rX#&&8 z$(#c7X%-H%NLAWsBJ?RD2=GBv$mG6qCbM$?fM>H>cy!hN=}WGR&#yCk8>@A2=2^9V zOV?HaCb{b1<%Y$db|QL;boFWXtahDy4yA5{1rfN2ZP)?kH4vEk33;2ovsP}N7*3|i zw(p*wd2%joC@%^0^f?+K{RMy11@r+L4C1YhUV=Uu|@U@%QJqaye)6FD9X%^@@@~X4H1-0@wDw{KeqZ z;gZQXzPah)7A2^7mB)0H$5OAcQ3DtfuIaJx9o+CbQ`MzY05P8y+y7cp)BL?az``=K zDU%U>`fAGsC4#APkTtA1udPxTXl3$_7ha4NWWtoMRb3r!{1J_F_P69?QuRES9a7u7 z8(~m$&Ruj7*6;lvvb6(N6|jgo^4!Frtm(~i#~hA`!@l2PGcIi&P2fL77xI~3ccyh9 zoJX4ySiUewUA?A%irpM|y(i;w+_a%~YsKC^sqRyo+*i`j7F_I}1$#qi2>IDV31N#I z|Lq|C?`o|t)qolsFH@tQ1JhlQo@)lXC*!R-!BtS$e zD0LpPGY4n8F&!j66puWaAN+3CYW3%QZ+zB*OKWG-nqogB!_c6*+Y)>lzx(d~p>6o1 zTGJa}#m(<;T9f(dex(U~XJ2s$Pj^_rXg1uG2%Ykx-pFyP9N0nIN&2lOe#dTGV_d5#~k zGH8Q{tX@jTLWV=k10j>%`mziXg=F)ZFWCD~g$`YnLGQ!tA-_67Xz9M{`UnpNiptK4 z6H6378xTkh48`G5pV)=wA%$h7LOrCySRX>CtU`_#LoD09pFN?<%}`+=izHA`8_2JF z#3vgCRrBQ~xeZa0S2IR)r=)Vnkb(Tc_t8XW(a+*@isEz8<2ED?H`e1ZMTeTB3-J-V zd!h4q9EF2BB2aN6>oP*`t)d-!H)~r<;@xa zEH+7yEJ|{v$xL-b%=i-A%Skea$^Fuk<7^RcGq<|SlEJqF@gXM&r%DYnA_6Rd*!bdw znn^di5-ktRs7(C6R!M&~<#0NERCtq7^u^ITInG8!@QxFOq$GA%=}|2FE@(tAe8ne@ z2rw05&mZD$szhdi;`G@BKRd*D>=RZOMCYI>I{kbzm7u9qf-Up}1V4OwHHnD9c;#Ke zOd7E&O)*vyxF8%?F5MDmd?Y z3?>I#5|bZ`==KAr<++TclHm)adnK80D2N=I?$+tsizHwf0;w(~AVR?VW=R_BmvP?| z7AVCg@0W)0m}=+2O*{*+B1y|@Nm<)tPHN^NL`sC{XL3agqFHj%(56=UWj*WhV5I`` z>_H*iJc@#xHQ4|`sk9g=A-X<}8E$3|JjQwwe4UisBSdDh2IfyGik}b#HKMt{4hRmG za7^pxFDtN;n=!#2xfTWh%O!c`O>8^IY<8(spR@BRcKOTQ7#%T41yf^i!#Ivo)0I;Y z-~WQs_8u@Ud*waP7yebC51yxb$(Q4gbdlUeF-=@HYZ?im`FhlhZ*$U}nu=ak(@WD7 zpq&(AfEn>YjH9^j?rpN76uY$#@R~5uy!rbT}%jB`@#N84EhSn9Z zb&L!U)k}ai>K89=tZ6r>sb(gS01z+tTe3)ydL0uuVb+#%!ZaI+zko=*#wjegVEGfZ z*$vf9y9Cy_@0y$G9hys4nK5fXbzju#4sz;Fy6Vo>>n@(^E=lXJK>uZ1*;W60z5ai( ztqk}-;dSs|lsIpTAqW)kP6{eDK!3;^01lO}msuY=08#NRu+!d3A%_f^3ccuh2_cjE z#2s1s!^V ze?E@}M+zhrX8iWawpMkd22m}xnIAz41)^-e_cLX+07jE9CZO;W@#eO;3z;M#P3NRkow5T6E6+2@sY2s)UbnB*mB2g+E3HsmmX|l7f>oDVEP=~P1{CdK zK^bAypE7o0=IgpQV~%01sGmIi+`R)yN)dAj!^Kp+xGqe2IA;tRslNLmtVB}>_c|&@B5Onu5>x@ zNLu?NVl#rJ@#SATPNKc`qfp}zfzNjR2pP0yU;CQcC;gwR$$yw?uO?YIAXnPRk^!O3 z_)}VXW5Sv&FjTHPR^AaZqx6f<@(kzfNYpmsJcDX)y0vRQ$T{8i80s5^%;@_3@j#Wp zn&z1!$)YV?eeV;yg+g0OakWUA_v-qa=U^?wSum4)pwiLl!29d(^u_HhVKftfz9K_i z2S6E3!F?sEz5LcRNmun^IahnL75)RS1%>;^wtMf!cF_mcC)4r|fg5|9J+K72bq5}m{dwPy1J*A7mKx}@;Ar}xUf_ag5nT?zS`K*iL@NJWo;sMmsoAu~U*>vsfa&?WC2ewocqW-KAMz99O_pPa%(^ zAwL8Hmi@NPJC$fYN-_<#zD7vW9r}t*5?!y}q+wbYXw9;fDw`G8l!2(X0dN(ZxU#>3 zKKv>hwbP$8B)oR53NvT5?kuzBUdV3Ztze86Q~_sPiF^sO!O2TO8{;#0UDsLnzsotk z3VdMLTqvLoWsJTX|9a1P4L1RxSju(+)u4pDP_$3<(K}2ZK=aq7_-Bmr$qMQ_PHB-G z!{*BNRr6^jHzDs)4&}|;)v|8WoL^H&h`c3LFHvnNkIjW4rW=S?pf*$hd+h(X=X}k# zS;!Q#)>o6^T#OI5dl}DS(K<0{7qUe$xc!bi=%)66s244A z_=4t!!Cb@Gy}ex%;S#L|VV}13rMy=i{vcbit?e7U$!tS8j}xG?U={YuSr!)Y8j$&)wt?yOy`TjVq5=D|B_ zCkb_~SUcOVl4(m%KW>Or5oyr%(Ko~AKZ_Q_C88@_?hdb+%5QG7hwo@wEEzZIvBXmn8OIJ$RgW5ZGH-4o9AMCy5 zTO07Yu9@IgTHM{;-QC^Y-Q6KrArwtQa4QzHxK=1qtfja^ai_(tEevbzv*(<3u6@m( zIWzNN=GtHL2PAoZ@AKSu@LE}_$+x4rC37$DDV(|pVLM^z*GoPD*q+z{1y;npLy@=( zpD0p&oFjM}cA>%wYaFvyJ|u$@<5*2$#Pq_{tBWZSEj?cw8qrE6*3PUu`^SPED|0|2Y0&; zz`yS*Fo);sY7%!yewiI?_Jo=)kzPGPR*))$#cDzdE^vIh2U?_s8g89DF5rmu^P9Tm zEB4#^OOuv+FSUwKRO<{s#`M3eTRmqQvM;`W57XB;*IqTuIqOITzeSZZ$07eoOj#GTiMwzl<)`MS-^YWpNb@T!#iPbl`br=?|W|ZyDcwOURsIy1AF%4al<@< z*p$q-@Xb;v?^|$XS|HBv2fQq=Yiy{4^Pc+llG4k$c`!CohO<&PBwgY8(qm}wW2jR4 z#i?c5UU28%Q?GReqk*2US0+uhrxUkNAAd^+!umtusNtW59cZcpof6H0n(aRbM=d5X z6bD5GL8D3>L)V5qzM)1}DX=B_ft*6re;e2ycSd_u3-Ss1OzaZhp+{UV#Awim{@RO1 zbBwXsjYFRC0w>x(J8J0|Lg(qlveAMU`R#6$+;B}ru$yR$m4eWDz4`}%D=NCtBu3k> z4VjZ8$P*JOD-(I!JwD9@*mMQbw^KDkjrbi&S(7=85`FHtgAih1Q?WM~V$b#2FjMge(`4h_q+At0OCoUT zWirGyIw?8XlGUJ0)u6n~Fkkgaw6F_ok1%j_1s^1W%PU`>K~oS1;F3k|v_+xryXeYA z!|FScHjLCdQ=^81ltuJ6`L}Pp2~x*h-*k3y_jbkchw4p{#t*3^Cb$}mB@64hq!J{j zE_bHcD-bSpz5aEs@*TlFmmD&?_(q2*y#hUBmnEa{hT8ccO#&^Q2%!QqRNlOi$aYjZ z#NbH@)JqTKMKjC%8kqTnkjS0QtRcvJWhS26mT$Z zsAoT@$-<^VL#E`U7);GZPNgQN@0dl>&0mO;%&5zHv}wh$qo6!1KOm5K&_s#IBKxoAT7wN#(gJ zMCeMhCAyVx&7OEx@p*Ccc&QbL59qbe<@t3FxPY@fXy)9&a#^%^-WTSwxHBaWWLbcG zf=9QqGfY7pf~*s;B;}Z#k()F>fqVwIBuFq1yMr@_kCUpDjWdPeqdX_y5!($|rVqay zSROWH&nbwEG^Sr(_ZCVCcn0rrcFO}#!YWiBfMqRj$6Lxv@hik1%85V%93akA2o5)- zf_}2nA{-|fA336*zzz!sWY5kIVhx$D@_wlD{U5@smwLWSPj%#Sb@cyGmff<&f3in> zJF7S@M@*kpfR7O4y1rTLHRF8+e380|-qy(?0Po|mF17@Sn5;rfiRKxvN`7;2ZG@6dmoaCv1bKu|%bf2A004dSg? zwRRf0TMbI5&e8;ZFKlnDKL|eyj){HA0hW(xV&@y|RXP_ZEmyO*L zhEvlmY<3^hERP%jmMjY=8piLIHsOgBJm9WfYju>b^smT3vOi57hgJ48=R5Wq9lT}) zW!&GR0J#oh+T=Q-ZZLH)MU0<}2>!H}2#Qcueh$MjE}f3Wa7W)1AJTH&L|4Hp{ZGrm z^LO+}@uRxbz(^}m99{Cg10?ub<6`2-%b3b5)#)l?4G^r*z*_Qg< zh7ih)PNy74Z6bUab_a@ao>g?16*^f*mqW;>|6X_yDF zxMQErF4SUeh^JFwQd^U#?WrMl8tcv^y5$S$5`_DV> zKY%}V4J{Mo90soDrOu&16poXoL1GS0efJyl&+kOZkDq}*(Z=p_g?-W7`LX$X#m8PvqyD8;{|vGJhR40-mi?t4?3~hHN!T_E?ZpTo zudb6|D&*~^;LJX5AT+V$Lw0floV8O*{D!pw^q0>^2Beu9-_b)gFZz##PnvpPxyVAo zcn0c?&@{@-TRUkyB0)%h(6|IYVR53Dw$OsqAQKWX&zy(|p|rCZVoj&>In#v{z7esy z6Cn@Mz|;1zqt}uh3r;>n?X&y(T0j%@*3*U+LQbaJ&io?F4WPp9X$TOT^e=RsZsYc5 zIpll8?KD_ID^$ZwC0z&^_BQfnA)AL|@oCr5WQ=Ivk%!xKJH^7*eYGM!KUkxtI=tr{ z^5XB?lRw;br+)#?yb?%SU=HN=rZ%{wF8`KHF-;@0`Re1v}eY5!!>ba*w( z^S$@1#MnmU+v*#4qBG5aUs18LGmRfVV(rY*VyZz1KOXsv$$Y9lk}v-A*s(sbxVN~S z`vfPJ1U(s#%8-GgCIUe(L zO~ksbk)+`A)D355bb*`LX+#59DK)km9<-PN82yA*Jn^KSHlH;&K3^negrf4(-)5SY zZWp}@gVhyWIg8d`R;H#bs&5iDi`Mo$vFU|sejOu;AW`O9=1rABwnt0EprzLbunV7z zQ*5&ii-@0tAq2Qc-K?COCy5z@7Yww>V#A^jS?SAmr7x~oC4?GvL=%34x;DB-?sF`q6axdrjA0xLDt#&D+WbQxTKQ>~SeQ z9I_sMw&ANv(?741cw+P`YF)vS=z^uj(x`npBIILPMT+4bkj-{1tapus9-IsgM|xHI z{5^_B73{G!^gjrQ^X=yh1ntZX-lrHf!j+huPqEDQmpc2hc9TE_Sf{4sNIB6SoUwXf zn-l-W{FGXD$NQ9=hvo0Z>L6p>SMIuC_q_BhM$Ue$NgHwF$zgq=OuI@>)uPJcaX5NY zaXZ|m70VngPB>fQZ>{>{7Tf#A>zpVfY#TfAl7+WzK8Ce9pGNpie6|b<*N@nP&Io48 z@rk=?$vJ{_Rf_nI+M6Ix1ndA;CQuoz^iFv490g&f>%=pRRa;hTsMoRQ#W^e(xFP+R z^h<{A1KQMT)61qLpX|j~E?Tvje>njHy|drgdE4wN1B$*!G?3SInsKiO z#Gj+VDfh0s;rf(cjst2hCJKx4FPd;yCn!e}`X0m;%2Hltd+*xS=6!_gEg?dFa;b84^$F zXc#f(NSyx8h;q&SaoTWhoQcQXAn5R8Lrqp;aS@!U#(bVTWK^=P%^ex0z*9ojW3qi# z?DsqEAGzRq6mav6~mMWnxV@{0nSx6R|?x;0o*^5d3HL&JJU<@m*7F{P1I zd0ofgKH9m_N^sOBx9mvkiA73u`gr$lMkEm%Rg+p>?9{Vf5Yccaej@AF0Xe`1~+4@ubm&6{u;b!1zX_IR8hSD zUThWqJu%Hu*GQDp+eNsud93W-(N)2q=Bk>w))kF?{w@BJQDmG0^A^UlaQOkGCsue#o+-CdsFRg2$42iLBviw$kIf46e~^vejqM~*gC zX{gpy z5iuA6Q4$sz5@wL&8Aanl7~+2_#tR+9V&7Ou9td6xCsI+B>-c2$@?^&NB#G^0q4FfAp`<8ML6JqEm}tD-U0kATaw-PsGm93dschyQ zf2HbENPKA0x(RsuHmQarxduvr#~K&xm`qr%VgZX|MQE3kCe-96eY#6#X3}|Ire7b* zlf%km9jMIa=w4x<%;fmSyj-coQK?&1Y2GyL+eqrTsodm2YFfOqZ&2!;y#!5iydItW zrhx*HqI`&BvYsI=s;C0rmD=@)+6k%LJwgFomcB|Lzpa{1pF@x}%c2LAd(kE<43j~p zO>1wFEkVgDWXy`M$Ru*i!mHrM2$R8P%zS8(L&aqAX_2}OkoNf;)!@MHKSlEEApV?H zDIP`YtH871jOa2~R_HLJfk9?I9#T^d=|hgHfkJ_!DV{Jg+HD{uA=Ac)u+xAj<^7ZB z3$`?v0UH-km2p!nLQ&~)05-`euEi$g6d;btmi^*NJl`Qz%T>Y$iJ1Y!fLb2i4;4e_)LNA50&9Q5kA!Xmo z$g>G?#sgofD)TStOu5Dx9SSTQNZ!lkU#aGlmdT?E3am`~$&BWL525-7tauDL6#@C8 zQ044JX@X|}CoM05ELZTM_$PgK8~wsMc`hnn+h%=@UWmX2q;Mww`HQY-H%@BGpQT#A zXt*1=gHH`6;2tsK-mYPyBjcwJ5ILhSqTuCG>Xv?-mbPLmWG$te*`k8PJ+Vq;F+Fsb zK)2v-{j6z_!j!kn&qZOiFrXi#6xvccgU|Lmtmsj#Gzr2=t;>pgM1qtLeA80q4H3jQ zFC|n5qO>Aq^fQj|Qg*vWRJFX3|uxh3fJcjiqg^uhJ(KP9# z$LCA{AiT}0kSsG!KFgyXL%_m;QGQRhxl<%Zeni@3#03GihfC<%aq+?8wb(7hLEzdb zI{Xr-h|DH2f*eEkGeKN!jSzXgOe|r%9Ji2qot?d)dp4i19%(C31^R&Q-p}y_rR<6& zMZb|T9IB@}t7EyZv!s(-sud0=stU5@|G?hRl|>m0%~b=|ZkS6NWRV?b^Hn~OmRu4u zo#)1aDE;&ZGw$mm@f)tm8`HPypvw)9M^tKhwMXLUX|av2K;8^HL5zYXip;wEX8gOX zdbS4{u^u9ZadastrRzC6_c>X2cq8R;*<1?dyDcj1P5kjnVLH5b>qM=jXD#`>O&R!g z&EleWVKmx%t(UG#x%QF8l9@qMJyDdeBy+ntjMTc`lhigHHdvAy5O2@w#XpWKo zs}}vAWa?acU4Mg-EUuUrvTXLwZ16&PEZI_g5C|~u3F&8}10a=V zYbUBmnMF(J+_BMt;5#E=fgl7E$+YDuG~PW7vtr1Av^S)Gq2)@Bf$RxHgYt?L^%Qj^ z)g7y4z&8FB@dy==(Aae|k@VlKuK!^znw459K179yl#WM6FVq%$c`1~ES0ZXSE?9>9 zay?Tbr5zTfDSWtNT^iO$Wus#}TA_a#_KGIkI2h~%A@jU9dS)>x(xNk_sX1qB6g^LB zJs@Bv41-!S7pUojYix++dRV14P4eMB)U>AtSQx)m11nf>*dWoQL#6GjfEl|VR%Tz2 zIiUd~+1RQ|g#%a=&G3pCyhsMg8bK?uA&V=H)fqv4iMKC=I-Z^|3Q*@_`BE*nV3seUprC?3RP{9E3$xltR_ z4X9DWeBxJ!^QyC18~N747mcymtC6yHkes#M`@QHs&NFsaOSZ3@#<3>5 zoBub*1&YOxWgtRDBcyLwH~woADzA;F&^sv;-Rn7%>QvycUXqvW41(>0V3niK(66N# zh!)?3e%5y07)zh#ookv0Q1Pjz8D7pzT&o96HCh zr<;`ed&e?DSmGRJ@K@rD8v9+)&z@g|6vpf-pMGDN#!^3=n*aFvaQl4tLkn`9 zQ!Fj`0GECvdZ}0UlH$U0Tt@V-@ye6nAKl~cA2;R2e>^eoN^jy!a-h&--Vq;gUtg!8 z$kQ(Y(pWw}k-g*?-=^s=bjdE+{AEvgwSi8j{29mH*Nn1a9oQ+@d1S^bOyo#|`e9i1 z4E)k+x1iugeOTh@gf~#?Dg#sJu9nc)GvU>Cu~B;5U=kZ%yrO0@!c-&V|!~+T?&A`Jy?! z_V*T&k3di999~+4Wa;=x=&;kMU;1D;BV*!jfigcw7V_ZE6ES#1919YgK*zw`!@sAlb0v0@TgCCfK1echt8{Dq5o|RYHFOru82#!)PMhDO;Bs13qpD*L4O&bn z6|T7-51yYYtRt`Hxb7bFk2WZ(M0Pz`%u@^bDBu#yDJ!Y6p`q^&&9D1hU3({{mLfm> zRPv3Gbzjh2G|qdv6un_ZUTJdD53Iuex*UrLb*$ulD5}n?x#KM5B*1uz5Fqq7SII93 zpPAfMlRk1$+b5gPDs9)E)X5l`a1H#> z=yq$)a+%A=uxt~l0!hbuOdxlLeB1;FgQ;gwuk(K#~Rs%B{F$xyw~DbWK#{JRs{ z$kIO7W&xcS;;C&jN?kJKLiFJ;-<4ifPWBSY=HV}|dS$m&{~^@|Hn9VDW&xs4X|;j0 zRm>%ELlT*l+kr){B_iwYnyQtYt*pLF{k3E7Lr>~`t-`5)Otj8P*QMGNUXYM=E3Yt%e`St!U3>a#VeG{cq2 zXZs$lEZ>4Gf zy9VoQ`Ns#Jwb0;JX#E>&0kI}~d`lhwD0j{YJT4Pk3nzcAqroR6|4f_IrWZ3^MtpGY z=z3*)gSD~2EJ@Cw*50r0`@|+3Z%mWEk6RiQkqus)&YM`?nQ`A9GjeU4Jbi%&{NNTy zt2gU-Y5Xm`6M)@i1%&(4N$E~UrzNuN;(bp~d_LiHopq6Pbm{7%VmsDB+DP4vvCYzd&Y^}4%9^UB;?={V^yQ>GB-?yr!d_| zX+`azDPqH8AlI)A#9h{JLKl_9gCX!WwV;lSvf*!xH*F%Lek6CFvDZP%FRjdiS@?nn zuzbTW3n#jct{Wk>^|21d&&~e&ErT(}2?4j+ag~+nfym(RDnIV+(ymI|xh$B&e6GZi zyXoH1xT!hB1Z28I-7KyBL`ZesoY@?`zZCI6E)qn9uHP4)KN&pz`1N-IBR&*u5-?&C z;^R2# zR*V}Q)B_E~`EKjA!D7!^0GO2;Tf=VXU3y}Rdd;^wtcyA_rh4q88r&noN}MC7=R;Ge#7+M-52|u?IDqG^Yl3(+vCUWE^ z1~`T=C`MW$UMs66sooi_Rron33pjTHbxGs(5%CtTYQA@JiODkls>#6ziEl7ohpOsC zkVaRMc&D)n*tmi{RTI21RFYI>z>BImUHoMSHW{uucX&@=v6&>G0hl9z)TdKBPc+Gx zRr^_aQZk~9J&;mCnkHM0;a20FbyOrrB0Qh1Jv`S=+I{ z55y1NvQW`V6!~RWUUE4JWG>DSH@ESAY7xpriM83bf>yw_=`#Mr=ir)3xFOrjLy348 zGGzsY%mV8g5}xu zAtfm6M4&BTB!1bA8XRe?G+LiEHjWi#nK^>Ln2rRdbb+lhjkFqD#*~jOhmX8|F7Qm# zZO&xq5<`|lVi3(Q{}&8XO1U#zxpH{LzhIc$8S}|1r*%30s8vqTGBYk?jDsuHUU^w8 zV{i#nT9c#L`&UAItDI6$Ugco^Y_C$&t$?19IAT?g_7MWztG@s;!~gfoGCM8?3KE1L z!RgM8YM-0Dj3sMFsC&*9droj>2Y*Fc9=?%JDqE9Ajx-TV4Bw zXL(4dTB<2X(NCpgJ98pa6CkttO#GG{L#CM^QoSa!wn%D|L=}%K?5Or^O2C4c%9D>Y z@0=KlR~4Yk(Sk%lI71fG%J>;*_GKB^t)4#BO!QWvq1sJ(k{z9FhIrPT!n2H!y-awk zr$L^LC!Y_pHYVkFZ*1gNMWnXA+86M-E zGUk}CMUeikec6lQBS*J#PE|)vbAd^t3UB4uw3YC9mn}h79I7l6nGx?T>x{cB|8su^&xqGXB$z7A3ffJ~4a%*A}IepIjb=%FI|n zwS}1sh`gwU%{Kiu0eDU?4RdRCB}JO;iY=V~My(Mui6;NTrHwtue~?jzaY2K4O^NC4QfPh8XfhN@{GNr`o(5kqp;F zIg~(pdc;@%n~sx>`6L10rk9ODWkzho;RqjW#J{rdGnW2LD-Z{`jHRDuCSWJj zj=j$3Waty!p>>5OC$EtJG~rkAMRFHw(^jFIrmmYJH#VeBCdp4F=Ra?e0@Rwdn`B|n*o!w++#up?6lh~MO7gy zSxe!L)2-ZTqk)aZz(b#j{>|ITu#%#$n`V2(gdkS>;1SvGrP67$X{d${xCT+&kvzOD zPydC4jQ>Ped|w{Nk&@ked(IBnS*?p_lB;=ZW6Mr+Yv(Bm2 z-RLB04^OoI$(!~g;&axaDQL5G0x#vXgUEIKwA1YU-D1}c+~a5WLDe(V_}|j>1?n~q zRV?aHOLXU3d3gW&$~@SrT^9bS?C%&7kexlysToJ)q=}z7dgG}7rODSO>A%{#xI@Gt z^)GWsJw2_5sd=_f(6FHO{DLeVnJr^X-)BD$G7OyXexWfOZ2m@~auPctDO0aAPWGNM z@H=V|<0Yna1Whof2^Uh#2lbX=tR2%ow8Q++r{#+1I@z@D}Rk0D#hYVN=pD$Jy-9_aWEdDg**G$d2CaToB09B{d*V@DCvqgROEq4mkB48R=GCm z6|(uHC(@4IF5sXGCxwB9vaJxk1iyb=OqUuxxdh9^6oe|;M9Bi$L?LYXj33P9DcH8T z&EJ`UZO!Y)zMO=@gvf+q`X%FOF5{qY3}A2R#)w~;FY@XSuxh6zO*OrpcRVU?DohS$qzx7VJInRFoFS`dWBf zLqF~{7?o+g0*U-X79=nXidCa3P&=jOM#zF0d06pLb&9vAsi?@2P0?z3+Pfw&lv%3g zM;yChZ{=0>>+M7BAn}Qeu{J#+sy%1c17O~0bu~fPkv>J@Y=v+wLg6pFY1-IaW207$ zmJ>U7QOaD2qEW8FkgIWt_(I3yV7&{`vFV}m?1!ptM5q#l`9iI6M(~?P?d*+bNb{q8*1{_dNnXST#jOV4~q_tOv;eGtX+pz>Vj zxx^_(eR!`K*=QDn!@+E+MmsGNGN({0WLMf<7F`hF^%J!(qLpRkW0t!&Loc&>-ipZ4 z9GB{J`RN(?2B=L)_9N;S>agm)HH(h@_eB=IbF^P=-4*Yeb~%j6X};E7%LgSo;CxrK zK&0}zo1m<=TV|fL>Lr7R2Zq+(X8Xd{e~G7mK!x=!QGzy*XL3FT&gg4D*QTAb2}eR& zb=Fn`cD9{=^Vv)BL%wE&kwpr=Tp)SbZDuNkMYn8gKu z2=?-F$OEx?D(e!YuoRbuosorf4{$>RsV+Az_g*+#-D)`K4)I9; z@dwTJ8TJaY^ZST!xc}2d5}zc))4!I@mRiISr#n~pg*rAYQkdODV#?UNt;=~=1@J_~ z`n8T{t*bm0EuWikApS$y*8ge(aBIE;0K{7%-|r^@}TixRBHM`cvf-2F$|X`?kZ+u(_1gEqkzu zd$;vwZHE16YVJR709FsFJmDXJ>u~l3z!nq=zdaA3hp)gdcl;EQ^<{v!h%h zX~6wLkVHFFgnU_Y&lR}(ZLBa;=VATD0_eVK?U#p3MCIDgVYN=l)n&NF*Ue(4?Ctf@ zMS<>KyuyGb52}zV+{zNXm_HQziW(cV*>$kZqg037nDL~ZU6x2+UVrOo++Xht^$LFl zc*wZ_b$-10ROs&FVEK(sWEB-3#|b$lV$|n0IKpyW{Rtk?Y5FiHg5)gPZ{k115(>`o z>qKF@g@>PsgueBsen}7}5$N-~6L+~f{C$-?c8>TadNjp|d@(vw>4IF6N;oSb`pCi4 zG0EdxMN)#r9W^i}@;W#RE#wc2)M6HHqd!RxlA9fBWD&8G#De!39Ml}_V><0Aec`vQ zc_D2_H9_jJns)xYmgDdU-&LY7$GT`Y!hq}f54nTZ{oDG0T?)QcxCFqGR->|5~k`JH@6S6 zCIuS|*wrw{E}4Moa;3zrZsWTc zb@u#Mq)PmfK$BiHg+@1S&(0 z0-@kHVs?_O1ys}exoGs)RRP^h{%XWLHzZ>-HzNQo_B_|;GC4g|D6=UctKKkEH9M1T zCyTNzvvV%9F5c=^G;Uip>k$FLaLf9Y8*z*QJojU@?d0#*%aL{t9zK3 z8eAWo{hJ`j&@6i^G}{?db`_fXXORm<2>v0|>>2=%8O&mLl61|JHqV2vT?7&288LUm z8Ry}*3@;OE6tJ>WAUnF>2hGq?6C$p4;9|zeyXNR~xx!bu#b)vlvV6L$T!z=VM#EBu zK{AG)HPaZiw|6vy?hVkd-zYh0h1Lkf4d&I}M<=5cY!a$8-WT8}=I2%9J1Y{ECusDc z=zZ8R?}HUgfphv$iaK@*7sRxwwi4V?G?SL(am_UAMuA$bsu_36Fh+u|D^((2oK`d4 z-wDb&Ln?sEJikHwUwJy`HBZGAS8A9$1?GdrNrBq8VSs9IE^#7m%K-2T>}5rsw9ZxO zPP|eqsv@zk;*FbPouDxWOs1VlOzcVnGNAO{Q0jN4t~yNShncy9BCV67@?Sbd2uzHI zvFuMk$s0vkDznOrVP-t;8&IvkwVBkISHPXI+=0Hxm62(Zi5ycMYA+!4=*y+wl}^@=M< z1PB^$2?&(4_bm(D4U|4ZthDJ7BM)^d0)n)*f@4^G*hhlTC@aAfAb~)`cs}1jX8lZx zfQ$p)Di$BIfziU4z+YefwsNF>bzaCO`#O2USFCq_Kwdswo=f+4_*p#H4@fJ-JpUqa zt>bnXe24qH>HlSctMLEzH0^=?|BEP%F)9!Vfx(8*$=p{fTe;M#(a0WEfx!Ra(A=_^mX z+LU3hDN&!JwB^@OKT;W#o!nT>=O~>Qv3}sS9g@ic0-i~yd>#2(rN@hMg1w~^)>5smQn^hHycc5`txc!PM6<$Z;usebT+Q_hPJw{jd#BL z@d<>CO|9A0v^fB}Oy5fCYTh2sWYC~4H6`rVf^o$6)U&lZ>l6xvJ$_{qteUD2%KMlg zE>txKH}CC0>4lsu!Q2g=ALb!H)!s)aJaDmf`Kk;ukjYH2idF1>B@&B4krID<_=cO= z>dRbsK#V8Lng$%FAw+3pNl2dkC| zPznlw_P<4GW!B9E;)Kpuyd$Z!ps)g>E*eXG%R3EzhD_BIoqSH{OH*u!EzDOd~5;9xR5=jnI{hL^y=ZLXtA5ghOcVIq$Bs4Nr*>A`Vn zi&>J%30DpVg3Zd^EVVE}NV7;wPzm|QqI^P7T#Iek!h z9I>aXS71;yhd1hGx`#J0zk1cbN9ljqU9aXnetn4fCaR!$P#9q%zB}j(|CGP$;DPOg zS7_eM;pr4BZO+YcK1j$BUytsrWO@DtUm?I3eYj)ze1tk?sX>LI+S9L}Mz)@RbkeaP zcAO{Rgb#!4jb*?vNr-ONgoMgHA37bnR`W2wgKX>6_=7=%8oRF-k4o(}aleyLHyEpe#o8nbtnd8! zaNN}TQT8a&psxv2SLbZ{;JptB|R)$Gs^JKpIl>Fi*@0)<{k7kLvQujGbeh^_tV! z1DgFu6`+&vFOYXR8rr(v2ekDxT@u?;WR}p5Oxm+JcLv(bJC?o%w=)XhN$J!3VM#p5 zL^KiT%OB&Bek4v1mzkIx4h!!K+Wq|)Xc~tqN>&C8rE99E(!^gHkSbAEv5V`2-=gKT49=2}kdIE; zen)=A#HOUB-k3@KuAG{PQahklBy-u&kLjsEK7W9JvW7NU7KZJBADR-25L zsLjIf8q>Hu=U7*oriE)do{DI^RbClPC~?3KG+xVbjjenmQtOpJTHH$s??Xo^^?Hd| z1sWBI?5;IPP5p88tv1VePgD~=EM*O#?(4Y10(~O0`Z?D)-tOcj(rtmvGv7Gey$9iv zwx}%}{3s@@+3pJ**JpkG@~r2e!@Gwb!M&RTD|z9hroK(&E3R!xU0Npixl(BzIdw=l zK(g=Cs>82!gi|Ng`CXW}v2IQ%%;?lVuw{f|c=@&8GXTeMNO}SSh8h+V9tQ``_LGAt zG#k+j#NJNf!?Q~`tiUzi!8@1?$qKYvqe`KYW_plJ6wGao-|wgmh%4gOC>@5rnIa+C zQUCyjAUX7|#t8zlC#g5d6sRvK;_2qaQMxKdJ`&xaeK*?=|kcDruW_;2e(0x9J z;J_b2<>6hNw)z?S9AgBfK83GsF}I>GwN1ECS()JRRT+|B%SJvFg==u+wHse z9kq~UC-XiYMk2ewEisoy&c*mE%J#R>^}DBaq&8Y-$~v@jelO{Cv=X+GmN*#seIGDx zMnJh3O$;VJTdb_bJPy2A{}vv79l^-Iq0;MklHXKnbh}8n(|h3vHmQHSif@3Q)@f}I z5&gV8e@*8q|9xOa#*Ma|qDbBICHF`$$H>}qI~-~u?)Rhx=w5Ti%~Z(tU;5?@)`|*X zLt%+R7ovTE;brMcQ$DslAKk?=v3s;NMwk;wA8|xoliI=$HH-_qx6ApmR!(a7BfK zv7h%%m6SBOrFZMjUUm_M-oCtzWGG%$mhfSNAqNHPO~(~IVLX{DCm$aLFKm_Y@(-dg z3X)Sso8FFZ+EQIUNg50>Z9Z9@x9_*3enp!6!HoDBCLM3>VR3{n3UeW*X0i?)LVthO zdh@H&d2!WaAc z-aVo#<97cEtNwKRc-N!ZkgW{<(%<>HwQEa&Ecl5zdfO$Mu-eLn&q-}q9{JWzJt=Bo zSU%?#m?t8P8mq8R5=C|kLY@arFGyH-N_{hSEqv|$nZ>_pA+)(VrtMbJ*TicTz^e?jk6pMD<+96$pM+Sl1L)rQRzHq7o750Ty#vGPQL_j!lIU{W64HhSB9NG z3iG||6~-?O*_(_0+37_i6o0o6FC7{W-gD&`4i39_LCVe-0(@I-iPp)!-KbzN>+9#HcwDEL zEbg-JNFu62U3_u*v9G;@-VNPHR^=f>-#R#F?b;iR7Zq?G`NUARcRXsG_YFVr;U zJp;2xV6+-WN?K^@(opKR#YC!kaZ+V!EF&4ps;J^c4@Fm{lr9AhRkKDDon2O~`(2~W zP=#Yx`MY4V!a1{5(jd(JXTftiy8MqT@BnZyh##!RHE^a`Ski$(C&9XM*= z_y!~W5Zz?|K$D@&93wAt`Z_U}#b-+uazdJQbdVuwlvNp+1$2Y_ z#DLzjCbnJ^(AH$4(*?~`TmB$bdPufp&okicR^fItpm38`A(N&Wh31Arn`UBpnVz7? zY}u$_2q_tiS_l?m2&2n}wJ2wkt3fB6pxSw0`omb;Zt3G@sCxxX-JOMbo}!S8S%e z#){-JsMa#5PI{}{>1f{1W;sk|*6&tWAXwo(}9(^gO%P8DNaJvAz|uto2Ixa>J33+$l7;H-o0&f&1A(QA#f&KOS4%S6<$`+Q z3I=19EbdmqSVS3y6+2gI3_U=7WR2C>T|Xzj!j$5DflD--6`!1K&p8_Xtsi+ z97LO@Yqc(GDSSDfdC*QM{Hy_W9MA9DV|6Thb%GUqo#X-o{6fuRb<_d%ELrtKV^lP{ zf@A6;xhnMyM}owe66}5aSmk7O`AE*6>(}y$(Fla^^KmG(ov zPMFtjGcBey0B3n2skRE|!9=<+?LRm32ebdEao1c3dwlgK`6T?F%*pG^n@;H}Hrd*r zKqo(qt`}X5cJNR(Jk~d|j-Y{&GKoa)sE4luS>5SUke8XE!pBNPj`eu2OV!fiyhOCSulosIlIu5t5zVRd*TIdw(_1PYp# zam#$Gw#AM->?-Gxz@y#4Sb6p)MRIPq0@VUG|KUwyciKT;Q&QW78<>af#BoMFdz1VV zugcLb+|-zJjLExzFptJ=SOIw-8B3nEJ=tE7!=Bq_aisU53%Xkh83N`N-2}}~I;w;f z{AlPS(RAJ$*{IBQu05<&HXD@#c$xPcA_{_!meA~|m5yrjtP!($#0lM2anIA}t8#Iz@Hv<{$Rhm1vw~c|I)@-e*UjM#YtQj0e%`&ia33 z<$Ny3QHiWGSh-2z`CR{Vyg{2(Lt+(586wG!$g$&X8Yw5QkJZQOI=&eH$u3LQy&dhl zi^3T8=Aw#b8)t2z?gnQAC=2Z|YJR6)AJ`~hk$E+(TjJh4q4c}~j|nyU7T_s;SrJqv z-+3KWr)5$K8$al;@94o+<@$l?v(5Q)G2fbNel^g+UBolY0jsuvQ;sXN+IvqjbT*M- zt#giO|Gj8@Fm&g7E28!4PG|6oc;C}NE_};h)N=(4VihA#yyG+m6;#|eWGr> zIyN5Sju>on5W3&0F8C1f;{)_DV!ibBy!bCmno0ltufvwlZSB>_+g)R9Rs8Er9}lsc zJe^l}ry3#evb#1oxE`-oE#8S<>)U+)aC2-EEv@!#;YZ`0A5_+BB%1Xp&3Dt(|E4zp;0gO>w^amhQ$i!QFzpySqbhXxudfclXBKCAhnL zaCZq7+%>o*q=&uFOx5}CS5xzDs?K-ldb-xV*6+H+c2^xUB;fZ{ya-TCH^#7qkOYT= zrrF3blFKD2(@se)7cQDg+*sCFq^I#j~!Z-ONv1|~!kDjY3Y$I5j zLe0rU-Pf#sp?sJ_Ek4e^dH*nvc7!ac0gP$9PyF!Q&Wz+7|22i8ey@B?Z`Uay=#MGo zvh3LKO+&mHr72>$+xwMtqeFPgfh$2IgLG1oR=nf^<$3#rU@Jz_V!t_c5B%6En4PO_ zh>A+aYeF}(F}>pcfI-t{(f}tpwIRjg?r;0}=Odbs1J@Ah#u*+2hKv#YBsX;3%jo(PuleaHFiUAdTAfqu-(1)4D_Rb=)qiu%B! zIh(sfBNM)W+$fIEwB?8-GDx`072<}m5h(`=a`dHv?r^SZkgd)~QJax~&8iNLlcA@8 zRggQ5tjIiJWJ2ztsaPml_$Eu|R@GU2e4X46#VAVu`#q?>Ra7+iN;$=;DJe$Eb03#e z7tmT@OEf*CrpX^NKwHd73J{R##+FrSqL?GcpUI|6qZCi8+Ik-~s+F3aRUs)=WvqKo znZqKeOPAOg$d%w$vYr%Qf^6BBxl3I7qv^#q6`9=VmcNx~3ai$X8{-pl)>fvMY^(Mvt9Dqt@1*n=k$Sr9R*F&QD%O^*OiLXFjn_B%ZmG*hki8a zugXo&8+S)qHdjiQHnZ|ZVFknKp7XzKDHOR2=^kh@r|D(o(oEL}GU^zG5XZZv*%C=S zhK-}oQyM3R`Yki)O+vrAO`ZUi->=LC$7elL1oc9=`TE&L8Z~7IlGZEnM$4C-e7&aD z!Ed}`*h=wVHnR>!Uzuv@e`rJet6$9{XOc~u59Q3kmWRA%$oZ#y@|rG_f^1#2VqT74mImZ4&BX#}{NRsAN zk9me&nYhMw=P`^1`*OyvE{8?K3TJQ{)1|X{nol(%aB1w-so>MO?Jwz$(h~#s%4|Q7 z<6862qpKz?`x>K9v)Wt8`&_B4ow6?CTz31XS6`1`b~deB7gWBwr?yJkYsq!=d9Ka0 z@YQgCs6t+X-EjxM@a4?`}dEVVtd(AZG1u+?sZm)Dd z=3-ALx)tSg@fmF|GwK*aUT;E^|1{z8$JZW(-~`#FHn~MtYiQLPMhz-%{QSXd!Y6DS z?2uXNZs<{8-v7chRxz9I3RL`cps^#=xrMLEbOJ@5Lygb@-Ji!HjgX0K^k*rv07!7az`gUY757-mK+zS;pQC|W5$@|)vVXMwqqsCq za05Re_@kXDt)#!FP+6o^ef)NR3f=(13}p=7pp;R!ZLQ#k&wQM+xbvWCJ^p0zo_*ih7jJU9dguWK1V6zuBrQju{M5}~6J7`)y_6USdG|I|1BSgQUd%G?QcfNDCo1$)ugiFeq zpCv4bS?TH}gqY2-3u(cU>OeyiFkZ3%qKo`edxUdyOlMKd_+kvLi;(4hEV;U%GDR$m zL~JBpXc;eXP95sSh381eKGrNkSDmj%HewHhq2*aR37WmfRd^pWej9`DUWd#5j^}n? zY{NwYfJj*K%*W{hRkSYz+ri;ega>7#ti?~q8wUo%3L<6p*;dTV5tLzGbH zU}JuPu!wj8#X2Ndy$JTeOq1lS*nF|LYdELnibTaiTp?6&P*kJj;Ko}z``ZZXim>>- zw5|bQqqAryIZHVP{UHY%2+&WbH`=i}tQoL7%AhK~X z0SpTfOu|?O6pSQYtQr-60S)8_ZO8yHY#|eDN*x77TY5?>XUY+?kU0wl<=&W8O_#kY zmR;#w%Ewn*82Ij_Lug^ zjkJnsPVg{jWX(+DUGQV26G-e-(+h%Dwg#wy=deTkG?L8Ge2-srJ*oO&bUFJpC!_Qr zB+@U~B4|;?5gNdTA{FK_k;}8|@K+j7kFdbNox33QuHI`m8_khr zyU}i;^UBad?RPGcB2nLSRyFpBIz&M+5}VjaW!%HSy(RRC*g?W6oiteY?FrdNBe7Ww z08@-b3@i*Y+0tip0#6zq9$Ic2X1s)_8D=0Ze+rxlJLorL+>*&re!E#+gYkGcM3xI* z8xwO7H)J(d|5OQw0+tRoHcI(7sG0od{~f5AV5aXASi$rZSyL~(J=n|dl`ckuqm{L= zU^1o58cfp?w*P)kORtqkm_lPylA~s8Tp%y)pgwGleSo>YY-~}hA&?EbfYdkZ_I)b z`DH5){+Jj5F6sWV<0RZ}6Rt2T`l{=vEgufN36=4$|3XyFH|l)_0N@#~`(Ti(Pk~b; zmSla`+$iPkgn!RjyU$EZfgO{!0yiDl$F3D4ggy)o*7s2*f$zDl`t}{vTzv~gW3;X| z0Qy0&srpHPr~;1kNRVxWFy^pnkbk~<1NfV|#&v-e{|!$LR)&eIpC2?uG9baz?E)uc z^~OAhpR-i3aypS3G-v)zuNjWI>*8^PnE@^5OL?%$g=;|xDvNK#P03T2uO8Wt?Gt9H zCLM)$P;-xqHtUb21R3SpWh_Z}_T8Vg3OkU)j9IMb7JrYe%VR7QX7BFUbbr9l>NdkZ zsH`gQ;7H7NkIuHN+0>`YOm${4*X~gTXIOrwuYVR07#Lq})oCD@$7RQHJokkP0T?s= z3IW9O{j-wHP5ewdug_lx^C(lO4k`#A`@0T!e|IMfA? zXHJad^4&Ajksa>Kr4MIIF~!Ku=x2iXt3>Hl7C`lki884;x12VPA!$#MiUBHcQuI_#m1!G z3ILVe>Nns)VpQ%01&#nnP9dr+rMTKW;7`beT-0o$_(dY+=ZXo19}8(YIR`W#JbBdt z*3@?}GwZKKdHuZl*V}+uS4$3&45hEqcWF;@mW(T7 ziYDTVIqN^Ep#|io-#~X+ljleL%WFbjKkl*z@8fxy+7&T$?30fvsd-_uK7Ve#^ZXTR zb#Q?%7=Alb(56Qvx`;pXqv!pc=#8jfq-1;|$h|oqUh0GrdqNPLH&a|FVRKA5F%OLS zRmdD-GijWqivGnlAM=4)h_G@pftk60GBrz{jYneu`@w;6_*B>esVysfrxf)L{lj<| zc|?T19IrU z^Ax<2o5xU9BoVE7^TO5O?VzUQi_6Z$Un$KT$aLURx%sD)sVC5qI=5recz(QL=3AAMJ^AI-v$By<;pb$ zRh-!f4E~HSJnvbs*PX#Z=IK!N;DOCZai;*y9Q}1m{+f8MGoEEU4aW5$&|c2RHUP z2R`;O$NQiy}D*QcpUN z=W$)cCf_OgqKxhbI2zyuZ}{k2gW z)MtlRb5-62S?4Bx9vRc0sR0bjcCxVkPtCf*RBq6C8p)->-YyzkvLQASo_AOdzd7xC zIY6|s8oaXH{HwtzPr>pMxZgdZ!AoWlU&rsQR z7WwwjOsr7p;V=ozFcsdgk6dzEI>8QFrikrfmhHjTCma^o;c^_|3gzJjo)Nj)5j+Us zkmGO%9Utlpm*A7oXxgw)Sy!Qw2vb=na~)RyjPQ7HfJ;VjCW1%AGq*=NX0DDqR!LY6 z0wg@ilf{=dBpn=4#2fU|94W37_U(kbK$fNM*##d@^~+c^b4JulW0cr()F%qrEGM_g z1gr?kd|`omiBAW9@Bf|DDH3$eu}|z0G&k|k`-wPS0^}eGe$J$M2|mnmQS!9}Ms>+6 z1O~ZaF4AJrC+oPokk|*$IH&$Z#5ob)`*?1-WE9R6_!l0M174X5o?8lDLm6I)HHhr_ za{_@ml=Qv0$bkT9W~z3G?4UZ|Z`w#KX9+Ss`>DoM#)?#akWjA#^X>`PdU9g_oeczR%o>6I*u7EAT_5##?5s<_e3jqlb)5bm0^4eu`^9*vE;H#m9Wc+OkB^}@>iR9A@ z0pfb{8xLkzjHgtc^47?4w|Q~HlcfrQ#i)wYsZ|+PF*1lK=nK}c4$0$I_t@U~TJZZh z8_5}$ODye~Y%8v;grPiTg;`CRK)gYkpB;I4b9qI z3pNJ_C-HHlgRU3Z_#Ry+6azw5KJP69i6bLQ1|u>>R`*_h@(n#P8Uvm!J*=+4EEJPY z69cAv0rEPqf1zM#FBg-nfWDHEK$o3ronem;xHtgCHbFb0Lb8OB=uuP@u}8~VPm>KS z{tlo$p@7zPruhe=O1DI7qWH|LShur8f4#);wZxd9)Re!}+!k#`y>ykVKqRVkj;tVK zpmbivh7_r6BEM8fzHCZGmochrBB8|hzk!qN3E5%#ex z()@&N;1ra+j+E0t7`01CcS~a9)MZ|vs#~^JQG8uN#g^$`gm<+|=+=){SXmj*&tt7x z72_n*a3dg~TGd*Klw-mc97YD-#rzzK_pY-ozphZ~$L;erC)*{Fp&)XZsLr~sVCcuo znaAxC%YYXr_~KNv>Ww(K&Y>G5Oq3*Er$%z1TbnvpbB%=ZE*g6Du6xd^d;NcHEzSO? zSNxA&@do?<eRC7b1MR9ci^GC3hyu`oqEF#K@yj|Z!0WH#v$-^5OIVzFq3Q~$4k~lw9x7Qyn(n<<)Ur8D z)v>HN{HJ)xGUIq04G;({&nRZmY``Bh{@P0yqek2qSdcsYrTjR-IP+mIKlB5=Rvr;T zIH(||*V8(;9KGJUD1`*c+BxY=%BF$DCO|vHAR}>w1K+4%CHXN7r_wn_W?FD3|Tfwj!P_2Kf8; zol*j2#md|ZClLL$)s*gEb)?3Zn_)aF{TnC@XaQgYO?AZ;kd*7oSDih13+E0P_|zaB zl)9;E-G_y+q^Yfi>L8ul$BU-fJ`*yVabET4#sPXYDpTCI`UX;`G^{TOg8k z^}`PW1~gZn(_m469`mpwmy)8MBksHvOLi-)Y0KutI^GZy&l2Ls*ww7>Q*Pf1maOgL zn%Bm|+UD1;pBSIP48PrB-FXbLcf8f79uCu4$m$_AG>(67rjuy0J=O}MXX=Ve9I&ro z%FC1;pgi+X-t6ihH@ywe!~v8-$W`KI80w;n^s_ z{L(Mi+s1TyKgUqguHO`~efQ+5%F=P4kiE_Oip6X2224FA;s4ET8T;qWfFUj!(JWv~ zXuZs79HJatz9UxWULCRxL0ir1iTo9GX=b06=d>cJjQ__er->KLX2vG&_mpN?ZcNsgnEfPKu#~}^yf7Y zv5AJ~d<`6F@3MypPb<|adhh>_#U@ z*4-h=C$xz46If0TXCWE0p7Q>dVq)pWDbeoB0ii_X*k{AWq#AQ7Dv6G9c=y}X#wl}V zu?_|O5Adl{8WxCT_>;R>iy2LlrOXlP3OAe1DYc=NEG2wO>I3K*pRgA=-63PK zO)wG=&uBQ(X$wzll3KCJ`c0eCHJJ`Dp%qXW`JxyBym0~xUX{w2+@h5ow=_0egj&RybhjH%3b-v&WHwnW!#&gk&GPG;xbC7 z-#xm1{4AQJi%Wf>bC`wm#wLm%d0`Tj-j3)_0VtW(&`j@C+)T&!%*EGQ%+vxLlwKRYbU+tnD{1kqSg}QNOR3eMkYcBYqCEvrK;}WIU_XyXG zM0w?O+{sALfLc=Rch#8n`$xk|tBL7m)(V_TLx%6Ql(pMF>!iR~uW~AbC>3kt6+`D> zZF-L~3qlv;ykH=w&%;wqCe-Ge;N z?vO%T+FxzkKs<-dYE@S%QMq|g~`v!J^-A|KMSYMm#y$`O96p_@P+8I@FhgW=ElPAPoda!KvAVzWY zyd(H&Kfu+dq}PZVlHDCi_0Yv!Z;3F7RZsTH)I3=w^QxaZyGvbPgk*8*e6uucN4`F) zE&Qbxd(Cu|88E;GDZBmxtG%*gP!Ltao#wP6$F=}Az<=1}j z7>AjxwuJkqmcNbu@z+Qdw|jF;vD{bH7st1sj4j)#<_=q4PKYyHAr!tRwb<9(3X0{0 zA1XUJiI-Nna}KMTUa!IMOsq)Vpr<{pMwu zn{-ua{zyr}bc@4&{+!7{yI)+8=j>%X1sAKLx;-bKc69Xgyr=#@!-MH2?AuO&RPY0LIz`@r^A=DJ1mMb9)o*@!r9vovqQI>(Ev^kstD#!@S$ShP^srod-X7! z(J*S-5CvWzVjUmp=U}Vy5MA0Zn~YEqaM($-2Auw}(C=VmiA%F+u!MweD42IB+GAg$xjnkm zI%Zf$q&7o@iV1YL3YEKM{GIraV1xq7#_n9w=H=N=? zmKeZ(xF~c_fja<}x=zM3bd5e}GOM_YbM22s9}=1?iWhU`0pQ1*a>nQIN<6Jb)p|-| z)r(MxiU%!3QYQ;wfV|7hVx85whe8rnDaG7xqD4>09@P?~X&H+b#RhKq;awBwI0PwN z;-Jd~gD|;C5~y2L~itYjKAIVdAUGq4LM-kcv8nn5ijS)PMapeRkMi0R!Y6_zZz z+Qx3~1+?_yQ5|H^jF4(a;Q1QK;poMM#1|-|AJ=Qrrgg!*iXc*XZ|C}5@||j+RQ>U$BxaOnZU;iyB`@<7>C%LX>re(nMsG)l$yE7 zM$(ZnXquF?$I!u^Zt;@c$H(xt4{XI?=(C|~ab_6CC-7;Eo9M{Nd!buAWq9u%hhB2# z5a}=h3_rc_W7l$4=omWH7#|S0o$tQkEM6fq66YAY7Tw(((lE z4YN`}V+pxj*=L)w5;Pv?8w|@RrgC0)Z`ya}n#Bsq*F?GwU{TZ=q8X6UN3GbM zEkmxLBGnct^0lH1t+G&8{C|swDmyEy*DGsZE9(iW-uJi7x>c>-Rqa_-ot;(P>s7t4 zRqp|IfWP|vly$_rdMvAYqO*Exy?TZo;s3wm&i;YHq2ZCyvGIw?sp*;7x%q{~rR5(h zt842UKR36wcXs#o4-SuxPfpLyFD|csUEkc^-9J1&J-@vE{`2-10)R#$lC9704?)1B z*B`4d_)nj$lP=(Y*QBD*LC~L|$od=uMZ=PtKA_-z0u)QZKxwQu12BhzprQ1&@W@=D zf(z^6rmza`_v8UkvW6#!qKAtp^4TA#(3UMV%yk)Rt1~f=6;c4^e__0VVn3>|;Hs&R z0{hf7oGn2PFYVl~?69*fbEyGzY@h_!=#~i(Z;yBdL4R59ILha4{BeZdU4Y zK!*zYSUqgC*~H)H{%CYU1j0FtTz5ZPshhli^n@{4Pk{n!nC6P#gvWkcn5;;uqAtJR%XS>0JI-5-xlR6!L}c;8&IEhK^dK zU`W+>cAvA#=0?wg=Kh)2pt{uo`is^{_vo|Fm4l^HZ-f9ru}1fMSMW(8OR?}pg9{~XrS>{7an zmt=9CFQ7lA0sB=XzNF9R^k}&aXxoWi{Q!2Q_sijWe0f|W;vnOidKZUXuNMnny7&5d z)ja(Cs;R#V0O+QS?>eD3**|F(GG`u!&{IjhyP$F8srvrum3v>ZUS3~iXm;XXt}0?o(A|HCOx z1&abdAft;Om5rIHdfaLUbNo)FF)TTz*qaPA-hO|RoOxk>!0DAo9PXHOtY;2~dyUWO z44_LFq@rQt!%~}3ODn>%a1mY`Rasz9{|-aVoLw}*)_R*b(EN=hVvR_Tn!|fiqm;&r zZqQo%E^T4xh>Jpdij<@YrvAM#b>o{cPLj?!raT6egOu#KXS04)m+*I;4mx(YM=vC7lQH7k16 zWr)X!)rVkw_L-P>H;6UJ*fmwnM$#~P8SIpTByD8r_{DJK|PL64H2&;2w3rCfowgO$2JOjl}4ClOtGeAd>W9$VkS zYCM7zmT#4xIuyF9E}`1ypvp@CW&Bqb35aufhR!Tv%ZNUy*+wJ$=>6NUEZ#;~Yo}*V z-8m&^s=k~n$VIEQH4ltk;*@%js7G%AE5Mgc%ZTJy$8|x|#MHio^BkjnpbNGk0{+YX zZ*i``FR1h}+*8xAA4L<{(f8+4Fq$`B9-w(NS36Ol^=_89Iw1zyrkB{{^aA+bHy&yY z#iPxU8EU3OOPau>PkO7bpjjyFTtH{1SzO|eUbkLth-ZQ%&I+K@yd2nI5H)08`ZvA$ zj}W%&yuQUfn6vfi*Cc(&-db{@co<#v1Lru`{wn2(6Go+A&1|!bMPe0M#>U1wG%nfmg z4i+fdM_W+u1l!IjZvFXs=K0ODe`i@xKQa|T7UE0mr7nq+X#;rag zW?gD-m)Z~O2!`PB_GG=!8NN9>Luzo`+U$=$Z*!MgF>!1jJtmnyUKg#|>D_91S3=^v zHi)E53+uhJ;1#(SlK(nTV2%t~K=@X+B#RUK==L?>b@rAqp7MUbx>LdntoFp*COSWB z0A;J)skWRnoQ7|`wYp|ueeH%n3;Nf#)N}=H9mjXA?I18V+wQ*8vP>#M z6>(1;V%E-P3=a47^x4A=B_9p<-w&y~k8rV44)P2&1oQdnM98;C5Z!@2Xd_g>;9Y5O z*h#o?c;wO3=U8x1T6RI+0o%<1@LB5jK;~(eV=ql9-o}h%l27a26NTppr}#yhVtge&3$L#NqG9 z-;aq?HBY@%W;Zp8^gg$5ZSk;Km!S4Wa6A1^AdwZ0XBdk z-o!pUiX~cEoC@i`MTs-37J_4Om~&#By8@G7ep+>kv39Oqv-n|5lJ33aDcX207^QJF ziUHn`U=Be65Z5Mj%8e&P@C89evV*jKETno!czJ=|!Wlz}j$?Np-w4r_+gVJVk1ur) z!^$ff1jX@I&gY((f+xlQRu*po;wL@jc5?xy-zD42iNHIi-Ve#kev+gy&PZ=aBwOPz zkx0~}U?UXeS_gA&vZe82r-72wRn#f0CArPYxjp14TC@`j)-t{fi3HkY0v1`^?~?A# zr5|K@XW1EPin8imKA~2ycYCt`x#b#{<*38raA{&qIVJp<9D}Qt6QM5Z94Sf~lF32G z*oDZBZ~Q3>pOtwr8^tV}?-SePJ|_=FMinQgWF#})HMtWe)1I2nWf8EpF>k++iKLI| z8lRwRL7)xl+x9I4xU2SU?3VGR;@g}YJ&o!&6>%m~GB!BdZs_`P--R^pNzRsB(WK z(nK~)RyInJJ&evpd|Ud8vTNe+iJ8OQf*KEDk>=4xM@z=ihqDS7fCt0;;owXP1wO6nIIPQFo`u~pJn+5fKpa2RU z8X6vEa55Vnz8?V^VQMK28i)xqv50}t57+_#*H`zT_J1y)dCeSR!mrLR0^xUNVBi;L z#%Ip|x(_EDCMTc(ge{&?oEcU>iZ-}H$Vc#3K8gu>;&#LeAmr!6*keE>8u4X55%il9 ztGZ9MH54_*vq(*FQtYh5M8ja(R>2$h@q`Nsi08<0PW9)q90nyzCwyx%eImfgC9tFb zdO#t-OujOmYu1jVq2bB5ToA=uF8;tT|1Wwk(xUXgkwgEW_hwY<^UWjto8J459J>3! z>q}!Yl$CP1(=EuyK|Bdz^~r1Eb3LAS68()COQ3wZT&CCM)f3lp!Ch%L+S?P}%D>UQ z{9Fqs$eZ=^y9c2NM~?2zp+y3w_6LKQ2D33mZ4n88kNfJztS3ZEshZ9AU@+wLuK}^o z#o0KKg3+|k)bn{rtxxaeMb(lFW8_323z|TZ!?U< zko5&%_Nth`eMVeO4m6#1oI4Z3Ar!snmiMddX|Y7N`n;cEOh)@fz#^_QCKtnV2KcR9_Fg(|fN6(PS8Jh7c+0 z>yQay=N$T_awR^XfOf|k^r65lY=~yDg1S+R`g%c94vh?VQ(K!Z&T`!g)pt|e0STH@ z0`Pvb!+3vu4d%onV4zzI%$S;f5aV5PEzA3;G%lHS zouYu&3j_O9SdB_q&t}Z(EqetY62Dlgr$bPGw!((;l_qj^{-q!`H0? zg6qnE0e;E;To2(obYCO?>3y73@o+3ie>q?lnChXScsuiRn45V>_bA(c{7JKAaQRD; zRCq5J$3O76xb4^96BJpCu7_h}=I^jLHku+kYj*E7vBzB=FpyAIWPy0C`MBOPO^jyAL`7lQU7uSVw%o1|gFAz<@gsIQ(%wgz=JuwlXIMow6J$kLaDA19`0K2Gble^rFfL$p-jsAPeg)`qB-zz?0x?uDl*H^56z?| z-Dv?%DdD8JS9?K2GH*!HZ-!?uvq6_$cXn+yHzW8JBCmsVl4=tQmg1LF+;eIG(@s)Q zO@hlTY}t7387w$JeA60xr_pWAB^2AcQ}kNuS%gv491jwGrdfB%wVeHatRQK*UWx=x z*JA+?-E3T6Q|N=a71em;^p|&#FH8pw!X4cl>W{^|d&*<#>9ujPQuP$9YeWWnig^&6 z9i*^z-h$3deO|+P=^NQ0t@Oj9s?HT!5fLhhL?k}pt=En)6;qKcO=ot7ty5|BP=yQy zl3Ku-YZ1ECsgw=Dd@4>;$r%d0suiV1$=&E(YyoeyyH~)H;hxIo-8&E$QCW zT9+_WC3t~A(#oY;PgDluS^Cu$t=779)M_PkfuaEd?gm-GYSW0QwGr=!2H}`5wW84y z^WkaDSr&|DLS3>et!XWs`WL!Nb{b2MDlO!Jr)OJ((sCd)=hhO!#JGZn+785ydWh1` zYG-h+g!oEb;JNa})}m4$Rr=R`>;6#q&*UL>X`kQm-7`Q;UiVu_B4-)11e zhTTPEhEdes>Dt7SEpuV~`zP)Qg<-Kbtg#vNMMjUnRfGSzrIAz*&j5{b4#Y{quESolADKmX3e7&5R%1iR-wJUcLfi1&KtnAX?U)5|pJW>@iD}8aC$qf9*+Ovcm zks}@nEBysB!97y%QuB+_D_}Bu zvABHj(``V4qeE%g(CC<8319OxTyr^Wfb7n_Y}HXlq-!SUkjxupoLDBNkQ}K=q(qWe za>5)2Y1PHd#&U^G)@(Lc>7foW zTl4H^ECmAR3{lr~)B~U=r<9bJkZm*8a%L#^5|-wYSUhDq9953`fy}`oao;Iu%#fJ7IhZ5hnsYpe{;MMMce2Q` zOP&z6$Ob-D!nn{|2=FidXTYlnS!h1q4oU@I)VF(u`4^xACYOJ5a_T<+Q+|F22X9ox zr+TxLE{;OGAq@6Pz7!5l>2WTVLB0>KpV3|m>jn!O_Y3I>aG)v$h;)UxJ4G@FdHLi; zkrRwjO9ZFJ+35fn)LGnuW%o%A zyAlVaGP5&5J_ID{^<^$5mq*L3C6{4-$qTl%KD)jjY0D?DW+bC~wzT3T&wB6Lrm^^rUR~h^n+( zeOT6P)VopjEuz$qw)l4HjL4J?Sm(&=%UE{BpHSz~xPs6yHyYk1D4%WdGY3$6M;Q9& zEPh8dRtJ9c+izqmD2a4NGXQ?&%trRPZIX1V7ynP>(EkIyR}cPw3f}+N4L20Yn88Ed zSHfgFMQuQGseDd42Py>{=nrV3eEF1t2|RZ4qO5@c0PvG49H1|mIyimKngl`D*+TXk zUqqpP6b3LjA3mJiO-oaJ3>u&X=Xly&7TQ2(@bxh3_E^4=-0M|?klTKvW$L6?>4npL zvCHwMv1J^yS^>yr5H3jnseY$h)9M3nWg4|cGfb3tjqM#9dsZ4@Tk22H?GmCGzK<}q z)O`D&Bh z_RJ8g$+nQRH2c1JQ&LqNBq=h}ZA22nuzvDV(gGbOv%6gz zTWaW@S|l~DweQ1nlg}N#yJb6;GH_PGlv&mTykziy=<44$w+H_&cr%Z4kwhzkQrI&Q zkJEL;xyr+>NG6K2qHI+xi{j`jEVYQ*A=^$!GyzEy=JYwCU+a%5 zt!H2=wL$%_hl+`+}6yd!4hp=Q_J*&)KuT_#5Vzxt;s_`FcQu zV6D1Gc-uz13R&Or4+h)UJK9#Ice^fxQugrWaTp?DuY=)%M#+i=+4T zv2iOb_$%r;>+fVgRe}wuaSv98D3Ya*hK$_(kA}SIrD0u{gAb~^8J>=N4e%nz>+$$C zavEwmaKF>v%G@5j4_^+h|DuttdvyKL>E1-ZWU3>=9;82$s6 zv-Qo6^E(q^KV+GKhZ+s-{*$;X*(^ZHQ^g|}gRp}qEITZ;ViaZua27c`Vzn~ad$lR> zT@`ymd?^*`&msbBsyU!1n*Bs=2T>v)QTWz#{S;RpqSfT=DFU2TI95fXA1xM=B|EF~ z@zuwguG5j%`>Wl(mYIsT#Cvi-oEF@p2#zyzETa9?I>;+Dm1uRzeE*ZCdK7tG5+Txo zZiZ-xI}iLcu!)`dkCdiTS89qUhZ4az$E@xEBL6TGBf|(_+I6)D)XyjFaStASizzQc zD{BO;!``k>;{|OEq|&8fqei@_;omGS))VW*`8*oa&bkz}qLDfu%jxjeBPBVsc zoT8frU2+Q;S52}@eauH}rU@)DEsD)>J~ZH@_IYn-^@HzoNf|8gjMED44S^zbT(jl} zIRS*64aFe-`@?S-0M7x$1tS9bmSY$lwVZ`rE(p45!ura%02jYPj&VKT2;!32EnOjY z-%9VA7jc~*qx4Ljj<|k+r72e{kho7Qi^I!`7x~!8P$qQ5(04VpP@UIBDE)_#*f)d^ z;IH%LX(WZ*chQim`DePV|jaR(&hs)iJHoPHZ#FX;L$`^4u|hJ1zS3A!E<>R*SKsgQ*tAbjLAR_M;YC zi%IKso1jziwsy@qA%ZqhNL!m>Dzj@6%?8`RNIjt&k)o+u`ji7jFWPiGoe{$dma99( zo1fe)|32+^^LRtAjK=qCjTUzgipP8nH~QR;`L$*7nbY>-t9j06aZ2Nj!1q~VQk}b0 zKMCGtPp`YbYPqa&gCL(TXiH#fs5458PJ$ff7JM57LU_z(tZ1v;e)mLQVDe)4O~@a+ zbhAi&H>d(m>26{y#;ooQpQoyA7uwAOwvr{r4R?AJSqVoXHt2yS6tcr&0%U9-+}{Hgbop z69b)%`52S*Cgt;<1gg7oHEcO=ESje;JDT6r1ejlRQAxF_Z`O2^ekFT(io9ms30<}3 zWR@nGadv<6xLo%q5@C|N^V-8%EPHiM)}-NR!Z${+0PZE;BI2FORf+k+uAk|&_}Sm`Cv~FbBw0Tkg_;k_L%r)88Mi*>w|#Qy#;G-yyJ&0!6g$YrGC>0Kj@c4tVyPa!|qu~{VC^0HcI*8h9w~RX^5mEDZ`q`198^q zEsDWz#jg)-PghAfo4$l00Z~%$7$P)mcZbj7BV-_SVFec);Ne13ur)dJ@SqkfJUAjgEB z3h)6}JXwasm9oqv6<{UtotIT$G{dT;=oiMQdN@~pD#WQxLQoX@!cgW8lwyCr%{M)l zL;B-$ZGeb%l$cD5=Zce>(_OMS-woqNych*}DD2>gqp09aF3Wu5I))MkxpLESf_ZG{ohLjUJbdCh~479Bm(pMmqdVMaxeao$l0&i9TQ@)eu z{`i{k$Pj-ejF5PXi2z7u#{wtgqDF?$i=EmWkfj_m9xcB9r!zDJvMUTB4p(IpCp0}O9SVEHq$Nd z#sCU!nc|$o;vDSCGLwXOx&AE?y$L8FmG{Hv4FJ*0tf$fRFJ1VuBHTqbD(yz!ap_s~ zo|jhB=Q!`Azbp-e{f9)DR-Qj=mzZ~r19MinUF*?xZ0{mk)wQ>qv`-ee(5yZZ+hucX z7%BqUboxESngh-Zc3v+k%xG5z^N&R0OVU!cR#@`-PZsxqKdkB~TfY(5C}B_Hp6|93 zawITW{*uTM>7o+zhYwKhuD?Vahgj_lGA6fy15suxE5rXtWVnP_4yXHS@PR-NgO%C= zmNoO0;P6@P?#odptxNB*63?ApKdRl1dQ%!6c^@}sk6pW&4WZ7L)26cHKKR|EyRYiP zjO4vuo0muJ4jN4d9b>JZ$onqh#Av}=E)oUzT+QbHB8wCnJFJ#j)&!fDnL=Oq=c~@X z@EZ;gp7^s87F6xGN;{eRYo1;I#oOzzSsw0wn^N{dujb!}=*iSYmp@XR%S*nwTdd7w zl-Vqa-xJw7+e7_Y*e%PY-`_mHYX91|hWEO4KqC?IL!|0Tyr-Q~|NL-{#-roc)S~U{ zJtk5q*jLTZzvWM1iEmm?SJ>6V&V1wdUvHBX=wF@xz$G{veznx?Y5T3bs})5`Ljl z*nj#=iJB`Rg8MZKVQG;Pz(^#5?UJ6L?jaOiv{OAllT6@^Jqm<2at=D3ImrR zpY+E<^0ml!)Mh=gW+o1#(R0dz*XLyM!W|BGhUVV!1lGja|5~L)^Qek2)x$Yk?I^{E z2RYkP8456yhpaA!hZccJCz1JXP z=Z2F~4L%pJmQ3Q$>h%$hk$1jN!)BQNe#*x^_`&f^)iE4VG@@RFNz+1bwE3@Uf*V|s ze~u=3&=F&*wItBgY7X!>XK5v6FFs??ax#IpwrbXZ;zJih@#9ktSFIVvkNl;ka0e}C zy|T;+9mMOKQ5z4qOM1T*c^ypw4E+w0JE$`bejhM&Fk)o0Zt_g5C0764miOy&dv2v2 zBCaCM@j~2SZcz=EA-}wt>w?BKS{_a-gK|wIvTdD5LEc0!c0?789e<)+RW^n!LZ(bM zjSDT!L-EgdIQ%O&afny)gZjiW#RBI3*ti<#NnlW^HvwnT8)PB8 zir6Zgx!+5oQVd2a%=w%&PAyP zG_So|PE154;AA!$SURn=LF}SSa<1DbGr+I&liT5;>xW;OrWwiUC`oDtvufY5EK{~P zr3+CVZMXzVNo@nn&To25-Yn*0`d!VBO{|LPcfMo#hRxEpc&+(R{=Xl^|R%FbdN?;5M*ex)X{rU;L}R{8e*RNje6w(^w4~hZJe&`^avH!RgqT^`TMsmjwCOKAqlS`nDp_d zU87OsNA;#7>Qb2eVKURo+TpCgD-V^@{sj|0vd9^QGI9AoqIk&*T)yY)OmP{ttk zjnCu4xad;h!Sb8mA8oZo;fZU-DHet#H4yQe?Rjh37&qY71-YJ^JaDQP8)h3HGVHk`_Fc*+IPEc*1ZN^NfRg zY~$e{r-^6RJjbM}=kY#nXYXCQeDe2+^W^T)e8`{pRbZaGt=E#?C_aARt!ulZ+)_O8 zllGPGW5!*}XzGapybh!A8viWqSFHxE$dkZ}AJ*?V z>tC!;d+_y2ejN-9K&^w+D&-J=(1E8+48m@wZy(#(HC$G*=!@5so*N0j0CycHww5^FMMtlZc7@*f^=+u--Kx!v2UVpqQ~g_vcJeKny&mD3aGZLc3Lt zPbIRL#(8t6`lDioFUGqfPz&pB{1Hdf|DK?uin7P zeH8nrh^^Z>wxln?b(OaZlF&rN@t}yx7Z@|Cq7N?uB(NpA9wpKpP)4#PIoDS}0e zAfHaTWag68ApA@42=FSqacVs8D$D5{+xsJc#B_2Ym=kA&9f)TCB^47kB;^etJN*VcvQKRo4#OG< zl8`e)&e+xf$en(McOsO;VN7dExIMiOYCbalTOzZDXYfO;~5!mgk!LFg71^u7|h*$&+mhHflCx22}$ouLcp zvWlRo{2-Kq5-mq+Rz)m_!c^946%zRe)e0JrJ>=v}b zI}le{K+Z5a=jLkh(T7mMwHy$gpvt$fsgWEs*#j9RiaBX28Ox+WWwBNJ=+9?Fx#SNL zrdWDYvp}<~%Be3Ejre3z^JG}LQpR3B#y zej-37+T>eOVQYRo4mbvoCSy#iUY{!%UbucJf9@cV^+aBUgR0@UfGmsXK^t7*TmIm* z1T7yG{er}HV=k6PGIBLZ*rF)uWsz`9+%yfWwzoUoA5IKgfi^__zt9VztCl?D$|-Ez+4uT>z*P@yyYPU#W6CZoUIi}=M^dR7=#Qa z%?gtdh(Tpxvf42JL)5c+@Lygq+TA{R^M4LTMG8gDY#zXWf^jQHTJhgtqA9{p~UK?y5B5Ucr zIh*k!%vVt6Tg}Q-QSxEO9N&$ZMm*mPeC>jbCyuK63c9lBzJI`|@b|Tj6HYPhe+Q$l zNBj*KCI7F%$k9D~`3UuzW?Rsrl)kO|`h!-@=df$X%fHW9U|{Th1^_@5;Xag!4!OHxVd7P= zbC^Fr3(jiDHpp&0^#+U_h?_M9B^*FV%X*rL1f4M<=~H#4bQ?&3LlTVvk5i`OjT&R_ z8(46lo#N<fu|4%Bm1Tt~T?K{*Hw99o?UjI(&{2ppK=DiBW{2EwwE z6tYU<2}xr&h?>wDn9{Jla;1!d2Foo1EmNy)1mr~)y;+s-d?mrN!BHohVx|JcypEGB z?)=B#tb&?YzVDlL@048yYU;SE)~~DSK5n}qTC)hA5<&Fr(ko}^vDG1JuiDpJXm~hl z5wcj{7fZn!UrXTJo!tozFoqvQBh42>#`911Z*jC=O;A95%^lZI&D$-{_EcFd^ z@A;xY-?7&CPb{^54@;lAGJ0+Bfl4gb@PlW>wVkJB<5gYGC)P(rIR4{@`XacBM?Gva zvd8*#Pqq8}s9wu7ntmsi6HTMJ^f|$6-2+Mizc02&t~0E*!`Yoedl!Rwfa}=4-b!tfbBf%iNg)?P?nW< z_Jq18Sk1)=|2^9!A)$SVv#){&zmwcMy4t#RI}T=m%$Iw4qWb~|^+7Bwx(O|6fRlvh z@Bc1_26ua(&Ocv99S$M$gL_w*nO>cRaw>GWaM|3uKKZkj-+7*JeDCUHOEm9#V-|Hu z{WA1?hxxCT-9tPkgD}wLGA^gZeOxV0STV!OxY%%gx8?x+=gta{RZ2VHQ+Bj6)9=63S#wF<+y&77-iyEM9rTvAmW}1msl&LoyQ*po24dt$eA;I^H&hA zbW8F|C~mDC9-uh^$04WJTqw+0n+!q8hpfZ_26&W^!&IGM>1j(i1&^v8kBx>*;?7;n zkhc4gKsuh?D4!2ZHg`Q9t`o-*>oCk~IjzZ!Nz;+QmS~v8rZbY<5lsK3h2DLUQuu`x zcdY_l)kDFh?dkYn(x@=MLKE%bMq!^MMqNO3FWIcHB$W#{&FnJ*g`8j4fzJ;F6*`-f z81(2EU?7u=tW4v+jiSEb> zTa5uy2-Db`xw#huCWl#|=`_FD)7AN=Qv4~4a`Cp6wOtiJI7S+tIZv&fDG)dv1cv_A z6{3RAOkiDx5M=6oeXo&^(s0x40=Y7Cmq5%)PE+{^hs&s)a(O0=BH*>mcgD3=p`4p_ z4bAUAOxm|Ur1GUDI69*Ju)m9Lt^5Io{8Y@hl+gPnvKVOul>vshmWEss|l>M!EwIZT@?7uRE- z$69~k@H|GfUPshar?neaoitSwQY$IXm(Yb-K817zaXt-kotcLGZU%)zwMut1b?D!| zO&1qTcihoA>XGacF|~B}TeN;{X(ak2_vcI8#V_l=WmOK+b6y}DJHVPCPtSn6EU0lM zY!3nr4cM-bnSUQklhHYIN5qCX`{O=9s+Lq?-z4$vmx~bNx(4xt6rZ@|?s-%FzfLaP zBb6NItCIO@BV|1ad~~P>zsqBS(~_sMR|APhGHr|#wZzAHhWpkHti*Sd=RewW2%>wB zmbgo%cPyzFy&EXp52BYa+Ssq!xuqq>+MYR&m-YNTUh{ge$&QXyRBk;~66E!o;m=Dc zlOA9HnS8DCd)JchiCz0K|C3#+b|XFnX{u zZtzv|#SEQ8kl76F)uX0TTjN?!sWCL>R*gfZaq1F`MtDqNR#j;L#QOiL~q?3bYs=6@`|XR%rJ zwm8ZAIr1omqwIoc5Z3-Obbp+L#Yn?BC=)e3jo3kiXS8Y>qQ6^W}0`?eWv;@TKEU zVDPdfv-526)GtD6x%xSCg&L(Vhi$VRx{5>>a;*Ei^+!4Q%pPaU+2BOSea2si7SYWq zA;+og5Z97Sfz`t5)4=ZhB+3_+>AvqEfFTtA5c!ClDcUV zXXk=ZMu~d(tZn{W!>x&fJW=9(?8EQe@K%%g5Gk>^7_^x601U z!bWPTdv`>b)F}1Sx@ZInmr>d<2L<>nZFa&Xhpo%HLJSqjka-BA=q_t%DuXGi_ zXo60+p<`5?`X^m|R-yv;KJe1SD+JK1rV>1WBNG)fOko}>Ad)Lb<7XnKP)`ugYKHcT zQq2^BSUpJh6@G{dX`~B57zPyXf*%bfO@tD}qCxSN_{qGa>AVD~u^=QAKNCcn3nD-V zfU>3W^M8<({=hGE0TuJ&myeLtjNoG|K~;44Z!jdy82oxDs1bzU5=+ti>Z^1SNStg3hVS(LKm%P|U4H=OnV^>e%Jh_2hQM<|Y*6220bzKzZ>j zd0H#EwFPAf<(vU_zvAdblxX!->v7esdX{=HLT{$Qe3pnfx6bvZ|v4m*JfI%(m)JO_<}oVw-)sAb`>hiyd{CL`czpXT{#r(6fx>k##R;zr)(`hP>T9+MTzFHsOS1P}Q zVdt+?1~EmRmu>Y5yI9eBS{MAZr*X3ecx1D?WtG^=lx?BPyj;a-`CAu&>2*p>)MV5i z45G@@t$+*SUKcXa#e3ipGNg4eDjS>Cj?G!b=3QV57}|HT3#c3?3d485JE98yBCD zn3SB7ia@5NXJn$#S=l+cdHDr}Ma3nhW#tu^%Bt#`+BbFe4UJ9BZ(CZiZS5VMUEMwZ zkKYLX&lA%B^~3Gk4u9L>Z#(>LhrjLcw;ler!{2uJ+YW!*;cq+qZHK?@@V6cQ|8s|z F{cm#Gz3>14 literal 0 HcmV?d00001 diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/quicksort_diagram.png b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/quicksort_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..9f6badea2d186c99929200397385f2634f015d12 GIT binary patch literal 47651 zcmdqIcUV)~y0@Lsi}a>+LvJEVuPPv*G^vqZMIiJZdXXw1MJzN?iu6RKw;*5y1QaQu zHz7i3g49sniLSNJTKnvMzWtql-s^g&UU-?1Hpdt<&;8uLk)W@uK}Eqz0Rn-jv^3QW zKp+Ar2t17H!rO296G~77i!Z-4v zhaZPhV$4ECnEJt%>hCqXGr8W-QuYkwZgAz}{i`_c`8x$v;ai>jX9m#roT;w&)*Gr_ zcR8O9Sg0to#Q#5XFp6n5fzzMPp$>$G%xTV%_hv`17*($rw=fx2yYhKjQ|u%f@e)Io z&|N5+LHC$=ql%_TA!nHzg$6%wHGv_(F{NWXPW8x$cWn67>xG1<2eG?JOPT48iFS*# zju3J5yXPa5y^yd^yru~3B%BB;`_Ur}^!c`0Bo#XY@)YLk!5<}0PDNhKMZc##b zHS(0e1jH606DbqX21*5)5)dkl1o4d7#`jOU|HQ;zjZ}ynM)}*QY|6YKXUn^=h`bar zV{n8I`C{J^8bOWQyoP!~9HNk2(q!G@6v5hW2*4l@fC=U05GC~=|G zn8?uLQNlgYg57KJN}RbSNHNWDgOuU5X(4)$H^6HceEPM2dxOjaOK?i9O&FGbt%)LN zxI^v`l;l9?)^kl#DML#TNNsbn~M{qJily_ zd*^`;S$-O}Vd4EmNkkVWgvWZLZc>|2`H?@58l0XOny&Y=9L|w7|bv!Kp7%2lr@xA9nZ$xB8}M5Z|e%PNzI5}bTdZAlA7tx~51 zO&MD9bd#8pMx1uRS8HQaQ%Q8m^79GU6D(&Q#x(|GC&M{#TJVxMpE_(4)breD3Q=%a zGO>XGn1vuZf)X*XuXfZtqnSQh_vlsRDO*+mIPQZ*e!OO?w**HuNn)$bINON=!TtlE zDy;nLQS3@dZ;p@OkPk4@(Yf~2ATBY_$@}BfPPupOS{`xS7$57G$i1W8k`z&c!bWy% zD{|Sin2_f9EaJv+uojRtxHToTmGwRPo^18nDy^-=P9Bc^D?!dcYyDHk2tw%b?+Iit;Fh)C8mJ-jd2F%2 zrRv>&C(wK<)i_Gcl8=hLw`boGQ@JdyQHa%#;IsS^wG*RuD4>rOa$pc^P1LCsf2?3M z_+{FCefzO|=N5ZcXnVg;Pf6!cRy{FvfCm$7^|>Ee4Qe~rONGMQ!A#Ss3EioB-$pta zz>+jmUx98n&eOuYFJovw#uBYGcM6H4Vv)CYDhxR%+mWg{-WhR?y<_)ECIxCtGVgJJ z78h-ctt4|x#YfwQh>G2shE)U{3}EI-=(HXYh%Q&K&IUVRH$&JkY(BZe7>951sdLv6 zGK|BMMgl!4w(G;z5K@k!z_N1dIB9QKjb#uxpPX5}Jj-o9K+*mLxD zv0o@UonyL%{q|c3gnUr=hV#I=7aq_ma0;5AnudZ4&zx0t(VeTEe>A%9)sGruO@76_ zV-(pe7IlT%N?rD%;>iV3+U*PaCSU!%k8S7Hd}k@4mldK{*$a5JeR`CmyLsKvC-*`l z;4iXPo7+PsIX_(_PF-o1tlB6*?R9LWc2kEZYDO{IXa!dhl6(s~k`NucZ=mYfDp1#C z)nTBQLmI*$E705^4L(hDd$gvYH)tkm`JNv(t*?s7Yur3>L`guozuQCK@oez0*|_m2 z#FY%bBWUYbvfUx!w-;jDDn*CMs;wy2@+9N%`6wi2CwqB02QsL|3dyWGpDeb=nSISt zBkg$0wLOY`h95kGYR%k|qsI?67NWK-e^^#%Y!)I;EBFCDd#z~3Z{O5 zZ@)Zcsd{nDRJ7<`W!Or$k5@zw*|jK2$)!FPuEgQ3R?##lDX5JALb2cXFYzkeb_IWFJ3(D z)h`haQK%Cgoj`;hzO)w?L{8i7@Z-Dk+m{l$?s$l~Ww>2>vCm~)G{hG0@(yBe*AR;d zsq@36#(fV9F1PDFI1G~t38Qgi5w2&J!`^v$C+&PGDKP0x9k4fsZGs!R<_Mt!^e9$Q zvd!gf-5}-%b)sYB7HgBIIaq&2Z&0=`mz+?nybIDQPf+0)0_$=J(9#@>64O2(=Vo(4 zFP&ONY~B|@ReL(GjFnLMnmY>g=q#o-m zvbk;_oQI0NS?+DcA|vyCTke4MO}p`sk2hBqHBUnKPpx3dW~MF9lIEAQcTNr(Tk}7} z*3j5=96o>(>G}6$eC)p+9KS0AXGzmF0Imm%mqe;l=8kGmDi0QqF_RZ&CLgY@iOr>s zZ{EXHDML3r=vx%m5sUt**tJx#nN)ZcCkhT}viCH8xSiwOD&{vok2}0Mf&W>&KQ}TU zyEu9$f^YtDELl;xu3t~}2hS7Ak0jUHxbuef-8ZhQw!iu`=V1E8P2kyV8H=0Y%?dGJ z8-X3tlWdr04bgGO<83EPGX*>4}m)K^uMeJlzyl)zTsMi$9(bcs9;vgAjeGZ1{a4`P;uCw46Q#2d$ z;G&mj9LH&L?S(o^dnDiSfz>FJ3}JrPZf|c1$^NZCi*Nk5Hf+nfVu@ePu3VoDX$s!nyb7ZAY?OknW}UcJ-R0o1TupzE=6D6<5&N5oE9&b7KZiXt5S1w- zc1o$)$O3Ez5+&S&+@;u++eA9*n2nmM^~3|GK|Rty>at=p(;Eu&{@1_3 zHs1^}t!^0|c>9n2=wQbH<-+dPoZcjHYDoVdk0U`OBx|s*4A`FJQRpdDY{;lQ0lBio693U!<4v6 z_yuT!TgjV;f&6eiRBbW1x0z$Fb4CVnU|MI_{#8?yHi#`t>V!%3bmWGpaWqYS7rgzZ zZA+Af9oubFd-JbHbmrauELkAqMtA<&fF;?AxLQv9WNU0_D>ETYaFrqODS?YI8~(ej zwfzX{j6K_G*D7DNudUn`?LI)wTIdg|SP?~|56_Xyz4Y6ciS_9s-6FCfOG17%*K zr{w37n9(-s)y<(Si=tW`wZs>o+rr(1sIIeWnoLB{ZGR0uYoh1YZR|3kR!GJQVWgv@ z`=Jfa$}C^#ZhKkA;t7B6Mwjr_`PznJ>KhKYX>dUu?&K}ao*!!Eh!oh4|1-Z&r4Ex=y7dAyrzsV$EL%0 zGOZRW8np(TD79N9oT8;flwUYw2Cs^CdfPR)Ao41`Hx)NsfZr-5x@9-2Y5`v^>bUys z(}9qYB^OaUZG<-e+l1O}?Zn!Ejp;H~YB`7S!5#ldfN?CdHhfwgd$Yi|pImDBFvP*T#p>J+_y(YD{B;*Mj6jqw zjl$5-P}R-Nt-{a9)D#U5OIz3VK>!O#P0=uduR)je9>M7YH;N{3AVVPGKIJA^*4@w- zXnBvqwVQQa)Bg>io{~P?g0i4IgibcEY9r|`Gsy%L`96fb$SaMdsFA0oSf`s zDl+&AKs*aS)akqJBZc=94X8H4uMzpYpQ~E{te8#qo0r{6D8DYc4j}UVp=>{7A-6T^g+WKmc;~{0pXug^f`tw;#Rd z#mi*%ApAqU&W+f4EvuPk5-Qftcg|lyn3iCfQ2cK4TX{NiAr$>+HVPey7HlS8rGxTg ze_&|0WrUPaaNcIW&c1ucKDTC+oi2~fmN5ly97vCGB)6cIp(ro@%{Y2o$|`Z|_hpN& zeI8E{<{bCFpi3wMj5*R(fs^tYGyL_Q*6alsCWx<=gM#Y<3r@VK2~Xu=})ikv}!b|^K$jI(~ok(1WWWiiJ6B& z=VR0gz>gtSa3t*mrB^i7i3XgduXskYAdPEvz2pA|)MHW|_Fu~yQ& z`dB{QAh2}YYoh`A#dZ#Mg-#)vpw~?~ZvH)?2CnMPBm~Frw_GuapLgq3&VN7;zKpR9 zJ6IeV9!7dC++-HLFW$1kF$*mRTKhThK_S-pei7zW3f|hUOuPzh8V| z);NaY{X%{_fkZyoQA)Z&-WwXIz_Cxj{HdQ?K|_%IYtEYin=4uq$hNy&FF0TGDR^Aw zsw4H$Y=0#${sT8r=V5)XKZhK(wb*+XX{SzFP5bLp?plzZ`?$St4}J5cFt#T|&pn_e zwkS`Q#+)ulH_*q8;Dl*{dmo76sqlF3HSvE{@;{iMQk$@XE^6^R&G<8ndlzPLm>MOvCgv}S6?P_O{=7eM=ElZd!=~0cv_z6pQa?63ii%4Z(hPtpX6Jw~ zhPHLo-Z|iAb}+W}(M%CO8cf&m>S>K5MT4!$dvQofT9wYhYpWfxe#{S2tEp3)2zn25 zW8_fz9b4S9N)p3{NyLy1>J9NuxVf;U$R_!lgT9wt^fMh*+cg-cJ$2F9#4T&S;kAXG zL*3_+3HGTN6w z)}3|1o?sR0UOghj6yiT>0n9;c>J+=jVtc(Z)hfsP^Z&qZb-0PopHbhsGr-Vy_vzTA zdDG<7)y7}_$#5K_m)>~ky2ruh4G=GoN_vmhYFt-mq4|?92C&~;Ka!a8yvOg^Dk*Ad z7we6`nyaL(+Y{_|46v%&z##2Q%gSEX)I8=Uo2IDsmXefgHs-u~?_4zL#C&&29z4+x z7b4crM0eKV!Ty!#_NTZm&EIqI@E{K#ik0c`-)V=3XMA70@GY}0SkWU~G&pF;X9qOG zFvbyGZkL12+;%HvV5uIhGp)8FjxM*bN8cNLy^2Aqg0teC&YBDI!$NJW9S7pvY@lO; zY?{UFiQv!rn}R;FW5bRUTKx4Z>JyoCu9O@Yt>eg3el`oS_T49w8_P$JmmF-gq3$2( zqxmmZ;Y1*g*OdMV>oEHI?-mChU=%BEOb(~(p@;G;u70eoz7ROrAqVhP%iM7hMr|{c z*!oM$PS>EEnu@dsI=t%bjb_W4pzS3IkLhOW)NCnNW~cm6Y0#)uu$Z1o?vTdaLhK!y zta^9ClV`iwsAe|G*D2&1Z4sfic*)Gw*d{ilFYW&TdFE4rZ?`cznbRFcNmP_K+lQl3 z2fiD#E>}EnMq*P+*4W=kp{O`lv~h=tnitMq=ig9XRvrHTlk)hE{vG8#wY1B%DJ6et z+dc)o_G1`gwdW@qU?`;9>HWN6GGP(>Xevv{n`Y#Lf%f}ad9$P)MfVS}d3qlR$_3Hm zA{ZI2n4Ak@W{C0OM2igtj&V7Ja!EIZN#R)}_Yerdg18N)Om=Q^v1f7Mv zeLRWu>57SHAZr3K#G~WQhqkE28MF8zm(97iP;rc4h3Tdy%zoKLw0n^Y`4|=e4&O3z z(vxDCQ1D?NQ8iBub+_(NwoU@i2n_(Z4ZP|*WNOMbao3uYL)=38Pu?*8G!}b?+9wMw z2!Mh&Qy&nOJ84KZrGHusipBxWboel+Rp=ZUXkR}Od8mkNJ1mbU=H=fVaq*_7@KM{4UHNw*>E<*bVO7yYlRi zn=CeFG5IDX6Hu`fFNbRx>k~E3G&=$mN1}PB9imly@v3l>lkZ^`(->;$~ z0H6bu!(i?abN1^?5Qx%{94dKkEhlpVGRR@^z%e!aS*^JhKp-^U9J`K>$a^6M&#~Pn z*^P>eweh~ex4v>i29MR*bTs;Jm0yG?Jvb}O*FAVY4>W{Jo2g%-7dcZJQ!^z#>!%!> zd6KMBxOO9bVXVji1sLc9hAP_;MK(b#rGhx>2_bLU@-t-x< zW&mFsw>+<$y+C2q{XZm&{dhdDd=f)_D>l z3Q#`zL^lO6%=g=rfK!MxBL)z-uft9DL1@XRaUKYhZZO>$t_Pa@0^m8<`=^r2IpTz9 z-z}-62(;aOO5e(}2TnJr#%$bb5Hkoe`FwEk{j%d{PP$UhzjCiQAy?s=(@&z=d$X^B zQ!w?#VHWb@LlBI6lX!Jo02sYWZT{1qaE0|iRKnXIab4I7b zdJ$_uoNWqo{+fHcR}KW;%}}o1suzO{CIhF)yM~SOjfDqjujn)L@-#E^!P9unFF+A0 z*L$2Ed~QcLK75Z5pMy7#6fkf}iuYvzcsA#l6@!}$zg!usSyxNBpW&nOT!0TU=y-OQ zV}x7(vA|asV19_pE|wU$J^<$04P~--1S*AV2Jkeyb6qAlD$>Im9}7YRT_8zd@P&68 z0G<1{k?QI;(G9Lm5m}@G_*ocC2J{d#>25O2OnXAo3?p?=Sp);4Af60Y-KIQJE1f1f zh{02W3eNe#+u|H~-46YF1uJLE0OWAxna;ah+)DsAyM~(nBwNvSc%lRhgNS2gW6Rg6 zAAh`!9WZ^)my;mMs`N(^Dr``7R*mJE+HTG7EBmrY~XZ|g?*O?sgL0M_U}t=Neo2}IK_0bk*eL3Jr9siBdP4`v#Eets2Lmb5^ihj=!_ohT5z zqsu7m**1jIm^8?PzylNx<^)#}k-)3=>M$d+U6WQnEo4y7P`M}<8wCW{KHF!aPlPvv zs>CbzCP<%xLP&4VHZo0o4`f47)KkfJ*oUS~qb}PBdy>|2^tr#;@G?2)*BJX?N11dL zrTi5a864pyF?yWEP4-kNSh_b$EEqR}!C-z+Ci(Dmg%?jwB)771L+%0--IQZfWlixk zWz+xC<_1b~R)GASh;C>^1FB?Oag53V z7-K($j~L@%-)=-7dILZlfkuWd14O+34Cr?}mITZxj;upuW!+pB(>>GX)GVcCC)-mdwRhi`AO z%diG_f1OqOGYgO!iilXyo~6kffAkGce8$DQMU7I}1`vL}g{i4_0SR&_h=b>MN*h>3 z7O@0gz!^VZn45f%b6dK8JfS6j<{P_@(k89Hj!I%1@J{~)6z2y0;_{oPJ`^5Qyb!+6 z?4n+4?Xlhz#HKc<7sCG}WTTgR3X6Q-XsS>I{Y^P|r>>EgfuU6A6Z_uwP*tJe?&~0T zPtK-~_EXmHm952t<()K&6&A(4JUxkb@2YU&SEFmb;+gGU-AuOYjHhFl^^B17S^9Rb zKyMt-o2Kor)CzflD~*U*L{0zkiL+FpTAci1%I+JVe3f^zcNW*=DoUz&wsW?GBx?BF z!6VybyLl|{d{#wJ;vL?Eo67lAe}M7M`fo7a*#4R8M=^HfS#4mE`Xt^Lm?g`Js)+7( z8&z>O1K4e$$v$t=0MAw0l1WBY^PcX1WhL8joZ(Nb!{mTf2b-)cr+NSqPFtm#3 z>taYd4~*$w7&-Oh6IH}8Je+EviOGCSmh`kmNYBP63dN5IuSa<~*=Dr1^PhO7g)+&wT@_r1mNodUCC{> zVnoQEs>9C7sJtsCY8kBu7}14~f5=ErndsG=X9f<4A@Cj{4}!d{S2mDoE@pGz332U{ z)3s;c@M0s9C97ATY7hFadW?|1CUxoVXZwU+YiBpue69O^qE7s(Q$LZ-!Pa606!|jR zv~!&Y17SiO+{c}X-MSLc?QtKD%iIGCskYrW7tRZtCl%3PV)|Y=qYPAs9_)z|rnI+; zhMetSa25=$e+gSjE8`6Q*x~4x?DP+Ia3|8 z_Z;arsbE)ULQ;rMGHSO?Z#`bZi+#IaAtQbmK1VTbeaCElNq&(nvTeXeTP*9%OMWae z{TzpUW&(qN8P8I`<3#Py=|hb)Du_9PixNW512j|eUb7Va6DK##YcS?*Y?DYc1|@G} zr1qC1TR5{GDR}EUZAVFam;)L6iADQkOWsJ*;R;>Cv{h) zvqkLO7wd$7S0)VMXsUIxAB8-RGyZg|H>#|xtp0GNoIEO`xR{?a4CC~?{!&vs?9FJG z(YiYkgb4sHMxN-(_lF#{$vvbb~0freb%Ub?`U|u znDtB?)r1%Ymo*1x0CCoi0(t9<$Hf{b_tyI6$&Ct`%E20feD3TS(dXZel~(1glS2Ki zI|-@;PmQ&vbTasL<}voEj;ANbpYoIx)^beKgmmu$Gm-oZCx3{%In^2kOefzQNSa*9 z+aLjpZ#K+RpA&QTCoommQ!%w`>DoFD+fIlozuJLMLWnPRpG+2cQvEN(9NoH*+<+vlh`W<(d0! zy~dr^XvN{%&61;X>XgtZShb}+Df;l+_VH3;R5{(;F&@F0xBirE`OBtB{DcB#aWTvu z2t}2ZC60`kL~#d-V0wl>f8I0+`t(%d949R4d_H_dXrywxwO%h{Lfrsx7L7eRZ2Gx2 zEzvn!yYvH#zd%_9>bb+uocZ%NDgQVKvphzwF5Vd!CWPua1e~i%^vW~ruPf3m`MEM& zZsYmbbrrK}md2srzfX;Di43Rc#V0uDtJBFn{nLW-8##%O7wbdKzoQ@xEvi(+saN7M zEG=tu9il{LHe?35_C4OT57WcKyN~nwt(|pAKEy2E6aC>D-~}GzqHjYjF(qme09wQH z3s>&|Ajbn;mBy-(4)c^Teh!1lX@F(dFH!3&eQ}d9^;DM?f;X zUtY(Y<7@KTxhYzi7|*Mw1f7=$n_mo2s1^IPjhPOt#8|wzdS5}Zp3r>SYK7%z0;tVn)uOBj@~}wLHmi$~>(Bi0WbC;Fdwv59hxazH)jalP|~s6AvJ zH6p@AJJSA%O@d}tz4-tM}Qi#6_ggw2O?>_MUQC zMW=jvevhMt$EjUi1NC`r|Gg1C7asY+329Yu2P!_6hPl~03>`$P*oic)6P$c2?f=Mz zIVv|t&N}ll$2U{;`X5td$=tt~Rn{ISIpd*s^>2twkG(|F0~u~~Vn7TqVemg|uH8^e zECk)Q_+>@e0TaqLo$c9DCGg{FLi2g&mYEw$j(`$fz3iGk0-mApm|h#NNm^Q3(rsHW zE3Xnh1O&jI|KSnla{z0&2Oaq`mko`C-^x%@H1|IE8ZFTPfU|}C&0+DE>6~eaCaygD zv}atsQrQWwgN@9837rBE6HeptPPh7dP^D_4wPZ-T6R&~ zns%B7g%dzEM3*+teuF|4N8B8<_?iKLbvm>J2N%G35J(qXJWI_4Ae}o>7=H=EjyIYC zcaq&Mw@}HR(KNu=J{+~i+JLd~W#Qt%kA=wtw`yviX<^>G?l+GE3P&jD5+0u+wnMUi zkA@vSG*MFq$Wf{B%0(lRhj_r7-I?PMhy)PMfTZW>d3r`+^-8|b(j`1Od(5|Ql*QA8 zIhnqyYP?owNSyAaxJk09gGCBN%3*qL&@JC&1W20Ko^q20#UPhzNj#Yca5%5@uir(! zN*YMeB<{(D2^plEP@m5O08LTu;u=Z3<`IC3d{3FD0re&v6-%c6OTp0qLe@0$G2kkB z?}-;rfzD3E|KFoj^ZGayt&okpCtx)nK_@{l!TEYUf>-wLx2xf({V*#fIx!kTY03Pd2OAIw2 z=cM*9Xehp8M!T&ri_aTRFCPMIE4!L%%-L||0co9{K9-0lkuF%|t4Lf#K4_r$Gr!h| z!|G`M?B9ZB zhtIl5iyB}P8n5M|C)5KDSFk1eexbBPsvuzT@{jkI-vL@(Uu*wdzFn4j5`QdTd-^8I zLcdT;5n%0x|Bl(ZJ^rftuC_LhnW$aLc__F0-Q6R2!=P4KG6JB1WeL1JHDN0q9jcm|8sx|wOG^&ifqG%^7vMqx90S18 zsrnlE3>9vRZ*v1p6HS9o2own{$j?12J+TE$vkxi-vA%;+>df~2sXeP}BUMW?A2#c8 zjo~uQ`Nf9TnL&S5+^)MgyrPcgGI*al%N{0zpuxntm4&i-#-a})Er1MVYHHO3H+8q7 z?@A2a)u$x_Dz$8&C(`2Q3WKfgKj^x>a5#-gke`}J&Rb!ji;E@eGA2FJQy6IDY0jlQ zQn*ajTf45xB<&S&GY^|W>5)&sOvqwy-LL!;yhM=Szikmdo4M&vzWH^t-ZF1RcieYY zazJjCoBNMOz_I zLLz&vo@M{?CL&J0Es0nHREeUW9mTL5X`vpVxM!mfVhkPrS;8{)aDqVg3Brvv=!ebM z*j0NJWR^>5h;5AY)B5bwQKez2beN|fXy3X5?e4n2e}6V+^FRodhS}Nq5wM=?bLv+S zx0TD;KP41RLS;Ap&Ka~i-ICoJivMueGJSOK2P73oW5JoV2UgiNYKxZzu8KIF*#(q6 z=FuJHf6#a#(8sm_im(37$+m8}CHU+`nBc}MD5?h02`9~tgWFx@6w!4W7A59(U%W{IC9O5Fq^GgXpXwW$O`Qw1_-* zI?{T<*BpLj7h!FWhMJb*;{QZvNyg! z;$O55#<~wG)JNOL$u1THrE5TTu6O>B+1%LT6Kh>yiLuGJJG4jb&hNXg(U&xXvXcZL z5&)3o8WV=l$SO9Uy20|a3??OVzur9X5t{C+rtCjyz zjhXQhsZIBxUf$uP^6Qy;neDW{Irosw$(6~yVUc-vb?j@qNV8B0&OEuVH0eH2jop0y z?b6yau-fekmxu)<`EvAobnAm6SHUiSn3eHw(cC7&RafE+h~~tMb_3GMGhcml>7RYI zv&vt6^`7V-zM2V0O*k%ndIl1;Zp~p5G4b7`sP0)l3?nixB#<8PvLx_J{0RlVOq52! zgjz`;KY;wD&folWMpbK0RW*NI60hbzB(+km$A86tONm{) zIk#=kn44klAI!b;*A#K&E95)IFEKxVK>d&FIg)pl)KA4NuH!{+^-g~-P<yuasBwlMw(7*uZ^Tt^>~`6Zg?Q$eV5}7Q==nx_F~= zKvnVZTy5h<07hDvt23%X7)ITF=Yh3ZrpYXW!?wP9hF2Tu5pBJ6#lmmh{CJ#0f_ncJ z)GAfX`t)LLNGO+d#aqFU5Wm1lCaClQ?SW#hp~=h%4c&1 zEU}TX@t5)OTeL(T#O4jGtgO?*sTZ!swnw|Atr+Slbv61Wh`veMKD;T}V984ie7y2W z$Higtk>KAv?NonZY~nT*nAxHwftW88F+IZz4M-4_hZ zl*?Hy>ssSwu-JL&))QazfO@s?1QiZk?Xzs~x7YW4!-RA#Mo0brJABVD+|9d|8;bO$ z{*oFsA*3WQO!3D2#3H`0L%8!SjhwK<>`F4WD@CXWmvv&aXpw1dV>Gux0AXa|&&@&G zPh~u;;?RB1rIOwbD6>VlR<~r8W$ls`?B2qO~;k%2Jq>581hB z_m@98i_Kur%M?|dMExb%#HNnimAGtI!7-{YGIq|!YP=U$fJ78IhN58t=>|k4cXeI6 zmJ)NWPZYFsK*x!=tUqTU#GHY^uo@5;PX2|+bK4ZsG`;8%hze;Kb6zzoo3}-Z&YN(K zi9v^RwQnSDQ6bsQ7omv^k>TwGX08F_O`{*AoL-oF{a_FB+ng|AYt_Ku^UEc`oN{S0gZ80u{EI)#eL zx$9{$XYn;PQS(DNsBly}bii1=qHe{}hOaia=gN`p&%A^+FIj4wRyobUDQniOuLP}z z@cQ4A$!mv9q8^|BMKZbD@HD>iQ8VDyO62+E7Cl1+Vs@gA@d@?>E%EPw9$)?L7cb7T z`ie6bJ-EsHL;Fg<)89??N9womI@i%lK%J{_+*n@KSoYn1Z+*&qwE%GXqXY3jHpCzt zUsX_?b}K`rETq>r2_v}4@&K2mr4x8eYYQ3VCaZP4@@%6V5Mha8=C$XbjlRo{99$RL zY&&9=hA^0Y7=ba6chu{UennCrd~$SPIIaLydovV0Ob9&gE8fo*W*T)=6(~P!a+medKNomb`dg_4lwm{sq$=QD#^;AOMJYq z3c$&Q0`jbZPkh>BHh-Lv_!O`;iEcT8-^-H|^^3%p^MGPfQ_t5c53LMpzB=a*M0<+> zLV!OvjBF#A@#n;gd9rPO0VFSED&_34&e9-Y+ucCWs?_W)8!KTk`ZRY9AQ$jcQlW7_ z2e7ndzYOVb9xt5u5+XvEkW2u0@UQQ)fzP4-8SwtV;k448?!6<7xB{SXDpDB$M}jFA*-|42bXsAf@hDS#olPrQ0tc4}Aq?NnZCVr&;@id~J`Qi5?hrO?4n(VP`@x zu&B7ph`98iHZ$Xax-!sYpawARZj$%9$fF26GLtE-62%}?qYhv)(C6zutj@u!=oT?8 zIR4|_1}`NBG_ z+8HEGFaYvMEw%hy1GFFFHHl>z_pf?tj#CL;{S(1&(G^aC(ymB8-`|}mH!2~>ju7j& zmqLB?eeUxJ8)*uJM&dQq{yl$V@3b&kY-EX$Jc?EuX>oJb>tb<8ZZ*vxePYI2_X&A`(G`%0{uFtRplc zL?R>eaBEcO2#W~l>0wtMDx)lB zzXs*uXmaSMFM-2YIqO7_BL`9(`!rjmXur8NOB6PO%jVfc0DA1jKP>p`_xv#fAGasH z=GF{RcC&VNVQr4L$j#L4fIh`mLYQ$iPj*Wa&1E87cPW^faGhBBoZ@Oh|FqnmH5$%3 zy*xL$)=gEF2jWEUP6sPwl`5{x?Vm@G?Q5j&Y!KcH@ce|!TVd6bu9pWLiI3RVNri++ zdfwPSVw}}nJ-ip+{^EM{Q)xF=P*cE0vBylSm(jMRs4U5S;w(_x2ZGX!2+GLoC}NCL z2qbLAhL-*cjJF1QbXBbdih}N**HEo$-ns?ADEhgSE2cT<>Z_XvoDUYyC|`H= z_=q3-6c-tXa6PT0kmGRUL>xNV@114Y$u&(ihf(LZOxGx7fv9bfernyRDCUdh}L4$O?t z1afP>>Xe9)h8dM*Axq*vvjCN`ncwwGCVy?vjbm0UYgUTe8S-<;GgR&h;Bj$veWpBR zmyh3Q%iqC`;;RTmHCZ{b%p?Co@Zu>Xj}r_(E`5bRo`*N96;hrB)7hhRs7cu1V~_02 zZ_T+=EB-;@=f@3nr4<&HTlIi^_!C25N5+R_w!4TIE%hb5gppyk2U0Ng`@xf3=Mq+( zpQhi=*&={l%8T#32E26>s!gTY&CQcKWDx)3@8qz477WoY4U6o$C~Qy$(|KCNIpO&? z9GCdX$>jXnaCf{#GGyQLL-JcG!n#Rs%HZAAsptH6*BE}NYj+d zT)uF7?2(?*ZpTFfERtip^)8}Vv;9>SpAm%+PBhEr^F*E&t{pu#2xY<1 zDGF7DlZ?FjacB0vXy`S`i=m2HmMZQV_ANnQPAN@4pCk^xr24JD2`&e$ThzL3dyl7l z^6QZy2+zkpH4}AI*Xg$}60XAqGmde;A;u%Qf9Z#R-rk$0LI~$;_^Si|Pj>Z++adNE zKcW)=?*5zc));^H64>Z_%l#i4eK-A9$McdclkRhxNQj6j82pCvkiSDY1@51reB{IL z-1s6+r8BE~<3GubH$RnhrblxIi{ke-oPZ9H*J5)|3DZ8&*wMW&yc-*~qX%ZIZ}AXj zPxXUp`eiGg1{~#>I_nF771V$TNYy^m*lD3F5Fi)+g3a9$rSQ1>hM|7E;j{r`HZ%f; z4TgRzJiikErw+I0YLS(cl)N0Y<)HB6r8*4rDDY+~GtBnAER1mb2_nc>4CB)3ia2K3 zldB$ksy~rl-wNVF!S91dY_da=G(SmpTQ;uTd6Q9KKUFDnGg1{#DFtZ`=Njo)aC@`!Kc&TAw*F3wH;ek8Z4;i~N~hPA+V zgwI@T^p z>lRc-?_Tu!pV^$g;kO2#_=g71jvTPVFD@EJSGqTk1+D&li?AI_dV94!sGv z`>qjeibKyvcKW0;S3eB1A>RoD`|p4xERG2FU~&ypdwIYv&P$B=}f3tD;KZ=xNX4cEqo7ZvB_2OHS$tYi`{R7cB+JA}$@x0{2C#_( z*@M0F7AcO);oUyDTGlg@jZ?O6R5Xdaz_!tUmm^R6q_$Dt64}?*$V8cU(=PJk1Ohf% zZ4(sDY*)$}vM)M9DNTW6Qly`NHnQIKKG1;iO<1Dx6^F+R`#N{~+2eLTkJ#r=j3PQ4 zfcSXnV(;9cE*XwEINwYA1xuPgP;!nc%lES|KGFC{-BC2BHUG>ZXMi6jjt*uh6E}D* z(3Nf3^nU{A)9ZKstGG`| zeK_;?;+`ru*6k*h=N?eum%Ix=#5W<}53A^$;;Kk@ZPowOC2bp>)z$e?lD zqxbqgU~yZyi8Dm(^wLJhopGrqQkQfINO1#od4dL2ZE`mXA^M~I!S!=-?g~L&VQ5SDVWd;4CzIPlVoz=zVYz}eXXeF2G>C4 z(3-BXhhMq7@y-VRU?|SexDF?06yUDp*WWPE-5{QxN!}}|*<%hL=xyt%WJ%Aw$RMf} zq`*C#7on9^C~XtPC#1I!p=7W}i9&m?B=I_aAi8akcarkDXFB zmy&P%T4KGxy;ij#`A8qbR3%Udo2=p!PA!9*+6dl7#|sFq%L+RfyV)evgNC1)=~wK4 zCl~J}-Ou5bYOxIpxaMLPu0G1DQ$%PaR8mmDjr6U1QBs;YAzR%|j7eQQK4eNreL-!oAafFBq(E|ZC6Gx=&XsZ< zDcwo=%JQ{Xrzz<0=W?nf_t1-j<0W>PwG)x5`uSM)`CDSnzA_-R65^nckYwcm9h&bRU{oVSH1Y0 zId4-IW;sPk$trnwF`4F!#$OZ23!Hbbk-t`;4}Gp-@nUMhU8|1BwY;*{?yHVWrR(Rq zX?Ri`C;WA1|j&MhapEQD=}gqELG1%a``=UtZz<4|8uF zRaMlki_-{5Bi-F0C9OzpItA$xq)S@b04dqDl+qm{T^rqqAfdpfW78diblr)5-#Ono z_ug^OJ!9P8`2DdM12${Vxz=23&i8rV=Xoc!4M>uC2L(YKpHy~&G3`ymNofugcgNb( zL&_p0tm9k9!a7hI&~nhf+SB@S3gX`*ZX`QF-(%NSceQ^)TV;#kehUBsSL>kfj@Eh0 z*kRFOS(`-1zDd_}0WC6SuTRWCqx_9XG}n&HBkzXw;iBWKh|30=y&xo$B~>++-yJ`) zM%wWr`Ug=R6>4GKq08{O-#I|MA-q8(5I?uubQzi6o|U2V9KxkZ%J#?L8Lcu)@%o53s%y6>4NW8YE%~{T{l= zEiH~U&eW8JabfQ{?L-BqQ{ufP*Y?@VgsmYSbqqb{y+%k!TeV=hJ~q2iY5wnu0Qzbo zBZcSpHJOwsB|~GwzzT`t+QYc=!}ZvLNs0Q3Jz}iVPOG;EVT=rkN=WYNSv*IbVjavu zaaOvxChr+=M24Hk`LliT+nlgX)VQ~tq=({n&@VpW{sn)NxG>OD6uXhs2&Fal#4Je( zDvM!?P5bV_Gy@TY=01lY=?Q*q!Svs@X^c5*@^DOuP8aHlVwqD0&GwE zFw`8}P#D5$ky)pgfU@zjR=4mag=zF>)VSV7I@6=j3#59*V9U!6nOfdhWngz81hFO1k6R z?srhz>$FCh}BWt3uyf3NK82fmg(ESOh{r|)+t zQY6@qwzvqFyIj{g#1-X6?6?rN{XWPmrAM@&2{B{+l4>t}ZIgq2CFP)n=2OMwT00fy zDN{kQJ{6gok1E(Xbl>?tFTty{0Du1Oc9GBDOO7I^0}^Vqf;RMGXvE_%@yOl#MP-&5 zMAh7`T3rOXH6e8j6-+CBmbOE|QH{Da9P0wN@h8-TI5-L>$B3K=*$`nkDQ9KqCrpA& zP1kO4$wZ&}pwg^E!9gszftLW$?xOXA>HuEJ;?oKKmaWe*R5gVcEpwOrZf%E;1mtuQ zCE$~ik(gTy#h%mV@GcA@3ZuSK`=VyZVC+uX{N~F3d4=`8ny=;X^#>(!rc0ICnFLAv zT$?EM?BoP)Q0XJOT+@dwQf!EUvxgz~Y8snu7nhD)kp~KQ10|P5FcKR+rr>OAhazT`FkC}7Tf)j_~gDJ{d; zRKSPPuHvjS;A4^Ht`U8l&vrkE(&kX&nPiXZ=s99bY+%JV^ozeO`YGoPTSaQ zGUq5XA5@p|VHb_NM@S4DwX3@F3gvq92{E5~ATuC+K~Zyx4s?$!DtWgxz<9LX%k~tS+w3V+ zZO^Aqvn&yK12-`8C7$|93lxlBB1KuvbDt%*>Z=P-g5$FLjPa-C*w7s31?6K>kh$ zd&D?TB<6u|Bz|8G+o*2^W95oe;<%fq_l7;WEm4EO-Sf*MYd7m9A|#Hro)^S>h1nN> z#3hL$WXwAiiN(!k7|43;#;7E{Uw$V^Qwgi}yi*PO?!plNk-r3A4cK z%VYZ~m&Ju^gvv*p-=Z2XV)}c1(^vx$n5hCOMMjQQb zK>xf8OiZytuxoA2N;{HszRI2oWvg3eYE;q&+c5T2`hs-*!(zd(eS_!UpQ?L`-Wiv3 z5MaWM5R+#K?qDd$L|#$U%xdVO-wQ7YqkK5B%axvGsC-vjwbDmpXONj(sjBjfG}cRU znJ+2@#S8mP{>D@T4*#m|Ebr0BTP?foD9@L9Eaqnecj=yf`*hBE9YU*C{-u;X$iR`k zGq8q9XW+x{CkG^sRh`%xOvY0LwLTU6`ttT2NGFa{n*^t15^7SyPxK)_7B| zm&veq{|qTif(q`OGPiq_BwlHLKgl3rgfY&N%Y|m4w?Zv)Ta}*UNOO~Q^v#y~SV`wH ze0lpZD{Equv5dp|%WiD#+4`a-4*2VZ`(_&c#(Vusbysc-!8;iWe0gE-ZeOq@{E$^? z9aLL0UYEL@f6n9n0RPwi5f3sIE?G1WC!2P*{&~s+9~C+$H9SjJW$RGRdE$A({I0yUVwPualcfNuQ!h--P`|X7;K_P zsx39JDOJ8A$}>0!JCEA7aplOF)ZRuW!q@s_;l)Th_^a+OQOv0!td+JcB!28gvUc0v z)|UuHh5b()2}oB3{W~Gq#e>iIbV`|c?1=*H2N;!}a*%{H2oS&Ys>1%r?=W|}W9}ie zk?1<7A|UL=$Vc_+r22QWo0y326-h;}sS75*$+z*b9(i8)x1qHjO*-*D{+K@}cT9M_ zM;IjQgD5q)3=Xnp@|7X?G885}(e!jmYQ7FWN2ZEg%_ZiOU853^+yu-VxGz7)qktbQ zUDh=^c;<6jx{;r>IeGcWqpw}3o%xJEJ>4pQT&uZ#`Ry!2%w@8FxJWA`AN2!P|E~CI zqZCPo4!WuLO#uF5xD(n-+e!W6P1iykJgWAmNB6LIgvp}a`@FooS*A1KB=f-5ySnch z>2rN4re+Gcv`NQ;K=WfH01^T7#;n}4wI2fFlCCvInE*-@vTkF(l>fjK?K13v_wsYN zb26Mi(iT21^Ghkt zVh3Ljw^#)j$PxQtpq#=G<37G6=AP*+Kv$67UM08~_hQuNq*xIGBMehTbtzRSYu!te zNIv~Hum|{YG8}hW&fDKY^Mk9^Bl4jYy4$|1qj(TUbao>s3Oh^>H<8Ne;ldsI+6-SK7#8X-Q_tHVi{;s2-MmhkiHv83ceI@T(O}5pM8; zjRI9IY}<1kbVv8qKIgC?`{}NhUQPVYQ6_5%18pbt)AP_l2(*+k#TT2^pbo!U4SmsN z8fF9?83iz9#arhF{o=>yy#UyR$_v0nel2u>i*YO=|8-dWUxCj5tN)2G2XMOB$_F*B zk7-B2Qgz7umh{Ac2gqK0kD79>?I#P3i;H{d7C1FUO>zvXpky_IB2ru^RjvEIpRpO9 zS69s0FN*QHPF}+BCE&@%P@GZZFC3&YfaWtA+0yB4$FovnvS7)GpSxHQZ#sJ5vd)cs z(JIAM_lD_)7ho-!x&6Hby;qUt^_kplb*;(hu!AXyoo@*&V_jzL&rcVGY`%)H?tFam zT~^w4x^W!^m<`>|k0%=Oqcg^a&`OrmE%7zuQC3AcM{Ro;S|E&aJWT8lrJ+ z{J`WfcRqWpsmW&KaxF{KVC5kPf>04g0Q{k>H{b%w%4Gwhw4E6k6-+DaJajcwJoNtp z4N|W>Kw4X_N_JJ|qx5~axHiKe=-oRE8QZQ4Y?jHgnugAV?xGW-eh(FemBI30%P?8* zNSt2{-duZ>)tM(5SEPHSmP&LB%fDoErsC7qr<$m`Qj->_c?)9E>DT5@eOVihQ7zCl zQLk9?#>LSX`qt{sHbjsXC7HZ&YOYeKIZUdi&)=z>ZLE_q&Pfs;3ZXULzE}C#%O;c# zIt77+uy?nmJeanEhwlyZNH-XGo>RKZ)XWyocFfuRwgwN^WCBhKH&;+uwlbNh>3cXE57n4^&_MYUVKX3Y7}OgiS?)pp13>AYe@#%mpy*Sp1{*XET1#jL7R2NK`M_3*bCvuWwEcn@EFIGtOY7bijoB$Yc&2KI*8%y*90Z%)wIxNIuH3St7+H>+F1U9f#lR?XZb zmrNN}j2H{6V*j;jzZVb`+ayynP#WloDFpT4a@X9bS=<~+jVIE}cZziQJRsTC^CeJk zJ6&J1l9A+`NALK!RA|Sch(#+(_=b*P4&8}@_?lLcWIUmjE_*X z3U=ZFk0crp)6RA`wP;dm$pQ~a8BUDf=@|UCiBSsE#(oIq~LDc$ixb~SZ#f-r)d2Y_xsg&vWhP1 z0IO^$%{(?-WyuHj6Ta578l{ucAN3Kl;N>-TqRWD>$Q~baNx7{s^SX3N@4=<_g>7sb-l+Wzuu2srVQs6GNwWzB$G`@Sew$1tM#;@~^ zGa+H@+_e8!QuL|0mYBgl+aXwVgLGIcKQ~8@i>)v+_fRX9Gx-M|GPpqUq6k-f*^aB& zlo&ql-$7=3PlXCO;Gz9cWA@>79ko9(Hr;a%#Jmi)F? zXWMyPB{W61M74L->n!>zC?+V;F9^YG%3d?K0BEzMDyCc*ebX+(ZI^KxUdH*S0lscio@wTTA2%$LOW2M1}C7H%g?#;RQ<@ z>`0Z3RMX|{=Kv4L1|>fuGCa@93D}Z$Wav@*KY_5m&7d9Ez+M_d0mji?h$GS1{~m>% zz2_x?_9PuI@jwKmWkdJtW!U6C)R*m57E1G-*zFr%HxSAlYfv}XTc)t1U#qYV5t4Mw zu|2C0%+|zpWfRM-L{x=ZkZfkYBGq%RjZ$2#A~NaT(lT8)G|m&tXxylJq)ckEC#@J0 z*`}_ZuE9o9rt4C?nt1gDluS0?_3~Z+S>{C9syD0450=_Ts!6ZVTUZ+$=~;Uzq|RjKe|#~>7ssEc~|Hw2OOCr4R#xtgH9 zZ4o=vj~@>p*7{EwtVKM90qs7o;L$HfV)(-hM>^4CYb@%}kb<~pI9nmSg;>Yn!arAb zxK5$uRe9!vtt^QM$`4s87c=b&WCLyVjewkfyL)cxsX{`ra9vA}xAtdRaVT4FGuLjL zR`m}k)+vqU6^Y1$nxv4E1gcy~FOF@;H;vc}`HCKd?y@#0IlMYP{RiSAE$?)ous)bl zQlW^>{ITO<5p;;~_UMkK5ueXb)O1vt211;w=oUvrX?;je>{NB5lo)5+h|k3pffkkW_-^* zRQ8PI`bSEw6px}wt^WyUjT|$~IQJ?IG~g&0TfAq6LEj6qhWV)b-10XV&i~GbcM~eT z83G*ynOQa#Bj&P-&aJoif~;vcAyBNBv0PfId;?7au?u8YHW%6Z=dH>EK?x(T{w;w9 z@XuF(nn3qKx(@J94ayPzXCCJN>r=#dcL{Ej(4a>j?7YZ-6P)9V zZ9I|Kk!vAebN{QG>F=#Cxcgyfp@z z>$?YSu$E8(G%eP6x*TPDHhlVHU0IwvVd8q*b+A&`!D~a=8GX{bow~Ir)MkTvPHO=> z0eMpgJYlh(>m?&EGMUTc8N6HMm=W}!&o;@L83Z8yEx2pyGYqO@USqFj;yS`qKC+g$ ziWP1a8)!8chT`w97ruMTV&ur~`=jB&h6(XbK~7*Yu@^7t* zMzV3a85;Uu*e#SgKpY$Uqj0~iy9HID+U##7y-NWX_=vFj>elFd(~*j!b(|$)4iA21 z<{%ulEb&_ridA}Ed|uYrpQ@jX^T@_@Zo7Rr0&1*LV*0RW8;%%)CS~~kINW$ZYGMG= z$?qmedP8zJR;MXSN=_flQLd|gE300p$shg1i3kSEvx;tS7`&mKZht58-8;~*9SxdV zSk=l5xJ)XvzTOs6#{hOCN1r*4%D9yL!kWh*g*yzGt=a==_QTHVR;eGBQ)m`X-TM$Q z`^2Nq+}+MN&kLB^*12cIAr-4=mik~WdfT2^RS)+nNs10y^EW&Rn4VpG*by*UE4bTU zQbXIR8^X(;fm?h!_Di8HAQAM$q=?XvR?NZoq}-BJ_oZs+01ZMPi>A> zv?_$Le%_HITdjb+hH#l_MrxDN{^6PUvrPKYtA}*wn3ua5)Ze+}50ya*elhc0moQrm z@$v5jGHwZ}uE!Way^=f}7es0!zxzMq{N;m`wk#X5c?c5oAp-@%G{B7SKCw_0Y)9Dn%bG z(8W6;+r0h~m~K>@R(EyrMXFuCBL$Vtd(AN9yzncyc^0j7MqkcW<1P=j^y&QglZ|11 zVD0%W*S?G3dK7XsAIn^M0Xg1$BY9ZX5u~>WkU`Z|M&)X3$B$q@QKXhWshg7fn$3&3 zvvV|F=l?7}W6bFK%~!j%)clpvOX**D?}g*zL~sTR9JwR7I>S%C8tzNFyP4CiucYXo z^I2+|(GEX&^F4k|O0j>?T4wSPr*J4Jk;cs!B|X?-JtJ>n0^<+#87|+VA;Cn zM7<52->muBNUZp*pL^Tl@1Hn;YID?}gJpx$f8E=&p3Ty}tTPQqOiVOA`JjF8?w~AC zGx(xNjY$pc%^!|;DeJOv4*5-^TZ~v)uZ6|Bkeob)Sj+fa zaftfW1%!*P-BfV0`m%BERCc_n#)nL}X{YsXI~=5#Z&6cLh#RyyKLt+nt*2PJ)FB=@ zH#-Dv*0vvxnn?eCi+F^^BL`uFL})52W9KQyS32Dm(5IfBl;{i)*Qp7TtmfMj%N>zV zpnMf_yOFAq+~}PZDAhm!3)F3JfJH8yhG4ZPSV=QpG3~Y<45;VGW^w5i?#21GMkKH( z?|-Fnt9GB4|C50OnO7h#O!a;WfsSajup2FgVh8wL(e-Qx!Nx-MLa)DZ9>v12g##*N zB`)^9NL-yP@&waNJ_S7~` za-%r-dfI!;tQ&Z%&7J(}(tR|lRo}psiVs3x!kDdD9dJFMYbat^!357y8rdS!9=6Pc zU>XrzXkb;D{gj$J9q{fku(#*XlDiZcls>rqJypOSV5F^2!F>j8o?neu%Yag(N7|x^__|3zSM5Pq>=0O|k#L>4b3=gb) z$+s81wJKML3LMFa)EJL2>{thbZZ#6z6NzY)V}y!@YFe`I(J&`W65Jyn$2j3kz@UHd zys2OH%j{}9zX}8J(7&dqcH0K70+8{`yKAxK)D!%29p6P%G`{Mt;YCQ^&WwRGN5# zCQ{F$LbbTMM0+SWULKIMSVYzPbKY+KlK{Q2X(0U=uh3 zWh#?QQK!8IWm-W!vBRwt6FUjCx1MwRS%T<>dfcB*3#zhM?eNgP2b+VUTz5_(gf z-}%zPJV4}Bb#`~5pwmH+!|31GuUENKqvR&eHIV2F=udjur7JeuI8^?{Gd*D22`n{nwMbLXg zUv@8y5T)9>3)gO-y#B>QT?Tv(a_>~<%;{PD=h>7@a#{P6`Nm{XX8|3I8y1(ijai3P z%)CL-0ck35N2+8CrQbmqf(eb3PZbHfi~faNdkW+g_FLm8oc>D*%0T@>u|cQH=UmNd zgt+0m&ZK|Tr;fOM>|uYt?PQUs9qC6?~KjtXP6lp4@A@}UqzEUi8m&9u3mlrrSBhH}A0jPXR zCvmLm=pe_KLgkE2s}Yk8Zp4#`OimMR<1{ZpccoV~@mTGO&gP~)cJN2090vaF9sFu_ zgKUMIEj0KSF-E}&!R3$q+Xpw(1+CDAi@LL?t2(YEy;er@jM^uAKm-J4GWmY6Qy~gA zF=SNGI_-4()SEAmMLBK>ycbV4D;lt@AFQyYnnJy*@>7m&kXi=Wfmud_{&pKR!aa8N zNaqFB_8wTR0^)anl&C6c6zdYiT4dFlF*;;x487pPyBc`Yfw6U9O+5OXy7i7)D@TF1 z(c|)qfz6=Gr(a{JZc~vkr2EeLbGWrjtl^H9jR(S-E_oc?u>lO ztwRO{Y=wfoniJAKwWt#7!L+xU--c6jzlB^lGIoIp8n+I=3K1Yl9-tseo+?5w@LbAa zFD)C(B|W*d+-&kCNcS?pIdzcv~u;Xa$~F6fpOgoA+7XQBX(Hl%)V;@ z%aHGebF>nktgE1iV{<~;+~tn%^Mi~zktQg$z<=V`*1!BVkK2x)T06CVe?zcQecjdo z1e;=UdmA^aLJ*r-KS~BXGA(9K~s@(wormaKcin`YTcDNy?|Kl(m_} zvX-6Z=&F#*O_0-NU(JR@3=uV_X#15;h6N?j7p%Lm{KQGBS};)(!y5<`{&%^<=cb@(-n2PC<A{lc1*X`0@$emDwpHR` zpSni!dv_f|qEs5WUAo;FbtIWCz3L=i-IJ5i2Fr68PvpivYj;-SgTB_;RsQ;MYrI0u zEL<26qozrTA6#g-l!MFH%@v^?XKOMzV65>Si=gV7r9LU5&z|FGDwt8m#~GcPJ*xNK z#upn8jeowx5_Hx?K=JoOReoBZaVvv3`ZPpYZ5mhdNi`3M0!PX02R4KHw?-5r#Rr;fUL{|wcj)`j+Y_g$3wCx7KrxE1V024m zLx5t~0~`o48z7_*y=*l$DdR9Q(G40NZU&J$jgGmyvG|wQ4bNxvO4xwt>{K{otoJokNhLSv;mubOB-Y!{5?D(6tglP*Y$%m=I{=SR7d{Bb%4@9kj~sa z#o~5K_0<|Xck$)p^E^OM@qOm{d{pmJ+U5mh@A;!*T!>&_*EVf6p-x8&maq=U%$#Ud zoQf{qRMI$Jjcrb=WbUYSIHFxv#q^!&M|?9*JW*W;@G0tzVWVZsyY5nT4+x{qfkSnyBk5yo!-$C`f?AcQbS z=j|_J(XG7;_~OGc8dwMWwty(-3U{tFJTO#-noJKm!k)>jUq*>}kzO3jRzjl;z8d`( zwL7y8jhe1F(D>wsHM0Q2NPq8Nt;d)BolsVXA8RN_eJ!L>-Rl9O`AH>@)T{ra0A|Hw zcn90{8&lds~-=rXDX>haTkKAuXp16F%6% za35!U6L<$ubzWdzkRr!@X*$3MxQw6%tLv}e_5K%O6*{)~y)6SjemW7;h#LaE<`HeD zs?*X4;&s?MBv8mbIHSAYiTjZw7QR#i;7AB5a9@JIdwkG-`mN*FGgInku8*5Mm;K(^ zV1=`(rA*(y$lmPtT4zLT;Eb}s{PEw2rhDerJ|lu(Vq}wv`2De5h%C)bMsZ{}?#%i9 z!*QYG(U5Nv4mbysn)SkrQPDLMx3;c_gx(cX=WBWKvlrlpxxp9=2F^N(lK+5gdPW4e z5;f?^XD|a&$^<+!v$@USTH`O8?er%XFgn0u^e~K$(~aPa-a4m&xaZ*d_VYXf4`mc= zlwFora}AhZQFy{mVY{HZ0ruUvb63kb{k{g&43fY}J}i24SFB35LTWbrzTLGzz9Rcj z7h`GH9ucIzB?Gc5O6HcuKL~=d`(UK*D${xEcZBSKwPkVtyTD*6O$%x_DUF&Iniz9E z_8Fc#p$C6fqJdytj*n)wD~9YiGOdVMsxQ83Z@O`*o^+22sSGO$6Bmw@ipwUg{}=U5 zL?d)^PS6_lV*O6`6n9h5?Z#}Qmh>(Om;2-b=9yjJV^H|fClvw?6?0_>oGW^HGwWvR43{W^3r^kMC-@}r@FKN=dO z?1Jv}DO|i7Zo9;OHzjD&MnpgiaH55A?dv}0sl+(hn1v`oA6{_OW$p+Z7SMB?}y zaE_IB0nG10e;fpqG|BMO#fF(Ui43FQY8v-@RGGs&ZO7)|m^F{*VKYQIp7tWFYCm)2 zvtmjyOo9UC&4-F%zJF=~S|$JR1*?O^@KnT1q{BmpEFbfwD{o{OTz~!o>+3XqW7=UN zPo$f7D%xs3y_9T3qZ{#cj!Z>`F$OJWxyp_fTYD@-SG1^L(&EV_P~^0Fv3k&l-yyVOQLBL{{O%J~=iz3s6OL@G-(hF5eoI3e z)$m|^X+RPdA8GmX)=bCv;sE_4F-G!y`P;{GW3X|k@%KOG2!Q;r_%4?#b^mUQR zKw=8+2d4TWJY@vML7xtokL`R^OU>d#(u&Y&*tZERovdp%*n4c|n0iH3s2l%PM`Q6+ zv#3?91hK%cW^RKaNKC2Wk8jVmPMpI9lm)PzmfZp1(?<3C2b}*Hu+FSAyGo&OS!RLS zPPdlWZol z6EACjWjofwtY?(19;>&U{?A4S4`6hNoGSaha0I3%(aqG5C_gzumdbkBf7&B%Wt+?h zh>928qH*$C$k162x)zD8C~arZLEnU7eNCF|CydmY-ww@-`k6aOnx~pU`UFoEFPs2t z;OTs0YQf|xiInv-@pqhR!@%3noc0%~(O^^P2{JDvK+biQva zJBRljBA@;>FyLMT0|OlK?3_J_r{YVmZI?fruw9?!x3?#2&0yy}|AYQM?6(8#m1&u` zrPcI{<}!`W#S&E7vssmJ1hDvfn$aBz*^Od_-ra+=@ic|-{pzoseFIOH17?SVzh(z- z>Kn5I)Y1JfQr~Ofqi(nX;{n=#z&Ps>!v(Gfz5hFvM%BZr4Y9ixtLvRqaM?N{oW*Ag z*9VHZ;aBnt(Z8NqrxHY_N5pro>z6FWz~2v=Uff3qmGL z)Oh3gCn{eqRx*-%4x#|{%SP)T^^0yjX+mfcP`~U105tw}CBuyX21vi|#dx`F@5sTz zNqe23?;nz36uQT9iQdX1XQoT$76nU=@k>|u@P-aviq@ks;A5E3`d-7J+oBe7Z_N9r zZ^Xjv9}hyxjNxH1^@#s(Tx;9XrLi_zsn`24FaXyPj7zs3UB;kZz4p9OyjUmMdt#ai z%+P0>2;?6%KuX)3iQqDSWi1*?akM=^&W{h9taEDGuFv*tLsc`h-7R6oRPa1h8ln%& zDcbld7kS3XW?10RnGTl?b@JTQnUK=krtsQ)IWqg|$KlXbQ7PRxy9Z#hZ?r8;BkJ40 zDd5~_m2{jT<;$;@I{GBtFyObFE^to0e_pqAcmMIx2X?#gBBrndOY*TqU$A_Yp0YuH3F7#91Yu0&cgePw4 z+{_y$c~SUUYCQ-IIRC++W+gw?Rd)86No%x9alOip9E3F-dbacL!j=#J5Vo`p@bD{y z{md$pZV)vaOP58>1i1M>f#wER|HZnJqtrEHA-V1QxeAH}Ifo{Z7H5OOXmK?=x;uDQDhSaB1YuT(c3 zRxz9eCBlpIpQCs*?ft9RMPqQ=@9tZyjYRm`T>!Wp+z!L z0)rr{Ld@dr3&c#`6Gh6~AHb!Xa1qXnsn)qA9|9MG(}+sxjJ&nnU=AU)5#^86rLXND z9)yhp@tJ3&;Ly_$dQ@R7`j#O>ZING7n+C*sP88PYLqGrn%@Dk`urvPtp6)Og8E#AF zvmprnwYWJa8T%)%e+I~pQoC0Ma|VIaf0Hgi2AGhgJb?*0wzzt?>Dk+x?^51BU8K_* z(=eElsT3&&QSIO8I5lK3_RZAKpE|olL1IAq9T66Bu=9E{^{+f;6d;6Sbc+F?S?@Lc z!Ta9h4)own#*qqvP{FH>t*zFOwI3hw_0 zFD_iY1yI;ygERSNssulXM*mHJVw6x#P*)4+1L;r1+}-(Qpl6*{k3gp`G=Vm03k9q^W@D;FuX<@+`5lX4Ma)aK`Yw+DIz@@%Rj-LK& z0S66M&7$lK3SH%R#qb?Q-{8QiY^)m#d;TNjU)1^kTW!!Qz_~yiNm@{p0iDAv$mSq` zk?pMT;|rnO#qQTQx)zBWH@XyXwiv`lPEAZme5$SWiWs^q10n4kHF0X@?5gWuya?2l zY!EADWM8WkD(z?_W7(q$>+x!S2Gl%iV&89XnQl`JJ=tfiI&Nj!^%6I<3KxBPPZ4OV zl7zrx;1Cp>*?TG|DB~c2HQ=W3gP29>IqJB`;g1|@VvtC_^8TPrnH{k9JvLHJb65CO zLx#s54ArN0<qb7J8jDe=4$l;O}nR&^K+JfH?x)$hg(&$z;l z!(N9zfl(t3kUB_D%N)tCk7(TSQ&_p21nl;xzeK)VD>C$REn7MgLIzl84QEinF(^?@ zv1kqFn}lElJ=?5Exx_{D@0|6Mk>L5j@B3>WFX&qQch`4V&J&_@Yy}eZA2@v&!4Fw= zr%=1mGEf-Upt&rOKWmNuWIcDkpdnpg*-6R+|8SI>)=_~skUGskq!NDL+`~=7wM{}4 zadoG<_-o^CUZ!aU1_4&^)OK2JSVmMy>zAk(o0HUwu4)oZ8?35QedX@c!7x4r>*KI| z!s8K26PK@|;2ki|N^`VG@7&BvaSTbmfgief%4lwE#~lP@jxp!6`ho1pi9DfFYiHL@ zhOr)qS2s_0-FTR1P|1yj+E5D@ehY|YheTy)&!zX~Ab}*+fw48iQ<#VKhE`{%ubhSR z0mH=xDeZ!k9ErjvsV&^31@Ag^D3~^lB^K#!M>xe?{!7+SsB-e{pL_N<^54uQM<+y~ zAjy;5CU1bw!zYWNyoK23JU7~TY6~X>L^hnzB(M=Ccm-r#*!kI>< zW*jD>@B}@ z54vGJk0`$OhA0Uk>~8p!%L5y34hfVhbPE<}7F4)r<-4=FN0~%6rB!%wVfGWzgH0}r z*n26IKby(#y;Ql|0Ws}r5crjyG-~B-M|AFNU2|oNe4ML#u>zlLh*H=;WEE2N69QEf zZZt6;eg7F%yHFm#(3jfm+WzAO{=m&wc+KQ4x_8GKWBaeX+}PM=nhO5yj>3YNOw=*6 z&WB(oou(kk8f7L}QIzApE(Lh2liKRw3v1BrN#31V_${#e32eqYvL@WkCeK_}3R)__fjTA*ghbf2I<0&%WlQIelT&#v@R)fvv%D zDDTtFmo69pL-=)Z7^hx*5{Jf7@JAI)$>Y0;`Pw#INOMMBDYMJpEDxwvq#BM zo9I^q8nF80w@Wdcu+~_Zv(do~o~{Dk2RD5M2Ohb;@H zde+ID#*a1n)Yf7i$$29$Z=TsXL8MGi1(eyHD}n4u`irGI4P;U>e51wdom~2JHtu5X zBs!m&co@*HvM3)!s1zSnd2Xra5|wOLeWC{w*hY&MN#31vqG3ajWI-Y1cw>5%&)jOe z%YZTU+#48EACv-b2lUL9Y42c3jB=sy61xA%h~-bZWM44#t6ApzKX35n)XQ<(lj{cG zRVz>Z!>jJOL|Ya1w;J^qwm26UXfGHalig;HWaYfo$i$3_{wqA(G^}jlP>C4xv7$h@ zr-zjn>Y*=wBNJmZ6e({M&Wk$HiGham;{H+k977Si+3fw$@EsB>5{mxr5EhiplPnd&;)P89 z@Y_GNq*WZl6Eo}wh11m#mCY$B_*k8HPyM59k9Nyfmha*NvOGZo%t)Qm$Y_ZXI*obW zCPmv%8|R?ZXPhah?k0wUj&<8e=IM|3;vb8rW@p=f0*v>%kX}+Qx_RmMuIW-3t)nXb zHuvZCVLF(Q#BuIqz0}LO zpv=NI3T8z+82HQos*nHgPl(uey|4R)@>Y3&3r>p|M|K+uu<#j|y)+=qx>#ARwDci!JBMjZ>IhbM_ z%U2PJms;h<%1~}msz!|QPpRh(D6diGO29_6U;sLT;4R+>yI>x(s7)dS<)` zOu-`-hGa7grq4S36w3TUAa$#%?`6D07|m9V@VO?hDPFuSU0kg{!*M=OZP{9^K=dWPPL zXh|E;{C7#qLEFGNX_^Ewgb7Zb(KTjYe^Y9+75Hd)E_4pXcV#9r|LG%=0W$su=Ll8G zBwutW^#I3u@DpFi;c6KS&tF{Ue>C@%HOckJQ{pM zHq2FU0sEgKIVb|cOXM{&cJR5WOn?D>h*uU6DX$ja@HT72U(of~LVg#cBxd|MEXiLD(?)Z~IkG&OHFqbvF@;d~y@sVB^AQCg1V)>yWq;Z*1YGHk zRuZNNsE4ZrjP8|G65WA2Tf5S+KX0usUD>bcEl!pKYXXKxdb><+XbB#^Ns%b9#@OOU z9F5Vo*Q=-CL4x_nAQjWsk5w2@ z@+d|RoERR7S3WFe`O})M>HF*@#dCke)1nZN1Qv#ZwPAB65+W~GCm+KGk&>_i1Iz-D z*Q_Zfjm}gey)P0YF!F(AGL~bfw0`v(2n!28B|FMHwS~WDRhii=m-P<)YGdfUSL()J z`>I<}L{*a@h3pC}i;$$3g+1Tf+xsaeCkI+IH8k9^tzJ-N_#>+I!Dq9+i`BD3{EZr& zr7By~@3pZ#FpTK^Mu-Hlmqld{hd0sSSqe-;FkmWEPjoPLxrkYQzS>a-k%I;H*qjgZ zxKJLtN(xC%zsh`D#TDx+yAPmZkn@;;EoI?fIeB_}y8;B>vI>+Bu^ZbTOrmUuw3C#) zey6a{M3|olLulDH8m>4ge85vHU&}hgBul$NQ%&Pnp*QRpI(g4?q~x66jB4XdpwZOS zlub*Zq*RM|PX#WS&c);e(|{GrtoI)#8254*W$P-rh2$ z`Jn>lrKYp^7Jy9E&4y0D0k5AO`|YXfgtl}5wPt6^6lGM~0s-TVOpcsbDyFZHfz^FN zKJ5)vR}ehl7Q4F6V$7fnc|=7IIYD#bjGUcNH3i0r-k)MPx{*Z&~@uuFIC%i zK7kSu+LsG^{kaa-kCgO;ZGMmf{Z&AuQLn#av@wOrd%pxW)m`NA5ELfFMDhyAV_Mx^ zs3R#|8bbe?12M%_UawvBFc@&f;ouF+~U1VnX zG=nAlp!ZavLuWe(6%1=7C<9J}7-D&8LB%VdejsM2pa;h`H4sjtpD>!3Cgg2a8*4c3 z!TK@b*Uz+KF9L45(;QN@ga(|GxWre+oGxaz0 z<3O z{19G>Yi)l%RtwN+AV5;sTI00eTFX)al?I4e&%52tU+LJ|m{vzQVxH6i@|!dWksdzm z7nFE9v5=;bj*V^{cFD1vvjGysxLr$6qtBV;bNZIjLQ0pZxQtxK&0a23^>w8Z#XBP5Pm%%95(X~C}J{lw%aT=@NG1UDt-9N_d&Xh$0PEu~4e2gf2Pm2zoIL zLa?Royqhdgu$yu6T;Nx9Q;7Z@Oa(Fo-UH%_e!!3$zB^{kuk6DI@KOc}vl4iitQ4=Y zYj?`Rmt^_sw>~D6C$e#ed0FF%ha!HR)ycZTeI29E__|3qXGt|*q44J!ycXlaN+C*g zyoEgW*)YkpKqDf$*{(T2>{Na*7X>qw?>syY!uD=~vY<0ybLNGAd7uFz#gv#|qC(*-Hok=@}8Ja`;z*u)|(-*xenXy(JlAXq!5hswRlM~cH zAD*J{GK8_#eg&3%Mml@~kytg~@g+$HOz5-BWl;3`E`_X%`E0WbX_Z1kXlRI2f>`Z! zFGw$wep<}2D!tj+rIIONv1bS=)(Z#;%lw#iQz z!oaq+h1UB9ZXV4^*#?p!_h@GBJ4E?9JR4;E>?EzpSXC~E&WEgyzwxrPi70Mp$jr)0 zs{U*~BJ}QK_b-d^bNx~clCx&_t#(vKPKbpdW z@vER}^K_RuD~%Z4`Szyo(lL+A_XBq)Ljd5f$(RiTrDGhOaQ^^(8CJ@StGYfy&OI47iZ`S7`C2D9)k>C~l@kQCZ_=p74wSx8YP| zkKps_QCU+uKS&9+I>$K1i-8wzGfCQilUxm=FM|fu5-0236@90az!p}a1Wo?yE=oQw zzxX0i5nmRdz9W=*zY6vc@*t-YaT^W%bcu*&_>4(H$Zc6@Q+=Wo-*?J3Bk6{yeq%l~`x+ zT_U%;SXF`})_#;0E`nEe=#K;!%KaR^#VA??J?@#sW2>*PFBOaP_4OS)J3Qo2qWxF1 z0!jho`xj(&1Lzdhf^B2PiqKV{dQGv3`4pl$6eD;>fy}Lz~jq za@?Q+5rmJ5PX7S9uBgJzV;qlqj50K zAw)at!MqbFMx_;6! zMIAmHT7HuVqiCW)>y;?~Sw*$@-R7uQ$a@J(Y4eqMNKWw3Q|<~ zj3-}_%-eo1<9yP>ASP~H0pVbKKwQ(;k0bR1mk}bH$wDhu?|~I$%R;aBeHJxp_BC!~ z+mA+7HZj*4o=E*kmlC;00T;^oNzem_ITNMF-y>9pZq{ks+(Y1fd-pzJ==jI_S08&Q zfg$vJ9II6#NWF@Qq*9eHvQvjcZHyEv)#ER)+x&MF;Z=A2alkMegFogXw|Qoh9nXO2 zu&iiR-*m)l0|r@|aGC=~g(^dsciJD@LMT3t0MXA5_fu6k+tN=PlexAZi9*Lix$$Pw zKWFxO*S}&yP`@l?#78SVDQh91f4dnCX%@Dj^`TxfK}h_F$24HXI9HtXpuSY=7$3YD zO0+>yL3n~i^)3gE7H#n5GW+^JRzO1jY1HdbEEjXV(b~QrejoLGI|jS(zSH8`{w1ab zFSP)U&83&o9rTB1%Xg`D@aU4exv)Vsiv5rfR?_HhegUNO=-Dt=k6b)9uK92MEnGFP z_A(O&7njAfIu1k~Fi#L)M?=kUEXG=$w_6 z2Jc+Tk?@k$r&*$!&WwmL!pkxl$ylrq%h!YAdL{Sx=?_^vWFjjO6h+lb$XPtEw@G}H z2Qju&g?tDVzpBqQAUea_Oxvua)4z%oOkd|jaaMUFzs9)&{0O!$?x0*6Bw`hXnu7h= zoUjB>Om_PEDWqmxHhi%2l1&Rq1%!Ut$8j^tR6AR1&xYcQP%it_&ogTuFYml0kqw}C z!ld@It*+HCQZO^P>w&RX6t82K{kWJ zmLr9LP*g6g-(Z8XIh`Rm?nSi*F1B~GhB?7xu1zVd7~1oa(N?ZKqdUoRrI zy^};A<8&rRCA}0;Gkd4$j81% zNssevM3Ga#A0EEH0(!3>(vhP(JIph{d1bj?p)(+c%}EfByuD^4^~uWtG2n5^!$36`A#qp3KN zh)>M3IQ}1l%`s(mOM5gcz$T4?{U06=KjStx03;CL)SAOp}nYMpldUUI3G3# zdLR4DN0Cb&_;42&`F($CHinDN4UZ%YLI{p1_W55JccgIKdRor~9m_5t}Ps}3tYg-+;jXWNA3)3B;WdF@cM}8i%2T7p9nJ<&B;rmfT z0fIxO&|%wO^tEgUa+{nkiujRoatB})7lJy_RZ@{N5V6HRjFr>{^lsGtl6M%LOkWU8 zkdASK)XZr;dwoT=!1LunUGRKU`!ltysc((co#&;6N4L)AcPm0|F8?ZwkleHz-nRbs z`A33jvA46#vH-2qnaCL7$wzGKaEngiaJ7&lOPw48!genUQD#Xcc-@n6VZM5s{OQV| zR-W0jv{#W^$Ivn1JHhIzg~~K}ca9p_@}0>EIA`toezrz;UK8@m0^t%bk(+5}|3itkhtZefOmehXev?VEZg z!ru3yGqA&m5ZNJJLoW%S&Gem(u3I`ztXA(lcMi83A?n}8T=?6CeOpe}&@*oDM6M8Q zy;f6J!iHKqo+xCDV%j}<;20xP*#EwF#`QaB<*e%}K zUDdNq8y`WPvHd%@{PGRbR>rk6j$AxPAGDt+IvhNtkG3CG^qzg#n3w75oKJqXMVd`_ zb)Mzd#eL`Z^0WXWE2ZZg;F8^a7wGyZ+H!=$MY=e4v2ba^+CRhIsVKkJ#b-{+{9;*N zuB)?VOa7G5F^~}P#vlH>>wB5Tvx+)``EU0D;%8M&e%&A6VdOM-^D81QU1Tfn#m=#c zry1mERrSFVAeYyxd=B1iF%4z8n_D)r3zGYi%Tjkc4CQKW!>ffucCRR}5mZ`2N9zMm z-C4_UHwQl1eGW%0o0uGbbxRzLhAyt~*EINl)Q2Lu*X32Km;F8@1m#}L_116S=0@)w z?%$byA_2Qw|Ks;Uopbf<&7$zh_y@llN4&cjPl*QaMO$~QXY454BU^DTwvVCr;aWl6 z;DnvjREuD32zi?0rIv#oY&*H+^m|2(sXbPF$;q%KO(&LpaoVtk_4(>yW7W2=KHNV- zD#>fosC@l9iakef-^VM;)6a3o483oskrCqWMI4?%FFy;#{^L>_Nz8u?_*SS?e2H)UCi-42Aqv$Sr_q*UrG2ElLGs{t&9S%Y!K`CDh)6OfPx*drX zd7PNFwr9(w%yCUivzJxoAa`H{sox83*oG6521#zyZG!)3x0CxC=JqdP`S0zPj2}4y zlL7#!|HCf~^XaTo>R;&CWFbvno+{M_haRtbhW6Y>I)A%nU13CDxp)rJe3Bp~F;*oL z=eq5uQ*j&uPz7*}53_u1rT%{M(+l!nM40|;ZFNYMy-LV-uAQhsh$}tt^weos9K>79 z_EdU1u8v#I@_*YtVlChJ7lQx4Z@*)L&^0z829QW3Seu4L+_kl=Q0G(SYvyZCRv5g= zTFcYS-b|Zga}UjpG>nes=St{O zINs5+`o#uG1{=jf-@z{A_@!k5)BH`D`@phpewA~D?W8eMtN4A;^r@y)2##~n`on>G zn#EmeqYw1Fv#}30Sr3k^-Ym}XV8<@tov_*0skPv9h(2n=x1qU6%YJsZ>th z+YZJDNFgIWga>4f_E4joNW2=7>`Rwd=+nvO<4}BoLytjz1yPv2(zdbQKI5;t`Qv63 z>t;Q)A-QWz*gz{8DF^M`&KEa0L0e77_Tbw7c^wak2ZI|V_9Sh2e%ud?8-^1#|C61Q zK)9Ng`%^{CW`wp7=70*~%)L4kFB&VBCJJXOIZWI=yLaMAlY|Yrs*KqmbHa$MXs*=VQv6Jz@v@V)cL2HZny6rX(@8;q0g;xoN#q8^Q!Tp$> z?MxvqKe3ei+6VS%^t0$f2>G#3D)roTZAXJ!e6<#4PR73M1GO7^sNQ!RY_~PJf05)* zrX*<^a4yOETvm-*kH8LYpI=D%=zo27_+8sd z)@Q?#FLxml@Hg9W;KO!zWzbjS|;<6MZKkq_||k7FBVor?m0) zPed@2g2bdBWKJhXwas>GLWS`Y?0wz2fQUMhB2%Jo-H;)!7xx!>=hFEu&9k^N8Z`@N zlgxWhh3J4+8VvI2=D_p&o12_iab-l14$D zhi_a&7V(s<#$%dNlwb$1Stwow#eNxTq~>5>Y?ohj8j`l&&iF~UQnK&px3Ff7;HY2~ zO7SEE$9Upz?fq8$UDuC;&Qb9J(4C!8*HUixSL!wB?|1HEU!rlG?#FiD)^JMo6QCMb zY|Ol5utIN#QJcF^#M=!n{AVbvrYL~-8x(tg9EN%_?+RU=)}&d}Kky$`WB(+nEm2OR zxO{XsZp_K!Z5|@nk>{sZ0juZA*R%hT zaw%r_Zco#0uUuh+Tuk$+k?gykB-eg2D$GbSc(3;44{wEqG9BKcw~57|5*J(_eoy0a zncaDz<_9{>xhBnQ_^Fu-XC~wtNHsI)f4ZsAXQgYO&pZmT*@rSwFE?2%t@ZDmp2?|; zqI(8cO(qTZL->Qa+XNB zu^Zfab~kswSVX?5@w##8wPvLuE_@CDXkUe213SA8PS81A!CxH%5i;HF8k59y4wD=THKB1{)8EMAC{df#vs9*{4o%e= z%J@&cG5Nrq!1=yyg?IWMmOnljx;&TxV^L?^`7%H0A5+c12 zD9O%Q{SarG!>shAI*~q`b5VB;TV@x#2EFr$LzWB= zZ`3ocntaHMh5d16WY$I=nscrioVkI4D-t;npeh5j^dG`yz7~N?d{vPGIr`1UgL0!s zNw`xSdIo!vDFeO+&6@!-3!imUxdu)XIT3Mvku}dk1K`K8OiN=0%}4(Qxg39B0)5@B zrEe3vDu9KvzR5Fe4qa5jLf1X8gmoS4V6^Zi@&2wvCISP0BPcD@_>W-==R+@h-N9A5 z@84Z} "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/bonus.js b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/bonus.js new file mode 100644 index 00000000..625200c5 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/bonus.js @@ -0,0 +1,111 @@ +// // BONUS: REDUCE NUMBER OF SWAPS +// function partition(array, low, high) { +// const pivot = array[high]; // choose rightmost element as pivot +// let pivotIndex = high; // store index of pivot +// let i = low; + +// while (i < pivotIndex) { +// if (array[i] <= pivot) { +// ++i; +// continue; +// } + +// const beforePivot = pivotIndex - 1; +// [array[i], array[beforePivot]] = [array[beforePivot], array[i]]; +// --pivotIndex; +// } +// // SWAP ONCE AT END OF LOOP +// [array[pivotIndex], array[high]] = [array[high], array[pivotIndex]]; + +// return pivotIndex; +// } + +// SUPER BONUS: USE MIDDLE AS PIVOT +function partition(array, low, high) { + const middle = Math.floor((high + low ) / 2); + const pivot = array[middle]; // choose middle element as pivot + [array[middle], array[high]] = [array[high], array[middle]]; // swap middle to end + + let pivotIndex = high; // store index of pivot + let i = low; + + while (i < pivotIndex) { + if (array[i] <= pivot) { + ++i; + continue; + } + + const beforePivot = pivotIndex - 1; + [array[i], array[beforePivot]] = [array[beforePivot], array[i]]; + --pivotIndex; + } + // SWAP ONCE AT END OF LOOP + [array[pivotIndex], array[high]] = [array[high], array[pivotIndex]]; + + return pivotIndex; +} + +function quicksort(array, low = 0, high = array.length - 1) { + if (low >= high) { + return array; + } + + const pivotIndex = partition(array, low, high); + quicksort(array, low, pivotIndex - 1); + quicksort(array, pivotIndex + 1, high); + + return array; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [1, 2, 3, 4]"); + console.log(quicksort([3, 2, 1, 4])); + + console.log(""); + + console.log("Expecting: [1, 2, 2, 3, 4]"); + console.log(quicksort([1, 2, 2, 3, 4])); + + console.log(""); + + console.log("Expecting: []"); + console.log(quicksort([])); + + console.log(""); + + console.log("Expecting: [1]"); + console.log(quicksort([1])); + + console.log(""); + + console.log("Expecting: [2, 4]"); + console.log(quicksort([2, 4])); + + console.log(""); + + console.log("Expecting: [1, 2, 3, 4, 5, 6, 7]"); + console.log(quicksort([1, 2, 3, 4, 5, 6, 7])); + + console.log(""); + + console.log("Expecting: [7, 6, 5, 4, 3, 2, 1]"); + console.log(quicksort([1, 2, 3, 4, 5, 6, 7])); + + console.log(""); + + console.log("Expecting: [4, 4, 4, 4]"); + console.log(quicksort([4, 4, 4, 4])); + + console.log(""); + + console.log("Expecting: [-10, -10, 0, 1, 2, 3, 4, 8, 9, 10, 87]"); + console.log(quicksort([-10, 8, 4, 3, 9, 10, -10, 87, 2, 0, 1])); + + console.log(""); +} + +module.exports = quicksort; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/bonus.rb b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/bonus.rb new file mode 100644 index 00000000..f5b4dc3b --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/bonus.rb @@ -0,0 +1,106 @@ +# BONUS: REDUCE NUMBER OF SWAPS +# def partition(array, low, high) +# pivot = array[high] # choose rightmost element as pivot +# pivot_index = high # store index of pivot +# i = low + +# while i < pivot_index +# if array[i] <= pivot +# i += 1 +# next +# end + +# before_pivot = pivot_index - 1 +# array[i], array[before_pivot] = array[before_pivot], array[i] +# pivot_index -= 1 +# end +# # SWAP ONCE AT END OF LOOP TO PUT PIVOT IN CORRECT LOCATION +# array[pivot_index], array[high] = array[high], array[pivot_index] +# pivot_index +# end + +# SUPER BONUS: USE MIDDLE AS PIVOT +def partition(array, low, high) + middle = (high + low ) / 2 + pivot = array[middle] # choose middle element as pivot + # SWAP MIDDLE TO END + array[middle], array[high] = array[high], array[middle] + + pivot_index = high # store index of pivot + i = low + + while i < pivot_index + if array[i] <= pivot + i += 1 + next + end + + before_pivot = pivot_index - 1 + array[i], array[before_pivot] = array[before_pivot], array[i] + pivot_index -= 1 + end + # SWAP ONCE AT END OF LOOP TO PUT PIVOT IN CORRECT LOCATION + array[pivot_index], array[high] = array[high], array[pivot_index] + pivot_index +end + +def quicksort(array, low = 0, high = array.length - 1) + return array if low >= high + + pivot_index = partition(array, low, high) + quicksort(array, low, pivot_index - 1) + quicksort(array, pivot_index + 1, high) + + array +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [1, 2, 3, 4]" + print quicksort([3, 2, 1, 4]) + puts + + puts + + puts "Expecting: [1, 2, 2, 3, 4]" + print quicksort([1, 2, 2, 3, 4]) + puts + + puts + + puts "Expecting: []" + print quicksort([]) + puts + + puts + + puts "Expecting: [5]" + print quicksort([5]) + puts + + puts + + puts "Expecting: [2, 4]" + print quicksort([2, 4]) + puts + + puts + + puts "Expecting: [1, 2, 3, 4, 5, 6, 7]" + print quicksort([1, 2, 3, 4, 5, 6, 7]) + puts + + puts + + puts "Expecting: [4, 4, 4, 4]" + print quicksort([4, 4, 4, 4]) + puts + + puts + + puts "Expecting: [-10, -10, 0, 1, 2, 3, 4, 8, 9, 10, 87]" + print quicksort([-10, 8, 4, 3, 9, 10, -10, 87, 2, 0, 1]) + puts +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/quicksort.js b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/quicksort.js new file mode 100644 index 00000000..ac22c745 --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/quicksort.js @@ -0,0 +1,146 @@ +function partition(array, low, high) { + const pivot = array[high]; // choose rightmost element as pivot + let pivotIndex = high; // store index of pivot + + // iterate over the portion of the array that needs processing + // use a while loop to control the index, we only want to increment it + // if we encounter an element that's less than or equal to the pivot + let i = low; + + while (i < pivotIndex) { + if (array[i] <= pivot) { + ++i; + continue; + } + + const beforePivot = pivotIndex - 1; + // swap the higher valued element with the one just before the pivot + // then swap the element just before the pivot with the pivot + // then update the pivot index since it moved + [array[i], array[beforePivot]] = [array[beforePivot], array[i]]; + [array[pivotIndex], array[beforePivot]] = [array[beforePivot], array[pivotIndex]]; + --pivotIndex; + } + + return pivotIndex; +} + +function quicksort(array, low = 0, high = array.length - 1) { + if (low >= high) { + return array; + } + + const pivotIndex = partition(array, low, high); + quicksort(array, low, pivotIndex - 1); + quicksort(array, pivotIndex + 1, high); + + return array; +} + +if (require.main === module) { + // add your own tests in here + console.log("Expecting: [1, 2, 3, 4]"); + console.log(quicksort([3, 2, 1, 4])); + + console.log(""); + + console.log("Expecting: [1, 2, 2, 3, 4]"); + console.log(quicksort([1, 2, 2, 3, 4])); + + console.log(""); + + console.log("Expecting: []"); + console.log(quicksort([])); + + console.log(""); + + console.log("Expecting: [1]"); + console.log(quicksort([1])); + + console.log(""); + + console.log("Expecting: [2, 4]"); + console.log(quicksort([2, 4])); + + console.log(""); + + console.log("Expecting: [1, 2, 3, 4, 5, 6, 7]"); + console.log(quicksort([1, 2, 3, 4, 5, 6, 7])); + + console.log(""); + + console.log("Expecting: [7, 6, 5, 4, 3, 2, 1]"); + console.log(quicksort([1, 2, 3, 4, 5, 6, 7])); + + console.log(""); + + console.log("Expecting: [4, 4, 4, 4]"); + console.log(quicksort([4, 4, 4, 4])); + + console.log(""); + + console.log("Expecting: [-10, -10, 0, 1, 2, 3, 4, 8, 9, 10, 87]"); + console.log(quicksort([-10, 8, 4, 3, 9, 10, -10, 87, 2, 0, 1])); + + console.log(""); + + // testing partition + let pArray = [3, 2, 1, 4]; + console.log("Expecting: 3, [3, 2, 1, 4]"); + console.log(partition(pArray, 0, pArray.length - 1), pArray); + + console.log(""); + + pArray = [3, 2, 1, 2]; + console.log("Expecting: 2, [1, 2, 2, 3]"); + console.log(partition(pArray, 0, pArray.length - 1), pArray); + + console.log(""); + + pArray = []; + console.log("Expecting: -1, []"); + console.log(partition(pArray, 0, pArray.length - 1), pArray); + + console.log(""); + + pArray = [3]; + console.log("Expecting: 0, [3]"); + console.log(partition(pArray, 0, pArray.length - 1), pArray); + + console.log(""); + + pArray = [1, 2]; + console.log("Expecting: 1, [1, 2]"); + console.log(partition(pArray, 0, pArray.length - 1), pArray); + + console.log(""); + + pArray = [0, 4, 2]; + console.log("Expecting: 1, [0, 2, 4]"); + console.log(partition(pArray, 0, pArray.length - 1), pArray); + + console.log(""); + + pArray = [2, -10, 7, 0, 1, 3]; + console.log("Expecting: 4, [2, -10, 1, 0, 3, 7]"); + console.log(partition(pArray, 0, pArray.length - 1), pArray); + + console.log(""); + + pArray = [2, -10, 7, 0, 1, 3]; + console.log("Expecting: 2, [2, -10, 0, 7, 1, 3]"); + console.log(partition(pArray, 1, 3), pArray); + + console.log(""); + + pArray = [2, 1, 0]; + console.log("Expecting: 0, [0, 1, 2]"); + console.log(partition(pArray, 0, 2), pArray); + + console.log(""); +} + +module.exports = quicksort; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/quicksort.rb b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/quicksort.rb new file mode 100644 index 00000000..ee6172bd --- /dev/null +++ b/12-week-9--searching-and-sorting-continued/03-bonus--quicksort/solutions/quicksort.rb @@ -0,0 +1,137 @@ +def partition(array, low, high) + pivot = array[high] # choose rightmost element as pivot + pivot_index = high # store index of pivot + + # iterate over the portion of the array that needs processing + # use a while loop to control the index, we only want to increment it + # if we encounter an element that's less than or equal to the pivot + i = low + + while i < pivot_index + if array[i] <= pivot + i += 1 + next + end + + before_pivot = pivot_index - 1 + # swap the higher valued element with the one just before the pivot + # then swap the element just before the pivot with the pivot + # then update the pivot index since it moved + array[i], array[before_pivot] = array[before_pivot], array[i] + array[pivot_index], array[before_pivot] = array[before_pivot], array[pivot_index] + pivot_index -= 1 + end + + pivot_index +end + +def quicksort(array, low = 0, high = array.length - 1) + return array if low >= high + + pivot_index = partition(array, low, high) + quicksort(array, low, pivot_index - 1) + quicksort(array, pivot_index + 1, high) + + array +end + +if __FILE__ == $PROGRAM_NAME + puts "Expecting: [1, 2, 3, 4]" + print quicksort([3, 2, 1, 4]) + puts + + puts + + puts "Expecting: [1, 2, 2, 3, 4]" + print quicksort([1, 2, 2, 3, 4]) + puts + + puts + + puts "Expecting: []" + print quicksort([]) + puts + + puts + + puts "Expecting: [2, 4]" + print quicksort([2, 4]) + puts + + puts + + puts "Expecting: [1, 2, 3, 4, 5, 6, 7]" + print quicksort([1, 2, 3, 4, 5, 6, 7]) + puts + + puts + + puts "Expecting: [4, 4, 4, 4]" + print quicksort([4, 4, 4, 4]) + puts + + puts + + puts "Expecting: [-10, -10, 0, 1, 2, 3, 4, 8, 9, 10, 87]" + print quicksort([-10, 8, 4, 3, 9, 10, -10, 87, 2, 0, 1]) + puts + + # Don't forget to add your own! + # testing partition + pArray = [3, 2, 1, 4] + puts "Expecting: 3, [3, 2, 1, 4]" + print(partition(pArray, 0, pArray.length - 1), pArray) + puts + puts + + pArray = [3, 2, 1, 2] + puts "Expecting: 2, [1, 2, 2, 3]" + print(partition(pArray, 0, pArray.length - 1), pArray) + puts + puts + + pArray = [] + puts "Expecting: -1, []" + print(partition(pArray, 0, pArray.length - 1), pArray) + puts + puts + + pArray = [3] + puts "Expecting: 0, [3]" + print(partition(pArray, 0, pArray.length - 1), pArray) + puts + puts + + pArray = [1, 2] + puts "Expecting: 1, [1, 2]" + print(partition(pArray, 0, pArray.length - 1), pArray) + puts + puts + + pArray = [0, 4, 2] + puts "Expecting: 1, [0, 2, 4]" + print(partition(pArray, 0, pArray.length - 1), pArray) + puts + puts + + pArray = [2, -10, 7, 0, 1, 3] + puts "Expecting: 4, [2, -10, 1, 0, 3, 7]" + print(partition(pArray, 0, pArray.length - 1), pArray) + puts + puts + + pArray = [2, -10, 7, 0, 1, 3] + puts "Expecting: 2, [2, -10, 0, 7, 1, 3]" + print(partition(pArray, 1, 3), pArray) + puts + puts + + pArray = [2, 1, 0] + puts "Expecting: 0, [0, 1, 2]" + print(partition(pArray, 0, 2), pArray) + puts + puts +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/.gitignore b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/README.md b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/README.md new file mode 100644 index 00000000..57abf449 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/README.md @@ -0,0 +1,139 @@ +# Days 1 to 2: Create a Queue Class Using Nodes + +Previously, we created a Queue class using an Array as the underlying data structure. For this challenge we'll recreate the Queue Class but with Nodes instead, similar to a Linked List. We'll then calculate the time complexity using Big O notation for each of our Queue class methods, so we can see how this change affects the runtime. + +## What Is a Queue? + +A queue is a data structure where items are processed in first-in-first-out order (FIFO). It has two ends: a front and a rear. The front is where items are dequeued from first, while items at the rear are handled last. Items are added to the rear of the queue. A queue operates a lot like a queue at the checkout of a grocery store. Customers join at the end of the line and are served at the front of the line. + +## Implement the Queue Class + +Our Queue class will track its front node and its rear node. We will assume that nodes will be added to the queue one at a time. They will also be removed one at a time. Each node will have two attributes: `data`, which tracks the value the node stores, and `next`, which points to the next node in the queue. In Ruby, the next attribute will be called `next_node`, since next is a reserved keyword and we'd prefer to not use confusing syntax. + +Let's implement the following methods for the Queue class: + +### `enqueue(data)` + +`enqueue` adds a node to the back of the queue using the provided data. + +``` +queue = new Queue() + +queue.enqueue("first") +queue.front +=> Node, data: "first", next: nil + +queue.rear +=> Node, data: "first", next: nil +``` + +### `dequeue` + +`dequeue` removes the node at the front of the queue and returns it. Don't worry if `dequeue` is called on an empty queue. It's OK for it to return the default return value, such as `undefined` or `null` or `nil`. + +``` +queue = new Queue() + +queue.enqueue("first") +queue.dequeue() +=> Node, data: "first", next: nil +``` + +### `peek` + +`peek` returns the node at the front of the queue without removing it. If the queue is empty, use the default return value, e.g. `undefined` or `nil`. + +``` +queue = new Queue() + +queue.enqueue("first") +queue.peek() +=> Node, data: "first", next: nil + +queue.front +=> Node, data: "first", next: nil +``` + +### `isEmpty` + +`isEmpty` returns `true` if the queue is empty, otherwise `false`. + +``` +queue = new Queue() + +queue.isEmpty() +=> true +``` + +### `size` + +`size` returns the number of nodes currently in the queue. + +``` +queue = new Queue() +queue.size() +=> 0 + +queue.enqueue("first") +queue.size() +=> 1 +``` + +### `search(target)` + +`search` returns an Integer representing how far the target node is from the front of the queue. If the node is not in the queue, return `-1`. Example: + +``` +// queue = 1, 2, 3, 4, 5 <- rear + +queue.search(5) => 4 +queue.search(4) => 3 +queue.search(6) => -1 +``` + +## Calculate Time Complexity + +When you are done implementing the class, determine the time complexity for the following methods and compare that to the time complexity for when an Array is used as the underlying data structure: + +- `enqueue`: Time complexity when using an Array is O(1) +- `dequeue`: Time complexity when using an Array is O(n) +- `peek`: Time complexity when using an Array is O(1) +- `search`: Time complexity when using an Array is O(n) + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/package.json b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/package.json new file mode 100644 index 00000000..d1142529 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "queue", + "version": "1.0.0", + "description": "build a queue class", + "main": "queue.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/queue.js b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/queue.js new file mode 100644 index 00000000..cf6a96f5 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/queue.js @@ -0,0 +1,60 @@ +class Node { + constructor(data = null, next = null) { + this.data = data; + this.next = next; + } +} + +class Queue { + constructor(front = null) { + this.front = front; + this.rear = front; + } + + // ADD NODE TO BACK OF QUEUE + // USE DATA TO CREATE A NEW NODE AND ADD IT TO THE QUEUE + enqueue(data) { + + } + + // REMOVE NODE FROM FRONT OF QUEUE AND RETURN IT + dequeue() { + + } + + // RETURN NODE AT FRONT WITHOUT REMOVING IT + peek() { + + } + + // RETURN TRUE IF QUEUE IS EMPTY, OTHERWISE FALSE + isEmpty() { + + } + + // RETURN NUMBER OF NODES IN QUEUE, E.G. 10 + size() { + + } + + // RETURN INTEGER REPRESENTING HOW FAR TARGET IS FROM FRONT OF QUEUE + // IF TARGET ISN'T IN QUEUE, RETURN -1 + search(target) { + + } +} + +if (require.main === module) { + // add your own tests in here + +} + +module.exports = { + Node, + Queue +}; + +// Write your Big O findings here + +// Optional: Please add your pseudocode to this file +// Optional: And a written explanation of your solution diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/tests/queue.test.js b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/tests/queue.test.js new file mode 100644 index 00000000..d5870ca0 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/javascript/tests/queue.test.js @@ -0,0 +1,118 @@ +const { Node, Queue } = require('../queue'); + +describe("Queue", () => { + describe("enqueue(data)", () => { + it ("adds a new node to an empty queue and sets the front and rear correctly", () => { + const queue = new Queue(); + queue.enqueue(1); + + expect(queue.front).toBeInstanceOf(Node); + expect(queue.rear).toBe(queue.front); + + const front = queue.front; + const rear = queue.rear; + + queue.enqueue(2); + + expect(queue.front).toBe(front); + expect(queue.rear).not.toBe(rear); + expect(queue.rear.data).toBe(2); + }) + }); + + describe("dequeue()", () => { + it ("removes and returns the front of the queue and sets the front and rear correctly", () => { + let queue = new Queue(); + + expect(queue.dequeue()).toBeFalsy(); + + queue = new Queue(); + queue.enqueue(1); + let removed = queue.dequeue(); + + expect(removed).toBeInstanceOf(Node); + expect(removed.data).toBe(1); + expect(queue.front).toBeFalsy(); + expect(queue.rear).toBe(queue.front); + + queue = new Queue(); + queue.enqueue(1); + queue.enqueue(2); + removed = queue.dequeue(); + + expect(removed).toBeInstanceOf(Node); + expect(removed.data).toBe(1); + expect(queue.front.data).toBe(2); + expect(queue.rear).toBe(queue.front); + + queue = new Queue(); + queue.enqueue(1); + queue.enqueue(2); + queue.enqueue(3); + removed = queue.dequeue(); + + expect(removed).toBeInstanceOf(Node); + expect(removed.data).toBe(1); + expect(queue.front.data).toBe(2); + expect(queue.rear).not.toBe(queue.front); + }); + }); + + describe("peek()", () => { + it ("returns the front of the queue without removing it", () => { + const queue = new Queue(); + queue.enqueue(1); + + expect(queue.peek()).toBe(queue.front); + }); + }); + + describe("isEmpty()", () => { + it ("returns true if the queue is empty, otherwise false", () => { + const queue = new Queue(); + + expect(queue.isEmpty()).toBe(true); + + queue.enqueue(1); + + expect(queue.isEmpty()).toBe(false); + }); + }); + + describe("size()", () => { + it ("returns the number of nodes in the queue", () => { + const queue = new Queue(); + + expect(queue.size()).toBe(0); + + queue.enqueue(1); + + expect(queue.size()).toBe(1); + + queue.enqueue(2); + + expect(queue.size()).toBe(2); + }); + }); + + describe("target(data)", () => { + it ("returns the distance from the front to the target, or -1 if not found", () => { + const queue = new Queue(); + + expect(queue.search(1)).toBe(-1); + + queue.enqueue(1); + + expect(queue.search(1)).toBe(0); + + queue.enqueue(2); + + expect(queue.search(2)).toBe(1); + expect(queue.search(5)).toBe(-1); + + queue.enqueue(3); + + expect(queue.search(3)).toBe(2); + }); + }); +}); diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/.rspec b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/Gemfile b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/queue.rb b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/queue.rb new file mode 100644 index 00000000..0cc0d5cc --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/queue.rb @@ -0,0 +1,58 @@ +class Node + attr_accessor :data, :next_node + + def initialize(data = nil, next_node = nil) + @data = data + @next_node = next_node + end +end + +class Queue + attr_reader :front, :rear + + def initialize(front = nil) + @front = front + @rear = front + end + + # ADD NODE TO BACK OF QUEUE + # USE DATA TO CREATE A NEW NODE AND ADD IT TO THE QUEUE + def enqueue(data) + + end + + # REMOVE NODE FROM FRONT OF QUEUE AND RETURN IT + def dequeue + + end + + # RETURN NODE AT FRONT WITHOUT REMOVING IT + def peek + + end + + # RETURN TRUE IF QUEUE IS EMPTY, OTHERWISE FALSE + def isEmpty + + end + + # RETURN NUMBER OF NODES IN QUEUE, E.G. 10 + def size + + end + + # RETURN INTEGER REPRESENTING HOW FAR TARGET IS FROM FRONT OF QUEUE + # IF TARGET ISN'T IN QUEUE, RETURN -1 + def search(target) + + end +end + +if __FILE__ == $PROGRAM_NAME + # Add your own tests in here +end + +# Write your Big O findings here + +# Optional: Please add your pseudocode to this file +# Optional: And a written explanation of your solution diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/spec/queue_spec.rb b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/spec/queue_spec.rb new file mode 100644 index 00000000..46f5a463 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/spec/queue_spec.rb @@ -0,0 +1,118 @@ +require './queue' + +describe "Queue" do + context "#enqueue(data)" do + it "adds a new node to an empty queue and sets the front and rear correctly" do + queue = Queue.new + queue.enqueue(1) + + expect(queue.front).to be_a(Node) + expect(queue.rear).to be(queue.front) + + front = queue.front + rear = queue.rear + + queue.enqueue(2) + + expect(queue.front).to be(front) + expect(queue.rear).not_to be(rear) + expect(queue.rear.data).to be(2) + end + end + + context "#dequeue" do + it "removes and returns the front of the queue and sets the front and rear correctly" do + queue = Queue.new + + expect(queue.dequeue).to be_nil + + queue = Queue.new + queue.enqueue(1) + removed = queue.dequeue + + expect(removed).to be_a(Node) + expect(removed.data).to be(1) + expect(queue.front).to be_nil + expect(queue.rear).to be(queue.front) + + queue = Queue.new + queue.enqueue(1) + queue.enqueue(2) + removed = queue.dequeue + + expect(removed).to be_a(Node) + expect(removed.data).to be(1) + expect(queue.front.data).to be(2) + expect(queue.rear).to be(queue.front) + + queue = Queue.new + queue.enqueue(1) + queue.enqueue(2) + queue.enqueue(3) + removed = queue.dequeue + + expect(removed).to be_a(Node) + expect(removed.data).to be(1) + expect(queue.front.data).to be(2) + expect(queue.rear).not_to be(queue.front) + end + end + + context "#peek" do + it "returns the front of the queue without removing it" do + queue = Queue.new + queue.enqueue(1) + + expect(queue.peek).to be(queue.front) + end + end + + context "#isEmpty" do + it "returns true if the queue is empty, otherwise false" do + queue = Queue.new + + expect(queue.isEmpty).to be true + + queue.enqueue(1) + + expect(queue.isEmpty).to be false + end + end + + context "#size" do + it "returns the number of nodes in the queue" do + queue = Queue.new + + expect(queue.size).to be(0) + + queue.enqueue(1) + + expect(queue.size).to be(1) + + queue.enqueue(2) + + expect(queue.size).to be(2) + end + end + + context "#target(data)" do + it "returns the distance from the front to the target, or -1 if not found" do + queue = Queue.new + + expect(queue.search(1)).to be(-1) + + queue.enqueue(1) + + expect(queue.search(1)).to be(0) + + queue.enqueue(2) + + expect(queue.search(2)).to be(1) + expect(queue.search(5)).to be(-1) + + queue.enqueue(3) + + expect(queue.search(3)).to be(2) + end + end +end diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/spec/spec_helper.rb b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/solutions/queue.js b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/solutions/queue.js new file mode 100644 index 00000000..819f3574 --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/solutions/queue.js @@ -0,0 +1,105 @@ +class Node { + constructor(data = null, next = null) { + this.data = data; + this.next = next; + } +} + +class Queue { + constructor(front = null) { + this.front = front; + this.rear = front; + } + + // ADD NODE TO BACK OF QUEUE + // USE DATA TO CREATE A NEW NODE AND ADD IT TO THE QUEUE + enqueue(data) { + const node = new Node(data); + + if (!this.rear) { + this.front = node; + this.rear = node; + return; + } + + this.rear.next = node; + this.rear = node; + } + + // REMOVE NODE FROM FRONT OF QUEUE AND RETURN IT + dequeue() { + if (!this.front) { + return this.front; + } + + const oldFront = this.front; + + this.front = oldFront.next; + + if (!this.front || !this.front.next) { + this.rear = this.front; + } + + return oldFront; + } + + // RETURN NODE AT FRONT WITHOUT REMOVING IT + peek() { + return this.front; + } + + // RETURN TRUE IF QUEUE IS EMPTY, OTHERWISE FALSE + isEmpty() { + return !this.front; + } + + // RETURN NUMBER OF NODES IN QUEUE, E.G. 10 + size() { + let count = 0; + let node = this.front; + + while (node) { + ++count; + node = node.next; + } + + return count; + } + + // RETURN INTEGER REPRESENTING HOW FAR TARGET IS FROM FRONT OF QUEUE + // IF TARGET ISN'T IN QUEUE, RETURN -1 + search(target) { + let node = this.front; + let distance = 0; + + while (node) { + if (node.data === target) { + return distance; + } + + ++distance; + node = node.next; + } + + return -1; + } +} + +if (require.main === module) { + // add your own tests in here + +} + +module.exports = { + Node, + Queue +}; + +// Write your Big O findings here +// `enqueue`: Time complexity when using an Array is O(1), with nodes O(1) +// `dequeue`: Time complexity when using an Array is O(n), with nodes O(1) +// `peek`: Time complexity when using an Array is O(1), with nodes O(1) +// `search`: Time complexity when using an Array is O(n), with nodes O(n) + +// Optional: Please add your pseudocode to this file +// Optional: And a written explanation of your solution diff --git a/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/solutions/queue.rb b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/solutions/queue.rb new file mode 100644 index 00000000..e411770d --- /dev/null +++ b/13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes/solutions/queue.rb @@ -0,0 +1,101 @@ +class Node + attr_accessor :data, :next_node + + def initialize(data = nil, next_node = nil) + @data = data + @next_node = next_node + end +end + +class Queue + attr_reader :front, :rear + + def initialize(front = nil) + @front = front + @rear = front + end + + # ADD NODE TO BACK OF QUEUE + # USE DATA TO CREATE A NEW NODE AND ADD IT TO THE QUEUE + def enqueue(data) + node = Node.new(data) + + if @rear.nil? + @front = node + @rear = node + return + end + + @rear.next_node = node + @rear = node + end + + # REMOVE NODE FROM FRONT OF QUEUE AND RETURN IT + def dequeue + return @front if front.nil? + + oldFront = @front + + @front = oldFront.next_node + + if @front.nil? || @front.next_node.nil? + @rear = @front + end + + oldFront + end + + # RETURN NODE AT FRONT WITHOUT REMOVING IT + def peek + @front + end + + # RETURN TRUE IF QUEUE IS EMPTY, OTHERWISE FALSE + def isEmpty + @front.nil? + end + + # RETURN NUMBER OF NODES IN QUEUE, E.G. 10 + def size + count = 0 + node = @front + + while node + count += 1 + node = node.next_node + end + + count + end + + # RETURN INTEGER REPRESENTING HOW FAR TARGET IS FROM FRONT OF QUEUE + # IF TARGET ISN'T IN QUEUE, RETURN -1 + def search(target) + node = @front + distance = 0 + + while node + if node.data === target + return distance + end + + distance += 1 + node = node.next_node + end + + -1 + end +end + +if __FILE__ == $PROGRAM_NAME + # Add your own tests in here +end + +# Write your Big O findings here +# `enqueue`: Time complexity when using an Array is O(1), with nodes O(1) +# `dequeue`: Time complexity when using an Array is O(n), with nodes O(1) +# `peek`: Time complexity when using an Array is O(1), with nodes O(1) +# `search`: Time complexity when using an Array is O(n), with nodes O(n) + +# Optional: Please add your pseudocode to this file +# Optional: And a written explanation of your solution diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/.gitignore b/13-week-10/01-days-3-to-5--build-an-lru-cache/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/README.md b/13-week-10/01-days-3-to-5--build-an-lru-cache/README.md new file mode 100644 index 00000000..228a332d --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/README.md @@ -0,0 +1,247 @@ +# Days 3 to 5: LRU Cache + +A Least Recently Used (LRU) Cache is a data structure that organizes items in order of use or access from most recently accessed to least recently accessed. It has a fixed length or is allowed to take up a maximum amount of space in memory, i.e. there is a limit to the number of items it contains. You can think of it as being similar to items in a kitchen cabinet: the items you use most often will likely be easy to see and within reach when you open the cupboard. The items you use less often will be behind those items, and the items you use least may be completely out of reach. + +## Why Use an LRU Cache? + +The short story is that it's faster to read data from a cache (such as on the RAM) than it is to read it from a database or hard disk. Since there is a limit to how much data we can cache, we have to come up with a system to determine which data stays and which data gets evicted from the cache. With an LRU cache, we evict the least recently used data once the cache is full. If you'd like the long story, carry on reading this section. + +Let's say we have a website where users can access many different stories. Our website gets a lot of traffic, and each visit results in a request to the database for a story. The responses to these requests are becoming slower and slower since accessing the database is expensive. We look at which stories our users are accessing most often and notice that there are 10 stories that most users access and those specific stories shift over time, i.e. the popular stories at 5PM differ from the popular stories at 10PM. This means we can cache this data, or these stories, on the server. When we do this, requests for these stories will not result in database requests. Instead, they will be quickly retrieved directly from the server's memory. + +We decide to implement an LRU cache! When a user makes a request for a story, we check if it's in the cache. If it is, we respond with that story and reorder the data in our cache to reflect that the story was the most recently accessed. If the story isn't in the cache, we make the request to the database, and then place the story in the correct place within the LRU cache. If the cache is full, we also remove the least recently accessed story from it. + +## Trade Offs + +The typical design of an LRU cache allows for extremely fast access: checking if an item is in the cache is a constant time O(1) operation. Updating the cache is also extremely fast: O(1). + +However, the trade off is the amount of space required to store the data. An LRU cache often uses two data structures - a doubly linked list and hash map - to store the data in the correct order. This means it takes up more space than using a simpler data structure, such as an Array. Note that it is possible to implement an LRU cache with different data structures. + +## Why Two Data Structures? + +The LRU cache requires its data to be ordered. It also requires fast access and updating (insertion and deletion). Let's say we used an Array, since it's ordered. We only have fast access if we know the index of the element we're looking for in the Array, and our program is unlikely to have that information. Similarly, inserting elements at the front of an Array is an O(n) operation, so we can't use an Array for an LRU cache. + +We could also think about using a hash/object, but hashes are not ordered, so we have another problem here. However, they do provide O(1) access when you know the key for the value you're looking for. It is also extremely fast to add and remove key-value pairs from a Hash. We could also think about using a doubly linked list (a doubly linked lists contains nodes that point to the next node and previous node). Linked lists are ordered and they allow for fast insertion and deletion. However, finding a specific item takes O(n) time, since we must traverse the list. + +When we combine a hash with a doubly linked list, we get the best of both worlds: constant-time access, insertion, and deletion! ...as long as we design our LRU cache properly that is. + +## How Do We Combine These Data Structures? + +![LRU Cache](./lru_cache.svg) + +It's easier to think about how these data structures work together if we first set up some rules: + +- When we check if an item is in the cache, we always check if it's in the hash +- A key in the hash always points to a node in the doubly linked list +- Items in the doubly linked list are always ordered from most recenlty used (at the head) to least recently used (at the tail) +- If an item is being added to a cache that's full, the least recently used item is removed from both the hash and list (at the tail) + - The list tells us which item was least recently used since it will always be at the tail +- If an item is being retrieved from the cache, it is moved to the head of the list and the hash remains unchanged + +Let's say we start with an empty cache. We want the recipe associated with an item that has an ID of "cake". First, we check if "cake" is in the cache by asking the hash if it has a key of "cake". The cache is empty, so the data is retrieved from the database. Next, the LRU cache creates a new node, which stores the recipe. The node is added to the doubly linked list as its head and tail since the list contains only one item. Next, a key of "cake" is added to the hash, and its value is set to the node that was just created. At the end of this operation we have a list with a single node in it, and a hash with a key of "cake" pointing to that node. + +``` +lru_cache.hash +=> { + "cake": Node storing "cake"s recipe +} + +lru_cache.list +=> Doubly Linked List with head and tail both pointing to "cake" recipe Node +``` + +Now another user comes along asking for "cake". We check the cache's hash for "cake". It's there, so we retrieve its value and send it to the user. We don't need to do anything else because "cake" is already the most recently accessed item in the cache. + +Next a user asks for "cookies". We check the hash, but it's not in there, so we retrieve the recipe from the database. Next, we create a node using the "cookies" data and set that node as the head of the doubly linked list, since it's the most recently accessed item. This means that "cake" is now the tail. Lastly, we add a key of "cookies" to the hash and have it point to the node. + +``` +lru_cache.hash +=> { + "cake": Node storing "cake"s recipe, + "cookies": Node storing "cookie"s recipe +} + +lru_cache.list +=> Doubly Linked List with head pointing to "cookies" Node and tail pointing to "cake" Node +``` + +Let's pretend our cache can only store two recipes. This means our cache is full! A user comes along and asks for an omelette recipe. The LRU Cache's hash doesn't have an "omelette" key, so the data is retrieved from the database. A node is created using the omelette data. The cache goes to add it to the head of the list, but the list is full, so it kicks out "cake", which is at the tail. The omelette node is then added as the head of the list, and a key is created in the hash which points to the omelette node. + +``` +lru_cache.hash +=> { + "cookies": Node storing "cake"s recipe, + "omelette": Node storing "omelette"s recipe +} + +lru_cache.list +=> Doubly Linked List with head pointing to "omelette" Node and tail pointing to "cookies" Node +``` + +## Implement an LRU Cache + +We'll take this slow: first we'll create our Doubly Linked List class, and then we'll move on to creating the LRU Cache. For the Doubly Linked List class, we'll only worry about creating the methods required for our cache to work. Note that our tests will only check if the cache is functioning correctly. It'll be up to you to test that the list is working correctly. + +The Node class has already been filled out. It contains four attributes: `data`, which stores some kind of value, `key`, which stores the associated key name in the hash, `next`/`next_node`, which points to the next node in the list, and `prev`/`prev_node`, which points to the previous node in the list. + +### Implement the Doubly Linked List + +As you implement each of these methods, make sure you're correctly updating each Node's `next` and `prev` attributes. Also keep in mind that each of these operations should take constant time: O(1). + +You may assume that only valid inputs will be provided to each method. For example, if you're asked to move a node to the head of the list, it's guaranteed that the argument will contain a node and that the node will be in the list already. + +#### 1. `addHead(node)` / `add_head(node)` + +Place the given node at the head of the list. Do not remove the existing head if there is one! + +``` +list = new DoublyLinkedList +list.add_head(node1) +list.head +=> node1 + +list.add_head(node2) +list.head +=> node2 + +list.head.next +=> node1 + +list.tail +=> node1 +``` + +#### 2. `removeTail()` / `remove_tail` + +Remove the tail from the list and return it. + +``` +list = new DoublyLinkedList +list.add_head(node1) +list.head +=> node1 + +list.tail +=> node1 + +list.remove_tail() +=> node1 + +list.tail +=> null or nil +``` + +#### 3. `removeNode(node)` / `remove_node(node)` + +Remove the given node from the list and return it. + +``` +list = new DoublyLinkedList +list.add_head(node1) +list.add_head(node2) +list.add_head(node3) +// list is 3 -> 2 -> 1 + +list.remove_node(node2) +=> node2 +// list is 3 -> 1 +``` + +#### 4. `moveNodeToHead(node)` / `move_node_to_head(node)` + +Move the given node to the head of the list. + +``` +list = new DoublyLinkedList +list.add_head(node1) +list.add_head(node2) +list.add_head(node3) +// list is 3 -> 2 -> 1 + +list.move_node_to_head(node2) +// list is 2 -> 3 -> 1 +``` + +### Implement the LRU Cache + +Now that we have our list ready for use, we can implement the LRU Cache! Our cache will contain only two methods (one to get data and another to add it), but you can add helper methods if you need to. The necessary attributes - `limit`, `size`, `hash`, and `list` - have already been added to the cache. The `limit` is set to a default value, which can be overridden when instantiating a new cache. It sets the maximum number of items allowed in the cache. The `size` tracks the total number of items currently in the cache. The `hash` and `list` point to the hash/object and Doubly Linked List that store the cache's data. + +As you work on the cache, remember that you'll also need to determine when and where to update the `size` of the cache. Also keep in mind that our operations need to run in constant time. + +You may assume that the methods will only be given valid arguments. + +#### 1. `get(key)` + +Return the item from the cache using the given `key`. If the item is in the cache, move it to the head of the list to denote that it is the most recently accessed item. If the item isn't in the cache, return `-1`. + +``` +lru_cache.get("potato") +=> Node with data associated with "potato" + +lru_cache.get("notato") +=> -1 +``` + +#### 2. `put(key, value)` + +Add or update the item in the cache. If the key does not exist in the cache, add the item to the cache. If the key is in the cache, update the item with the value. In any case, move the item to the head of the list to denote that it's the most recently accessed item. If the cache is already full, remove the least recently used item from the cache before adding the new item. + +``` +lru_cache = new LRUCache(3) +lru_cache.put("cake", "cake recipe") + +lru_cache.get("cake") +=> Node with data "cake recipe" + +lru_cache.put("cookies", "cookie recipe") +lru_cache.put("cake", "fixed cake recipe") +lru_cache.put("scones", "scone recipe") +lru_cache.put("smoothie", "smoothie recipe") + +lru_cache.get("cake") +=> Node with data "fixed cake recipe" + +lru_cache.get("smoothie") +=> Node with data "smoothie recipe" + +lru_cache.get("cookies") +=> -1 +// cookies got kicked out when smoothie was added because the cache was full +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/lru_cache.js b/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/lru_cache.js new file mode 100644 index 00000000..e12ecbdb --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/lru_cache.js @@ -0,0 +1,78 @@ +class Node { + constructor(data = null, key = null, next = null, prev = null) { + this.data = data; + this.key = key; + this.next = next; + this.prev = prev; + } +} + +class DoublyLinkedList { + constructor(head = null, tail = null) { + this.head = head; + this.tail = tail; + } + + // ADD THE NODE TO THE HEAD OF THE LIST + addHead(node) { + + } + + // REMOVE THE TAIL NODE FROM THE LIST + // AND RETURN IT + removeTail() { + + } + + // REMOVE THE GIVEN NODE FROM THE LIST + // AND THEN RETURN IT + removeNode(node) { + + } + + // MOVE THE GIVEN NODE FROM ITS LOCATION TO THE HEAD + // OF THE LIST + moveNodeToHead(node) { + + } +} + +class LRUCache { + constructor(limit = 10) { + this.limit = limit; + this.size = 0; + this.hash = {}; + this.list = new DoublyLinkedList(limit); + } + + // RETRIEVE THE NODE FROM THE CACHE USING THE KEY + // IF THE NODE IS IN THE CACHE, MOVE IT TO THE HEAD OF THE LIST AND RETURN IT + // OTHERWISE RETURN -1 + get(key) { + + } + + // ADD THE GIVEN KEY AND VALUE TO THE CACHE + // IF THE CACHE ALREADY CONTAINS THE KEY, UPDATE ITS VALUE AND MOVE IT TO + // THE HEAD OF THE LIST + // IF THE CACHE DOESN'T CONTAIN THE KEY, ADD IT TO THE CACHE AND PLACE IT + // AT THE HEAD OF THE LIST + // IF THE CACHE IS FULL, REMOVE THE LEAST RECENTLY USED ITEM BEFORE ADDING + // THE NEW DATA TO THE CACHE + put(key, value) { + + } +} + +if (require.main === module) { + // add your own tests in here +} + +module.exports = { + Node, + DoublyLinkedList, + LRUCache +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/package.json b/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/package.json new file mode 100644 index 00000000..9eae89c5 --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "lru-cache", + "version": "1.0.0", + "description": "LRU Cache", + "main": "lru_cache.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/tests/lru_cache.test.js b/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/tests/lru_cache.test.js new file mode 100644 index 00000000..762fb36c --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/javascript/tests/lru_cache.test.js @@ -0,0 +1,108 @@ +const { Node, LRUCache } = require("../lru_cache"); + +describe("LRUCache", () => { + it ("correctly creates and updates a cache with a limit of 1 item", () => { + const cache = new LRUCache(1); + + let found = cache.get("test"); + + expect(found).toBe(-1); + + let key = "cake"; + let val = "cake recipe"; + cache.put(key, val); + found = cache.get(key); + + expect(found).toBeInstanceOf(Node); + expect(found.data).toBe(val); + + key = "cookies"; + val = "cookie recipe"; + cache.put(key, val); + found = cache.get(key); + let shouldBeGone = cache.get("cake"); + + expect(found).toBeInstanceOf(Node); + expect(found.data).toBe(val); + expect(shouldBeGone).toBe(-1); + + val = "new cookie recipe"; + cache.put(key, val); + found = cache.get(key); + + expect(found).toBeInstanceOf(Node); + expect(found.data).toBe(val); + expect(cache.size).toBe(1); + }); + + it ("correctly creates and updates a cache with a limit of 2 items", () => { + const cache = new LRUCache(2); + + let found = cache.get("test"); + + expect(found).toBe(-1); + + let key1 = "cake"; + let val1 = "cake recipe"; + cache.put(key1, val1); + let found1 = cache.get(key1); + let key2 = "cookies"; + let val2 = "cookie recipe"; + cache.put(key2, val2); + let found2 = cache.get(key2); + + expect(found1.data).toBe(val1); + expect(found2.data).toBe(val2); + expect(cache.size).toBe(2); + + val1 = "new cake recipe"; + cache.put(key1, val1); + val2 = "new cookie recipe"; + cache.put(key2, val2); + found1 = cache.get(key1); + found2 = cache.get(key2); + + expect(found1.data).toBe(val1); + expect(found2.data).toBe(val2); + expect(cache.size).toBe(2); + + let key3 = "scones"; + let val3 = "scone recipe"; + cache.put(key3, val3); + let found3 = cache.get(key3); + found1 = cache.get(key1); + found2 = cache.get(key2); + + expect(found3.data).toBe(val3); + expect(cache.size).toBe(2); + expect(found1).toBe(-1); + expect(found2.data).toBe(val2); + }); + + it ("correctly creates a cache with many items", () => { + const cache = new LRUCache(10); + const numbers = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve"]; + const items = numbers.reduce((accum, num) => { + accum.push({ [num]: `item ${num}` }); + return accum; + }, []); + + items.forEach((item, idx) => { + const key = numbers[idx]; + const val = item[key]; + + cache.put(key, val); + }); + + expect(cache.size).toBe(10); + expect(cache.get(numbers[0])).toBe(-1); + expect(cache.get(numbers[1])).toBe(-1); + expect(cache.get(numbers[2]).data).toBe(items[2][numbers[2]]); + expect(cache.get(numbers[11]).data).toBe(items[11][numbers[11]]); + + const updatedVal = "whatevers"; + cache.put(numbers[4], updatedVal); + + expect(cache.get(numbers[4]).data).toBe(updatedVal); + }); +}); diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/lru_cache.svg b/13-week-10/01-days-3-to-5--build-an-lru-cache/lru_cache.svg new file mode 100644 index 00000000..c1340433 --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/lru_cache.svg @@ -0,0 +1,193 @@ + + Doubly-linked list with a dictionary where each item contains links to both its predecessor and its successor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + most recently used + least recently used + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Head + Tail + + + + + + + + + + + + + + + + + + diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/.rspec b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/Gemfile b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/lru_cache.rb b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/lru_cache.rb new file mode 100644 index 00000000..3b861c67 --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/lru_cache.rb @@ -0,0 +1,78 @@ +class Node + attr_accessor :data, :key, :next_node, :prev_node + + def initialize(data = nil, key = nil, next_node = nil, prev_node = nil) + @data = data + @key = key + @next_node = next_node + @prev_node = prev_node + end +end + +class DoublyLinkedList + attr_reader :head, :tail + + def initialize(head = nil, tail = nil) + @head = head + @tail = tail + end + + # ADD THE NODE TO THE HEAD OF THE LIST + def add_head(node) + + end + + # REMOVE THE TAIL NODE FROM THE LIST + # AND RETURN IT + def remove_tail + + end + + # REMOVE THE GIVEN NODE FROM THE LIST + # AND THEN RETURN IT + def remove_node(node) + + end + + # MOVE THE GIVEN NODE FROM ITS LOCATION TO THE HEAD + # OF THE LIST + def move_node_to_head(node) + + end +end + +class LRUCache + attr_reader :limit, :size + + def initialize(limit = 10) + @limit = limit + @size = 0 + @hash = {} + @list = DoublyLinkedList.new + end + + # RETRIEVE THE NODE FROM THE CACHE USING THE KEY + # IF THE NODE IS IN THE CACHE, MOVE IT TO THE HEAD OF THE LIST AND RETURN IT + # OTHERWISE RETURN -1 + def get(key) + + end + + # ADD THE GIVEN KEY AND VALUE TO THE CACHE + # IF THE CACHE ALREADY CONTAINS THE KEY, UPDATE ITS VALUE AND MOVE IT TO + # THE HEAD OF THE LIST + # IF THE CACHE DOESN'T CONTAIN THE KEY, ADD IT TO THE CACHE AND PLACE IT + # AT THE HEAD OF THE LIST + # IF THE CACHE IS FULL, REMOVE THE LEAST RECENTLY USED ITEM BEFORE ADDING + # THE NEW DATA TO THE CACHE + def put(key, value) + + end +end + +if __FILE__ == $PROGRAM_NAME + # Don't forget to add your own tests! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/spec/lru_cache_spec.rb b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/spec/lru_cache_spec.rb new file mode 100644 index 00000000..9021ab25 --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/spec/lru_cache_spec.rb @@ -0,0 +1,110 @@ +require "./lru_cache" + +describe "LRUCache" do + it "correctly creates and updates a cache with a limit of 1 item" do + cache = LRUCache.new(1) + + found = cache.get("test") + + expect(found).to be -1 + + key = "cake" + val = "cake recipe" + cache.put(key, val) + found = cache.get(key) + + expect(found).to be_a Node + expect(found.data).to eq(val) + + key = "cookies" + val = "cookie recipe" + cache.put(key, val) + found = cache.get(key) + shouldBeGone = cache.get("cake") + + expect(found).to be_a Node + expect(found.data).to eq(val) + expect(shouldBeGone).to eq(-1) + + val = "new cookie recipe" + cache.put(key, val) + found = cache.get(key) + + expect(found).to be_a Node + expect(found.data).to eq(val) + expect(cache.size).to eq(1) + end + + it "correctly creates and updates a cache with a limit of 2 items" do + cache = LRUCache.new(2) + + found = cache.get("test") + + expect(found).to eq(-1) + + key1 = "cake" + val1 = "cake recipe" + cache.put(key1, val1) + found1 = cache.get(key1) + key2 = "cookies" + val2 = "cookie recipe" + cache.put(key2, val2) + found2 = cache.get(key2) + + expect(found1.data).to eq(val1) + expect(found2.data).to eq(val2) + expect(cache.size).to eq(2) + + val1 = "new cake recipe" + cache.put(key1, val1) + val2 = "new cookie recipe" + cache.put(key2, val2) + found1 = cache.get(key1) + found2 = cache.get(key2) + + expect(found1.data).to eq(val1) + expect(found2.data).to eq(val2) + expect(cache.size).to eq(2) + + key3 = "scones" + val3 = "scone recipe" + cache.put(key3, val3) + found3 = cache.get(key3) + found1 = cache.get(key1) + found2 = cache.get(key2) + + expect(found3.data).to eq(val3) + expect(cache.size).to eq(2) + expect(found1).to eq(-1) + expect(found2.data).to eq(val2) + end + + it "correctly creates a cache with many items" do + cache = LRUCache.new(10) + numbers = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve"] + items = numbers.reduce([]) do |accum, num| + obj = {} + obj[num] = "item #{num}" + accum << obj + accum + end + + items.each_with_index do |item, idx| + key = numbers[idx] + val = item[key] + + cache.put(key, val) + end + + expect(cache.size).to eq(10) + expect(cache.get(numbers[0])).to eq(-1) + expect(cache.get(numbers[1])).to eq(-1) + expect(cache.get(numbers[2]).data).to eq(items[2][numbers[2]]) + expect(cache.get(numbers[11]).data).to eq(items[11][numbers[11]]) + + updatedVal = "whatevers" + cache.put(numbers[4], updatedVal) + + expect(cache.get(numbers[4]).data).to eq(updatedVal) + end +end \ No newline at end of file diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/spec/spec_helper.rb b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/solutions/lru_cache.js b/13-week-10/01-days-3-to-5--build-an-lru-cache/solutions/lru_cache.js new file mode 100644 index 00000000..60c17b3e --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/solutions/lru_cache.js @@ -0,0 +1,192 @@ +class Node { + constructor(data = null, key = null, next = null, prev = null) { + this.data = data; + this.key = key; + this.next = next; + this.prev = prev; + } +} + +class DoublyLinkedList { + constructor(head = null, tail = null) { + this.head = head; + this.tail = tail; + } + + // ADD THE NODE TO THE HEAD OF THE LIST + addHead(node) { + if (!this.head) { + this.head = node; + this.tail = node; + return; + } + + this.head.prev = node; + node.next = this.head; + this.head = node; + this.head.prev = null; + } + + // REMOVE THE TAIL NODE FROM THE LIST + // AND RETURN IT + removeTail() { + if (!this.tail) { + return this.tail; + } + + const oldTail = this.tail; + this.tail = this.tail.prev; + + if (this.tail) { + this.tail.next = null; + } else { + this.head = this.tail; + } + + return oldTail; + } + + // REMOVE THE GIVEN NODE FROM THE LIST + // AND THEN RETURN IT + removeNode(node) { + switch (node) { + case this.tail: + this.removeTail(); + break; + case this.head: + // this is a good candidate for a helper method! + this.head = node.next; + + if (this.head) { + this.head.prev = null; + } + + if (!this.head || !this.head.next) { + this.tail = this.head; + } + + break; + default: + if (node.prev) { + node.prev.next = node.next; + } + + if (node.next) { + node.next.prev = node.prev; + } + } + + return node; + } + + // MOVE THE GIVEN NODE FROM ITS LOCATION TO THE HEAD + // OF THE LIST + moveNodeToHead(node) { + const removed = this.removeNode(node); + + this.addHead(removed); + } +} + +class LRUCache { + constructor(limit = 10) { + this.limit = limit; + this.size = 0; + this.hash = {}; + this.list = new DoublyLinkedList(); + } + + // RETRIEVE THE NODE FROM THE CACHE USING THE KEY + // IF THE NODE IS IN THE CACHE, MOVE IT TO THE HEAD OF THE LIST AND RETURN IT + // OTHERWISE RETURN -1 + get(key) { + const found = this.hash[key]; + + if (found) { + this.list.moveNodeToHead(found); + return found; + } + + return -1; + } + + // ADD THE GIVEN KEY AND VALUE TO THE CACHE + // IF THE CACHE ALREADY CONTAINS THE KEY, UPDATE ITS VALUE AND MOVE IT TO + // THE HEAD OF THE LIST + // IF THE CACHE DOESN'T CONTAIN THE KEY, ADD IT TO THE CACHE AND PLACE IT + // AT THE HEAD OF THE LIST + // IF THE CACHE IS FULL, REMOVE THE LEAST RECENTLY USED ITEM BEFORE ADDING + // THE NEW DATA TO THE CACHE + put(key, value) { + const found = this.hash[key]; + + if (found) { + found.data = value; + this.list.moveNodeToHead(found); + return; + } + + if (this.limit === this.size) { + const tail = this.list.removeTail(); + delete this.hash[tail.key]; + --this.size; + } + + this._addEntry(key, value); + } + + _addEntry(key, value) { + const node = new Node(value, key); + this.list.addHead(node); + this.hash[key] = node; + ++this.size; + } +} + +if (require.main === module) { + let list = new DoublyLinkedList(); + + list.addHead(new Node(1)); + + console.log("List has same node as head and tail"); + console.log(list.head === list.tail); + console.log(list.head.data === 1); + + list.removeNode(list.head); + + console.log("List is empty"); + console.log(list.head === null && list.tail === null); + + list.addHead(new Node(1)); + list.addHead(new Node(2)); + + console.log("List head is 2 and tail is 1"); + console.log(list.head.data === 2 && list.tail.data === 1); + + list.removeTail(); + console.log("Can remove tail"); + console.log(list.head === list.tail && list.head.data === 2); + + list.moveNodeToHead(list.head); + console.log("Can move head to head"); + console.log(list.head === list.tail && list.head.data === 2); + + list.addHead(new Node(3)); + list.moveNodeToHead(list.tail); + console.log("Can move tail to head"); + console.log(list.head.data === 2 && list.tail.data === 3); + + list.addHead(new Node(1)); + list.moveNodeToHead(list.head.next); + console.log("Can move middle to head"); + console.log(list.head.data === 2 && list.tail.data === 3); +} + +module.exports = { + Node, + DoublyLinkedList, + LRUCache +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/13-week-10/01-days-3-to-5--build-an-lru-cache/solutions/lru_cache.rb b/13-week-10/01-days-3-to-5--build-an-lru-cache/solutions/lru_cache.rb new file mode 100644 index 00000000..6f34cb3f --- /dev/null +++ b/13-week-10/01-days-3-to-5--build-an-lru-cache/solutions/lru_cache.rb @@ -0,0 +1,178 @@ +class Node + attr_accessor :data, :key, :next_node, :prev_node + + def initialize(data = nil, key = nil, next_node = nil, prev_node = nil) + @data = data + @key = key + @next_node = next_node + @prev_node = prev_node + end +end + +class DoublyLinkedList + attr_reader :head, :tail + + def initialize(head = nil, tail = nil) + @head = head + @tail = tail + end + + # ADD THE NODE TO THE HEAD OF THE LIST + def add_head(node) + if @head.nil? + @head = node + @tail = node + return + end + + @head.prev_node = node + node.next_node = @head + @head = node + @head.prev_node = nil + end + + # REMOVE THE TAIL NODE FROM THE LIST + # AND RETURN IT + def remove_tail + return @tail if @tail.nil? + + old_tail = @tail + @tail = @tail.prev_node + + unless @tail.nil? + @tail.next_node = nil + else + @head = @tail + end + + old_tail + end + + # REMOVE THE GIVEN NODE FROM THE LIST + # AND THEN RETURN IT + def remove_node(node) + case node + when @tail + remove_tail + when @head + # this is a good candidate for a helper method! + @head = node.next_node + @head.prev_node = nil unless @head.nil? + @tail = @head if @head.nil? || @head.next_node.nil? + else + node.prev_node.next_node = node.next_node unless node.prev_node.nil? + node.next_node.prev_node = node.prev_node unless node.next_node.nil? + end + + node + end + + # MOVE THE GIVEN NODE FROM ITS LOCATION TO THE HEAD + # OF THE LIST + def move_node_to_head(node) + removed = remove_node(node) + + add_head(removed) + end +end + +class LRUCache + attr_reader :limit, :size + + def initialize(limit = 10) + @limit = limit + @size = 0 + @hash = {} + @list = DoublyLinkedList.new + end + + # RETRIEVE THE NODE FROM THE CACHE USING THE KEY + # IF THE NODE IS IN THE CACHE, MOVE IT TO THE HEAD OF THE LIST AND RETURN IT + # OTHERWISE RETURN -1 + def get(key) + found = @hash[key] + + if found + @list.move_node_to_head(found) + return found + end + + -1 + end + + # ADD THE GIVEN KEY AND VALUE TO THE CACHE + # IF THE CACHE ALREADY CONTAINS THE KEY, UPDATE ITS VALUE AND MOVE IT TO + # THE HEAD OF THE LIST + # IF THE CACHE DOESN'T CONTAIN THE KEY, ADD IT TO THE CACHE AND PLACE IT + # AT THE HEAD OF THE LIST + # IF THE CACHE IS FULL, REMOVE THE LEAST RECENTLY USED ITEM BEFORE ADDING + # THE NEW DATA TO THE CACHE + def put(key, value) + found = @hash[key] + + if found + found.data = value + @list.move_node_to_head(found) + return + end + + if @limit === @size + tail = @list.remove_tail + @hash.delete(tail.key) + @size -= 1 + end + + add_entry(key, value) + end + + private + + def add_entry(key, value) + node = Node.new(value, key) + @list.add_head(node) + @hash[key] = node + @size += 1 + end +end + +if __FILE__ == $PROGRAM_NAME + # Don't forget to add your own tests! + list = DoublyLinkedList.new + list.add_head(Node.new(1)) + + puts "List has same node as head and tail" + puts list.head === list.tail + puts list.head.data === 1 + + list.remove_node(list.head) + + puts "List is empty" + puts list.head === nil && list.tail === nil + + list.add_head(Node.new(1)) + list.add_head(Node.new(2)) + + puts "List head is 2 and tail is 1" + puts list.head.data === 2 && list.tail.data === 1 + + list.remove_tail + puts "Can remove tail" + puts list.head === list.tail && list.head.data === 2 + + list.move_node_to_head(list.head) + puts "Can move head to head" + puts list.head === list.tail && list.head.data === 2 + + list.add_head(Node.new(3)) + list.move_node_to_head(list.tail) + puts "Can move tail to head" + puts list.head.data === 2 && list.tail.data === 3 + + list.add_head(Node.new(1)) + list.move_node_to_head(list.head.next_node) + puts "Can move middle to head" + puts list.head.data === 2 && list.tail.data === 3 +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/14-week-11/00-day-1--what-is-a-graph-/.gitignore b/14-week-11/00-day-1--what-is-a-graph-/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/14-week-11/00-day-1--what-is-a-graph-/README.md b/14-week-11/00-day-1--what-is-a-graph-/README.md new file mode 100644 index 00000000..5016f179 --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/README.md @@ -0,0 +1,182 @@ +# Day 1: What Is a Graph? + +![friends network](./friends.jpg) + +If you're familiar with trees, such as the binary tree, then we've got good news for you! You're already familiar with graphs, because they're very similar! + +A graph is a data structure that represents how different points or objects are connected to one another. In the image above, we have a graph showing how different people are connected. For example, we see that Anne is connected to Bob, Bob is connected to Carl, and so on. We can also see that Diana is not directly connected to Elisa. + +## Why Use Graphs? + +Graphs can help us find the shortest distance between two points or determine if two points are even connected. Dijkstra's algorithm, for example, uses a graph to find the shortest distance between two points, and is still used today to figure out how to get from point A to point B on a map. And Facebook uses a graph database instead of a relational database because it performs better for their use case, which is all about representing relationships between people, places, and other things. + +There are other use cases for graphs, but we'll let you Google those. + +## Key Terms + +- Node / vertex: A point on the graph, similar to a node in a tree +- Edge: A connection or path between two points, which we can visualize as a line connecting two nodes, such as the line/edge from Anne to Bob in the image at the top of this README +- Adjacency: Two nodes or vertices are adjacent if they are connected by an edge (e.g. Anne and Bob are adjacent) +- Path: A sequence of edges between two points, similar to plotting a route from your favorite bakery to your home (a path from Anne to Carl: Anne -> Bob -> Carl) + +## Types of Graphs + +There are several different types of graphs. We'll mention a few here: + +- Undirected graph: The edges do not point in any specific direction (e.g. Anne can point to Bob and Bob can point back to Anne) +- Directed graph: Each edge is uni-directional (similar to a Linked List, e.g. Anne can point to Bob, but Bob cannot point back to Anne) +- Weighted graph: Each edge has a cost associated with it (e.g. if Elisa wants to talk to Diana, she can ask Carl or Anne to make that connection, but if Elisa's relationship with Carl is on the rocks, she might weight that more heavily than going through Anne, with whom she is best friends) + +You don't need to memorize all of this, nor will we be building all of these graphs. We just want you to be aware of them in case you decide to look further into graphs (there are more though!). For example, if you wanted to learn more about Dijkstra's algorithm, you might want to look into weighted graphs. We'll be focusing on undirected graphs. + +## How to Represent a Graph + +We can use a number of different underlying data structures to create a graph. For example, we can build a graph from a tree data structure, similar to a Linked List or Binary Tree. Or we can use a hash (object in JS, dictionary in Python...) or a multi-dimensional array as the underlying data structure. In this challenge, we'll be creating our own Graph class using a hash/object as the underlying data structure. The key will be to maintain the rules of the graph, or as we prefer to say its "graphiness". + +We suggest you read more about the different methods for representing a graph. Try Googling "adjacency matrix" to get yourself started. + +## Our Graph + +Today we'll be creating a Graph class that uses a hash/object as the underlying data structure. It'll be an undirected graph consisting of adjacency lists. In other words, each key in the hash/object will have a value that is a set. Each set will be a list of adjacent nodes. Let's take another look at our friends image and then see what it might look like as a graph: + +![friends network](./friends.jpg) + +``` +{ + Anne: [Bob, Elisa, Diana], + Bob: [Anne, Diana, Carl], + Elisa: [Anne, Carl], + Carl: [Bob, Elisa, Diana], + Diana: [Anne, Bob, Carl] +} +``` + +## Implement a Graph Class + +Let's see if we can gain a better understanding of graphs by building a Graph class. + +Before we dive in, let's set up some rules: + +- Every vertex in the graph has a corresponding key in the Hash/object being used to store the graph +- All of a vertex's adjacent vertices are listed in an adjacency list stored as the value for that key: `{ a: {"b", "c", "d"} }` +- All values in an adjacency list are unique - there can be no repeats +- The graph consists only of vertices that are connected to other vertices, e.g. there cannot be a key with an empty adjacency list unless there is only one vertex in the entire graph + - This means we are making a connected graph: one in which there is a path from any vertex to another vertex. Be aware that it is possible to make a disconnected graph. + - OK: `{ a: {} }` or `{ a: { "b" }, b: { "a" } }` + - Not OK: `{ a: {}, b: {}, c: {} }` or `{ a: { "c" }, b: {}, c: { "a" } }` + +### 1. Initialize a New Object: `initialize(paths)` / `constructor(paths)` + +A user should provide an array of paths when instantiating a new object from the Graph class. We'll take care of the array in the next step. For now, simply accept it as an argument and set an instance variable called `graph` to an empty Hash / object. `graph` should be readable on an object instantiated from the class. + +``` +graph = new Graph(paths) +graph.graph +=> {} +``` + +### 2. Create the Graph from the Array + +When a new Graph object is instantiated, it will be initialized using an array of paths. We need to convert this list of paths to a valid graph. A valid graph contains every vertex as a key, and every adjacent vertex as a value in a set that's associated with that key. + +The list of paths is a two-dimensional array, and you may assume that it's always valid. Each path contains a list of connected vertices in the order in which they're connected, i.e. there is an edge between elements that are next to one another in a list: + +``` +[["a", "b", "c"], ["b", "d"]] +// a is adjacent to b +// b is adjacent to a, c and d +// c is adjacent to b +// d is adjacent to b +``` + +``` +paths = [["a", "b", "c"], ["b", "d"]] +graph = new Graph(paths) +graph.graph +=> { + a: { "b" }, + b: { "a", "c", "d" }, + c: { "b" }, + d: { "b" } +} +``` + +_Question: Why do you think we used a set instead of an array to store the adjacency lists?_ + +Once you've got that working, determine what the worst-case time complexity (Big O) is for converting the array of paths to a graph. + +### 3. `is_adjacent(vertex_a, vertex_b)` / `isAdjacent(vertexA, vertexB)` + +Returns `true` if two vertices are adjacent, i.e. they're connected by an edge. Otherwise it returns `false`. + +``` +paths = [["a", "b", "c"], ["b", "d"]] +graph = new Graph(paths) + +graph.is_adjacent("a", "b") +=> true + +graph.is_adjacent("a", "c") +=> false +``` + +Once you've got that working, determine the worst-case time complexity (Big O) for determining if two vertices are adjacent. + +### 4. `add_vertex(vertex, array)` / `addVertex(vertex, array)` + +Add a new vertex to the graph along with its adjacency list. This means that the adjacency lists for existing vertices will also need to be updated. + +``` +paths = [["a", "b", "c"], ["b", "d"]] +graph = new Graph(paths) + +graph.add_vertex("e", ["a", "d"]) +graph.graph +=> { + a: { "b", "e" }, + b: { "a", "c", "d" }, + c: { "b" }, + d: { "b", "e" }, + e: { "a", "d" } +} +``` + +Once you've got that working, determine the worst-case time complexity (Big O) for adding a vertex. + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/14-week-11/00-day-1--what-is-a-graph-/friends.jpg b/14-week-11/00-day-1--what-is-a-graph-/friends.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dffbef56b1dc9753d405709aa7079c42f0b3771 GIT binary patch literal 38531 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%0Au|mMP1_p^7!;qFBiIO|1K4@cIwH$~$AOOf^+j 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 { + const graph = () => new Graph([["a", "b", "c"], ["b", "d"]]); + const result = () => ({ a: new Set(["b"]), b: new Set(["a", "c", "d"]), c: new Set(["b"]), d: new Set(["b"]) }); + + describe("constructor(paths)", () => { + it("can be initialized with an empty list of paths", () => { + expect(new Graph([]).graph).toEqual({}); + }); + + it("can be initialized with a single vertex in a single path", () => { + expect(new Graph([["a"]]).graph).toEqual({ a: new Set }); + }); + + it("creates a valid graph from a list of paths", () => { + expect(graph().graph).toEqual(result()); + }); + }); + + describe("isAdjacent(vertexA, vertexB)", () => { + it("returns true when two vertices are adjacent", () => { + expect(graph().isAdjacent("a", "b")).toBe(true); + }); + + it("returns false when two vertices are not adjacent", () => { + expect(graph().isAdjacent("a", "c")).toBe(false); + }); + }); + + describe("addVertex(vertex, array)", () => { + it("adds the new vertex to the graph with its adjacency list as a set as its value", () => { + const myGraph = graph(); + myGraph.addVertex("e", ["a", "d"]); + + expect(myGraph.graph["e"]).toEqual(new Set(["a", "d"])); + }); + + it("updates the existing vertices adjacency lists with the new vertex when adjacent", () => { + const myGraph = graph(); + myGraph.addVertex("e", ["a", "d"]); + + const myResult = result(); + myResult["a"].add("e"); + myResult["d"].add("e"); + myResult["e"] = new Set(["a", "d"]); + + expect(myGraph.graph).toEqual(myResult); + }); + + it("adds new vertices to the graph when they're present in the adjacency list", () => { + const adjacency = ["a", "d", "f", "g"]; + const myGraph = graph(); + + myGraph.addVertex("e", adjacency); + + const myResult = result(); + myResult["a"].add("e"); + myResult["d"].add("e"); + myResult["f"] = new Set(["e"]); + myResult["g"] = new Set(["e"]); + myResult["e"] = new Set(adjacency); + + expect(myGraph.graph).toEqual(myResult); + }); + }); +}); diff --git a/14-week-11/00-day-1--what-is-a-graph-/ruby/.rspec b/14-week-11/00-day-1--what-is-a-graph-/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/14-week-11/00-day-1--what-is-a-graph-/ruby/Gemfile b/14-week-11/00-day-1--what-is-a-graph-/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/14-week-11/00-day-1--what-is-a-graph-/ruby/graph.rb b/14-week-11/00-day-1--what-is-a-graph-/ruby/graph.rb new file mode 100644 index 00000000..4d7d4679 --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/ruby/graph.rb @@ -0,0 +1,48 @@ +require 'set' + +class Graph + def initialize(paths) + end + + def is_adjacent(vertex_a, vertex_b) + end + + # array is an adjacency list + def add_vertex(vertex, array) + end +end + +if __FILE__ == $PROGRAM_NAME + graph = Graph.new([]) + + puts "Expecting: {}" + puts graph.graph + + puts + + graph = Graph.new([["a", "b", "c"], ["b", "d"]]) + + puts 'Expecting: { a: { "b" }, b: { "a", "c", "d" }, c: { "b" }, d: { "b" }}' + puts graph.graph + + puts + + # Don't forget to add your own! + + puts "Expecting: true" + puts graph.is_adjacent("a", "b") + + puts + + puts "Expecting: false" + puts graph.is_adjacent("a", "c") + + puts + + graph.add_vertex("e", ["a", "d"]) + puts 'Expecting: { a: { "b", "e" }, b: { "a", "c", "d" }, c: { "b" }, d: { "b", "e" }, e: { "a", "d" } }' + puts graph.graph +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/14-week-11/00-day-1--what-is-a-graph-/ruby/spec/graph_spec.rb b/14-week-11/00-day-1--what-is-a-graph-/ruby/spec/graph_spec.rb new file mode 100644 index 00000000..707a7dbc --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/ruby/spec/graph_spec.rb @@ -0,0 +1,60 @@ +require "./graph" + +RSpec.describe "Graph" do + let(:graph) { Graph.new([["a", "b", "c"], ["b", "d"]]) } + let(:result) { { "a" => Set.new(["b"]), "b" => Set.new(["a", "c", "d"]), "c" => Set.new(["b"]), "d" => Set.new(["b"]) } } + + describe "#initialize(paths)" do + it "can be initialized with an empty list of paths" do + expect(Graph.new([]).graph).to eq({}) + end + + it "can be initialized with a single vertex in a single path" do + expect(Graph.new([["a"]]).graph).to eq({ "a" => Set.new }) + end + + it "creates a valid graph from a list of paths" do + expect(graph.graph).to eq(result) + end + end + + describe "is_adjacent(vertex_a, vertex_b)" do + it "returns true when two vertices are adjacent" do + expect(graph.is_adjacent("a", "b")).to be true + end + + it "returns false when two vertices are not adjacent" do + expect(graph.is_adjacent("a", "c")).to be false + end + end + + describe "add_vertex(vertex, array)" do + it "adds the new vertex to the graph with its adjacency list as a set as its value" do + graph.add_vertex("e", ["a", "d"]) + + expect(graph.graph["e"]).to eq(Set.new(["a", "d"])) + end + + it "updates the existing vertices adjacency lists with the new vertex when adjacent" do + graph.add_vertex("e", ["a", "d"]) + + result["a"].add("e") + result["d"].add("e") + result["e"] = Set.new(["a", "d"]) + + expect(graph.graph).to eq(result) + end + + it "adds new vertices to the graph when they're present in the adjacency list" do + adjacency = ["a", "d", "f", "g"] + graph.add_vertex("e", adjacency) + result["a"].add("e") + result["d"].add("e") + result["f"] = Set.new(["e"]) + result["g"] = Set.new(["e"]) + result["e"] = Set.new(adjacency) + + expect(graph.graph).to eq(result) + end + end +end \ No newline at end of file diff --git a/14-week-11/00-day-1--what-is-a-graph-/ruby/spec/spec_helper.rb b/14-week-11/00-day-1--what-is-a-graph-/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/14-week-11/00-day-1--what-is-a-graph-/solutions/graph.js b/14-week-11/00-day-1--what-is-a-graph-/solutions/graph.js new file mode 100644 index 00000000..45d7d61a --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/solutions/graph.js @@ -0,0 +1,136 @@ +class Graph { + constructor(paths) { + this.graph = paths.reduce((graph, path) => this.constructor.populate(graph, path), {}); + } + + isAdjacent(vertexA, vertexB) { + return this.graph[vertexA].has(vertexB); + } + + addVertex(vertex, array) { + this.graph[vertex] = new Set(array); + + array.forEach((adjacency) => { + if (this.graph[adjacency] === undefined) { + this.graph[adjacency] = new Set(); + } + + this.graph[adjacency].add(vertex); + }); + } + + // helper function for building graph from a path + static populate(graph, path) { + return path.reduce((graph, vertex, idx) => { + graph[vertex] = graph[vertex] || new Set(); + const nextVertex = path[idx + 1]; + + if (nextVertex !== undefined) { + graph[vertex].add(nextVertex); + graph[nextVertex] = graph[nextVertex] || new Set(); + graph[nextVertex].add(vertex); + } + + return graph; + }, graph); + } +} + +if (require.main === module) { + // add your own tests in here + let graph = new Graph([]); + + console.log("Expecting: {}"); + console.log(graph.graph); + + console.log(""); + + graph = new Graph([["a", "b", "c"], ["b", "d"]]); + + console.log('Expecting: { a: { "b" }, b: { "a", "c", "d" }, c: { "b" }, d: { "b" }}'); + console.log(graph.graph); + + console.log(""); + + console.log("Expecting: true"); + console.log(graph.isAdjacent("a", "b")); + + console.log(""); + + console.log("Expecting: false"); + console.log(graph.isAdjacent("a", "c")); + + console.log(""); + + graph.addVertex("e", ["a", "d"]); + console.log('Expecting: { a: { "b", "e" }, b: { "a", "c", "d" }, c: { "b" }, d: { "b", "e" }, e: { "a", "d" } }'); + console.log(graph.graph); + + console.log("") + + graph = new Graph([["a"]]); + + console.log("Expecting: { a: {} }"); + console.log(graph.graph); + + console.log(""); + + graph.addVertex("d", ["a", "b", "c"]); + console.log("Expecting: { a: { 'd' }, b: { 'd' }, c: { 'd' }, d: { 'a', 'b', 'c' } }"); + console.log(graph.graph); +} + +module.exports = Graph; + +// Please add your pseudocode to this file +/******************************************************************************************* + * // this method converts a single path into a graph + * function populate(graph, path): + * iterate over the path with its index and element included: + * if element is not a key in graph: + * add element as key and initialize value to empty set + * + * if next element exists: + * add the next element to the element's set + * + * if next element isn't a key in graph: + * add next element as key in graph and initialize value to empty set + * + * add element to next element's set + * + * return graph + * + * + * function isAdjacent(vertex_a, vertex_b): + * get set from graph associated with key vertex_a + * return true if vertex_b is in set, else false + * + * function add_vertex(vertex, array): + * add vertex as key in graph with value initialized to a set made from array + * + * iterate over each element in array: + * if element is not in graph: + * add element as key with value initialized to an empty set + * add vertex to each element's set in graph + * ******************************************************************************************/ + + // And a written explanation of your solution +/******************************************************************************************** + * I can create the graph from an array of paths by creating a key in the graph object for every + * element in a path. If the element, or vertex, is not in the graph, I initialize it to an empty + * set. Since the next vertex in the path is adjacent to the current vertex, I can have them both + * point to each other, or rather put each vertex in the other's adjacency list. + * + * To check if two vertices are adjacent, I just need to grab one of their sets (values in the graph), + * and check if the other vertex is in its adjacency list. If it is return true, otherwise false. + * + * To add a vertex, I add it as a key to the graph and set its value to a new set made from the array + * (adjacency list) that's passed into the method. Next, I iterate over the array to ensure each vertex + * is added to the graph as a key if it's not already in there. I also need to ensure that each vertex + * in the adjacency list points back to the added vertex. + * *********************************************************************************************/ + + // Time complexity for: + // creating a new graph: O(n) since we must iterate over the entire paths array + // checking if adjacent: O(1) accessing an element in a set is constant time as is accessing a key in a hash + // adding a vertex: O(n) since we must iterate over the entire adjacency list \ No newline at end of file diff --git a/14-week-11/00-day-1--what-is-a-graph-/solutions/graph.rb b/14-week-11/00-day-1--what-is-a-graph-/solutions/graph.rb new file mode 100644 index 00000000..1833bde7 --- /dev/null +++ b/14-week-11/00-day-1--what-is-a-graph-/solutions/graph.rb @@ -0,0 +1,136 @@ +require 'set' + +class Graph + attr_reader :graph + + def initialize(paths) + @graph = paths.reduce({}) { |graph, path| self.class.populate(graph, path) } + end + + def is_adjacent(vertex_a, vertex_b) + @graph[vertex_a].include?(vertex_b) + end + + def add_vertex(vertex, array) + @graph[vertex] = Set.new(array) + + array.each do |adjacency| + @graph[adjacency] = Set.new if @graph[adjacency].nil? + @graph[adjacency].add(vertex) + end + end + + def self.populate(graph, path) + path.each_with_index.reduce(graph) do |graph, (vertex, idx)| + graph[vertex] = Set.new if graph[vertex].nil? + next_vertex = path[idx + 1] + + return graph if next_vertex.nil? + + graph[vertex].add(next_vertex) + graph[next_vertex] = Set.new if graph[next_vertex].nil? + graph[next_vertex].add(vertex) + graph + end + end +end + +if __FILE__ == $PROGRAM_NAME + graph = Graph.new([]) + + puts "Expecting: {}" + puts graph.graph + + puts + + graph = Graph.new([["a", "b", "c"], ["b", "d"]]) + + puts 'Expecting: { a: { "b" }, b: { "a", "c", "d" }, c: { "b" }, d: { "b" }}' + puts graph.graph + + puts + + # Don't forget to add your own! + + puts "Expecting: true" + puts graph.is_adjacent("a", "b") + + puts + + puts "Expecting: false" + puts graph.is_adjacent("a", "c") + + puts + + graph.add_vertex("e", ["a", "d"]) + puts 'Expecting: { a: { "b", "e" }, b: { "a", "c", "d" }, c: { "b" }, d: { "b", "e" }, e: { "a", "d" } }' + puts graph.graph + + puts + + graph = Graph.new([["a"]]) + + puts "Expecting: { a: {} }" + puts graph.graph + + puts + + puts "" + + graph.add_vertex("d", ["a", "b", "c"]) + puts "Expecting: { a: { 'd' }, b: { 'd' }, c: { 'd' }, d: { 'a', 'b', 'c' } }" + puts graph.graph +end + +# Please add your pseudocode to this file +########################################################################################################### + # # this method converts a single path into a graph + # function populate(graph, path): + # iterate over the path with its index and element included: + # if element is not a key in graph: + # add element as key and initialize value to empty set + # + # if next element exists: + # add the next element to the element's set + # + # if next element isn't a key in graph: + # add next element as key in graph and initialize value to empty set + # + # add element to next element's set + # + # return graph + # + # + # function isAdjacent(vertex_a, vertex_b): + # get set from graph associated with key vertex_a + # return true if vertex_b is in set, else false + # + # function add_vertex(vertex, array): + # add vertex as key in graph with value initialized to a set made from array + # + # iterate over each element in array: + # if element is not in graph: + # add element as key with value initialized to an empty set + # add vertex to each element's set in graph +########################################################################################################### + + # And a written explanation of your solution +########################################################################################################### + # I can create the graph from an array of paths by creating a key in the graph object for every + # element in a path. If the element, or vertex, is not in the graph, I initialize it to an empty + # set. Since the next vertex in the path is adjacent to the current vertex, I can have them both + # point to each other, or rather put each vertex in the other's adjacency list. + # + # To check if two vertices are adjacent, I just need to grab one of their sets (values in the graph), + # and check if the other vertex is in its adjacency list. If it is return true, otherwise false. + # + # To add a vertex, I add it as a key to the graph and set its value to a new set made from the array + # (adjacency list) that's passed into the method. Next, I iterate over the array to ensure each vertex + # is added to the graph as a key if it's not already in there. I also need to ensure that each vertex + # in the adjacency list points back to the added vertex. +########################################################################################################### + + # Time complexity for: + # creating a new graph: O(n) since we must iterate over the entire paths array + # checking if adjacent: O(1) accessing an element in a set is constant time as is accessing a key in a hash + # adding a vertex: O(n) since we must iterate over the entire adjacency list diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/.gitignore b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/README.md b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/README.md new file mode 100644 index 00000000..f0017b5f --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/README.md @@ -0,0 +1,87 @@ +# Days 2 to 3: Depth-First Graph Traversal + +![fork in the road](./fork_road.jpg) + +For this challenge we'll be determining whether there is a path from vertex A to vertex B in a graph. We'll do this using depth-first traversal, which is typically a recursive process. During a depth-first traversal, we explore a path completely before going down another path. It's like exploring a fork in a road on foot: you walk all the way down one side of the fork, then walk back up to where you started, and then go down the other side before walking back up again. + +## Our Graph + +For this challenge, we'll be using a directed disconnected graph stored in a hash/object where each key maps to an adjacency list. Let's break down that word jumble: + +- Directed graph: Starting at any vertex, we can travel in only one direction, e.g. we can go from vertex A to vertex B but not from B to A. This is similar to a Linked List. The difference, however, is that we can connect any two vertices we like, e.g. A -> B -> C -> A, and a vertex may be connected to many other vertices. +- Disconnected: It is possible that certain vertices might be unreachable from another vertex. E.g. we can go from A to B, but there is no path from A to C. +- Adjacency list: A list of vertices that share an edge with a given vertex, i.e. there is a direct connection from the given vertex to every vertex in the adjacency list. + +Example: + +![friends graph](./graph.jpg) + +``` +graph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] +} +``` + +In this graph, jan can travel to carl via john, but jambaby can't visit anyone and neither can dave. Similarly, no one can visit dave, who's just floating in space all by their lonesome. Sorry dave. + +## Implement isPath(graph, vertexA, vertexB) / is_path(graph, vertex_a, vertex_b) + +Your method will be given a graph stored in a hash/object. Each key represents a vertex in the graph, and each value will be a list of adjacent vertices stored in an array. The method will also be passed two vertices. Your job is to determine whether there is a path between them. If there is, return `true`, otherwise `false`. The vertices given will always be in the graph, and the graph will always be valid and contain data. + +``` +graph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] +} + +is_path(graph, "jan", "carl") +=> true + +is_path(graph, "jan", "dave") +=> false +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/fork_road.jpg b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/fork_road.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1860ebeb33d6b699141a9b9896099975e5df8c2a GIT binary patch literal 130426 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

    Q`v;JjWAbLEH_lyfp>US^u{jAuOE3W?l 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 OJzDaQyr2K=)c*sJh9YnP literal 0 HcmV?d00001 diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/graph_dfs.js b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/graph_dfs.js new file mode 100644 index 00000000..b3b7294e --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/graph_dfs.js @@ -0,0 +1,27 @@ +function isPath(graph, vertexA, vertexB) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + let graph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] + }; + + console.log("Expecting: true"); + console.log(isPath(graph, "jan", "carl")); + + console.log(""); + + console.log("Expecting: false"); + console.log(isPath(graph, "jan", "dave")); +} + +module.exports = isPath; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/package.json b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/package.json new file mode 100644 index 00000000..5b7abd3a --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "graph_dfs", + "version": "1.0.0", + "description": "depth-first graph traversal", + "main": "graph_dfs.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/tests/graph_dfs.test.js b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/tests/graph_dfs.test.js new file mode 100644 index 00000000..1fd03046 --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/javascript/tests/graph_dfs.test.js @@ -0,0 +1,61 @@ +const isPath = require("../graph_dfs"); + +const simpleGraph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] +}; + +const lessSimpleGraph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby", "dave"], + dave: ["jan"], + mittens: [] +}; + +const complexGraph = { + jan: ["john", "jambaby", "malala"], + john: ["carl"], + jambaby: [], + carl: ["jambaby", "dave", "martin"], + dave: ["jan"], + mittens: [], + martin: ["mittens"], + malala: ["dave", "carl", "martin", "pirate"], + pirate: ["shiba", "inu"], + shiba: [], + inu: [] +}; + +describe("isPath", () => { + it("returns true when there is a path between two vertices", () => { + expect(isPath(simpleGraph, "jan", "carl")).toBe(true); + expect(isPath(simpleGraph, "jan", "jambaby")).toBe(true); + }); + + it("returns false when there is NO path between two vertices", () => { + expect(isPath(simpleGraph, "jan", "dave")).toBe(false); + expect(isPath(simpleGraph, "dave", "jambaby")).toBe(false); + expect(isPath(simpleGraph, "jan", "jan")).toBe(false); + }); + + it("returns true when there is a path from A to B and A and B are the same vertex", () => { + expect(isPath(lessSimpleGraph, "jan", "jan")).toBe(true); + }); + + it("returns false when there is NO path from A to B and A and B are the same vertex", () => { + expect(isPath(simpleGraph, "jan", "jan")).toBe(false); + }); + + it("can handle coming across looping paths", () => { + expect(isPath(lessSimpleGraph, "jan", "mittens")).toBe(false); + }); + + it("can handle slightly complex paths", () => { + expect(isPath(complexGraph, "carl", "inu")).toBe(true); + }); +}); diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/.rspec b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/Gemfile b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/graph_dfs.rb b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/graph_dfs.rb new file mode 100644 index 00000000..978ae94b --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/graph_dfs.rb @@ -0,0 +1,26 @@ +def is_path(graph, vertex_a, vertex_b) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + graph = { + jan: [:john, :jambaby], + john: [:carl], + jambaby: [], + carl: [:jambaby], + dave: [] + } + + puts "Expecting: true" + puts is_path(graph, :jan, :carl) + + puts + + puts "Expecting: false" + puts is_path(graph, :jan, :dave) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/spec/graph_dfs_spec.rb b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/spec/graph_dfs_spec.rb new file mode 100644 index 00000000..6002385a --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/spec/graph_dfs_spec.rb @@ -0,0 +1,61 @@ +require "./graph_dfs" + +RSpec.describe "is_path" do + simple_graph = { + jan: [:john, :jambaby], + john: [:carl], + jambaby: [], + carl: [:jambaby], + dave: [] + } + + less_simple_graph = { + jan: [:john, :jambaby], + john: [:carl], + jambaby: [], + carl: [:jambaby, :dave], + dave: [:jan], + mittens: [] + } + + complex_graph = { + jan: [:john, :jambaby, :malala], + john: [:carl], + jambaby: [], + carl: [:jambaby, :dave, :martin], + dave: [:jan], + mittens: [], + martin: [:mittens], + malala: [:dave, :carl, :martin, :pirate], + pirate: [:shiba, :inu], + shiba: [], + inu: [] + } + + it "returns true when there is a path between two vertices" do + expect(is_path(simple_graph, :jan, :carl)).to be true + expect(is_path(simple_graph, :jan, :jambaby)).to be true + end + + it "returns false when there is NO path between two vertices" do + expect(is_path(simple_graph, :jan, :dave)).to be false + expect(is_path(simple_graph, :dave, :jambaby)).to be false + expect(is_path(simple_graph, :jan, :jan)).to be false + end + + it "returns true when there is a path from A to B and A and B are the same vertex" do + expect(is_path(less_simple_graph, :jan, :jan)).to be true + end + + it "returns false when there is NO path from A to B and A and B are the same vertex" do + expect(is_path(simple_graph, :jan, :jan)).to be false + end + + it "can handle coming across looping paths" do + expect(is_path(less_simple_graph, :jan, :mittens)).to be false + end + + it "can handle slightly complex paths" do + expect(is_path(complex_graph, :carl, :inu)).to be true + end +end \ No newline at end of file diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/spec/spec_helper.rb b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/solutions/graph_dfs.js b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/solutions/graph_dfs.js new file mode 100644 index 00000000..86849471 --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/solutions/graph_dfs.js @@ -0,0 +1,136 @@ +function isPath(graph, vertexA, vertexB, visited = new Set()) { + visited.add(vertexA); + + for (const vertex of graph[vertexA]) { + if (vertex === vertexB) { + return true; + } + + if (!visited.has(vertex)) { + if (isPath(graph, vertex, vertexB, visited)) { + return true; + } + } + } + + return false; +} + +if (require.main === module) { + // add your own tests in here + let graph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] + }; + + console.log("Expecting: true"); + console.log(isPath(graph, "jan", "carl")); + + console.log(""); + + console.log("Expecting: false"); + console.log(isPath(graph, "jan", "dave")); + + console.log(""); + + console.log("Expecting: false"); + console.log(isPath(graph, "dave", "jambaby")); + + console.log(""); + + console.log("Expecting: false"); + console.log(isPath(graph, "jan", "jan")); + + graph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby", "dave"], + dave: ["jan"], + mittens: [] + }; + + console.log(""); + + console.log("Expecting: true"); + console.log(isPath(graph, "jan", "jan")); + + console.log(""); + + console.log("Expecting: false"); + console.log(isPath(graph, "jan", "mittens")); + + graph = { + jan: ["john", "jambaby", "malala"], + john: ["carl"], + jambaby: [], + carl: ["jambaby", "dave", "martin"], + dave: ["jan"], + mittens: [], + martin: ["mittens"], + malala: ["dave", "carl", "martin", "pirate"], + pirate: ["shiba", "inu"], + shiba: [], + inu: [] + }; + + console.log(""); + + console.log("Expecting: true"); + console.log(isPath(graph, "carl", "inu")); +} + +module.exports = isPath; + +// Please add your pseudocode to this file +/****************************************************************************************** + * function is_path(graph, vertex_a, vertex_b, visited): + * add vertex_a to visited + * + * iterate over each vertex in vertex_a adjacency list: + * return true if vertex == vertex_b + * + * if vertex is not in visited: + * initialize variable result to value returned from is_path(graph, vertex, vertex_b, visited) + * return true if result is true + * + * return false + * *****************************************************************************************/ + +// And a written explanation of your solution +/****************************************************************************************** + * I started by thinking of my base case, which is that the algorithm should return true if + * vertex B is in vertex A's adjacency list. I'm not checking for inclusion in the other direction + * from B to A because this is a directed graph. Since it is possible for there to be loops in + * the graph, I need to also store a list of vertices that have been visited. This prevents me + * from creating a stack overflow / infinite loop. + * + * I chose a Set instead of an Array to track the visited vertices because checking if a vertex + * has been visited already would then have an O(1) lookup time, whereas an Array would be O(n). + * The trade-off is that the Set takes up more space in memory. + * + * I chose to iterate over the adjacency list using a loop that can be broken out of, as opposed + * to one that offers no breaking mechanism. I did this because I want iteration to stop as soon + * as a path has been found. At that time I can simply return true. + * + * I decided the best place for the base case was inside of the loop that iterates over the + * adjacency list. That way if I find a match for vertex B, I can return true and not recurse. + * This also ensures that if I'm looking for a path from vertex A back to vertex A it will only + * return true if there is actually a path. If I put the base case above the loop, it'd return true + * in all cases when searching for such a loop. + * + * On each iteration, I also check if the vertex in the adjacency list has not been visited. If it hasn't + * I recurse with the current vertex that's being iterated over, vertex B, and the + * visited Set. If the recursive call returns true, that value will travel up the stack and + * continue returning true until it reaches the top and the whole method returns true. + * + * If all reachable vertices are visited and vertex B is not found, the algorithm will return + * false once it exits the iteration in each frame. + * + * The time complexity for the worst case occurs when we must visit every vertex and every + * adjacency list. I think this can be boiled down to O(n) essentially, but in reality it's + * a combination of all the vertices and all of the edges, since they'd all be visited, O(V + E). + * *****************************************************************************************/ diff --git a/14-week-11/01-days-2-to-3--depth-first-graph-traversal/solutions/graph_dfs.rb b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/solutions/graph_dfs.rb new file mode 100644 index 00000000..049576cf --- /dev/null +++ b/14-week-11/01-days-2-to-3--depth-first-graph-traversal/solutions/graph_dfs.rb @@ -0,0 +1,131 @@ +require "set" + +def is_path(graph, vertex_a, vertex_b, visited = Set.new) + visited.add(vertex_a) + idx = 0 + + while idx < graph[vertex_a].length + vertex = graph[vertex_a][idx] + idx += 1 + return true if vertex == vertex_b + next if visited.include?(vertex) + return true if is_path(graph, vertex, vertex_b, visited) + end + + false +end + +if __FILE__ == $PROGRAM_NAME + graph = { + jan: [:john, :jambaby], + john: [:carl], + jambaby: [], + carl: [:jambaby], + dave: [] + } + + puts "Expecting: true" + puts is_path(graph, :jan, :carl) + + puts + + puts "Expecting: false" + puts is_path(graph, :jan, :dave) + + # Don't forget to add your own! + puts "Expecting: false" + puts is_path(graph, :dave, :jambaby) + + puts "" + + puts "Expecting: false" + puts is_path(graph, :jan, :jan) + + graph = { + jan: [:john, :jambaby], + john: [:carl], + jambaby: [], + carl: [:jambaby, :dave], + dave: [:jan], + mittens: [] + } + + puts "" + + puts "Expecting: true" + puts is_path(graph, :jan, :jan) + + puts "" + + puts "Expecting: false" + puts is_path(graph, :jan, :mittens) + + graph = { + jan: [:john, :jambaby, :malala], + john: [:carl], + jambaby: [], + carl: [:jambaby, :dave, :martin], + dave: [:jan], + mittens: [], + martin: [:mittens], + malala: [:dave, :carl, :martin, :pirate], + pirate: [:shiba, :inu], + shiba: [], + inu: [] + } + + puts "" + + puts "Expecting: true" + puts is_path(graph, :carl, :inu) +end + +# Please add your pseudocode to this file +############################################################################################################# +# function is_path(graph, vertex_a, vertex_b, visited): +# add vertex_a to visited +# +# iterate over each vertex in vertex_a adjacency list: +# return true if vertex == vertex_b +# +# if vertex is not in visited: +# initialize variable result to value returned from is_path(graph, vertex, vertex_b, visited) +# return true if result is true +# +# return false +############################################################################################################# + +# And a written explanation of your solution +############################################################################################################# +# I started by thinking of my base case, which is that the algorithm should return true if +# vertex B is in vertex A's adjacency list. I'm not checking for inclusion in the other direction +# from B to A because this is a directed graph. Since it is possible for there to be loops in +# the graph, I need to also store a list of vertices that have been visited. This prevents me +# from creating a stack overflow / infinite loop. +# +# I chose a Set instead of an Array to track the visited vertices because checking if a vertex +# has been visited already would then have an O(1) lookup time, whereas an Array would be O(n). +# The trade-off is that the Set takes up more space in memory. +# +# I chose to iterate over the adjacency list using a loop that can be broken out of, as opposed +# to one that offers no breaking mechanism. I did this because I want iteration to stop as soon +# as a path has been found. At that time I can simply return true. +# +# I decided the best place for the base case was inside of the loop that iterates over the +# adjacency list. That way if I find a match for vertex B, I can return true and not recurse. +# This also ensures that if I'm looking for a path from vertex A back to vertex A it will only +# return true if there is actually a path. If I put the base case above the loop, it'd return true +# in all cases when searching for such a loop. +# +# On each iteration, I also check if the vertex in the adjacency list has not been visited. If it hasn't +# I recurse with the current vertex that's being iterated over, vertex B, and the +# visited Set. If the recursive call returns true, that value will travel up the stack and +# continue returning true until it reaches the top and the whole method returns true. +# +# If all reachable vertices are visited and vertex B is not found, the algorithm will return +# false once it exits the iteration in each frame. +# +# The time complexity for the worst case occurs when we must visit every vertex and every +# adjacency list. I think this can be boiled down to O(n) essentially, but in reality it's +# a combination of all the vertices and all of the edges, since they'd all be visited, O(V + E). +############################################################################################################# diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/.gitignore b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/README.md b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/README.md new file mode 100644 index 00000000..80140400 --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/README.md @@ -0,0 +1,75 @@ +# Days 4 to 5: Breadth-first Graph Traversal + +![Friends graph](./graph.jpg) + +For this challenge we are going to find the length of the shortest distance between two friends (or vertices, rather, which represent friends). To achieve this we'll need to perform a breadth-first search (BFS). Unlike depth-first search (DFS), which travels all the way down a path, a BFS considers all adjacent vertices on each iteration. If we were to do a BFS on the friends graph to find the shortest distance from jan to carl, it might check the friends like so: + +1. Is john == carl? +2. Is jambaby == carl? +3. Is carl == carl? + +In other words, the algorithm checks the adjacent vertices first (the closest ones to the starting vertex), and then checks the vertices adjacent to those. Since it always checks the closest vertices first, and the furthest last, it's perfect for finding the shortest distance between two vertices! + +You should know that this type of search can also help us find the shortest path between two points! + +## find_distance(graph, vertex_a, vertex_b) / findDistance(graph, vertexA, vertexB) + +Use BFS to return the shortest distance from vertex A to B. If there is no path, return -1. The graph and vertices will always be valid. The graph will always contain vertices and vertices A and B will always be in the graph. We will be using a directed disconnected graph. + +If you are asked to find the distance from a vertex back to itself, i.e. a cycle, return the distance of the cycle, rather than 0. Be aware that there might not be a cycle. + +``` +graph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] +} + +find_distance(graph, "jan", "carl") +=> 2 + +find_distance(graph, "dave", "carl") +=> -1 +``` + +_Hint: A BFS is normally implemented as an iterative algorithm that uses a queue to track which vertices to visit next. Be careful of cycles!_ + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/graph.jpg b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/graph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62a62bebd410852b881939c4ac5efad63ad1a51b GIT binary patch literal 16120 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 OJzDaQyr2K=)c*sJh9YnP literal 0 HcmV?d00001 diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/find_distance.js b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/find_distance.js new file mode 100644 index 00000000..eb99ac7b --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/find_distance.js @@ -0,0 +1,27 @@ +function findDistance(graph, vertexA, vertexB) { + // type your code here +} + +if (require.main === module) { + // add your own tests in here + const graph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] + }; + + console.log("Expecting: 2"); + console.log(findDistance(graph, "jan", "carl")); + + console.log(""); + + console.log("Expecting: -1"); + console.log(findDistance(graph, "dave", "carl")); +} + +module.exports = findDistance; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/package.json b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/package.json new file mode 100644 index 00000000..cad6013b --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "find_distance", + "version": "1.0.0", + "description": "find shortest distance between vertices", + "main": "find_distance.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/tests/find_distance.test.js b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/tests/find_distance.test.js new file mode 100644 index 00000000..572d982a --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/javascript/tests/find_distance.test.js @@ -0,0 +1,38 @@ +const findDistance = require("../find_distance"); + +describe("findDistance", () => { + const graphSmall = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] + }; + + const graphMed = { + jan: ["cranberry", "jamboree"], + john: ["jambaby"], + jambaby: ["jan", "cranberry"], + carl: [], + dave: ["john", "carl"], + cranberry: [], + hamtaro: ["jambaby", "dave"], + jamboree: ["carl", "john"] + }; + + it("returns the shortest distance between two vertices when there's a path between them", () => { + expect(findDistance(graphSmall, "jan", "carl")).toEqual(2); + expect(findDistance(graphMed, "dave", "carl")).toEqual(1); + }); + + it("returns -1 when there is no path between vertices", () => { + expect(findDistance(graphSmall, "dave", "carl")).toEqual(-1); + expect(findDistance(graphSmall, "jambaby", "carl")).toEqual(-1); + expect(findDistance(graphMed, "jamboree", "hamtaro")).toEqual(-1); + }); + + it("returns the correct distance when detecting cycles", () => { + expect(findDistance(graphSmall, "jan", "jan")).toEqual(-1); + expect(findDistance(graphMed, "jan", "jan")).toEqual(4); + }); +}); diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/.rspec b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/Gemfile b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/find_distance.rb b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/find_distance.rb new file mode 100644 index 00000000..99b3aa6e --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/find_distance.rb @@ -0,0 +1,26 @@ +def find_distance(graph, vertex_a, vertex_b) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + graph = { + jan: [:john, :jambaby], + john: [:carl], + jambaby: [], + carl: [:jambaby], + dave: [] + } + + puts "Expecting: 2" + puts find_distance(graph, :jan, :carl) + + puts + + puts "Expecting: -1" + puts find_distance(graph, :dave, :carl) + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/spec/find_distance_spec.rb b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/spec/find_distance_spec.rb new file mode 100644 index 00000000..d6a60499 --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/spec/find_distance_spec.rb @@ -0,0 +1,38 @@ +require "./find_distance" + +RSpec.describe "find_distance" do + graph_small = { + jan: [:john, :jambaby], + john: [:carl], + jambaby: [], + carl: [:jambaby], + dave: [] + } + + graph_med = { + jan: [:cranberry, :jamboree], + john: [:jambaby], + jambaby: [:jan, :cranberry], + carl: [], + dave: [:john, :carl], + cranberry: [], + hamtaro: [:jambaby, :dave], + jamboree: [:carl, :john] + } + + it "returns the shortest distance between two vertices when there's a path between them" do + expect(find_distance(graph_small, :jan, :carl)).to eq 2 + expect(find_distance(graph_med, :dave, :carl)).to eq 1 + end + + it "returns -1 when there is no path between vertices" do + expect(find_distance(graph_small, :dave, :carl)).to eq -1 + expect(find_distance(graph_small, :jambaby, :carl)).to eq -1 + expect(find_distance(graph_med, :jamboree, :hamtaro)).to eq -1 + end + + it "returns the correct distance when detecting cycles" do + expect(find_distance(graph_small, :jan, :jan)).to eq -1 + expect(find_distance(graph_med, :jan, :jan)).to eq 4 + end +end \ No newline at end of file diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/spec/spec_helper.rb b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/solutions/find_distance.js b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/solutions/find_distance.js new file mode 100644 index 00000000..03d3b33c --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/solutions/find_distance.js @@ -0,0 +1,124 @@ +function findDistance(graph, vertexA, vertexB) { + const queue = [[0, vertexA]]; + const visited = new Set(); + + while (queue.length > 0) { + const [distance, vertex] = queue.shift(); + + if (vertex === vertexB && distance > 0) { + return distance; + } + + if (visited.has(vertex)) { + continue; + } + + graph[vertex].forEach((adj) => { + queue.push([distance + 1, adj]); + }); + + visited.add(vertex); + } + + return -1; +} + +if (require.main === module) { + // add your own tests in here + let graph = { + jan: ["john", "jambaby"], + john: ["carl"], + jambaby: [], + carl: ["jambaby"], + dave: [] + }; + + console.log("Expecting: 2"); + console.log(findDistance(graph, "jan", "carl")); + + console.log(""); + + console.log("Expecting: -1"); + console.log(findDistance(graph, "dave", "carl")); + + console.log(""); + + console.log("Expecting: -1"); + console.log(findDistance(graph, "jan", "jan")); + + console.log(""); + + console.log("Expecting: -1"); + console.log(findDistance(graph, "jambaby", "carl")); + + graph = { + jan: ["cranberry", "jamboree"], + john: ["jambaby"], + jambaby: ["jan", "cranberry"], + carl: [], + dave: ["john", "carl"], + cranberry: [], + hamtaro: ["jambaby", "dave"], + jamboree: ["carl", "john"] + }; + + console.log(""); + + console.log("Expecting: 4"); + console.log(findDistance(graph, "jan", "jan")); + + console.log(""); + + console.log("Expecting: 1"); + console.log(findDistance(graph, "dave", "carl")); + + console.log(""); + + console.log("Expecting: -1"); + console.log(findDistance(graph, "jamboree", "hamtaro")); +} + +module.exports = findDistance; + +// Please add your pseudocode to this file +/************************************************************************************ + * function find_distance(graph, vertex_a, vertex_b): + * initialize an array queue to store the starting vertex with a distance of 0 + * initialize an empty set to store the visited vertices + * + * while the queue has vertices: + * remove the first vertex from the queue + * + * if the vertex equals the target vertex_b and the distance is more than 0: + * return distance + * + * if the vertex has not been visited: + * iterate over its adjacency list: + * add each vertex and distance + 1 to the queue + * + * add the vertex to visited + * + * return -1 +*************************************************************************************/ + + // And a written explanation of your solution +/************************************************************************************ + * To find the distance from one vertex to another we need to always keep track of + * which vertices require visitation, which have been visited so we can avoid infinite + * loops, and the distance of each vertex from the start at any given time. This is why + * our queue is a 2-dimensional array: it needs to store the vertex and its distance. + * + * At the beginning, we add the starting vertex with a distance of 0 to the queue. Next + * we enter the loop and remove the first vertex from the queue. We can then check if + * this vertex is the target vertex and if we've actually traveled the graph by checking + * that the distance is more than 0. If so, we can return the distance. + * + * Next, we check if we've already visited this vertex. If we have, it means we've already + * added its adjacent vertices to the queue at some point, and we should not do that + * again so as to avoid infinite loops. If it has been visited, we can just continue + * on to the next iteration. If it hasn't been visited, we add each adjacent vertex + * to the queue with the correct distance, which is distance + 1. Lastly, we add the + * vertex to visited. + * + * If we visit every reachable vertex without finding the target, we return -1. +*************************************************************************************/ \ No newline at end of file diff --git a/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/solutions/find_distance.rb b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/solutions/find_distance.rb new file mode 100644 index 00000000..ac923a48 --- /dev/null +++ b/14-week-11/02-days-4-to-5--breadth-first-graph-traversal/solutions/find_distance.rb @@ -0,0 +1,120 @@ +require "set" + +def find_distance(graph, vertex_a, vertex_b) + queue = [[0, vertex_a]] + visited = Set.new + + until queue.empty? + distance, vertex = queue.shift + + return distance if vertex == vertex_b && distance > 0 + next if visited.include? vertex + + graph[vertex].each do |adj| + queue << [distance + 1, adj] + end + + visited.add(vertex) + end + + -1 +end + +if __FILE__ == $PROGRAM_NAME + graph = { + jan: [:john, :jambaby], + john: [:carl], + jambaby: [], + carl: [:jambaby], + dave: [] + } + + puts "Expecting: 2" + puts find_distance(graph, :jan, :carl) + + puts + + puts "Expecting: -1" + puts find_distance(graph, :dave, :carl) + + puts + + puts "Expecting: -1" + puts find_distance(graph, :jan, :jan) + + puts + + puts "Expecting: -1" + puts find_distance(graph, :jambaby, :carl) + + # Don't forget to add your own! + + graph = { + jan: [:cranberry, :jamboree], + john: [:jambaby], + jambaby: [:jan, :cranberry], + carl: [], + dave: [:john, :carl], + cranberry: [], + hamtaro: [:jambaby, :dave], + jamboree: [:carl, :john] + } + + puts + + puts "Expecting: 4" + puts find_distance(graph, :jan, :jan) + + puts + + puts "Expecting: 1" + puts find_distance(graph, :dave, :carl) + + puts + + puts "Expecting: -1" + puts find_distance(graph, :jamboree, :hamtaro) +end + +# Please add your pseudocode to this file +########################################################################################### + # function find_distance(graph, vertex_a, vertex_b): + # initialize an array queue to store the starting vertex with a distance of 0 + # initialize an empty set to store the visited vertices + # + # while the queue has vertices: + # remove the first vertex from the queue + # + # if the vertex equals the target vertex_b and the distance is more than 0: + # return distance + # + # if the vertex has not been visited: + # iterate over its adjacency list: + # add each vertex and distance + 1 to the queue + # + # add the vertex to visited + # + # return -1 +########################################################################################### + + # And a written explanation of your solution +########################################################################################### + # To find the distance from one vertex to another we need to always keep track of + # which vertices require visitation, which have been visited so we can avoid infinite + # loops, and the distance of each vertex from the start at any given time. This is why + # our queue is a 2-dimensional array: it needs to store the vertex and its distance. + # + # At the beginning, we add the starting vertex with a distance of 0 to the queue. Next + # we enter the loop and remove the first vertex from the queue. We can then check if + # this vertex is the target vertex and if we've actually traveled the graph by checking + # that the distance is more than 0. If so, we can return the distance. + # + # Next, we check if we've already visited this vertex. If we have, it means we've already + # added its adjacent vertices to the queue at some point, and we should not do that + # again so as to avoid infinite loops. If it has been visited, we can just continue + # on to the next iteration. If it hasn't been visited, we add each adjacent vertex + # to the queue with the correct distance, which is distance + 1. Lastly, we add the + # vertex to visited. + # + # If we visit every reachable vertex without finding the target, we return -1. +########################################################################################### diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/.gitignore b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/README.md b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/README.md new file mode 100644 index 00000000..1b0b3d09 --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/README.md @@ -0,0 +1,70 @@ +# Days 1 to 2: Convert an HTML Table to a Graph + +For this challenge, you'll be provided with a string of HTML representing a table of friends. You'll need to convert the table to an undirected graph. The final graph may be disconnected, i.e. there might not be a path from each person to every other person. The string will always contain a valid HTML table with entries in it, and the table will always have the same format: a header row followed by rows which contain the friends data, with two cells per row. + +Note that the returned graph is a Hash/Object and the adjacency lists are arrays. Also, although the table stored in the string in the example below is spaced with carriage returns, the string provided to your function will not be. Instead, it'll always be a continuous string like so: `"..."`. Spacing is shown below to help you understand how the data is represented in the table. + +``` +friends = "
    + + + + + + + + + + + + +
    PersonFriends
    FredJane, Carol, Anesh, Xi
    CarolFred, Anesh, Janelle
    " + +table_to_graph(friends) +=> { + "Fred": ["Jane", "Carol", "Anesh", "Xi"], + "Jane": ["Fred"], + "Carol": ["Fred", "Anesh", "Janelle"], + "Anesh": ["Fred", "Carol"], + "Xi": ["Fred"], + "Janelle": ["Carol"] +} +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/package.json b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/package.json new file mode 100644 index 00000000..a2ca36ad --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "table-to-graph", + "version": "1.0.0", + "description": "convert html table to a graph", + "main": "table_to_graph.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/table_to_graph.js b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/table_to_graph.js new file mode 100644 index 00000000..96935661 --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/table_to_graph.js @@ -0,0 +1,35 @@ +function tableToGraph(friends) { + // type your code here +} + +if (require.main === module) { + function printResults(obj) { + for (const key in obj) { + console.log(`${key}: ${obj[key]}`); + } + } + + // add your own tests in here + const friends = "
    PersonFriends
    FredJane, Carol, Anesh, Xi
    CarolFred, Anesh, Janelle
    "; + const result = { + Fred: ["Jane", "Carol", "Anesh", "Xi"], + Jane: ["Fred"], + Carol: ["Fred", "Anesh", "Janelle"], + Anesh: ["Fred", "Carol"], + Xi: ["Fred"], + Janelle: ["Carol"] + }; + + console.log("Expecting: "); + console.log(printResults(result)); + console.log(""); + console.log("Got: "); + console.log(printResults(tableToGraph(friends))); + + console.log(""); +} + +module.exports = tableToGraph; + +// Please add your pseudocode to this file +// And a written explanation of your solution diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/tests/table_to_graph.test.js b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/tests/table_to_graph.test.js new file mode 100644 index 00000000..161d8c3c --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/javascript/tests/table_to_graph.test.js @@ -0,0 +1,88 @@ +const tableToGraph = require("../table_to_graph"); + +describe("tableToGraph()", () => { + test("converts an HTML table to a friends graph which is a Hash with array adjacency lists", () => { + let friends = "
    PersonFriends
    FredJane, Carol, Anesh, Xi
    CarolFred, Anesh, Janelle
    "; + let result = { + "Fred": ["Jane", "Carol", "Anesh", "Xi"], + "Jane": ["Fred"], + "Carol": ["Fred", "Anesh", "Janelle"], + "Anesh": ["Fred", "Carol"], + "Xi": ["Fred"], + "Janelle": ["Carol"] + }; + let graph = tableToGraph(friends); + + expect(Object.keys(graph).sort()).toEqual(Object.keys(result).sort()); + + for (const key in result) { + expect(graph[key].sort()).toEqual(result[key].sort()); + } + + friends = "
    PersonFriends
    GremlinJambaby
    "; + result = { + "Gremlin": ["Jambaby"], + "Jambaby": ["Gremlin"] + }; + graph = tableToGraph(friends); + + expect(Object.keys(graph).sort()).toEqual(Object.keys(result).sort()); + + for (const key in result) { + expect(graph[key].sort()).toEqual(result[key].sort()); + } + }); + + test("returns the correct result when the resulting graph is disconnected", () => { + let friends = "
    PersonFriends
    GremlinJambaby, Carbonara, Hamtaro, Crain
    BatsCustard, Colonel
    MalteserJambaby, Hamtaro, Bartelby, Viper
    ViperMalteser, Munchkin, Baconini, Bartelby
    "; + let result = { + "Gremlin": ["Jambaby", "Carbonara", "Hamtaro", "Crain"], + "Jambaby": ["Gremlin", "Malteser"], + "Carbonara": ["Gremlin"], + "Hamtaro": ["Gremlin", "Malteser"], + "Crain": ["Gremlin"], + "Bats": ["Custard", "Colonel"], + "Custard": ["Bats"], + "Colonel": ["Bats"], + "Malteser": ["Jambaby", "Hamtaro", "Bartelby", "Viper"], + "Bartelby": ["Malteser", "Viper"], + "Viper": ["Malteser", "Munchkin", "Baconini", "Bartelby"], + "Munchkin": ["Viper"], + "Baconini": ["Viper"] + }; + graph = tableToGraph(friends); + + expect(Object.keys(graph).sort()).toEqual(Object.keys(result).sort()); + + for (const key in result) { + expect(graph[key].sort()).toEqual(result[key].sort()); + } + }); + + test("returns the correct result when a person has no friends :(", () => { + let friends = "
    PersonFriends
    Gremlin
    "; + let result = { + "Gremlin": [] + }; + let graph = tableToGraph(friends); + + expect(Object.keys(graph).sort()).toEqual(Object.keys(result).sort()); + + for (const key in result) { + expect(graph[key].sort()).toEqual(result[key].sort()); + } + + friends = "
    PersonFriends
    Gremlin
    Baconini
    "; + result = { + "Gremlin": [], + "Baconini": [] + }; + graph = tableToGraph(friends); + + expect(Object.keys(graph).sort()).toEqual(Object.keys(result).sort()); + + for (const key in result) { + expect(graph[key].sort()).toEqual(result[key].sort()); + } + }); +}); \ No newline at end of file diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/Gemfile b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/Gemfile new file mode 100644 index 00000000..3b693468 --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/spec/table_to_graph_spec.rb b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/spec/table_to_graph_spec.rb new file mode 100644 index 00000000..96f05664 --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/spec/table_to_graph_spec.rb @@ -0,0 +1,89 @@ +require "./table_to_graph" + +RSpec.describe "table_to_graph" do + it "converts an HTML table to a friends graph which is a Hash with array adjacency lists" do + friends = "
    PersonFriends
    FredJane, Carol, Anesh, Xi
    CarolFred, Anesh, Janelle
    " + result = { + "Fred" => ["Jane", "Carol", "Anesh", "Xi"], + "Jane" => ["Fred"], + "Carol" => ["Fred", "Anesh", "Janelle"], + "Anesh" => ["Fred", "Carol"], + "Xi" => ["Fred"], + "Janelle" => ["Carol"] + } + graph = table_to_graph(friends) + + expect(graph.keys).to match_array(result.keys) + + result.each do |k, v| + expect(graph[k]).to match_array(result[k]) + end + + friends = "
    PersonFriends
    GremlinJambaby
    " + result = { + "Gremlin" => ["Jambaby"], + "Jambaby" => ["Gremlin"] + } + + graph = table_to_graph(friends) + + expect(graph.keys).to match_array(result.keys) + + result.each do |k, v| + expect(graph[k]).to match_array(result[k]) + end + end + + it "returns the correct result when the resulting graph is disconnected" do + friends = "
    PersonFriends
    GremlinJambaby, Carbonara, Hamtaro, Crain
    BatsCustard, Colonel
    MalteserJambaby, Hamtaro, Bartelby, Viper
    ViperMalteser, Munchkin, Baconini, Bartelby
    " + result = { + "Gremlin" => ["Jambaby", "Carbonara", "Hamtaro", "Crain"], + "Jambaby" => ["Gremlin", "Malteser"], + "Carbonara" => ["Gremlin"], + "Hamtaro" => ["Gremlin", "Malteser"], + "Crain" => ["Gremlin"], + "Bats" => ["Custard", "Colonel"], + "Custard" => ["Bats"], + "Colonel" => ["Bats"], + "Malteser" => ["Jambaby", "Hamtaro", "Bartelby", "Viper"], + "Bartelby" => ["Malteser", "Viper"], + "Viper" => ["Malteser", "Munchkin", "Baconini", "Bartelby"], + "Munchkin" => ["Viper"], + "Baconini" => ["Viper"] + } + graph = table_to_graph(friends) + + expect(graph.keys).to match_array(result.keys) + + result.each do |k, v| + expect(graph[k]).to match_array(result[k]) + end + end + + it "returns the correct result when a person has no friends :(" do + friends = "
    PersonFriends
    Gremlin
    " + result = { + "Gremlin" => [] + } + graph = table_to_graph(friends) + + expect(graph.keys).to match_array(result.keys) + + result.each do |k, v| + expect(graph[k]).to match_array(result[k]) + end + + friends = "
    PersonFriends
    Gremlin
    Baconini
    " + result = { + "Gremlin" => [], + "Baconini" => [] + } + graph = table_to_graph(friends) + + expect(graph.keys).to match_array(result.keys) + + result.each do |k, v| + expect(graph[k]).to match_array(result[k]) + end + end +end diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/table_to_graph.rb b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/table_to_graph.rb new file mode 100644 index 00000000..93436420 --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/ruby/table_to_graph.rb @@ -0,0 +1,32 @@ +def table_to_graph(friends) + # type your code in here +end + +if __FILE__ == $PROGRAM_NAME + def print_results(hash) + hash.each { |key, val| puts "#{key}: #{val}" } + end + + friends = "
    PersonFriends
    FredJane, Carol, Anesh, Xi
    CarolFred, Anesh, Janelle
    " + result = { + "Fred" => ["Jane", "Carol", "Anesh", "Xi"], + "Jane" => ["Fred"], + "Carol" => ["Fred", "Anesh", "Janelle"], + "Anesh" => ["Fred", "Carol"], + "Xi" => ["Fred"], + "Janelle" => ["Carol"] + } + + puts "Expecting: " + print_results(result) + puts + puts "Got: " + print_results(table_to_graph(friends)) + + puts + + # Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/solutions/table_to_graph.js b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/solutions/table_to_graph.js new file mode 100644 index 00000000..47b19a91 --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/solutions/table_to_graph.js @@ -0,0 +1,156 @@ +function tableToGraph(friends) { + const dataString = friends.slice(55, -18).replace(/<\/tr>/g, ""); + const data = dataString.split(""); + const graph = {}; + + for (let idx = 0; idx < data.length; idx += 2) { + const vertex = data[idx]; + const friendsList = data[idx + 1] !== "" ? data[idx + 1].split(", ") : []; + + graph[vertex] = friendsList; + + friendsList.forEach(friend => { + if (!graph[friend]) { + graph[friend] = []; + } + + if(!graph[friend].includes(vertex)) { + graph[friend].push(vertex); + } + }); + } + + return graph; +} + +if (require.main === module) { + function printResults(obj) { + for (const key in obj) { + console.log(`${key}: ${obj[key]}`); + } + } + // add your own tests in here + let friends = "
    PersonFriends
    FredJane, Carol, Anesh, Xi
    CarolFred, Anesh, Janelle
    "; + let result = { + Fred: ["Jane", "Carol", "Anesh", "Xi"], + Jane: ["Fred"], + Carol: ["Fred", "Anesh", "Janelle"], + Anesh: ["Fred", "Carol"], + Xi: ["Fred"], + Janelle: ["Carol"] + }; + + console.log("Expecting: "); + console.log(printResults(result)); + console.log(""); + console.log("Got: "); + console.log(printResults(tableToGraph(friends))); + + console.log(""); + + friends = "
    PersonFriends
    GremlinJambaby, Carbonara, Hamtaro, Crain
    BatsCustard, Colonel
    MalteserJambaby, Hamtaro, Bartelby, Viper
    ViperMalteser, Munchkin, Baconini, Bartelby
    " + result = { + Gremlin: ["Jambaby", "Carbonara", "Hamtaro", "Crain"], + Jambaby: ["Gremlin", "Malteser"], + Carbonara: ["Gremlin"], + Hamtaro: ["Gremlin", "Malteser"], + Crain: ["Gremlin"], + Bats: ["Custard", "Colonel"], + Custard: ["Bats"], + Colonel: ["Bats"], + Malteser: ["Jambaby", "Hamtaro", "Bartelby", "Viper"], + Bartelby: ["Malteser", "Viper"], + Viper: ["Malteser", "Munchkin", "Baconini", "Bartelby"], + Munchkin: ["Viper"], + Baconini: ["Viper"] + }; + + console.log("Expecting: "); + console.log(printResults(result)); + console.log(""); + console.log("Got: "); + console.log(printResults(tableToGraph(friends))); + + console.log(""); + + friends = "
    PersonFriends
    GremlinJambaby
    "; + result = { + Gremlin: ["Jambaby"], + Jambaby: ["Gremlin"] + }; + + console.log("Expecting: "); + console.log(printResults(result)); + console.log(""); + console.log("Got: "); + console.log(printResults(tableToGraph(friends))); + + console.log(""); + + friends = "
    PersonFriends
    Gremlin
    "; + result = { + Gremlin: [] + }; + + console.log("Expecting: "); + console.log(printResults(result)); + console.log(""); + console.log("Got: "); + console.log(printResults(tableToGraph(friends))); + + console.log(""); + + friends = "
    PersonFriends
    Gremlin
    Baconini
    "; + result = { + Gremlin: [], + Baconini: [] + }; + + console.log("Expecting: "); + console.log(printResults(result)); + console.log(""); + console.log("Got: "); + console.log(printResults(tableToGraph(friends))); + + console.log(""); +} + +module.exports = tableToGraph; + +// Please add your pseudocode to this file +///////////////////////////////////////////////////////////////////////////////////////////// +// initialize a variable, data_string, and store the parts of the string between the TDs +// initialize data and split data_string's cells into an array, so that the left cell always +// comes just before the right cell +// initialize a Hash/Object called graph +// +// iterate over every other element of data: +// store the friends in an array (friends are the next element in data) +// add the current friend as a key in the graph +// set the value to the friends array +// set each friend as a key in the graph and add the current friend to their adjacency lists +// skipping duplicates +// +// return graph +///////////////////////////////////////////////////////////////////////////////////////////// + +// And a written explanation of your solution +///////////////////////////////////////////////////////////////////////////////////////////// +// From the prompt I know that there will always be at least one friend in the table. However, +// there is no guarantee that that friend will have any friends :( I also know that the +// table will always have the same HTML markup, just with a different number of rows. +// +// I figured that I should first split the table into an array, so that each element of the +// array would hold the friend data in a specific order. For example, for a table with only +// two cells, my array would look like this: ["Jam", "Gran, Minnie, Tabitha"] or [left cell, right cell] +// Now I can iterate over the array and know that every other element is an adjacency list +// for the friend in the element just before it. +// +// When I iterate over the array, I increase the index by 2 each time because of how my +// array is ordered. I set the currently iterated over element as the key in the graph, +// and then split the next element into an array of strings, which then becomes the value +// of the key in the graph (the adjacency list). I then need all of those friends in the +// adjacency list to point back to the original friend/key, but I have to ensure that if +// that friend is already a key in the graph that I don't duplicate any data in their adjacency +// list. +///////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/15-week-12/00-days-1-to-2--convert-html-to-a-graph/solutions/table_to_graph.rb b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/solutions/table_to_graph.rb new file mode 100644 index 00000000..41d949cd --- /dev/null +++ b/15-week-12/00-days-1-to-2--convert-html-to-a-graph/solutions/table_to_graph.rb @@ -0,0 +1,148 @@ +def table_to_graph(friends) + data_string = friends[55..-19].gsub(/<\/tr>/, "") + data = data_string.split("") + graph = Hash.new { |h, k| h[k] = [] } + idx = 0 + + while idx < data.length + friends_list = (data[idx + 1] || "").split(", ") + vertex = data[idx] + graph[vertex] = friends_list + + friends_list.each do |friend| + graph[friend] << vertex unless graph[friend].include?(vertex) + end + + idx += 2 + end + + graph +end + +if __FILE__ == $PROGRAM_NAME + def print_results(hash) + hash.each { |key, val| puts "#{key}: #{val}" } + end + + friends = "
    PersonFriends
    FredJane, Carol, Anesh, Xi
    CarolFred, Anesh, Janelle
    " + result = { + "Fred" => ["Jane", "Carol", "Anesh", "Xi"], + "Jane" => ["Fred"], + "Carol" => ["Fred", "Anesh", "Janelle"], + "Anesh" => ["Fred", "Carol"], + "Xi" => ["Fred"], + "Janelle" => ["Carol"] + } + + puts "Expecting: " + print_results(result) + puts + puts "Got: " + print_results(table_to_graph(friends)) + + puts + + friends = "
    PersonFriends
    GremlinJambaby, Carbonara, Hamtaro, Crain
    BatsCustard, Colonel
    MalteserJambaby, Hamtaro, Bartelby, Viper
    ViperMalteser, Munchkin, Baconini, Bartelby
    " + result = { + "Gremlin" => ["Jambaby", "Carbonara", "Hamtaro", "Crain"], + "Jambaby" => ["Gremlin", "Malteser"], + "Carbonara" => ["Gremlin"], + "Hamtaro" => ["Gremlin", "Malteser"], + "Crain" => ["Gremlin"], + "Bats" => ["Custard", "Colonel"], + "Custard" => ["Bats"], + "Colonel" => ["Bats"], + "Malteser" => ["Jambaby", "Hamtaro", "Bartelby", "Viper"], + "Bartelby" => ["Malteser", "Viper"], + "Viper" => ["Malteser", "Munchkin", "Baconini", "Bartelby"], + "Munchkin" => ["Viper"], + "Baconini" => ["Viper"] + } + + puts "Expecting: " + print_results(result) + puts + puts "Got: " + print_results(table_to_graph(friends)) + + puts + + friends = "
    PersonFriends
    GremlinJambaby
    " + result = { + "Gremlin" => ["Jambaby"], + "Jambaby" => ["Gremlin"] + } + + puts "Expecting: " + print_results(result) + puts + puts "Got: " + print_results(table_to_graph(friends)) + + puts + + friends = "
    PersonFriends
    Gremlin
    " + result = { + "Gremlin" => [] + } + + puts "Expecting: " + print_results(result) + puts + puts "Got: " + print_results(table_to_graph(friends)) + + puts + + friends = "
    PersonFriends
    Gremlin
    Baconini
    " + result = { + "Gremlin" => [], + "Baconini" => [] + } + + puts "Expecting: " + print_results(result) + puts + puts "Got: " + print_results(table_to_graph(friends)) + + puts +end + +# Please add your pseudocode to this file +######################################################################################### +# initialize a variable, data_string, and store the parts of the string between the TDs +# initialize data and split data_string's cells into an array, so that the left cell always +# comes just before the right cell +# initialize a Hash/Object called graph +# +# iterate over every other element of data: +# store the friends in an array (friends are the next element in data) +# add the current friend as a key in the graph +# set the value to the friends array +# set each friend as a key in the graph and add the current friend to their adjacency lists +# skipping duplicates +# +# return graph +######################################################################################### + +# And a written explanation of your solution +######################################################################################### +# From the prompt I know that there will always be at least one friend in the table. However, +# there is no guarantee that that friend will have any friends :( I also know that the +# table will always have the same HTML markup, just with a different number of rows. +# +# I figured that I should first split the table into an array, so that each element of the +# array would hold the friend data in a specific order. For example, for a table with only +# two cells, my array would look like this: ["Jam", "Gran, Minnie, Tabitha"] or [left cell, right cell] +# Now I can iterate over the array and know that every other element is an adjacency list +# for the friend in the element just before it. +# +# When I iterate over the array, I increase the index by 2 each time because of how my +# array is ordered. I set the currently iterated over element as the key in the graph, +# and then split the next element into an array of strings, which then becomes the value +# of the key in the graph (the adjacency list). I then need all of those friends in the +# adjacency list to point back to the original friend/key, but I have to ensure that if +# that friend is already a key in the graph that I don't duplicate any data in their adjacency +# list. +######################################################################################### diff --git a/16-pairing-exercise-4/00-whiteboard-and-calculate-big-o/README.md b/16-pairing-exercise-4/00-whiteboard-and-calculate-big-o/README.md new file mode 100644 index 00000000..e1ee55cc --- /dev/null +++ b/16-pairing-exercise-4/00-whiteboard-and-calculate-big-o/README.md @@ -0,0 +1,95 @@ +# Whiteboard and Calculate Big O + +## Introduction + +For this activity, you and your partner will each choose a problem and solve it +in front of one another, and you will also calculate the time complexity for the +solution. You may select a problem you have already solved or a problem you have +not yet solved. You may complete this activity using an actual whiteboard, if +available, or in the IDE of your choosing, such as VS Code or an online REPL. + +Keep in mind that these challenges tend to make people nervous, so remember to +always be kind, patient, and encouraging. Also be aware that nerves can cause +people to come up with some pretty weird solutions to problems, so remember to +bring your empathy with you! + +Plan to spend 15 minutes in each role. This means you and/or your partner might +not have enough time to finish the solution, and that's OK. If you can +reasonably spend more time on this, you can, but do put a time limit on it. Be +sure to calculate Big O for time complexity even if your solution isn't +complete. If you can, try to reason about and discuss what Big O would be if you +had completed it based on your pseudocode. + +## Instructions for Interviewer + +As the interviewer your job will be to first present the problem. Explain the +challenge to your partner and provide some example test cases. You are not +expected to provide every possible test case or edge case. Instead, provide just +enough detail for the interviewee to understand the problem and ask clarifying +questions. Example: "For this challenge, your function will accept a single +string as input and return it in reverse. So if it were to receive 'cat', it +would return 'tac'." + +You will also need to answer questions. Your partner might ask you to confirm +their understanding of the problem or whether or not they should handle certain +edge cases. If you don't know the answer to a question, it's OK to say "I don't +know" or "I'll let you decide." Sometimes the interviewer doesn't have the +answers. + +Notice when your partner gets stuck and needs a nudge in the right direction. +Provide helpful tips or hints, but don't give away the answer. Ideally, your +partner will ask questions when they get stuck, but if you notice that they're +struggling with something for a little too long, don't be afraid to give a +little nudge. You can also ask in advance if your partner would like a hint +before providing advice. + +When time is up, provide a constructive review of your partner's performance. +Some areas to talk about include: + +- Problem explanation: did your partner explain the problem back to you in their + own words and confirm their understanding before coding? Did they ask + clarifying questions when necessary? +- Testing: did your partner check their understanding against the given test + case/s? Did they write their own? +- Pseudocoding: did your partner explain what they were going to do out loud + before coding and with pseudocode? Did they check their pseudocode against the + test cases? +- Solution: did your partner solve the problem? Was their syntax correct? Did + they handle all of the test cases? Were variables and functions named + appropriately? How readable was the code? +- Openness to feedback: Did they ask for feedback when necessary? Were they + receptive to your feedback? + +Ultimately, it is more important for the interviewer to evaluate the +interviewee's communication during this exercise, so if time is an issue, focus +your review there rather than on the solution itself. When providing feedback, +be specific, so your partner has an opportunity to improve. Also structure your +feedback into two sections. For example, you might talk about what went well and +then what can be improved, rather than mixing them together. + +## Instructions for Interviewee + +As the interviewee, your job will be to solve the problem posed by your partner. +The Interviewer instructions above explain which areas you should focus on in +order to ace your interview. The content in the Welcome section of this course +will also help, so make sure you read it before attempting your first whiteboard +challenge. + +Here are some general tips: + +- Communication is key: explain the problem and your approach to the solution +- Assume you haven't been given all of the information, such as all of the + inputs you need to account for +- Ask for help when you need it and be receptive to feedback +- Don't be afraid to admit when you know there's a better way to do something, + e.g. "I know I'm brute forcing this solution and there's a more efficient way, + but I want to solve it first and then optimize once I know I can solve it." + +When time is up, provide a constructive review for your interviewer. Some areas +to talk about include: + +- Did the interviewer communicate clearly? Could you understand the challenge + and did they answer your questions in a manner that you could understand? +- Did they give you time to solve the problem or explore a possible solution + before providing feedback? In other words, were they patient? +- Was their feedback helpful? diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/.gitignore b/17-week-13/00-day-1-to-2--dynamic-programming/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/README.md b/17-week-13/00-day-1-to-2--dynamic-programming/README.md new file mode 100644 index 00000000..d0cb878e --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/README.md @@ -0,0 +1,60 @@ +# Day 1-2: Dynamic Programming + +## Dynamic Programming + +Dynamic Programming (DP) is an algorithmic technique for solving an optimization problem by breaking it down into simpler subproblems and utilizing the fact that the optimal solution to the overall problem depends upon the optimal solution to its subproblems. + +## Task + +Revisit the Fibonacci series. Go back to your old solutions (iterative and recursive). If the iterative solution keeps a whole array of values, modify it to only keep track of the data it needs. Next, modify the recursive solution to count the number of stack frames. Copy this solution and modify it to use cached values to avoid repeating recursive calls with the same value. Benchmark each version and compare. + +Find the nth element in the Fibonacci series. The Fibonacci sequence starts with a 0 followed by a 1. After that, every value is the sum of the two values preceding it. Here are the first seven values as an example: 0, 1, 1, 2, 3, 5, 8. + +``` +Input: 0 +Output: 0 + +Input: 2 +Output: 1 + +Input: 10 +Output: 55 +``` + +Use the language of your choosing. We've included starter files for some languages where you can pseudocode, explain your solution and code. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/javascript/fibonacci.js b/17-week-13/00-day-1-to-2--dynamic-programming/javascript/fibonacci.js new file mode 100644 index 00000000..438f703d --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/javascript/fibonacci.js @@ -0,0 +1,24 @@ +function fibonacci(num) { +// type your code here +} + +if (require.main === module) { +// add your own tests in here +console.log("Expecting: 0"); +console.log("=>", fibonacci(0)); + +console.log(""); + +console.log("Expecting: 1"); +console.log("=>", fibonacci(2)); + +console.log(""); + +console.log("Expecting: 55"); +console.log("=>", fibonacci(10)); +} + +module.exports = fibonacci; + +// Please add your pseudocode to this file +// And a written explanation of your solution \ No newline at end of file diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/javascript/package.json b/17-week-13/00-day-1-to-2--dynamic-programming/javascript/package.json new file mode 100644 index 00000000..fed2cb53 --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "fibonacci", + "version": "1.0.0", + "description": "find nth value in fibo sequence with DP", + "main": "fibonacci.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/javascript/tests/fibonacci.test.js b/17-week-13/00-day-1-to-2--dynamic-programming/javascript/tests/fibonacci.test.js new file mode 100644 index 00000000..6d35f519 --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/javascript/tests/fibonacci.test.js @@ -0,0 +1,13 @@ +const fibonacci = require('../fibonacci'); + +const fibo = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811]; + +for (let i = 0; i < 10; ++i) { + test(`outputs the correct number in the sequence at index ${i}`, () => { + expect(fibonacci(i)).toBe(fibo[i]); + }); +} + +test('outputs the correct number in the sequence at index 28', () => { + expect(fibonacci(28)).toBe(fibo[28]); +}); \ No newline at end of file diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/ruby/.rspec b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/.rspec new file mode 100644 index 00000000..82b8369c --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper \ No newline at end of file diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/ruby/Gemfile b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/Gemfile new file mode 100644 index 00000000..5ab5cb4e --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' \ No newline at end of file diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/ruby/fibonacci.rb b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/fibonacci.rb new file mode 100644 index 00000000..2021663b --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/fibonacci.rb @@ -0,0 +1,24 @@ + +def fibonacci(num) + # type your code here +end + +if __FILE__ == $PROGRAM_NAME +puts "Expecting: 0" +puts "=>", fibonacci(0) + +puts + +puts "Expecting: 1" +puts "=>", fibonacci(2) + +puts + +puts "Expecting: 55" +puts "=>", fibonacci(10) + +# Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution \ No newline at end of file diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/ruby/spec/fibonacci_spec.rb b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/spec/fibonacci_spec.rb new file mode 100644 index 00000000..93dd94b0 --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/spec/fibonacci_spec.rb @@ -0,0 +1,15 @@ +require './fibonacci' + +RSpec.describe '#fibonacci' do + fibo = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811] + + 10.times do |n| + it "outputs the correct number in the sequence at index #{n}" do + expect(fibonacci(n)).to eq(fibo[n]) + end + end + + it "outputs the correct number at index 28" do + expect(fibonacci(28)).to eq(fibo[28]) + end +end \ No newline at end of file diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/ruby/spec/spec_helper.rb b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/solutions/fibonacci.js b/17-week-13/00-day-1-to-2--dynamic-programming/solutions/fibonacci.js new file mode 100644 index 00000000..1947520b --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/solutions/fibonacci.js @@ -0,0 +1,43 @@ +let fibs = []; + +function fibonacci(num) { + if (num === 0 || num === 1) return num + if (fibs[num]) return fibs[num] + fibs[num] = fibonacci(num - 1) + fibonacci(num - 2) + return fibs[num] +} + +if (require.main === module) { +// add your own tests in here +console.log("Expecting: 0"); +console.log("=>", fibonacci(0)); + +console.log(""); + +console.log("Expecting: 1"); +console.log("=>", fibonacci(2)); + +console.log(""); + +console.log("Expecting: 55"); +console.log("=>", fibonacci(10)); +} + +module.exports = fibonacci; + +// Please add your pseudocode to this file + +// fib(4) = fib(3) + fib(2) +// fib(2), fib(3) were already saved into mem, so will fib(4) + +// fib(5) = fib(4) + fib(3) +// The previously saved fib(3) and fib(4) will be used to avoid duplicated calculation and call stacks + +// And a written explanation of your solution + +// In a nutshell, DP is a efficient way in which we can use memoziation to cache visited data to faster retrieval later on. + +// This implementation makes use of mem as an array (or hash) to store value of an already computed num. This will greatly reduce the number of call stack and duplicated computation in the call stack. + +// Time complexity O(N), Space O(N) + diff --git a/17-week-13/00-day-1-to-2--dynamic-programming/solutions/fibonacci.rb b/17-week-13/00-day-1-to-2--dynamic-programming/solutions/fibonacci.rb new file mode 100644 index 00000000..4dc746f8 --- /dev/null +++ b/17-week-13/00-day-1-to-2--dynamic-programming/solutions/fibonacci.rb @@ -0,0 +1,42 @@ +Fibs = {} + +def fibonacci(num) + return num if num == 0 || num == 1 + return Fibs[num] if Fibs.keys.include?(num) + + Fibs[num] = fibonacci(num -1) + fibonacci(num - 2) + return Fibs[num] +end + +if __FILE__ == $PROGRAM_NAME +puts "Expecting: 0" +puts "=>", fibonacci(0) + +puts + +puts "Expecting: 1" +puts "=>", fibonacci(2) + +puts + +puts "Expecting: 55" +puts "=>", fibonacci(10) + +# Don't forget to add your own! +end + +# // Please add your pseudocode to this file + +# // fib(4) = fib(3) + fib(2) +# // fib(2), fib(3) were already saved into mem, so will fib(4) + +# // fib(5) = fib(4) + fib(3) +# // The previously saved fib(3) and fib(4) will be used to avoid duplicated calculation and call stacks + +# // And a written explanation of your solution + +# // In a nutshell, DP is a efficient way in which we can use memoziation to cache visited data to faster retrieval later on. + +# // This implementation makes use of mem as an array (or hash) to store value of an already computed num. This will greatly reduce the number of call stack and duplicated computation in the call stack. + +# // Time complexity O(N), Space O(N) \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/.gitignore b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/.gitignore new file mode 100644 index 00000000..2731f409 --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/.gitignore @@ -0,0 +1,4 @@ +Gemfile.lock + +node_modules/ +package-lock.json \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/README.md b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/README.md new file mode 100644 index 00000000..376b6b0f --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/README.md @@ -0,0 +1,64 @@ +# Day 3-5: Add Two Numbers - List Nodes + +You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. + +You may assume the two numbers do not contain any leading zero, except the number 0 itself. + +![example](example.png) + +### Example 1: + +Input: l1 = [2,4,3], l2 = [5,6,4] +Output: [7,0,8] +Explanation: 342 + 465 = 807 + +### Example 2: + +Input: l1 = [0], l2 = [0] +Output: [0] + +### Example 3: + +Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] +Output: [8,9,9,9,0,0,0,1] + +### Constraints: + +- The number of nodes in each linked list is in the range [1, 100]- 0 <= Node.val <= 9 +- It is guaranteed that the list represents a number that does not have leading zeros + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/example.png b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/example.png new file mode 100644 index 0000000000000000000000000000000000000000..489f829103b4253d492ee92f88cc85ae1f72a71c GIT binary patch literal 34017 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
    }PoI5Vc35g?_jDMo!_?V*9y8`r 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℞gJd71GtiWI;-NuLmwKl`?(;(t zEL8m)8KhXo9WrEg9|Ql%dp~KAtF;tblpz|SQbLw%K0urEgfBGfqcE^WJpL16PYkKY z|2V1ugDIBP5q9S7Zb&6@S*teiRx4h-X=4;K*=g+CpG>&C82JElXg}Bx{QBGe#K&6nD<#|VkJ%Qo z2KpfoFmQHzuZ9acQd0BJ<=tFYJil2M`hhrJMG8w2ESXuruaj6~HhZG~98gISh{;Z~ zrBv?kA#(0Tc?T=%nrUefZ!)WN*_%wPP8IW6Z0n9~N(_J+D~i^_>x{$ckq6d%`|u6wfs6qoIk`(AF6m26e~H5KG1&`(K`V8mS0O~FvfmW?t2w#J+a$&5*bUMc{urxY=` zFZS*H`c>nkq=uHrVUz|Dux|;?ic>6TO|L&ORKSHPEbVWJ4$$hUc{BlJ54=#AUl=}Q zyu+rGmBGMQ`PTc^{ieI%||&OTYjGIOCTBIz#MUVNO^NRy2>iwSPC^I1==B#qCw&#Ej)t_t{*)*YS|9Kk{58PV2J*#sB*5MI2$$b!Q%OUH())a6cxuYR@)#D*CJb!=x70@Zg4#I=r z=G{684a{aZXZS9wJyU~%wE%!RXZ6D@zR_V3)8~<;yE#JkApC`S1T|BOuXYhS4Xt zRh%J1{u%~J))*D_gQkK^&)V~U23f`+j`U@v50u=!EA*eS#h+r-s*mDYrFH)^C{VB` z#I{kN{?~XJ5LA6;OLX3$wLd3>m{%a}vV#0dw1?k6Uonh}TpC~H|9Q*dpG|5bu+Po0 mmunRNa}yC$e1q", addTwoNumbers({ val: 0, next: null }, { val: 0, next: null })); + +} + +module.exports = { + Node, + addTwoList +}; + +// Please add your pseudocode to this file +// And a written explanation of your solution \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/package.json b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/package.json new file mode 100644 index 00000000..f0b10ba8 --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "addtwolist", + "version": "1.0.0", + "description": "Add Two Numbers (List Nodes)", + "main": "addTwoList.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/tests/addTwoList.test.js b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/tests/addTwoList.test.js new file mode 100644 index 00000000..2817a90a --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/javascript/tests/addTwoList.test.js @@ -0,0 +1,27 @@ +const { Node , addTwoList } = require('../addTwoList'); + +const n1 = new Node(3) +const n2 = new Node(4, n1) +const l1 = new Node(2, n2) + +const n3 = new Node(4) +const n4 = new Node(6, n3) +const l2 = new Node(5, n4) + +test('Input: l1 = [2,4,3] & l2 = [5,6,4], Output: [7,0,8]', () => { + expect(addTwoList(l1,l2)).toEqual({"next": {"next": {"next": null, "val": 8}, "val": 0}, "val": 7}); +}); + +const l3 = new Node(0) +const l4 = new Node(0) + +test('Input: l3 = [0] & l4 = [0], Output: [0]', () => { + expect(addTwoList(l3,l4)).toEqual({"next": null, "val": 0}); +}); + +const l5 = {"val": 9, "next":{"val": 9, "next":{"val": 9, "next":{"val": 9, "next":{"val": 9, "next":{"val": 9, "next":{"val": 9, "next": null}}}}}}} +const l6 = {"val": 9, "next":{"val": 9, "next":{"val": 9, "next":{"val": 9, "next": null}}}} + +test('Input: l5 = [9,9,9,9,9,9,9] & l6 = [9,9,9,9], Output: [8,9,9,9,0,0,0,1]', () => { + expect(addTwoList(l5,l6)).toEqual({"val": 8, "next":{"val": 9, "next":{"val": 9, "next":{"val": 9, "next":{"val": 0, "next":{"val": 0, "next":{"val": 0, "next": {"val": 1, "next": null}}}}}}}}); +}); \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/.rspec b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/.rspec new file mode 100644 index 00000000..82b8369c --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/Gemfile b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/Gemfile new file mode 100644 index 00000000..5ab5cb4e --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/addTwoList.rb b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/addTwoList.rb new file mode 100644 index 00000000..71b4d1ff --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/addTwoList.rb @@ -0,0 +1,24 @@ +class ListNode + attr_accessor :val, :next + def initialize(val = 0, _next = nil) + @val = val + @next = _next + end +end + +def add_two_numbers(l1, l2) +# type your code here +end + + +if __FILE__ == $PROGRAM_NAME +puts "Expecting: 0" +l1 = ListNode.new(0) +l2 = ListNode.new(0) +puts "=>", add_two_numbers(l1,l2) + +# Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/spec/addTwoList_spec.rb b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/spec/addTwoList_spec.rb new file mode 100644 index 00000000..be2fc02d --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/spec/addTwoList_spec.rb @@ -0,0 +1,25 @@ +require './addTwoList' + +RSpec.describe '#addTwoList' do + +n1 = ListNode.new(3) +n2 = ListNode.new(4, n1) +l1 = ListNode.new(2, n2) + +n3 = ListNode.new(4) +n4 = ListNode.new(6, n3) +l2 = ListNode.new(5, n4) + +n5 = ListNode.new(8) +n6 = ListNode.new(0, n5) +result_1 = ListNode.new(7, n6) + + +p "results: #{add_two_numbers(l1,l2)}" + + it "Input: l1 = [2,4,3] & l2 = [5,6,4], Output: [7,0,8]" do + expect(add_two_numbers(l1,l2).val).to eql(result_1.val) + expect(add_two_numbers(l1,l2).next.val).to eql(result_1.next.val) + expect(add_two_numbers(l1,l2).next.next.val).to eql(result_1.next.next.val) + end +end \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/spec/spec_helper.rb b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/solutions/addTwoList.js b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/solutions/addTwoList.js new file mode 100644 index 00000000..830291ff --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/solutions/addTwoList.js @@ -0,0 +1,42 @@ +class Node { + constructor(val = null, next = null) { + this.val = val; + this.next = next; + } +} + +function addTwoList(l1, l2) { + +let node = null + +const carry = arguments[2] +if (l1 || l2) { + const val1 = l1 ? l1.val : 0 + const val2 = l2 ? l2.val : 0 + const next1 = l1 ? l1.next : null + const next2 = l2 ? l2.next : null + const val = carry ? val1 + val2 + 1 : val1 + val2 + node = new Node(val % 10) + node.next = addTwoList(next1, next2, val >= 10) +} else if (carry) { + node = new Node(1) + node.next = null +} +console.log(node) +return node + +} + +if (require.main === module) { +// add your own tests in here +console.log("Expecting: { val: 0, next: null }"); +console.log("=>", addTwoNumbers({ val: 0, next: null }, { val: 0, next: null })); + +} + +module.exports = { + Node, + addTwoList +}; + +// More details here: https://leetcode.com/problems/add-two-numbers/solution/ \ No newline at end of file diff --git a/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/solutions/addTwoList.rb b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/solutions/addTwoList.rb new file mode 100644 index 00000000..85fbbe2a --- /dev/null +++ b/17-week-13/01-day-3-to-5--add-two-numbers-list-nodes/solutions/addTwoList.rb @@ -0,0 +1,42 @@ +class ListNode + attr_accessor :val, :next + def initialize(val = 0, _next = nil) + @val = val + @next = _next + end +end + +def add_two_numbers(l1, l2) + n1, n2 = l1, l2 + + current = answer = ListNode.new(nil) + carry = 0 + + while n1 || n2 || 0 < carry + a = n1 ? n1.val : 0 + b = n2 ? n2.val : 0 + x = a + b + carry + + carry = x / 10 + x -= 10 if 0 < carry + + node = ListNode.new(x) + current&.next = node + current = node + + n1, n2 = n1&.next, n2&.next + end + answer.next +end + + +if __FILE__ == $PROGRAM_NAME +puts "Expecting: 0" +l1 = ListNode.new(0) +l2 = ListNode.new(0) +puts "=>", add_two_numbers(l1,l2) + +# Don't forget to add your own! +end + +# More details here: https://leetcode.com/problems/add-two-numbers/solution/ \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/.gitignore b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/.gitignore new file mode 100644 index 00000000..07229f1c --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/.gitignore @@ -0,0 +1,5 @@ +Gemfile.lock + +node_modules/ +package-lock.json +.DS_store \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/README.md b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/README.md new file mode 100644 index 00000000..12ec362d --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/README.md @@ -0,0 +1,64 @@ +# Day 1-2: Longest Substring Without Repeating Characters + +Given a string `s`, find the length of the longest substring without repeating characters. + +### Example 1: + +Input: s = "abcabcbb" + +Output: 3 + +Explanation: The answer is "abc", with the length of 3. + +### Example 2: + +Input: s = "pwwkew" + +Output: 3 + +Explanation: The answer is "wke", with the length of 3. +Notice that the answer must be a substring, "pwke" is a subsequence and not a substring. + +### Example 3: + +Input: s = "" + +Output: 0 + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +**BONUS**: For students who did not achieve O(n) on longest substring, refactor solution until achieved. + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/longSubString.js b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/longSubString.js new file mode 100644 index 00000000..40a57c2e --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/longSubString.js @@ -0,0 +1,16 @@ +function lengthOfLongestSubstring(s) { + // type your code here +} + +if (require.main === module) { + +// add your own tests in here +console.log("Expecting: 3"); +console.log("=>", lengthOfLongestSubstring("abcabcbb")); + +} + +module.exports = lengthOfLongestSubstring + +// Please add your pseudocode to this file +// And a written explanation of your solution \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/package.json b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/package.json new file mode 100644 index 00000000..89e0d0c7 --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "length_of_longest_substring", + "version": "1.0.0", + "description": "lengthOfLongestSubstring", + "main": "longSubString.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/tests/longSubString.test.js b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/tests/longSubString.test.js new file mode 100644 index 00000000..c7f0e5b6 --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/javascript/tests/longSubString.test.js @@ -0,0 +1,23 @@ +const lengthOfLongestSubstring = require('../longSubString'); + +let s1 = "abcabcbb" +let s2 = "bbbbb" +let s3 = "pwwkew" +let s4 = "" + + +test('Input: s1 = "abcabcbb", Output: 3', () => { + expect(lengthOfLongestSubstring(s1)).toEqual(3); +}); + +test('Input: s2 = "bbbbb", Output: 1', () => { + expect(lengthOfLongestSubstring(s2)).toEqual(1); +}); + +test('Input: s3 = "pwwkew", Output: 3', () => { + expect(lengthOfLongestSubstring(s3)).toEqual(3); +}); + +test('Input: s4 = "", Output: 0', () => { + expect(lengthOfLongestSubstring(s4)).toEqual(0); +}); \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/.rspec b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/.rspec new file mode 100644 index 00000000..82b8369c --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/Gemfile b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/Gemfile new file mode 100644 index 00000000..5ab5cb4e --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/longSubString.rb b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/longSubString.rb new file mode 100644 index 00000000..4dab98ac --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/longSubString.rb @@ -0,0 +1,15 @@ +def length_of_longest_substring(s) + # type your code here +end + + +if __FILE__ == $PROGRAM_NAME + +puts "Expecting: 3" +puts "=>", length_of_longest_substring("abcabcbb") + +# Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/spec/longSubString_spec.rb b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/spec/longSubString_spec.rb new file mode 100644 index 00000000..6a574aad --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/spec/longSubString_spec.rb @@ -0,0 +1,34 @@ +require './longSubString' + +RSpec.describe '#length_of_longest_substring' do + +s1 = "abcabcbb" +s2 = "bbbbb" +s3 = "pwwkew" +s4 = "" + +p "results: #{length_of_longest_substring(s1)}" + + it "Input: s1 = abcabcbb, Output: 3" do + expect(length_of_longest_substring(s1)).to eql(3) + end + +p "results: #{length_of_longest_substring(s2)}" + + it "Input: s2 = bbbbb, Output: 1" do + expect(length_of_longest_substring(s2)).to eql(1) + end + +p "results: #{length_of_longest_substring(s3)}" + + it "Input: s3 = pwwkew, Output: 3" do + expect(length_of_longest_substring(s3)).to eql(3) + end + + +p "results: #{length_of_longest_substring(s4)}" + + it "Input: s4 = "", Output: 0" do + expect(length_of_longest_substring(s4)).to eql(0) + end +end \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/spec/spec_helper.rb b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/solutions/longSubString.js b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/solutions/longSubString.js new file mode 100644 index 00000000..f26675e6 --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/solutions/longSubString.js @@ -0,0 +1,29 @@ +function lengthOfLongestSubstring(s) { + + let map = {} + let start = 0 + let maxLen = 0 + let arr = s.split('') + + for (i=0; i < s.length; i++) { + let current = map[arr[i]] + if (current!=null && start <= current) { + start = current + 1 + } else { + maxLen = Math.max(maxLen, i - start + 1) + } + + map[arr[i]] = i + } + + return maxLen +} + +if (require.main === module) { + +console.log("Expecting: 3"); +console.log("=>", lengthOfLongestSubstring("abcabcbb")); + +} + +module.exports = lengthOfLongestSubstring \ No newline at end of file diff --git a/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/solutions/longSubString.rb b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/solutions/longSubString.rb new file mode 100644 index 00000000..6d544bc3 --- /dev/null +++ b/18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters/solutions/longSubString.rb @@ -0,0 +1,20 @@ +def length_of_longest_substring(s) + return s.size if s.size < 2 + + queue, hash = [], {} + s.each_char.reduce(-Float::INFINITY) do |max, c| + hash.delete(char = queue.shift) until queue.empty? || char.eql?(c) if hash.key?(c) + + [max, (queue << hash[c] = c).size].max + end +end + + +if __FILE__ == $PROGRAM_NAME + +puts "Expecting: 3" +puts "=>", length_of_longest_substring("abcabcbb") + +# Don't forget to add your own! +end + \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/.gitignore b/18-week-14/01-day-3-to-5--validate-bst/.gitignore new file mode 100644 index 00000000..07229f1c --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/.gitignore @@ -0,0 +1,5 @@ +Gemfile.lock + +node_modules/ +package-lock.json +.DS_store \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/README.md b/18-week-14/01-day-3-to-5--validate-bst/README.md new file mode 100644 index 00000000..8c02eb17 --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/README.md @@ -0,0 +1,63 @@ +# Day 3-5: Validate Binary Search Tree + +Given the root of a binary tree, determine if it is a valid binary search tree (BST). + +A valid BST is defined as follows: + +- The left subtree of a node contains only nodes with keys less than the node's key. +- The right subtree of a node contains only nodes with keys greater than the node's key. +- Both the left and right subtrees must also be binary search trees. + +### Example 1: + +![example-1](example-1.png) + +Input: root = [2,1,3] + +Output: true + +### Example 2: + +![example-2](example-2.png) + +Input: root = [5,1,4,null,null,3,6] + +Output: false + +Explanation: The root node's value is 5 but its right child's value is 4. + +## Before you start coding: + +1. Rewrite the problem in your own words +2. Validate that you understand the problem +3. Write your own test cases +4. Pseudocode +5. Code! + +**_And remember, don't run our tests until you've passed your own!_** + +## How to run your own tests + +### Ruby + +1. `cd` into the ruby folder +2. `ruby .rb` + +### JavaScript + +1. `cd` into the javascript folder +2. `node .js` + +## How to run our tests + +### Ruby + +1. `cd` into the ruby folder +2. `bundle install` +3. `rspec` + +### JavaScript + +1. `cd` into the javascript folder +2. `npm i` +3. `npm test` diff --git a/18-week-14/01-day-3-to-5--validate-bst/example-1.png b/18-week-14/01-day-3-to-5--validate-bst/example-1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8d89bad5d5b686b9cc951ee7434dd2265a9193 GIT binary patch literal 109360 zcmZsC1zc3!`ZeGnASk6MD&5i@4&7bS-5}i!f=Eh9*U%y$Lw8DdcM1qYcjtHJ-utTm zd%yY3Fo!cI_St9e=ULBM>x3xCi9dey@(}_8!edDZ5hVnK2T%kABtz7Pz?v?tbTkA6 z3`+}PVFgKHVPXXbTT=@w69fc_khlaC^%zOq59hR!5)$Tq3ONCbpiLDiRC@mp?|z6$ zAfZuo1`r!EcG0-GV0VNP2GIEf=g0)$8HpGMoiF|ALZU{L1c>bGDKw>-FTbZ0@MB_Y8Rz~8xN*tZdo zrdHE=+H}W#rzaZ87UTLfxR>PR`one4A%{8y8hOvLqv zwad&=vLxc6$E$`DSKqA^$x&G5>CH>OMa5vupdJbN(UD48muv8FD-xg=4aJvfyuam! zzQb3;-u44Ce#$+&7o-09?bb+>qV*SB_tS0;(X4To zEQIHkrgmb<4k8%Ek{O^IL`ei=;p5iWY$OHHX?jpaK_Pm#Y6KpQ*)PAmD0Bgg?x5zi zUX7JZ^ZcJ^Y3Q#o*HbW43~!dUQ7ZM=>Ar=iSpNEmoizI~z8%$&i#hp)q*J@> zfj$^3^3#;UG}w-R-q(&mZx>A-Z8tzXU_0PR>#k&$`{;hz>&HA9_Y%(ZWlcrMHYna6 zs|IdZCr@}+G3G%vKXsX&pkw+)H)h5c4QeSqTX$``ukyFOdt6B{6aM+jbzSyxX7z*<4KaZal+Cgx^d+V3h6`}w5LkL0F%TnoS zMP$rfC{^zQ`wM!-BzeLUvMX^gl;>;K7nW+xYKCh0f>I$t`^=S2Bl&olm{5m+PcnF3 zZ&4FpGY>g)jkOK55g>Hbi=AG0^eHq6V|9KiuDe7*MCIXNVzRp^WH7}?K-pQ|T{=@S zYktj_9fW9SgD%fNue52`@d+UvXZApj_2GKUORknvHv}RqR3Smo3*;3+76}wwgSbz2 z>C!*mF+J!<&dqpD_n`0xPYIe8^4lMTB}8l=$bN#j9x(WG*b&Tss?Wo10P+4L*bv7G z2pGoVG5oAfTouf^;&(yvLjr^oMozjZLHXrlFg7>KgQUnc7%M$>7N)orfJdz^t%9u< zZj8=2i`XF|4@V#y==&W`h79&R_RRJV>={dwrsce3b||7HI?2tHuxKFd6wkg$Nm@$Q zOLj@BNu=fQJ(hip{unb{A{^s!X(u@RQMk^_E;gt+cx;1eJIcBT@s}G*Iyk%`wjq38 zq)BFv{9M_I<}8+2iiIM9B|%9tKRfm7e0Iac_;|(W$<*s?n$gs3jr>~qpj zYUv}M$e7OP{rOE0<$=*OGuLOYPNhzt&c~hN!mPsanJsqF25HOB+Rnw=J`06|#7x9I z!=bOd*-T%GzkuO0a@sI8+4`q&C4FX2dS5p3t3vXe>DIun&8@9BaF@uX>nXc4i!583 zP2I%F7mMPgT8-GGcB`Tp$#NUVK=*I%(91W+M(a9wPGS1!(H(EXR`D1UAIjjdrfc+o zJ9bLhDnD1nYT1-pRqj-mRZEp7n^jJ2HL-Wh4)M%+#5spKM}~hIFi*kfsN`_9>Z$Un z5}ISLGP7Qqo0-dRI{@`K@EEFm+_kE+>g+VwnK3+yW!lI zvd24nExwPpKg8F>rUkj0k;GJJW;ppAlGnST+*Q-PsD;3O*ZW!)A2i zstlH#+bW4#iEKOi)1EE}o|N_6uhAnPF{0as4~I#Fs6Rg>9(}_?RmM?9)%*6n$2&(h z5*|tq_Y>I&{GhJ<<&)1x1niFE`7hqfDD~GRikHfjj!u6a+1OCbR*PtQZuW{Q!ZH}; zF!dtt@Emss_bd5pLgCjjOkdykkBOYOh!Ek=dK5ezJDN>$Y({W~ zwk#b6TKnF=i4%xQ8?ZoHWuCU-Y~!@|b^hG_(EaVv!=tgIb3F5>#(1xBwnL8F^C(l~ z86fiv_VKY&JYPXF8oasUFUb}dgpF~H!#`aeWZ!+67rgs;W1wiKsG_(uKAw*f>KxY5 zk?@sUR*P*{L(;fsXzXyaVUwPf&a6M}(2mk_Jzk^x`*#ic@**?F#074u_k)AAv9<1w zz9}#c+m43j^}GRFP5mnULH{m(ky{0=0+l!Pjh9A0BUA8J&_&U;p1U(>)^AATH}445 zYPpME=5;i5Joj<9&p*oZqnMG_Ot_+3sQFwY)3DQd6t(tNZ39ZJap<nb^J{CS<0lsWcQTQyG~UOXr)HI)oz}1tMgQ0Yrz?mQ>WSd_WJS7V>OOIo9}bR zRry|HT?1JI)m0+a`NdU*&}pf8&5F~_s&Q*G-?Qsl)B2vXquq4ZU{|LdnR)ku&g!qG z37gQ|O7o(ID$DbW1#8dNbGFIaaqF4BX{{#AotS;kL+N!!&a zM0ADXTX_@bY^bkzUXHz*!wlycAALIQbWpOrOdw7d`Hp~{tM25*+O)sXgD&Zaa}Md` zdih_eZu2bpYkNJVRK;m89ScsK`ZpcTNQY9veLS8w+QYSEum^)gbw6D*m$QaCuA~rzFymPOr{g9W6jvvxZy?PKC`5A6|_gRt;gMPbviW6&v^QIchigBoAIp`Hy;k*W3NRtIyXiJ_px!XGXJKX1B`x(R?aCE;sWh6zhGBe*S)l zXllJGK9BTEGG}HG8fFj?=m`*bz}1SK`Gfvag708z6n^*Z1;<%RUI^blrme6-7BE`) zrgwzm#Ghqc1js)@{+0(*P!6M;8xvj&dn7Lu(B$V=ZHf?;jBr6m@M2?$iRr-omCP9j z!hrHSGlfrB%Si_13I0%~P}qlk5of+z)9|HpfoMO6tEDSn#Kii@C;Tiyp+NN!YN9S_ zDl3cd23ST#03p6aKn9i&fe#6)_xbnt zgD-&yD8PR>z{f2E>7T71Kraq&N!nO`3#2gGv3{0eakBEth!4AfzJW3*B z|Jfb*kC)Wk$;pm~k<$v|Wzq|QgYk_{|djw|ueb4wF>Hl;M18(DM z3laHuz&9|+;4egG;1Bh`zv0WR#~kaSrU(cE2$CX#@7xe~(!vr{C*1E{lZg|8so&^E z9|mT*2?~&l8OcPYu!k@w=S&#q-mZ_YZ#2o^v~3HnyK)Rs|z?n3{Cn-+%tyc^bA;KD0P=m+Gnx^Mo{}-!|P_FMZ*} zWkUS#_ct29bB&tGlb&h1|Ne=|Po|}Hf*osvp?21lTOYJH3k^bwA2fcfo_yO&| z-s8z1K3NtKMTWEfPXkKqPHkI2GXM3?m;}*jTi&`^rT+J!5&6={^uGJ1&YwrYbLJ_r@8*8M-b7~ z?jHgtUc~jgzg@bQ-LcyDT)IALYJOyNSx`0rrPVth)~#*4J)5(bg6eFZPU*=PH=b$E z);gNaHhP}l@7jK?Uc6Gdnke>(^SRyDgK3!@qwpR0v6&BNuo-tpo&3P`VR}r&2M&M1 zOiJK$vAh{f79kNt;G)iRGAumy^T)@xC%7rb2|JhR_m}C~=leH<`)qEpYt*myS1&l5 zFJ+tdZ})wDgRTpr2|FnN&2U?EO?jk}fq++5X*Ba-6owyS`CH#b&JZ#FKEzkrp zOkK47OIb{0jfr@BS(oEh$gMI_PuOKep)6^YRK^ycQm@5SqnzyTTdq%xRboegDnH}R z=0`|LET}qxF-6{;Ma3MyyW`Ub)m`I)8le2VeEK_KV8@B5CAeqy|goJp?RkR zoJ;*e&+H2bY$@MX4MSYEjAMvJ+zhGS3aMTXX9|}`bzJkjAOGfbG9sRr9l`U4z;mZ` zvmIBy-(5R<{_ZM!`@Lg2@^wJ1l_Fuj)r9x-i=_54K91kx)bCEBrL~fuPvyJ^q$wiM z`i4VZmv#A#;MXG@qnuzF5h{pM!#6iM?3}kQI}(hICrWsQj131uhT;vR+Irrn6Fb%& z$5IP!^4JiZtQ?%L6(pV}C^S`4zeexg?l;8jW`IwbjbDru+}5l{NK>WS36Y8plj`EX z|4v~0eO85kg27qrEmwpV9o1Y7!}81Gu4^x=Kg0Dl9GF(Vo>_a5Xyczhv_CTyHJ~K< zx~(1Nk8v2HAev*d*uc$udot$kyH^Ve}r zlw|b4juZZ~s@FQ3;WGY6Uj~jhTS)P|YoRF6XUDMr=U0k&_$!D0a%A88xiz_|@ zrapHEElgGZYrtc|2Yj2d6Ol~DLlBk{P9{!3j>_eTwvKoS3&xAcEub}{z=4xo*GoGy zTZ6R%s7Rwp>bi)0y&z_x)sExevd6lk#n&xSMIJx<3if>ZVLH$)Hau9|YJ|xEP2=(N zPCgK;fAVqtZET6R)e@(31RsR;(_`Pua13cz-ii_*nXh3 z{+Y!!_LwXZ%o3&ywY;D=RMAxxu~4g~zUgiH_N1L*QEk9)!pv#9Q zczSnrW`C`=gb)F*vl+8I$01&-G~c^`9ls7AaOKF8O6fN#E6ztHA+ku|^b4ZD?r{*j zmCM4;2{IYgXcFrAIv~}js;QRZ2g`BfkC@u5IBn(=34t(h0)zo$M%qQG^{?-{QbH4y z-Xg`jXS=aXK(``b(^-xL$`P^_4G_kgCH^{SgXx-6+EIVsLY1}F6Y@$R(#v9$`45(`jUvXqXT(%xN4)iPj~#qVbFe`mk$XC2C6x17wWw47S!t`Anb z>W(sN=yZz);!>;2{`TeO_wvDBr1-08!`sxphieJ2*hAC5f=V za;b^uJuy^fLoELB%Wd|1mKyxleGu~?E64YLH7*3+IFIDLFtmyf0yN*4NFKdG);Ao4 zeZ=HT?0AFyF$uG`K>$7Be48y$1lsr1m61!IsKmfEl18%vX4%3L5qw=$(5uBx z&%IhIPr{JSzSA~Lez2!HKB?!TJ1iHSp@tZpYvAhu~8x^J`fk-jPpB%wQ{ufGC-;S9TUX_XiLY56W0%@C1XX>o>B(%G5<` zaO^_d)B6oN&|fu%7Q}dPGa#p8Ni--@+Vn=czjm!m-P`^So^nb%GcG(T!7q(K!F!0R zI{nkzdm}T*A>&N|H-^4n)P1)&-xp*$#DW)6MRnupN7^nt?0+RxF(9Ef^D3Tqfjs;K z;`B)|?E}rC*9?M7!qn_LLZ5BkUGEPGg|nbCP3lq<>;>`PET5Se49Z&Xwi#kuDMm@9 zj-*XPW=Wb)TDAz|@-R}4&eLwsmZ0%t1Zi=wWat=VmhLz|%o0e*-Ppm0B8)n9Y$&#^ ztl?_$+t#}>47I<$v^S^)Vy%XYj;|(#?{;&HnqHQEj{E~iG8l16>~_QC2RKp$Fma<0 zlvr^LQWJz^rn{K9txg~FD4`gW6A8Fa$Zwr7+e;qSP?Z2K0s$|h?=5O zsn7>a2l1U`I`z`z{pzmmU-*3bZNTr#dwc@qV$E6y69{I%f?-232CixM!FaxM`FR|% z9L|;9*dS}Z2ZLRXOam0mOxS(X(egVN2{ghH@Ac(05AKFNlH#xgXyluS0-Jz44i8Tr zhOizyjs`ts)UII)V+0ok(=`;Ls)CC|Fyj+c`Wo9g9?q7oH}zgiwVU{>ljv()$8nb) zHR#%RJkw|>JEM&b?jW*tDVNQP+kT_R*L*RbGO_CQCy1L<02i)0>N-cM@Bk?|iQ1g} zJ(KJuOZk?zWd$79(CamU8Qt4bClmC1xWyk60@*9#OCJtnu-bZcC&#;U0XecMSh_DC zilt_im4+caQ63#ww$qLT9;)JwZ~cmqA0)Iy(vWluwfr6lPNSvo+r0C;!I*dbrwM)@ z@G9s0xYU_)m=+`@m@U@lH8^vK^M%wcajX}I5oD0eX{#GS*xw)_o~uKiIxgo9z440;W%n!kS?zOsb%XsOxJ`s`5y1Rs?^t2ZouBbHThST&+lmew z-iIN*JGBq@8jQ7_a@Y_FhmD2oku(%L08O6uSTo)GYzCZu z>W4zu?Wn1d9e1kH75*xLp?;@~t|a)i7l7H=z(u8ev(!Tqdje7&sj&o+?1(7`hD**< zIw2(O!BdLaVr!U)UKlOcp)luzpFiBw)JmVqPiR2G3Xh!k#{X1hTT;N3h01rjBnhCS zN^DSzPRFhUTDoZ`#q_*ZT{m3xx!&a#wE_y1hGh$iZ&;3+*k!_j82LMj8onl(J`glz zW;L}XV58TmXg@;jOs1Lo&`bFk+5+K0pYO6qex17*quG>!c?cOY5RaC%H?2BxtaANV ziI5=&r1b3*HY*_RCw^#;Q3{dDP0Z65>hJK{DeWptIDOuHA$r!p0>1dnI@k?ST{nQZ zF1ov;r798U`#5t>7B~3CiZM$zlVQepl1Q<(p6=D}%e~^TlBjptl@hTq?PfwOW~lk; z4|Y}eSFteu#$%+_tNgO>dit+E5CQr?PQI-w5x}ysLQ1C8Lz=$;|(%{d3>k&?RHl5F}T|!%=s6EyvLDFe}KON978z!@KgiTPi>eosVFnK2wei5zaF6h!#mv}KzAgC3(^GEeFVeL! zUZS937D?Gg6l=V*Dq@w~Sm zkbL#rq^d@MN+{zgIMsHxf`(qVfos8a$(#EN6XM4R-m~e3@qr07y);-gOP=$_aOUG5 zT9es(Y<*Lwz+6D~j#!Cv1o7$G@V&$`xQKYW*S+%$HH=smWJ&r0j|l764~Feb296_( zA)+T|hX>8SPkl-SRQLC0#^|yccpx_8(-Co^fz}Z7>V8KP-R)mJF=M$2y2;R*mCy!} zFp(EXlB6MWu|iU?$_@Rn@DKR)i9N5;WRyTOL{IP-v=d=?!8^o=|bu zwa3Q@^DN|8OR!drbB6rE;uT+jOQzkdx5oWOgNXJrDX4_R@BmjH9G%dV#P92)YZkj^ zr+&6xo_=ff1Sg;xb0p`wFo0%i<+On1y=z9!Kw@wVG-hRavCi32cQr0^7K{s`7c4a$ zNRCVB=HC8Z?(oZCfe4?Lu`GPbsOj$v!~h@fN90yPXcbW(+CPIn4>E@==j^=Vw2?u_ zqw5w9P%F}mBb#FpaoZZt-#kvg_lmI6dWcf6h2vc4Gpn4UVuB(CadVo~>pggl+S`uu z0K5b+1NTX=m$oxy6rN3aGD%-}mq1-SyA@-j*Gu6Abp_%b(>#PMzpzAM#;@qDq- z(^Xgg{A|v42nmmoPUw`3=u*PS)>4m@%4WQg-{AHC4L1TnxOpP~g98XRXcE*0ff2sP zDNDaF-Uu|gRwx_6W|m~34MCn`S={8gueG{q!nFz$_B{*j7rxfgW% zW!E9!kuzbR0+h2FDD!w2<=cahA=rlTmqiKM4w82zb^yf9`SB42b_p$ez8pF*>p7-d zZSn_lqX@UOp6Y+QB*fha0%5TqwUd}9PKCNUZ;s|}0@%#J@bZ<&NRk<3=0#|zIqym^ zndX}hC0hR9pBnb66>RgU6?hTSy7$7sx?|2tfE4602T(b>q%e2@=D$0PbgY00WAd_L ze+#LF_Ve={b(0;})tM|+ELs*`|2+GH$@G1J8F4P&JteFE0ZU+9WI2?W^a~TDA;q?d z+j_c$1kR43XY${)@yk5daZ=<{J4jazsiE#9XQ2Qa6<8kHZ+SG}ZD(7V-EQpwWdKzq zJRgBElQ1zj7u}5D7$M>U?6NcMwBS5tGQ=glMyxxbr*vBT#Ct=M4?6cx9?0+oxT;;E zp^-)=KN}L_5wRhE89RQy2+~ zdI$)g^s^DD=1NF6&P>t7LTW|!GS1QJD4>-nmkrXfyI;@lPU;c`@G_zW3?^z_qnT?x0nru*A{*r{L$d4H-Z2umoq7AjI; zQuxt4=EL}EE2T9~V(I6=Ctct;sx_a5Jjb;Thq~q`7>V1x<(>yWP{z)i&Kto~aR^#& zn$0JAq^T_ZXS*Dp0!`(1I!qI2@XzqQn98?b5gYnlE;vkvvip;g-HG>Cp{QKs%!bJKM(DfMamyPihaZ5*^}i)oYQhFm5-xBkn6 zme(fWb-N5NmFBuJ%BjC1)Pg7wD(fZcfC!ZhBHw!<*QYSH)|Zg?B6bs)oHEV#*UjlL zi3orrM7a^XkhmG%{rD_kAw=djig%=`j35Mj`f>QYezS9`QaTPIV;fz;lLi}J^3~XqTl=j zhB?rH2Umyn$CM?J2(4DI!L;zTcRnZCL~FHBaRTRegrql>#oqL?5HL47f5_{-e4NlC z!%(gmVo?dBxniHw!V06Vi1q^w(!KXSg}wQVQrWxXer8`#d&P;ooycC=KHbErP&x0a z^Eg)L-~~j7O``ilqT{ILDP2$caDulS-plBE-HtjMAD7#}2_)1~${&IBJ8)D!#DDJv*{`)* zZhc)L;Sz5$!Mx_k2WTN|4!^qF6*i?A8`;wAJMlGkqK8x`Oq+&VeY0-ixv_fQL0Wgx zye;r?NF2%o&f+6-1mw+RT+c{fK1&HaRRD1>gro^$|j zq-{2snk4sjw<3`1DKeU1TJ@W_;8^pHCjsXGIb3E}e>$m!D+HZ4bcf~>MqmP+;RL70 z<&W8?v}1y1N$&z5zl#54Pp386c3U(}u3c)j+8G|c(FzcneT$|buA$?jKE@&G*Ojee z)fWHXJZlCFq2LBMAlImY0%R&?cp9I#2ObaTg!`}^_f=!OfYL*u{5Y++;P$yXhqc~$ zB5=1Gfr(i~dIML0`V>^NWE`%U;OPUz%W!tG)0KParF1<=8GO46G>ZIO}?kYxIP5<5ZM*OTbp z71!_8(K)@K469ZYDr%p6zl^uLl9-n3g{t5*#Cx7YAszpVuV+u4aL%N8Z%vy}&0pDj zoi)9u^%M}Tx&_1EHOZ*>5{!PEnS_>!{z$w;9oimh73aI7_^57U$HRL0M z#-Zk$zGj)6U{#RZQ;CCUiT4z=R-rEW{QYAlgAD$!_h~QTQb$C@XDnVo>2YXYIpQdl z|5YAAkMvxgVufH?ylIv!&d!=0eJ01uuSTq$Rr|{JZr#>FYEksLPVC(Z;~lBElvwIm zm+BltO4@JakSG8TkOSRZOQ46Sh?6{UJr9C@1rKhFL?0!LBsMvl4#U};x5fiYXgU-L zK$sk&^}j6I+a%Zwke-%C(2|B%$}l!vtT+L{$_%lOrzqEMt+Y_DKx?}xo=~$=+I?ZH zH$8kuF;vzo_+qa4b`ETO0gvH8rZjgOJtS_+eNt8ZC1vinu=kB0xRqD@WLoA(yiy3v zZQ2t4FBaTZ!?~{*`dUhy9yw}L$tK5sl6}gFBgR6ftE_ALbp*n>D}3U9$ppinh3c1@l(4MogaNbolx1iJ)_gRLfS~RZ#`!_564Go!EitPap30 zT$@uqZ3Dq8_PVIHPeise`}-YR;n?NxN|$o@JfME1K`)=1 zRiZq4t*V@=vyE~$?c(OUE2q0lShMuB#EYJjI#kY`EdHSiaZ%F^*4DVoB2+mf`qJ0^ z$j`N-9^hizg)X;g3pbD&@?ZSGTqpU_|8asz6HRLiD2kjn>mkT4TbKH;MzVY_+KARM zaYZxO7nY0oqR?gj;t2$s)L4^_GN9soY2k9wIg zW6kT#0Ai}1E?PYdX;bHu2e)wRQJk7?k6#k1)JaVG4SA7HJqJ2>04?EEj2sV582h>} zOF&}gXurte4AoIDd8woE^eQ+o5rMWI91@SqCqyBJvku=rA-PZvI=)HX$ zs0gOmPl(Ue=Huuvw+Zd(=_#Jm=1|@84)N(`=!qg69q=5gJdZ-1@0UJ2xzAxIjs_EU4zYPZF~_SK!{@*Pr58} z(}wdi@KahbjySFf<|+lE;dXCw?n0)PEFzzNo{GDKz+owN5WcF6h)H~#!R=(Ga1aOR z?fIDQFDzvGsqM056VVpdpd^?Kkr_Zce4>>mOtWi6b7r1!`3)Wt1(bm?Cp&WCkA{JP z1jKM{%{nIwJSh5e1{vGtTbE=O6Dd6CSf2b)o0+s9-q5xHnrEVKsNF)1z0uVgqi+(d z21haR&R&PZs940bUzs1P`lag4NTd&2m|GThIeA3ZBk6{1pFx$pEen&EyZ&AN$mmDM z6s=51X|UcPwD?YZUJoZ)S?9UGW&s7zBAwP>LX^Y4Xg@Q_qp%6N!Lj|f#%QnC1>{mV z=sk(Du~xVs)tV(egd((ADVe2iFEpBCGfNqpZyefmA*5$M84GQ_XWM6!u_Hg2?9n2oR_xK7i#(}qeR)GhnCKs#!f7iP_MCBW=sD%|kmK5=&xSBj zZ(HWX{mVpK+&`|83^*l3foGQ7(n2DTqajl00#3k)7M<4ixm?=>XyrZPVJU<0_akJU zFRuE^IOV~IB3G9~zK|(f(Td&qT2@af?Ck!1<8aNuThgCc^`7T@1Lvi5SlA)?AH4#{ zNp-QI{ih~;)YxwMLE%2tb^BLwVu%B!SwyQOK3{oTS%}E@Y|`8M4=j%O;0z1(R?ES;x_tga;@WJeVFpgaYfCDjO6Z=vC zv5a`R0Fc*NK(aL26oDH)aRTqz@d9Z5au1lG>ZPRU3h{NB{BCM!LhZ>FZc&loqi#AW zY>1n2ZIDE}8)ZmI17I3Rl~3;k2ybZ9)mHy%s^ehKv0i?RY;@qUWY`_eC)y#gp-`hM zvF2ZjT`~~*`cIZ&gvlwtnRPCGV1S`~?&nMtxF`K!H}P7{|0PK;TpXga>dkCDX?QB; zoZ+X?X0s04TWoy0Y+=$}45CC*5&neMB=P~^7Xu%WxupX&6x|-`yH5ucvn<{n!iC(K z{kJ9;OuP0)5rk?xp|9F<-Jz&z>otbQCihgD6xv4ae`?1>0RnhfILx1>#N7}@0-1UI z^g}taQ}VwczI%ZeR&#mL#lJ|xg=;#YQX^(OvPzvI8K<{SVh12p%_NjM^O39yzy~m| zmbKUVAexE<^J9&&9xdmobQU|L{5954+;S@&ZooNUhalopNCjltBDMwVKOk5j0ad-m z1uX_WN#LG>_(!04go*MChdve>RJC|nl4NK=6!kkaave*R(D1VIB=0rn-pwX>jKsth zs~JpUr4pz5%80>i+NivKJDAGNT5Q?p{r)4%VdAl>%@!ty{`1y2lL)saR5emEJ-Fgi zgQGItw_I^#QEUBMV1dF_wl_2htbRUH`fxtloQ{y&|0T1P%SwBQMvbofT3iUb48=u& zfROAZ&(x`Ej>t1pIa=X>ne&~QnC>=?z=y0NiQig9o>DT-%J8dm1hvSaHq6;J^TJb% z>&Fba=h}9Hc+hgwfnM+n)BdPAo>RU4QkvNg9w=B1vJdc1v9PmIOgW>+PQmEv1$Be&Ex)m!RI5P)CLCO_fMIGEtJEQ`wR^Ab?8+#te zw`$_GnVV4dK~$eqUET(>H-K3Dn}v^M1<`Vy$LUs}9YrtG3f^+BH%6felvaqan8JD7 zK3m@2X8-DRyBsA6CXMh$-D?Fmy}LC|Uj>fg3F-|}{%Y0(0J1#c@-jqv5ZMC2jnN-t z!9U*u{+@C>c-vC2N@uf%$%?^hwTp74A5E--Gp;XIBVi<^!D`^*;C`bBZc0W=R-?|( zPM!E>Yym*Ikl9+OTGR{affr;bmO?c+pF=Xo9;tT>Tf|QZ)^uKb)(@%d_7LVyN5U=u z>({`o(C4-l0ATkGB}C%D3quu^!9SKhKTSAXpI9wnrX0Qo0bE-21MKDK>&W|y$cE1t z$ApJ9K8Im?{nFj-29@eBJ}K^NX)lo868ke8bL|86C%S1=Hg>Oz13Er@yzBbr>w1k~ z+Om=>(E<~{JsTpWz9Z(;n8>_%XZfVnt7S}IE)>?*us%HQZ_xMK9(>QWvUn?kW#Nng zoE|Q-%a#8==K;`A#*vm<*L4-*ukA&G490kE^R@n}FCGB0g2&H(uOPG&S|oVU+3zS? zvk0KTkjz|oUTr-s)VqD34Cu7=0kSkvTL=NC>iCrXUl`#45YGxwAMjrTmlkGXLv^fz zfA`j~J$Q$G0*A+qEQC_V*r1`xEi0rYEXd_-XJ%%V$DlO;T!AO3{-~o4O>L%alyB*J z@x08=gp2L=5-34a)A#MW2ogRu_D(Ky&p!NTnjqqSBL!$^(GGV?rVprC!>G0tt*7uZ z0M9F!2MqN+GxLoP>LInts>#o`Gr3i5rxbb|NlViPq0l`{U13gx=k8SuMAH|{{s{&h zu~Y>|$?TS+XS;Kb`c(crX@DPP0O#xr$qeo z{+Ik6xu^DF70&nGlz+;@4`}0QK$clZkJ@DgTzeVj4X8lPwB0-yZHDa>++gdq`igrZ zRZb>aeU&RzV^FKM^fPAb=k6Afkq*bu=KzY=8!#mRj3hI2Ts}7!bc+Xdqs0IdONOon zqE&QF2b$FozguF^Rt8HV>HHVNJ}g4;OS(Hulz=O?HO>)2PiPLIwLD$X5vw`Y#=q*1 zvUuV4*I2BBtGCyCr z@z(T$$(!+$A+38mjFb|{<+5&>m&AvzzUQt4d=g#&V{hdZHSDFc0Q;@0w1BqYj=~7} z4i31QN(boJw}5BVyRM#>3meV>^@z zFVgC1$~f-z59YUo5)B2R-@!o91ZIpkal&%1qngb1JU7#l*I`UYhiMX`E?*7Z-wbi9 zPjp9C{ODdv>rKh(qUJ&*~`n$5NdlUf9^iLZ7d0osU8`%sewCDue4 zE+>QA&j1h2`*GUC$?k6>h|)hB0EXBd`sPP`V*S;)viuqt+=Jtus6ByMbSZ^JHEC@U zLE9F3$W!R`JzImfNUYUs2}sv#F!wp@>NNyy>s`eFcZkR{J^)C(ytSw-0!p3VQSMB< zrPbLtz-s|sD2fdF-k#?cS*h(z#5VccGDWwcn@?=eI{ z>}Jvk*gn}D8w1Lg*@IzGzj04h4qKYpHs-2Tcay<4NHzco<(@HElCj%uhYR3F{Zai+u-Ao4XzNVTy`_I>ZK zkC_Z0FgU3{l~)vV+bG;q^c%gOr~pm$KJA&Y!QBu;LQRC{D^IF@oAlKyK$oNwU!@?% zCgcgkV1=m=ilGt8DClw~JGQ9w5YDvLx~y080ksWq9(}-JDQ~04fx<{D9GESj;@wL| zKgX-z7WS%6Q%{BaD9etb?ufp6{tLg*Pg(H*xNLeU3~I|rs{SrJ@AQAn0&stijePqV zTqwtiLQ@P1+WVSf(|atGG!+`Ox2<>YVW^QvZAT7a;#{xpzHw!zy?%kyKdc{!%Bme7 zTdC7y)`lxtp&$5w_1z0h+Afeq=&h3XJnk{~enj}y#KTjy%FJ!4K8M~e!u7MeG5%X+ z9|#?qND0k))e(4Z7FI{vKT|N<^ZX|AuUHif#Hw(@Kv`x#RUCo&-RV*?MzZ6^eQ(Ah z&B`~J+$J>#>35syl<}Vo2+g(6m4$j%V2!-o_V3;Zz8ta;gh{C|R1JO+z=$!uo%Fp3 z@|6%#>%d*ScQ?u#pEH1D=I9<p z3a-HTa`qLf8Up-UA3#{G!R+$BKq5C@ZgXIE(kTI~`l9ocd zocHEyXN<&S7o-_#$!{0;Z*|Y6Nn$HRFxFMk3h|t>hdA?L8Bd`*Jdxjf!djp0(;RCZ zCN6m$54b~F2pzLfeBmI9@E8r3^4GDt-uLpM2TmxzBg_>&a7v$R^95#HE-s}0=y|}< zdF=sp%_F+`iDGfOHNoAx2lr8(!1;2|{on@AZjvBlMUxQ^yVSmVtQeeF!#5)ZB#o(- zFrPTs#cuVI9NleOauHldl;bwT&%QsuzbnzH(Tz{cmicA8wW>Rj8|%^V7ai~i_nVXW z0sjAW6C*4EK!ZOYgVTw~BN}FDaZMK;jO!$A+2WCMWMZGYTTzs;`4$&n`6<=3zH`Tc zs_5E;Or^bb{R)sRRlL+=yqin+w_O&yvz6SBPT*8r(@|V8IUkr9(kWH*<(<>W4ui$Eu`(+Biy)wWdg+_%^(5#})-2pMq z9~aMGE+R%8>Q5N5`^Sq5DX=;QjWTjigCW4I*+4g#$A7ySfTHTClTB6fd|M z4S_&ZTS{MySvpDY{%UHbjR#=pZ!(uds36^K^?>Pq^d{45RWZ|aN50qsc| z<*&cEd%Vnl;y)(fInl}K<5*N_!T&3V;R5%Y-5rag4Wub4fJ8ala-iJcF7m8tHRA0k zT&0?FBjB)7e{%BCE{(%l6K?V6aXT_3;9KNJ3{jNobu5Bq9#d=9e)Za$X>fOh6YLI8 z%^@Ru3-#r|Lj~O!o0J7iy7onW7~}HI0?>ZQqf0_y_vgqs2`{qqk=rB?~QsB$*u($qwrgS z9Q7$hcCf`?NAq2cM6TC%2dho~oZu}b+&Z5(rv3u~H_+j#Q>$`WIOQ-pU|g_AEdb#j zQ&anj?rhwYgJ=a#qf2W5nmfZ(r-QbDN#na@71C3GYY->$z%;l$uB}s}v=ab? zaVK2TK=7L59bm|T<*E?^oq95se#eGM-~)uVBfD|9?En)W0w`~~q~fF!=d>zKvm`~m zVN=^a+73$T$!m^{q2el+HM+E^7YYX_WAeaUB{PnEyH~Sg4YyE~!&27lo^bz)ddMS+ z884nzM|$oyU( zAA@_`;I2TYAIQ&h;LlM!#%CdS6(h6K8q2cgedqIsRn!+#LIC%}=0>%qQm1l>|BT%Z z!ZAr)E)3RL*C5q2>raeMFd@;$f~cX9P2|-%4>rDOt8A*v=a<^VtsmS>xRQhfSkh3d z1Rl}Zx6Rh}n^17!>Fxo~OHlf=VSfmz)Wj$C0&G#g^ks-HT2Oet4@td6RU0iMn4x%U zG4yu{41ZRFAU)I?@TpM}BW9aYRK*f~dQ6HsaspU;e^m-=M10bhbu$RUB!a-HN;qX} zf(TEYUja7e>qqr$Id_Eo>Zi(OnZ>y$v`4Kz_MdOV=~j75n@cfLi2#H~r*6;)JZb`- zay!`=v4HakecnKf%mZv8eE*NKvkZ%J?fSm5aSJMviULwfrukLy5GM#LyrT zA|TyEgTzn*(j7V=-HMb$=g=X%=jFEc{XF;k9`7eV>|^USXa3fIt@S^>guHXcLmg2S zE(-9HI+w8jRzE04!pU{>Wger|qZm3ZNL8cAT!hj!EEJtu~5bnoO$tuz;)NR9BUgm6jhWABM+q!bYHQ{f1pDA)I{^N`2$J zYU?(S@gxDO6 z>wKh%13}&;^7@t1&eHjv+O6)+8QGl&lHszNxeC#X!MUTov7`5QRGUj#Jlrp}6k2lNcP(>~rbHg<)MH3|;N_AI%dUBYjbZ%6;`Gb>0LBC?Im> z(_=uL)XKz(>@NsL-Wy9CQ^T&)b|s`sUYBl!`mD6dK&cB&K_Kg#A?@S)p%n4{mv1Dj z#}?0Kl4w?mQJvgpr6cGR$y;A~7Z;(lJ+=DjT@DCzO|n5zz{9J>I9ezsoU1;?8)omy z%X$5E9P}JxtuHW)m}qRDS+4%yKc`Oq%x&U3$@lNIId(_ie@!n`2x=NWELYFic|aBH zwuY$7ltOpEw}6%nD0ad$eEDt{M4PqbWmp9q9Ue-jl;v~GNTbT{KGKG1VhE!o@t@?9 zV=wn-$#JXtayKP#vGVc&W$yU))KY#?xAF_aiRd#LbbDqgp?@Z8e*@}*2^LOz@q*vo)qAdHGzV*6;!S~Ffx5CjdSsf46&HA{=T%5|1 z)p{2SxLrYVeWQF0CZi*g%cU@$yNlCuu56}Cy4GG^1eA(b+SDJ=w>c27rsEJNfsP27 zATb5^TVl1+9C<6KJ1@NQ5SEoI5Rg3teI-Wf(0pdYRbl_E|}VZER`73`-YfeXnmj{yE?4)hU@@ zF}&v0=@D2iXb)YWC1bY?tq1qU81Y@uugY41!^#7cF~2yexasKCe5|W{$^@8ev+!s$ zI;G|58IuW6Q@pFm&2tR~Rmz-*ogt6oioL?YM|E*@vlWwerihn9t|uRhH(E5ezYtU1 z^GC7LzhYC#kU5w|eWu@KCd4oli#STo_oSrE>(iEMBF^=>LY;S7Z=cZ7;@qqxc&pp- z{J|8xFCWb-rp{h<6li3bez6xlUF_jV%n&rVf7V-MF=?5(<@}jAp_BdDF>XATVXGlq z14-d~NP1A~uSKJBaApIHX$AhrFMCbiVSl;641?x(W~okHc57#nZ}6BsY!9;T6X7cH zL3Z`TpLG1bjw~S6%pbpvKEBb1=qB_s;c2$*_WSO6&5ks{@LG!}33 z6r-dRYtwIaUNHY|^FzTFcV5wJC5P{ChJBqL#x|LGe%3*a5c$29udLZ0=VPF6N~=Vom?c>qYvdda$l<(Hv4btV(*D)l2lC!6gCX z2r~&NoJLA7v|w@YAk_U><~hY5Lv=J-tzaclG9X-xp0o-eb?+aeRP$3cZQJDX%N;gr zp$rd)XeNJA>Dv|kczs0Y?q45AJbp)Z@~JgYHi=Yb1cdRl-ftLRNJV=yZ*jgO;VQW} z81%4Na9{pN8woBPc~Hh^DTzOvr0&-b(pMM)HS8GwH+jO?%+1c=Kbaq3OctjDs6ahS zcw9B124H)5-IVXe(vFxjN|)|PH(HEZZe!gS914q&Skd_q;D*BF1(bcxTg!QcQG;1W z;0p$MVzW4C5w3J8|5J!b()Y5mqZ74ZE;PbvaGA3uXHjrV%~;T#pfM3SrRf6e#RW6 zgz(`)hF0w~@2w?HU()cG@5Nh72QMOYg-QZ7eeWp0vtoS_XEnT2swAMnpT%6{kfp~q zSwOKv{lHKvmCk=p1XO{+D|x8S60Eq$5T;@m_@+5w=f_-Z?qo)kUWpMR7b?PboO$l+ z`}nriwH}t0{ZxX0r>dlm25+5qVxuh88t@C-JXJz>WimXXw*F}S6ov{ZbKY0Oh@oR2 z*NG1|1f$z5Y4m`;9ix10nnqF=%KYK)fUGh5l}k8E%cCX6Tg5Qs2U)$otK$#d21Dk< z4LbrgV!WnZj&@h!3%A9UI%}sqGLtKI(^{Zrfv2$tMS-I#?@^vR_rKAjwcjo?PqI!- zdTdt5lpC6p-|b_V+oyd*Sa|88bghLV^S8&EJCIZ=MepFD_2q9RhpOBgJ90e_no6NQ z4pG*Jq7s#Ku!G`Mn$JRamJExCP6m;a0VuVxw2G=H)7nIsU)5}4N>Ir(Q)%G{wrl*E zW(hYYp<6ERO>ffS_gp8(l7t7+_>uZXq{?>2awz3%6s>XQsC5=i-CzqyNBzBoBzl06 zq&2`D_9G=F3|;_IM-JH*@8;6X3%Wq!nQK1IpajM=jMYK3N_|`@(L!{WA45&Gd8J5B zv*XASKbLPJW6K4v>HUVO|LM~&$Ir&gf;?11NxFEQg4Dsfr|4n))@&SNkkxZ3d6=H& zI=_*`=h-9;IBfR(8Q&+MaZZP{h_@#};oGd{j$M~JEI6r(lE1Z7_g^!256m3Hn`%X3 zv$JPg{rnV}=+k=}c?vr)f!DhU8C@>KhoJ}trGl@TDAA-}RDLmKgtG*cYx2&*DRYzA zlgdcabENZjkpU6YAYJWyg$73W_ELtFd&#T`)MT)gq~zaMQSN3CU-Q9M8+1+JM{#8a ziUe^7^+lZHi)!YLQKpI_)iRf%_TQ&%9E)%0JVCJ(Jzi&Cfl620Uj?FXo}n~~dFw+{ z@%Ax6OBydpf~6fJk2OlM|Gn~VxDr3&`s&u%Gd(OYD>%#?->xeOBrM7L6+BFm2Q{89 zxsep2f=x_py0%JwE4t4Z00pdNE>_E@zQ88nAu1%Y?xQG_^Oo%MT`;&G)s`xXL+$?# zB^UUUv0F{2E|^%XPLR;Mi`@g5>PR-rTVGw$r$q|wZB6-TW34ZpO0Y?uVo(R zq@vK|)}W#=B47jhAm6TO0P4>!*)M>V$8|C%LUFgLLFbVQA2wbMUnt>Cu(k=G?k?}8M~DR35})OmvSIxc^_+Cv!bRZ*%BWk^vB_p zq-Ls^K}#iZ0mBKDKn^y)c;!rx)F`bzQ%C51{R{VEJ6+T%?e9kN5Y*HH{Eur zGfQE!k$&mrooiq{-E zJ6#W$?$@uSfx_}%N#_M75c3O54eum~aS*bj(M7SQi zN3r4t4BY$mq^|WN*cRevXq3yti;|adXslgGGaAEluG|Y8z4<0g2uXC8$SuoOIk{9~ zgwC5l(27XR1fJYsPjQokFe2~)_!e>U>6i1-hOH|U#1ugf+FYa;N%wAECCnXPY_MwN z!)3osE5*}(g9e9%Zz)_Odiq14ia#?qMVzre^K7^@wM9n_^I2y0QXc{1Po)9JmC+T_ zikp;6Gh}YMpwzbrilB_Bd_EQ%BDYYSpaR=t){}2YM)<3gTa_XL#Yi{#M@YX-0?ri# z?Xs&vYAh}_z3gzk#_x=Q6cHLYy9*c?nS_1cOq zC8%%j@Mhh9kCnUTUMf?1rDyTc~93=J@SGbR&{e&)A2Y8 z{Ba!$93x zSN}#~{MT`w)pYfr+vPIYE))0q9OK0Ba3q^(X$ae}js9wSLz9WU9xv$p^ePvQkl!WH z{>&#OF73dbt0U-`2g8g$F!m(TW@eF$vZmKn^N%`u{QZ_CUZmr7INgmAwz%jP)#3Q<%d?3;q|aw}pj(Q5>F~Q>3awd! z@h+pt`}+mcA&(apX4--swhd^zXFLXam50rTdXkK%CN2$ruF&JW2z3T(yXpYXP{%v z)|J$ArC8oB(mIMtYrxcEn#3Jogxl`L2Dy|{^p%s4qM({0xf;0~QpIMsJl8SlxEzTy}3a5LWAZZcOsojCiMG_g10N^&9y~-HFj^ z{CXo*{ah&y=-f3f^cNQ|R;sO856Cp4!>!X&ZT=|#{)pQ8Nw@iPt`ds9C0)KZBFW1F z2N+4qWDPvR4wjFcW@V+1H7ql(~g}l7tYAJ(!^yq(^?yK5uq-bFL`mN{cwiA!%CR$ zNkaLjp#0?WvWo)Wr*|Kv*!*6rJpQ439=r^cF< zD#I{cTxI-SgS(#dxFGhn`=IuL&a^H(P=oEc-@INY^(Ku30t7lkufZ3%tj*debXaIO zb~r>gWyck5#gTUA;r}s5)SzlEga^oKY_zGdE?KVO90A8mAn49`w3l}ghh)yB6#GKw z1Se0_0g?z=fc}sKEE!k>h~~@k6o;~^YZ8i%l6Hm8BJdi5_h0cy>LRy3gGLGwv-ext zmv5Mk77xSG&;KTjJcw)hHkhTi6KRiJ+WSzxUz0}BprEqEYMoX4$L?eV%OytA{VDjC z#$X}AMA&wx1MYK-iD*pDD}TSIpDNf0Ux8E|KU{GcB#VeCc_dky{T7;t=r7?H65SeA z9luAZ^Y++7q5 zEjSU$_Q}rcZkB3HL4M9S&xzEX`{J zPFB6Hg84Jm{O6e5;smMBn|xH~#7OXJx8L4BTWZkc%PK~IWOepE)0d*f0avr=XjN^c!qsj-zm+``e8KIRaNTr$& z<*D&siySsr+n&l*jURB8qQvlnJ};q_w<~}1wX%&9Y&Y*kWa_WXHTAwk$n(R zq_=0AEaWKxRj2n06uH3o)yoV;+`AHZ^Gm?(xRExAw`0pH`1r2_E9U!oLRnSbf2Jhq z!9q#&wyVJ1zIwK9VE_S}*)i&YcMSx4b#)A&1dxH3&W+JT6c3vVgBJbLsm6iv;bC?D z!7Z^Pvemo2ZhG~mI1BL$?<82zHs|ljAh5I6Xu^y=&M21|&eclyEQ2DV_~))4L64;! zMFw8J@Q{>8Udrz1-PkuFPPQw*#^=x0RTy<@EIi>Q$9|IYu6WVWi~v&E?EOIALX(|h zKK8jC=i$Hk9$9amu()<4hhb}zUK2`${mvVUykR^ zmC4G4fT%-SSe3Bk=WSp!K!iWkq9tYTtzwaj>K4kaAt%}XHsjQQV{m#Oqbx@`oO z0ymT8VI=>1QU@6Cc2bsoSyKNMjbo<;{(JS01C}D4)tc2-RTNF4mJpj16yQNGHFrb)&gFrPDrTHcHmS@vjejlRKeqNe#2@AB{yp^Pcon4fCz^4V{S zg9!*FCfzESnmT%xcdhNH8knr`*nFuid$!o`4>;*syb#3W{#sj zMQ#}oGT)kUAT}dB3!9TmQ{M5_ch$~F?FD>9P0I-JQ78p}Da}K*6hBF!b=h}poYmsF zye9jMgkGZVQN3FsSHp9T`-x@w3qPo$>|XJ`@^0Hg9WO4xp(Oh3UowEzDtbzm=Hn(G zMc?>Wv<`kbGpLJzOa%;jgWXA9648@2R~fav+YzR8_>c>ju}PL0t_8bUr8t3G?9(q&5z~M!{^+RAcrkpUK#pCa z%bRT}+1D#%whjEBvIC2cq5;`f4JmwSu`VD5x@pG`OpOp#u*FI_aEg90&@Z@TJ zN5@Sk(q(C^kBAotxI3SkNvFL)hh!*W0t6tE4zO8)BJ8sgjTXroLG#_?#J*-JnBVEy zI5BX)lbP?2VqcE%hHcjzV*SG&B%`+kHeK5mnzrV9)(Ke8D_LF_cIi#M7hRWjG78hM zW@lM0bVa#(curx@Y`t=J=51g>UrVPPfe#Tl`uY%B$Kf;lz=|?M2rEtvylhJJe>*&0 za{*i7{1ia-{kcdD92u92jzZ75Mr9wo&WYLKRQj&9-Ods^&a_NMqHi+w$Ou zsizGsw&j@eYfJc?0H=lWQz5y%Ob`vgHuAB};sdIZaYdHew#bB$*d2y0oDSMo0)h8W z-*c$&Wd1EJ36H$$gX0+vBE@{1g}pROv`w@Fng#~d#|IS59_RyGgPY^ULPZ5z+E=Xa z4)>Idt4(Ys30dFP-)pPYRNwpEG_s%%od_da&uoCpB}bp^4z1qhgCYJAHR;?nHBtf` zs81!`8~yZJ!iQt^Aobz?$BHb7VSB~=rAK;sHTehCJ?5tjjW*9GO^!p%0;^qn*8P|5 zM(pLg;A{bf+*Wb;%mrJh^U;veL>SX&B|Ttn$uyF8B2szP>s{2W&GRUHo-Ab4-Y+%s zcU5XR0ImKNE7v~uo*g4ty;TP$s_%6dFtDNXYf9pGz$6V%)HpNDU8V)sms+#;bd#Fz z88=zM_r{hn4eNQQH*m1`@c>%9lsK+yHHp8 zA8L6%24DfyYcy0qb|d{fHwbctjApUHJxbRgGm|Pp zZ11@;)Igr2_N<&+^qIhs3}LYI2&bGgCOMcIu78t`RvNp@<^6*!*bBB^x`Zs(D#mls zohKX+C`x7<$;21y`+I!L=K6)74H^apP@vIzQNA0Wo(`5Rn z4-BIpp)4gRb%^lSl`Sh(Tpr9N%`zV-d@sQsaOrwPfL_c*qkp9oxe;*Op(g6JiJfHZ zIDWc)l$qpr>tNgwf8@jL9f}b+-S`IR_r{o=O~>1sHW@C^3UP$Z29SPxnj2s|MnnGI zRFz)^&Ghly?>bYl22hMSZbO9>9M-|!PFHYq4H^#SoxiQb@#Qv^63cQKCZdS?4pj95 zF1GY&QcoeIwY7D$1RH)?QD5j^btC8_hO^)3w?AdYqHRcjlZAJmK#{w55Qq_+Ox_&5 zy3QQ|f(1@^c~12krJVsv@_8a)hZ*|2;c(jqTCqn5)y{QdVjKfJSM-bd*H>O>@3nz> z2=>&?aU3r*9~;QyN4lovoOF*j`scBI(RZAH)1UF#7wlV)cE{BS?OX-9G;^?NUpxB- zFG{=;Dgw)tOA(tC49@b`q}>^ub7-x~m{yOcKMKkJdhY#VxzVM2%>ZMXI|$z#dc0?#UDpl3Uq|cJ2)0; zi+RT`V%l`zsFC9LcQYdl_&y3DLI0vn?Wh9>2gYi!<6@1Ul_|%%g&^%>fjjH`tj|5M z2Gt$)hA@>%`?|aWREOo~;5|oRv1KcC4_R zu;Tp7p7P&E)&M%#bLgVeqIn3%HW_6Xg&1rB6es^;3fR|KxJLCV>2cvhvN!-0L|zSn z55CpY5@Mn_(zIZ)IZ^hv$2qY;vt@U(pr8wkmjsb&tcDoT6z#}MG4>o#bF%&T$LRpc zs9uOHw|*n6+RWt_+8q7LjI!6vaL_-J^;^Nmg?crZU?G4Ne3Bd(P?_G@_nhwP13K+R z_Iaz4Ym}8K8e=D(YtYONC{#UyAvWL?;sajT_f1tx;_>DehB@pXg{3ML*+!~MR z8$ew=Y7HVDz-35!4Lr5f>&jGZ%mccs+MS9ywtfNzua7e^268Je4dVj4 z&L;$Xcc2FPAJWC~x0w0TrGEp)Ayhln^R}3djrQS=uO6LPr%>0b{Dv|IVr0Rb?k--- zbHH_C@-Eszl#mtDiV0duujST@R*o;U(`BK6HKVN2lNaVu618if3KBow^lMY8NhevK zKN=1~);zP863@`@-nn1RgAb}X=GscDJAU4xabk5~B@8daM-#3R_R1Bg)V+_9@O12U zj8@Kb8#)K;-2+DB`Y5e6|FrNfn`ko=HaSovV$SxbZjm6SL_GEG!=%)4h(%!S_?&a+ zPUY6U`-lj;d`o3d!k&uat}xPexa za?hUDs}Nz7LWIEv2t&6Xylesp1G31Y^X=;b8P6W`3EVsZ@3y-gkD8C}FImmG(i`&oSmG!6p+ zXyC&d0sSG=kppD<3Hh+b*&Q=b50}c0y+5(E9uPHIa3UQQhO~Q(HD4{w+`~fU4ua)P zvJp7c9(UO&+Yu(H!!ApenvPdC-$3`PirA+f8VwtfJ312|v0dzj6^Cl4+GBM?;nzc( zdFx3cm5SpbM+UWgbvitFl$lBLaIUIW&dy7ruXgWW(?luvkmnjP)J0>536opv}2%kGMu7GniAO#fL@D9U6s64lwC4?zDFOP|d zB%;EZmCV_vewUG0$bs*w2y6G>ffS5>1k7m1s1s5!Z2nO&Y9F(_?*caFV{rp7&CoB% zl_2kS^uvz7RxQhB#nv6+#0$7shYCwJ0eq;28`yMkqNwTsq0pVP5BmHM&H!N^Dn-9+ z!3UZ}TR~`Bu=|K~C)ab_cvd%^Z@j7Gmjw9RBo!i!w}3QkA<|I)hcul2MH<=vB8`XV zu{NFa8c0_nY>}m#KT*TYH*rzo^*^Ygf_-P!hH>}<|7sf{5$dfiGJQ?xM;`5$dB^BQ z>}_8?KB;=A!rS+izN1F*Pt*v2P$LvV4fUU>;ZscjSR>*)Yp|^jugAL)#H@6|p;D^L z_U%a;fb`zAsqkwnzH|iXuV`x1Qi&azOlf7gPf@DZv$7OK?)}LwQg1;2;H&oyg4uy$z z25G;4!nhhoWmXPv{XvtKW7&a{P zzwt(5qZ@r{1HNYl8CiksjvzY8IC*(p9zElTdiXCP1LPx@B>LiR8x!^US8=RaD6KB6 zCpkdn9;Lqp@+GJgg0iPc{X1}=H90=I9<&Mhvq8WS`~x^PN!G*s*?$9vfD6-;{{=YW zaG#O;JZX^nHaBbYHqS~+asJx-+v2LgE%KUqx25j<4pi-oqxlgY?Xp%Nd^T{G=?|Nf zU)SC9TdAZIh4tPs=vn@bTE@3B&t`Ul`ksR-yGa_&O9*vX655>3bpsUNGrLKAE2%3S z*Hs_Z+lksa{EU4$O6*v;!>uM^GTQ!9U)XZ3MWD#p#6UhFP#MSr9_0WqDoHL~3z{zQ zch}i=J3D?Am)C*%|MI=~nzpC(jdJF1NeAMJo^)bR4Ct(i+EBCT9LK)&7psV2G~D{b zf;svH9JJgo`VlJv?_9}zSVHc*GKqOzW5Ll_^C5@gy>-ip(*&_^I8j~!n(rrR|Dle< zKdEB{J_N$Gk8rkAPn3f)f3N!=9j~cJ;O2Ltk{baF6|7M;tg^0_&)wKmJ2UVQgt~7F zr%)U}@nH!o&3l=Rma@5 z!ntLU9Qxi#+>LilK-(biBk4_Q#WAsPlRK>Zsp&f(1_ypiT4)@>T%yh=9n06_AH^z14T}XobiF z_G-Q>K61VcGM~8Ze7O$_)^0y>u^qa2dpFAIb;mHP*QDC1CDyl;GhTlk5f`QtoWf>G zAAxSHB?4CK)<8ly_@o$mg@i%Pc{Q(;<8RA0BE!g2s(&PoQ>yoGZLeJa$;iE1U_ZMd zN_2puPwk)uhrZD4MUFY3uwyeP`tL>r#9r}1VaVlTSY>|JM-d2vIjbdjd+hJq7-g+e zG>(o7;eseafauMkpfV+s+wqYKB`udU`IE=ka%eL+^GCQ;Ba!vpZsDRlCH3f$nN#Bb zkv>_t4u(azWvILYut(%aA^J@zV!$4+{$Y>mf3b(@5B3O#*hBu`>|u~f+&g)Z$tz|2 z?)-X!P)O86ElfI8&0rDF3`zi!G(>oy7elSs)kQ=WooDN4jJ3`_C7f{k3}V zhtQGA3uZ;9WdiBMeHNx$uFA_1w@DXi43o~V4dKZ8O1uL4sJ^F9WF#(wb(`b3^k~?; zjuxMvg6r`Ev;cCH;GLO7*B(faHQL}V*u*v{haS}QO)_NNy7ghC(5+ID(yPTT8C-fr zI`7!SVyHn$5&}3Z4QT@L+@*h#?Z0MFfcYnwC;#Cqdw@R70DaKz7=3`~!}JGzd}V&$ z`I|mSf6zzEAM_E1y?rOGLGMuWWR;fjLuBfp@K?J6{D&a5h5xW`3pHMNX(#2ju{4M? z6X;X_D}DT)B7)w|TMBKY^4)@NX@eeiU?$SZN6aB5ez(j*F&}1@+whjJIL#t>Peacc z7(6%H2qztfEUsT+2fdW9KoeLpI7%-aFjOXpNPgJL<1b=0ma^qt3Ukb>yDKgM2T8rb zwg{}7}0X%&?x1@Y%@67^_|pg)U?Mt z>Y%-`3zUu{YNh6qq)*!R1Czvi)U0FiTR>zQrg$8}4^Hwqn?xvkas{l^ZkBt)Q1awK zNP0{KQx2D`Tq4M`{y5%y>%hvWiOsRJq&W+t?<7@1GwHWr&At}*t>W1#Q%n)5+cfH| zt9@UpOvO<^RGM5@o3|R6{T5S_6s7=PTk4(6J+9Js?|8+Aol3B0PHd4l4kuc_6YgT9<~sB{7rjSktr zr&|8fI!?0lSEdqv@5?pF@YRD=PZeU1JW|=Z2M~K0K?m65$%2&A5B7-p z-`PVfg(0;;=|q}`M>Dy95_g_rS=Z~osU3O$Qaet2Y!$1R1s@Inj&b)uguO}`TA0;_ zJrhjV;c7nA$uM`@>h(g?r5n1nE_Se-=)epYeV%8wb6xRc1E?f*w%8^)CY`ar;e%8I z?)`0Ek8{>E^z>>c+T>Fw3Cwoir8ZRUzf)GLV9jwjWA~~z3TzPdge?%csFfN101sjB zeXE=*4j;kHQ1;D4I|W$5uLuzAtEmP8uHpjLQQI*j%*XcG1w4`}}XbycIl9 z%u#LOprz$Jq&mFpKnz@DXMo;O_g(KG@d0{AHV(mm(K}AR7&rWG^Rb-*YZE^yetiL` zvm|_Ow_hDtR6u1KFy_wXK#*i6Wz!yAGuK0mI00*Xm?rcFfa2Y0zZG+-vZbu(pZOGz zcs1ekZm0Fb-->YK#AH&By}Xx?^}WBJ;(2Ef8vb};8S~Av&3eNM# zy%3}?1QmDy6Y>)g6RiWUb3egD>AJz!w*L?CxDSrW8}R)Ch&yr~aoGQhI|jdVhYG|U z)Ze+IGyH#YhXIzboOgr5iGHA0MgnbW%s~y>_47e0U5_Qdqqkv;d#_QlhKLy+XbJM_ zn(>ZnD6RR}GEymCiH1Yt!eCPD9)6<31B#>S4Iy_yOICz_*p(c9R^X;A(36k~}jn4xH zv0E@48bgb8g2pZ!->w%^-Z<$oF#ccWqgFVS+v`JJJ;bp!YPwFhy{c(@tS-Z()e z`^+tPj`?fw)j5yS!w*~h9@YG+ds<3E4!gkKWHM!~9JJA_m#ebFakBzMWh~ox-#-K9 zLRcYUH+yj?D16j)@k5nkM`^L;nYR=fJRO^ZC=U7=-yp13quWuk_Z+{q0i)2G%C+j{ ztDwhi_UxDE$>zK?j^Ct`isg?6pC0b4DrcuirxK28;dFfyRY>U7IrU-)A=0YD`xHN& zm!umO&0R#I`Ne;EY_Dq97sXSAVKNa2m8ZbeD6OphK(@OqArM2kBES5ZdzJfJ zcl2r*^c^s4%&A(S=vTrHjZBjqX_Rb!%*f}h1j|zUo_y}2tJR7Ei1?81AzLk8FkJkEFw+5O*BE%C$%=2^ZDkK|T@2@BX%FxmwR&y^ucS z23u~{*!OpG4+!n0o`|$>&ZMI_cc=t@(vQ($l>#4@)%&bno#u5A;)E-xvsJM++hj&# zKuddKz#`&00}J$=fqGAwinhXCEp3o}<*pf8f7qeDcz3W`uO7@eAEnQ6%BA(*mMG_k zj9F4?@;A)u-=4V&zM(M>y+au0(rUZp1X_Dp-8F1l7CEfVIaZf@Zc=7d^iS9Pv1T;M z!P*^Z&vAHn#z%hcnHq!3jHSYYO3{}AZH9y$#4vaw%~@01A)A+2cC~2eJlPyV+l#$n z01UCg5#gItr528dSK1syo2gDV0`m821?(HEbgniV!9T`pjF{Q2`3DU0we4s)2i`(n z8Q~ukME+c>z$XJ)NlB5xUUCjB4*peHR~Wqe4LV+Mz{1zuZQ~noHML8YVnxOqsJFQY zjLFwHOh<`09+^Wk;nVo}RLNYKBF9uG=h6J>TLBWeBJQGh6HcFOF>_rkHZ3l}`S$k7 zF>Wx2x#-Auz2Up*nd({Ulc+5DW+sIjHvjAvXo37iXx6qPCL~Z1f)m%Jz~Ct(=ek4L z)o&q3Wy;*iiUhCyoGi7f=n>0=?aE)vcn>TOSz}v}%8}L!`n2j=X3b=Jt73eH|X+D`2f8WZulABm-MmFa9|c zX4q>%Vl0Jwt(mG7xMw4)79|~?`rauo8^$%MI4}78iFlPMT7DV4wt1>{j(63BR%>?o zx|0&;$a9rgbLBP}sTyd(8n%+xDGcBrm9Z5k z=U9u%Jtoa3?;yDD2h{%FB+^q)v9;~$$b(PDpJ2-qai?`k7Bat#k9%@)k^vZ-wq4QC zy-go+x+QwbO&>vVyQ+eg_ycemt8a0$rO$6>MEbL=<$inRN9UD|zFdA1@kFo+{4h^> z>}INCs*l4{Jn^SFGxfyyDKb?FMXxFtTWawjs~6p`h!Mu3s(IdvCiw985?5>S@--&6 zV?CSaTcZ;*Zkh;M{hp<7;2ar0C33>Xax|J3jBJ-bAu#_$x!zQeDXJw} z>bMRXq$y(5O|>2LUdW`GjtB6pj@U{LA22-2_8iwX-C-XFQ%3IBSb7?KAgX_A(;b~0 zBS!(RXG$ok)#mJs|9+yR?6;mf$7c%55Goqd_t#&P(+>E4#(&?qw$#v~4ZPoRnb=2u zdsy&nVoZ_UB>hVSV{!rIklO|{EPo|s6_+L4ZSP09Z73bLDs_cQAC))k^b1*AWsJvH zeA)!3>s=n~rPFzBhq}dOrujhex_RFFBzLW5toOsi+`rC%7uaBR^U?1NQTaI)UX{n$ zq4^Eu(D@Fn*oi=}RBARgCZ}#EMzJNv4Q)RYWJ`ILCNsg4(oZJ0T<@V#q^Vs*?#!Yt zmybIOd|%34dY@DBup*;|<;ltgvu@hK5iQB`*~u-)hK9Y9Phd<0@qC!5#HnDdm;|t8 z9{He$Dy9b%1+7b**S{FTKMEIFCc~34Vdg?{6c(;a)@paNY{*jj!;dqS4(55hw5l>0 zl7hf2)4BtzN-Bn1*KFfxlKl3OBU9PRof4@X{ zG=BK5k&!uCcprFv-B4F2ZnGMYt5H3?9D_K%41V*}!hPyvnw!ZO=FLoHnAgU0s#iBJ zI(fPS<6`|CK8ntKH`shF-pH;;&SaV1Y(HjjdobU;+-k|nMAIDCqq#TwxZF&3Oxp{I z!B`|$xt{OTS0W$aaxjkH%}^BmF|XudU_{Bo77MLzHwzhJA3W={nZc;i8!r7VM%)T~ z$t~qC=s6o(BDRpq+7np|@+@-8+wzv<@;c^jb&I(ph7bTu;7sA|tDp(_(_e?rl4F(= zmn)Ot$&`A<)}y{)OxfN{fTckhY`$d4Vlz&PN}LVDFi)ynwjt3@P3+G*Ru@^=aLt~T zb#0Eyoz_Jh3w;GSd-9i%n3POthCxRLSK#wiPu%hbHQnQna0`8CAS z)IvEJUnZ{$Smp9{F_x3{9_Q}{AC0Aa8?&1mY92SHIvNExT1!fqC|Wg5LZ2ztlUNqt zE2@I{%1Ezv%M?A^tRf@Ffy1mKqPm?OVUMdyZ_QkTU;q!1IFBdgr*M4`96V7eYWcB% zf8EI+sm0#RCtopyQTRQmXP$Pt*<=$FdiKp>G3z+b-UF2Bz8yIC`Rl z42%OJ<%ymiZvCexny1##0bzhp@^i+ii*C3TLaPQ~>G}+SrJi4~bX2vA(UIR`PI*LM zc2H>2_HH(J8#}R=uHe97n@)esq(@g!CVyvs{DJ4Vh-Q4%@!;x@Q`z8%z^u*js91E# zm5-k@e2d^%ZNEo>!UFy>zY=#G$F^hf8^DxnjebSxMBh>@0W~ZRd#$wGNWcD!_AQXkxBG})bXnJv-oQ~j@`H5pnSWsG27oPMdhcJb6(rAT(ZJh~ zy$8`24;De=o#qBV7ipJA{n7b?5-RvTs`N1$7oV=dvucOkU@04Z43`+}tL7b%%hk+O zQo*~zg2}OI+-3e>WF0UTrUZXVYE8 zu>38|O$sZc2>Tm+fHBvksB2kd8S4p8u%j6xrY)NX!#P3&z zwiQOzlwH^ymFeDG7JJAmY!3a45b#@3f_va8WkpT4Npp?j$|YTGKX-bp{=8Hr0l9oP zZ3WEC*RK}=z%9kA%jV-!$t@#<-JZM~zrj2j9V&tRg#LcANl**jyY?mOVFGDN19``JtHT2ITZ4x(%Rg827GNF6t=l3?Zk#fK zQ$@tAf9cCL=D_N5$`!YlgrWZPwc@flc}sfw0hxB!rox>Oot#cyXo$sAF+m$FIFfeB z60^|TnSgmig>2blUsP%W!W!a*C3Q|4mn+zPlPZyenGt}0_}$h$@B)M|CPGx9XaBO4 zUGlPNp$9qww!DA&Mj9JBlfg#&>A3XAl+I-+*nsY}5GZyD>3F75aji-8#_=;F1K$YK zHTis8#A?%C&E&UsN1~FlC%zh2jEP^#FZ9oq+RExDC$Z)aEP@#+79@z9#qW<{QdfP{ ztTb2>IPW;O1N=zH73Y%RXzOb>4r+>pTlPJc-L>{yqyqg2r%Z)|q_QZPyIJP>vu1hQ z8r2b@*_k7lG+y|?zV5dut*hA{X-)%9;)`0g$b)e?uYv8a$Y}8Jp5hO9+~0)Av7@6{ zXP*$u4}N7KA~I&%Dwvz*v3Yq`D0ieu%rG#;@p3fEc}h<<&Yc@boA}}V=dkd4%P-n! z%c}1YMFy46M(!(~W5c{kR0>NXhF3{%ctq!Em5CjAl7}5Kc0p=`K;rW(5+U zpNN$bY*7Odq=)Zr78n<8|NT~0b>ZV(BH51Fx~qJ3oFvWMa1*-Kw4Yu8i}}NHDV(=h zYU|l>Z2joAvy-aB8DxmFt+!u}^zQM9nn*XD41kRf4Ph>HUFUAB6}IDUFG?zDd*B@8 zW|b>0lnRet=OnHcW---n?kOFAxooAmoen2rjknM{}qs z-cY^HEsKjwC|X^DkX@k#hu0B8^tcT#3&|{L1%IENpMAzK5hoC zs;64;Q|DIIU2yf0S(}}|e7#|kb$E!eP+9v048;;J?o+o{w=N7b*H$g4s+0I%DRl{wKJ3c~?b$u%3z7Xz|} z;)iuf4g06!cWKzH8KNq_Fg#;W4Oy(I9IK=66t zg?kq#uM#nqhVvg{Zi(C}O!oD#UHIoH%eW3g*04GKJ%aWanMT(a8)fbxM~DmV`Ln+e zJQ^T)Wm~_6)aOj&wLZ^Pn>rq)PvdW#vR9pI!DxlDVl#{8Mit%h5JnrBJX<9_iM>fg z!KeI&^5Fe_cE~>M`vp=sEc$HPF`#pOsnYZFy2-3U4d#RQtN3%g9Q+%=%h-}JUs;!_ z2v}WoJY3V#*3uYa_^Wn^i0l$$WRtiTd?;8=7=(JT-GfE<+MC~28S88*T>`@QRm`bBe zdp_@v$SNT??U`LS2h@PKPnZ(WkF$4pM zAs#np-ilHG@>~fR3k=D~(BCq5mYrgv{C97j%T(ko94zVBQTtukecIudje(gbh#DqZ}!VXaw^$bvH#Lg4p6 za4ydHZ{Y>G)1eC&bEdcyimr8gaI^q1AqQN&;8;$CHuas;Lz9*G)?2Trk-nOnt=xv; zF{QaIAK!Wr*^R_SRjsuT-;FG1M6Pi?%Z|=+bj{|qUb9(j#MSQiTXfK_k6B#*XH8u^ zD}A|+ph7k}JF#J@UK@7MfH5OS4#V4y0UnsoPvoZJ48&7CVkp0YT zXpa$>cFqe0$MJLXE6h?uPG&`JRSlaVHkY!(?H|}>ezpjH5$S7|xCY)K677ytxeO0~ zx9pE0TV^IRHrdfLFWkOHddUxNO}e|3*nF%HEZ$~yk*lcgq48{Y;8}TDuCn^@6{!)5 zOKRArkxcQ4l)AFPbD6f>nb=9=&@a7uUWu7Mqe@OFSlg;xK@BcSV&ka#)XEdw-)Bw< zdd_A?&z2Mpy_hj8pZ_5kHyBr}yX=Y4ljc+?;PLw--~r+$5GS^nIkdCi401)~YQpwb zKRJ896^Ic<<-e%w02ePnMSoEXFBF4BKuPxJXP^69QqXLwx~fI}EXelq$kj&Hf(mTa zGg=x<$XZ6zvY1@VQM!)LQ$A!o7?U7&p zS;QfYKHz?KrKYSAkWQVWdyvl=y(W|JFhR{4zbToA7+ZX@6%G7H^>m#l9D~Whv!-X( zn}D$UTFWksm}qC<#OxVb=}^HvA!YlY6K0ehdv5@{A8F}pHCmf?56?lq+*GnwQBNC!kS$lQQ0~0B9}?T9DN;R8qE`0kuvcaFgHnRa z&!~M142M8iXQ6zE?Hw2KvI{Ekop6oLMERh^QO!R3W9TiTb8^kV36&>Gon@8Yh!qLx z-00ee)`F7*B3T*=hYh%ih_AV>^y{Y_dljoH(}Zy^i&J9$xRy_xBeZ?&o!1 z_jNtSb#ZB`=?>f1Lxx=Vi{s+PW3}Rdbf-`Z?j|sxQq2QJMuMd3#?_y@a}*6!Wr!$p zbiI$$Fhc|5`XxxU6SO@%*nX8aVWylcAl>x~%)Iy&cMockkEFjEp2i+1sPBpWhm65k zfF@*yB-SAH)z@*d1va9+^*4;I(ywY%noH`|3d;{8MigdKa~G9tIU&%%4z<*#r`;qJ z`I#x>sOu(XgA{uQvZMMWgKUXu)%pQEc3D1y2WaW!c8I%9>t8@7S;z9EisI|9ptt{_c^l8LTcvm3qE0m9 zWItKHeCIg>w2co4t9=BI8}@`YQeSoVSj}w%S}fhhmFnl`L5?G=h7|N7v%kzk`3!x$?Kk9i4%>Cx4Q$4ARjD%iM6qF>w!kytVgx}?QP=I$rDC= z+vau|bdoPMnNmoSu+Nk9Sbg2(C}(KrvRvRlZ}Y^zLM4W2ofXz2vfk4&3)nqH4HGP^ z05qBHJfjds?S`gH=J3m}Vru*!jPf6H?P?KD1R>#IcpJtO^)8;=KUKn_QqBH584DwJ zBYq-~1;g-%YURn^av_0K?sn)z^< zRZwZpCa^A@QqL;=%sis~N=L_8NcaLbMBC|*--rFeMSs*OganZx_c$Y5)QQNjX~8=b z%eEN$$XP@N#Inu#N6nDy>BMuT@%P4=2e~X=M98@4xPa&dnIJDjI^q#=a$NwqScS;3D`TF0Eynk4L3QN)KblZ!)Pk zzJE_aEB7!3z*>xp5N0!oIlvmBcGSO0tgzWBQ$B@BHSw!i-3r6e$H3zr;zpa>UuHEubsh0I~wJ{)%V_j-_4 zx!T)L_y%Ms-q|MWtTi$fq^_s-x462WyMpr$Ds?*0&P>9ohg2%FBZQ7P@R2CmGHYw_ zGXLby8kx}@jB6s_v&|awz?2U0czwGp08NtfL%BDobBF&ljs>7eNIP#@;ylu2G2Y__ zU83A)YH1_BQ=^epY?<*1e61kKPvv}d3m@Q^;pHLO31=!x>LVN3CKlC#A`&y?I>>+s zk12=wRcQh1!PxU$1ZPiDA$p)XIm)c{lIvf9=YqNv#qz=WYI1r z3(lYYUI8FK){*BT+R~%w(OqUg9Z&Rq17~ ztsMGjP{;6)*wY4nO%nkh>l1iVfjk3x+DV$Z^8zfRU_VS-eb-&o*X0}l`Yzj(CpE0Y$Mese|LEYVETZK zmjg<0s$r zus7J!@Wu4ptAy@rK1uiUt2hVRdD&i}@iULp`AB&Y+htGdmOBF$G4u6< zyp#^x0<0BzaKf2(7s)tmX}LiKQqC8@Gu8ENC9B-?5A&D?-7?}*dli!{vg)dvgdVBF zGF-V9r=*l7Lz3y>+EyDPdY=1L?C*p-*`I8^^2KCD+ww<-~$eek}3GB5SLMk>*AHkDeoJ(jjrNV08 zsQT}NR8>ihL*n&08s`vccZTJ9vHPWRh;t>v>i(mnJ`Hj#RnP2GJGP1LQ!jZyE~_#_ z@(z2AF85xYrM&`6wU5~B4hQ7Y38;GXsCSYHAJ$QvOCG3nB|}M=rI$!bI^X~dk2k8K zoO+f~q_@rjhqBl|m)tC{>%qT}f@)z_mA4^zf-e%s?wBR z{XbB-o_K;cbX~=CR!6kvyMhi0bN^b6qoei1G~y=gTKO-DZQ*E3KH|B=IuOU|=t+f> z{1q_$IMZ=q|IMm^0|`yhF7_UV6ypVlRz{0%x2SW6X1xdKuyE1S^#{U*>4!&%rR!iy zdi`UsG6g0N_E6R{^mqsjTLu<3 zos^ZSg;(2q?ZnN1Bq%u*6S+&5RaX^g*z^``;~`5UzRLTJniryVBPtMKt^xxQBy-<7 zkK<6;`AA}u0686NDPTc1XxWqJKrE#-enb^HSKq81-Hitv3}+6&wy-1seJiS5=2LFwGva`vTX>6tlmK1 z*ETV5KZ%EE^b~Bbo>WtbA=p_;69~9Q(SjL#tKz#;199{V;dw5orXnq7VMIjyq7A4K z7$Dchw81RM38}4dEV(!wiuJ@L;F!kcK%QP#ZM1B7N~b(^yQY{%e(k4h0LIK8TUoiL#xcZ_cj&o7h(N8sKso_lN|1Os-uzmL@P@pIyo zMLA|Yw3!==0no(0JiAy;Ul}XAS)pLUQ<<|tup~YF_GXrmuCgjhu-GCG;SSLowY@+? z8t_%Ct5PPCSX)>klZx9@Stl>wm;|-_#r`!C>&veEKXiLK@WqL7XSlSYVx9X)H+RKX zQ}Y!9j#Xd-f&?ieU+{je=O9PXuezA`O_HMMIlFuzZJp^+GzP5Vl$vtt!zbxD(-^3U`JDg8&?sUUnHuM8+v$|lC!P6H9Aq#XU4 zRXTdg4_OO5lqnmmhmB^2eh`-8V|8$mPuP($r?FOWeg~GZ{}nlIU1v~@z{HnaN<%Ff zfb#P!^uxwUwC>th4^$aWQOLHq39owrnCP5)t2rA$HhkxY(5fg6R^>-k)f8u1{6|m< zV9D`gxf`2@f@OpM@G7d8G?9~*yR;Ra6m}u(xbR%=b{?_zyfSG8iA#CdvtyfW(}s`X#U6VBxw9{9;Yfwbg6 zLxr{8Ig{S>y63PAMMTGK0-WVr%hbL(RV18q8CFxO{ffyqwUCG|@dP+@opvbxn-(*d zkIF0uW7MAf`@Gz#hfB0k$H0;!bQx6bU8RADo_|NR{O5@g#oy2Ra^6$~%gW~{c|Luc z&AKk!Q*n7{#+OB?z=^J!8#9FBr)noXD{I=)nUwm}!&bmae^eIoz(VuN`c*0mN%Smn z_#d*77bk`d{>AZU@{-rx!8YI07@*TNRWf<2y z<>_LHWj>fspUaeIBxHSg)if^<_4>z}K-5ML7Gp05iz2zo7*p8J0kD?%lL*mMirtS^ z=FaI<9f+reV&U9k_WbJE>F);PNOx3sqX=FnP@Sd~}R zl~@rSq_Q&l?LpA|OS(gFwMF=f{?UKRnH)NQx&l}*uPW7^eqB`|49$EW&muJ29?tm- zBLylPQFx(l&K64_5U}@FL@qh^t!{aKnJk#Bpj#FkK_>KR?aVlogK4}Mt(f%wdya@Y zDO>D&Lwtcyj=?XQmTXn!?aSeIq$@+WqD0fyq)k70W}h&t(olV||8t1tiIq4T)bZyO zSHhV0I4~iFLf2OJrfe@m663*1HKo`hg%t@2Nd$WPHs^kFp( zGnc)<((HFXs|MM(hkm?F^tZ-ceNr6=ivl=4{L^CJ1Xs!8>Oq<2uC zo=GKc|MxZbNDkt-umV0}ru=q^s`tzRTLJ6mMR${8(Q@zE(^6Xa{A4*fEUT%vB=6%v)>N2RyVX22XSnE)=H^KKn9f^M+1PmF~!re z1u`wTJf&-ri*k;gj7c80ljd%Gska5I5h;(`&-dgx*cEAy7P0wFl-Ul%jOvWQ(|(Ns-f5{_Ao&(DlReC%5CUQ}9FV0-1jEYJ8_ET8%>Yg-MQrY2VAk|KVQC49Gi zrOqPOQhW~@`grO)OJ94JC<{rZ$l2GCI=}e^rFD;m`=mtzI6$k~pNm`H{y&YA2+?hC zesArsj=`B6-=w`-+k$?@?&-Ljdo-eL5D7ls+Umba_^=7#z|`uyDA)1trnbXzO1V{g z40a|XyK&VSQ{2>&_349c?Xf&?^^tQSdZ(%LKsR6bZKi}YH;J!%JvyUQR%yJxrG3(W zir{YZ@{0NsHx!wiIF`69_(2=ttVxe8zMZC0C_`Qp(!~nKzfKrTo z2gT7!vx2Ab_aEu)YU?n@y&lzl;<>NX_5G8XiBCV(gdIh`yO)k>B_w&oUXNc!O*EFE z6d&)2mDliUfwYZGx1^=Ev9pk@5&8-1a10rGD7tKfpbHQd-VMpCQ*pNwk%^bJffy@g!&VR`1y>RAAXK|a)%5c}oDSAU) zt4T&}^SyQE)%i-)x=#07^5&@$=<5*2sB>M}%c{Q1@Ad1B9qrvFPa*6jz64g^?Wugv zkSM8=#C;$^E-UpWYr((K;GRomtZvg4j~dPAe7w4@0%uueXTN^XXVXc7+Y4!i!_Swv zxut-$Cl7DGn9C`fno3C&jF0Ezp0lgxVk+ai#G`_{VZYqVJ5}*)O(|8%SY&A`*58Y_ znqKTcoT?QqcP^z`XlC#du$6I^#c9pp;Y;Xc;ERo$Ck(N(;!9p=Q6I2me0!*P2rL$t z1}eZIdS7ho2Hbt2WPS)pQGB%AQpq+5kSHvPmEQCrp)ZzVn+ihvNGU8Th;#-Ubcd>W zs3)5Xunbims>K-|WK%rQF};n@oL}W%+Rfsao9pohNz1*aWhSFA>)F1`!iRVzsM>~M z=_Jz3bjpMtgP}=FXNi8NiCx}I;=i(CD!a)?{QcYR*MN~64JKM}HfY;2^UY>SHG9S| zgXkon?ly%t^hkV6WY#&5}l$-sEep$&m#p7L0JX%B3_OP4njNL?7lin79S8Q73RBF zcG-!MFje~)GMRyvV2lZxhy1~8Dj+Xvm9x@?jD*dbKd~O)U-Xg{^8Cf~g@uoW=O5@Q z0?*56eg`Z95`wKKuQ}J$QWh6hRlTN0J0}%-iVWVKoPL0gK?^=D3l~~^ho-j9en+vw z_2Q#?-1~VK^*AwGo$5|7IKcpI?4js38t5E8b$@c2d0sZFcQ&bfas&uyffS5)eUDy0 zbng1OZ+d{u6*O@AF0{}&$*?GaR7Zi;;?JZ8R`Q6xT}2-{Zkg7h}B!6l$G~G zwd>b3o{Ieh-*U!y8YquPOL6^lB@^zMuc6mMm_F6>tRNBrTZ`o#tNK5wYDDvJc7|E&az~1-726IlbC0A)IbZ*wAxxca0$Zwy*x_c)hR>v&9T#ew1 zoaEYjvt9~0LT1KJdKQJ%wm?}rWTA6@ybMBfkrk5W{w|=}gqPu-O0`Yhh6ZDj(HR82H@%5OgBO!O?LD>|%QC_ANFi zCZ<{%wd$Bs!ZldoIl3oj)^JI`s23mBsb^u>!F!yiuI)i3RP$tT(@xB4NjJMdVu@{m z39;XI7~k+8@$vv~!@5K89ytd`P{b|QE2>^b$A&##4{}W_UI;^_gy{h(kDguYKSmy4 zQe~;M6B&Gom53ro$~#=1=#Q0z_Cdx z=5Z~<&($W`CV7ctN5M2DM!OCtO~b*iIaSM8o&>iBBtR4oJR&3)5|`z@-;AH|bGiLI zL|E5V-sD+R;^x#{FNsH`B@KMuBeSg`KBajuo8A(-ig|$VUZ03maGl);)&m~Bi*&jO zZK|d@O=_|Q7T^xXMgI9^;o9cbar>^b2zFPkgn0K~xUEB*No=~sxh618>~ek{;k$|G zG_9%)_agzZzy_)l|2q*8YT^mvP!8j^Xhv)vbEKsRb9R~z*Yf9Y@$vIAtj=%S!9*7E z^9u6LTchMUMO~CWQ{yEHyw&&V4{sw3Tn6VRfTiG%NmuoB7D3sba)#gnmd?2NM7wcUKANa-waxsMF z<8g^Dg`HDSy?VxDj}N`8jH@ASSFhKHiBxt=-MbZicY2cYR!)F6vmek!OvqalP|7KD zdrkHRTl}4`lv%t{V^3`2*`?0wQhE4dgW~uTWL_aWXf1r~u zS$k@iwpX@F!ykE78B zFgeY|>d{P*VSMJlpBEw01wN-E-=8<>sOIGym2);GO!jPxdXBd$W|)b)O2o{SdQGo) z22{XO?-&AxhsX}A`b=7%wHus&I8ZL14ZHde>i%Go&JLQ5LJerT=~`F#tL5S?bg^ ztxP2=8fk8QTs6{kg!oqEAzSw?5)Fi)pJInOi+wrj^E06H7pIG4a>};VmBrgP+Ok>e zSH^9m2)5VC62{6nCVR0Z`jTz(plU2ob<(3{eU%0r^|G|NPsyHJ=|!8lgVT>>{g)bg zj*Mm!*v{f6uPWz1u1+jO(u{x5{4gLo3wpHR&678Nufb~p5F<{UMyzdesQ|Z{|NCNT>Uq40l!!!Hf>+@Tf|$y(xtc1yl{v6&K_rL^3-);#&)wgp3Q4H1_c z&ekqzo?6B-@|R{(LAVgug2zTL)$TzPdaWpA)&gXqTrH+#VgYiIWzih>yjyuxncBqv zzI+p5@Ui$;n#8+H9izOi&^4sl6Jr}tdIm_Nf;pO*pp(4S3uU<@4h z1Ac*o)Ad9LDV$#l`|S&d%qxIg-k29i#c)&U#q*Ewp}w}VqhdYRBervQyFgDn4j(wW zw~3$^wBuyZTEL!D#_+4iaF@_F6>8Pdk!y(BlA-KZC`SO}+gIoM5&=SPDa0_S(EHZn zNBd=61W$Vzmc~xU@$#$ck*{H%_To+h@gqGZBsfPHS{Sz0sY6XDN65oOlzCWe6(Qrl zCVBF%Yy&m-ZfLFI8r8Go#G1R%?TF%1*&{Sb-LW+~n<~E*4qrGf^*t=w&bnpKDM&M_ z+xbi&zd=5#)pD+`hv76Mcg%f_*(fPR+d&=2ka`MX}Dm{7IybeDy#cJ zW8=&{dyL?WFfAjJI{bcJcTx zrtUdtFpNvMZ(H_#QN2M3?S!%1o#``9xb)TZF)}y8!E^ARu2i06n_ke;=C67KlYdc4 z--_k+ld6VTxlZL%q5R63%ZQUI$e-!Lq3lXC=@M>qfgid+BP0%ku*_2px_6evNiXw8 z>0oqXW`A3-eUQp$nkIj4y38_@&~?%tyue(oPIm5x_&hdlp<;tJdBe$?ZUC&c_sKRs zM$bLt3-3-bhF~k5qNT$GveNIQy5w5)fn0ar8K&oe2W=bh3b;(5_Dm3H>h|KVOrh^JV^4HB{~>{4iTo6GfOH(!pyVfGk;ldH*(SDU4Rz+$ zby7cxBwUXtGO>z-u0ectS z4rEQx?F21{Ls9dm*vh7VPtoaQAJw>N`Hr_>De=n}J zMMHRhA!&2JOT@iKQ)dK7wH}^vo?v<#`mko5TMsSc{j>}-&ms3;E27hKSS+4;*+_ua z3LN%qb*Cr*iote9(=R7zzQ=S+_*tb+AJ?K)Vw{)3o&ed}43NhU+vKHFX)OJhgIGxmUN4u=<{HT%;D`L!9JS&$o4FBtfsW30{8 zhL^#uvFYk!`|&_3YZdJ$eec~4GbRN2vlXlP4R&`GuwgK$hr9Q`*NNJ{|0RP&CLE6- zZs6@yOW@!>?G+Np0$&EL{P{iv!WU4;{v@fljym<#QIPYJ1@OR_ z16$}i24I^r9&Y%WNvM)?g8q2;SZ7mb`=rK6Vp{9^!>0x{2eXwBW2?W4HB9E1Lj#U1 zKURpN-x)IGvrFfp;c*>e$NMWUux(iNv0jiz9VB7=*G?9;*IL3j+k<*G`i2NmRGL&- z#U4+CBdTfcpe0$W2VyS=9%;wNE-FGjIUEgk@9-rB)O!}I)k^=PfdQ?#`5It25G{dc z!KMrrPC{^IfyK^rkqMkIS+>;JZ8ny0$KbiQWWp*sCM zTpykty}HhSf~6k)(TEYuYPb##!`)DDd)GsOCMnOE%3-){4Tgskr}I}<*Jotlv50~p zNNTn<1E=|qPY3;c7tPL%(kVl|Z>w$9s}2$~4B=j{R|8wXLlTbkTL^Dr?L^%s{ZPI5asf z+_W39P`p^)MKA8k-MFSvN-g&~j^Htc=4nIx!N8$l{7TQ8%MYg|v`YgVnG_ask=lt| zp&W`Y-KL{<>t8V+@>?EOsgJH$PlZ;AZJi6DT{xPJ&O404xlq1(;=>{cr}43I6DP3) zN1XI&xtkk&`#K9gxT}6-+)ck*>b=CV5Ma*{O3F6=0_mS#>pkF{!9P%ADZ?A?JvCsx zA-8#|awd=Je^ShD*uu=Qr#X*V5bfW%FHk&H{5MT7y|O~)EKXfT$KdzCJ(1h1oBxw3 ztS}JyI(q%e5hg`o+&BR0=2lE!?=eSUBvK+-6#9eskNaY~Yd9xho^TuCCw$vYsH1%3IHM*rCvkQWllH`Wx7t^hDAd0ojtg=f}UH&{nOh(>i`!6m~8EP5Z8uPZj+Hwlxv{%?^nD`NUSRjEdxPcRkyk+ zx{j%};{yP~rdyiCuOfW)pOIGYGp0Hu#-qBk+#?@d8DG*gw>5ppS<(jHj3ApUj;w&@ zH+hcA8TMy#@IxwT=GFDXJwjt)_Hs2dp6l~DK&EP?GJ}8X(tLK@A-dlayMKp%=X1;! zVfa{j$q?d5i{SVsS|XYgo_r?s13nrhK`SW&5Z8e@@#>|P(&7yST>q54VqbyWdoZ1;OotsXm4MD68B*S}AxmrARqFWnXb zI`BekAwz&QPm`d}{1eX<^Y?n>%{xttiO`}SyrJzr>aGo(KAJ@K#7%R-G{Jd;t`t@r zM(6VsQO=No93mcDN%gyMlE4Ao0|$*6Qi_XZx1W@vxa}q+y~lbe^f+MQde$uXM)MzJ z%_;J*EJV`I#YN6t)Pz2EgXPcRfJWru$n8kTLT+W&t z^j6~Rt(tzs^NQf}-veBFpwfoDo^t2j>4IViy;ft40jX9KjR;*h;DBXkDYA=$8>pIt z&{pq-tg>NKeBMa=nh5(rQbc0YL7th_AC)Xg0k><1V6!D7@LF^D&$qm7Q(|N&j(jAf zNoWM*&<8T#qQUUL>Y3<2CZN0qClOX(c@L{$Qb##IdKq%ud??@-H6(7m=YBWgdt^$nDmQE=&P7AYY z=sAtV5mVu|X+n>}svzD6j=g0X1{ti}wTs_Pe3mu>X5F5zr8#HtX|DTit@t{`SB003 zNOxFPfAss$Ja5O2RZEfXodZL`bbq!V5-_; zE1Ij7mVAt>m92LkJrpAKiPhDC?Q2Ih{Y!;2ad}r|aCZPUjwHb&U)z=Vi;~ELvS%wB z4xRt$#sS8ZrUZt?@v7zCFOAm$!KQ(?F{$*`SOSF=o2nsL3$Bj+)><{`u^*L>ys8Hn z1^D)8T5I`t94THD%-mlI%irOkV?Q9E$!MKN~Q0dANwLa8-#_@gb zR#Ke>Ri8szw_l;_s|A_9%~V3 z`uVxYMrds3`>sF#$)^B2bUy6q{n3cl;27B-Q=w=y0`8mEl0~{3oETQc21zR2L-u=f zT)4PQO}x^>R&2HS#A0MHsG@nGga?}u-u2i|MM*SBULB}j9cWMbO!gWIrCHHA_wky! z0QlpC>H8V!o@QL6aFwA7s01F0-(%OZ&c8<03Nt4prUkq%Y51ja@O6<0S z;|e0-H!f*_%bobp5&x>4gFg5yp{BuNw}aak%%c;TWO%uk7!_~4!eVb5`eIt83_pT( zM!myDK?}PtZY#IIdmi5{JA37Cv~xE(<>lq}m9I$(MqAYB=0rJvS|ZZOlZS_+MIji-V`vZ zm@-vn*OP7_2C4xYz|D83+(ynEL3yK`w6-x-UF6O?{R=2i`{)P#XJi*CB%a{usOFnt zebs;qzu0tq92yPz*>G2S6QoL`f|CZ07|q<&^vw@w<<8iBmPYbZy)M2V`-w;I8n+^9 zz|S6>ZP7akzg&k$YHX#s_+0L1N)ObDt>{Wpjf3r2Hm7gwto6jVwen$YWGG)m{fyuV z)H$7$<~T{0v&37h0#sle1QkWw-G=^9cs_|^zMJYSw_u@Rp>Y{xbQ08oaiPVmcnS~3 zSc4%8ne*UYu9|RLKgwHw8y)Bm`>dp#IhE3YS~!eEMZ~1wJWlzhR7j1)bO-}Kh`wrm z@*!a!$T{yvo%iGE=&6ctR)N7n{x*4WcfLs=*_7}@S=0U!u92VASUxemF*3ArqZ7_9e&5Yj zHc(N)^IaxR3pH>oc4v+A=gM16{q=1#PG3gfS81EoKQ_F%xm$g;^jZue7D^7&PxP|? zyKO?$m`9AGEw9RVO+Ax3{AhaH_gI@)(qqZ{naTb<1>D_)CRSqK zo#sytG||GbO%8yV9V0fI&A|J^NRRR9&CX%)^;rbQjysR(DIlc2>4BSZq5!!0k5RnQ z^-5c!I=Ux}r?=2Rmvo$fyW!(5Ku>vhD!mF>@L!Oxgp~qiKQhPJq`T`-X-T|yty-g54xzC}LnHr{BoA)i%aD;JM;rsGWB2#+WAr59=Q04R+JJI7QG0{fXqd#|iu|?P?ROwgWq2 z6{c!=hhPeTAn`ow?-H2q4?SA+6Brk0)P-WlwK!shBiqd_2ie?;BUsSC=-S z(;8Wm&YyiZ3I)8OTc4J8+B9Ux))CSQhOYmG zBQHYNtBb-&mhWSHkY)e=L+t}FNifg?dO{>Zs!e@=+Q|H&% z8Lc9G_gMU#;v3T6T(Q5u7`_H(-$&k(Db>~AwUJ0sYkTz@-u_``VrfMkh6qLH&$vB|E3`_ zu3^9&JmQczyWw1P9sL=Q`V?O_0qBJ8$7z+8Z{NR&Zhz{iz85`YZ~EDR{^2$tw>HUo z_GYP`G+oWDkGJc7$8(p!({W3Cgfw(udmEBeQA0U3Eeq;B=L+WSp@Hf(J-5nn+Fsr@BAz1>+hxh0L#c z(h&Rv?4)->o;q|zfjg*(PkZNW{>q^>=T^7X7aEwI>pChn!a2-7U9T_HvP1)uS1OIpg9`qA}|YW&{5EZqRq2pHB7JI1OR)C9I1GUMbXN{&HL}^(}CV_SC{}fZAo2z7gYg*65;wveLTMqt4zkzaYD&BH9l!|*KRM03I?ei;Dm}5ZK(8*KCviDm z(57a?$`HL~4)pj>N%~hYxsn)bIwrQV6N8qR) z?K3@MoO&Qb0l*DX$ws>+e{Zxq^*ETpZ}d7Ksn;uBY9*9TVT8A4g~07Ds|| znEMmONOtQMR;v7)mmfs)tP~Q@?TDd*y`g3CCim(f5`moCzu)Uecmb-jenuvNCwwY; zar%nQAQIa>Q4abCnHL*Y+$uoja)CBODYz zt+mc#Jbzu(X?k&b;fk9&fJd12Ukz5jq!$B$@ z*my5J&o*lakIw_UG1{7eIRFbQ?@23fi)aFu6~jjU87zkTNP*GFKI~P5tRKt z-RNa*<(o5ue$j5TD(U0eK{|4m$U@d7r1DkVR^+uOs7wbBAkjjbMfRV(z<;WAh-sv7 zzc7j92bdP{>9uCxd!(0PZ{?KHshQpYc>W&f9UjtRdJH{35)xcZE%*wCS9&7AB{dOn zw5A33bPp5S(v|za34)N9pR2!fwiW>H{VTA@+eLZGOxJBFPUp@)woFy@_&YHaK}Y
    ml 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


    xIK@_&-=gK5@g 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 Df~`jN literal 0 HcmV?d00001 diff --git a/18-week-14/01-day-3-to-5--validate-bst/example-2.png b/18-week-14/01-day-3-to-5--validate-bst/example-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2e00b656478a5934c5f203c10f22c43cae3d2e GIT binary patch literal 59735 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 Bo9qAp literal 0 HcmV?d00001 diff --git a/18-week-14/01-day-3-to-5--validate-bst/javascript/package.json b/18-week-14/01-day-3-to-5--validate-bst/javascript/package.json new file mode 100644 index 00000000..db49f3ff --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/javascript/package.json @@ -0,0 +1,19 @@ +{ + "name": "valid_bts", + "version": "1.0.0", + "description": "validBTS", + "main": "validBTS.js", + "dependencies": { + "jest": "^26.6.3" + }, + "devDependencies": {}, + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "none" + }, + "author": "flatiron", + "license": "ISC" +} diff --git a/18-week-14/01-day-3-to-5--validate-bst/javascript/tests/validBTS.test.js b/18-week-14/01-day-3-to-5--validate-bst/javascript/tests/validBTS.test.js new file mode 100644 index 00000000..5c4d746d --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/javascript/tests/validBTS.test.js @@ -0,0 +1,11 @@ +const { Node , isValidBST } = require('../validBTS'); + +describe('example test cases', () => { + // Convenience helper to construct a tree. + const T = (v, l, r) => new Node(v, l, r); + + it('should validate the examples', () => { + expect(isValidBST(T(2, T(1), T(3)))).toEqual(true); + expect(isValidBST(T(5, T(1), T(4, T(3), T(6))))).toEqual(false); + }); +}); \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/javascript/validBTS.js b/18-week-14/01-day-3-to-5--validate-bst/javascript/validBTS.js new file mode 100644 index 00000000..32ca0681 --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/javascript/validBTS.js @@ -0,0 +1,29 @@ +class Node { + constructor(val, left = null, right = null){ + this.val = val; + this.left = left; + this.right = right; + } +} + +function isValidBST(root) { + // type your code here +} + +if (require.main === module) { + +// add your own tests in here +const T = (v, l, r) => new Node(v, l, r) + +console.log("Expecting: true"); +console.log("=>", isValidBST(T(2, T(1), T(3)))); + +} + +module.exports = { + isValidBST, + Node +} + +// Please add your pseudocode to this file +// And a written explanation of your solution \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/ruby/.rspec b/18-week-14/01-day-3-to-5--validate-bst/ruby/.rspec new file mode 100644 index 00000000..82b8369c --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/ruby/.rspec @@ -0,0 +1 @@ +--require spec_helper \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/ruby/Gemfile b/18-week-14/01-day-3-to-5--validate-bst/ruby/Gemfile new file mode 100644 index 00000000..5ab5cb4e --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/ruby/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem 'rspec' \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/ruby/spec/spec_helper.rb b/18-week-14/01-day-3-to-5--validate-bst/ruby/spec/spec_helper.rb new file mode 100644 index 00000000..251aa510 --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/ruby/spec/spec_helper.rb @@ -0,0 +1,100 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/18-week-14/01-day-3-to-5--validate-bst/ruby/spec/valdiBTS_spec.rb b/18-week-14/01-day-3-to-5--validate-bst/ruby/spec/valdiBTS_spec.rb new file mode 100644 index 00000000..6b794c43 --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/ruby/spec/valdiBTS_spec.rb @@ -0,0 +1,21 @@ +require './validBTS' + +RSpec.describe '#validBTS' do + + it "should validate the example-1" do + def T(v,l,r) + return Node.new(v, l, r) + end + + expect(is_valid_bst(T(2, T(1, nil, nil), T(3, nil, nil)))).to eql(true) + end + + it "should validate the example-2" do + def T(v,l,r) + return Node.new(v, l, r) + end + + expect(is_valid_bst(T(5, T(1, nil, nil), T(4, T(3, nil, nil), T(6, nil, nil))))).to eql(false) + end + +end \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/ruby/validBTS.rb b/18-week-14/01-day-3-to-5--validate-bst/ruby/validBTS.rb new file mode 100644 index 00000000..ef98ae5c --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/ruby/validBTS.rb @@ -0,0 +1,26 @@ +class Node + attr_accessor :val, :left, :right + def initialize(val = 0, left = nil, right = nil) + @val = val + @left = left + @right = right + end +end + +def is_valid_bst(root) + # type your code here +end + +if __FILE__ == $PROGRAM_NAME + + puts "Expecting: true" + def T(v,l,r) + return Node.new(v, l, r) + end + puts "=>", is_valid_bst(T(2, T(1, nil, nil), T(3, nil, nil))) + +# Don't forget to add your own! +end + +# Please add your pseudocode to this file +# And a written explanation of your solution \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/solutions/validBTS.js b/18-week-14/01-day-3-to-5--validate-bst/solutions/validBTS.js new file mode 100644 index 00000000..cf14b14c --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/solutions/validBTS.js @@ -0,0 +1,37 @@ +class Node { + constructor(val, left = null, right = null){ + this.val = val; + this.left = left; + this.right = right; + } +} + +const isValid = (root, low, high) => { + if(!root) { + return true; + } + if(root.val <= low || root.val >= high) { + return false; + } + return (isValid(root.left, low, root.val) && isValid(root.right, root.val, high)); + +} + +function isValidBST(root) { + return isValid(root, -Infinity, Infinity); +} + +if (require.main === module) { + +// add your own tests in here +const T = (v, l, r) => new Node(v, l, r) + +console.log("Expecting: true"); +console.log("=>", isValidBST(T(2, T(1), T(3)))); + +} + +module.exports = { + isValidBST, + Node +} \ No newline at end of file diff --git a/18-week-14/01-day-3-to-5--validate-bst/solutions/validBTS.rb b/18-week-14/01-day-3-to-5--validate-bst/solutions/validBTS.rb new file mode 100644 index 00000000..dd541aa4 --- /dev/null +++ b/18-week-14/01-day-3-to-5--validate-bst/solutions/validBTS.rb @@ -0,0 +1,30 @@ +class Node + attr_accessor :val, :left, :right + def initialize(val = 0, left = nil, right = nil) + @val = val + @left = left + @right = right + end +end + +def isValid(root, low, high) + !root || + low < root.val && + root.val < high && + isValid(root.left, low, root.val) && + isValid(root.right, root.val, high) +end + +def is_valid_bst(root) + return isValid(root, -Float::INFINITY, Float::INFINITY) +end + +if __FILE__ == $PROGRAM_NAME + + puts "Expecting: true" + def T(v,l,r) + return Node.new(v, l, r) + end + puts "=>", is_valid_bst(T(2, T(1, nil, nil), T(3, nil, nil))) + +end diff --git a/19-week-15/00-week-15-algo-practices/README.md b/19-week-15/00-week-15-algo-practices/README.md new file mode 100644 index 00000000..e3cd26ad --- /dev/null +++ b/19-week-15/00-week-15-algo-practices/README.md @@ -0,0 +1,11 @@ +# Week-15-algo-practices + +More Practice: +- [Maximum Subarray](https://leetcode.com/problems/maximum-subarray/) + - First just solve it however possible. BONUS: Use DP to solve. Calculate Big-O. +- [House Robber](https://leetcode.com/problems/house-robber/) + - First just solve it however possible. BONUS: Use DP to solve. Calculate Big-O. +- [Is Subsequence](https://leetcode.com/problems/is-subsequence/) + - Solve however possible, then aim for O(n). Calculate Big-O. +- [Unique Paths](https://leetcode.com/problems/unique-paths-iii/) +- [Egg Dropping Problem](https://leetcode.com/problems/super-egg-drop/) diff --git a/20-pairing-exercises-5/00-code-comparison/README.md b/20-pairing-exercises-5/00-code-comparison/README.md new file mode 100644 index 00000000..47bbdb77 --- /dev/null +++ b/20-pairing-exercises-5/00-code-comparison/README.md @@ -0,0 +1,23 @@ +# Code Comparison + +## Introduction + +For this activity, you and your partner will each choose a problem that you have +both completed. Either in person or over video chat via screenshare: + +- Explain your solutions to each other +- Point out the differences in how you approached solving the problem +- Discuss at least one part of your partner's solution that you liked and have + learned from + - Did your partner do something you didn't even think of? + - Is there something about the way they code that jumps out to you? For + example, is their code extremely readable without comments? + - Is their solution more efficient, e.g. better time complexity or uses less + memory? +- Discuss at least one part of your partner's solution which you think can be + improved and why + - Is the solution difficult to understand without heavy commenting? + - Does it contain redundant/unused code? + - Should helper methods have been used? + - Could it easily be made more efficient? For example, were the best data + structures used to solve the problem? diff --git a/20-pairing-exercises-5/01-whiteboard-and-calculate-big-o/README.md b/20-pairing-exercises-5/01-whiteboard-and-calculate-big-o/README.md new file mode 100644 index 00000000..444011cd --- /dev/null +++ b/20-pairing-exercises-5/01-whiteboard-and-calculate-big-o/README.md @@ -0,0 +1,44 @@ +# Whiteboard and Calculate Big O + +## Introduction + +For this activity, you and your partner will each choose a problem and solve it in front of one another, and you will also calculate the time complexity for the solution. You may select a problem you have already solved or a problem you have not yet solved. You may complete this activity using an actual whiteboard, if available, or in the IDE of your choosing, such as VS Code or an online REPL. + +Keep in mind that these challenges tend to make people nervous, so remember to always be kind, patient, and encouraging. Also be aware that nerves can cause people to come up with some pretty weird solutions to problems, so remember to bring your empathy with you! + +Plan to spend 15 minutes in each role. This means you and/or your partner might not have enough time to finish the solution, and that's OK. If you can reasonably spend more time on this, you can, but do put a time limit on it. Be sure to calculate Big O for time complexity even if your solution isn't complete. If you can, try to reason about and discuss what Big O would be if you had completed it based on your pseudocode. + +## Instructions for Interviewer + +As the interviewer your job will be to first present the problem. Explain the challenge to your partner and provide some example test cases. You are not expected to provide every possible test case or edge case. Instead, provide just enough detail for the interviewee to understand the problem and ask clarifying questions. Example: "For this challenge, your function will accept a single string as input and return it in reverse. So if it were to receive 'cat', it would return 'tac'." + +You will also need to answer questions. Your partner might ask you to confirm their understanding of the problem or whether or not they should handle certain edge cases. If you don't know the answer to a question, it's OK to say "I don't know" or "I'll let you decide." Sometimes the interviewer doesn't have the answers. + +Notice when your partner gets stuck and needs a nudge in the right direction. Provide helpful tips or hints, but don't give away the answer. Ideally, your partner will ask questions when they get stuck, but if you notice that they're struggling with something for a little too long, don't be afraid to give a little nudge. You can also ask in advance if your partner would like a hint before providing advice. + +When time is up, provide a constructive review of your partner's performance. Some areas to talk about include: + +- Problem explanation: did your partner explain the problem back to you in their own words and confirm their understanding before coding? Did they ask clarifying questions when necessary? +- Testing: did your partner check their understanding against the given test case/s? Did they write their own? +- Pseudocoding: did your partner explain what they were going to do out loud before coding and with pseudocode? Did they check their pseudocode against the test cases? +- Solution: did your partner solve the problem? Was their syntax correct? Did they handle all of the test cases? Were variables and functions named appropriately? How readable was the code? +- Openness to feedback: Did they ask for feedback when necessary? Were they receptive to your feedback? + +Ultimately, it is more important for the interviewer to evaluate the interviewee's communication during this exercise, so if time is an issue, focus your review there rather than on the solution itself. When providing feedback, be specific, so your partner has an opportunity to improve. Also structure your feedback into two sections. For example, you might talk about what went well and then what can be improved, rather than mixing them together. + +## Instructions for Interviewee + +As the interviewee, your job will be to solve the problem posed by your partner. The Interviewer instructions above explain which areas you should focus on in order to ace your interview. The content in the Welcome section of this course will also help, so make sure you read it before attempting your first whiteboard challenge. + +Here are some general tips: + +- Communication is key: explain the problem and your approach to the solution +- Assume you haven't been given all of the information, such as all of the inputs you need to account for +- Ask for help when you need it and be receptive to feedback +- Don't be afraid to admit when you know there's a better way to do something, e.g. "I know I'm brute forcing this solution and there's a more efficient way, but I want to solve it first and then optimize once I know I can solve it." + +When time is up, provide a constructive review for your interviewer. Some areas to talk about include: + +- Did the interviewer communicate clearly? Could you understand the challenge and did they answer your questions in a manner that you could understand? +- Did they give you time to solve the problem or explore a possible solution before providing feedback? In other words, were they patient? +- Was their feedback helpful? diff --git a/README.md b/README.md new file mode 100644 index 00000000..1f71213e --- /dev/null +++ b/README.md @@ -0,0 +1,193 @@ +# Data Structures and Algorithms + +Welcome to our Data Structures and Algorithms course! You may or may not have +seen this course on Canvas as well during your time in the program. This repo +is set up to give you easy access to the material from this course upon graduation +so you can continue working and prepare for technical interviews. + +Fork and clone this repository to get started! + +## How to Progress Through This Course + +This course is split up so that you can devote 30 to 60 minutes each day to a +new algorithm problem. You are welcome to move through the material faster if +you have time to do so. Like learning anything, consistency is key, so make sure +you have a plan for approaching this material and stick to it! + +We recommend approaching these problems in order by yourself since each problem +increases in difficulty. For a problem that is meant to be solved on the same +day, work on it for 30 minutes. If you can’t solve it in 30 minutes, work on +something else, and then come back to it and give yourself up to 30 more +minutes. For problems that are meant to be solved over the course of several +days, set aside 30 to 60 minutes each day to work on them. If you reach the time +limit and have not solved the problem, look at our solution or someone else's +and take time to understand why it works. + +For any type of problem, if you were able to pass most of the test cases but +just can’t quite solve a couple of the edge cases, consider looking for a +solution to compare yours to. If we provide a solution, you can compare it to +ours, but you can also ask other students and search the Internet. Take the time +to understand why the solutions work and consider working on your solution until +it works given what you’ve learned. + +## Some Things to Keep in Mind + +You may struggle with some or many of these problems. Be patient with yourself +and trust that with time and practice, you’ll improve. You’ll be amazed at how +much you progress with each week or month! + +If you look at other solutions, be aware that shorter doesn’t mean better. Aim +for a solution that makes sense to you, which you can also explain to others. +Three lines of easy-to-understand code is better than one line of confusing +code. + +If you use an online platform that provides information on how fast your code +runs or how well it utilizes memory, take that information with a giant grain of +salt. Many of those platforms do not tell you how they arrive at those results, +and you may find that the results vary greatly even when running the same code. +You might also find that someone with a similar solution to yours has wildly +different performance results - an indication that the platform isn’t +calculating results correctly. + +Lastly, try not to compare yourself to others at this point. Everyone progresses +at a different pace, and that’s OK. The key is to keep trying while taking care +of yourself mentally and physically. + +## Course Roadmap + +Use the checklist below to track your progress. In Markdown, you can check +an item off the list like so: + +```md +- [x] done with this +- [ ] still working +``` + +> VSCode Users: You can install the +> [Markdown Checkboxes](https://marketplace.visualstudio.com/items?itemName=bierner.markdown-checkbox) +> extension to enable checkboxes in Markdown previews + +Start with the Welcome section, then work your way through the other sections in +order. You should reach out to a classmate or other Flatiron alumni to work on +the pairing exercises together and give feedback. + +### Welcome + +- [ ] [Welcome to Technical Interview Preparation](./00-welcome/00-welcome-to-technical-interview-preparation) +- [ ] [Algorithmic Problem Solving](./00-welcome/01-algorithmic-problem-solving) +- [ ] [A Note on Testing](./00-welcome/02-a-note-on-testing) +- [ ] [Problem Solving Tips](./00-welcome/03-problem-solving-tips) + +### Week 1: Starter Algorithms + +- [ ] [Day 1: Reverse a String](./01-week-1--starter-algorithms/00-day-1--reverse-a-string) +- [ ] [Day 2: Find First Duplicate](./01-week-1--starter-algorithms/01-day-2--find-first-duplicate) +- [ ] [Day 3: Fibonacci Series](./01-week-1--starter-algorithms/02-day-3--fibonacci-series) +- [ ] [Day 4: Selection Sort](./01-week-1--starter-algorithms/03-day-4--selection-sort) +- [ ] [Day 5: Find Shortest String](./01-week-1--starter-algorithms/04-day-5--find-shortest-string) + +### Week 2: Recursion + +- [ ] [Introduction to Recursion](./02-week-2--recursion/00-introduction-to-recursion) +- [ ] [Day 1: Recursive Counting](./02-week-2--recursion/01-day-1--recursive-counting) +- [ ] [Day 2: Recursive Search](./02-week-2--recursion/02-day-2--recursive-search) +- [ ] [Day 3: Recursive Fibonacci Series](./02-week-2--recursion/03-day-3--recursive-fibonacci-series) +- [ ] [Day 4: Recursive Find Shortest String](./02-week-2--recursion/04-day-4--recursive-find-shortest-string) +- [ ] [Day 5: Recursive Selection Sort](./02-week-2--recursion/05-day-5--recursive-selection-sort) + +### Week 3: Additional Practice + +- [ ] [Bonus 1: Balancing Parentheses](./03-week-3--additional-practice/00-bonus-1--balancing-parenetheses) +- [ ] [Bonus 2: Roman Numeral to Integer](./03-week-3--additional-practice/01-bonus-2--roman-numeral-to-integer) +- [ ] [Bonus 3: Rotate Array Clockwise](./03-week-3--additional-practice/02-bonus-3--rotate-array-clockwise) +- [ ] [Bonus 4: Distinct Pair Sum](./03-week-3--additional-practice/03-bonus-4--distinct-pair-sum) +- [ ] [Bonus 5: Consecutive Substrings](./03-week-3--additional-practice/04-bonus-5--consecutive-substrings) + +### Pairing Exercises 1 + +- [ ] [Code Review](./04-pairing-exercises-1/00-code-review) +- [ ] [Whiteboard](./04-pairing-exercises-1/01-whiteboard) + +### Week 4: Big O Notation + +- [ ] [Day 1: Introduction to Big O Notation](./05-week-4--big-o-notation/00-day-1--introduction-to-big-o-notation) +- [ ] [Day 2: Introduction to Space Complexity](./05-week-4--big-o-notation/01-day-2--introduction-to-space-complexity) + +### Week 5: Big O Continued + +- [ ] [Days 1 to 2: Implement a Stack Class](./06-week-5--big-o-continued/00-days-1-to-2--implement-a-stack-class) +- [ ] [Days 3 to 4: Implement a Queue Class](./06-week-5--big-o-continued/01-days-3-to-4--implement-a-queue-class) +- [ ] [Day 5: Implement a Set](./06-week-5--big-o-continued/02-day-5--implement-a-set) + +### Week 6: Foundational Data Structures + +- [ ] [Days 1 to 2: Implement a Linked List](./07-week-6--foundational-data-structures/00-days-1-to-2--implement-a-linked-list) +- [ ] [Day 3: Underneath Arrays](./07-week-6--foundational-data-structures/01-day-3--underneath-arrays) +- [ ] [Day 4: Underneath Hashes](./07-week-6--foundational-data-structures/02-day-4--underneath-hashes) +- [ ] [Bonus Algorithm: Recursive String Reverse](./07-week-6--foundational-data-structures/03-bonus-algorithm--recursive-string-reverse) +- [ ] [Bonus: Modify Linked List to Track Tail and Size](./07-week-6--foundational-data-structures/04-bonus--modify-linked-list-to-track-tail-and-size) +- [ ] [Bonus: Build a Doubly Linked List](./07-week-6--foundational-data-structures/05-bonus--build-a-doubly-linked-list) + +### Pairing Exercise 2 + +- [ ] [Whiteboard Big O](./08-pairing-exercise-2/00-whiteboard-big-o) + +### Week 7: Sorting Algorithms + +- [ ] [Days 1 to 2: Bubble Sort](./09-week-7--sorting-algorithms/00-days-1-to-2--bubble-sort) +- [ ] [Days 3 to 5: Merge Sort](./09-week-7--sorting-algorithms/01-days-3-to-5--merge-sort) + +### Week 8: Searching + +- [ ] [Days 1 to 3: Binary Search](./10-week-8--searching/00-days-1-to-3--binary-search) +- [ ] [Day 4: Manual Binary Tree](./10-week-8--searching/01-day-4--manual-binary-tree) +- [ ] [Day 5: Build a Binary Tree + Balancing](./10-week-8--searching/02-day-5--build-a-binary-tree---balancing) + +### Week 9: Searching and Sorting Continued + +- [ ] [Days 1 to 2: Binary Tree Traversal: Level-Order / Breadth-First](./11-week-9--searching-and-sorting-continued/00-days-1-to-2--binary-tree-traversal--level-order---breadth-first) +- [ ] [Day 3 to 4: Tree Traversal In Order](./11-week-9--searching-and-sorting-continued/01-day-3-to-4--tree-traversal-in-order) +- [ ] [Day 5: Find Value Binary Tree](./11-week-9--searching-and-sorting-continued/02-day-5--find-value-binary-tree) +- [ ] [Bonus: Quicksort](./11-week-9--searching-and-sorting-continued/03-bonus--quicksort) + +### Pairing Exercise 3 + +- [ ] [Pair Programming](./12-pairing-exercise-3/00-pair-programming) + +### Week 10 + +- [ ] [Days 1 to 2: Create a Queue Class Using Nodes](./13-week-10/00-days-1-to-2--create-a-queue-class-using-nodes) +- [ ] [Days 3 to 5: Build an LRU Cache](./13-week-10/01-days-3-to-5--build-an-lru-cache) + +### Week 11 + +- [ ] [Day 1: What Is a Graph?](./14-week-11/00-day-1--what-is-a-graph-) +- [ ] [Days 2 to 3: Depth-first Graph Traversal](./14-week-11/01-days-2-to-3--depth-first-graph-traversal) +- [ ] [Days 4 to 5: Breadth-first Graph Traversal](./14-week-11/02-days-4-to-5--breadth-first-graph-traversal) + +### Week 12 + +- [ ] [Days 1 to 2: Convert HTML to a Graph](./15-week-12/00-days-1-to-2--convert-html-to-a-graph) + +### Pairing Exercise 4 + +- [ ] [Whiteboard and Calculate Big O](./16-pairing-exercise-4/00-whiteboard-and-calculate-big-o) + +### Week 13 + +- [ ] [Day 1 to 2: Dynamic Programming](./17-week-13/00-day-1-to-2--dynamic-programming) +- [ ] [Day 3 to 5: Add Two Numbers List Nodes](./17-week-13/01-day-3-to-5--add-two-numbers-list-nodes) + +### Week 14 + +- [ ] [Day 1 to 2: Longest Substring Without Repeating Characters](./18-week-14/00-day-1-to-2--longest-substring-without-repeating-characters) +- [ ] [Day 3 to 5: Validate BST](./18-week-14/01-day-3-to-5--validate-bst) + +### Week 15 + +- [ ] [Week 15 Algorithm Practices](./19-week-15/00-week-15-algo-practices) + +### Pairing Exercises 5 + +- [ ] [Code Comparison](./20-pairing-exercises-5/00-code-comparison) +- [ ] [Whiteboard and Calculate Big O](./20-pairing-exercises-5/01-whiteboard-and-calculate-big-o)

    Z9sZ&ifCC%_W<8X)| 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�H~*D83S6d7^6DiI{@up{eqMm3A%MA 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¿S@lar6Pzczbl-+Ydhwo(WEt!)u~v2%z!I{t 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