src/problems/prtm.lisp @ 0c68769a8788

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

(defconstant +monoisotopic-mass-of-water+ 18.01056d0
  "The monoisotopic mass of a single water molecule, in Daltons.")

(defun monoisotopic-mass (residue)
  ;; todo is a hash table faster here?  we could also do an array
  ;; starting at (char-code #\A) if we really wanted
  (ecase residue
    ;; These have to be doubles or we get too much rounding error.  It's fine.
    (#\A  71.03711d0)
    (#\C 103.00919d0)
    (#\D 115.02694d0)
    (#\E 129.04259d0)
    (#\F 147.06841d0)
    (#\G  57.02146d0)
    (#\H 137.05891d0)
    (#\I 113.08406d0)
    (#\K 128.09496d0)
    (#\L 113.08406d0)
    (#\M 131.04049d0)
    (#\N 114.04293d0)
    (#\P  97.05276d0)
    (#\Q 128.05858d0)
    (#\R 156.10111d0)
    (#\S  87.03203d0)
    (#\T 101.04768d0)
    (#\V  99.06841d0)
    (#\W 186.07931d0)
    (#\Y 163.06333d0)))


(define-problem prtm (data string)
    "SKADYEK"
    "821.392"
  (_ data
    (delete #\newline _)
    (summation _ :key #'monoisotopic-mass)
    u:float-string))