#This is a program designed to scramble the yeast genome.  It is a result of the combined efforts of Patrick Killion and Martin
#Kracklauer.

#!/usr/bin/perl -w 
use strict; 
my (@possible) = ('A','C','G','T');
my ($lastnuc) = $possible[rand@possible];                                      
my $nextnuc;
my $counter; 
my @twosome = ();
push (@twosome, $lastnuc); 
open(OUTPUT,">scrambletriyeast.txt") or die "I can't open your output file\n";   
#print $lastnuc;
print OUTPUT $lastnuc;                                                  
$nextnuc = &GeneralSub($lastnuc);
push (@twosome, $nextnuc);
#print $nextnuc;
print OUTPUT $nextnuc;

for ($counter = 0; $counter < 12156304; $counter++)
		{      		
		 if($twosome[0] eq 'A' && $twosome[1] eq 'A')
			{
			 push (@twosome, &AASubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'A' && $twosome[1] eq 'C')
			{
			 push (@twosome, &ACSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			} 
		 elsif($twosome[0] eq 'A' && $twosome[1] eq 'G')
			{
			 push (@twosome, &AGSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'A' && $twosome[1] eq 'T')
		 	{
			 push (@twosome, &ATSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'C' && $twosome[1] eq 'A')
			{
			 push (@twosome, &CASubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'C' && $twosome[1] eq 'C')
			{
			 push (@twosome, &CCSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'C' && $twosome[1] eq 'G')
			{
			 push (@twosome, &CGSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'C' && $twosome[1] eq 'T')
			{
			 push (@twosome, &CTSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'G' && $twosome[1] eq 'A')
			{
			 push (@twosome, &GASubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'G' && $twosome[1] eq 'C')
			{
			 push (@twosome, &GCSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];	
			}
		 elsif($twosome[0] eq 'G' && $twosome[1] eq 'G')
			{
			 push (@twosome, &GGSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'G' && $twosome[1] eq 'T')
			{
			 push (@twosome, &GTSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'T' && $twosome[1] eq 'A')
			{
			 push (@twosome, &TASubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'T' && $twosome[1] eq 'C')
			{
			 push (@twosome, &TCSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'T' && $twosome[1] eq 'G')
			{
			 push (@twosome, &TGSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];
			}
		 elsif($twosome[0] eq 'T' && $twosome[1] eq 'T')
			{
			 push (@twosome, &TTSubroutine());
			 #print $twosome[2];
			 print OUTPUT $twosome[2];

			}
		 shift(@twosome);

		 if($counter % 1000000 == 0) { print "\n";print $counter; }
		
                }
	                                                                       
#The above part of the program is a counter/incrementor.  It tells the program when to stop the random genome reassembly process. In
#addition, it also randomly picks the first nucleotide to hand to the "switchboard" subroutine (see below).


close(OUTPUT);
                                                                               
sub GeneralSub {
	        if($_[0] eq 'A')
			{
			 return &ASubroutine();  
			 #push (@twosome, &ASubroutine());                              
			}
		elsif($_[0] eq 'C')
			{
			 return &CSubroutine(); 
			 #push (@twosome, &CSubroutine());
			}                                                      
		elsif($_[0] eq 'G')
			{
			 return &GSubroutine();
			 #push (@twosome, &GSubroutine());
			}
		elsif($_[0] eq 'T')                                      
			{
			 return &TSubroutine();
			 #push (@twosome, &TSubroutine());
			}
	       }

#The above subroutine is a "switchboard."  When the incrementor/counter part of the program randomly picks a nucleotide, that 
#nucleotide is handed into the above subroutine.  Depending on the nucleotide picked, this subroutine calls subroutines specific for
#A, C, G, and T nucleotides (below).  Nucleotides generated from the A, C, G and T subroutines are returned to the switchboard, which
#returns them to the incrementor, which puts them in a text file.  This calling, generating nucleotides, returning them and adding
#them to the switchboard happens iteratively until the counter stops.

sub ASubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3507221) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3507222 && $PickNumber <= 5205060) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5205061 && $PickNumber <= 7087024) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7087025 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}

#The above subroutine tells the program what to do if an A was picked as the last nucleotide picked.  A random integer between 1 and
#10000000 is generated, and depending on where the randomly picked number falls, an A, C, G or T is returned to the switchboard.  Based
#on which nucleotide is returned to the switchboard, the switchboard then both returns the nucleotide to the incrementor (which puts 
#it in the text file), and decides which subroutine to call next.

sub CSubroutine {                                                              		 
		 my $PickNumber = int(rand(10000000)) + 1; 
                 if ($PickNumber >=1 && $PickNumber <= 3388665) {
							       undef $PickNumber;
							       return 'A';
							      }
		 elsif ($PickNumber >= 3388666 && $PickNumber <= 5429799) {               
							    	      undef $PickNumber;
								      return 'C';
							             }
		 elsif ($PickNumber >= 5429800 && $PickNumber <= 6960958){ 
							    	     undef $PickNumber;
								     return 'G';  
							       	    }               
		 elsif ($PickNumber >= 6960959 && $PickNumber <= 10000000) {
							     	       undef $PickNumber;
								       return 'T';
								      }
		}

#The above subroutine tells the program what to do if C was picked as the last nucleotide picked.  A random integer between 1 and
#10000000 is generated, and depending on where the randomly picked number falls, an A, C, G or T is returned to the switchboard.  Based
#on which nucleotide is returned to the switchboard, the switchboard then both returns the nucleotide to the incrementor (which puts 
#it in the text file), and decides which subroutine to call next.

sub GSubroutine { 		 
		 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >=1 && $PickNumber <= 3263106) {                  
							       undef $PickNumber;
							       return 'A'; 	 
							      } 
		 elsif ($PickNumber >= 3263107 && $PickNumber <= 5219429) {              
							    	       undef $PickNumber;
								       return 'C'; 
								      }
		 elsif ($PickNumber >= 5219430 && $PickNumber <= 7250153) {
							    	       undef $PickNumber;
								       return 'G';
                                                                      }              
		 elsif ($PickNumber >= 7250154 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								  	return 'T';
								       }
		}

#The above subroutine tells the program what to do if G was picked as the last nucleotide picked.  A random integer between 1 and
#10000000 is generated, and depending on where the randomly picked number falls, an A, C, G or T is returned to the switchboard.  Based
#on which nucleotide is returned to the switchboard, the switchboard then both returns the nucleotide to the incrementor (which puts 
#it in the text file), and decides which subroutine to call next.

sub TSubroutine {
		 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >=1 && $PickNumber <= 2405941) {
							       undef $PickNumber;
							       return 'A';
							      }
		 elsif ($PickNumber >= 2405942 && $PickNumber <= 4415415) {              
							               undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 4415416 && $PickNumber <= 6500110) {
							               undef $PickNumber;
								       return 'G';
								      }              
		 elsif ($PickNumber >= 6500111 && $PickNumber <= 10000000) {
							                undef $PickNumber;
								        return 'T';
								       }
		}  

#The above subroutine tells the program what to do if T was picked as the last nucleotide picked.  A random integer between 1 and
#10000000 is generated, and depending on where the randomly picked number falls, an A, C, G or T is returned to the switchboard.  Based
#on which nucleotide is returned to the switchboard, the switchboard then both returns the nucleotide to the incrementor (which puts 
#it in the text file), and decides which subroutine to call next.              

sub AASubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3624153) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3624154 && $PickNumber <= 5284522) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5284523 && $PickNumber <= 7278787) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7278788 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}

sub ACSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3268160) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3268161 && $PickNumber <= 5474652) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5474653 && $PickNumber <= 7132933) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7132934 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}   

