Skip to content

Instantly share code, notes, and snippets.

View taylorwood's full-sized avatar

Taylor Wood taylorwood

View GitHub Profile
@taylorwood
taylorwood / parts.clj
Created October 22, 2017 17:10
Recursive function for integer partitions
(defn parts
"Returns integer partitions for n."
([n]
(parts n n [] []))
([n m acc prefix]
(if (= 0 n)
(conj acc prefix)
(reduce
(fn [st i]
(into st (parts (- n i) i acc (conj prefix i))))
@taylorwood
taylorwood / emoji.clj
Last active December 15, 2017 17:02
Parse/render Unicode.org Emoji data https://www.unicode.org/reports/tr51/#Data_Files
(ns unicode.emoji
"Parses Unicode.org Emoji specifications."
(:require [clojure.java.io :as io]
[clojure.string :as cs]))
(defn slurp-lines
"Returns lines from unicode emoji file. Optionally reads file of same name
from resources."
[file & [resource?]]
(-> (if resource?
@taylorwood
taylorwood / stackoverflow-svg-icon-jekyll.html
Created January 5, 2018 17:46
Stack Overflow SVG icon for GitHub Pages Jekyll Footer
{% if site.stackoverflow_username %}
<li>
<a href="https://stackoverflow.com/story/{{ site.stackoverflow_username }}">
<span class="icon icon--stackoverflow">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 120 120" style="enable-background:new 0 0 120 120;" xml:space="preserve">
<polygon fill="#828282" points="84.4,93.8 84.4,70.6 92.1,70.6 92.1,101.5 22.6,101.5 22.6,70.6 30.3,70.6 30.3,93.8 "/>
<path fill="#828282" d="M38.8,68.4l37.8,7.9l1.6-7.6l-37.8-7.9L38.8,68.4z M43.8,50.4l35,16.3l3.2-7l-35-16.4L43.8,50.4z M53.5,33.2 l29.7,24.7l4.9-5.9L58.4,27.3L53.5,33.2z M72.7,14.9l-6.2,4.6l23,31l6.2-4.6L72.7,14.9z M38,86h38.6v-7.7H38V86z"/>
</svg>
</span>
@taylorwood
taylorwood / clj-jdbc-postgres.clj
Created February 6, 2018 22:39
Clojure JDBC Postgres streaming resultset
(defn query-lazy ;; adapted from https://stackoverflow.com/a/39775018
[[sql & params] & {:as opts}]
(jdbc/with-db-transaction [tx (db/connection)]
(jdbc/query tx
(into [(jdbc/prepare-statement (:connection tx) sql {:fetch-size 100})] params)
opts)))
@taylorwood
taylorwood / Player.clj
Created April 30, 2018 12:40
CodinGame Battle Royale Bot
(ns Player
(:require [clojure.pprint :refer [print-table pprint]]
[clojure.set :as set])
(:gen-class))
(defmacro debug [& body] `(binding [*out* *err*] (do ~@body)))
(def split-by (juxt filter remove))
(defn read-map [ks]
(let [vs (repeatedly (count ks) read)]
(zipmap ks vs)))
@taylorwood
taylorwood / infix-spec.clj
Created October 8, 2017 00:56
Recursive clojure.spec for grouped/nested infix expressions http://taylorwood.github.io/2017/10/04/clojure-spec-boolean.html
(ns playground.test
(:require [clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as sgen]
[clojure.spec.test.alpha :as stest]
[clojure.string :as cs]
[clojure.walk :as walk]))
(def op-keys #{:and :or})
(s/def ::expression
@taylorwood
taylorwood / Exercise.fsx
Last active September 23, 2018 22:18
Relay Foods exercise
open System
// Data types //
/// Describes an Address, its physical location, and the times it will be occupied.
[<StructuredFormatDisplay("{Name}")>]
type Address = {
Name: string
Street: string
City: string
@taylorwood
taylorwood / Solutions.fs
Created September 14, 2016 21:56
Phone screen challenge
// A sequence of integers is defined as F(N) = F(N-1) * F(N-2),
// with F(0) = 1 and F(1) = 2.
// Write a function which, given N, prints N and F(N)
// f(2) = F(2-1) * F(2-2) = F(1) * F(0) = 2 * 1 = 2
// f(3) = f(3-1) * f(3-2) = f(2) * f(1) = 2 * 2 = 4
// f(4) = f(4-1) * f(4-2) = f(3) * f(2) = 4 * 2 = 8
// f(5) = f(5-1) * f(5-2) = f(4) * f(3) = 8 * 4 = 32
// f(6) = f(6-1) * f(6-2) = f(5) * f(4) = 32 * 8 = 256
// recursive
@taylorwood
taylorwood / transducers.clj
Created September 23, 2018 23:44
Clojure transducers
(defn zip
"Returns a transducer that zips cs with inputs."
[& cs]
(fn [rf]
(let [cs (volatile! cs)]
(fn
([] (rf))
([result] (rf result))
([result item]
(if (every? seq @cs)
@taylorwood
taylorwood / README.md
Created April 25, 2019 14:38
Scala Slick compile error: query with group by

What happened?

This compilation error was generated by a Scala Slick query that's essentially a SQL SELECT with two JOINs and a GROUP BY:

slick.SlickTreeException: Cannot convert node to SQL Comprehension
GroupBy t3 : Vector[(t3<(Option[String'], Option[String'])>, Vector[t4<{s5: Option[scala.math.BigDecimal'], s6: SOption[OptionDisc/Int], s7: Option[String'], s8: SOption[OptionDisc/Int], s9: Option[String']}>])]
  from s2: Bind : Vector[t4<{s5: Option[scala.math.BigDecimal'], s6: SOption[OptionDisc/Int], s7: Option[String'], s8: SOption[OptionDisc/Int], s9: Option[String']}>]
    from s10: Filter s11 : Vector[t12<{s13: String', s14: String', s15: String', s16: String', s17: String', s18: Option[String'], s19: Int', s20: Option[String'], s21: String', s22: scala.math.BigDecimal', s23: String', s24: String', s25: String', s26: String', s27: String', s28: Boolean', s29: scala.math.BigDecimal', s30: String', s31: String', s32: Boolean', s33: Option[String'], s34: String', s35: Option[String'], s36: