# HG changeset patch # User Steve Losh # Date 1651367504 14400 # Node ID 1b97142d9722b8df4699decb41ab44c17e3975f1 # Parent 6aa19c08b5cf643d0aa0bbae5da35ec7c6664c42 MOTZ diff -r 6aa19c08b5cf -r 1b97142d9722 src/problems/motz.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/problems/motz.lisp Sat Apr 30 21:11:44 2022 -0400 @@ -0,0 +1,49 @@ +(defpackage :rosalind/motz (:use :cl :rosalind :losh :iterate)) +(in-package :rosalind/motz) + +(defparameter *input* + ">Rosalind_57 +AUAU") + +(defparameter *output* + "2") + + +;;;; Problem ------------------------------------------------------------------ +(defun rna-bases-pair-p (base1 base2) + (char= base1 (ecase base2 + (#\A #\U) + (#\U #\A) + (#\G #\C) + (#\C #\G)))) + +(defun rna-matches (rna &aux (cache (make-hash-table))) + (recursively ((start 0) + (end (length rna))) + (if (= start end) + 1 + (alexandria:ensure-gethash (complex start end) cache + (+ (recur (1+ start) end) + (iterate + ;; Arbitrarily pick char 0 as one of the ends of the match to avoid + ;; needing to cross the end of the RNA sequence when recurring. + (with b1 = (char rna start)) + ;; Unlike CAT, for MOTZ we allow odd-length subsequences. + (for b2 :in-string rna :from (1+ start) :below end :with-index i) + (when (rna-bases-pair-p b1 b2) + (summing (* (recur (1+ start) i) + (recur (1+ i) end)))))))))) + +(define-problem motz (data stream) *input* *output* + (mod (rna-matches (nth-value 1 (u:read-fasta data))) 1000000)) + + +#; Scratch -------------------------------------------------------------------- + + +(problem-motz) + +(problem-motz "UAGCGUGAUCAC") + +(time (solve motz)) +