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 }