offcode 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -2
- package/data/index.json +1 -0
- package/data/problems/01-matrix.json +1 -0
- package/data/problems/1-bit-and-2-bit-characters.json +1 -0
- package/data/problems/132-pattern.json +1 -0
- package/data/problems/2-keys-keyboard.json +1 -0
- package/data/problems/24-game.json +1 -0
- package/data/problems/3sum-closest.json +1 -0
- package/data/problems/3sum-smaller.json +1 -0
- package/data/problems/3sum-with-multiplicity.json +1 -0
- package/data/problems/3sum.json +1 -0
- package/data/problems/4-keys-keyboard.json +1 -0
- package/data/problems/4sum-ii.json +1 -0
- package/data/problems/4sum.json +1 -0
- package/data/problems/accounts-merge.json +1 -0
- package/data/problems/add-binary.json +1 -0
- package/data/problems/add-bold-tag-in-string.json +1 -0
- package/data/problems/add-digits.json +1 -0
- package/data/problems/add-one-row-to-tree.json +1 -0
- package/data/problems/add-strings.json +1 -0
- package/data/problems/add-to-array-form-of-integer.json +1 -0
- package/data/problems/add-two-numbers-ii.json +1 -0
- package/data/problems/add-two-numbers.json +1 -0
- package/data/problems/additive-number.json +1 -0
- package/data/problems/advantage-shuffle.json +1 -0
- package/data/problems/alien-dictionary.json +1 -0
- package/data/problems/all-nodes-distance-k-in-binary-tree.json +1 -0
- package/data/problems/all-oone-data-structure.json +1 -0
- package/data/problems/all-paths-from-source-to-target.json +1 -0
- package/data/problems/all-possible-full-binary-trees.json +1 -0
- package/data/problems/ambiguous-coordinates.json +1 -0
- package/data/problems/android-unlock-patterns.json +1 -0
- package/data/problems/arithmetic-slices-ii-subsequence.json +1 -0
- package/data/problems/arithmetic-slices.json +1 -0
- package/data/problems/arranging-coins.json +1 -0
- package/data/problems/array-nesting.json +1 -0
- package/data/problems/array-of-doubled-pairs.json +1 -0
- package/data/problems/array-partition.json +1 -0
- package/data/problems/assign-cookies.json +1 -0
- package/data/problems/asteroid-collision.json +1 -0
- package/data/problems/available-captures-for-rook.json +1 -0
- package/data/problems/average-of-levels-in-binary-tree.json +1 -0
- package/data/problems/backspace-string-compare.json +1 -0
- package/data/problems/bag-of-tokens.json +1 -0
- package/data/problems/balanced-binary-tree.json +1 -0
- package/data/problems/base-7.json +1 -0
- package/data/problems/baseball-game.json +1 -0
- package/data/problems/basic-absolute-value.json +1 -0
- package/data/problems/basic-array-max.json +1 -0
- package/data/problems/basic-array-min.json +1 -0
- package/data/problems/basic-array-sum-rec.json +1 -0
- package/data/problems/basic-array-sum.json +1 -0
- package/data/problems/basic-average-floor.json +1 -0
- package/data/problems/basic-bubble-sort.json +1 -0
- package/data/problems/basic-calculator-ii.json +1 -0
- package/data/problems/basic-calculator-iii.json +1 -0
- package/data/problems/basic-calculator-iv.json +1 -0
- package/data/problems/basic-calculator.json +1 -0
- package/data/problems/basic-collatz-steps.json +1 -0
- package/data/problems/basic-contains-value.json +1 -0
- package/data/problems/basic-count-above.json +1 -0
- package/data/problems/basic-count-char.json +1 -0
- package/data/problems/basic-count-digits.json +1 -0
- package/data/problems/basic-count-evens.json +1 -0
- package/data/problems/basic-count-pairs.json +1 -0
- package/data/problems/basic-count-vowels.json +1 -0
- package/data/problems/basic-count-words.json +1 -0
- package/data/problems/basic-countdown.json +1 -0
- package/data/problems/basic-double-array.json +1 -0
- package/data/problems/basic-factorial-rec.json +1 -0
- package/data/problems/basic-factorial.json +1 -0
- package/data/problems/basic-fibonacci.json +1 -0
- package/data/problems/basic-find-index.json +1 -0
- package/data/problems/basic-gcd.json +1 -0
- package/data/problems/basic-grade-letter.json +1 -0
- package/data/problems/basic-has-duplicate.json +1 -0
- package/data/problems/basic-is-even.json +1 -0
- package/data/problems/basic-is-leap-year.json +1 -0
- package/data/problems/basic-is-sorted.json +1 -0
- package/data/problems/basic-max-frequency.json +1 -0
- package/data/problems/basic-max-of-three.json +1 -0
- package/data/problems/basic-max-of-two.json +1 -0
- package/data/problems/basic-palindrome-text.json +1 -0
- package/data/problems/basic-power-rec.json +1 -0
- package/data/problems/basic-power.json +1 -0
- package/data/problems/basic-repeat-string.json +1 -0
- package/data/problems/basic-reverse-array.json +1 -0
- package/data/problems/basic-reverse-number.json +1 -0
- package/data/problems/basic-reverse-text-rec.json +1 -0
- package/data/problems/basic-reverse-text.json +1 -0
- package/data/problems/basic-second-largest.json +1 -0
- package/data/problems/basic-sort-two.json +1 -0
- package/data/problems/basic-staircase.json +1 -0
- package/data/problems/basic-string-length.json +1 -0
- package/data/problems/basic-sum-1-to-n.json +1 -0
- package/data/problems/basic-sum-digits-rec.json +1 -0
- package/data/problems/basic-sum-multiples.json +1 -0
- package/data/problems/basic-sum-of-digits.json +1 -0
- package/data/problems/basic-temperature-advice.json +1 -0
- package/data/problems/basic-to-upper.json +1 -0
- package/data/problems/basic-triangle-sum.json +1 -0
- package/data/problems/battleships-in-a-board.json +1 -0
- package/data/problems/beautiful-arrangement-ii.json +1 -0
- package/data/problems/beautiful-arrangement.json +1 -0
- package/data/problems/beautiful-array.json +1 -0
- package/data/problems/best-meeting-point.json +1 -0
- package/data/problems/best-time-to-buy-and-sell-stock-ii.json +1 -0
- package/data/problems/best-time-to-buy-and-sell-stock-iii.json +1 -0
- package/data/problems/best-time-to-buy-and-sell-stock-iv.json +1 -0
- package/data/problems/best-time-to-buy-and-sell-stock-with-cooldown.json +1 -0
- package/data/problems/best-time-to-buy-and-sell-stock-with-transaction-fee.json +1 -0
- package/data/problems/best-time-to-buy-and-sell-stock.json +1 -0
- package/data/problems/binary-gap.json +1 -0
- package/data/problems/binary-number-with-alternating-bits.json +1 -0
- package/data/problems/binary-search-tree-iterator.json +1 -0
- package/data/problems/binary-search.json +1 -0
- package/data/problems/binary-subarrays-with-sum.json +1 -0
- package/data/problems/binary-tree-cameras.json +1 -0
- package/data/problems/binary-tree-inorder-traversal.json +1 -0
- package/data/problems/binary-tree-level-order-traversal-ii.json +1 -0
- package/data/problems/binary-tree-level-order-traversal.json +1 -0
- package/data/problems/binary-tree-longest-consecutive-sequence-ii.json +1 -0
- package/data/problems/binary-tree-longest-consecutive-sequence.json +1 -0
- package/data/problems/binary-tree-maximum-path-sum.json +1 -0
- package/data/problems/binary-tree-paths.json +1 -0
- package/data/problems/binary-tree-postorder-traversal.json +1 -0
- package/data/problems/binary-tree-preorder-traversal.json +1 -0
- package/data/problems/binary-tree-pruning.json +1 -0
- package/data/problems/binary-tree-right-side-view.json +1 -0
- package/data/problems/binary-tree-tilt.json +1 -0
- package/data/problems/binary-tree-upside-down.json +1 -0
- package/data/problems/binary-tree-vertical-order-traversal.json +1 -0
- package/data/problems/binary-tree-zigzag-level-order-traversal.json +1 -0
- package/data/problems/binary-trees-with-factors.json +1 -0
- package/data/problems/binary-watch.json +1 -0
- package/data/problems/bitwise-and-of-numbers-range.json +1 -0
- package/data/problems/bitwise-ors-of-subarrays.json +1 -0
- package/data/problems/boats-to-save-people.json +1 -0
- package/data/problems/bold-words-in-string.json +1 -0
- package/data/problems/bomb-enemy.json +1 -0
- package/data/problems/boundary-of-binary-tree.json +1 -0
- package/data/problems/brick-wall.json +1 -0
- package/data/problems/bricks-falling-when-hit.json +1 -0
- package/data/problems/broken-calculator.json +1 -0
- package/data/problems/buddy-strings.json +1 -0
- package/data/problems/build-a-matrix-with-conditions.json +1 -0
- package/data/problems/bulb-switcher-ii.json +1 -0
- package/data/problems/bulb-switcher.json +1 -0
- package/data/problems/bulls-and-cows.json +1 -0
- package/data/problems/burst-balloons.json +1 -0
- package/data/problems/bus-routes.json +1 -0
- package/data/problems/can-i-win.json +1 -0
- package/data/problems/can-place-flowers.json +1 -0
- package/data/problems/candy-crush.json +1 -0
- package/data/problems/candy.json +1 -0
- package/data/problems/capacity-to-ship-packages-within-d-days.json +1 -0
- package/data/problems/car-fleet.json +1 -0
- package/data/problems/car-pooling.json +1 -0
- package/data/problems/card-flipping-game.json +1 -0
- package/data/problems/cat-and-mouse.json +1 -0
- package/data/problems/chalkboard-xor-game.json +1 -0
- package/data/problems/champagne-tower.json +1 -0
- package/data/problems/cheapest-flights-within-k-stops.json +1 -0
- package/data/problems/check-completeness-of-a-binary-tree.json +1 -0
- package/data/problems/cherry-pickup.json +1 -0
- package/data/problems/circular-array-loop.json +1 -0
- package/data/problems/climbing-stairs.json +1 -0
- package/data/problems/clone-graph.json +1 -0
- package/data/problems/closest-binary-search-tree-value-ii.json +1 -0
- package/data/problems/closest-binary-search-tree-value.json +1 -0
- package/data/problems/closest-leaf-in-a-binary-tree.json +1 -0
- package/data/problems/coin-change-ii.json +1 -0
- package/data/problems/coin-change.json +1 -0
- package/data/problems/coin-path.json +1 -0
- package/data/problems/combination-sum-ii.json +1 -0
- package/data/problems/combination-sum-iii.json +1 -0
- package/data/problems/combination-sum-iv.json +1 -0
- package/data/problems/combination-sum.json +1 -0
- package/data/problems/combinations.json +1 -0
- package/data/problems/compare-version-numbers.json +1 -0
- package/data/problems/complete-binary-tree-inserter.json +1 -0
- package/data/problems/complex-number-multiplication.json +1 -0
- package/data/problems/concatenated-words.json +1 -0
- package/data/problems/concatenation-of-array.json +1 -0
- package/data/problems/consecutive-numbers-sum.json +1 -0
- package/data/problems/construct-binary-tree-from-inorder-and-postorder-traversal.json +1 -0
- package/data/problems/construct-binary-tree-from-preorder-and-inorder-traversal.json +1 -0
- package/data/problems/construct-binary-tree-from-preorder-and-postorder-traversal.json +1 -0
- package/data/problems/construct-binary-tree-from-string.json +1 -0
- package/data/problems/construct-quad-tree.json +1 -0
- package/data/problems/construct-string-from-binary-tree.json +1 -0
- package/data/problems/construct-the-rectangle.json +1 -0
- package/data/problems/contain-virus.json +1 -0
- package/data/problems/container-with-most-water.json +1 -0
- package/data/problems/contains-duplicate-ii.json +1 -0
- package/data/problems/contains-duplicate-iii.json +1 -0
- package/data/problems/contains-duplicate.json +1 -0
- package/data/problems/contiguous-array.json +1 -0
- package/data/problems/continuous-subarray-sum.json +1 -0
- package/data/problems/convert-a-number-to-hexadecimal.json +1 -0
- package/data/problems/convert-binary-search-tree-to-sorted-doubly-linked-list.json +1 -0
- package/data/problems/convert-bst-to-greater-tree.json +1 -0
- package/data/problems/convert-sorted-array-to-binary-search-tree.json +1 -0
- package/data/problems/convert-sorted-list-to-binary-search-tree.json +1 -0
- package/data/problems/convex-polygon.json +1 -0
- package/data/problems/copy-list-with-random-pointer.json +1 -0
- package/data/problems/count-and-say.json +1 -0
- package/data/problems/count-binary-substrings.json +1 -0
- package/data/problems/count-complete-tree-nodes.json +1 -0
- package/data/problems/count-different-palindromic-subsequences.json +1 -0
- package/data/problems/count-good-nodes-in-binary-tree.json +1 -0
- package/data/problems/count-numbers-with-unique-digits.json +1 -0
- package/data/problems/count-of-range-sum.json +1 -0
- package/data/problems/count-of-smaller-numbers-after-self.json +1 -0
- package/data/problems/count-primes.json +1 -0
- package/data/problems/count-the-repetitions.json +1 -0
- package/data/problems/count-unique-characters-of-all-substrings-of-a-given-string.json +1 -0
- package/data/problems/count-univalue-subtrees.json +1 -0
- package/data/problems/counting-bits.json +1 -0
- package/data/problems/couples-holding-hands.json +1 -0
- package/data/problems/course-schedule-ii.json +1 -0
- package/data/problems/course-schedule-iii.json +1 -0
- package/data/problems/course-schedule-iv.json +1 -0
- package/data/problems/course-schedule.json +1 -0
- package/data/problems/cousins-in-binary-tree.json +1 -0
- package/data/problems/cracking-the-safe.json +1 -0
- package/data/problems/create-maximum-number.json +1 -0
- package/data/problems/custom-sort-string.json +1 -0
- package/data/problems/cut-off-trees-for-golf-event.json +1 -0
- package/data/problems/daily-temperatures.json +1 -0
- package/data/problems/data-stream-as-disjoint-intervals.json +1 -0
- package/data/problems/decode-string.json +1 -0
- package/data/problems/decode-ways-ii.json +1 -0
- package/data/problems/decode-ways.json +1 -0
- package/data/problems/decoded-string-at-index.json +1 -0
- package/data/problems/degree-of-an-array.json +1 -0
- package/data/problems/delete-and-earn.json +1 -0
- package/data/problems/delete-columns-to-make-sorted-ii.json +1 -0
- package/data/problems/delete-columns-to-make-sorted-iii.json +1 -0
- package/data/problems/delete-columns-to-make-sorted.json +1 -0
- package/data/problems/delete-leaves-with-a-given-value.json +1 -0
- package/data/problems/delete-node-in-a-bst.json +1 -0
- package/data/problems/delete-node-in-a-linked-list.json +1 -0
- package/data/problems/delete-operation-for-two-strings.json +1 -0
- package/data/problems/design-add-and-search-words-data-structure.json +1 -0
- package/data/problems/design-circular-deque.json +1 -0
- package/data/problems/design-circular-queue.json +1 -0
- package/data/problems/design-compressed-string-iterator.json +1 -0
- package/data/problems/design-excel-sum-formula.json +1 -0
- package/data/problems/design-hashmap.json +1 -0
- package/data/problems/design-hashset.json +1 -0
- package/data/problems/design-hit-counter.json +1 -0
- package/data/problems/design-in-memory-file-system.json +1 -0
- package/data/problems/design-linked-list.json +1 -0
- package/data/problems/design-log-storage-system.json +1 -0
- package/data/problems/design-phone-directory.json +1 -0
- package/data/problems/design-search-autocomplete-system.json +1 -0
- package/data/problems/design-snake-game.json +1 -0
- package/data/problems/design-tic-tac-toe.json +1 -0
- package/data/problems/design-twitter.json +1 -0
- package/data/problems/detect-capital.json +1 -0
- package/data/problems/detect-squares.json +1 -0
- package/data/problems/di-string-match.json +1 -0
- package/data/problems/diagonal-traverse.json +1 -0
- package/data/problems/diameter-of-binary-tree.json +1 -0
- package/data/problems/different-ways-to-add-parentheses.json +1 -0
- package/data/problems/distinct-subsequences-ii.json +1 -0
- package/data/problems/distinct-subsequences.json +1 -0
- package/data/problems/distribute-candies.json +1 -0
- package/data/problems/distribute-coins-in-binary-tree.json +1 -0
- package/data/problems/divide-two-integers.json +1 -0
- package/data/problems/domino-and-tromino-tiling.json +1 -0
- package/data/problems/dota2-senate.json +1 -0
- package/data/problems/dungeon-game.json +1 -0
- package/data/problems/edit-distance.json +1 -0
- package/data/problems/elimination-game.json +1 -0
- package/data/problems/employee-free-time.json +1 -0
- package/data/problems/employee-importance.json +1 -0
- package/data/problems/encode-and-decode-strings.json +1 -0
- package/data/problems/encode-and-decode-tinyurl.json +1 -0
- package/data/problems/encode-n-ary-tree-to-binary-tree.json +1 -0
- package/data/problems/encode-string-with-shortest-length.json +1 -0
- package/data/problems/equal-rational-numbers.json +1 -0
- package/data/problems/equal-tree-partition.json +1 -0
- package/data/problems/erect-the-fence.json +1 -0
- package/data/problems/escape-the-ghosts.json +1 -0
- package/data/problems/evaluate-division.json +1 -0
- package/data/problems/evaluate-reverse-polish-notation.json +1 -0
- package/data/problems/exam-room.json +1 -0
- package/data/problems/excel-sheet-column-number.json +1 -0
- package/data/problems/excel-sheet-column-title.json +1 -0
- package/data/problems/exclusive-time-of-functions.json +1 -0
- package/data/problems/expression-add-operators.json +1 -0
- package/data/problems/expressive-words.json +1 -0
- package/data/problems/extra-characters-in-a-string.json +1 -0
- package/data/problems/factor-combinations.json +1 -0
- package/data/problems/factorial-trailing-zeroes.json +1 -0
- package/data/problems/fair-candy-swap.json +1 -0
- package/data/problems/falling-squares.json +1 -0
- package/data/problems/fibonacci-number.json +1 -0
- package/data/problems/find-all-anagrams-in-a-string.json +1 -0
- package/data/problems/find-all-duplicates-in-an-array.json +1 -0
- package/data/problems/find-all-numbers-disappeared-in-an-array.json +1 -0
- package/data/problems/find-anagram-mappings.json +1 -0
- package/data/problems/find-and-replace-in-string.json +1 -0
- package/data/problems/find-and-replace-pattern.json +1 -0
- package/data/problems/find-bottom-left-tree-value.json +1 -0
- package/data/problems/find-critical-and-pseudo-critical-edges-in-minimum-spanning-tree.json +1 -0
- package/data/problems/find-duplicate-file-in-system.json +1 -0
- package/data/problems/find-duplicate-subtrees.json +1 -0
- package/data/problems/find-eventual-safe-states.json +1 -0
- package/data/problems/find-first-and-last-position-of-element-in-sorted-array.json +1 -0
- package/data/problems/find-in-mountain-array.json +1 -0
- package/data/problems/find-k-closest-elements.json +1 -0
- package/data/problems/find-k-pairs-with-smallest-sums.json +1 -0
- package/data/problems/find-k-th-smallest-pair-distance.json +1 -0
- package/data/problems/find-largest-value-in-each-tree-row.json +1 -0
- package/data/problems/find-leaves-of-binary-tree.json +1 -0
- package/data/problems/find-median-from-data-stream.json +1 -0
- package/data/problems/find-minimum-in-rotated-sorted-array-ii.json +1 -0
- package/data/problems/find-minimum-in-rotated-sorted-array.json +1 -0
- package/data/problems/find-mode-in-binary-search-tree.json +1 -0
- package/data/problems/find-peak-element.json +1 -0
- package/data/problems/find-permutation.json +1 -0
- package/data/problems/find-pivot-index.json +1 -0
- package/data/problems/find-right-interval.json +1 -0
- package/data/problems/find-smallest-letter-greater-than-target.json +1 -0
- package/data/problems/find-the-celebrity.json +1 -0
- package/data/problems/find-the-closest-palindrome.json +1 -0
- package/data/problems/find-the-derangement-of-an-array.json +1 -0
- package/data/problems/find-the-difference.json +1 -0
- package/data/problems/find-the-duplicate-number.json +1 -0
- package/data/problems/find-the-index-of-the-first-occurrence-in-a-string.json +1 -0
- package/data/problems/find-the-shortest-superstring.json +1 -0
- package/data/problems/find-the-town-judge.json +1 -0
- package/data/problems/first-bad-version.json +1 -0
- package/data/problems/first-missing-positive.json +1 -0
- package/data/problems/first-unique-character-in-a-string.json +1 -0
- package/data/problems/fizz-buzz.json +1 -0
- package/data/problems/flatten-2d-vector.json +1 -0
- package/data/problems/flatten-a-multilevel-doubly-linked-list.json +1 -0
- package/data/problems/flatten-binary-tree-to-linked-list.json +1 -0
- package/data/problems/flatten-nested-list-iterator.json +1 -0
- package/data/problems/flip-binary-tree-to-match-preorder-traversal.json +1 -0
- package/data/problems/flip-equivalent-binary-trees.json +1 -0
- package/data/problems/flip-game-ii.json +1 -0
- package/data/problems/flip-game.json +1 -0
- package/data/problems/flip-string-to-monotone-increasing.json +1 -0
- package/data/problems/flipping-an-image.json +1 -0
- package/data/problems/flood-fill.json +1 -0
- package/data/problems/fraction-addition-and-subtraction.json +1 -0
- package/data/problems/fraction-to-recurring-decimal.json +1 -0
- package/data/problems/freedom-trail.json +1 -0
- package/data/problems/friends-of-appropriate-ages.json +1 -0
- package/data/problems/frog-jump.json +1 -0
- package/data/problems/fruit-into-baskets.json +1 -0
- package/data/problems/game-of-life.json +1 -0
- package/data/problems/gas-station.json +1 -0
- package/data/problems/generalized-abbreviation.json +1 -0
- package/data/problems/generate-parentheses.json +1 -0
- package/data/problems/generate-random-point-in-a-circle.json +1 -0
- package/data/problems/global-and-local-inversions.json +1 -0
- package/data/problems/goat-latin.json +1 -0
- package/data/problems/graph-valid-tree.json +1 -0
- package/data/problems/gray-code.json +1 -0
- package/data/problems/greatest-common-divisor-of-strings.json +1 -0
- package/data/problems/greatest-common-divisor-traversal.json +1 -0
- package/data/problems/group-anagrams.json +1 -0
- package/data/problems/group-shifted-strings.json +1 -0
- package/data/problems/groups-of-special-equivalent-strings.json +1 -0
- package/data/problems/guess-number-higher-or-lower-ii.json +1 -0
- package/data/problems/guess-number-higher-or-lower.json +1 -0
- package/data/problems/guess-the-word.json +1 -0
- package/data/problems/h-index-ii.json +1 -0
- package/data/problems/h-index.json +1 -0
- package/data/problems/hamming-distance.json +1 -0
- package/data/problems/hand-of-straights.json +1 -0
- package/data/problems/happy-number.json +1 -0
- package/data/problems/heaters.json +1 -0
- package/data/problems/house-robber-ii.json +1 -0
- package/data/problems/house-robber-iii.json +1 -0
- package/data/problems/house-robber.json +1 -0
- package/data/problems/image-overlap.json +1 -0
- package/data/problems/image-smoother.json +1 -0
- package/data/problems/implement-magic-dictionary.json +1 -0
- package/data/problems/implement-queue-using-stacks.json +1 -0
- package/data/problems/implement-rand10-using-rand7.json +1 -0
- package/data/problems/implement-stack-using-queues.json +1 -0
- package/data/problems/implement-trie-prefix-tree.json +1 -0
- package/data/problems/increasing-order-search-tree.json +1 -0
- package/data/problems/increasing-triplet-subsequence.json +1 -0
- package/data/problems/inorder-successor-in-bst-ii.json +1 -0
- package/data/problems/inorder-successor-in-bst.json +1 -0
- package/data/problems/insert-delete-getrandom-o1-duplicates-allowed.json +1 -0
- package/data/problems/insert-delete-getrandom-o1.json +1 -0
- package/data/problems/insert-greatest-common-divisors-in-linked-list.json +1 -0
- package/data/problems/insert-interval.json +1 -0
- package/data/problems/insert-into-a-binary-search-tree.json +1 -0
- package/data/problems/insert-into-a-sorted-circular-linked-list.json +1 -0
- package/data/problems/insertion-sort-list.json +1 -0
- package/data/problems/integer-break.json +1 -0
- package/data/problems/integer-replacement.json +1 -0
- package/data/problems/integer-to-english-words.json +1 -0
- package/data/problems/integer-to-roman.json +1 -0
- package/data/problems/interleaving-string.json +1 -0
- package/data/problems/intersection-of-two-arrays-ii.json +1 -0
- package/data/problems/intersection-of-two-arrays.json +1 -0
- package/data/problems/intersection-of-two-linked-lists.json +1 -0
- package/data/problems/interval-list-intersections.json +1 -0
- package/data/problems/invert-binary-tree.json +1 -0
- package/data/problems/ip-to-cidr.json +1 -0
- package/data/problems/ipo.json +1 -0
- package/data/problems/is-graph-bipartite.json +1 -0
- package/data/problems/is-subsequence.json +1 -0
- package/data/problems/island-perimeter.json +1 -0
- package/data/problems/isomorphic-strings.json +1 -0
- package/data/problems/jewels-and-stones.json +1 -0
- package/data/problems/jump-game-ii.json +1 -0
- package/data/problems/jump-game-vii.json +1 -0
- package/data/problems/jump-game.json +1 -0
- package/data/problems/k-closest-points-to-origin.json +1 -0
- package/data/problems/k-diff-pairs-in-an-array.json +1 -0
- package/data/problems/k-empty-slots.json +1 -0
- package/data/problems/k-inverse-pairs-array.json +1 -0
- package/data/problems/k-similar-strings.json +1 -0
- package/data/problems/k-th-smallest-in-lexicographical-order.json +1 -0
- package/data/problems/k-th-smallest-prime-fraction.json +1 -0
- package/data/problems/k-th-symbol-in-grammar.json +1 -0
- package/data/problems/keyboard-row.json +1 -0
- package/data/problems/keys-and-rooms.json +1 -0
- package/data/problems/kill-process.json +1 -0
- package/data/problems/knight-dialer.json +1 -0
- package/data/problems/knight-probability-in-chessboard.json +1 -0
- package/data/problems/koko-eating-bananas.json +1 -0
- package/data/problems/kth-largest-element-in-a-stream.json +1 -0
- package/data/problems/kth-largest-element-in-an-array.json +1 -0
- package/data/problems/kth-smallest-element-in-a-bst.json +1 -0
- package/data/problems/kth-smallest-element-in-a-sorted-matrix.json +1 -0
- package/data/problems/kth-smallest-number-in-multiplication-table.json +1 -0
- package/data/problems/largest-bst-subtree.json +1 -0
- package/data/problems/largest-component-size-by-common-factor.json +1 -0
- package/data/problems/largest-divisible-subset.json +1 -0
- package/data/problems/largest-number-at-least-twice-of-others.json +1 -0
- package/data/problems/largest-number.json +1 -0
- package/data/problems/largest-palindrome-product.json +1 -0
- package/data/problems/largest-perimeter-triangle.json +1 -0
- package/data/problems/largest-plus-sign.json +1 -0
- package/data/problems/largest-rectangle-in-histogram.json +1 -0
- package/data/problems/largest-sum-of-averages.json +1 -0
- package/data/problems/largest-time-for-given-digits.json +1 -0
- package/data/problems/largest-triangle-area.json +1 -0
- package/data/problems/last-stone-weight-ii.json +1 -0
- package/data/problems/last-stone-weight.json +1 -0
- package/data/problems/leaf-similar-trees.json +1 -0
- package/data/problems/least-operators-to-express-number.json +1 -0
- package/data/problems/lemonade-change.json +1 -0
- package/data/problems/length-of-last-word.json +1 -0
- package/data/problems/length-of-longest-fibonacci-subsequence.json +1 -0
- package/data/problems/letter-case-permutation.json +1 -0
- package/data/problems/letter-combinations-of-a-phone-number.json +1 -0
- package/data/problems/lexicographical-numbers.json +1 -0
- package/data/problems/lfu-cache.json +1 -0
- package/data/problems/license-key-formatting.json +1 -0
- package/data/problems/line-reflection.json +1 -0
- package/data/problems/linked-list-components.json +1 -0
- package/data/problems/linked-list-cycle-ii.json +1 -0
- package/data/problems/linked-list-cycle.json +1 -0
- package/data/problems/linked-list-random-node.json +1 -0
- package/data/problems/logger-rate-limiter.json +1 -0
- package/data/problems/logical-or-of-two-binary-grids-represented-as-quad-trees.json +1 -0
- package/data/problems/lonely-pixel-i.json +1 -0
- package/data/problems/lonely-pixel-ii.json +1 -0
- package/data/problems/long-pressed-name.json +1 -0
- package/data/problems/longest-absolute-file-path.json +1 -0
- package/data/problems/longest-common-prefix.json +1 -0
- package/data/problems/longest-common-subsequence.json +1 -0
- package/data/problems/longest-consecutive-sequence.json +1 -0
- package/data/problems/longest-continuous-increasing-subsequence.json +1 -0
- package/data/problems/longest-happy-string.json +1 -0
- package/data/problems/longest-harmonious-subsequence.json +1 -0
- package/data/problems/longest-increasing-path-in-a-matrix.json +1 -0
- package/data/problems/longest-increasing-subsequence.json +1 -0
- package/data/problems/longest-line-of-consecutive-one-in-matrix.json +1 -0
- package/data/problems/longest-mountain-in-array.json +1 -0
- package/data/problems/longest-palindrome.json +1 -0
- package/data/problems/longest-palindromic-subsequence.json +1 -0
- package/data/problems/longest-palindromic-substring.json +1 -0
- package/data/problems/longest-repeating-character-replacement.json +1 -0
- package/data/problems/longest-substring-with-at-least-k-repeating-characters.json +1 -0
- package/data/problems/longest-substring-with-at-most-k-distinct-characters.json +1 -0
- package/data/problems/longest-substring-with-at-most-two-distinct-characters.json +1 -0
- package/data/problems/longest-substring-without-repeating-characters.json +1 -0
- package/data/problems/longest-turbulent-subarray.json +1 -0
- package/data/problems/longest-uncommon-subsequence-i.json +1 -0
- package/data/problems/longest-uncommon-subsequence-ii.json +1 -0
- package/data/problems/longest-univalue-path.json +1 -0
- package/data/problems/longest-valid-parentheses.json +1 -0
- package/data/problems/longest-word-in-dictionary-through-deleting.json +1 -0
- package/data/problems/longest-word-in-dictionary.json +1 -0
- package/data/problems/loud-and-rich.json +1 -0
- package/data/problems/lowest-common-ancestor-of-a-binary-search-tree.json +1 -0
- package/data/problems/lowest-common-ancestor-of-a-binary-tree.json +1 -0
- package/data/problems/lru-cache.json +1 -0
- package/data/problems/magic-squares-in-grid.json +1 -0
- package/data/problems/magical-string.json +1 -0
- package/data/problems/majority-element-ii.json +1 -0
- package/data/problems/majority-element.json +1 -0
- package/data/problems/making-a-large-island.json +1 -0
- package/data/problems/map-sum-pairs.json +1 -0
- package/data/problems/masking-personal-information.json +1 -0
- package/data/problems/matchsticks-to-square.json +1 -0
- package/data/problems/max-area-of-island.json +1 -0
- package/data/problems/max-chunks-to-make-sorted-ii.json +1 -0
- package/data/problems/max-chunks-to-make-sorted.json +1 -0
- package/data/problems/max-consecutive-ones-ii.json +1 -0
- package/data/problems/max-consecutive-ones.json +1 -0
- package/data/problems/max-increase-to-keep-city-skyline.json +1 -0
- package/data/problems/max-points-on-a-line.json +1 -0
- package/data/problems/max-stack.json +1 -0
- package/data/problems/max-sum-of-rectangle-no-larger-than-k.json +1 -0
- package/data/problems/maximal-rectangle.json +1 -0
- package/data/problems/maximal-square.json +1 -0
- package/data/problems/maximize-distance-to-closest-person.json +1 -0
- package/data/problems/maximum-average-subarray-i.json +1 -0
- package/data/problems/maximum-average-subarray-ii.json +1 -0
- package/data/problems/maximum-binary-tree-ii.json +1 -0
- package/data/problems/maximum-binary-tree.json +1 -0
- package/data/problems/maximum-depth-of-binary-tree.json +1 -0
- package/data/problems/maximum-depth-of-n-ary-tree.json +1 -0
- package/data/problems/maximum-distance-in-arrays.json +1 -0
- package/data/problems/maximum-frequency-stack.json +1 -0
- package/data/problems/maximum-gap.json +1 -0
- package/data/problems/maximum-length-of-pair-chain.json +1 -0
- package/data/problems/maximum-length-of-repeated-subarray.json +1 -0
- package/data/problems/maximum-product-of-three-numbers.json +1 -0
- package/data/problems/maximum-product-of-word-lengths.json +1 -0
- package/data/problems/maximum-product-subarray.json +1 -0
- package/data/problems/maximum-size-subarray-sum-equals-k.json +1 -0
- package/data/problems/maximum-subarray.json +1 -0
- package/data/problems/maximum-sum-circular-subarray.json +1 -0
- package/data/problems/maximum-sum-of-3-non-overlapping-subarrays.json +1 -0
- package/data/problems/maximum-swap.json +1 -0
- package/data/problems/maximum-vacation-days.json +1 -0
- package/data/problems/maximum-width-of-binary-tree.json +1 -0
- package/data/problems/maximum-width-ramp.json +1 -0
- package/data/problems/maximum-xor-of-two-numbers-in-an-array.json +1 -0
- package/data/problems/median-of-two-sorted-arrays.json +1 -0
- package/data/problems/meeting-rooms-ii.json +1 -0
- package/data/problems/meeting-rooms-iii.json +1 -0
- package/data/problems/meeting-rooms.json +1 -0
- package/data/problems/merge-intervals.json +1 -0
- package/data/problems/merge-k-sorted-lists.json +1 -0
- package/data/problems/merge-sorted-array.json +1 -0
- package/data/problems/merge-strings-alternately.json +1 -0
- package/data/problems/merge-triplets-to-form-target-triplet.json +1 -0
- package/data/problems/merge-two-binary-trees.json +1 -0
- package/data/problems/merge-two-sorted-lists.json +1 -0
- package/data/problems/middle-of-the-linked-list.json +1 -0
- package/data/problems/min-cost-climbing-stairs.json +1 -0
- package/data/problems/min-cost-to-connect-all-points.json +1 -0
- package/data/problems/min-stack.json +1 -0
- package/data/problems/minesweeper.json +1 -0
- package/data/problems/mini-parser.json +1 -0
- package/data/problems/minimize-malware-spread-ii.json +1 -0
- package/data/problems/minimize-malware-spread.json +1 -0
- package/data/problems/minimize-max-distance-to-gas-station.json +1 -0
- package/data/problems/minimum-absolute-difference-in-bst.json +1 -0
- package/data/problems/minimum-add-to-make-parentheses-valid.json +1 -0
- package/data/problems/minimum-area-rectangle-ii.json +1 -0
- package/data/problems/minimum-area-rectangle.json +1 -0
- package/data/problems/minimum-array-end.json +1 -0
- package/data/problems/minimum-ascii-delete-sum-for-two-strings.json +1 -0
- package/data/problems/minimum-cost-for-tickets.json +1 -0
- package/data/problems/minimum-cost-to-hire-k-workers.json +1 -0
- package/data/problems/minimum-cost-to-merge-stones.json +1 -0
- package/data/problems/minimum-depth-of-binary-tree.json +1 -0
- package/data/problems/minimum-distance-between-bst-nodes.json +1 -0
- package/data/problems/minimum-factorization.json +1 -0
- package/data/problems/minimum-falling-path-sum.json +1 -0
- package/data/problems/minimum-genetic-mutation.json +1 -0
- package/data/problems/minimum-height-trees.json +1 -0
- package/data/problems/minimum-increment-to-make-array-unique.json +1 -0
- package/data/problems/minimum-index-sum-of-two-lists.json +1 -0
- package/data/problems/minimum-interval-to-include-each-query.json +1 -0
- package/data/problems/minimum-moves-to-equal-array-elements-ii.json +1 -0
- package/data/problems/minimum-moves-to-equal-array-elements.json +1 -0
- package/data/problems/minimum-number-of-arrows-to-burst-balloons.json +1 -0
- package/data/problems/minimum-number-of-k-consecutive-bit-flips.json +1 -0
- package/data/problems/minimum-number-of-refueling-stops.json +1 -0
- package/data/problems/minimum-path-sum.json +1 -0
- package/data/problems/minimum-size-subarray-sum.json +1 -0
- package/data/problems/minimum-swaps-to-make-sequences-increasing.json +1 -0
- package/data/problems/minimum-time-difference.json +1 -0
- package/data/problems/minimum-unique-word-abbreviation.json +1 -0
- package/data/problems/minimum-window-subsequence.json +1 -0
- package/data/problems/minimum-window-substring.json +1 -0
- package/data/problems/mirror-reflection.json +1 -0
- package/data/problems/missing-number.json +1 -0
- package/data/problems/missing-ranges.json +1 -0
- package/data/problems/monotone-increasing-digits.json +1 -0
- package/data/problems/monotonic-array.json +1 -0
- package/data/problems/most-common-word.json +1 -0
- package/data/problems/most-frequent-subtree-sum.json +1 -0
- package/data/problems/most-profit-assigning-work.json +1 -0
- package/data/problems/most-stones-removed-with-same-row-or-column.json +1 -0
- package/data/problems/move-zeroes.json +1 -0
- package/data/problems/moving-average-from-data-stream.json +1 -0
- package/data/problems/multiply-strings.json +1 -0
- package/data/problems/my-calendar-i.json +1 -0
- package/data/problems/my-calendar-ii.json +1 -0
- package/data/problems/my-calendar-iii.json +1 -0
- package/data/problems/n-ary-tree-level-order-traversal.json +1 -0
- package/data/problems/n-ary-tree-postorder-traversal.json +1 -0
- package/data/problems/n-ary-tree-preorder-traversal.json +1 -0
- package/data/problems/n-queens-ii.json +1 -0
- package/data/problems/n-queens.json +1 -0
- package/data/problems/n-repeated-element-in-size-2n-array.json +1 -0
- package/data/problems/n-th-tribonacci-number.json +1 -0
- package/data/problems/nested-list-weight-sum-ii.json +1 -0
- package/data/problems/nested-list-weight-sum.json +1 -0
- package/data/problems/network-delay-time.json +1 -0
- package/data/problems/new-21-game.json +1 -0
- package/data/problems/next-closest-time.json +1 -0
- package/data/problems/next-greater-element-i.json +1 -0
- package/data/problems/next-greater-element-ii.json +1 -0
- package/data/problems/next-greater-element-iii.json +1 -0
- package/data/problems/next-permutation.json +1 -0
- package/data/problems/nim-game.json +1 -0
- package/data/problems/non-decreasing-array.json +1 -0
- package/data/problems/non-decreasing-subsequences.json +1 -0
- package/data/problems/non-negative-integers-without-consecutive-ones.json +1 -0
- package/data/problems/non-overlapping-intervals.json +1 -0
- package/data/problems/nth-digit.json +1 -0
- package/data/problems/nth-magical-number.json +1 -0
- package/data/problems/number-complement.json +1 -0
- package/data/problems/number-of-1-bits.json +1 -0
- package/data/problems/number-of-atoms.json +1 -0
- package/data/problems/number-of-boomerangs.json +1 -0
- package/data/problems/number-of-connected-components-in-an-undirected-graph.json +1 -0
- package/data/problems/number-of-corner-rectangles.json +1 -0
- package/data/problems/number-of-digit-one.json +1 -0
- package/data/problems/number-of-distinct-islands-ii.json +1 -0
- package/data/problems/number-of-distinct-islands.json +1 -0
- package/data/problems/number-of-islands-ii.json +1 -0
- package/data/problems/number-of-islands.json +1 -0
- package/data/problems/number-of-lines-to-write-string.json +1 -0
- package/data/problems/number-of-longest-increasing-subsequence.json +1 -0
- package/data/problems/number-of-matching-subsequences.json +1 -0
- package/data/problems/number-of-music-playlists.json +1 -0
- package/data/problems/number-of-provinces.json +1 -0
- package/data/problems/number-of-recent-calls.json +1 -0
- package/data/problems/number-of-segments-in-a-string.json +1 -0
- package/data/problems/number-of-squareful-arrays.json +1 -0
- package/data/problems/number-of-subarrays-with-bounded-maximum.json +1 -0
- package/data/problems/numbers-at-most-n-given-digit-set.json +1 -0
- package/data/problems/numbers-with-same-consecutive-differences.json +1 -0
- package/data/problems/odd-even-jump.json +1 -0
- package/data/problems/odd-even-linked-list.json +1 -0
- package/data/problems/one-edit-distance.json +1 -0
- package/data/problems/ones-and-zeroes.json +1 -0
- package/data/problems/online-election.json +1 -0
- package/data/problems/online-stock-span.json +1 -0
- package/data/problems/open-the-lock.json +1 -0
- package/data/problems/optimal-account-balancing.json +1 -0
- package/data/problems/optimal-division.json +1 -0
- package/data/problems/orderly-queue.json +1 -0
- package/data/problems/out-of-boundary-paths.json +1 -0
- package/data/problems/output-contest-matches.json +1 -0
- package/data/problems/pacific-atlantic-water-flow.json +1 -0
- package/data/problems/paint-fence.json +1 -0
- package/data/problems/paint-house-ii.json +1 -0
- package/data/problems/paint-house.json +1 -0
- package/data/problems/palindrome-linked-list.json +1 -0
- package/data/problems/palindrome-number.json +1 -0
- package/data/problems/palindrome-pairs.json +1 -0
- package/data/problems/palindrome-partitioning-ii.json +1 -0
- package/data/problems/palindrome-partitioning.json +1 -0
- package/data/problems/palindrome-permutation-ii.json +1 -0
- package/data/problems/palindrome-permutation.json +1 -0
- package/data/problems/palindromic-substrings.json +1 -0
- package/data/problems/pancake-sorting.json +1 -0
- package/data/problems/parse-lisp-expression.json +1 -0
- package/data/problems/partition-array-into-disjoint-intervals.json +1 -0
- package/data/problems/partition-equal-subset-sum.json +1 -0
- package/data/problems/partition-labels.json +1 -0
- package/data/problems/partition-list.json +1 -0
- package/data/problems/partition-to-k-equal-sum-subsets.json +1 -0
- package/data/problems/pascals-triangle-ii.json +1 -0
- package/data/problems/pascals-triangle.json +1 -0
- package/data/problems/patching-array.json +1 -0
- package/data/problems/path-sum-ii.json +1 -0
- package/data/problems/path-sum-iii.json +1 -0
- package/data/problems/path-sum-iv.json +1 -0
- package/data/problems/path-sum.json +1 -0
- package/data/problems/path-with-minimum-effort.json +1 -0
- package/data/problems/peak-index-in-a-mountain-array.json +1 -0
- package/data/problems/peeking-iterator.json +1 -0
- package/data/problems/perfect-number.json +1 -0
- package/data/problems/perfect-rectangle.json +1 -0
- package/data/problems/perfect-squares.json +1 -0
- package/data/problems/permutation-in-string.json +1 -0
- package/data/problems/permutation-sequence.json +1 -0
- package/data/problems/permutations-ii.json +1 -0
- package/data/problems/permutations.json +1 -0
- package/data/problems/plus-one-linked-list.json +1 -0
- package/data/problems/plus-one.json +1 -0
- package/data/problems/poor-pigs.json +1 -0
- package/data/problems/populating-next-right-pointers-in-each-node-ii.json +1 -0
- package/data/problems/populating-next-right-pointers-in-each-node.json +1 -0
- package/data/problems/positions-of-large-groups.json +1 -0
- package/data/problems/possible-bipartition.json +1 -0
- package/data/problems/pour-water.json +1 -0
- package/data/problems/power-of-four.json +1 -0
- package/data/problems/power-of-three.json +1 -0
- package/data/problems/power-of-two.json +1 -0
- package/data/problems/powerful-integers.json +1 -0
- package/data/problems/powx-n.json +1 -0
- package/data/problems/predict-the-winner.json +1 -0
- package/data/problems/prefix-and-suffix-search.json +1 -0
- package/data/problems/preimage-size-of-factorial-zeroes-function.json +1 -0
- package/data/problems/prime-number-of-set-bits-in-binary-representation.json +1 -0
- package/data/problems/prime-palindrome.json +1 -0
- package/data/problems/print-binary-tree.json +1 -0
- package/data/problems/prison-cells-after-n-days.json +1 -0
- package/data/problems/product-of-array-except-self.json +1 -0
- package/data/problems/profitable-schemes.json +1 -0
- package/data/problems/projection-area-of-3d-shapes.json +1 -0
- package/data/problems/push-dominoes.json +1 -0
- package/data/problems/pyramid-transition-matrix.json +1 -0
- package/data/problems/queue-reconstruction-by-height.json +1 -0
- package/data/problems/rabbits-in-forest.json +1 -0
- package/data/problems/race-car.json +1 -0
- package/data/problems/random-flip-matrix.json +1 -0
- package/data/problems/random-pick-index.json +1 -0
- package/data/problems/random-pick-with-blacklist.json +1 -0
- package/data/problems/random-pick-with-weight.json +1 -0
- package/data/problems/random-point-in-non-overlapping-rectangles.json +1 -0
- package/data/problems/range-addition-ii.json +1 -0
- package/data/problems/range-addition.json +1 -0
- package/data/problems/range-module.json +1 -0
- package/data/problems/range-sum-of-bst.json +1 -0
- package/data/problems/range-sum-query-2d-immutable.json +1 -0
- package/data/problems/range-sum-query-2d-mutable.json +1 -0
- package/data/problems/range-sum-query-immutable.json +1 -0
- package/data/problems/range-sum-query-mutable.json +1 -0
- package/data/problems/ransom-note.json +1 -0
- package/data/problems/reach-a-number.json +1 -0
- package/data/problems/reachable-nodes-in-subdivided-graph.json +1 -0
- package/data/problems/reaching-points.json +1 -0
- package/data/problems/read-n-characters-given-read4-ii-call-multiple-times.json +1 -0
- package/data/problems/read-n-characters-given-read4.json +1 -0
- package/data/problems/rearrange-string-k-distance-apart.json +1 -0
- package/data/problems/reconstruct-itinerary.json +1 -0
- package/data/problems/reconstruct-original-digits-from-english.json +1 -0
- package/data/problems/recover-binary-search-tree.json +1 -0
- package/data/problems/rectangle-area-ii.json +1 -0
- package/data/problems/rectangle-area.json +1 -0
- package/data/problems/rectangle-overlap.json +1 -0
- package/data/problems/redundant-connection-ii.json +1 -0
- package/data/problems/redundant-connection.json +1 -0
- package/data/problems/regions-cut-by-slashes.json +1 -0
- package/data/problems/regular-expression-matching.json +1 -0
- package/data/problems/relative-ranks.json +1 -0
- package/data/problems/remove-9.json +1 -0
- package/data/problems/remove-boxes.json +1 -0
- package/data/problems/remove-comments.json +1 -0
- package/data/problems/remove-duplicate-letters.json +1 -0
- package/data/problems/remove-duplicates-from-sorted-array-ii.json +1 -0
- package/data/problems/remove-duplicates-from-sorted-array.json +1 -0
- package/data/problems/remove-duplicates-from-sorted-list-ii.json +1 -0
- package/data/problems/remove-duplicates-from-sorted-list.json +1 -0
- package/data/problems/remove-element.json +1 -0
- package/data/problems/remove-invalid-parentheses.json +1 -0
- package/data/problems/remove-k-digits.json +1 -0
- package/data/problems/remove-linked-list-elements.json +1 -0
- package/data/problems/remove-nth-node-from-end-of-list.json +1 -0
- package/data/problems/reorder-data-in-log-files.json +1 -0
- package/data/problems/reorder-list.json +1 -0
- package/data/problems/reordered-power-of-2.json +1 -0
- package/data/problems/reorganize-string.json +1 -0
- package/data/problems/repeated-dna-sequences.json +1 -0
- package/data/problems/repeated-string-match.json +1 -0
- package/data/problems/repeated-substring-pattern.json +1 -0
- package/data/problems/replace-words.json +1 -0
- package/data/problems/reshape-the-matrix.json +1 -0
- package/data/problems/restore-ip-addresses.json +1 -0
- package/data/problems/reveal-cards-in-increasing-order.json +1 -0
- package/data/problems/reverse-bits.json +1 -0
- package/data/problems/reverse-integer.json +1 -0
- package/data/problems/reverse-linked-list-ii.json +1 -0
- package/data/problems/reverse-linked-list.json +1 -0
- package/data/problems/reverse-nodes-in-k-group.json +1 -0
- package/data/problems/reverse-only-letters.json +1 -0
- package/data/problems/reverse-pairs.json +1 -0
- package/data/problems/reverse-string-ii.json +1 -0
- package/data/problems/reverse-string.json +1 -0
- package/data/problems/reverse-vowels-of-a-string.json +1 -0
- package/data/problems/reverse-words-in-a-string-ii.json +1 -0
- package/data/problems/reverse-words-in-a-string-iii.json +1 -0
- package/data/problems/reverse-words-in-a-string.json +1 -0
- package/data/problems/rle-iterator.json +1 -0
- package/data/problems/robot-return-to-origin.json +1 -0
- package/data/problems/robot-room-cleaner.json +1 -0
- package/data/problems/roman-to-integer.json +1 -0
- package/data/problems/rotate-array.json +1 -0
- package/data/problems/rotate-function.json +1 -0
- package/data/problems/rotate-image.json +1 -0
- package/data/problems/rotate-list.json +1 -0
- package/data/problems/rotate-string.json +1 -0
- package/data/problems/rotated-digits.json +1 -0
- package/data/problems/rotting-oranges.json +1 -0
- package/data/problems/russian-doll-envelopes.json +1 -0
- package/data/problems/same-tree.json +1 -0
- package/data/problems/satisfiability-of-equality-equations.json +1 -0
- package/data/problems/score-after-flipping-matrix.json +1 -0
- package/data/problems/score-of-parentheses.json +1 -0
- package/data/problems/scramble-string.json +1 -0
- package/data/problems/search-a-2d-matrix-ii.json +1 -0
- package/data/problems/search-a-2d-matrix.json +1 -0
- package/data/problems/search-in-a-binary-search-tree.json +1 -0
- package/data/problems/search-in-a-sorted-array-of-unknown-size.json +1 -0
- package/data/problems/search-in-rotated-sorted-array-ii.json +1 -0
- package/data/problems/search-in-rotated-sorted-array.json +1 -0
- package/data/problems/search-insert-position.json +1 -0
- package/data/problems/second-minimum-node-in-a-binary-tree.json +1 -0
- package/data/problems/self-crossing.json +1 -0
- package/data/problems/self-dividing-numbers.json +1 -0
- package/data/problems/sentence-screen-fitting.json +1 -0
- package/data/problems/sentence-similarity-ii.json +1 -0
- package/data/problems/sentence-similarity.json +1 -0
- package/data/problems/sequence-reconstruction.json +1 -0
- package/data/problems/serialize-and-deserialize-binary-tree.json +1 -0
- package/data/problems/serialize-and-deserialize-bst.json +1 -0
- package/data/problems/serialize-and-deserialize-n-ary-tree.json +1 -0
- package/data/problems/set-intersection-size-at-least-two.json +1 -0
- package/data/problems/set-matrix-zeroes.json +1 -0
- package/data/problems/set-mismatch.json +1 -0
- package/data/problems/shifting-letters.json +1 -0
- package/data/problems/shopping-offers.json +1 -0
- package/data/problems/short-encoding-of-words.json +1 -0
- package/data/problems/shortest-bridge.json +1 -0
- package/data/problems/shortest-completing-word.json +1 -0
- package/data/problems/shortest-distance-from-all-buildings.json +1 -0
- package/data/problems/shortest-distance-to-a-character.json +1 -0
- package/data/problems/shortest-palindrome.json +1 -0
- package/data/problems/shortest-path-to-get-all-keys.json +1 -0
- package/data/problems/shortest-path-visiting-all-nodes.json +1 -0
- package/data/problems/shortest-subarray-with-sum-at-least-k.json +1 -0
- package/data/problems/shortest-unsorted-continuous-subarray.json +1 -0
- package/data/problems/shortest-word-distance-ii.json +1 -0
- package/data/problems/shortest-word-distance-iii.json +1 -0
- package/data/problems/shortest-word-distance.json +1 -0
- package/data/problems/shuffle-an-array.json +1 -0
- package/data/problems/similar-rgb-color.json +1 -0
- package/data/problems/similar-string-groups.json +1 -0
- package/data/problems/simplify-path.json +1 -0
- package/data/problems/single-element-in-a-sorted-array.json +1 -0
- package/data/problems/single-number-ii.json +1 -0
- package/data/problems/single-number-iii.json +1 -0
- package/data/problems/single-number.json +1 -0
- package/data/problems/single-threaded-cpu.json +1 -0
- package/data/problems/sliding-puzzle.json +1 -0
- package/data/problems/sliding-window-maximum.json +1 -0
- package/data/problems/sliding-window-median.json +1 -0
- package/data/problems/smallest-good-base.json +1 -0
- package/data/problems/smallest-range-covering-elements-from-k-lists.json +1 -0
- package/data/problems/smallest-range-i.json +1 -0
- package/data/problems/smallest-range-ii.json +1 -0
- package/data/problems/smallest-rectangle-enclosing-black-pixels.json +1 -0
- package/data/problems/smallest-rotation-with-highest-score.json +1 -0
- package/data/problems/smallest-string-starting-from-leaf.json +1 -0
- package/data/problems/smallest-subtree-with-all-the-deepest-nodes.json +1 -0
- package/data/problems/snakes-and-ladders.json +1 -0
- package/data/problems/solve-the-equation.json +1 -0
- package/data/problems/sort-an-array.json +1 -0
- package/data/problems/sort-array-by-parity-ii.json +1 -0
- package/data/problems/sort-array-by-parity.json +1 -0
- package/data/problems/sort-characters-by-frequency.json +1 -0
- package/data/problems/sort-colors.json +1 -0
- package/data/problems/sort-list.json +1 -0
- package/data/problems/sort-transformed-array.json +1 -0
- package/data/problems/soup-servings.json +1 -0
- package/data/problems/sparse-matrix-multiplication.json +1 -0
- package/data/problems/special-binary-string.json +1 -0
- package/data/problems/spiral-matrix-ii.json +1 -0
- package/data/problems/spiral-matrix-iii.json +1 -0
- package/data/problems/spiral-matrix.json +1 -0
- package/data/problems/split-array-into-consecutive-subsequences.json +1 -0
- package/data/problems/split-array-into-fibonacci-sequence.json +1 -0
- package/data/problems/split-array-largest-sum.json +1 -0
- package/data/problems/split-array-with-equal-sum.json +1 -0
- package/data/problems/split-array-with-same-average.json +1 -0
- package/data/problems/split-bst.json +1 -0
- package/data/problems/split-concatenated-strings.json +1 -0
- package/data/problems/split-linked-list-in-parts.json +1 -0
- package/data/problems/sqrtx.json +1 -0
- package/data/problems/squares-of-a-sorted-array.json +1 -0
- package/data/problems/squirrel-simulation.json +1 -0
- package/data/problems/stamping-the-sequence.json +1 -0
- package/data/problems/stickers-to-spell-word.json +1 -0
- package/data/problems/stone-game-ii.json +1 -0
- package/data/problems/stone-game-iii.json +1 -0
- package/data/problems/stone-game.json +1 -0
- package/data/problems/strange-printer.json +1 -0
- package/data/problems/string-compression.json +1 -0
- package/data/problems/string-to-integer-atoi.json +1 -0
- package/data/problems/string-without-aaa-or-bbb.json +1 -0
- package/data/problems/strobogrammatic-number-ii.json +1 -0
- package/data/problems/strobogrammatic-number-iii.json +1 -0
- package/data/problems/strobogrammatic-number.json +1 -0
- package/data/problems/strong-password-checker.json +1 -0
- package/data/problems/student-attendance-record-i.json +1 -0
- package/data/problems/student-attendance-record-ii.json +1 -0
- package/data/problems/subarray-product-less-than-k.json +1 -0
- package/data/problems/subarray-sum-equals-k.json +1 -0
- package/data/problems/subarray-sums-divisible-by-k.json +1 -0
- package/data/problems/subarrays-with-k-different-integers.json +1 -0
- package/data/problems/subdomain-visit-count.json +1 -0
- package/data/problems/subsets-ii.json +1 -0
- package/data/problems/subsets.json +1 -0
- package/data/problems/substring-with-concatenation-of-all-words.json +1 -0
- package/data/problems/subtree-of-another-tree.json +1 -0
- package/data/problems/sudoku-solver.json +1 -0
- package/data/problems/sum-of-all-subset-xor-totals.json +1 -0
- package/data/problems/sum-of-distances-in-tree.json +1 -0
- package/data/problems/sum-of-even-numbers-after-queries.json +1 -0
- package/data/problems/sum-of-left-leaves.json +1 -0
- package/data/problems/sum-of-square-numbers.json +1 -0
- package/data/problems/sum-of-subarray-minimums.json +1 -0
- package/data/problems/sum-of-subsequence-widths.json +1 -0
- package/data/problems/sum-of-two-integers.json +1 -0
- package/data/problems/sum-root-to-leaf-numbers.json +1 -0
- package/data/problems/summary-ranges.json +1 -0
- package/data/problems/super-egg-drop.json +1 -0
- package/data/problems/super-palindromes.json +1 -0
- package/data/problems/super-pow.json +1 -0
- package/data/problems/super-ugly-number.json +1 -0
- package/data/problems/super-washing-machines.json +1 -0
- package/data/problems/surface-area-of-3d-shapes.json +1 -0
- package/data/problems/surrounded-regions.json +1 -0
- package/data/problems/swap-adjacent-in-lr-string.json +1 -0
- package/data/problems/swap-nodes-in-pairs.json +1 -0
- package/data/problems/swim-in-rising-water.json +1 -0
- package/data/problems/symmetric-tree.json +1 -0
- package/data/problems/tag-validator.json +1 -0
- package/data/problems/tallest-billboard.json +1 -0
- package/data/problems/target-sum.json +1 -0
- package/data/problems/task-scheduler.json +1 -0
- package/data/problems/teemo-attacking.json +1 -0
- package/data/problems/ternary-expression-parser.json +1 -0
- package/data/problems/text-justification.json +1 -0
- package/data/problems/the-maze-ii.json +1 -0
- package/data/problems/the-maze-iii.json +1 -0
- package/data/problems/the-maze.json +1 -0
- package/data/problems/the-skyline-problem.json +1 -0
- package/data/problems/third-maximum-number.json +1 -0
- package/data/problems/three-equal-parts.json +1 -0
- package/data/problems/time-based-key-value-store.json +1 -0
- package/data/problems/to-lower-case.json +1 -0
- package/data/problems/toeplitz-matrix.json +1 -0
- package/data/problems/top-k-frequent-elements.json +1 -0
- package/data/problems/top-k-frequent-words.json +1 -0
- package/data/problems/total-hamming-distance.json +1 -0
- package/data/problems/transform-to-chessboard.json +1 -0
- package/data/problems/transpose-matrix.json +1 -0
- package/data/problems/trapping-rain-water-ii.json +1 -0
- package/data/problems/trapping-rain-water.json +1 -0
- package/data/problems/triangle.json +1 -0
- package/data/problems/trim-a-binary-search-tree.json +1 -0
- package/data/problems/triples-with-bitwise-and-equal-to-zero.json +1 -0
- package/data/problems/two-sum-ii-input-array-is-sorted.json +1 -0
- package/data/problems/two-sum-iii-data-structure-design.json +1 -0
- package/data/problems/two-sum-iv-input-is-a-bst.json +1 -0
- package/data/problems/two-sum.json +1 -0
- package/data/problems/ugly-number-ii.json +1 -0
- package/data/problems/ugly-number.json +1 -0
- package/data/problems/uncommon-words-from-two-sentences.json +1 -0
- package/data/problems/unique-binary-search-trees-ii.json +1 -0
- package/data/problems/unique-binary-search-trees.json +1 -0
- package/data/problems/unique-email-addresses.json +1 -0
- package/data/problems/unique-morse-code-words.json +1 -0
- package/data/problems/unique-paths-ii.json +1 -0
- package/data/problems/unique-paths-iii.json +1 -0
- package/data/problems/unique-paths.json +1 -0
- package/data/problems/unique-substrings-in-wraparound-string.json +1 -0
- package/data/problems/unique-word-abbreviation.json +1 -0
- package/data/problems/univalued-binary-tree.json +1 -0
- package/data/problems/utf-8-validation.json +1 -0
- package/data/problems/valid-anagram.json +1 -0
- package/data/problems/valid-mountain-array.json +1 -0
- package/data/problems/valid-number.json +1 -0
- package/data/problems/valid-palindrome-ii.json +1 -0
- package/data/problems/valid-palindrome.json +1 -0
- package/data/problems/valid-parentheses.json +1 -0
- package/data/problems/valid-parenthesis-string.json +1 -0
- package/data/problems/valid-perfect-square.json +1 -0
- package/data/problems/valid-permutations-for-di-sequence.json +1 -0
- package/data/problems/valid-square.json +1 -0
- package/data/problems/valid-sudoku.json +1 -0
- package/data/problems/valid-tic-tac-toe-state.json +1 -0
- package/data/problems/valid-triangle-number.json +1 -0
- package/data/problems/valid-word-abbreviation.json +1 -0
- package/data/problems/valid-word-square.json +1 -0
- package/data/problems/validate-binary-search-tree.json +1 -0
- package/data/problems/validate-ip-address.json +1 -0
- package/data/problems/validate-stack-sequences.json +1 -0
- package/data/problems/verify-preorder-sequence-in-binary-search-tree.json +1 -0
- package/data/problems/verify-preorder-serialization-of-a-binary-tree.json +1 -0
- package/data/problems/verifying-an-alien-dictionary.json +1 -0
- package/data/problems/vertical-order-traversal-of-a-binary-tree.json +1 -0
- package/data/problems/vowel-spellchecker.json +1 -0
- package/data/problems/walking-robot-simulation.json +1 -0
- package/data/problems/walls-and-gates.json +1 -0
- package/data/problems/water-and-jug-problem.json +1 -0
- package/data/problems/wiggle-sort-ii.json +1 -0
- package/data/problems/wiggle-sort.json +1 -0
- package/data/problems/wiggle-subsequence.json +1 -0
- package/data/problems/wildcard-matching.json +1 -0
- package/data/problems/word-abbreviation.json +1 -0
- package/data/problems/word-break-ii.json +1 -0
- package/data/problems/word-break.json +1 -0
- package/data/problems/word-ladder-ii.json +1 -0
- package/data/problems/word-ladder.json +1 -0
- package/data/problems/word-pattern-ii.json +1 -0
- package/data/problems/word-pattern.json +1 -0
- package/data/problems/word-search-ii.json +1 -0
- package/data/problems/word-search.json +1 -0
- package/data/problems/word-squares.json +1 -0
- package/data/problems/word-subsets.json +1 -0
- package/data/problems/x-of-a-kind-in-a-deck-of-cards.json +1 -0
- package/data/problems/zigzag-conversion.json +1 -0
- package/data/problems/zigzag-iterator.json +1 -0
- package/data/problems/zuma-game.json +1 -0
- package/dist/cli.js +793 -0
- package/dist/web/assets/index-DCYvZg7a.js +150 -0
- package/dist/web/assets/index-gSBueMfH.css +1 -0
- package/dist/web/index.html +13 -0
- package/package.json +44 -4
package/dist/cli.js
ADDED
|
@@ -0,0 +1,793 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/cli.jsx
|
|
4
|
+
import React2 from "react";
|
|
5
|
+
import { render } from "ink";
|
|
6
|
+
import fs7 from "node:fs";
|
|
7
|
+
import path6 from "node:path";
|
|
8
|
+
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
9
|
+
|
|
10
|
+
// src/App.jsx
|
|
11
|
+
import React, { useEffect, useMemo, useState } from "react";
|
|
12
|
+
import fs5 from "node:fs";
|
|
13
|
+
import { Box, Text, useApp, useInput, useStdout } from "ink";
|
|
14
|
+
|
|
15
|
+
// src/data.js
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
|
+
var here = path.dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
var dataDir = path.resolve(here, "..", "data");
|
|
21
|
+
var indexCache;
|
|
22
|
+
function loadIndex() {
|
|
23
|
+
if (!indexCache) indexCache = JSON.parse(fs.readFileSync(path.join(dataDir, "index.json"), "utf8"));
|
|
24
|
+
return indexCache;
|
|
25
|
+
}
|
|
26
|
+
function loadProblem(slug) {
|
|
27
|
+
const f = path.join(dataDir, "problems", `${String(slug).replace(/[^a-z0-9-]/gi, "")}.json`);
|
|
28
|
+
return fs.existsSync(f) ? JSON.parse(fs.readFileSync(f, "utf8")) : null;
|
|
29
|
+
}
|
|
30
|
+
function filterProblems({ q = "", difficulty = "All", category = "" } = {}) {
|
|
31
|
+
const n = q.trim().toLowerCase();
|
|
32
|
+
return loadIndex().filter((p) => {
|
|
33
|
+
if (difficulty !== "All" && p.difficulty !== difficulty) return false;
|
|
34
|
+
if (category && p.category !== category) return false;
|
|
35
|
+
return !n || String(p.label) === n || p.title.toLowerCase().includes(n) || p.category.includes(n);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
var allCategories = () => [...new Set(loadIndex().map((p) => p.category))].sort();
|
|
39
|
+
function examplesMd(p) {
|
|
40
|
+
return (p.examples || []).map((e, i) => `**Example ${i + 1}**
|
|
41
|
+
|
|
42
|
+
\`\`\`
|
|
43
|
+
Input: ${e.input}
|
|
44
|
+
Output: ${e.output}${e.explanation ? `
|
|
45
|
+
|
|
46
|
+
${e.explanation}` : ""}
|
|
47
|
+
\`\`\``).join("\n\n");
|
|
48
|
+
}
|
|
49
|
+
var descriptionMd = (p) => `${p.statement.trim()}
|
|
50
|
+
|
|
51
|
+
${examplesMd(p)}`;
|
|
52
|
+
var hintsMd = (p) => p.hints.length ? p.hints.map((h, i) => `**Hint ${i + 1}.** ${h}`).join("\n\n") : "No hints.";
|
|
53
|
+
var solutionMd = (p) => p.solution.trim() || "No solution.";
|
|
54
|
+
function plain(md) {
|
|
55
|
+
return md.replace(/```[a-z]*\n?/g, "").replace(/\*\*(.*?)\*\*/g, "$1").replace(/`([^`]*)`/g, "$1").replace(/^#{1,6}\s*/gm, "").replace(/\n{3,}/g, "\n\n");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// src/scaffold.js
|
|
59
|
+
import fs2 from "node:fs";
|
|
60
|
+
import path2 from "node:path";
|
|
61
|
+
var LANGS = {
|
|
62
|
+
go: { label: "Go", ext: "go" },
|
|
63
|
+
python: { label: "Python", ext: "py" },
|
|
64
|
+
cpp: { label: "C++", ext: "cpp" }
|
|
65
|
+
};
|
|
66
|
+
var LANG_KEYS = Object.keys(LANGS);
|
|
67
|
+
var langFromExt = (f) => LANG_KEYS.find((k) => LANGS[k].ext === path2.extname(f).slice(1));
|
|
68
|
+
function solutionPath(p, lang, base = process.cwd()) {
|
|
69
|
+
return path2.join(base, "offcode", `${p.label}-${p.slug}`, `solution.${LANGS[lang].ext}`);
|
|
70
|
+
}
|
|
71
|
+
function scaffold(slug, lang = "go", base = process.cwd()) {
|
|
72
|
+
if (!LANGS[lang]) throw new Error(`lang must be one of: ${LANG_KEYS.join(", ")}`);
|
|
73
|
+
const p = loadProblem(slug);
|
|
74
|
+
if (!p) throw new Error(`problem not found: ${slug}`);
|
|
75
|
+
const file2 = solutionPath(p, lang, base);
|
|
76
|
+
if (fs2.existsSync(file2)) return { file: file2, created: false };
|
|
77
|
+
fs2.mkdirSync(path2.dirname(file2), { recursive: true });
|
|
78
|
+
let code = p.starter[lang];
|
|
79
|
+
if (lang === "go") code = code.replace(/\{\s*\}\s*$/, '{\n panic("not implemented")\n}');
|
|
80
|
+
if (lang === "python" && /:\s*$/.test(code)) code = code.trimEnd() + "\n pass";
|
|
81
|
+
fs2.writeFileSync(file2, code + "\n");
|
|
82
|
+
return { file: file2, created: true };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src/judge.js
|
|
86
|
+
import fs3 from "node:fs";
|
|
87
|
+
import os from "node:os";
|
|
88
|
+
import path3 from "node:path";
|
|
89
|
+
import { spawnSync } from "node:child_process";
|
|
90
|
+
var JUDGE_LANGS = ["go", "python"];
|
|
91
|
+
var TL_MS = 15e3;
|
|
92
|
+
function resolveArg(raw) {
|
|
93
|
+
if (typeof raw === "string" && raw.startsWith("@javascript:")) {
|
|
94
|
+
const v = new Function(`return (${raw.slice(12)})`)();
|
|
95
|
+
return typeof v === "string" ? v : JSON.stringify(v);
|
|
96
|
+
}
|
|
97
|
+
return raw;
|
|
98
|
+
}
|
|
99
|
+
var norm = (v) => v === null ? null : v;
|
|
100
|
+
function deepEq(a, b) {
|
|
101
|
+
if (Array.isArray(a) && Array.isArray(b)) return a.length === b.length && a.every((x, i) => deepEq(x, b[i]));
|
|
102
|
+
if (typeof a === "number" && typeof b === "number") return Math.abs(a - b) < 1e-5;
|
|
103
|
+
return a === b;
|
|
104
|
+
}
|
|
105
|
+
function canon(v) {
|
|
106
|
+
if (Array.isArray(v)) return JSON.stringify(v.map((x) => JSON.parse(canon(x))).sort((x, y) => JSON.stringify(x) < JSON.stringify(y) ? -1 : 1));
|
|
107
|
+
return JSON.stringify(v);
|
|
108
|
+
}
|
|
109
|
+
function same(got, exp, loose) {
|
|
110
|
+
if (got === null && Array.isArray(exp) && exp.length === 0) return true;
|
|
111
|
+
if (deepEq(norm(got), exp)) return true;
|
|
112
|
+
return loose && Array.isArray(got) && Array.isArray(exp) && canon(got) === canon(exp);
|
|
113
|
+
}
|
|
114
|
+
function parseGoSig(src) {
|
|
115
|
+
const m = src.match(/func\s+(\w+)\s*\(([^)]*)\)\s*([^{\n]*)\{/);
|
|
116
|
+
if (!m) throw new Error("Go: cannot find the solution function signature");
|
|
117
|
+
const raw = m[2].split(",").map((s) => s.trim()).filter(Boolean);
|
|
118
|
+
const params = [];
|
|
119
|
+
let pending = [];
|
|
120
|
+
for (const part of raw) {
|
|
121
|
+
const bits = part.split(/\s+/);
|
|
122
|
+
if (bits.length === 1) pending.push(bits[0]);
|
|
123
|
+
else {
|
|
124
|
+
for (const n of pending) params.push({ name: n, type: bits.slice(1).join(" ") });
|
|
125
|
+
pending = [];
|
|
126
|
+
params.push({ name: bits[0], type: bits.slice(1).join(" ") });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return { name: m[1], params, ret: m[3].trim() };
|
|
130
|
+
}
|
|
131
|
+
var GO_HELPERS = `
|
|
132
|
+
type ListNode struct { Val int; Next *ListNode }
|
|
133
|
+
type TreeNode struct { Val int; Left *TreeNode; Right *TreeNode }
|
|
134
|
+
func mkList(raw string) *ListNode { var a []int; json.Unmarshal([]byte(raw), &a); var h *ListNode; for i := len(a)-1; i >= 0; i-- { h = &ListNode{a[i], h} }; return h }
|
|
135
|
+
func mkLists(raw string) []*ListNode { var a [][]int; json.Unmarshal([]byte(raw), &a); r := make([]*ListNode, len(a)); for i, x := range a { for j := len(x)-1; j >= 0; j-- { r[i] = &ListNode{x[j], r[i]} } }; return r }
|
|
136
|
+
func mkTree(raw string) *TreeNode {
|
|
137
|
+
var a []*int; json.Unmarshal([]byte(raw), &a)
|
|
138
|
+
if len(a) == 0 || a[0] == nil { return nil }
|
|
139
|
+
root := &TreeNode{Val: *a[0]}; q := []*TreeNode{root}; i := 1
|
|
140
|
+
for len(q) > 0 && i < len(a) {
|
|
141
|
+
n := q[0]; q = q[1:]
|
|
142
|
+
if i < len(a) && a[i] != nil { n.Left = &TreeNode{Val: *a[i]}; q = append(q, n.Left) }; i++
|
|
143
|
+
if i < len(a) && a[i] != nil { n.Right = &TreeNode{Val: *a[i]}; q = append(q, n.Right) }; i++
|
|
144
|
+
}
|
|
145
|
+
return root
|
|
146
|
+
}
|
|
147
|
+
func chars(raw string) [][]byte { var a [][]string; json.Unmarshal([]byte(raw), &a); r := make([][]byte, len(a)); for i, x := range a { r[i] = make([]byte, len(x)); for j, s := range x { if len(s) > 0 { r[i][j] = s[0] } } }; return r }
|
|
148
|
+
func atoi(s string) int { n, _ := strconv.Atoi(strings.TrimSpace(s)); return n }
|
|
149
|
+
func ser(v interface{}) string {
|
|
150
|
+
switch x := v.(type) {
|
|
151
|
+
case *ListNode:
|
|
152
|
+
a := []int{}; for n := x; n != nil; n = n.Next { a = append(a, n.Val) }; b, _ := json.Marshal(a); return string(b)
|
|
153
|
+
case *TreeNode:
|
|
154
|
+
if x == nil { return "[]" }
|
|
155
|
+
out := []string{}; q := []*TreeNode{x}
|
|
156
|
+
for len(q) > 0 { n := q[0]; q = q[1:]; if n == nil { out = append(out, "null"); continue }; out = append(out, strconv.Itoa(n.Val)); q = append(q, n.Left, n.Right) }
|
|
157
|
+
for len(out) > 0 && out[len(out)-1] == "null" { out = out[:len(out)-1] }
|
|
158
|
+
return "[" + strings.Join(out, ",") + "]"
|
|
159
|
+
}
|
|
160
|
+
b, err := json.Marshal(v); if err != nil { return "null" }; return string(b)
|
|
161
|
+
}
|
|
162
|
+
`;
|
|
163
|
+
function goConv(t, i) {
|
|
164
|
+
const r = `raw[${i}]`;
|
|
165
|
+
if (t === "int") return `atoi(${r})`;
|
|
166
|
+
if (t === "string") return r;
|
|
167
|
+
if (t === "bool") return `${r} == "true"`;
|
|
168
|
+
if (t === "*ListNode") return `mkList(${r})`;
|
|
169
|
+
if (t === "[]*ListNode") return `mkLists(${r})`;
|
|
170
|
+
if (t === "*TreeNode") return `mkTree(${r})`;
|
|
171
|
+
if (t === "[][]byte") return `chars(${r})`;
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
function goHarness(sig) {
|
|
175
|
+
const decl = [];
|
|
176
|
+
const args2 = sig.params.map((p, i) => {
|
|
177
|
+
const c = goConv(p.type, i);
|
|
178
|
+
if (c) return c;
|
|
179
|
+
decl.push(`var a${i} ${p.type}; json.Unmarshal([]byte(raw[${i}]), &a${i})`);
|
|
180
|
+
return `a${i}`;
|
|
181
|
+
});
|
|
182
|
+
return `package main
|
|
183
|
+
import ("bufio";"encoding/json";"fmt";"os";"strconv";"strings")
|
|
184
|
+
${GO_HELPERS}
|
|
185
|
+
func run(raw []string) (res string, err string) {
|
|
186
|
+
defer func() { if r := recover(); r != nil { err = fmt.Sprint(r) } }()
|
|
187
|
+
${decl.join("\n ")}
|
|
188
|
+
return ser(${sig.name}(${args2.map((a, i) => a.startsWith("a") && /^a\d+$/.test(a) ? a : a).join(", ")})), ""
|
|
189
|
+
}
|
|
190
|
+
func main() {
|
|
191
|
+
rd := bufio.NewReaderSize(os.Stdin, 1<<26)
|
|
192
|
+
var tests [][]string
|
|
193
|
+
if err := json.NewDecoder(rd).Decode(&tests); err != nil { fmt.Println("{\\"fatal\\":\\"bad input\\"}"); return }
|
|
194
|
+
w := bufio.NewWriter(os.Stdout)
|
|
195
|
+
for _, t := range tests {
|
|
196
|
+
r, e := run(t)
|
|
197
|
+
if e != "" { eb, _ := json.Marshal(e); fmt.Fprintf(w, "{\\"error\\":%s}\\n", eb) } else { fmt.Fprintf(w, "{\\"out\\":%s}\\n", r) }
|
|
198
|
+
w.Flush()
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
`;
|
|
202
|
+
}
|
|
203
|
+
var PY_PRE = `from typing import *
|
|
204
|
+
import sys, json, collections, heapq, bisect, math, itertools, functools
|
|
205
|
+
from collections import *
|
|
206
|
+
class ListNode:
|
|
207
|
+
def __init__(self, val=0, next=None):
|
|
208
|
+
self.val = val
|
|
209
|
+
self.next = next
|
|
210
|
+
class TreeNode:
|
|
211
|
+
def __init__(self, val=0, left=None, right=None):
|
|
212
|
+
self.val = val
|
|
213
|
+
self.left = left
|
|
214
|
+
self.right = right
|
|
215
|
+
`;
|
|
216
|
+
var PY_POST = (fn, types) => `
|
|
217
|
+
def __mk_list(a):
|
|
218
|
+
h = None
|
|
219
|
+
for x in reversed(a): h = ListNode(x, h)
|
|
220
|
+
return h
|
|
221
|
+
def __mk_tree(a):
|
|
222
|
+
if not a or a[0] is None: return None
|
|
223
|
+
root = TreeNode(a[0]); q = collections.deque([root]); i = 1
|
|
224
|
+
while q and i < len(a):
|
|
225
|
+
n = q.popleft()
|
|
226
|
+
if i < len(a) and a[i] is not None: n.left = TreeNode(a[i]); q.append(n.left)
|
|
227
|
+
i += 1
|
|
228
|
+
if i < len(a) and a[i] is not None: n.right = TreeNode(a[i]); q.append(n.right)
|
|
229
|
+
i += 1
|
|
230
|
+
return root
|
|
231
|
+
def __ser(v):
|
|
232
|
+
if isinstance(v, ListNode):
|
|
233
|
+
r = []
|
|
234
|
+
while v: r.append(v.val); v = v.next
|
|
235
|
+
return r
|
|
236
|
+
if isinstance(v, TreeNode):
|
|
237
|
+
out = []; q = collections.deque([v])
|
|
238
|
+
while q:
|
|
239
|
+
n = q.popleft()
|
|
240
|
+
if n is None: out.append(None); continue
|
|
241
|
+
out.append(n.val); q.append(n.left); q.append(n.right)
|
|
242
|
+
while out and out[-1] is None: out.pop()
|
|
243
|
+
return out
|
|
244
|
+
if isinstance(v, (list, tuple, set)): return [__ser(x) for x in v]
|
|
245
|
+
return v
|
|
246
|
+
__types = ${JSON.stringify(types)}
|
|
247
|
+
def __conv(t, raw):
|
|
248
|
+
if t == 'int': return int(raw.strip())
|
|
249
|
+
if t == 'string': return raw
|
|
250
|
+
if t == 'boolean': return raw.strip() == 'true'
|
|
251
|
+
v = json.loads(raw)
|
|
252
|
+
if t == 'list_node': return __mk_list(v)
|
|
253
|
+
if t == 'list_node_array': return [__mk_list(x) for x in v]
|
|
254
|
+
if t == 'tree_node': return __mk_tree(v)
|
|
255
|
+
return v
|
|
256
|
+
def __main():
|
|
257
|
+
tests = json.load(sys.stdin)
|
|
258
|
+
sol = Solution()
|
|
259
|
+
f = getattr(sol, ${JSON.stringify(fn)})
|
|
260
|
+
for raw in tests:
|
|
261
|
+
try:
|
|
262
|
+
r = __ser(f(*[__conv(t, x) for t, x in zip(__types, raw)]))
|
|
263
|
+
sys.stdout.write(json.dumps({"out": r}) + "\\n")
|
|
264
|
+
except BaseException as e:
|
|
265
|
+
sys.stdout.write(json.dumps({"error": type(e).__name__ + ": " + str(e)}) + "\\n")
|
|
266
|
+
sys.stdout.flush()
|
|
267
|
+
__main()
|
|
268
|
+
`;
|
|
269
|
+
function pyMethod(src) {
|
|
270
|
+
const m = src.match(/class\s+Solution[\s\S]*?def\s+(\w+)\s*\(self/);
|
|
271
|
+
return m ? m[1] : null;
|
|
272
|
+
}
|
|
273
|
+
function judge({ slug, lang, code, filter }) {
|
|
274
|
+
const p = loadProblem(slug);
|
|
275
|
+
if (!p) throw new Error(`problem not found: ${slug}`);
|
|
276
|
+
if (!p.expected) return { verdict: "UNSUPPORTED", message: "No reference outputs for this problem (design/interactive/graph problem)." };
|
|
277
|
+
if (!JUDGE_LANGS.includes(lang)) return { verdict: "UNSUPPORTED", message: `Judge supports: ${JUDGE_LANGS.join(", ")} (C++ judge not built yet).` };
|
|
278
|
+
const tmp = fs3.mkdtempSync(path3.join(os.tmpdir(), "offcode-"));
|
|
279
|
+
try {
|
|
280
|
+
const tests = p.tests.map((t) => t.map(resolveArg));
|
|
281
|
+
let cmd2, args2;
|
|
282
|
+
const t0 = Date.now();
|
|
283
|
+
if (lang === "go") {
|
|
284
|
+
const sig = parseGoSig(code);
|
|
285
|
+
if (/^\s*type\s+(ListNode|TreeNode)\b/m.test(code)) throw new Error("Remove your own ListNode/TreeNode type: offcode provides it.");
|
|
286
|
+
fs3.writeFileSync(path3.join(tmp, "go.mod"), "module offcodejudge\n\ngo 1.18\n");
|
|
287
|
+
fs3.writeFileSync(path3.join(tmp, "solution.go"), code);
|
|
288
|
+
fs3.writeFileSync(path3.join(tmp, "harness.go"), goHarness(sig));
|
|
289
|
+
const b = spawnSync("go", ["build", "-o", path3.join(tmp, process.platform === "win32" ? "sol.exe" : "sol"), "."], { cwd: tmp, encoding: "utf8", timeout: 12e4 });
|
|
290
|
+
if (b.error) return { verdict: "ERROR", message: b.error.code === "ENOENT" ? "`go` not found in PATH" : b.error.message };
|
|
291
|
+
if (b.status !== 0) return { verdict: "CE", message: (b.stderr || b.stdout).replace(new RegExp(tmp.replace(/\\/g, "\\\\"), "g"), ".").trim() };
|
|
292
|
+
cmd2 = path3.join(tmp, process.platform === "win32" ? "sol.exe" : "sol");
|
|
293
|
+
args2 = [];
|
|
294
|
+
} else {
|
|
295
|
+
const fn = pyMethod(code);
|
|
296
|
+
if (!fn) throw new Error("Python: need `class Solution` with a method");
|
|
297
|
+
const types = p.params.map((x) => x.type === "boolean" ? "boolean" : x.type);
|
|
298
|
+
fs3.writeFileSync(path3.join(tmp, "sol.py"), PY_PRE + code + "\n" + PY_POST(fn, types));
|
|
299
|
+
const cands = process.platform === "win32" ? [["python"], ["py", "-3"], ["python3"]] : [["python3"], ["python"]];
|
|
300
|
+
const found = cands.find((c) => !spawnSync(c[0], [...c.slice(1), "--version"], { encoding: "utf8" }).error);
|
|
301
|
+
if (!found) return { verdict: "ERROR", message: "python not found in PATH" };
|
|
302
|
+
cmd2 = found[0];
|
|
303
|
+
args2 = [...found.slice(1), path3.join(tmp, "sol.py")];
|
|
304
|
+
}
|
|
305
|
+
const r = spawnSync(cmd2, args2, { input: JSON.stringify(tests), encoding: "utf8", env: { ...process.env, PYTHONIOENCODING: "utf-8", PYTHONUTF8: "1" }, windowsHide: true, timeout: TL_MS, maxBuffer: 1 << 28 });
|
|
306
|
+
if (r.error && r.error.code === "ENOENT") return { verdict: "ERROR", message: `\`${cmd2}\` not found in PATH` };
|
|
307
|
+
const lines = (r.stdout || "").split(/\r?\n/).filter(Boolean).map((l) => {
|
|
308
|
+
try {
|
|
309
|
+
return JSON.parse(l);
|
|
310
|
+
} catch {
|
|
311
|
+
return { error: l.slice(0, 200) };
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
const timedOut = r.error && r.error.code === "ETIMEDOUT";
|
|
315
|
+
const results = [];
|
|
316
|
+
let passed = 0;
|
|
317
|
+
for (let i = 0; i < tests.length; i++) {
|
|
318
|
+
const o = lines[i];
|
|
319
|
+
const input = p.params.map((x, k) => `${x.name} = ${String(tests[i][k]).slice(0, 120)}`).join(", ");
|
|
320
|
+
const exp = p.expected[i];
|
|
321
|
+
if (!o) {
|
|
322
|
+
results.push({ i, status: timedOut ? "TLE" : "RE", input, expected: exp, got: null, error: timedOut ? `exceeded ${TL_MS / 1e3}s` : (r.stderr || "").slice(0, 400) });
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
if (o.error) {
|
|
326
|
+
results.push({ i, status: "RE", input, expected: exp, got: null, error: o.error });
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
if (same(o.out, exp, p.loose)) {
|
|
330
|
+
passed++;
|
|
331
|
+
results.push({ i, status: "AC" });
|
|
332
|
+
} else {
|
|
333
|
+
results.push({ i, status: "WA", input, expected: exp, got: o.out });
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const fail = results.find((x) => x.status !== "AC");
|
|
338
|
+
return { verdict: fail ? fail.status : "AC", passed, total: tests.length, ms: Date.now() - t0, fail, results: results.map((x) => x.status) };
|
|
339
|
+
} catch (e) {
|
|
340
|
+
return { verdict: "ERROR", message: e.message };
|
|
341
|
+
} finally {
|
|
342
|
+
fs3.rmSync(tmp, { recursive: true, force: true });
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// src/progress.js
|
|
347
|
+
import fs4 from "node:fs";
|
|
348
|
+
import os2 from "node:os";
|
|
349
|
+
import path4 from "node:path";
|
|
350
|
+
var file = path4.join(os2.homedir(), ".offcode", "progress.json");
|
|
351
|
+
function loadProgress() {
|
|
352
|
+
try {
|
|
353
|
+
return JSON.parse(fs4.readFileSync(file, "utf8"));
|
|
354
|
+
} catch {
|
|
355
|
+
return {};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function markSolved(slug, lang) {
|
|
359
|
+
const p = loadProgress();
|
|
360
|
+
p[slug] = { lang, at: (/* @__PURE__ */ new Date()).toISOString() };
|
|
361
|
+
fs4.mkdirSync(path4.dirname(file), { recursive: true });
|
|
362
|
+
fs4.writeFileSync(file, JSON.stringify(p, null, 1));
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// src/App.jsx
|
|
366
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
367
|
+
var DIFFS = ["All", "Easy", "Medium", "Hard"];
|
|
368
|
+
var dcolor = (d) => ({ Easy: "green", Medium: "yellow", Hard: "red" })[d];
|
|
369
|
+
var next = (arr, v) => arr[(arr.indexOf(v) + 1) % arr.length];
|
|
370
|
+
function useSize() {
|
|
371
|
+
const { stdout } = useStdout();
|
|
372
|
+
const [s, setS] = useState({ w: stdout.columns || 100, h: stdout.rows || 30 });
|
|
373
|
+
useEffect(() => {
|
|
374
|
+
const f = () => setS({ w: stdout.columns || 100, h: stdout.rows || 30 });
|
|
375
|
+
stdout.on("resize", f);
|
|
376
|
+
return () => stdout.off("resize", f);
|
|
377
|
+
}, [stdout]);
|
|
378
|
+
return s;
|
|
379
|
+
}
|
|
380
|
+
function wrap(text, width) {
|
|
381
|
+
const out = [];
|
|
382
|
+
for (const raw of text.split("\n")) {
|
|
383
|
+
let line = raw.replace(/\t/g, " ");
|
|
384
|
+
if (!line) {
|
|
385
|
+
out.push("");
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
while (line.length > width) {
|
|
389
|
+
let cut = line.lastIndexOf(" ", width);
|
|
390
|
+
if (cut < width / 2) cut = width;
|
|
391
|
+
out.push(line.slice(0, cut));
|
|
392
|
+
line = line.slice(cut).trimStart();
|
|
393
|
+
}
|
|
394
|
+
out.push(line);
|
|
395
|
+
}
|
|
396
|
+
return out;
|
|
397
|
+
}
|
|
398
|
+
var Keys = ({ items }) => /* @__PURE__ */ jsx(Box, { children: items.map(([k, v]) => /* @__PURE__ */ jsxs(Box, { marginRight: 2, children: [
|
|
399
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: k }),
|
|
400
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
401
|
+
" ",
|
|
402
|
+
v
|
|
403
|
+
] })
|
|
404
|
+
] }, k)) });
|
|
405
|
+
function Top({ w, right }) {
|
|
406
|
+
return /* @__PURE__ */ jsxs(Box, { width: w, justifyContent: "space-between", paddingX: 1, children: [
|
|
407
|
+
/* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
408
|
+
"offcode ",
|
|
409
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "by Limon Das" })
|
|
410
|
+
] }),
|
|
411
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: right })
|
|
412
|
+
] });
|
|
413
|
+
}
|
|
414
|
+
function ListScreen({ onOpen, lang, setLang, progress }) {
|
|
415
|
+
const { exit } = useApp();
|
|
416
|
+
const { w, h } = useSize();
|
|
417
|
+
const [q, setQ] = useState("");
|
|
418
|
+
const [typing, setTyping] = useState(false);
|
|
419
|
+
const [diff, setDiff] = useState("All");
|
|
420
|
+
const [cursor, setCursor] = useState(0);
|
|
421
|
+
const items = useMemo(() => filterProblems({ q, difficulty: diff }), [q, diff]);
|
|
422
|
+
const bodyH = Math.max(6, h - 4);
|
|
423
|
+
const rows = bodyH - 2;
|
|
424
|
+
const top = Math.min(Math.max(0, cursor - Math.floor(rows / 2)), Math.max(0, items.length - rows));
|
|
425
|
+
const sel = items[cursor];
|
|
426
|
+
const leftW = Math.max(38, Math.floor(w * 0.52));
|
|
427
|
+
const rightW = w - leftW;
|
|
428
|
+
const preview = useMemo(() => {
|
|
429
|
+
if (!sel) return [];
|
|
430
|
+
const p = loadProblem(sel.slug);
|
|
431
|
+
return wrap(plain(descriptionMd(p)), rightW - 4).slice(0, rows);
|
|
432
|
+
}, [sel, rightW, rows]);
|
|
433
|
+
const solved = Object.keys(progress).length;
|
|
434
|
+
useInput((input, key) => {
|
|
435
|
+
if (typing) {
|
|
436
|
+
if (key.return || key.escape) setTyping(false);
|
|
437
|
+
else if (key.backspace || key.delete) {
|
|
438
|
+
setQ((s) => s.slice(0, -1));
|
|
439
|
+
setCursor(0);
|
|
440
|
+
} else if (input && !key.ctrl && !key.meta) {
|
|
441
|
+
setQ((s) => s + input);
|
|
442
|
+
setCursor(0);
|
|
443
|
+
}
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
if (input === "q") exit();
|
|
447
|
+
else if (input === "/") setTyping(true);
|
|
448
|
+
else if (input === "f") {
|
|
449
|
+
setDiff((d) => next(DIFFS, d));
|
|
450
|
+
setCursor(0);
|
|
451
|
+
} else if (input === "l") setLang((l) => next(LANG_KEYS, l));
|
|
452
|
+
else if (input === "c") {
|
|
453
|
+
setQ("");
|
|
454
|
+
setDiff("All");
|
|
455
|
+
setCursor(0);
|
|
456
|
+
} else if (key.downArrow || input === "j") setCursor((c) => Math.min(items.length - 1, c + 1));
|
|
457
|
+
else if (key.upArrow || input === "k") setCursor((c) => Math.max(0, c - 1));
|
|
458
|
+
else if (key.pageDown) setCursor((c) => Math.min(items.length - 1, c + rows));
|
|
459
|
+
else if (key.pageUp) setCursor((c) => Math.max(0, c - rows));
|
|
460
|
+
else if (input === "g") setCursor(0);
|
|
461
|
+
else if (input === "G") setCursor(items.length - 1);
|
|
462
|
+
else if (key.return && sel) onOpen(sel.slug);
|
|
463
|
+
});
|
|
464
|
+
const titleW = leftW - 4 - 6 - 8 - 4;
|
|
465
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: w, height: h - 1, children: [
|
|
466
|
+
/* @__PURE__ */ jsx(Top, { w, right: `${items.length} problems ${solved} solved ${LANGS[lang].label}` }),
|
|
467
|
+
/* @__PURE__ */ jsxs(Box, { paddingX: 1, children: [
|
|
468
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "search " }),
|
|
469
|
+
/* @__PURE__ */ jsx(Text, { color: typing ? "cyan" : void 0, children: q || (typing ? "" : "(press /)") }),
|
|
470
|
+
typing && /* @__PURE__ */ jsx(Text, { color: "cyan", children: "_" }),
|
|
471
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: " difficulty " }),
|
|
472
|
+
/* @__PURE__ */ jsx(Text, { color: dcolor(diff), bold: true, children: diff })
|
|
473
|
+
] }),
|
|
474
|
+
/* @__PURE__ */ jsxs(Box, { height: bodyH, children: [
|
|
475
|
+
/* @__PURE__ */ jsxs(Box, { width: leftW, borderStyle: "round", borderColor: typing ? "gray" : "cyan", flexDirection: "column", paddingX: 1, children: [
|
|
476
|
+
items.slice(top, top + rows).map((p, i) => {
|
|
477
|
+
const on = top + i === cursor;
|
|
478
|
+
const done = progress[p.slug];
|
|
479
|
+
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
480
|
+
/* @__PURE__ */ jsxs(Text, { color: on ? "cyan" : void 0, bold: on, children: [
|
|
481
|
+
on ? ">" : " ",
|
|
482
|
+
" "
|
|
483
|
+
] }),
|
|
484
|
+
/* @__PURE__ */ jsx(Text, { color: "green", children: done ? "\u2713" : " " }),
|
|
485
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: !on, children: [
|
|
486
|
+
" ",
|
|
487
|
+
String(p.label).padStart(4),
|
|
488
|
+
" "
|
|
489
|
+
] }),
|
|
490
|
+
/* @__PURE__ */ jsx(Text, { bold: on, wrap: "truncate-end", children: p.title.padEnd(titleW).slice(0, titleW) }),
|
|
491
|
+
/* @__PURE__ */ jsxs(Text, { color: dcolor(p.difficulty), children: [
|
|
492
|
+
" ",
|
|
493
|
+
p.difficulty.padEnd(6)
|
|
494
|
+
] })
|
|
495
|
+
] }, p.slug);
|
|
496
|
+
}),
|
|
497
|
+
!items.length && /* @__PURE__ */ jsx(Text, { dimColor: true, children: "no match" })
|
|
498
|
+
] }),
|
|
499
|
+
/* @__PURE__ */ jsx(Box, { width: rightW, borderStyle: "round", borderColor: "gray", flexDirection: "column", paddingX: 1, children: sel && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
500
|
+
/* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
501
|
+
sel.label,
|
|
502
|
+
". ",
|
|
503
|
+
sel.title
|
|
504
|
+
] }),
|
|
505
|
+
/* @__PURE__ */ jsxs(Text, { children: [
|
|
506
|
+
/* @__PURE__ */ jsx(Text, { color: dcolor(sel.difficulty), children: sel.difficulty }),
|
|
507
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
508
|
+
" ",
|
|
509
|
+
sel.category,
|
|
510
|
+
sel.judge ? "" : " (no judge)"
|
|
511
|
+
] })
|
|
512
|
+
] }),
|
|
513
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
514
|
+
preview.slice(0, rows - 3).map((l, i) => /* @__PURE__ */ jsx(Text, { children: l }, i))
|
|
515
|
+
] }) })
|
|
516
|
+
] }),
|
|
517
|
+
/* @__PURE__ */ jsx(Box, { paddingX: 1, children: typing ? /* @__PURE__ */ jsx(Keys, { items: [["enter", "done"], ["esc", "done"]] }) : /* @__PURE__ */ jsx(Keys, { items: [["j/k", "move"], ["enter", "open"], ["/", "search"], ["f", "filter"], ["l", "lang"], ["q", "quit"]] }) })
|
|
518
|
+
] });
|
|
519
|
+
}
|
|
520
|
+
var TABS = ["description", "hints", "solution", "judge"];
|
|
521
|
+
function Detail({ slug, lang, setLang, onBack, onSolved }) {
|
|
522
|
+
const { w, h } = useSize();
|
|
523
|
+
const p = useMemo(() => loadProblem(slug), [slug]);
|
|
524
|
+
const [tab, setTab] = useState("description");
|
|
525
|
+
const [scroll, setScroll] = useState(0);
|
|
526
|
+
const [msg, setMsg] = useState("");
|
|
527
|
+
const [result, setResult] = useState(null);
|
|
528
|
+
const [busy, setBusy] = useState(false);
|
|
529
|
+
const rows = Math.max(5, h - 9);
|
|
530
|
+
const file2 = solutionPath(p, lang);
|
|
531
|
+
const lines = useMemo(() => {
|
|
532
|
+
if (tab === "judge") return [];
|
|
533
|
+
const md = tab === "description" ? descriptionMd(p) : tab === "hints" ? hintsMd(p) : solutionMd(p);
|
|
534
|
+
return wrap(plain(md), w - 6);
|
|
535
|
+
}, [p, tab, w]);
|
|
536
|
+
const max = Math.max(0, lines.length - rows);
|
|
537
|
+
function runJudge() {
|
|
538
|
+
if (!JUDGE_LANGS.includes(lang)) {
|
|
539
|
+
setResult({ verdict: "UNSUPPORTED", message: `Judge supports go and python. Press l to switch.` });
|
|
540
|
+
setTab("judge");
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
if (!fs5.existsSync(file2)) {
|
|
544
|
+
setResult({ verdict: "ERROR", message: `No file yet. Press n to create ${file2}` });
|
|
545
|
+
setTab("judge");
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
setTab("judge");
|
|
549
|
+
setBusy(true);
|
|
550
|
+
setResult(null);
|
|
551
|
+
setTimeout(() => {
|
|
552
|
+
const r = judge({ slug, lang, code: fs5.readFileSync(file2, "utf8") });
|
|
553
|
+
setBusy(false);
|
|
554
|
+
setResult(r);
|
|
555
|
+
if (r.verdict === "AC") {
|
|
556
|
+
markSolved(slug, lang);
|
|
557
|
+
onSolved();
|
|
558
|
+
}
|
|
559
|
+
}, 60);
|
|
560
|
+
}
|
|
561
|
+
useInput((input, key) => {
|
|
562
|
+
if (busy) return;
|
|
563
|
+
if (key.escape || input === "b") onBack();
|
|
564
|
+
else if (key.downArrow || input === "j") setScroll((s) => Math.min(max, s + 1));
|
|
565
|
+
else if (key.upArrow || input === "k") setScroll((s) => Math.max(0, s - 1));
|
|
566
|
+
else if (key.pageDown || input === " ") setScroll((s) => Math.min(max, s + rows));
|
|
567
|
+
else if (key.pageUp) setScroll((s) => Math.max(0, s - rows));
|
|
568
|
+
else if (["1", "2", "3", "4"].includes(input)) {
|
|
569
|
+
setTab(TABS[Number(input) - 1]);
|
|
570
|
+
setScroll(0);
|
|
571
|
+
} else if (key.tab) {
|
|
572
|
+
setTab((t) => next(TABS, t));
|
|
573
|
+
setScroll(0);
|
|
574
|
+
} else if (input === "l") setLang((l) => next(LANG_KEYS, l));
|
|
575
|
+
else if (input === "n") {
|
|
576
|
+
try {
|
|
577
|
+
const r = scaffold(slug, lang);
|
|
578
|
+
setMsg(`${r.created ? "created" : "exists"}: ${r.file}`);
|
|
579
|
+
} catch (e) {
|
|
580
|
+
setMsg(e.message);
|
|
581
|
+
}
|
|
582
|
+
} else if (input === "r") runJudge();
|
|
583
|
+
});
|
|
584
|
+
const fail = result?.fail;
|
|
585
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: w, height: h - 1, children: [
|
|
586
|
+
/* @__PURE__ */ jsx(Top, { w, right: `${LANGS[lang].label}${p.expected ? "" : " (no judge)"}` }),
|
|
587
|
+
/* @__PURE__ */ jsxs(Box, { paddingX: 1, children: [
|
|
588
|
+
/* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
589
|
+
p.label,
|
|
590
|
+
". ",
|
|
591
|
+
p.title,
|
|
592
|
+
" "
|
|
593
|
+
] }),
|
|
594
|
+
/* @__PURE__ */ jsx(Text, { color: dcolor(p.difficulty), children: p.difficulty }),
|
|
595
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
596
|
+
" ",
|
|
597
|
+
p.category
|
|
598
|
+
] })
|
|
599
|
+
] }),
|
|
600
|
+
/* @__PURE__ */ jsx(Box, { paddingX: 1, children: TABS.map((t, i) => /* @__PURE__ */ jsx(Box, { marginRight: 1, children: /* @__PURE__ */ jsxs(Text, { inverse: t === tab, bold: t === tab, children: [
|
|
601
|
+
" ",
|
|
602
|
+
i + 1,
|
|
603
|
+
" ",
|
|
604
|
+
t,
|
|
605
|
+
" "
|
|
606
|
+
] }) }, t)) }),
|
|
607
|
+
/* @__PURE__ */ jsxs(Box, { borderStyle: "round", borderColor: "gray", flexDirection: "column", paddingX: 1, height: rows + 2, children: [
|
|
608
|
+
tab !== "judge" && lines.slice(scroll, scroll + rows).map((l, i) => /* @__PURE__ */ jsx(Text, { children: l }, i)),
|
|
609
|
+
tab === "judge" && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
610
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
611
|
+
"file: ",
|
|
612
|
+
file2
|
|
613
|
+
] }),
|
|
614
|
+
busy && /* @__PURE__ */ jsx(Text, { color: "yellow", children: "judging..." }),
|
|
615
|
+
!busy && !result && /* @__PURE__ */ jsx(Text, { dimColor: true, children: "press r to run the judge on your file" }),
|
|
616
|
+
result && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
617
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
618
|
+
/* @__PURE__ */ jsxs(Text, { bold: true, color: result.verdict === "AC" ? "green" : "red", children: [
|
|
619
|
+
result.verdict === "AC" ? "Accepted" : result.verdict,
|
|
620
|
+
result.total ? ` ${result.passed}/${result.total} tests ${result.ms} ms` : ""
|
|
621
|
+
] }),
|
|
622
|
+
result.message && wrap(result.message, w - 8).slice(0, rows - 4).map((l, i) => /* @__PURE__ */ jsx(Text, { color: "red", children: l }, i)),
|
|
623
|
+
fail && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
624
|
+
/* @__PURE__ */ jsxs(Text, { children: [
|
|
625
|
+
"test ",
|
|
626
|
+
fail.i + 1,
|
|
627
|
+
": ",
|
|
628
|
+
fail.status
|
|
629
|
+
] }),
|
|
630
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "input " }),
|
|
631
|
+
/* @__PURE__ */ jsx(Text, { children: fail.input }),
|
|
632
|
+
fail.expected !== void 0 && /* @__PURE__ */ jsxs(Text, { children: [
|
|
633
|
+
"expected ",
|
|
634
|
+
JSON.stringify(fail.expected).slice(0, w - 16)
|
|
635
|
+
] }),
|
|
636
|
+
fail.got !== void 0 && fail.got !== null && /* @__PURE__ */ jsxs(Text, { children: [
|
|
637
|
+
"got ",
|
|
638
|
+
JSON.stringify(fail.got).slice(0, w - 16)
|
|
639
|
+
] }),
|
|
640
|
+
fail.error && /* @__PURE__ */ jsx(Text, { color: "red", children: String(fail.error).slice(0, w - 10) })
|
|
641
|
+
] })
|
|
642
|
+
] })
|
|
643
|
+
] })
|
|
644
|
+
] }),
|
|
645
|
+
/* @__PURE__ */ jsx(Box, { paddingX: 1, children: /* @__PURE__ */ jsx(Text, { color: "cyan", children: msg }) }),
|
|
646
|
+
/* @__PURE__ */ jsx(Box, { paddingX: 1, children: /* @__PURE__ */ jsx(Keys, { items: [["1-4", "tab"], ["j/k", "scroll"], ["n", "new file"], ["r", "run judge"], ["l", "lang"], ["esc", "back"]] }) })
|
|
647
|
+
] });
|
|
648
|
+
}
|
|
649
|
+
function App() {
|
|
650
|
+
const [slug, setSlug] = useState(null);
|
|
651
|
+
const [lang, setLang] = useState("go");
|
|
652
|
+
const [progress, setProgress] = useState(loadProgress());
|
|
653
|
+
return slug ? /* @__PURE__ */ jsx(Detail, { slug, lang, setLang, onBack: () => setSlug(null), onSolved: () => setProgress(loadProgress()) }) : /* @__PURE__ */ jsx(ListScreen, { onOpen: setSlug, lang, setLang, progress });
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// src/server.js
|
|
657
|
+
import http from "node:http";
|
|
658
|
+
import fs6 from "node:fs";
|
|
659
|
+
import path5 from "node:path";
|
|
660
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
661
|
+
var here2 = path5.dirname(fileURLToPath2(import.meta.url));
|
|
662
|
+
var webDir = path5.join(here2, "web");
|
|
663
|
+
var MIME = { ".html": "text/html; charset=utf-8", ".js": "text/javascript", ".css": "text/css", ".svg": "image/svg+xml", ".json": "application/json" };
|
|
664
|
+
var send = (res, code, body) => {
|
|
665
|
+
res.writeHead(code, { "content-type": "application/json" });
|
|
666
|
+
res.end(JSON.stringify(body));
|
|
667
|
+
};
|
|
668
|
+
var readBody = (req) => new Promise((ok) => {
|
|
669
|
+
let b = "";
|
|
670
|
+
req.on("data", (c) => b += c);
|
|
671
|
+
req.on("end", () => ok(b));
|
|
672
|
+
});
|
|
673
|
+
function startServer({ port = 3e3, host = "127.0.0.1" } = {}) {
|
|
674
|
+
const server = http.createServer(async (req, res) => {
|
|
675
|
+
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
676
|
+
try {
|
|
677
|
+
if (url.pathname === "/api/meta") return send(res, 200, { categories: allCategories(), progress: loadProgress() });
|
|
678
|
+
if (url.pathname === "/api/problems") {
|
|
679
|
+
const items = filterProblems({ q: url.searchParams.get("q") || "", difficulty: url.searchParams.get("difficulty") || "All", category: url.searchParams.get("category") || "" });
|
|
680
|
+
return send(res, 200, { total: items.length, items });
|
|
681
|
+
}
|
|
682
|
+
if (url.pathname.startsWith("/api/problem/")) {
|
|
683
|
+
const p = loadProblem(decodeURIComponent(url.pathname.slice(13)));
|
|
684
|
+
if (!p) return send(res, 404, { error: "not found" });
|
|
685
|
+
return send(res, 200, {
|
|
686
|
+
slug: p.slug,
|
|
687
|
+
id: p.label,
|
|
688
|
+
title: p.title,
|
|
689
|
+
difficulty: p.difficulty,
|
|
690
|
+
category: p.category,
|
|
691
|
+
judge: !!p.expected,
|
|
692
|
+
starter: p.starter,
|
|
693
|
+
md: { description: descriptionMd(p), hints: hintsMd(p), solution: solutionMd(p) }
|
|
694
|
+
});
|
|
695
|
+
}
|
|
696
|
+
if (url.pathname === "/api/scaffold" && req.method === "POST") {
|
|
697
|
+
const { slug, lang } = JSON.parse(await readBody(req) || "{}");
|
|
698
|
+
return send(res, 200, scaffold(slug, lang in LANGS ? lang : "go"));
|
|
699
|
+
}
|
|
700
|
+
if (url.pathname === "/api/judge" && req.method === "POST") {
|
|
701
|
+
const { slug, lang, code } = JSON.parse(await readBody(req) || "{}");
|
|
702
|
+
const r = judge({ slug, lang, code });
|
|
703
|
+
if (r.verdict === "AC") markSolved(slug, lang);
|
|
704
|
+
return send(res, 200, r);
|
|
705
|
+
}
|
|
706
|
+
let rel = url.pathname === "/" ? "/index.html" : url.pathname;
|
|
707
|
+
const f = path5.join(webDir, path5.normalize(rel).replace(/^(\.\.[/\\])+/, ""));
|
|
708
|
+
if (!f.startsWith(webDir) || !fs6.existsSync(f) || fs6.statSync(f).isDirectory()) {
|
|
709
|
+
res.writeHead(404);
|
|
710
|
+
return res.end("not found");
|
|
711
|
+
}
|
|
712
|
+
res.writeHead(200, { "content-type": MIME[path5.extname(f)] || "application/octet-stream" });
|
|
713
|
+
fs6.createReadStream(f).pipe(res);
|
|
714
|
+
} catch (e) {
|
|
715
|
+
send(res, 500, { error: e.message });
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
return new Promise((resolve, reject) => {
|
|
719
|
+
server.once("error", reject);
|
|
720
|
+
server.listen(port, host, () => resolve({ server, url: `http://${host}:${port}` }));
|
|
721
|
+
});
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
// src/cli.jsx
|
|
725
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
726
|
+
var args = process.argv.slice(2);
|
|
727
|
+
var cmd = args[0];
|
|
728
|
+
var flag = (n, d) => {
|
|
729
|
+
const i = args.indexOf(`--${n}`);
|
|
730
|
+
return i > -1 ? args[i + 1] : d;
|
|
731
|
+
};
|
|
732
|
+
var HELP = `offcode by Limon Das (npm: offcode)
|
|
733
|
+
|
|
734
|
+
offcode terminal UI
|
|
735
|
+
offcode serve [--port 3000] web UI
|
|
736
|
+
offcode list [query] search problems
|
|
737
|
+
offcode pick <slug> [--lang go|python|cpp] create starter file in ./offcode/
|
|
738
|
+
offcode judge <file> judge ./offcode/<id>-<slug>/solution.go|py
|
|
739
|
+
offcode --version
|
|
740
|
+
`;
|
|
741
|
+
if (!cmd) {
|
|
742
|
+
const out = process.stdout;
|
|
743
|
+
out.write("\x1B[?1049h\x1B[H");
|
|
744
|
+
const app = render(/* @__PURE__ */ jsx2(App, {}));
|
|
745
|
+
app.waitUntilExit().then(() => {
|
|
746
|
+
out.write("\x1B[?1049l");
|
|
747
|
+
});
|
|
748
|
+
} else if (cmd === "serve") {
|
|
749
|
+
startServer({ port: Number(flag("port", 3e3)) }).then(({ url }) => console.log(`offcode web UI: ${url}`)).catch((e) => {
|
|
750
|
+
console.error(e.message);
|
|
751
|
+
process.exit(1);
|
|
752
|
+
});
|
|
753
|
+
} else if (cmd === "list") {
|
|
754
|
+
for (const p of filterProblems({ q: args[1] || "" }).slice(0, 60))
|
|
755
|
+
console.log(`${String(p.label).padStart(5)} ${p.title} [${p.difficulty}]${p.judge ? "" : " (no judge)"}`);
|
|
756
|
+
} else if (cmd === "pick") {
|
|
757
|
+
try {
|
|
758
|
+
const r = scaffold(args[1], flag("lang", "go"));
|
|
759
|
+
console.log(`${r.created ? "created" : "exists"}: ${r.file}`);
|
|
760
|
+
} catch (e) {
|
|
761
|
+
console.error(e.message, `
|
|
762
|
+
langs: ${LANG_KEYS.join(", ")}`);
|
|
763
|
+
process.exit(1);
|
|
764
|
+
}
|
|
765
|
+
} else if (cmd === "judge") {
|
|
766
|
+
const file2 = args[1];
|
|
767
|
+
if (!file2 || !fs7.existsSync(file2)) {
|
|
768
|
+
console.error("usage: offcode judge <file>");
|
|
769
|
+
process.exit(1);
|
|
770
|
+
}
|
|
771
|
+
const slug = path6.basename(path6.dirname(path6.resolve(file2))).replace(/^b?\d+-/, "");
|
|
772
|
+
const lang = langFromExt(file2);
|
|
773
|
+
if (!loadProblem(slug)) {
|
|
774
|
+
console.error(`cannot tell the problem from folder name: ${slug}`);
|
|
775
|
+
process.exit(1);
|
|
776
|
+
}
|
|
777
|
+
const r = judge({ slug, lang, code: fs7.readFileSync(file2, "utf8") });
|
|
778
|
+
if (r.verdict === "AC") markSolved(slug, lang);
|
|
779
|
+
console.log(r.verdict === "AC" ? `Accepted ${r.passed}/${r.total} ${r.ms} ms` : `${r.verdict}${r.total ? ` ${r.passed}/${r.total}` : ""}`);
|
|
780
|
+
if (r.message) console.log(r.message);
|
|
781
|
+
if (r.fail) {
|
|
782
|
+
console.log(`test ${r.fail.i + 1}: ${r.fail.input}`);
|
|
783
|
+
if (r.fail.expected !== void 0) console.log(`expected: ${JSON.stringify(r.fail.expected).slice(0, 300)}`);
|
|
784
|
+
if (r.fail.got !== void 0 && r.fail.got !== null) console.log(`got: ${JSON.stringify(r.fail.got).slice(0, 300)}`);
|
|
785
|
+
if (r.fail.error) console.log(r.fail.error);
|
|
786
|
+
}
|
|
787
|
+
process.exit(r.verdict === "AC" ? 0 : 1);
|
|
788
|
+
} else if (cmd === "--version" || cmd === "-v") {
|
|
789
|
+
const here3 = path6.dirname(fileURLToPath3(import.meta.url));
|
|
790
|
+
console.log(JSON.parse(fs7.readFileSync(path6.join(here3, "..", "package.json"), "utf8")).version);
|
|
791
|
+
} else {
|
|
792
|
+
console.log(HELP);
|
|
793
|
+
}
|