def test5(): """ Tests is_palindrome function. :return: None """ print("Test5: testing is_palindrome") dna_seq = None print(dna.is_palindrome(dna_seq) == True, end=" ") dna_seq = linked_code.insert_at(0, "A", dna_seq) print(dna.is_palindrome(dna_seq) == True, end=" ") dna_seq = linked_code.insert_at(0, "T", dna_seq) print(dna.is_palindrome(dna_seq) == False, end=" ") dna_seq = linked_code.remove_at(0, dna_seq) dna_seq = linked_code.insert_at(0, "A", dna_seq) print(dna.is_palindrome(dna_seq) == True, end=" ") dna_seq = linked_code.insert_at(1, "G", dna_seq) print(dna.is_palindrome(dna_seq) == True, end=" ") dna_seq = linked_code.insert_at(2, "T", dna_seq) print(dna.is_palindrome(dna_seq) == False)
def substitution(dna_seq, index, base): """ This function takes the input of the DNA sequence, index at which the base has to be replaced and the base by which the original sequence will be replaced """ if linked_code.length_rec(dna_seq) < index: raise IndexError("Invalid Insertion Index") else: return linked_code.insert_at(index, base, linked_code.remove_at(index, dna_seq))
def test4(): """ Tests is_pairing function. :return: None """ print("Test4: testing is_pairing") dna_seq1 = None dna_seq2 = None print(dna.is_pairing(dna_seq1, dna_seq2) == True, end=" ") dna_seq2 = linked_code.insert_at(0, "A", dna_seq2) print(dna.is_pairing(dna_seq1, dna_seq2) == False, end=" ") print(dna.is_pairing(dna_seq2, dna_seq1) == False, end=" ") dna_seq1 = linked_code.insert_at(0, "T", dna_seq1) print(dna.is_pairing(dna_seq1, dna_seq2) == True, end=" ") dna_seq1 = linked_code.insert_at(1, "T", dna_seq1) dna_seq1 = linked_code.insert_at(2, "G", dna_seq1) dna_seq1 = linked_code.insert_at(3, "C", dna_seq1) dna_seq2 = linked_code.insert_at(1, "A", dna_seq2) dna_seq2 = linked_code.insert_at(2, "C", dna_seq2) print(dna.is_pairing(dna_seq1, dna_seq2) == False, end=" ") dna_seq2 = linked_code.insert_at(3, "G", dna_seq2) print(dna.is_pairing(dna_seq1, dna_seq2) == True, end=" ") dna_seq1 = linked_code.insert_at(2, "A", dna_seq1) dna_seq2 = linked_code.insert_at(2, "A", dna_seq2) print(dna.is_pairing(dna_seq1, dna_seq2) == False, end=" ") test_str1 = "AATTTGC" test_str2 = "GCGCTGC" for idx in range(len(test_str1)): dna_seq1 = linked_code.remove_at(2, dna_seq1) dna_seq2 = linked_code.remove_at(2, dna_seq2) dna_seq1 = linked_code.insert_at(2, test_str1[idx], dna_seq1) dna_seq2 = linked_code.insert_at(2, test_str2[idx], dna_seq2) print(dna.is_pairing(dna_seq1, dna_seq2) == False, end=" ") print()
def deletion(dna_seq, idx, segment_size): """ This function takes the DNA sequence , index at which the element has to deleted and the segment size that has to be deleted """ if (segment_size == 0): return dna_seq elif (segment_size + idx > linked_code.length_rec(dna_seq)): raise IndexError("Sequence out of range") else: return deletion(linked_code.remove_at(idx, dna_seq), idx, segment_size - 1)
def is_palindrome(dna_seq): """ This function takes the DNA sequence in the form of Node data structure and checks whether it is palindrome or not """ if (dna_seq == None): return True elif (linked_code.length_rec(dna_seq) == 1): return True elif (dna_seq.value == linked_code.value_at( dna_seq, (linked_code.length_tail_rec(dna_seq) - 1))): return is_palindrome( linked_code.remove_at( linked_code.length_rec(dna_seq.rest) - 1, dna_seq.rest)) else: return False
def substitution(dna_seq1, idx, base): """ This function substitutes a value in a linked list with another value. Pre: dna_seq must be a linked list, idx must be an integer. Post: a new linked list is returned with the substituted value. :param dna_seq1: a linked list :param idx: index at which substitution occurs :param base: value that will replace the one already at the chosen index. :return: a linked list with correctly substituted value """ if dna_seq1.value == None: return False else: if idx < 0: raise IndexError('Index out of range') elif idx == 0: dna_seq1 = linked_code.remove_at(idx, dna_seq1) dna_seq1 = linked_code.insert_at(idx, base, dna_seq1) return dna_seq1 else: return LinkNode(dna_seq1.value, substitution(dna_seq1.rest, idx - 1, base))
def deletion(dna_seq, idx, segment_size): """ This function deletes a segment of chosen size, beginning at a chosen index, in a linked list. Pre: dna_seq must be a linked list, idx must be an integer, and segment_size should be an integer. Post: a linked list with deleted values is returned :param dna_seq: a linked list :param idx: index at which deletion occurs :param segment_size: size of segment being deleted :return: a linked list with a correctly deleted segment """ if segment_size == 0: return dna_seq elif linked_code.length_rec(dna_seq) < idx + segment_size: raise IndexError('Index out of range') else: if idx == 0: dna_seq = linked_code.remove_at(0, dna_seq) return deletion(dna_seq, idx, segment_size - 1) else: return LinkNode(dna_seq.value, deletion(dna_seq.rest, idx - 1, segment_size))