#defining palindrome
is_reverse_palindrome <- function(substring) {
complement <- list('C'='G', 'G'='C', 'T'='A', 'A'='T')
reverse_complement <- paste0(sapply(rev(strsplit(substring, "")[[1]]), function(nucleotide) complement[[nucleotide]]), collapse="")
return (substring == reverse_complement)
}
find_reverse_palindromes <- function(dna_string) {
#Looping through each position of the given data
reverse_palindromes <- list()
for (i in 1:nchar(dna_string)) {
#Checking substrings of a certain length (between 4 and 13) starting from each position
for (length in 4:min(13, nchar(dna_string) - i + 1)) {
#The starting position (index starting from 1) and the length of the reverse palindrome are kept in a tuple and added to the reverse_palindromes list
substring <- substr(dna_string, i, i + length - 1)
if (is_reverse_palindrome(substring)) {
#Checking for a reverse palindrome for each substring using the is_reverse_palindrome function
reverse_palindromes <- c(reverse_palindromes, list(c(i, length)))
break
}
}
}
return (reverse_palindromes)
}
dna_string <- "GCGCATGCGGTAGAGGGTTGGCCACAAAGAGCTCCCAATATGGTAATTTCCGCCTCAGCTAGGTGCCCAAATCATAACCTGTGTCTGCGGGATTCCCTATACTTGTAAGTTGGCGGAAACCGTATGTTGTGGTGTCCTGCTCGTACCAAATATAATATAGTTAGCTGTGCTGTAGTAGCGAGGGTTTAGTAATGCCCAGTAGAGCGACGAGCTATTTGCAAAAGTGCCCTGCGGGTGCCATACCACTTCAATGGGGATAATAACTTTGGCCCGGAAACAAGGCTCTTAGGAACAGCTCCTCCAACCCGACCCTTCGAGAACGAGAGATTGAAATCCGCGCTGTAGGAGATATACTTTCGTGGAATTACCAGCAACGGGACCGCTGGAACGAACGGGGGTTATCTAACGGTTTCTGATGATCTGGTTACTCACGTACTTCCTCCTGAGAGCACACATATATGTGACTCTGCACCGTCGCTAACTTCTTGTCTTCTATAACGTCTAATACTTTATTGTTGTCGATAAGCCAATGAGCAGGCACCTCTAAGCGTTCAATTCACTGGCCCTTAGGTCTCGTACTAACTTATGCTACCTGGTTGTGTCTCCGAACAAGGTTAGGACCGTCGTAAACTACCCACTGTTACTCGTAGTCGGATGGGTTCTCAAGGCGGGGCCAGGAAAACACGAAGTATAGGACACTGATGGCGTCTCCTGTTCACTTATCGGTTAACGCGAGTGAAGAGCCTCACGACGTTATATCGTTTACCGTACTAAGCGTGTCCGGCAAGCACAAACGCCAGAATTAGAATCAACTTTTGGCTCAAGATAGGCTAGTATAACGCCAGCTCACCCCTTTGCGTTTGTGCTGTAACAACGTTTTTCTCGATGACTCCCCGTGCATGTACGATCCATAT"
start_time <- Sys.time()
reverse_palindromes <- find_reverse_palindromes(dna_string)
end_time <- Sys.time()
execution_time <- end_time - start_time
print(execution_time)
## Time difference of 0.145612 secs
for (i in 1:length(reverse_palindromes)) {
start <- reverse_palindromes[[i]][1]
length <- reverse_palindromes[[i]][2]
print(paste(start, length))
}
## [1] "1 4"
## [1] "2 8"
## [1] "3 6"
## [1] "4 4"
## [1] "19 6"
## [1] "20 4"
## [1] "29 6"
## [1] "30 4"
## [1] "38 4"
## [1] "45 4"
## [1] "57 4"
## [1] "59 4"
## [1] "98 4"
## [1] "143 4"
## [1] "150 4"
## [1] "151 4"
## [1] "155 4"
## [1] "156 4"
## [1] "163 4"
## [1] "210 4"
## [1] "215 8"
## [1] "216 6"
## [1] "217 4"
## [1] "268 4"
## [1] "271 4"
## [1] "294 4"
## [1] "314 4"
## [1] "336 4"
## [1] "337 4"
## [1] "349 4"
## [1] "350 4"
## [1] "363 4"
## [1] "418 4"
## [1] "431 4"
## [1] "433 4"
## [1] "452 12"
## [1] "453 10"
## [1] "454 8"
## [1] "455 4"
## [1] "456 4"
## [1] "457 4"
## [1] "468 4"
## [1] "494 4"
## [1] "498 4"
## [1] "519 4"
## [1] "554 4"
## [1] "562 4"
## [1] "576 4"
## [1] "672 4"
## [1] "690 4"
## [1] "726 6"
## [1] "727 4"
## [1] "731 4"
## [1] "751 4"
## [1] "755 4"
## [1] "756 4"
## [1] "768 4"
## [1] "781 4"
## [1] "801 4"
## [1] "831 4"
## [1] "835 4"
## [1] "844 4"
## [1] "873 6"
## [1] "874 4"
## [1] "883 4"
## [1] "897 4"
## [1] "899 4"
## [1] "902 4"
## [1] "906 4"
## [1] "911 4"
## [1] "913 4"
#defining palindrome
is_reverse_palindrome <- function(substring) {
complement <- list('A'='T', 'C'='G', 'G'='C', 'T'='A')
reverse_complement <- paste0(sapply(rev(strsplit(substring, "")[[1]]), function(nucleotide) complement[[nucleotide]]), collapse="")
return (substring == reverse_complement)
}
find_reverse_palindromes <- function(dna_string) {
reverse_palindromes <- list()
start_time <- Sys.time()
for (i in 1:nchar(dna_string)) {
#Checking only suitable lengths
for (length in c(4, 6, 8, 10, 12)) {
if (i + length <= nchar(dna_string)) {
substring <- substr(dna_string, i, i + length - 1)
if (is_reverse_palindrome(substring)) {
reverse_palindromes <- c(reverse_palindromes, list(c(i, length)))
break
}
}
}
}
end_time <- Sys.time()
execution_time <- end_time - start_time
print(execution_time)
return (reverse_palindromes)
}
dna_string <- "ATATAGATTGCAGATCGGAGCAGAGCAGTCACACGCGATGTCATCATGTTAGTGGCGAAGCCAGGGGCGGTCGCTCTCTGATACATTCCCAAGACCGTCAGCTCCTACGACGTCATCCAGGGTACGTGTTTGTTTTTGGGTAATCGATCGTTTGCTGTTTTAATTAAGTCCCCAAAGTGGATCAGAAACGTCCGAGACAATAGTCTATCTAGTGCCACCCAGTGGACGCCAGGGTCACTCGCAGCGAGCCTCACTCTCTGGTTCTTGAGACCCAGGGTTGCCCCACACTTGGGGGCGGACTGAGCCGATGAACCTACTGATGAACGCCCTTCCCGAAGACCTCGACAATGAGTCTACAGTCCCCATCTTTTTCAATACGTTCAGGTCGGACACGCACCTTGCGCGTGGGGATTACACTGAATACTATTTAGGACCACGTTTGCTGCAATAAATGACCTCTAAGGTAACGCACAGTATGGCACCGTTATCCTCCCAGTACTGGGGTTATCAACGGAACCAAAGTAGGTACCCGAGGCTTTATAGGTGCTACCGCAACGGGTAGACATAAAATGGCGCATATTAAACGAGCGCCGGTAATACACTGCATGGATGTCTCCTTCCATCATCAGTATAGCTCCAGCCGAACGGGGCCAACACCGAAAGTGGCGTGGCTTGGCGGCGTACGAGGCAGAACTCCCTAAGGTGGTCGACCGCATAGTATGTTCATGCAACCGCCGAATTAGCCCTCAAATATTGTAGTCGCTGGTGCGGTTCTGTTATTAAAAGCACAAAACTGGCCGTAAGGGAACGAGCTCTAGCGCTATCTTAACTAACTTTCTAAATCTGTCATCCTTCTTACTATTCCTGTGGGCGTGGGCGCACACAAGCGTACATAGTGTGACCTACGGGGTGCCATCGTGCGAGCCTATTATTACGCACTGGGGCCCGATAGCAGATCCATGGCGGCATACCTGAAAGCGATATAGCTATTATA"
reverse_palindromes <- find_reverse_palindromes(dna_string)
## Time difference of 0.05826688 secs
for (i in 1:length(reverse_palindromes)) {
start <- reverse_palindromes[[i]][1]
length <- reverse_palindromes[[i]][2]
print(paste(start, length))
}
## [1] "1 4"
## [1] "2 4"
## [1] "9 4"
## [1] "13 4"
## [1] "34 4"
## [1] "45 4"
## [1] "100 4"
## [1] "109 6"
## [1] "110 4"
## [1] "122 4"
## [1] "124 4"
## [1] "143 6"
## [1] "144 4"
## [1] "145 6"
## [1] "146 4"
## [1] "160 4"
## [1] "161 6"
## [1] "162 4"
## [1] "164 4"
## [1] "180 4"
## [1] "188 4"
## [1] "209 4"
## [1] "342 4"
## [1] "377 4"
## [1] "401 4"
## [1] "402 4"
## [1] "436 4"
## [1] "444 4"
## [1] "492 12"
## [1] "493 10"
## [1] "494 8"
## [1] "495 6"
## [1] "496 4"
## [1] "525 6"
## [1] "526 4"
## [1] "539 4"
## [1] "573 4"
## [1] "577 4"
## [1] "580 4"
## [1] "588 4"
## [1] "591 4"
## [1] "603 4"
## [1] "605 4"
## [1] "630 4"
## [1] "633 4"
## [1] "649 4"
## [1] "680 6"
## [1] "681 4"
## [1] "705 8"
## [1] "706 6"
## [1] "707 4"
## [1] "725 4"
## [1] "727 4"
## [1] "738 4"
## [1] "750 6"
## [1] "751 4"
## [1] "780 4"
## [1] "796 4"
## [1] "810 6"
## [1] "811 4"
## [1] "815 4"
## [1] "816 8"
## [1] "817 6"
## [1] "818 4"
## [1] "826 4"
## [1] "877 4"
## [1] "889 4"
## [1] "942 6"
## [1] "943 4"
## [1] "955 4"
## [1] "958 6"
## [1] "959 4"
## [1] "981 4"
## [1] "982 4"
## [1] "983 8"
## [1] "984 6"
## [1] "985 4"
is_reverse_palindrome <- function(substring) {
complement <- list('A'='T', 'C'='G', 'G'='C', 'T'='A')
reverse_complement <- paste0(sapply(rev(strsplit(substring, "")[[1]]), function(nucleotide) complement[[nucleotide]]), collapse="")
return (substring == reverse_complement)
}
#When a palindrome is found, it checks around it for other palindromes and merges them together.
find_reverse_palindromes <- function(dna_string) {
reverse_palindromes <- list()
start_time <- Sys.time()
max_length <- 12
for (length in seq(4, max_length, by=2)) {
for (i in 1:(nchar(dna_string) - length + 1)) {
substring <- substr(dna_string, i, i + length - 1)
if (is_reverse_palindrome(substring)) {
reverse_palindromes <- c(reverse_palindromes, list(c(i, length)))
}
}
}
end_time <- Sys.time()
execution_time <- end_time - start_time
print(execution_time)
return (reverse_palindromes)
}
dna_string <- "ATATAGATTGCAGATCGGAGCAGAGCAGTCACACGCGATGTCATCATGTTAGTGGCGAAGCCAGGGGCGGTCGCTCTCTGATACATTCCCAAGACCGTCAGCTCCTACGACGTCATCCAGGGTACGTGTTTGTTTTTGGGTAATCGATCGTTTGCTGTTTTAATTAAGTCCCCAAAGTGGATCAGAAACGTCCGAGACAATAGTCTATCTAGTGCCACCCAGTGGACGCCAGGGTCACTCGCAGCGAGCCTCACTCTCTGGTTCTTGAGACCCAGGGTTGCCCCACACTTGGGGGCGGACTGAGCCGATGAACCTACTGATGAACGCCCTTCCCGAAGACCTCGACAATGAGTCTACAGTCCCCATCTTTTTCAATACGTTCAGGTCGGACACGCACCTTGCGCGTGGGGATTACACTGAATACTATTTAGGACCACGTTTGCTGCAATAAATGACCTCTAAGGTAACGCACAGTATGGCACCGTTATCCTCCCAGTACTGGGGTTATCAACGGAACCAAAGTAGGTACCCGAGGCTTTATAGGTGCTACCGCAACGGGTAGACATAAAATGGCGCATATTAAACGAGCGCCGGTAATACACTGCATGGATGTCTCCTTCCATCATCAGTATAGCTCCAGCCGAACGGGGCCAACACCGAAAGTGGCGTGGCTTGGCGGCGTACGAGGCAGAACTCCCTAAGGTGGTCGACCGCATAGTATGTTCATGCAACCGCCGAATTAGCCCTCAAATATTGTAGTCGCTGGTGCGGTTCTGTTATTAAAAGCACAAAACTGGCCGTAAGGGAACGAGCTCTAGCGCTATCTTAACTAACTTTCTAAATCTGTCATCCTTCTTACTATTCCTGTGGGCGTGGGCGCACACAAGCGTACATAGTGTGACCTACGGGGTGCCATCGTGCGAGCCTATTATTACGCACTGGGGCCCGATAGCAGATCCATGGCGGCATACCTGAAAGCGATATAGCTATTATA"
reverse_palindromes <- find_reverse_palindromes(dna_string)
## Time difference of 0.05751586 secs
for (i in 1:length(reverse_palindromes)) {
start <- reverse_palindromes[[i]][1]
length <- reverse_palindromes[[i]][2]
print(paste(start, length))
}
## [1] "1 4"
## [1] "2 4"
## [1] "9 4"
## [1] "13 4"
## [1] "34 4"
## [1] "45 4"
## [1] "100 4"
## [1] "110 4"
## [1] "122 4"
## [1] "124 4"
## [1] "144 4"
## [1] "146 4"
## [1] "160 4"
## [1] "162 4"
## [1] "164 4"
## [1] "180 4"
## [1] "188 4"
## [1] "209 4"
## [1] "342 4"
## [1] "377 4"
## [1] "401 4"
## [1] "402 4"
## [1] "436 4"
## [1] "444 4"
## [1] "496 4"
## [1] "526 4"
## [1] "539 4"
## [1] "573 4"
## [1] "577 4"
## [1] "580 4"
## [1] "588 4"
## [1] "591 4"
## [1] "603 4"
## [1] "605 4"
## [1] "630 4"
## [1] "633 4"
## [1] "649 4"
## [1] "681 4"
## [1] "707 4"
## [1] "725 4"
## [1] "727 4"
## [1] "738 4"
## [1] "751 4"
## [1] "780 4"
## [1] "796 4"
## [1] "811 4"
## [1] "815 4"
## [1] "818 4"
## [1] "826 4"
## [1] "877 4"
## [1] "889 4"
## [1] "943 4"
## [1] "955 4"
## [1] "959 4"
## [1] "981 4"
## [1] "982 4"
## [1] "985 4"
## [1] "991 4"
## [1] "109 6"
## [1] "143 6"
## [1] "145 6"
## [1] "161 6"
## [1] "495 6"
## [1] "525 6"
## [1] "680 6"
## [1] "706 6"
## [1] "750 6"
## [1] "810 6"
## [1] "817 6"
## [1] "942 6"
## [1] "958 6"
## [1] "984 6"
## [1] "160 8"
## [1] "494 8"
## [1] "705 8"
## [1] "816 8"
## [1] "983 8"
## [1] "493 10"
## [1] "492 12"