src/problems/scsp.lisp @ 97dda08645b3
default tip
SCSP
author |
Steve Losh <steve@stevelosh.com> |
date |
Mon, 08 Aug 2022 19:26:18 -0400 |
parents |
(none) |
children |
(none) |
(defpackage :rosalind/scsp (:use :cl :rosalind :losh :iterate))
(in-package :rosalind/scsp)
(defparameter *input* "ATCTGAT
TGCATA")
(defparameter *output* "ATCTGCATA")
(defun shortest-common-supersequence (a b)
;; Since we did LCS with a dynamic programming table, let's use memoization
;; for this one.
(let ((seen (make-hash-table :test #'equal)))
(_ (recursively ((a (reverse (coerce a 'list)))
(b (reverse (coerce b 'list))))
(alexandria:ensure-gethash (list a b) seen
(cond ((null a) b)
((null b) a)
(t (let ((ca (first a))
(cb (first b)))
(if (char= ca cb)
(cons ca (recur (rest a) (rest b)))
(alexandria:extremum (list (cons ca (recur (rest a) b)) ; lol
(cons cb (recur a (rest b))))
#'< :key #'length)))))))
nreverse
(coerce _ 'string))))
(define-problem scsp (data stream) *input* *output*
(shortest-common-supersequence (read-line data) (read-line data)))