diff --git a/Common.scala b/Common.scala index c5f3475..5d44e33 100644 --- a/Common.scala +++ b/Common.scala @@ -9,7 +9,7 @@ def iterate[T](get: => T | Null) = def lines = iterate(scala.io.StdIn.readLine()) -class CommonParser extends RegexParsers: +trait CommonParser extends RegexParsers: val num = """-?(0|[1-9]\d*)""".r ^^ { _.toInt } val long = """-?(0|[1-9]\d*)""".r ^^ { _.toLong } diff --git a/Day17.scala b/Day17.scala index 20d71fa..d0595f5 100644 --- a/Day17.scala +++ b/Day17.scala @@ -1,8 +1,24 @@ package aoc.day17 import aoc._ +import aoc.direction.Dir import scala.collection.mutable +import Dir._ + +extension (d: Dir) + inline def times(n: Int)(x: Int, y: Int) = + val k = d.ordinal + val (nx, ny) = (x + n * dx(k), y + n * dy(k)) + if inside(nx, ny) then + val dist = d match + case Up => sumCols(x)(y) - sumCols(nx)(y) + case Right => sumRows(x)(ny + 1) - sumRows(x)(y + 1) + case Down => sumCols(nx + 1)(y) - sumCols(x + 1)(y) + case Left => sumRows(x)(y) - sumRows(x)(ny) + Some(State(nx, ny, d), dist) + else None + val board = lines.map(Parser.parse(Parser.row, _).get).map(_.toArray).toArray val sumRows = board.map(_.scanLeft(0)(_ + _)) @@ -12,28 +28,6 @@ val sumCols = (0 until board.length) } .toArray -object Dir: - private[Dir] val dx = Array(-1, 0, 1, 0) - private[Dir] val dy = Array(0, 1, 0, -1) -import Dir._ -enum Dir: - case Up, Right, Down, Left - def apply(x: Int, y: Int) = - val k = this.ordinal - (x + dx(k), y + dy(k)) - - inline def times(n: Int)(x: Int, y: Int) = - val k = this.ordinal - val (nx, ny) = (x + n * dx(k), y + n * dy(k)) - if inside(nx, ny) then - val dist = this match - case Up => sumCols(x)(y) - sumCols(nx)(y) - case Right => sumRows(x)(ny + 1) - sumRows(x)(y + 1) - case Down => sumCols(nx + 1)(y) - sumCols(x + 1)(y) - case Left => sumRows(x)(y) - sumRows(x)(ny) - Some(State(nx, ny, this), dist) - else None - object Parser extends CommonParser: val digit = """\d""".r ^^ { _.toInt } val row = rep1(digit) diff --git a/Day18.scala b/Day18.scala new file mode 100644 index 0000000..1b98860 --- /dev/null +++ b/Day18.scala @@ -0,0 +1,69 @@ +package aoc.day18 + +import aoc._ +import aoc.direction._ +import Dir._ +import scala.collection.SortedMap +import scala.collection.mutable + +case class Dig(dir: Dir, count: Int, color: String): + lazy val part2 = Parser.parse(Parser.digHex, color).get + + def apply(x: Long, y: Long) = dir.long(x, y, count) + +object Parser extends CommonParser with DirParser: + val dig = dir ~ num ~ "(#" ~ """[0-9a-f]{6}""".r ~ ")" ^^ { case dir ~ num ~ _ ~ color ~ _ => + Dig(dir, num, color) + } + + val hexDigit = """[0-9a-f]""".r ^^ { + case c if c.charAt(0).isDigit => c.charAt(0) - '0' + case c => c.charAt(0) - 'a' + 10 + } + + def hexNum(len: Int) = repN(len, hexDigit).map(_.foldLeft(0)(_ * 16 + _)) + + val toDir = Array(Right, Down, Left, Up) + val digHex = hexNum(5) ~ hexDigit ^^ { case num ~ dig => Dig(toDir(dig), num, "") } + + def apply(s: String) = parse(dig, s).get + +def instructions() = lines.map(Parser(_)).toSeq + +def points(ins: Seq[Dig]) = + ins + .scanLeft((0L, 0L)) { case ((x, y), in) => in(x, y) } + .dropRight(1) + +extension [T](ss: Seq[T]) def shiftLeft = ss.drop(1) ++ ss.take(1) + +def area(pts: Seq[(Long, Long)]) = pts + .lazyZip(pts.shiftLeft) + .map { case ((ax, ay), (bx, by)) => + (bx - ax) * (by + ay) + } + .sum + .abs + +def circum(pts: Seq[(Long, Long)]) = pts + .lazyZip(pts.shiftLeft) + .map { case ((ax, ay), (bx, by)) => + (bx - ax).abs + (by - ay).abs + } + .sum + +def areaBlock(pts: Seq[(Long, Long)]) = (area(pts) + circum(pts)) / 2 + 1 + +def part1 = + val ins = instructions() + val pts = points(ins) + println(areaBlock(pts)) + +def part2 = + val ins = instructions().map(_.part2) + val pts = points(ins) + println(areaBlock(pts)) + +@main def Day18(part: Int) = part match + case 1 => part1 + case 2 => part2 diff --git a/Direction.scala b/Direction.scala new file mode 100644 index 0000000..cf89159 --- /dev/null +++ b/Direction.scala @@ -0,0 +1,22 @@ +package aoc.direction + +import aoc._ + +object Dir: + val dx = Array(-1, 0, 1, 0) + val dy = Array(0, 1, 0, -1) +import Dir._ +enum Dir: + case Up, Right, Down, Left + def apply(x: Int, y: Int, count: Int = 1) = + val k = this.ordinal + (x + count * dx(k), y + count * dy(k)) + def long(x: Long, y: Long, count: Long = 1) = + val k = this.ordinal + (x + count * dx(k), y + count * dy(k)) + + def left = Dir.fromOrdinal((ordinal + 3) % 4) + def right = Dir.fromOrdinal((ordinal + 1) % 4) + +trait DirParser extends CommonParser: + val dir = 'U' ^^^ Up | 'D' ^^^ Down | 'L' ^^^ Left | 'R' ^^^ Right diff --git a/inputs/day18.input b/inputs/day18.input new file mode 100644 index 0000000..7a1c46c --- /dev/null +++ b/inputs/day18.input @@ -0,0 +1,660 @@ +L 3 (#07b412) +D 5 (#713ad1) +L 2 (#11e6d2) +D 4 (#6ba7d3) +L 3 (#7cfca2) +U 5 (#0a85c3) +L 2 (#3a5282) +U 4 (#6f91a3) +L 3 (#32c2f0) +U 6 (#2dd7b3) +L 6 (#848c30) +U 7 (#077a43) +R 5 (#ba4692) +U 6 (#49b551) +R 3 (#14d162) +U 8 (#397871) +R 5 (#1c73f2) +D 8 (#7130e1) +R 4 (#c84852) +U 2 (#203b91) +R 3 (#288e30) +U 5 (#91ba91) +R 4 (#5dda70) +U 3 (#91ba93) +R 4 (#732500) +U 4 (#0676f1) +L 9 (#6701a2) +U 4 (#5c38c1) +L 7 (#0f7480) +U 4 (#921b21) +L 6 (#83d9e0) +U 2 (#28c691) +L 7 (#1b6de0) +U 2 (#02cee1) +L 4 (#5b66b0) +U 4 (#bdb093) +L 6 (#75eb20) +U 4 (#928251) +L 4 (#6bb430) +D 7 (#44ad91) +L 2 (#806b50) +U 7 (#7d1391) +L 4 (#7a3652) +U 5 (#9cbf41) +L 5 (#905712) +U 2 (#70beb3) +L 2 (#bede02) +U 7 (#70beb1) +R 3 (#a2c232) +U 5 (#7b0ad1) +R 5 (#01d012) +U 5 (#2b1901) +R 7 (#698c32) +U 4 (#a19d91) +R 4 (#7dbb92) +U 3 (#8feb41) +R 5 (#021ab2) +U 3 (#42a773) +R 6 (#99c6c2) +D 7 (#8f7b33) +R 5 (#01fd82) +D 5 (#8e7263) +R 2 (#37e492) +U 5 (#10bff3) +R 5 (#a09242) +U 7 (#126723) +R 3 (#864230) +D 8 (#70bc43) +R 5 (#7cf4a0) +D 2 (#8135d3) +R 6 (#144b70) +U 5 (#0c51e3) +L 6 (#00e590) +U 4 (#44ba73) +L 2 (#4177e2) +U 4 (#a4c5b1) +L 6 (#6f2f12) +U 3 (#9a4ce1) +L 4 (#979402) +D 7 (#2a0ce1) +L 3 (#0c1b70) +U 7 (#58ca71) +L 3 (#95d640) +U 4 (#549241) +R 10 (#a1f1b2) +U 3 (#1753b1) +L 5 (#1d32d2) +U 5 (#9a58d3) +L 5 (#4dc1b2) +U 6 (#1ab693) +L 4 (#5e8df2) +U 3 (#4dabf3) +R 6 (#972492) +U 5 (#3198c3) +R 4 (#972490) +U 3 (#54b613) +R 6 (#4a8bb2) +U 2 (#a4c5b3) +R 3 (#126042) +U 9 (#54acc3) +L 5 (#2b4682) +U 4 (#88f453) +L 4 (#2b4680) +U 8 (#4a4283) +L 2 (#8bfdf0) +U 2 (#a76851) +L 4 (#0a9b30) +U 6 (#43a141) +L 3 (#14fd80) +U 3 (#7e5391) +L 6 (#43ba40) +D 2 (#146e93) +L 4 (#9c71b0) +D 7 (#5ae483) +L 5 (#0bcd70) +U 6 (#52a1c3) +L 4 (#3307f0) +U 4 (#1da3f3) +L 3 (#7a8c80) +D 5 (#89c463) +L 2 (#2984e0) +D 2 (#828673) +L 6 (#2cf252) +U 7 (#500061) +L 4 (#a07ff2) +U 3 (#565f21) +R 3 (#09ef22) +U 3 (#a65f83) +R 5 (#410672) +U 4 (#24fe73) +L 5 (#b6ed72) +U 8 (#4574d3) +L 6 (#2e3142) +D 8 (#7ba311) +L 3 (#1bc442) +U 6 (#38b161) +L 4 (#8ada92) +U 2 (#24cdf1) +L 3 (#37b3e2) +U 3 (#3a3ec1) +R 5 (#242ea2) +U 2 (#1fe073) +R 5 (#9ad182) +U 6 (#4a9193) +R 6 (#34c480) +U 2 (#9ff123) +R 5 (#34c482) +U 4 (#08fe03) +R 3 (#46d292) +D 10 (#19fca3) +R 3 (#1ea7d2) +D 6 (#c2d531) +R 8 (#614f82) +D 6 (#c2d533) +R 6 (#777202) +D 2 (#38f573) +R 3 (#84e142) +D 3 (#036d11) +R 5 (#113352) +D 5 (#036d13) +R 3 (#7ad752) +U 4 (#969de3) +R 7 (#7887d0) +U 3 (#31aa61) +R 4 (#affca0) +U 6 (#31aa63) +R 2 (#374010) +U 6 (#574d53) +L 4 (#4edbd2) +U 2 (#2271c1) +L 7 (#595d32) +U 3 (#2271c3) +R 3 (#2c6532) +U 5 (#2754d3) +R 8 (#8b2652) +U 4 (#b27ab3) +R 6 (#824b80) +D 4 (#587173) +R 4 (#3715b0) +D 5 (#8f0b61) +R 3 (#6a2ac0) +D 3 (#1e0b21) +R 5 (#29a290) +D 3 (#8850b3) +R 5 (#9013e0) +D 3 (#24c5d3) +R 5 (#2b12d0) +U 6 (#4090a3) +R 3 (#9cddd0) +D 6 (#a93843) +R 4 (#6fff30) +D 4 (#3f1121) +L 7 (#76f2c0) +D 4 (#4f9e11) +L 3 (#76f2c2) +D 8 (#480d31) +L 6 (#694740) +D 5 (#177e81) +L 9 (#692aa2) +D 3 (#10b971) +R 9 (#42f012) +D 3 (#10b973) +R 3 (#2c6202) +D 8 (#851881) +R 3 (#04ae62) +D 2 (#470d81) +R 4 (#155e10) +U 3 (#01b053) +R 2 (#c55dd0) +U 5 (#01b051) +R 9 (#026f30) +D 2 (#113081) +R 2 (#694742) +D 4 (#22d821) +L 5 (#03eb80) +D 5 (#3bc5d1) +L 4 (#69bf90) +D 3 (#3fdce3) +L 4 (#2d1350) +D 2 (#3fdce1) +L 3 (#65f500) +U 4 (#bd7f81) +L 8 (#8382e0) +D 4 (#160053) +L 7 (#5ff9f0) +D 4 (#ab40d3) +R 6 (#5ff9f2) +D 2 (#58d1b3) +R 2 (#6bcc80) +D 6 (#b187c3) +R 6 (#73b290) +D 3 (#9fbf43) +R 4 (#630f00) +D 2 (#4f1b13) +R 7 (#543b30) +D 7 (#114c43) +R 6 (#629ac0) +D 6 (#1bedb3) +R 4 (#016f50) +D 2 (#285e31) +R 3 (#611460) +D 7 (#0dfd61) +R 2 (#75f3e0) +D 2 (#1e79b1) +R 4 (#144e90) +U 5 (#d16ff1) +R 4 (#144e92) +U 6 (#113511) +R 5 (#610450) +U 3 (#1291c1) +R 2 (#328eb0) +U 5 (#2f3f73) +R 9 (#126af2) +U 4 (#946843) +L 6 (#126af0) +U 5 (#866453) +L 7 (#352e70) +U 4 (#5f8413) +L 7 (#c618e2) +U 3 (#6c2813) +L 2 (#c618e0) +U 3 (#1d3db3) +R 8 (#37e470) +U 2 (#1705b3) +R 6 (#6ab412) +U 6 (#961873) +R 3 (#6ab410) +U 8 (#30e6f3) +R 5 (#3308e0) +U 3 (#1fc8c1) +R 3 (#3450a0) +D 8 (#9d4391) +R 3 (#6a9c70) +D 2 (#25d071) +R 4 (#3e5330) +D 6 (#401381) +R 5 (#399052) +D 3 (#ab9e81) +R 4 (#2622a2) +D 4 (#68c4c3) +R 4 (#2c5f92) +D 3 (#8021d3) +R 5 (#75bd02) +D 3 (#1885a1) +R 3 (#67b420) +D 3 (#7df001) +R 6 (#67b422) +D 2 (#5270f1) +R 3 (#2bbed2) +D 9 (#863371) +L 3 (#45ba70) +D 6 (#49f553) +L 2 (#693800) +D 6 (#49f551) +L 7 (#450b90) +D 7 (#3b7aa1) +R 5 (#399050) +D 2 (#0b37f1) +R 4 (#5cbff0) +U 4 (#573103) +R 3 (#3668c0) +U 9 (#573101) +R 4 (#7d0a50) +U 7 (#316341) +R 3 (#4cbab0) +U 8 (#5c0f21) +R 3 (#22b3a2) +U 3 (#804941) +R 4 (#22b3a0) +U 7 (#173641) +R 5 (#1b7230) +U 3 (#8a0511) +R 4 (#1a5f82) +D 5 (#52eda1) +R 4 (#1a5f80) +U 5 (#38db21) +R 5 (#2f4720) +U 2 (#2a75c1) +R 9 (#aa4d40) +U 3 (#538141) +L 3 (#7ad770) +U 5 (#66ec01) +L 5 (#53e812) +U 3 (#539a81) +L 4 (#53e810) +U 5 (#413821) +L 5 (#618330) +D 5 (#a4bf71) +L 6 (#56e4b2) +U 3 (#acf591) +L 2 (#890732) +U 8 (#2a62d1) +R 4 (#458e22) +U 5 (#2ef8e3) +R 4 (#273c60) +U 4 (#439bc3) +R 2 (#273c62) +D 4 (#64c3c3) +R 5 (#0e0c12) +D 5 (#9481d1) +R 3 (#5321d2) +U 4 (#5d6361) +R 7 (#531760) +U 7 (#068711) +R 7 (#216570) +U 7 (#a20e51) +L 3 (#216572) +D 3 (#46afb1) +L 8 (#4e8f70) +D 6 (#1261b1) +L 5 (#3840e0) +U 6 (#7b0901) +L 3 (#75cf00) +U 3 (#b56e51) +L 7 (#43b850) +U 3 (#01dfc1) +L 6 (#067e40) +U 7 (#613913) +R 5 (#30ff10) +U 7 (#285d33) +R 5 (#72e5c0) +D 7 (#285d31) +R 3 (#3fdcf0) +U 6 (#601d03) +R 4 (#312812) +U 4 (#4ea643) +R 6 (#8253e2) +D 7 (#4ea641) +R 2 (#3045d2) +U 7 (#8362b3) +R 7 (#631a70) +U 4 (#ba56c3) +R 6 (#28e520) +U 2 (#568a53) +R 3 (#c1d452) +U 2 (#3e2a33) +R 5 (#c1d450) +U 5 (#0f6e43) +R 4 (#c65ae0) +U 3 (#790e83) +R 2 (#012b40) +U 7 (#2ea6b3) +R 4 (#358722) +D 2 (#7b3bf3) +R 6 (#adbd32) +D 4 (#4f7b63) +R 5 (#0d26f2) +U 5 (#47f363) +R 2 (#4c6160) +D 5 (#70ff63) +R 5 (#284290) +D 3 (#231103) +L 7 (#540e80) +D 2 (#8b51b3) +L 5 (#662c40) +D 4 (#22e7e3) +R 7 (#1d46a0) +D 3 (#343a43) +L 6 (#4d7d90) +D 4 (#31a643) +L 10 (#4e6b30) +U 4 (#31a641) +L 4 (#5abc90) +D 3 (#799953) +L 4 (#9e4ed0) +D 5 (#3b73e3) +R 7 (#390760) +D 3 (#bd3533) +L 7 (#390762) +D 5 (#075bd3) +L 3 (#1b7350) +D 3 (#a01d23) +R 4 (#a56752) +D 2 (#6a4313) +R 5 (#529462) +D 4 (#843c43) +R 4 (#829482) +U 4 (#7914e3) +R 3 (#2f0b90) +U 7 (#5f3d53) +R 6 (#114980) +D 7 (#60b7e3) +R 4 (#b9b2f0) +D 4 (#60b7e1) +R 5 (#2143f0) +D 3 (#2f86d3) +L 7 (#5f4440) +D 4 (#366293) +L 5 (#5baae0) +U 8 (#80a9a3) +L 3 (#61f680) +D 8 (#80a9a1) +L 5 (#8bdce0) +U 4 (#46e4d1) +L 5 (#120950) +D 8 (#7c15b1) +L 4 (#641450) +D 2 (#047bf1) +L 2 (#3b00c0) +D 7 (#a18c33) +L 3 (#543b70) +D 2 (#a18c31) +L 7 (#466150) +D 4 (#5c3ad1) +R 4 (#5caa80) +D 2 (#230201) +R 6 (#955102) +D 6 (#b200c1) +R 7 (#955100) +D 3 (#1d8ff1) +R 3 (#26f9d0) +D 8 (#160d71) +R 2 (#483920) +D 4 (#4577c3) +R 8 (#92ef90) +D 5 (#a57e83) +R 7 (#0715a0) +D 3 (#1da9e3) +L 2 (#627970) +D 6 (#573ee1) +L 8 (#006f30) +D 4 (#735da1) +L 4 (#006f32) +D 4 (#266951) +R 3 (#9745a0) +D 6 (#412bb1) +R 7 (#83f8f2) +D 2 (#6c4d31) +R 4 (#6a7e72) +D 3 (#578921) +L 7 (#6c5d92) +D 2 (#5485c1) +L 5 (#300852) +D 4 (#cdf091) +L 2 (#544dd2) +D 3 (#1259f1) +L 7 (#882292) +D 6 (#03e4b1) +R 7 (#cdf192) +D 3 (#5f3c41) +R 4 (#c836b0) +D 5 (#4cfdc1) +L 2 (#36a590) +D 4 (#244753) +L 2 (#73bd60) +D 3 (#244751) +L 7 (#72cc90) +U 4 (#0e0d21) +L 5 (#21ce60) +D 4 (#523dd1) +L 9 (#041252) +D 3 (#8cfc81) +R 5 (#041250) +D 5 (#365031) +R 6 (#21ce62) +U 5 (#17b3e1) +R 5 (#75a900) +D 3 (#8d4fe1) +R 4 (#75a902) +D 3 (#342091) +R 5 (#8d5570) +D 5 (#a6f9a3) +R 5 (#59f560) +D 4 (#49ae63) +R 5 (#59f562) +D 5 (#2dc6c3) +R 4 (#8fb550) +U 6 (#884bf3) +R 3 (#17ea50) +U 4 (#560143) +R 5 (#623ad0) +D 8 (#5dfc41) +R 5 (#ca0040) +D 2 (#5bc201) +R 4 (#ca0042) +D 3 (#7008b1) +R 7 (#b87530) +U 4 (#5e8821) +R 4 (#817080) +U 7 (#69e951) +R 2 (#518e30) +U 4 (#0e9831) +R 5 (#29ea82) +D 4 (#26f041) +R 9 (#6a1862) +D 4 (#8d3971) +L 4 (#6a1860) +D 4 (#215e71) +L 5 (#29ea80) +D 3 (#282e61) +R 3 (#bc6172) +D 8 (#17c4f1) +L 6 (#1abf10) +U 5 (#1a15e1) +L 3 (#2ed960) +D 5 (#24f4f3) +L 4 (#9d6b00) +D 6 (#24f4f1) +L 2 (#704c40) +D 4 (#45b0c1) +L 5 (#93a182) +D 6 (#53b3b1) +L 5 (#5f72d2) +U 6 (#76a9f1) +L 4 (#643b62) +D 3 (#3f41f1) +L 6 (#691122) +D 2 (#606491) +L 5 (#4c5b02) +D 5 (#6d1fa1) +L 2 (#bf6472) +D 6 (#6d1fa3) +L 6 (#989bb2) +U 4 (#606493) +L 3 (#348412) +U 6 (#9e4561) +L 4 (#9b1742) +U 8 (#42a901) +L 5 (#09f8f2) +U 3 (#63a8c3) +R 8 (#591640) +U 4 (#2dcda3) +L 8 (#591642) +U 4 (#4f7803) +L 2 (#3e5fe2) +U 5 (#0b9e93) +L 3 (#cae6b2) +U 4 (#7399f3) +L 7 (#28c482) +U 6 (#d2ee83) +L 3 (#28c480) +U 6 (#2f0423) +L 3 (#320f52) +U 2 (#5f4ab1) +L 4 (#8d6672) +U 6 (#b09261) +L 6 (#718952) +D 8 (#750591) +L 4 (#33df82) +D 5 (#1052a1) +L 4 (#9a90e2) +U 6 (#8eb861) +L 2 (#0c1e92) +U 4 (#53b871) +L 4 (#0739f2) +U 4 (#76cfb1) +L 6 (#9b6922) +U 7 (#76cfb3) +L 5 (#846eb2) +D 4 (#53b873) +L 3 (#6b7ae2) +D 4 (#59dd21) +L 2 (#60b0b2) +D 6 (#a53b01) +R 5 (#767632) +D 4 (#6c6bb1) +L 4 (#b3a932) +D 3 (#0660a1) +L 5 (#12b390) +U 4 (#9c9d01) +L 4 (#12b392) +U 3 (#910691) +L 4 (#8dec12) +U 6 (#65ba53) +L 3 (#1e02b2) +U 2 (#b05803) +L 2 (#1e02b0) +U 8 (#8a5d93) +L 2 (#3bea42) +U 5 (#032da3) +R 8 (#0aabc2) +U 3 (#4a0a13) +L 8 (#9f1c02) +U 4 (#58a0f3) +L 3 (#9f1c00) +D 3 (#3a2cf3) +L 7 (#169b22) +D 2 (#004253) +L 2 (#841fd2) +D 9 (#0b8473) +L 4 (#3f85a2) +D 6 (#134bd3) +L 2 (#17f832) +D 5 (#8870f3) +L 2 (#87cf62) +D 3 (#8b9fa3) +L 2 (#6ca082) +D 3 (#9a6ea3) +L 7 (#60cbc2) +D 4 (#9a6ea1) +L 2 (#296752) +D 3 (#b0d5c3) +L 8 (#0e0100) +D 5 (#218503) +L 6 (#36a620) +D 7 (#071463) +L 3 (#669dd0) +D 3 (#3099a1) +L 7 (#385d40) +D 5 (#3099a3) +L 7 (#3c66b0) +D 3 (#8fec33) +L 2 (#4ce142) +D 4 (#4b7051) +L 8 (#55b322) +D 3 (#4b7053) +L 7 (#38cd62) +D 3 (#668b13) +L 4 (#36a622) +D 2 (#581f83) +L 4 (#0e0102) +D 7 (#356bd3) +L 5 (#3eb472) +D 3 (#4ca003) +L 3 (#6afe62) +D 5 (#4ca001) +L 5 (#536dd2) +U 8 (#978bb3) +L 5 (#6118d2) +U 7 (#aec403)