--- a/src/problems/motz.lisp Sat Apr 30 21:11:44 2022 -0400
+++ b/src/problems/motz.lisp Sat Apr 30 21:21:49 2022 -0400
@@ -6,7 +6,7 @@
AUAU")
(defparameter *output*
- "2")
+ "7")
;;;; Problem ------------------------------------------------------------------
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/problems/rnas.lisp Sat Apr 30 21:21:49 2022 -0400
@@ -0,0 +1,47 @@
+(defpackage :rosalind/rnas (:use :cl :rosalind :losh :iterate))
+(in-package :rosalind/rnas)
+
+(defparameter *input*
+ "AUGCUAGUACGGAGCGAGUCUAGCGAGCGAUGUCGUGAGUACUAUAUAUGCGCAUAAGCCACGU")
+
+(defparameter *output*
+ "284850219977421")
+
+
+;;;; Problem ------------------------------------------------------------------
+(defun rna-bases-pair-p (base1 base2)
+ (member base1 (ecase base2
+ (#\A '(#\U))
+ (#\U '(#\A #\G))
+ (#\G '(#\C #\U))
+ (#\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
+ ;; This is getting tedious.
+ (with b1 = (char rna start))
+ ;; Start further away than for MOTZ.
+ (for b2 :in-string rna :from (+ start 4) :below end :with-index i)
+ (when (rna-bases-pair-p b1 b2)
+ (summing (* (recur (1+ start) i)
+ (recur (1+ i) end))))))))))
+
+(define-problem rnas (data stream) *input* *output*
+ (rna-matches (nth-value 1 (u:read-fasta data))))
+
+
+#; Scratch --------------------------------------------------------------------
+
+
+(problem-rnas)
+
+(problem-rnas "UAGCGUGAUCAC")
+
+(time (solve rnas))
+