about summary refs log tree commit diff
path: root/scratch/deepmind
AgeCommit message (Collapse)AuthorFilesLines
2020-08-20 Drop support for dir-locals.nix, <nixpkgs>, etc.William Carroll3-4/+3
In the spirit of Marie Kondo, I'm tidying up! TL;DR: - Prefer .envrc `use_nix` and delete all dir-locals.nix files - Remove ~all references to <nixpkgs>, <unstable>, <depot> and prefer referencing each with briefcase.third_party.{pkgs,unstable,depot} - Delete nixBufferFromShell function since I was only using that in dir-locals.nix files
2020-03-31 Progress with InterviewCake's coin problemWilliam Carroll1-0/+102
I'm writing a function that returns the total number of ways a cashier can make change given the `amount` of change that the customer needs and an array of `coins` from which to create the change. My solution conceptually works but it actually does not return the results I am expecting because I cannot create a Set of Map<A, B> in JavaScript. I'm also somewhat sure that InterviewCake is expecting a less computationally expensive answer.
2020-03-30 Solve InterviewCake's compute nth FibonacciWilliam Carroll2-1/+73
While the "Dynamic programming and recursion" section hosts this problem, the optimal solution does not use recursion. Many cite the Fibonacci problem as a quintessential dynamic programming question. I assume these people expect an answer like: ```python def fib(n): cache = {0: 0, 1: 1} def do_fib(n): if n in cache: return cache[n] else: cache[n - 1] = do_fib(n - 1) cache[n - 2] = do_fib(n - 2) return cache[n - 1] + cache[n - 2] return do_fib(n) ``` The cache turns the runtime of the classic Fibonacci solution... ```python def fib(n): if n in {0, 1}: return n return fib(n - 1) + fib(n - 2) ``` ... from O(2^n) to a O(n). But both the cache itself and the additional stacks that the runtime allocates for each recursive call create an O(n) space complexity. InterviewCake wants the answer to be solved in O(n) time with O(1) space. To achieve this, instead of solving fib(n) from the top-down, we solve it from the bottom-up. I found this problem to be satisfying to solve.
2020-03-27 Run Prettier across projectsWilliam Carroll3-7/+13
Problem: Prettier was not running when I saved Emacs buffers. Why? - prettier-js-mode needs needs node; lorri exposes node to direnv; direnv exposes node to Emacs; lorri was not working as expected. Solution: Now that I'm using nix-buffer, I can properly expose node (and other dependencies) to my Emacs buffers. Now Prettier is working. Commentary: Since prettier hadn't worked for so long, I stopped thinking about it. As such, I did not include it as a dependency in boilerplate/typescript. I added it now. I retroactively ran prettier across a few of my frontend projects to unify the code styling. I may need to run... ```shell $ cd ~/briefcase $ nix-shell $ npx prettier --list-different "**/*.{js,ts,jsx,tsx,html,css,json}" ``` ...to see which files I should have formatted.
2020-03-27 Drop support for lorriWilliam Carroll3-4/+6
Lorri does not cleanly integrate with my corporate device, which cannot run NixOS. To expose dependencies to Emacs buffers, I will use nix-buffer.el, which reads its values from dir-locals.nix. To easily expose dependencies from my existing shell.nix files into dir-locals.nix, I wrote a Nix utility function.
2020-03-26 Solve InterviewCake's recursive string permutations problemWilliam Carroll2-1/+86
Write a function that returns the set of all of the possible permutations of an input string. This function should be solved recursively.
2020-03-26 Solve InterviewCake's find duplicate beast modeWilliam Carroll2-2/+116
Write a function to find a duplicate item in a list of numbers. The values are in the range [1, n]; the length of the list is n + 1. The solution should run in linear time and consume constant space. The solution is to construct a graph from the list. Each graph will have a cycle where the last element in the cycle is a duplicate value. See the solution for specific techniques on how to compute the length the cycle without infinitely looping.
2020-03-20 Solve InterviewCake.com's mesh-message problemWilliam Carroll2-1/+184
Write a function that returns the shortest path between nodes A and B in an unweighted graph. I know two algorithms for finding the shortest path in a *weighted* graph: - Use a heap as a priority queue instead of the regular queue that you would use when doing a BFT. This is called Dijkstra's algorithm. You can also use Dijkstra's algorithm in an unweight graph by imaginging that all of the weights on the edges are the same value (e.g. 1). - Map the weighted graph into an unweighted graph by inserting N nodes between each node, X and Y, where N is equal to the weight of the edge between X and Y. After you map the weighted graph into an unweighted graph, perform a BFT from A to B. A BFT will always find the shortest path between nodes A and B in an unweighted graph. I had forgotten that a BFT in an unweighted graph will always return the shortest path between two nodes. I learned two things from InterviewCake.com's solution: 1. I remembered that a BFT in an unweighted graph will return the shortest path (if one exists). 2. I learned to use a dictionary to store the edge information and then back-tracking to reconstruct the shortest path.
2020-03-19 Solve InterviewCake's graph-coloring problemWilliam Carroll3-1/+240
Write a function that colors the nodes of a graph such that no two neighbors share a color.
2020-03-16 Solve InterviewCake's second-largest-item-in-bstWilliam Carroll2-2/+221
Return a function that returns the second largest item in a binary search tree (i.e. BST). A BST is a tree where each node has no more than two children (i.e. one left child and one right child). All of the values in a BST's left subtree must be less than the value of the root node; all of the values in a BST's right subtree must be greater than the value of the root node; both left and right subtrees must also be BSTs themselves. I solved this problem thrice -- improving the performance profile each time. The final solution has a runtime complexity of O(n) and a spacetime complexity of O(1).
2020-03-15 Solve InterviewCake's bst-checker problemWilliam Carroll2-2/+112
Write a function that returns true if a given binary tree is a valid binary search tree (i.e. if all of root's left nodes are less than root.value, all of root's right nodes are greater than root.value, and both left and right subtrees are also valid binary search trees).
2020-03-14 Solve InterviewCake's balanced-binary-tree problemWilliam Carroll2-2/+128
Write a predicate for determining if a binary tree is "super balanced", which means that the depths of all of the tree's leaves are equal or differ by at most one.
2020-03-14 Mark duplicate InterviewCake questions as DONEWilliam Carroll1-2/+2
I wrongfully assumed that the relationship between a question and a question category was one-to-one; it is actually one-to-many. This explains why I completed the "Cafe Order Checker" and "Top Scores" questions twice. I'm marking the questions that I've completed as DONE because I would prefer to do every question once and then prioritize repeating the questions with which I experienced difficulty.
2020-03-13 Add default value for pkgs parameter in shell.nixWilliam Carroll1-1/+1
Commands like `nix-shell shell.nix` couldn't resolve `pkgs` without a default value. I'm unsure how I expected this to work previously...
2020-03-13 Solve InterviewCake's top-scores problemWilliam Carroll2-1/+59
Write a function to sort a list of scores for a game in linear time. While I had previously solved this in python, I hadn't marked the todo.org file, so I ended up doing this again. "Perfect practice makes perfect."
2020-03-10 WIP: Partially solve InterviewCake's find duplicate numberWilliam Carroll1-0/+70
Write a function that finds one duplicate number from a list of numbers 1..n. The function should satisfy the following performance objectives: Runtime complexity: O(n*log(n)) Space complexity: O(1)
2020-03-10 Solve InterviewCake's "find rotation point" problemWilliam Carroll2-1/+69
Write a function that accepts a rotated cycle of alphabetically sorted strings and returns the index what should be the first element if the elements were not rotated.
2020-03-06 Implement an in-place shuffling algorithmWilliam Carroll2-2/+22
I believe this may be the Fisher-Yates shuffle, but I'm not sure.
2020-03-02 Solve InterviewCake's product-of-other-numbersWilliam Carroll2-1/+69
This problem challenged me: without using division, write a function that maps a list of integers into a list of the product of every integer in the list except for the integer at that index. This was another greedy algorithm. The take-away is to first solve the problem using brute force; this yields an algorithm with O(n*(n-1)) time complexity. Instead of a quadratic time complexity, a linear time complexity can be achieved my iterating over the list of integers twice: 1. Compute the products of every number to the left of the current number. 2. Compute the products of every number to the right of the current number. Finally, iterate over each of these and compute lhs * rhs. Even though I've solved this problem before, I used InterviewCake's hints because I was stuck without them. I should revisit this problem in a few weeks.
2020-03-01 Solve InterviewCake's highest-product-of-3William Carroll2-1/+82
Write a function that returns the highest product of three integers within a list of integers. This solution uses a greedy algorithm that solves for the answer in linear time. The space complexity is constant.
2020-03-01 Remove HTML-encoded quoteWilliam Carroll1-1/+1
Prefer ' to &#39;
2020-03-01 Solve InterviewCake's stock-price problemWilliam Carroll2-1/+55
Write a function that returns the maximum profit that a trader could have made in a day. I solved this using a greedy algorithm which constantly sets the maximum profit by tracking the lowest price we've encountered.
2020-03-01 Solve InterviewCake's top-scoresWilliam Carroll2-1/+48
Using a counting sort to sort a list of values in linear time.
2020-03-01 Solve InterviewCake's word-cloud problemWilliam Carroll2-1/+80
Write a function to count the frequency of words in a sentence. Ignore casing for words; ignore punctuation.
2020-03-01 Solve InterviewCake permutation-palindrome problemWilliam Carroll2-1/+38
Write a predicate to test whether any permutation of an input string is a palindrome.
2020-03-01 Remove default values for Nix expression parametersWilliam Carroll1-1/+1
I'm not sure if this commit breaks everything in my monorepo. I think it will. Why am I doing this? Perhaps it's a bad idea. I don't fully understand how readTree works. My ignorance is costing me hours of time spent debugging. In an effort to better understand readTree, I'm removing the default values for my Nix expression parameters, which I believe have preventing errors from surfacing.
2020-02-21 Solve InterviewCake's inflight-entertainment problemWilliam Carroll2-1/+86
Write a predicate that tests whether two films in a list of films can exactly fill the duration of a flight.
2020-02-20 Solve InterviewCake's cafe-order-checker problemWilliam Carroll2-1/+65
Write a predicate that tests if a given list of integers, zs, is a possible interleaving of two other lists, xs and ys.
2020-02-19 Solve InterviewCake's merge sorted arrays questionWilliam Carroll2-1/+64
Write a function merging two sorted arrays into one sorted array.
2020-02-19 Solve bonus part of reverse-wordsWilliam Carroll1-0/+11
InterviewCake asks "How would you handle punctuation?". Without precise specs about what that entails, I'm supporting sentences ending with punctuation.
2020-02-19 Solve InterviewCake's reverse-wordsWilliam Carroll2-1/+64
Wrote a function to reverse the words in a list of characters. A word is a space-delimited strings of characters. The trick here is to first reverse the entire string and then reverse each word individually.
2020-02-13 Solve merging-rangesWilliam Carroll2-1/+116
Write a function to merge meeting times. Added an in-place solution, which the "Bonus" section suggested attempting to solve. - Added some simple benchmarks to test the performance differences between the in-place and not-in-place variants. To my surprise, the in-place solution was consistently slower than the not-in-place solution.
2020-02-12 Tidy up structure of briefcaseWilliam Carroll19-0/+945
I had a spare fifteen minutes and decided that I should tidy up my monorepo. The work of tidying up is not finished; this is a small step in the right direction. TL;DR - Created a tools directory - Created a scratch directory (see README.md for more information) - Added README.md to third_party - Renamed delete_dotfile_symlinks -> symlinkManager - Packaged symlinkManager as an executable symlink-mgr using buildGo