Skip to content

Instantly share code, notes, and snippets.

View bsidhom's full-sized avatar

Ben Sidhom bsidhom

View GitHub Profile
@bsidhom
bsidhom / vanguard-unrealized-lots.js
Created March 22, 2024 02:41
Extract unrealized lot data from Vanguard accounts
let main = async (account, units) => {
const scrapeAccount = (accountWidget) => {
const accountId = accountWidget.id;
const accountName = accountWidget
.querySelector("span.c11n-accordion__heading")
.innerText.trim();
const holdingsLinks = [
...accountWidget.querySelectorAll(
`app-holdings tr[app-holdings-row] div.holdings-link`
),
@bsidhom
bsidhom / vanguard-lots-to-beancount.js
Created March 21, 2024 22:12
Convert Vanguard realized lots to the legs of a Beancount transaction. Mostly useful for establishing opening balances given a large set of lots.
let main = () => {
const datePattern = new RegExp(`(\\d{2})/(\\d{2})/(\\d{4})`);
const extractDate = (s) => {
const m = s.match(datePattern);
const month = m[1];
const day = m[2];
const year = m[3];
return `${year}-${month}-${day}`;
};
const extractLot = (row) => {
@bsidhom
bsidhom / migrate-links.py
Last active February 26, 2024 14:49
Update symlinks under a directory root after moving from one location to another
@bsidhom
bsidhom / dump-links.py
Last active February 26, 2024 11:06
Dump FS symlinks as JSON
@bsidhom
bsidhom / extract-gemcraft-levels.js
Last active January 7, 2024 00:34
Extract Gemcraft: Chasing Shadows level metadata
// Extract level metadata from https://gemcraft.fandom.com/wiki/GemCraft_Chapter_2:_Chasing_Shadow_Fields
let extractLevels = () => {
const extractGemTypes = (cell) => {
const anchors = [...cell.querySelectorAll("a")];
return anchors.map((a) => a.title);
};
const extractText = (cell) => {
const s = cell.innerText.trim();
if (s.length == 0) {
@bsidhom
bsidhom / partitions.py
Last active December 8, 2023 18:46
Generate integer partitions and compositions
#!/usr/bin/env python3
def main():
print("partitions of 5:")
for p in partitions(5):
print(p)
print()
print("compositions of 5:")
for c in compositions(5):
@bsidhom
bsidhom / babynames.py
Created November 4, 2023 06:50
Merge SSA baby names dataset into a flat CSV
#!/usr/bin/env python3
# Baby names zip can be downloaded from https://www.ssa.gov/oact/babynames/names.zip
import argparse
import csv
import io
import re
import sys
import zipfile
@bsidhom
bsidhom / stolen_rubies.py
Created October 29, 2023 04:32
Stolen Rubies riddle
#!/usr/bin/env python3
# Solves the stolen rubies riddle: https://www.youtube.com/watch?v=2QJ2L2ip32w
import itertools
def main():
configs = unique_configs(gen_chests())
# For each "reasonable" strategy (possibly assigning a different number to
@bsidhom
bsidhom / banana_camel_puzzle.py
Created October 28, 2023 00:43
Banana Camel puzzle
#!/usr/bin/env python3
# Approximately solves the camel/bananas problem from
# https://www.youtube.com/watch?v=pDoar4zh5tI.
# NOTE: I really enjoyed going back to this from a fresh perspective as
# I first saw it many years ago as a problem in a math class.
# The approach here is to _assume_ you are moving bananas in segments of a fixed
# length, d, and then ask how many bananas you can move in total with segments
@bsidhom
bsidhom / one_hundred_switches_one_hundred_lights.py
Created October 28, 2023 00:30
100 switches/100 lights puzzle
#!/usr/bin/env python3
# Solves https://www.youtube.com/watch?v=ltsx5389iEs
# The idea is to identify all lights in ⌈log2(n)⌉ moves by assigning each bulb
# an integer and using the unique bit representation of each as the sequence of
# light switches for which it was powered on (1 means it was on for a given
# trial, 0 means it was off).
# NOTE: The bit representation + transpose operation makes the logic most clear,