--- a/src/problems/prob.lisp Fri Feb 22 19:23:17 2019 -0500
+++ b/src/problems/prob.lisp Fri Feb 22 19:32:24 2019 -0500
@@ -13,17 +13,8 @@
*output-prob*
(let ((dna (read-line data))
(gc-contents (read-all-from-string (read-line data))))
- (labels
- ((gcp (base)
- "Return whether `base` is G or C."
- (or (char= #\G base)
- (char= #\C base)))
- (base-probability (gc-content base)
- "Return the probability of `base` in DNA with the given `gc-content`."
- (if (gcp base)
- (/ gc-content 2)
- (/ (- 1 gc-content) 2)))
- (prob (gc-content)
+ (flet
+ ((prob (gc-content)
(iterate
(for base :in-string dna)
(summing (log (base-probability gc-content base) 10)))))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/problems/rstr.lisp Fri Feb 22 19:32:24 2019 -0500
@@ -0,0 +1,16 @@
+(in-package :rosalind)
+
+(defparameter *input-rstr* "90000 0.6
+ATAGCCGA")
+
+(defparameter *output-rstr* "0.689")
+
+
+(define-problem rstr (data stream)
+ *input-rstr*
+ *output-rstr*
+ (let* ((n (read data))
+ (gc (coerce (read data) 'double-float))
+ (dna (read-line data))
+ (prob (product dna :key (curry #'base-probability gc))))
+ (format nil "~,3F" (- 1 (expt (- 1 prob) n)))))
--- a/src/utils.lisp Fri Feb 22 19:23:17 2019 -0500
+++ b/src/utils.lisp Fri Feb 22 19:32:24 2019 -0500
@@ -84,6 +84,18 @@
((#\C #\T #\U) 1)))
+(defun-inline gcp (base)
+ "Return whether `base` is G or C."
+ (or (char= #\G base)
+ (char= #\C base)))
+
+(defun-inline base-probability (gc-content base)
+ "Return the probability of `base` in DNA with the given `gc-content`."
+ (if (gcp base)
+ (/ gc-content 2)
+ (/ (- 1 gc-content) 2)))
+
+
(defun mapcount (predicate sequence &rest more-sequences)
"Map `predicate` across sequences, counting satisfactory applications."
(let ((result 0))