Skip to content

Instantly share code, notes, and snippets.

@japsu
Last active December 16, 2015 14:49
Show Gist options
  • Save japsu/5451240 to your computer and use it in GitHub Desktop.
Save japsu/5451240 to your computer and use it in GitHub Desktop.
japsu@hobgoblin:~/Work/scratch$ coffee scrabble.coffee cartel /home/japsu/Work/scratch/scowl-7.1/final/english-words.*
acelrt
: cartel,claret,rectal,tarcel,carlet,lacert,talcer
t: clatter
tu: cultrate
ty: clattery
tt: tractlet
y: treacly,craylet
u: cuartel,curatel,leuctra
uu:
uuv: curvulate
uy: lectuary
_ = require 'lodash'
class Trie
@build: (words) ->
trie = new Trie
trie.addWords words
trie
constructor: ->
@children = {}
@words = []
push: (letters, word) ->
if letters
c = letters[0]
curLetterSubtrie = @children[c] ?= new Trie
curLetterSubtrie.push letters[1..], word
else
@words.push word
dump: (letters='', indent=0) ->
spaces = ''
spaces += ' ' for i in [0...indent]
console.log "#{spaces}#{letters}: #{@words}"
subtrie.dump letters + c, indent + 1 for c, subtrie of @children
addWords: (words) ->
trie.push (c for c in word).sort().join(''), word for word in words
getSubtrie: (letters) ->
if letters
c = letters[0]
subtrie = @children[c]
if subtrie?
subtrie.getSubtrie letters[1..]
else
null
else
this
module.exports = {Trie}
if require.main is module
fs = require 'fs'
needle = (c for c in process.argv[2]).sort().join('')
console?.log needle
trie = new Trie
trie.addWords fs.readFileSync(file).toString().split("\n") for file in process.argv[3..]
trie.getSubtrie(needle)?.dump()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment