-
-
Save MatMoore/8483013 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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