/* Rosalind Counting Point mutations in Picat. https://rosalind.info/problems/hamm/ """ Problem [Figure 2. The Hamming distance between these two strings is 7. Mismatched symbols are colored red.] Given two strings s and t of equal length, the Hamming distance between s and t, denoted dH(s,t), is the number of corresponding symbols that differ in s and t. See Figure 2. Given: Two DNA strings s and t of equal length (not exceeding 1 kbp). Return: The Hamming distance dH(s,t). Sample Dataset GAGCCTACTAACGGGAT CATCGTAATGACGGCCT Sample Output 7 """ This model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. main => go. go ?=> DNA = "GAGCCTACTAACGGGAT\nCATCGTAATGACGGCCT", [D1,D2] = split(strip(DNA),"\n"), println(ds=[D1,D2]), println(hamm1=hamm1(D1,D2)), println(hamm2=hamm2(D1,D2)), println(hamm3=hamm3(D1,D2)), nl. go => true. % % The Challenge % go2 ?=> DNA = "CGTGATTCAGCCTGCTTGAGCAAGTCTCCGCATTACGGATACTTCCAAGCCTGCAGCAGAAGCGCAACATGTTTGGTCACTTCGAATTTGTAAATAAAATTAACATTTGCCGCACTTAAGTACCTATGCATGCCCTGAAGGGCAAATCACGAAGGGAATCCGGACTCAACCTCCACAATGGGTGGTCTAACCCGCTTCCGGCGCTTGCTACAGCCTACATGAACTTTTAGGTCACTTTGGAAGCTCGGACTATGAACCTCGCGCAAATATACTAAAAGGCGCACCCCCCGCTTGTGCGTGTCGCCGAGACCTTACCGCGAGCTTGGTGTGCATCTTACTCGTAAAGAGTCACGTGAGGGCGACTCAGCTTGAGGTACAGGAGTCCACGTTATATCCAGATTTAGTTCTAAACGTTCCCCCGATTTTTGCGGCCTCCTCGCTTCAGAGTTGTCCACATGGGCCAGGTCGTCTGTCCCGACTTATGAGTGTACTTGCACCGAAGCCCTAAGGCCGCCACGAAAAACGGCGTTTGCCGATGATTGCCCGCACCAGTCCGCAGCCTCCTACTGGCTTAGATTGTGAATACGACCTGCATTTCTATCTTAAGGTACAGAATGGTTCCGGTACCCTATGATTTATTTTTTTGATGCCCGGCCACGAGACACAAGATCCGGGTACTCGCACAGCTTTTCTCCCTATCTAAGTCCCATAGTCAACGCTTAGCCTGTTTATTTCCCGGACCACTCAAGAAGCCTTCTGTATCACGTTGAGCTGCCCGCGTAGGGGCTCTAATGGCGGCGGCCTTAGGTCGACTTTCTATTGATAAGTCGATCGACATACGTCAGCTGCCTTCGGGTCACCATTTAGCCTTATGCCCCTGCACAGTGTCAGAATGATACGGGCGATATGGGTCGAACGCGTCGCTTCTTGCGCCAGGTTGTCCAAGCTTCTGGCTTTTCCCACTAT\nCGTGATACAGCGTTGACGCAATACCCTCCGCCGATTAGAAATTCCCGCGCAAGAAGCCAAAACGGTCTCACTAGAGACGTTTGGCCTTTTGACCCAAGCTGGCTATTGGACGTTCTGAGATCCCTTCGCATCGCACGATGCGCTTGTTATTCATTACGGGCCCACTATACGCCCACAAAGCTTGGCCCAAGCCACCGTCTGTAAGTGACATAGCGCATAACAACGTTAACGAAAATCTGAAATTTCCGCCTGCAGTTCTCTCACATTTATGCCACTATGGTCTCCCCCCGCTAGTCCGTGTCTGTGGGACTATACAGAAAGTTGGGTATAAAGCCTAAGGTTCAAGGTTCACTCGAGGGCAACTAACGTAATAGTCCGAACCTCTACTTTCTACCCAGATTTCGTTTTAGACAGGCGACCCAGCTTGACCGTCGCTACTTCTGCGAACTGAGCACATTGTATACCGCGCTTCAACTTCCCGCCGTGGCTACCTGCTGCGGGGGCCTGGCGACCACTCTACGGTCAGAGCTCGACGGTACATCGCCTCTAATGTCCAACGAAAACTACAGACTGCTGCTTTGAAAACGCGCCCTTTTTGGATCAGATGGCACATAAGGGTGCTGGTAACATATAATTTAAAGCTCTCATCCTCGTCAACCGGTGTCAACGTCCATGGGCGGTCACTTCGTCGCACAGGGTGTAGGAACCCTACTCAGCTGGTAGTCGGATCATTAACAGCACACCGGGAGAAGAATTCTCTGTCTCGCCAAACTTTTGGGGGCACGACCGTAGTGGCGACGGGCTTAGGCAAAATGTCCCTAGACCCCGCCATCGTGACTCTACAGTTGCTTTGTTGGCAAAATATAGTCATCTGCCTTAATGCTCAGACTGAATGCGACGAATGATTCCGGGCAACCGCGCTGTTTCGTTGTTTGCCGCTGTCAACTTACTATCGATTACGATCGT", [D1,D2] = split(strip(DNA),"\n"), % println(ds=[D1,D2]), println(hamm1=hamm1(D1,D2)), println(hamm2=hamm2(D1,D2)), println(hamm3=hamm3(D1,D2)), println(hamm4=hamm4(D1,D2)), nl. go2 => true. % % We assume that the two strings have the same length... % hamm1(D1,D2) = Hamm => Hamm1 = 0, foreach(I in 1..D1.len) if D1[I] != D2[I] then Hamm1 := Hamm1 +1 end end, Hamm = Hamm1. hamm2(D1,D2) = Hamm => hamm2(D1,D2,0,Hamm). hamm2([],[],Hamm,Hamm). hamm2([C1|D1],[C2|D2],Hamm0,Hamm) :- (C1 != C2 -> Hamm1 = Hamm0 + 1 ; Hamm1 = Hamm0 ), hamm2(D1,D2,Hamm1,Hamm). hamm3(D1,D2) = [1 : {C1,C2} in zip(D1,D2), C1 != C2].len. % % Alternative approach using list + len. % hamm4(D1,D2) = Hamm.len => hamm4(D1,D2,[],Hamm). hamm4([],[],Hamm,Hamm). hamm4([C|D1],[C|D2],Hamm0,Hamm) :- hamm4(D1,D2,Hamm0,Hamm). hamm4([C1|D1],[C2|D2],Hamm0,[h|Hamm]) :- C1 != C2, hamm4(D1,D2,Hamm0,Hamm).