Skip to content

Instantly share code, notes, and snippets.

@pnf
pnf / tictactoe.clj
Last active April 10, 2023 23:44
AI-ish tic-tac-toe.
; list of winning positions
(def wp
[2r111000000 2r000111000 2r000000111 2r100100100 2r010010010 2r001001001 2r100010001 2r001010100])
;; Is a particular bitmask winning?
(defn winner? [p]
(some (fn [c] (= (bit-and c p) c)) wp))
;; list of possible moves, filtering out ones already made
(defn moves [p]
(filter pos? (map #(bit-and (bit-not p) (bit-shift-left 1%)) (range 9))))
;; A board position comprises a bitarray for each player and an indicaiton of whose turn it is.
trait ViewTransformer[-A,+B] {
def sequence(in: Iterable[A]) = transform(in.view).to(IterableFactory.toSpecific(in.iterableFactory))
def transform(v: View[A]): View[B]
def map[C](f: B => C): ViewTransformer[A,C] = new ViewTransformerImpl[A,C,B](this) {
override def transform(v: View[A]): View[C] = prev.transform(v).map(f)
}
def flatMap[C](f: B => IterableOnce[C]): ViewTransformer[A,C] = new ViewTransformerImpl[A,C,B](this) {
override def transform(v: View[A]): View[C] = prev.transform(v).flatMap(f)
}
}
{-# LANGUAGE RankNTypes #-}
import Data.STRef
import Data.Vector (fromList, toList, freeze, thaw)
import Control.Monad
import Data.Vector.Mutable (MVector, STVector, read, write, swap)
import qualified Data.Vector as V (Vector, length)
import Data.List (sortOn)
import Prelude hiding (read)
import GHC.ST
@pnf
pnf / qaxl.clj
Created October 28, 2016 20:46
(ns qaxl.core
(:use clojure.walk clojure.pprint qaxl.cache)
(:require [co.paralleluniverse.pulsar.async :as qa]
[clojure.core.async :as a]
[co.paralleluniverse.pulsar.core :as q]
[clojure.test :refer [function?]]
[co.paralleluniverse.fiber.httpkit.client :as hk]
[co.paralleluniverse.pulsar.core :refer [fiber]]
[clojure.core.match :refer [match]]))
;; La bella vita di quattro finestre
(global-set-key "\C-col" 'windmove-left)
(global-set-key "\C-cor" 'windmove-right)
(global-set-key "\C-cou" 'windmove-up)
(global-set-key "\C-cod" 'windmove-down)
(global-set-key "\C-cow" 'ido-jump-to-window)
(defun windmove-opposite () (interactive)
(if (windmove-find-other-window 'up) (windmove-up) (windmove-down))
(if (windmove-find-other-window 'right) (windmove-right)(windmove-left)))
(global-set-key "\C-coo" 'windmove-opposite)
@pnf
pnf / longest-anagram.pl
Last active December 21, 2015 02:38
Two algorithms for finding the longest anagram in a list of words.
die "Note that there are two different algorithms here. Don't expect it to run as is."
#!/usr/bin/perl
# ~0.15s on i7 1.7GHz
my @all;
my $m=0;
while(<>) {
$l = length($_);
$m = $l if $l>$m;
@pnf
pnf / lazysieve.clj
Last active December 19, 2015 08:19
This is supposed to be a real sieve of eratosthenes, per http://www.cs.tufts.edu/~nr/comp150fp/archive/melissa-oneill/Sieve-JFP.pdf
(defn maintain-non-primes [non-primes]
"Remove first non-prime entry, and create new entries based on it"
(let [[n ps] (first non-primes)
xs (dissoc non-primes n)
new-non-primes (map (fn [p] [(+ n p) (cons p (xs (+ n p))) ]) ps)]
(into xs new-non-primes)))
(defn seive
([] (seive (sorted-map) 2))
([n] (take n (seive (sorted-map) 2)))
([non-primes n]
@pnf
pnf / frascii
Created June 24, 2013 14:03
Print out a fractal tree
#!/usr/bin/env python
from math import *
import sys
# draw line from x,y of length s at angle theta, spawn growth of length s*r, theta+/-q unless n==0
def grow(x, y, theta, s, q, r, n):
ret = [(x,y,theta,s)]
n = n-1
if n>0:
x2 = x + s*cos(theta)
@pnf
pnf / view-bounds
Created June 23, 2013 01:34
Shows errors encountered trying the examples at http://twitter.github.io/scala_school/advanced-types.html
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.
scala> implicit def strToInt(x:String) = x.toInt
warning: there were 1 feature warning(s); re-run with -feature for details
strToInt: (x: String)Int
scala> class C[A](v:A){def a(implicit ev:A=>Int)=123+ev(v)}
defined class C
@pnf
pnf / drawgraph.py
Created June 21, 2013 12:47
Draw a sort-of-pretty ascii graph from input data in outline form.
#!/usr/bin/env python
import re
import sys
from collections import deque
class Frame:
def __init__(self,node,indent):
self.node = node
self.indent = indent