1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
const std = @import("std");
pub fn main() !void {
var file = try std.fs.cwd().openFile("input", .{});
defer file.close();
var reader = file.reader();
var output: [100]u8 = undefined;
var output_fbs = std.io.fixedBufferStream(&output);
const writer = output_fbs.writer();
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
var list1 = std.ArrayList(i32).init(allocator);
defer list1.deinit();
var map = std.AutoHashMap(i32, i32).init(allocator);
defer map.deinit();
while (true) {
reader.streamUntilDelimiter(writer, '\n', null) catch |err| {
switch (err) {
error.EndOfStream => {
output_fbs.reset(); // clear buffer before exit
break;
}, // file read till the end
else => {
std.debug.print("Error while reading file: {any}\n", .{err});
return err;
},
}
};
const line = output_fbs.getWritten();
std.debug.print("Line: {s}\n", .{line});
var split = std.mem.splitSequence(u8, line, " ");
// TODO
const on = split.next().?;
const tw = split.next().?;
const one: i32 = try std.fmt.parseInt(i32, on, 10);
const two: i32 = try std.fmt.parseInt(i32, tw, 10);
try list1.append(one);
const val = map.get(two) orelse 0;
try map.put(two, val + 1);
// since steamUntilDelimiter keeps appending the read bytes to the buffer
// we should clear it on every iteration so that only individual lines are
// displayed on each iteration.
output_fbs.reset();
}
var similarity_score: i32 = 0;
for (list1.items) |item| {
const val = map.get(item) orelse 0;
similarity_score += item * val;
}
std.debug.print("Similarity score: {d}\n", .{similarity_score});
std.debug.print("Hello, {s}!\n", .{"World"});
}
|