ba1f.c3 (1153B) - raw


      1 // minimum skew
      2 
      3 module ba1f;
      4 import std::io;
      5 import std::io::file;
      6 import std::collections;
      7 
      8 import util;
      9 
     10 alias IntList = List{ulong};
     11 
     12 fn int main(String[] args) {
     13 	if (args.len != 2) {
     14 		io::eprintn("Please supply path to data file");
     15 		return 1;
     16 	}
     17 	File f = file::open(args[1], "rb")!!;
     18 	String genome = io::treadline(&f)!!;
     19 	ulong[] min_skew_idxs = minimum_skew_idxs(genome);
     20 	foreach (i : min_skew_idxs) {
     21 		io::printf("%d ", i);
     22 	}
     23 	return 0;
     24 }
     25 
     26 // TODO use min heap
     27 fn ulong[] minimum_skew_idxs(String genome, Allocator alloc = allocator::heap()) {
     28 	IntList idxs;
     29 	idxs.tinit();
     30 	int min_skew = 0;
     31 	int skew = 0;
     32 	foreach (i, base : genome) {
     33 		// skew[0] is 0, skew[1] is the skew
     34 		// after genome[0]
     35 		ulong skew_idx = i + 1;
     36 		switch (base) {
     37 			case 'C': skew -= 1;
     38 			case 'G': skew += 1;
     39 		}
     40 		switch {
     41 			case skew < min_skew:
     42 				min_skew = skew;
     43 				idxs.clear();
     44 				idxs.push(skew_idx);
     45 			case skew == min_skew:
     46 				idxs.push(skew_idx);
     47 		}
     48 	}
     49 	return idxs.to_array(alloc);
     50 }
     51 
     52 fn void test_minimum_skew_idxs() @test {
     53 	assert(minimum_skew_idxs("TAAAGACTGCCGAGAGGCCAACACGAGTGCTAGAACGAGGGGCGTAAACGCGGGTCCGAT", tmem) == {11, 24});
     54 }