Skip to content

Instantly share code, notes, and snippets.

@nbogie
nbogie / DamageDice.md
Last active August 29, 2015 13:57
Hoodlums problem - D&D Damage Dice

Here's a simple problem which I found quite fun to implement.

Suggested hoodlums problem (beginner level):

Dungeons and Dragons Damage Dice

Context:

In the game of dungeons and dragons, an example damage expression might be:

-- don't do it like this, especially the json!
import Network.WebSockets (shakeHands, getFrame, putFrame)
import Network (listenOn, PortID(PortNumber), accept, withSocketsDo)
import System.IO (Handle, hClose)
import qualified Data.ByteString as B (append, null)
import Data.ByteString.UTF8 (fromString) -- this is from utf8-string
import Control.Monad (forever)
import Control.Concurrent (forkIO, threadDelay)
import Data.List (intercalate)
<html>
<!-- for use with equally crap server at https://gist.github.com/821606 -->
<!-- you'll need jquery and flot -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Flot Log presenter with External json file</title>
<link href="./clientsupport/layout.css" rel="stylesheet" type="text/css">
<script language="javascript" type="text/javascript" src="./clientsupport/jquery.js"></script>
<script language="javascript" type="text/javascript" src="./clientsupport/jquery.flot.js"></script>
@nbogie
nbogie / gist:822659
Created February 11, 2011 17:00
Nokogiri shortcut for using whatever namespace the doc announced
envNodes = mydoc.xpath '//xmlns:environment', mydoc.root.namespaces
@nbogie
nbogie / GroupExample.hs
Created March 5, 2011 14:48
Still avoiding bytestring, and without anticipating next stage. Perf ok: 1 million lines in 2 sec and 1 Mb ram, with -O2
import Data.Function (on)
import Data.List (groupBy)
import Data.Maybe (mapMaybe)
import qualified Data.List.Utils as U
type Domain = String
type NameServer = String
main :: IO ()
main = interact (processLines . lines)
@nbogie
nbogie / GroupExample.hs
Created March 5, 2011 15:11
break out parseInput - it's good to have dedicated parse stage indicating parsed type.
import Data.Function (on)
import Data.List (groupBy)
import Data.Maybe (mapMaybe)
import qualified Data.List.Utils as U
type Domain = String
type NameServer = String
main :: IO ()
main = interact process
@nbogie
nbogie / CompactNameServers.hs
Created March 17, 2011 13:11
Compacts lists of nameservers "a.y.z", "b.y.z" into z(y(a,b))
import qualified Data.List.Utils as U
import Data.List (sort, groupBy, intercalate)
import Data.Function (on)
-- -------------------------------------------------
-- example data
-- -------------------------------------------------
examples :: [(Domain, [NameServer])]
examples = [("pachube.com",["7.f.c",
"5.f.c",
{-- snippet all --}
module PodParser where
import PodTypes
import Text.XML.HaXml
import Text.XML.HaXml.Parse
import Text.XML.HaXml.Posn
import Text.XML.HaXml.Html.Generate(showattr)
import Data.Char
import Data.List
@nbogie
nbogie / haxml_showattr_bugdemo.hs
Created March 23, 2011 23:04
A demonstration of a problem calling showattr in HaXml
module Main where
import Text.XML.HaXml
import Text.XML.HaXml.Posn
main :: IO ()
main = processXmlWith (hexagrams `o` tag "IChing")
hexagrams :: Content Posn -> [Content Posn]
hexagrams = html [ hbody [htable [rows `o` children `with` ( tag "hexagram")] ] ]
@nbogie
nbogie / whereami-readable.txt
Created July 1, 2011 09:17
presentation of https://gist.github.com/1056734 for attempted readability
echo -n
#quote-escaping removed from the following json
"
{"version": "1.1.0","host": "maps.google.com","request_address": true,"address_language": "en_GB", "wifi_towers":
[
`iwlist scan 2> /dev/null |
tr -d '\n' |
sed -e 's/Cell [0-9]* - Address: \([0-9A-Z:]*\)[^C]*Channel:\([0-9]*\)[^S]*Signal level=\([0-9-]*\) dBm[^E]*E[^E]*ESSID:"\([^"]*\)"/\{"mac_address": "\1","signal_strength": \3,"age": 0,"channel": \2,"ssid": "\4"}/g'
-e 's/[^{]*{/{/'
-e 's/}[^{]*{/},{/g'