sub AGSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3476680) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3476681 && $PickNumber <= 5441433) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5441434 && $PickNumber <= 7402419) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7402420 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}    

sub ATSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 2760480) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 2760481 && $PickNumber <= 4713357) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 4713358 && $PickNumber <= 6735994) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 6735995 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}      

sub CASubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3577381) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3577382 && $PickNumber <= 5225360) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5225361 && $PickNumber <= 7166170) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7166171 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}  

sub CCSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3830173) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3830174 && $PickNumber <= 5580153) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5580154 && $PickNumber <= 7079728) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7079729 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}  

sub CGSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3112804) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3112805 && $PickNumber <= 5039924) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5039925 && $PickNumber <= 7020155) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7020156 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}  

sub CTSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 2207949) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 2207950 && $PickNumber <= 4134556) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 4134557 && $PickNumber <= 6292008) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 6292009 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		} 

sub GASubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3820379) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3820380 && $PickNumber <= 5382462) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5382463 && $PickNumber <= 7182366) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7182367 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}   

sub GCSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3328656) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3328657 && $PickNumber <= 5435287) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5435288 && $PickNumber <= 6932825) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 6932826 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}  

sub GGSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3281474) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3281475 && $PickNumber <= 5303484) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5303485 && $PickNumber <= 7031128) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7031129 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}  

sub GTSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 2709283) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 2709284 && $PickNumber <= 4550907) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 4550908 && $PickNumber <= 6574805) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 6574806 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}   

sub TASubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3012842) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3012843 && $PickNumber <= 4922589) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 4922590 && $PickNumber <= 6657733) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 6657734 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}      

sub TCSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3249620) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3249621 && $PickNumber <= 5294032) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5294033 && $PickNumber <= 6757448) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 6757449 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}          

sub TGSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 3126831) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 3126832 && $PickNumber <= 5049275) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 5049276 && $PickNumber <= 7348379) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 7348380 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}

sub TTSubroutine {
	       	 my $PickNumber = int(rand(10000000)) + 1;
                 if ($PickNumber >= 1 && $PickNumber <= 2068971) {
							    	undef $PickNumber;
							    	return 'A';
							       }
		 elsif ($PickNumber >= 2068972 && $PickNumber <= 4251628) {              
							    	       undef $PickNumber;
								       return 'C';
								      }
		 elsif ($PickNumber >= 4251629 && $PickNumber <= 6378585) {
							    	       undef $PickNumber;
								       return 'G';
								      }		             
		 elsif ($PickNumber >= 6378586 && $PickNumber <= 10000000) {
							    	        undef $PickNumber;
								        return 'T';
								       }
		}


			










