51 lines
1.4 KiB
Zig
51 lines
1.4 KiB
Zig
const std = @import("std");
|
|
const alloc = std.heap.page_allocator;
|
|
const List = std.ArrayList;
|
|
|
|
pub const Card = struct {
|
|
winning: List(u32),
|
|
having: List(u32),
|
|
};
|
|
|
|
pub fn parse(data: []const u8) !List(Card) {
|
|
var lines = std.mem.tokenizeSequence(u8, data, "\n");
|
|
|
|
var cards = List(Card).init(alloc);
|
|
|
|
while (lines.next()) |line| {
|
|
var line_parts = std.mem.tokenizeSequence(u8, line, ": ");
|
|
_ = line_parts.next();
|
|
|
|
const numbers = line_parts.next().?;
|
|
var number_parts = std.mem.tokenizeSequence(u8, numbers, " | ");
|
|
|
|
const winning = number_parts.next().?;
|
|
var winning_numbers = std.mem.tokenizeSequence(u8, winning, " ");
|
|
|
|
var winning_parsed = List(u32).init(alloc);
|
|
|
|
while (winning_numbers.next()) |num_str| {
|
|
const num = try std.fmt.parseInt(u32, num_str, 10);
|
|
try winning_parsed.append(num);
|
|
}
|
|
|
|
const having = number_parts.next().?;
|
|
var having_numbers = std.mem.tokenizeSequence(u8, having, " ");
|
|
var having_parsed = List(u32).init(alloc);
|
|
|
|
while (having_numbers.next()) |num_str| {
|
|
const num = try std.fmt.parseInt(u32, num_str, 10);
|
|
try having_parsed.append(num);
|
|
}
|
|
|
|
const card = .{
|
|
.winning = winning_parsed,
|
|
.having = having_parsed,
|
|
};
|
|
|
|
try cards.append(card);
|
|
}
|
|
|
|
return cards;
|
|
}
|