Given a DNA string, compute how many times each nucleotide occurs in the string.
DNA is represented by an alphabet of the following symbols: 'A', 'C', 'G', and 'T'.
Each symbol represents a nucleotide, which is a fancy name for the particular molecules that happen to make up a large part of DNA.
Shortest intro to biochemistry EVAR:
I'm not going to talk about lipids because they're crazy complex.
So back to nucleotides.
DNA contains four types of them: adenine (
A), cytosine (
G), and thymine (
RNA contains a slightly different set of nucleotides, but we don't care about that for now.
The Calculating DNA Nucleotides_problem at Rosalind http://rosalind.info/problems/dna/
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
pending :- current_prolog_flag(argv, ['--all'|_]). pending :- write('\nA TEST IS PENDING!\n'), fail. :- begin_tests(nucleotide_counting). test(empty_dna_strand_has_no_adenosine, condition(true)) :- nucleotide_count('', [('A', 0) | _ ]), !. test(repetitive_cytidine_gets_counted, condition(pending)) :- nucleotide_count('CCCCC', Counts), member(('C', 5), Counts), !. test(counts_only_thymidine, condition(pending)) :- nucleotide_count('GGGGGTAACCCGG', Counts), member(('T', 1), Counts), !. test(counts_only_thymidine, condition(pending)) :- nucleotide_count( 'AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC', [ ('A' ,20), ('C' , 12), ('G' , 17), ('T', 21) ]), !. test(fails_when_not_dns, [fail, condition(pending)]) :- nucleotide_count('JOHNNYAPPLESEED', _), !. :- end_tests(nucleotide_counting).
count(, [('A', 0), ('C', 0), ('G', 0), ('T', 0)]). count(['A'|Nucleotides], [('A', ACount)|CGT]) :- count(Nucleotides, [('A', APrev)|CGT]), ACount is APrev + 1. count(['C'|Nucleotides], [A,('C', CCount)|GT]) :- count(Nucleotides, [A,('C', CPrev)|GT]), CCount is CPrev + 1. count(['G'|Nucleotides], [A,C,('G', GCount),T]) :- count(Nucleotides, [A,C,('G', GPrev),T]), GCount is GPrev + 1. count(['T'|Nucleotides], [A,C,G,('T', TCount)]) :- count(Nucleotides, [A,C,G,('T', TPrev)]), TCount is TPrev + 1. nucleotide_count(String, Count) :- string_chars(String, Chars), count(Chars, Count).
A huge amount can be learned from reading other people’s code. This is why we wanted to give exercism users the option of making their solutions public.
Here are some questions to help you reflect on this solution and learn the most from it.