about summary refs log tree commit diff
path: root/scratch (follow)
AgeCommit message (Collapse)AuthorFilesLines
2020-08-20 Move scratch/brilliant into //assessmentsWilliam Carroll10-426/+0
Where it belongs...
2020-08-20 Drop support for dir-locals.nix, <nixpkgs>, etc.William Carroll7-17/+15
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-08-20 Revise previous opinions about absolute paths GT <bracket-notation>William Carroll1-1/+1
Unforeseen problem: `buildkite-agent` runs its builds in a separate directory, so if I want the `nix-build` command to build the newly checked out code, I need to set <briefcase> to the CWD.
2020-08-12 Consume buildHaskell functionsWilliam Carroll1-20/+10
Use the newly defined `buildHaskell` function for a few of my existing Haskell projects. So far, it works as intended!
2020-08-12 Prefer snake-shift instead of a row-by-row shiftWilliam Carroll5-37/+57
Per the assignment's instructions, the `Shift n` operation should treat the *entire keyboard* like a cycle and shift that. I was erroneously treating *each row* like a cycle and shifting those one-by-one. This change fixes that. In addition, it also: - Updates README.md with expected inputs and outputs - Updates test suite - Adds `split` dependency to {default,shell}.nix
2020-08-12 Adds property tests to generically test keyboard transformationsWilliam Carroll1-1/+25
Tests: - HorizontalFlip - VerticalFlip - Shift n
2020-08-12 Prefer literal, not computed, examples in the unit testsWilliam Carroll1-21/+19
TL:DR: - Remove unused imports: Test.QuickCheck and Control.Exception - Remove calls to `reverse` and `Utils.rotate` with their results
2020-08-12 Provide more useful instructions for building this projectWilliam Carroll3-18/+67
TL;DR: - include a default.nix to allow users to build an named executable - emphasize in the README that the user needs Nix to build this project - pin nixpkgs to a specific commit and fetch it from GitHub
2020-08-12 Generate coords function from existing qwerty keyboardWilliam Carroll1-44/+8
Per my take-home assignment's reviewer's comments, with which for the record I agree, I should generate the character->coordinate table from my existing qwerty keyboard definition. The best part is: by doing this I found a bug: Notice how the original '0' character was mapped to the Coordinate (0,0)... thus every subsequent digit key (i.e. the first row) is off-by-one.
2020-08-06 Re-type type using the altered keyboardWilliam Carroll5-7/+129
Remember: always read the instructions; that's the most important part.
2020-08-06 Support Transforms.optimizeWilliam Carroll2-0/+19
Partially optimize inputs and document rules for further optimizations we can make.
2020-08-05 Apply a series of transformation to a QWERTY keyboardWilliam Carroll4-32/+51
TL;DR: - Accept input from the CLI - Add a project README.md
2020-08-05 Support App.transformWilliam Carroll5-1/+57
Apply the transform to a Keyboard. Onwards to the final demonstration!
2020-08-05 Support parsing the list of transformsWilliam Carroll2-7/+65
Using Haskell's Text.ParserCombinators.ReadP library for the first time, and I enjoyed it thoroughly! It's nice avoiding a third-party library like MegaParsec.
2020-08-05 Define an instance for Show for a KeyboardWilliam Carroll1-0/+23
This will help me debug.
2020-08-05 Create a Utils moduleWilliam Carroll1-0/+8
To stylize things...
2020-08-05 Add some the scaffolding for testingWilliam Carroll2-0/+20
As I attempt to habituate TDD, I should have some examples of tests to minimize all friction preventing me from testing.
2020-08-04 Create small command line program that parses argumentsWilliam Carroll3-0/+56
Before starting my take-home assignment, the instructions advised me to create a "Hello, world" program in the language of my choice. Since I'm choosing Haskell, I created this example as my starter boilerplate.
2020-07-20 Move AOC into //scratchWilliam Carroll8-0/+701
Also rename it advent-of-code-2019 since I expect to participate this year as well. TODO: Should directories and files be name like-this or like_this?
2020-07-17 Partially complete IO chapter exercisesWilliam Carroll1-0/+35
Inconveniently, I do not have the cipher code that I wrote from a previous chapter, and I'm not eager to reimplement it. TODO - Implement encrypt - Implement decrypt - Read all characters from STDIN
2020-07-17 Update grocery listWilliam Carroll1-13/+33
- Add new entries - Change quantities of existing entries
2020-07-17 Partially complete the "Basic Libraries" chapter exercisesWilliam Carroll1-0/+60
I was instructed to benchmark these functions, but I couldn't get the benchmarking library to run using Nix -- although I'm *sure* it's possible. Unfortunately the book recommends using `stack`, which I couldn't reproduce.
2020-07-14 Complete exercises for "Non-Strictness" chapterWilliam Carroll1-0/+6
I completed most of the exercises for this enlightening chapter in ghci.
2020-07-12 Finish exercises for Monad Transformer chapterWilliam Carroll1-6/+110
I expect to look back on this code and cringe, but... it compiles!
2020-07-12 Partially complete Monad Transformer exercisesWilliam Carroll1-0/+79
Write Functor, Applicative, Monad instances for: - MaybeT - EitherT - ReaderT
2020-07-11 Partially complete some of the exercises for Composing TypesWilliam Carroll1-0/+75
I believe there are two exercises sets in the "Composing Types" chapter. Here are *some* of my answers so far... I'm having trouble implementing Foldable for Compose. I was able to implement a version of it by adding the (Functor f) constraint to the instance signature, but I think I cheated. I will revisit these problems as well as the earlier exercises later.
2020-07-01 Impl part 3/3 for MemoWilliam Carroll1-29/+10
Refactor the caching policy for the Memo by evicting the elements that have been the least-recently-accessed. Python's heapq module default to a min-heap. By storing our heap elements as (UnixTime, a), we can guarantee that when we call heappop, we will get the element with the lowest UnixTime value in heap (i.e. the oldest). When we call heappush, we use (time.time(), key) and these values -- by having the largest UnixTime, will propogate to the bottom of the min-heap.
2020-07-01 Support part 2/3 for the Memo problemWilliam Carroll1-4/+64
Bound the size of the memo by creating a BoundedQueue. Whenever we add elements to the BoundedQueue, we remove the oldest elements. We use the BoundedQueue to control the size of our dictionary that we're using to store our key-value pairs.
2020-07-01 Implement part 1/3 for "Memo"William Carroll1-0/+19
After hearing from a Jane Street recruiter, I decided to dust off some of the DS&As knowledge. I found this article online, which outlines an example problem called "Memo": https://blog.janestreet.com/what-a-jane-street-dev-interview-is-like/ Here's part 1 of the solution in Python.
2020-07-01 Convert grocery list to an .org fileWilliam Carroll2-18/+15
Ensure that the export.hs script refers to the .org file.
2020-07-01 Complete exercises for Reader and State chaptersWilliam Carroll2-0/+242
It's beautiful how State is just Reader that returns a tuple of (a, r) instead of just a, allowing you to modify the environment (i.e. state). ```haskell newtype Reader r a = Reader { runReader :: r -> a } newtype State s a = State { runState :: s -> (a, s) } ```
2020-07-01 Create a .ghci for this directoryWilliam Carroll1-0/+1
I would've created on at $HOME/.ghci, but I don't need that yet, and I didn't want to bother with home-manager.
2020-07-01 Complete exercises from Traversable chapterWilliam Carroll1-0/+131
I feel much more comfortable using `traverse` and `sequenceA`. I even used both of them in the Haskell program that I wrote at work to export a trix.
2020-06-27 Group groceries/listWilliam Carroll1-31/+43
- Change list.txt -> list.org - Group groceries by category - Sort categories by store layout
2020-06-27 Add export script for groceriesWilliam Carroll4-43/+69
At this point, I may be taking this idea too far, but what the heck?
2020-06-18 Create Nix shell for Haskell scratchpadWilliam Carroll1-0/+10
Helps me run my chapter exercises.
2020-06-18 Complete the Monad chapterWilliam Carroll1-0/+178
From "Haskell Programming from First Principles"... I have completed all of the exercises in the book thus far, but I only recently dedicated a Haskell module for each chapter. Previously I created ad hoc modules per exercise, per chapter... it was chaotic.
2020-06-18 Complete exercises from Applicative chapterWilliam Carroll1-0/+213
From "Haskell Programming from First Principles"...
2020-06-18 Complete exercises from Foldable chapterWilliam Carroll1-0/+107
I'm creating Haskell modules to host my attempts and solutions for the exercises defined in each chapter of "Haskell Programming From First Principles".
2020-06-16 Add grocery list for ShaalseeWilliam Carroll1-0/+43
Mimi and I will go to the grocery store every Monday here. If we track what we buy, we can easily generate grocery lists that get better over time.
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).