Advertisement
Guest User

Untitled

a guest
Dec 9th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. import scala.io.Source
  2.  
  3. sealed trait Token
  4. case class Simple(s: String) extends Token
  5. case class Expansion(t: Stream[Token], repCount: Int) extends Token
  6.  
  7. def read_marker(s: String): (Int, Int, String) = {
  8. val (size, rest) = s.span(_ != 'x')
  9. val (cnt, after) = rest.tail.span(_ != ')')
  10. (size.toInt, cnt.toInt, after.tail)
  11. }
  12.  
  13. def expand_to_marker(s: String): (String, String) = {
  14. val (before, rest) = s.span(_ != '(')
  15. (before.filterNot(_.isWhitespace), if(rest.length > 0) rest.tail else "")
  16. }
  17.  
  18. def expand(s: String, recurse: Boolean = false): Stream[Token] =
  19. if(s.length == 0) {
  20. Stream.empty
  21. } else {
  22. val (expandedStr, marker) = expand_to_marker(s)
  23. if(marker.length == 0) {
  24. Simple(expandedStr) #:: Stream.empty
  25. } else {
  26. val (sz, cnt, rest) = read_marker(marker)
  27. val patt = if(recurse) Expansion(expand(rest.take(sz), recurse), cnt) else Expansion(Simple(rest.take(sz)) #:: Stream.empty, cnt)
  28. Simple(expandedStr) #:: patt #:: expand(rest.drop(sz), recurse)
  29. }
  30. }
  31.  
  32. def repString(s: String, cnt: Int): String = {
  33. val sb = new StringBuilder("")
  34. var c = cnt
  35. while(c > 0) {
  36. sb ++= s
  37. c -= 1
  38. }
  39. sb.toString
  40. }
  41.  
  42. def expanded(s: Stream[Token]): String = (s.map {
  43. case Simple(s) => s
  44. case Expansion(s, count) => repString(expanded(s), count)
  45. }).mkString
  46.  
  47. def expanded_count(s: Stream[Token]): BigInt = (s.map {
  48. case Simple(s) => BigInt(s.length)
  49. case Expansion(s, count) => expanded_count(s) * BigInt(count)
  50. }).sum
  51.  
  52. val test_cases1 = List(
  53. "ADVENT", "A(1x5)BC", "(3x3)XYZ", "A(2x2)BCD(2x2)EFG", "(6x1)(1x3)A", "X(8x2)(3x3)ABCY"
  54. )
  55.  
  56. val test_cases2 = List(
  57. "(3x3)XYZ", "X(8x2)(3x3)ABCY", "(27x12)(20x12)(13x14)(7x10)(1x12)A", "(25x3)(3x3)ABC(2x3)XY(5x2)PQRSTX(18x9)(3x2)TWO(5x7)SEVEN"
  58. )
  59.  
  60. test_cases1.foreach { tc =>
  61. val exp = expanded(expand(tc, false))
  62. println(s"$tc: (${exp.length})")
  63. }
  64.  
  65. println("Part two")
  66.  
  67. test_cases2.foreach { tc =>
  68. val exp = expanded_count(expand(tc, true))
  69. println(s"$tc: (${exp})")
  70. }
  71.  
  72. val input = Source.fromFile("input.9").mkString
  73. println(
  74. expanded(expand(input)).length
  75. )
  76. println(
  77. expanded_count(expand(input, true))
  78. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement