Skip to content

Instantly share code, notes, and snippets.

@pakaufmann
Created December 7, 2016 11:07
Show Gist options
  • Save pakaufmann/bb1d9386e3bc7a74ce668a815e42ff8e to your computer and use it in GitHub Desktop.
Save pakaufmann/bb1d9386e3bc7a74ce668a815e42ff8e to your computer and use it in GitHub Desktop.
object Day7 extends Challenge {
val ips = loadFile("day7.txt").getLines().toList
override def runFirst(): Unit = {
println(ips.count(supportsTLS))
}
override def runSecond(): Unit = {
println(ips.count(supportsSSL))
}
def supportsTLS(ip: String): Boolean = {
def hasAbba(part: String) = part.matches(""".*([a-z])((?:(?!\1).))(\2)\1.*""")
val abbaParts = splitParts(ip).map {
case (part, true) =>
true -> hasAbba(part)
case (part, false) =>
false -> hasAbba(part)
}
abbaParts.contains((true, true)) && !abbaParts.contains((false, true))
}
def supportsSSL(ip: String): Boolean = {
val abaRegex = """([a-z])((?:(?!\1).))\1""".r
def getAbaList(part: String) = part.sliding(3).flatMap(abaRegex.findFirstIn).toList
def createBab(aba: String) = new StringBuilder().append(aba(1)).append(aba(0)).append(aba(1)).toString()
val parts = splitParts(ip)
val babs = parts
.filter(_._2)
.flatMap(a => getAbaList(a._1))
.map(createBab)
parts.filter(!_._2).exists(p => babs.exists(bab => p._1.contains(bab)))
}
private def splitParts(ip: String) = {
val parts = ip.split("""\[|\]""")
parts.zipWithIndex.map(p => p._1 -> (p._2 % 2 == 0))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment