val white, black, purple, red, green, orange, none
= Value
}
def fix
(fixed
: List
[List
[String
]] = List.
empty, lines
: List
[String
]): List
[List
[String
]] = { if (!lines.
contains("")) { lines :: fixed
val (current, unfixed
) = lines.
splitAt(lines.
indexOf("")) fix(current :: fixed, unfixed.tail)
}
}
def cut
(wires
: Seq
[Wire.
Value], prev
: Wire.
Value = Wire.
none): Boolean
= { case Wire.
white => current
== Wire.
white || current
== Wire.
black case Wire.
red => current
!= Wire.
green case Wire.
black => current
== Wire.
white || current
== Wire.
green || current
== Wire.
orange case Wire.
orange => current
!= Wire.
red && current
!= Wire.
black case Wire.
green => current
!= Wire.
orange && current
!= Wire.
white case Wire.
purple => current
== Wire.
purple || current
== Wire.
orange || current
== Wire.
green || current
== Wire.
white }
}
fix
(lines
= io.
Source.
stdin.
getLines.
toList).
map(_.
map(Wire.
withName)).
map(cut
(_)).
reverse.
foreach(s
=> println
(if (s
) "Bomb defused" else "Boom"))}
b2JqZWN0IE1haW4gZXh0ZW5kcyBBcHAgewogIG9iamVjdCBXaXJlIGV4dGVuZHMgRW51bWVyYXRpb24gewogICAgdmFsIHdoaXRlLCBibGFjaywgcHVycGxlLCByZWQsIGdyZWVuLCBvcmFuZ2UsIG5vbmUgPSBWYWx1ZQogIH0KICBkZWYgZml4KGZpeGVkOiBMaXN0W0xpc3RbU3RyaW5nXV0gPSBMaXN0LmVtcHR5LCBsaW5lczogTGlzdFtTdHJpbmddKTogTGlzdFtMaXN0W1N0cmluZ11dID0gewogICAgaWYgKCFsaW5lcy5jb250YWlucygiIikpIHsKICAgICAgbGluZXMgOjogZml4ZWQKICAgIH0gZWxzZSB7CiAgICAgIHZhbCAoY3VycmVudCwgdW5maXhlZCkgPSBsaW5lcy5zcGxpdEF0KGxpbmVzLmluZGV4T2YoIiIpKQogICAgICBmaXgoY3VycmVudCA6OiBmaXhlZCwgdW5maXhlZC50YWlsKQogICAgfQogIH0KICBkZWYgY3V0KHdpcmVzOiBTZXFbV2lyZS5WYWx1ZV0sIHByZXY6IFdpcmUuVmFsdWUgPSBXaXJlLm5vbmUpOiBCb29sZWFuID0gewogICAgaWYgKHdpcmVzLmlzRW1wdHkpIHJldHVybiB0cnVlCiAgICB2YWwgY3VycmVudCA9IHdpcmVzLmhlYWQKICAgIHZhbCBib29tID0gcHJldiBtYXRjaCB7CiAgICAgIGNhc2UgV2lyZS53aGl0ZSA9PiBjdXJyZW50ID09IFdpcmUud2hpdGUgfHwgY3VycmVudCA9PSBXaXJlLmJsYWNrCiAgICAgIGNhc2UgV2lyZS5yZWQgPT4gY3VycmVudCAhPSBXaXJlLmdyZWVuCiAgICAgIGNhc2UgV2lyZS5ibGFjayA9PiBjdXJyZW50ID09IFdpcmUud2hpdGUgfHwgY3VycmVudCA9PSBXaXJlLmdyZWVuIHx8IGN1cnJlbnQgPT0gV2lyZS5vcmFuZ2UKICAgICAgY2FzZSBXaXJlLm9yYW5nZSA9PiBjdXJyZW50ICE9IFdpcmUucmVkICYmIGN1cnJlbnQgIT0gV2lyZS5ibGFjawogICAgICBjYXNlIFdpcmUuZ3JlZW4gPT4gY3VycmVudCAhPSBXaXJlLm9yYW5nZSAmJiBjdXJyZW50ICE9IFdpcmUud2hpdGUKICAgICAgY2FzZSBXaXJlLnB1cnBsZSA9PiBjdXJyZW50ID09IFdpcmUucHVycGxlIHx8IGN1cnJlbnQgPT0gV2lyZS5vcmFuZ2UgfHwgY3VycmVudCA9PSBXaXJlLmdyZWVuIHx8IGN1cnJlbnQgPT0gV2lyZS53aGl0ZQogICAgICBjYXNlIFdpcmUubm9uZSA9PiBmYWxzZQogICAgfQogICAgaWYgKGJvb20pIGZhbHNlIGVsc2UgY3V0KHdpcmVzLnRhaWwsIGN1cnJlbnQpCiAgfQogIGZpeChsaW5lcyA9IGlvLlNvdXJjZS5zdGRpbi5nZXRMaW5lcy50b0xpc3QpLm1hcChfLm1hcChXaXJlLndpdGhOYW1lKSkubWFwKGN1dChfKSkucmV2ZXJzZS5mb3JlYWNoKHMgPT4gcHJpbnRsbihpZiAocykgIkJvbWIgZGVmdXNlZCIgZWxzZSAiQm9vbSIpKQp9