src/problems/mrna.lisp @ 0c68769a8788

KMP
author Steve Losh <steve@stevelosh.com>
date Thu, 04 Aug 2022 21:48:26 -0400
parents 2735aa6aab79
children (none)
(defpackage :rosalind/mrna (:use :cl :rosalind :losh :iterate))
(in-package :rosalind/mrna)

;; We're using a real programming language, so we have actual numbers and don't
;; need to bother with modular arithmetic for the tiny inputs they're giving us
;; as data sets:
;;
;; (solve mrna) =>
;; 18223466647209680564519396994425171292117842339309783544950259938739364856964963
;; 66953808268144949737039356476412047824299213884930571696940173622342387041181012
;; 59342299576631057415056504154013752799852275638571559263796551872383306751629837
;; 52919433077998281001987083484254030689771952436244061958890571552274110433782197
;; 92667561733403741083516672972846644834108916554466004897769300303373575679132517
;; 064863091594635637947593916416
;;
;; But let's humor them and do it anyway, for fun.  I added it into my utils
;; library.

(defun acid-to-codons (acid)
  "Return a list of the codons that could have encoded this amino acid.

  Neither the list nor the strings in it will be fresh.
  Use `(mapcar #'copy-seq (acid-to-codon …))` if you need fresh copies.

  "
  (ecase acid
    (#\I   '("AUA" "AUC" "AUU"))
    (#\R   '("AGG" "CGG" "AGA" "CGA" "CGC" "CGU"))
    (#\D   '("GAC" "GAU"))
    (#\V   '("GUG" "GUA" "GUC" "GUU"))
    (#\P   '("CCG" "CCA" "CCC" "CCU"))
    (#\T   '("ACG" "ACA" "ACC" "ACU"))
    (#\S   '("AGC" "AGU" "UCG" "UCA" "UCC" "UCU"))
    (#\F   '("UUC" "UUU"))
    (#\Y   '("UAC" "UAU"))
    (#\L   '("CUG" "UUG" "CUA" "UUA" "CUC" "CUU"))
    (#\Q   '("CAG" "CAA"))
    (#\H   '("CAC " "CAU"))
    (#\C   '("UGC" "UGU"))
    (#\K   '("AAG" "AAA"))
    (#\N   '("AAC" "AAU"))
    (#\M   '("AUG"))
    (#\W   '("UGG"))
    (#\G   '("GGG" "GGA" "GGC" "GGU"))
    (#\E   '("GAG" "GAA"))
    (#\A   '("GCG" "GCA" "GCC" "GCU"))
    ((nil) '("UGA" "UAG" "UAA"))))

(defun acid-codon-count (acid)
  (length (acid-to-codons acid)))


(define-problem mrna (data string) "MA" "12"
  (product (delete #\newline data)
           :modulo 1000000
           :key #'acid-codon-count
           :initial-value (acid-codon-count nil)))