Skip to content

Instantly share code, notes, and snippets.

@MatMoore
Forked from pljones/HackNight.scala
Created January 17, 2014 22:40
Show Gist options
  • Save MatMoore/8483013 to your computer and use it in GitHub Desktop.
Save MatMoore/8483013 to your computer and use it in GitHub Desktop.
package wlhacknight
import scala.io.Source
import java.io.File
import java.util.Arrays
import scala.collection.mutable.ArrayBuffer
import scala.collection.immutable.HashMap
import scala.util.Random
/**
* Alice in Markov Chains for West London Hack Night
*
* Developed in 1.5 hours by Scala team.
* Post-night development by Peter L Jones
*/
/**
* TODO: Add song, verse and line start / end points
*/
object HackNight extends App {
case class Node(value: String, var meta: Map[String, Int]) {
def incr(str: String) = meta += (str -> (meta.getOrElse(str, 0) + 1))
def findNext() = meta.toList(Random.nextInt(meta.size))._1
}
def somekindofparsingfunction(list: List[String], nodemap: Map[String, Node]): Map[String, Node] = {
list match {
case h :: Nil => nodemap
case token :: t => {
nodemap get token match {
case None => somekindofparsingfunction(t, nodemap + (token -> Node(token, Map(t.head -> 1))))
case Some(x) => {
x.incr(t.head)
somekindofparsingfunction(t, nodemap)
}
}
}
}
}
val lines = Source.fromFile(new File("lyrics.txt")).getLines.map(line => line.split(" "))
val regex = "[^a-z]".r
val words = lines.foldLeft(new ArrayBuffer[String]())((acc, line) => acc ++ line)
.map(word => regex.replaceAllIn(word.toLowerCase(), "")).toList
val whoknows = somekindofparsingfunction(words, HashMap[String, Node]())
println(whoknows + "\n\n")
var nextNode = whoknows.toList(Random.nextInt(whoknows.size))._2
(1 to 4)
.map(_ => {
(1 to (3 + Random.nextInt(3)))
.map(_ => {
(1 to (5 + Random.nextInt(5)))
.map(_ => {
if (nextNode.value != "")
print(nextNode.value + " ")
nextNode = whoknows(nextNode.findNext)
})
println()
})
println()
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment