input.zig 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. const std = @import("std");
  2. const print = std.debug.print;
  3. pub const Button = struct {
  4. indicatorsConnected: []usize,
  5. };
  6. pub const MachineScheme = struct {
  7. indicatorDiagram: []bool,
  8. buttons: []Button,
  9. joltages: []i32,
  10. };
  11. pub fn readInputIntoString(allocator: std.mem.Allocator, fileName: []const u8) ![]u8 {
  12. const inputFile = try std.fs.cwd().openFile(
  13. fileName, .{.mode = .read_only,});
  14. defer inputFile.close();
  15. var inputFileReader = inputFile.reader(
  16. try allocator.alignedAlloc(u8, null, 1024));
  17. const inputFileSize = try inputFileReader.getSize();
  18. const inputBuffer = try allocator.alignedAlloc(u8, null, inputFileSize);
  19. try inputFileReader.interface.readSliceAll(inputBuffer);
  20. return inputBuffer;
  21. }
  22. fn parseIndicatorDiagram(allocator: std.mem.Allocator, text: []const u8) ![]bool {
  23. var indicators = std.ArrayList(bool).empty;
  24. for (text) |c| {
  25. const newIndicator = try indicators.addOne(allocator);
  26. if (c == '#') {
  27. newIndicator.* = true;
  28. } else {
  29. newIndicator.* = false;
  30. }
  31. }
  32. return indicators.items;
  33. }
  34. fn parseButton(allocator: std.mem.Allocator, text: []const u8) !Button {
  35. var indicators = std.ArrayList(usize).empty;
  36. var tokens = std.mem.tokenizeScalar(u8, text, ',');
  37. while (tokens.next()) |newIndicatorText| {
  38. const newIndicator = try indicators.addOne(allocator);
  39. newIndicator.* = try std.fmt.parseInt(usize, newIndicatorText, 10);
  40. }
  41. const button: Button = .{
  42. .indicatorsConnected = indicators.items,
  43. };
  44. print("Button: {[button]any}\n", .{.button = button});
  45. return button;
  46. }
  47. pub fn readMachineScheme(allocator: std.mem.Allocator, line: []const u8) !MachineScheme {
  48. var indicatorDiagram: []bool = &.{};
  49. var buttons = std.ArrayList(Button).empty;
  50. const joltages:[]i32 = &.{};
  51. var tokens = std.mem.tokenizeScalar(u8, line, ' ');
  52. while (tokens.next()) |token| {
  53. const tokenContent = token[1..token.len-1];
  54. if (token[0] == '[') {
  55. indicatorDiagram = try parseIndicatorDiagram(allocator, tokenContent);
  56. } else if (token[0] == '(') {
  57. const newButton = try buttons.addOne(allocator);
  58. newButton.* = try parseButton(allocator, tokenContent);
  59. }
  60. }
  61. const machineScheme: MachineScheme = .{
  62. .indicatorDiagram = indicatorDiagram,
  63. .buttons = buttons.items,
  64. .joltages = joltages,
  65. };
  66. return machineScheme;
  67. }
  68. pub fn readInput(allocator: std.mem.Allocator, fileName: []const u8) ![]MachineScheme {
  69. const inputBuffer = try readInputIntoString(allocator, fileName);
  70. var machineSchemes = std.ArrayList(MachineScheme).empty;
  71. var lines = std.mem.tokenizeScalar(u8, inputBuffer, '\n');
  72. while (lines.next()) |line| {
  73. const newMachineScheme = try machineSchemes.addOne(allocator);
  74. newMachineScheme.* = try readMachineScheme(allocator, line);
  75. }
  76. return machineSchemes.items;
  77. }