src/problems/grph.lisp @ ca95211a2d98
RSTR
author |
Steve Losh <steve@stevelosh.com> |
date |
Fri, 22 Feb 2019 19:32:24 -0500 |
parents |
23151d9021cf |
children |
2735aa6aab79 |
(in-package :rosalind)
(defparameter *input-grph*
">Rosalind_0498
AAATAAA
>Rosalind_2391
AAATTTT
>Rosalind_2323
TTTTCCC
>Rosalind_0442
AAATCCC
>Rosalind_5013
GGGTGGG")
(defparameter *output-grph*
"Rosalind_0498 Rosalind_0442
Rosalind_0498 Rosalind_2391
Rosalind_2391 Rosalind_2323
")
(defun strings-overlap-p (k left right)
"Return whether `left` and `right` overlap (in order) by exactly `k` characters.
(strings-overlap-p 3 \"abcdef\"
\"defhi\") ; => T
(strings-overlap-p 2 \"abcdef\"
\"defhi\") ; => NIL
"
(string= left right
:start1 (- (length left) k)
:end2 k))
(define-problem grph (data stream)
*input-grph*
*output-grph*
(let* ((data (read-fasta-into-hash-table data))
(graph (digraph:make-digraph
:test #'equal
:initial-vertices (alexandria:hash-table-keys data))))
(maphash (lambda (lk lv)
(maphash (lambda (rk rv)
(unless (string= lk rk)
(when (strings-overlap-p 3 lv rv)
(digraph:insert-edge graph lk rk))))
data))
data)
;; (ql:quickload :cl-digraph.dot)
;; (digraph.dot:draw graph)
(-<> (iterate (for (l . r) :in (digraph:edges graph))
(collect (format nil "~A ~A~%" l r)))
(sort <> #'string<)
(str:join nil <>))))