Created
December 7, 2015 19:23
-
-
Save stsatlantis/bba608f3fce9ccc47ff4 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 hu.stsatlantis.fun.adventofcode2015 | |
import scala.annotation.tailrec | |
/** | |
* Created by Barni on 2015.12.06.. | |
*/ | |
case class Coordinate(x: Int, y: Int) | |
object Day6 extends App { | |
val input = "turn on 887,9 through 959,629;turn on 454,398 through 844,448;turn off 539,243 through 559,965;turn off 370,819 through 676,868;turn off 145,40 through 370,997;turn off 301,3 through 808,453;turn on 351,678 through 951,908;toggle 720,196 through 897,994;toggle 831,394 through 904,860;toggle 753,664 through 970,926;turn off 150,300 through 213,740;turn on 141,242 through 932,871;toggle 294,259 through 474,326;toggle 678,333 through 752,957;toggle 393,804 through 510,976;turn off 6,964 through 411,976;turn off 33,572 through 978,590;turn on 579,693 through 650,978;turn on 150,20 through 652,719;turn off 782,143 through 808,802;turn off 240,377 through 761,468;turn off 899,828 through 958,967;turn on 613,565 through 952,659;turn on 295,36 through 964,978;toggle 846,296 through 969,528;turn off 211,254 through 529,491;turn off 231,594 through 406,794;turn off 169,791 through 758,942;turn on 955,440 through 980,477;toggle 944,498 through 995,928;turn on 519,391 through 605,718;toggle 521,303 through 617,366;turn off 524,349 through 694,791;toggle 391,87 through 499,792;toggle 562,527 through 668,935;turn off 68,358 through 857,453;toggle 815,811 through 889,828;turn off 666,61 through 768,87;turn on 27,501 through 921,952;turn on 953,102 through 983,471;turn on 277,552 through 451,723;turn off 64,253 through 655,960;turn on 47,485 through 734,977;turn off 59,119 through 699,734;toggle 407,898 through 493,955;toggle 912,966 through 949,991;turn on 479,990 through 895,990;toggle 390,589 through 869,766;toggle 593,903 through 926,943;toggle 358,439 through 870,528;turn off 649,410 through 652,875;turn on 629,834 through 712,895;toggle 254,555 through 770,901;toggle 641,832 through 947,850;turn on 268,448 through 743,777;turn off 512,123 through 625,874;turn off 498,262 through 930,811;turn off 835,158 through 886,242;toggle 546,310 through 607,773;turn on 501,505 through 896,909;turn off 666,796 through 817,924;toggle 987,789 through 993,809;toggle 745,8 through 860,693;toggle 181,983 through 731,988;turn on 826,174 through 924,883;turn on 239,228 through 843,993;turn on 205,613 through 891,667;toggle 867,873 through 984,896;turn on 628,251 through 677,681;toggle 276,956 through 631,964;turn on 78,358 through 974,713;turn on 521,360 through 773,597;turn off 963,52 through 979,502;turn on 117,151 through 934,622;toggle 237,91 through 528,164;turn on 944,269 through 975,453;toggle 979,460 through 988,964;turn off 440,254 through 681,507;toggle 347,100 through 896,785;turn off 329,592 through 369,985;turn on 931,960 through 979,985;toggle 703,3 through 776,36;toggle 798,120 through 908,550;turn off 186,605 through 914,709;turn off 921,725 through 979,956;toggle 167,34 through 735,249;turn on 726,781 through 987,936;toggle 720,336 through 847,756;turn on 171,630 through 656,769;turn off 417,276 through 751,500;toggle 559,485 through 584,534;turn on 568,629 through 690,873;toggle 248,712 through 277,988;toggle 345,594 through 812,723;turn off 800,108 through 834,618;turn off 967,439 through 986,869;turn on 842,209 through 955,529;turn on 132,653 through 357,696;turn on 817,38 through 973,662;turn off 569,816 through 721,861;turn on 568,429 through 945,724;turn on 77,458 through 844,685;turn off 138,78 through 498,851;turn on 136,21 through 252,986;turn off 2,460 through 863,472;turn on 172,81 through 839,332;turn on 123,216 through 703,384;turn off 879,644 through 944,887;toggle 227,491 through 504,793;toggle 580,418 through 741,479;toggle 65,276 through 414,299;toggle 482,486 through 838,931;turn off 557,768 through 950,927;turn off 615,617 through 955,864;turn on 859,886 through 923,919;turn on 391,330 through 499,971;toggle 521,835 through 613,847;turn on 822,787 through 989,847;turn on 192,142 through 357,846;turn off 564,945 through 985,945;turn off 479,361 through 703,799;toggle 56,481 through 489,978;turn off 632,991 through 774,998;toggle 723,526 through 945,792;turn on 344,149 through 441,640;toggle 568,927 through 624,952;turn on 621,784 through 970,788;toggle 665,783 through 795,981;toggle 386,610 through 817,730;toggle 440,399 through 734,417;toggle 939,201 through 978,803;turn off 395,883 through 554,929;turn on 340,309 through 637,561;turn off 875,147 through 946,481;turn off 945,837 through 957,922;turn off 429,982 through 691,991;toggle 227,137 through 439,822;toggle 4,848 through 7,932;turn off 545,146 through 756,943;turn on 763,863 through 937,994;turn on 232,94 through 404,502;turn off 742,254 through 930,512;turn on 91,931 through 101,942;toggle 585,106 through 651,425;turn on 506,700 through 567,960;turn off 548,44 through 718,352;turn off 194,827 through 673,859;turn off 6,645 through 509,764;turn off 13,230 through 821,361;turn on 734,629 through 919,631;toggle 788,552 through 957,972;toggle 244,747 through 849,773;turn off 162,553 through 276,887;turn off 569,577 through 587,604;turn off 799,482 through 854,956;turn on 744,535 through 909,802;toggle 330,641 through 396,986;turn off 927,458 through 966,564;toggle 984,486 through 986,913;toggle 519,682 through 632,708;turn on 984,977 through 989,986;toggle 766,423 through 934,495;turn on 17,509 through 947,718;turn on 413,783 through 631,903;turn on 482,370 through 493,688;turn on 433,859 through 628,938;turn off 769,549 through 945,810;turn on 178,853 through 539,941;turn off 203,251 through 692,433;turn off 525,638 through 955,794;turn on 169,70 through 764,939;toggle 59,352 through 896,404;toggle 143,245 through 707,320;turn off 103,35 through 160,949;toggle 496,24 through 669,507;turn off 581,847 through 847,903;turn on 689,153 through 733,562;turn on 821,487 through 839,699;turn on 837,627 through 978,723;toggle 96,748 through 973,753;toggle 99,818 through 609,995;turn on 731,193 through 756,509;turn off 622,55 through 813,365;turn on 456,490 through 576,548;turn on 48,421 through 163,674;turn off 853,861 through 924,964;turn off 59,963 through 556,987;turn on 458,710 through 688,847;toggle 12,484 through 878,562;turn off 241,964 through 799,983;turn off 434,299 through 845,772;toggle 896,725 through 956,847;turn on 740,289 through 784,345;turn off 395,840 through 822,845;turn on 955,224 through 996,953;turn off 710,186 through 957,722;turn off 485,949 through 869,985;turn on 848,209 through 975,376;toggle 221,241 through 906,384;turn on 588,49 through 927,496;turn on 273,332 through 735,725;turn on 505,962 through 895,962;toggle 820,112 through 923,143;turn on 919,792 through 978,982;toggle 489,461 through 910,737;turn off 202,642 through 638,940;turn off 708,953 through 970,960;toggle 437,291 through 546,381;turn on 409,358 through 837,479;turn off 756,279 through 870,943;turn off 154,657 through 375,703;turn off 524,622 through 995,779;toggle 514,221 through 651,850;toggle 808,464 through 886,646;toggle 483,537 through 739,840;toggle 654,769 through 831,825;turn off 326,37 through 631,69;turn off 590,570 through 926,656;turn off 881,913 through 911,998;turn on 996,102 through 998,616;turn off 677,503 through 828,563;turn on 860,251 through 877,441;turn off 964,100 through 982,377;toggle 888,403 through 961,597;turn off 632,240 through 938,968;toggle 731,176 through 932,413;turn on 5,498 through 203,835;turn on 819,352 through 929,855;toggle 393,813 through 832,816;toggle 725,689 through 967,888;turn on 968,950 through 969,983;turn off 152,628 through 582,896;turn off 165,844 through 459,935;turn off 882,741 through 974,786;turn off 283,179 through 731,899;toggle 197,366 through 682,445;turn on 106,309 through 120,813;toggle 950,387 through 967,782;turn off 274,603 through 383,759;turn off 155,665 through 284,787;toggle 551,871 through 860,962;turn off 30,826 through 598,892;toggle 76,552 through 977,888;turn on 938,180 through 994,997;toggle 62,381 through 993,656;toggle 625,861 through 921,941;turn on 685,311 through 872,521;turn on 124,934 through 530,962;turn on 606,379 through 961,867;turn off 792,735 through 946,783;turn on 417,480 through 860,598;toggle 178,91 through 481,887;turn off 23,935 through 833,962;toggle 317,14 through 793,425;turn on 986,89 through 999,613;turn off 359,201 through 560,554;turn off 729,494 through 942,626;turn on 204,143 through 876,610;toggle 474,97 through 636,542;turn off 902,924 through 976,973;turn off 389,442 through 824,638;turn off 622,863 through 798,863;turn on 840,622 through 978,920;toggle 567,374 through 925,439;turn off 643,319 through 935,662;toggle 185,42 through 294,810;turn on 47,124 through 598,880;toggle 828,303 through 979,770;turn off 174,272 through 280,311;turn off 540,50 through 880,212;turn on 141,994 through 221,998;turn on 476,695 through 483,901;turn on 960,216 through 972,502;toggle 752,335 through 957,733;turn off 419,713 through 537,998;toggle 772,846 through 994,888;turn on 881,159 through 902,312;turn off 537,651 through 641,816;toggle 561,947 through 638,965;turn on 368,458 through 437,612;turn on 290,149 through 705,919;turn on 711,918 through 974,945;toggle 916,242 through 926,786;toggle 522,272 through 773,314;turn on 432,897 through 440,954;turn off 132,169 through 775,380;toggle 52,205 through 693,747;toggle 926,309 through 976,669;turn off 838,342 through 938,444;turn on 144,431 through 260,951;toggle 780,318 through 975,495;turn off 185,412 through 796,541;turn on 879,548 through 892,860;turn on 294,132 through 460,338;turn on 823,500 through 899,529;turn off 225,603 through 483,920;toggle 717,493 through 930,875;toggle 534,948 through 599,968;turn on 522,730 through 968,950;turn off 102,229 through 674,529" | |
def strToCoordinates(fromString: String): Coordinate = { | |
val fa = fromString.split(",").map(_.toInt) | |
Coordinate(fa(0), fa(1)) | |
} | |
def task1(lights: List[List[Boolean]], command: List[List[String]]): Int = { | |
@tailrec | |
def processTask1(lights: List[List[Boolean]], command: List[List[String]]): List[List[Boolean]] = { | |
@tailrec | |
def processCommands(lights: List[List[Boolean]], from: Coordinate, to: Coordinate, coord: Coordinate, f: Boolean => Boolean): List[List[Boolean]] = { | |
if (coord.y > to.y) lights | |
else if (coord.x > to.x) processCommands(lights, from, to, coord.copy(x = from.x, y = coord.y + 1), f) | |
else processCommands(lights = lights.updated(coord.x, lights(coord.x).updated(coord.y, f(lights(coord.x)(coord.y)))), from, to, coord.copy(x = coord.x + 1, y = coord.y), f) | |
} | |
command match { | |
case Nil => lights | |
case List("toggle", from: String, _, to: String) :: xs => | |
processTask1(processCommands(lights = lights, from = strToCoordinates(from), to = strToCoordinates(to), coord = strToCoordinates(from), a => !a), xs) | |
case List(_, "on", from: String, _, to: String) :: xs => | |
processTask1(processCommands(lights = lights, from = strToCoordinates(from), to = strToCoordinates(to), coord = strToCoordinates(from), a => true), xs) | |
case List(_, "off", from: String, _, to: String) :: xs => | |
processTask1(processCommands(lights = lights, from = strToCoordinates(from), to = strToCoordinates(to), coord = strToCoordinates(from), a => false), xs) | |
case _ => lights | |
} | |
} | |
val finalLights = processTask1(lights, command) | |
@tailrec | |
def processCount(lights: List[List[Boolean]], count: Int): Int = { | |
lights match { | |
case Nil => count | |
case h :: t => processCount(t, h.count(a => a) + count) | |
} | |
} | |
processCount(finalLights, 0) | |
} | |
def task2(lights: List[List[Int]], command: List[List[String]]): Int = { | |
@tailrec | |
def processTask2(lights: List[List[Int]], command: List[List[String]]): List[List[Int]] = { | |
@tailrec | |
def processCommands(lights: List[List[Int]], from: Coordinate, to: Coordinate, coord: Coordinate, f: Int => Int): List[List[Int]] = { | |
if (coord.y > to.y) lights | |
else if (coord.x > to.x) processCommands(lights, from, to, coord.copy(x = from.x, y = coord.y + 1), f) | |
else processCommands(lights = lights.updated(coord.x, lights(coord.x).updated(coord.y, f(lights(coord.x)(coord.y)))), from, to, coord.copy(x = coord.x + 1, y = coord.y), f) | |
} | |
command match { | |
case Nil => lights | |
case List("toggle", from: String, _, to: String) :: xs => | |
processTask2(processCommands(lights = lights, from = strToCoordinates(from), to = strToCoordinates(to), coord = strToCoordinates(from), a => a+2), xs) | |
case List(_, "on", from: String, _, to: String) :: xs => | |
processTask2(processCommands(lights = lights, from = strToCoordinates(from), to = strToCoordinates(to), coord = strToCoordinates(from), a => a+1), xs) | |
case List(_, "off", from: String, _, to: String) :: xs => | |
processTask2(processCommands(lights = lights, from = strToCoordinates(from), to = strToCoordinates(to), coord = strToCoordinates(from), a => if(a == 0) 0 else a-1), xs) | |
case _ => lights | |
} | |
} | |
val finalLights = processTask2(lights, command) | |
@tailrec | |
def processCount(lights: List[List[Int]], count: Int, rowCount: Int): Int = { | |
println(rowCount + ":" + count) | |
lights match { | |
case Nil => count | |
case h :: t => processCount(t, h.sum + count, rowCount + 1) | |
} | |
} | |
processCount(finalLights, 0, 0) | |
} | |
//val lights1 = List.fill(1000, 1000)(false) | |
val lights2 = List.fill(1000, 1000)(0) | |
//println(task1(lights1, input.split(";").toList.map(a => a.split(" ").toList))) | |
println(task2(lights2, input.split(";").toList.map(a => a.split(" ").toList))) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment