Skip to content

Instantly share code, notes, and snippets.

View sciyoshi's full-sized avatar

Samuel Cormier-Iijima sciyoshi

View GitHub Profile
BEGIN MESSAGE.
65hLapBEOn4NOxF egwcqIO20ortY0d na6S7EY81Qh8tCs QSLVmAVHIqqn3ad
h29hB5xx5GvRGgE aVFTWvLjWLkTCKq 6Xr2MZHgg6SdpCJ TM9zHVJotbsq3wI
lAtXO8mikSV1xga sUzGicn8NsMBiUU nTW4dABMOWXRxE1 nbIuenrRNb9lyhP
vCe0UMMbuselAJl g3V2jeGTpVJPxt6 UtPtN0Qz5Z.
END MESSAGE.
import numpy as np
from scipy.ndimage import convolve
lines = INPUT.splitlines()
alg = [i for i, c in enumerate(lines[0]) if c == "#"]
img = np.pad(np.array([[int(c == "#") for c in l] for l in lines[2:]]), ((50, 50), (50, 50)))
rot = np.array([[1, 2, 4], [8, 16, 32], [64, 128, 256]])
for i in range(50):
img = np.isin(convolve(img, rot, mode="constant", cval=i % 2), alg).astype(int)
def convert(l, d=0):
for i, e in enumerate(l):
if isinstance(e, list):
yield from convert(e, d + 1)
else:
yield (e, d)
def reduce(l):
c = list(l)
from utils import Pt, Grd
import math
grd = Grd()
for i, l in enumerate(LINES):
for j, c in enumerate(l):
grd[Pt(i, j)] = int(c)
def expand(pt):
@sciyoshi
sciyoshi / esbuild-relay.js
Created February 19, 2021 16:34
Esbuild plugin for compiling relay queries
import { promises } from "fs";
import crypto from "crypto";
import path from "path";
import { print, parse } from "graphql";
const plugin = {
name: "relay",
setup: build => {
build.onLoad({ filter: /\.tsx$/, namespace: "" }, async args => {
let contents = await promises.readFile(args.path, "utf8");
import collections
all_ingredients = collections.Counter()
possible_ingredients = collections.defaultdict(set)
for line in open("inputs/day21").read().splitlines():
ingredients, allergens = line.rstrip(")").split(" (contains ")
ingredients = ingredients.split()
allergens = allergens.split(", ")
all_ingredients.update(ingredients)
@sciyoshi
sciyoshi / day20.py
Last active February 15, 2021 04:43
import functools
import operator
import itertools
import networkx
import numpy as np
tiles = {}
for tiledata in open("inputs/day20").read().strip().split("\n\n"):
a, *tilelines = tiledata.splitlines()
class ParseError(Exception):
pass
def parse_rule(alts):
def parse(inp):
for rule in alts:
s = inp
for el in rule:
try:
s = rules[el](s)
class a(int):
def __mul__(self, b):
return a(int(self) + b)
def __add__(self, b):
return a(int(self) + b)
def __sub__(self, b):
return a(int(self) * b)
def ev(expr, pt2=False):
expr = re.sub(r"(\d+)", r"a(\1)", expr)
@sciyoshi
sciyoshi / day17.py
Last active December 17, 2020 05:53
import numpy as np
from scipy.ndimage import convolve
LINES = open("inputs/day17").read().splitlines()
dims = 3 # 4 for part 2
steps = 6
front = 2 * steps + 1
filt = np.full((3,) * dims, 1)
filt[(1,) * dims] = 100