df2880a47218
SIGN
author | Steve Losh <steve@stevelosh.com> |
---|---|
date | Mon, 24 Dec 2018 00:41:30 -0500 |
parents | b1baea60c24f |
children | 32944636e2d3 |
branches/tags | (none) |
files | src/problems/sign.lisp |
Changes
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/problems/sign.lisp Mon Dec 24 00:41:30 2018 -0500 @@ -0,0 +1,37 @@ +(in-package :rosalind) + +(defparameter *input-sign* "2") + +(defparameter *output-sign* "8 +-1 -2 +-1 2 +1 -2 +1 2 +-2 -1 +-2 1 +2 -1 +2 1") + + +(defun sign-permutations (list) + (if (null list) + (list '()) ;; there is exactly one permutation of the empty list: () + (destructuring-bind (n . more) list + (append (mapcar (curry #'cons n) (sign-permutations more)) + (mapcar (curry #'cons (- n)) (sign-permutations more)))))) + +(define-problem sign (data string) + *input-sign* + *output-sign* + (let* ((n (parse-integer data)) + (count (* (expt 2 n) + (factorial n))) + (perms (mapcan #'sign-permutations + (permutations (alexandria:iota n :start 1))))) + ;; sort to ensure consistent output for the unit test + (format nil "~D~%~{~A~^~%~}" + count + (sort (mapcar (curry #'str:join " ") perms) #'string<)))) + +;; (problem-sign "2") +;; (solve sign)