github.com/cycloss/advent-of-code@v0.0.0-20221210145555-15039b95faa6/2021/day13/day13.dart (about)

     1  import 'dart:convert';
     2  import 'dart:io';
     3  
     4  import 'parser.dart';
     5  
     6  void main() async {
     7    var lines = await File("day13.txt")
     8        .openRead()
     9        .transform(Utf8Decoder())
    10        .transform(LineSplitter())
    11        .toList();
    12  
    13    var solution = Solution(lines);
    14    print("Part 1 Solution: ${solution.part1()}");
    15  
    16    var solution2 = Solution(lines);
    17    solution2.part2();
    18  }
    19  
    20  class Solution {
    21    final Problem problem;
    22  
    23    Solution(List<String> lines) : problem = Parser(lines).processLines();
    24  
    25    int part1() {
    26      for (var ins in problem.instructions) {
    27        if (ins.axis == 'x') {
    28          problem.grid = foldXAxis(problem.grid, ins.index);
    29          break;
    30        } else {
    31          problem.grid = foldYAxis(problem.grid, ins.index);
    32          break;
    33        }
    34      }
    35      return countVisibleDots(problem.grid);
    36    }
    37  
    38    List<List<bool>> foldXAxis(List<List<bool>> grid, int index) {
    39      for (var c = grid[0].length - 1; c > index; c--) {
    40        var rc = (grid[0].length - 1) - c;
    41        for (var j = 0; j < grid.length; j++) {
    42          var b = grid[j][c];
    43          if (b) {
    44            grid[j][rc] = true;
    45          }
    46        }
    47      }
    48      var newRows = <List<bool>>[];
    49  
    50      for (var c = 0; c < index; c++) {
    51        for (var j = 0; j < grid.length; j++) {
    52          if (newRows.length - 1 < j) {
    53            newRows.add([]);
    54          }
    55          newRows[j].add(grid[j][c]);
    56        }
    57      }
    58      return newRows;
    59    }
    60  
    61    List<List<bool>> foldYAxis(List<List<bool>> grid, int index) {
    62      for (var i = grid.length - 1; i > index; i--) {
    63        var ri = (grid.length - 1) - i;
    64        var row = grid[i];
    65        var rrow = grid[ri];
    66        for (var j = 0; j < row.length; j++) {
    67          if (row[j]) {
    68            rrow[j] = true;
    69          }
    70        }
    71      }
    72      var newRows = <List<bool>>[];
    73      for (var i = 0; i < index; i++) {
    74        newRows.add(grid[i]);
    75      }
    76      return newRows;
    77    }
    78  
    79    int countVisibleDots(List<List<bool>> grid) {
    80      return grid.fold(0,
    81          (tot, row) => tot + row.fold(0, (tot2, dot) => tot2 + (dot ? 1 : 0)));
    82    }
    83  
    84    void part2() {
    85      for (var ins in problem.instructions) {
    86        if (ins.axis == 'x') {
    87          problem.grid = foldXAxis(problem.grid, ins.index);
    88        } else {
    89          problem.grid = foldYAxis(problem.grid, ins.index);
    90        }
    91      }
    92      for (var row in problem.grid) {
    93        for (var b in row) {
    94          stdout.write(b ? "#" : " ");
    95        }
    96        stdout.write("\n");
    97      }
    98    }
    99  }