src/problems/sign.lisp @ 93ba483d9bc9

Move function
author Steve Losh <steve@stevelosh.com>
date Sun, 25 Aug 2019 22:59:19 -0400
parents 638d42c1ebe6
children 2735aa6aab79
(in-package :rosalind)

(defparameter *input-sign* "2")

(defparameter *output-sign* "8
-1 -2
-1 2
-2 -1
-2 1
1 -2
1 2
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)