@@ -85,7 +85,13 @@ pub fn readInput() ![]const u8 {
85
85
return buf ;
86
86
}
87
87
88
- const Map = std .AutoHashMapUnmanaged (Code , u32 );
88
+ const CodeContext = struct {
89
+ pub fn eql (_ : CodeContext , a : Code , b : Code ) bool { return a .data == b .data ; }
90
+ pub fn hash (_ : CodeContext , c : Code ) u64 { return c .data ^ (c .data >> 7 ); }
91
+ };
92
+
93
+ const Map = std .HashMapUnmanaged (Code , u32 , CodeContext , 45 );
94
+
89
95
const Iter = struct {
90
96
i : usize = 0 ,
91
97
input : []const u8 ,
@@ -102,6 +108,7 @@ const Iter = struct {
102
108
.mask = mask ,
103
109
};
104
110
}
111
+
105
112
pub fn next (self : * Iter ) ? Code {
106
113
if (self .i >= self .input .len ) return null ;
107
114
defer self .i += 1 ;
@@ -112,7 +119,7 @@ const Iter = struct {
112
119
};
113
120
114
121
fn genMap (seq : []const u8 , n : usize , map : * Map ) ! void {
115
- map .clearRetainingCapacity ( );
122
+ map .clearAndFree ( global_allocator );
116
123
var iter = Iter .init (seq , n );
117
124
while (iter .next ()) | code | {
118
125
const gop = try map .getOrPut (global_allocator , code );
@@ -161,11 +168,11 @@ fn printOcc(s: []const u8, map: *Map) !void {
161
168
162
169
pub fn main () ! void {
163
170
const occs = [_ ][]const u8 {
164
- "GGTATTTTAATTTATAGT" ,
165
- "GGTATTTTAATT" ,
166
- "GGTATT" ,
167
- "GGTA" ,
168
171
"GGT" ,
172
+ "GGTA" ,
173
+ "GGTATT" ,
174
+ "GGTATTTTAATT" ,
175
+ "GGTATTTTAATTTATAGT" ,
169
176
};
170
177
const input = try readInput ();
171
178
var map : Map = .{};
@@ -174,11 +181,8 @@ pub fn main() !void {
174
181
try genMap (input , 2 , & map );
175
182
try printMap (2 , map );
176
183
177
- var i = occs .len - 1 ;
178
- while (true ) : (i -= 1 ) {
179
- const occ = occs [i ];
184
+ for (occs ) | occ | {
180
185
try genMap (input , occ .len , & map );
181
186
try printOcc (occ , & map );
182
- if (i == 0 ) break ;
183
187
}
184
188
}
0 commit comments