#include <string>
#include <iostream>
int main( )
{
std:: string genome = "TTATGTTTTAAGGATGGGGCGTTAGTT" ;
std:: cout << "ATG found at position: " << genome.find ( "ATG" ) << std:: endl ;
while ( ! genome.empty ( ) )
{
if ( genome.find ( "ATG" , 0 ) == std:: string :: npos )
{
std:: cout << "ATG not found, clearing genome." << std:: endl ;
genome.clear ( ) ;
}
else
{
int const startGene = genome.find ( "ATG" , 0 ) ;
std:: cout << "Start of genome at position: " << startGene << std:: endl ;
int endGene = std:: min (
std:: min ( genome.find ( "TAG" ) , genome.find ( "TAA" ) ) ,
genome.find ( "TGA" ) ) ;
std:: cout << "End of genome at position: " << endGene << std:: endl ;
std:: string const currentGene = genome.substr ( startGene + 3 , endGene - ( startGene + 3 ) ) ;
std:: cout << "Current gene: " << currentGene << std:: endl ;
if ( ( currentGene.length ( ) % 3 ) == 0 )
{
std:: cout << currentGene << " has a length that is divisible by three." << std:: endl ;
}
endGene + = 3 ;
std:: cout << "About to erase the following section of " << genome << std:: endl ;
std:: cout << " " ;
for ( size_t c = 0 ; c < endGene; ++ c)
{
std:: cout << '^' ;
}
std:: cout << std:: endl ;
genome.erase ( 0 , endGene) ;
std:: cout << "Genome is now: " << genome << std:: endl ;
}
}
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnN0cmluZyBnZW5vbWUgPSAiVFRBVEdUVFRUQUFHR0FUR0dHR0NHVFRBR1RUIjsKICAgIHN0ZDo6Y291dCA8PCAiQVRHIGZvdW5kIGF0IHBvc2l0aW9uOiAiIDw8IGdlbm9tZS5maW5kKCJBVEciKSA8PCBzdGQ6OmVuZGw7CgogICAgd2hpbGUgKCFnZW5vbWUuZW1wdHkoKSkKICAgIHsKICAgICAgICBpZiAoZ2Vub21lLmZpbmQoIkFURyIsIDApID09IHN0ZDo6c3RyaW5nOjpucG9zKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJBVEcgbm90IGZvdW5kLCBjbGVhcmluZyBnZW5vbWUuIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgIGdlbm9tZS5jbGVhcigpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpbnQgY29uc3Qgc3RhcnRHZW5lID0gZ2Vub21lLmZpbmQoIkFURyIsIDApOwogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlN0YXJ0IG9mIGdlbm9tZSBhdCBwb3NpdGlvbjogIiA8PCBzdGFydEdlbmUgPDwgc3RkOjplbmRsOwogICAgICAgICAgICBpbnQgZW5kR2VuZSA9IHN0ZDo6bWluKAogICAgICAgICAgICAgICAgc3RkOjptaW4oZ2Vub21lLmZpbmQoIlRBRyIpLCBnZW5vbWUuZmluZCgiVEFBIikpLAogICAgICAgICAgICAgICAgZ2Vub21lLmZpbmQoIlRHQSIpKTsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFbmQgb2YgZ2Vub21lIGF0IHBvc2l0aW9uOiAiIDw8IGVuZEdlbmUgPDwgc3RkOjplbmRsOwoKCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0IGN1cnJlbnRHZW5lID0gZ2Vub21lLnN1YnN0cihzdGFydEdlbmUgKyAzLCBlbmRHZW5lIC0gKHN0YXJ0R2VuZSArIDMpKTsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJDdXJyZW50IGdlbmU6ICIgPDwgY3VycmVudEdlbmUgPDwgc3RkOjplbmRsOwoKICAgICAgICAgICAgaWYgKChjdXJyZW50R2VuZS5sZW5ndGgoKSAlIDMpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBjdXJyZW50R2VuZSA8PCAiIGhhcyBhIGxlbmd0aCB0aGF0IGlzIGRpdmlzaWJsZSBieSB0aHJlZS4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZW5kR2VuZSArPSAzOwoKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJBYm91dCB0byBlcmFzZSB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgIiA8PCBnZW5vbWUgPDwgc3RkOjplbmRsOwogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwogICAgICAgICAgICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IGVuZEdlbmU7ICsrYykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICdeJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgICAgICAgICBnZW5vbWUuZXJhc2UoMCwgZW5kR2VuZSk7CgogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkdlbm9tZSBpcyBub3c6ICIgPDwgZ2Vub21lIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9CiAgICB9Cn0=