Skip to content

Instantly share code, notes, and snippets.

@gfixler
gfixler / tripod.hs
Last active December 12, 2016 22:23
101 Tripod Hits song lookup
#!/usr/bin/env stack
{- stack --resolver lts-7.13 --install-ghc runghc -}
import Data.Maybe (mapMaybe)
import System.Environment (getArgs)
song :: Int -> Maybe String
song 1 = Just "A Shandy Too Far"
song 2 = Just "Adult Contemporary"
song 3 = Just "Air Guitar"
@gfixler
gfixler / theofthe.hs
Last active October 6, 2015 23:58
Militia Name Generator
-- Clojure -> Haskell port of: https://gist.github.com/nasser/1db446782cf7f3587283
import System.Random (getStdRandom, randomR)
pick :: [a] -> IO a
pick xs = do
n <- getStdRandom $ randomR (0, length xs - 1)
return $ xs !! n
adjs = ["people's", "brave", "invincible", "unstoppable", "righteous", "just", "honorable", "terrifying", "peaceful"]
newtype MaybeIO a = MaybeIO (IO (Maybe a))
runMaybeIO :: MaybeIO a -> IO (Maybe a)
runMaybeIO (MaybeIO x) = x
hole = undefined
data Hole = Hole
instance Monad MaybeIO where
return x = MaybeIO (return (Just x))
@gfixler
gfixler / MyState.hs
Last active August 29, 2015 14:23 — forked from merijn/MyState.hs
data MyState s a = MyState (s -> (a, s))
get :: MyState s s
get = undefined
put :: s -> MyState s ()
put = undefined
modify :: (s -> s) -> MyState s ()
modify = undefined
@gfixler
gfixler / bottles.hs
Created June 23, 2015 16:06
99 bottles
bottles :: Int -> String
bottles x | x == 0 = "No more bottles"
| x == 1 = "1 more bottle"
| x < 13 = show x ++ " more bottles"
| otherwise = show x ++ " bottles"
verse :: Int -> String
verse x = line1 ++ "\n" ++ line2 ++ "\n\n"
where line1 = bottles x ++ obotw ++ " " ++ bottles x ++ ob
line2 = todpia ++ bottles (x-1) ++ obotw
@gfixler
gfixler / huff.hs
Created June 22, 2015 17:02
Dabblings with Huffman encoding in Haskell
import Data.List (sortBy)
import Data.Ord (comparing)
import qualified Data.Map as M (Map, fromList)
data Freq a = V Int a | B Int (Freq a) (Freq a) deriving (Show)
size :: Freq a -> Int
size (V n _) = n
size (B n _ _) = n
import Control.Applicative ((<|>))
type Bonus = Int
data Frame = Roll Int | Frame Int Int | Spare Int | Strike deriving (Show)
badnum :: Int -> Bool
badnum n = n < 0 || n > 10
strike, spare, frame :: [Int] -> Maybe (Frame, Bonus, [Int])
@gfixler
gfixler / bowling.lhs
Last active August 29, 2015 14:22
Uncle Bob's kata, sans OO, TDD, kata
Here's a purely-functional take on collecting rolls (no scoring yet)
First a data type to represent the 4 states a frame can be in:
> data Frame = Roll Int | Open Int Int | Spare Int | Strike deriving (Show)
This just simplifies bounds-checks on input roll values:
> badnum :: Int -> Bool
> badnum n = n < 0 || n > 10
import Data.List ( transpose )
import Data.Monoid ( Monoid, mempty, mappend )
import System.IO ( BufferMode(NoBuffering)
, hSetBuffering, hSetEcho
, stdin, stdout, getChar
)
import Control.Monad ( forM_ )
newtype StdVal = StdVal Int deriving (Eq)
type Board a = [[a]]
@gfixler
gfixler / gitup.sh
Last active August 29, 2015 14:21
Easy, initial uploading of git repos to a default location
# The gitup function lets you type `gitup` from anywhere
# in a repo to upload it to your server. It also sets it
# up as an origin remote in the local repo. This is meant
# to be used in a new repo that has no server version yet.
# Note: I have the gitup function in my ~/.bashrc file.
# Modify these two 'example.com' vars as needed:
gitup_scp='example.com:git'
gitup_root='ssh://example.com/~/git/'