src/problems/sign.lisp @ 870270771fde

PDST
author Steve Losh <steve@stevelosh.com>
date Sun, 19 Jan 2020 21:14:53 -0500
parents 2735aa6aab79
children 86d92162dc1f
(defpackage :rosalind/sign (:use :cl :rosalind :losh :iterate))
(in-package :rosalind/sign)

(defparameter *input* "2")

(defparameter *output* "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 (u:curry #'cons n) (sign-permutations more))
              (mapcar (u:curry #'cons (- n)) (sign-permutations more))))))

(define-problem sign (data string) *input* *output*
  (let* ((n (parse-integer data))
         (count (* (expt 2 n)
                   (u:factorial n)))
         (perms (mapcan #'sign-permutations
                        (u:permutations (alexandria:iota n :start 1)))))
    ;; sort to ensure consistent output for the unit test
    (format nil "~D~%~{~A~^~%~}"
            count
            (sort (mapcar (u:curry #'str:join " ") perms) #'string<))))