@@ -85,7 +85,13 @@ pub fn readInput() ![]const u8 {
8585 return buf ;
8686}
8787
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+
8995const Iter = struct {
9096 i : usize = 0 ,
9197 input : []const u8 ,
@@ -102,6 +108,7 @@ const Iter = struct {
102108 .mask = mask ,
103109 };
104110 }
111+
105112 pub fn next (self : * Iter ) ? Code {
106113 if (self .i >= self .input .len ) return null ;
107114 defer self .i += 1 ;
@@ -112,7 +119,7 @@ const Iter = struct {
112119};
113120
114121fn genMap (seq : []const u8 , n : usize , map : * Map ) ! void {
115- map .clearRetainingCapacity ( );
122+ map .clearAndFree ( global_allocator );
116123 var iter = Iter .init (seq , n );
117124 while (iter .next ()) | code | {
118125 const gop = try map .getOrPut (global_allocator , code );
@@ -161,11 +168,11 @@ fn printOcc(s: []const u8, map: *Map) !void {
161168
162169pub fn main () ! void {
163170 const occs = [_ ][]const u8 {
164- "GGTATTTTAATTTATAGT" ,
165- "GGTATTTTAATT" ,
166- "GGTATT" ,
167- "GGTA" ,
168171 "GGT" ,
172+ "GGTA" ,
173+ "GGTATT" ,
174+ "GGTATTTTAATT" ,
175+ "GGTATTTTAATTTATAGT" ,
169176 };
170177 const input = try readInput ();
171178 var map : Map = .{};
@@ -174,11 +181,8 @@ pub fn main() !void {
174181 try genMap (input , 2 , & map );
175182 try printMap (2 , map );
176183
177- var i = occs .len - 1 ;
178- while (true ) : (i -= 1 ) {
179- const occ = occs [i ];
184+ for (occs ) | occ | {
180185 try genMap (input , occ .len , & map );
181186 try printOcc (occ , & map );
182- if (i == 0 ) break ;
183187 }
184188}
0 commit comments