src/problems/corr.lisp @ de8dff345414

CORR
author Steve Losh <steve@stevelosh.com>
date Tue, 14 Dec 2021 19:11:27 -0500
parents (none)
children a95ed046cc2c
(defpackage :rosalind/corr (:use :cl :rosalind :losh :iterate))
(in-package :rosalind/corr)

(defparameter *input*
  ">Rosalind_52
TCATC
>Rosalind_44
TTCAT
>Rosalind_68
TCATC
>Rosalind_28
TGAAA
>Rosalind_95
GAGGA
>Rosalind_66
TTTCA
>Rosalind_33
ATCAA
>Rosalind_21
TTGAT
>Rosalind_18
TTTCC
")

(defparameter *output*
  "GAGGA->GATGA
TTCAT->TTGAT
TTTCC->TTTCA
")


;;;; Problem ------------------------------------------------------------------
(defun read-frequencies (reads)
  (iterate
    (with result = (make-hash-table :test #'equal))
    (for read :in reads)
    (incf (gethash read result 0))
    (for read-rc = (u:reverse-complement read))
    (unless (string= read read-rc)
      (incf (gethash read-rc result 0)))
    (returning (remhash-if-value (curry #'= 1) result))))

(defun find-correction (read freqs)
  (iterate (for (good nil) :in-hashtable freqs)
           (finding good :such-that (= 1 (u:hamming good read)))))

(define-problem corr (data stream) *input* *output*
  (iterate
    (with reads = (mapcar #'cdr (u:read-fasta-into-alist data)))
    (with freqs = (read-frequencies reads))
    (for r :in reads)
    (unless (gethash r freqs)
      (collect (format nil "~A->~A" r (find-correction r freqs)) :into result))
    (returning (str:join #\newline (sort result #'string<))))) ; sort for test


#; Scratch --------------------------------------------------------------------

(problem-corr)

(time (solve corr))