aboutsummaryrefslogtreecommitdiff
path: root/challenge-078/jeongoon/common-lisp/ch-2.lsp
blob: d258c61b0ec92730cd41ea32ccd97341b67f0481 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
(defun left-rotate (lst n)
  (loop for e in lst
        for i from 0
        if (< i n) collect e into backs
        else collect e into fronts
        finally (return (concatenate 'list fronts backs))))

(defun map-left-rotate (lst n-list)
  (map 'list (lambda (n) (funcall #'left-rotate lst n)) n-list))

(defun get-command-line ()
  (or
   #+CLISP *args*
   #+SBCL *posix-argv*
   #+LISPWORKS system:*line-arguments-list*
   #+CMU extensions:*command-line-words*
   nil))

(defparameter *cmdline* (get-command-line))

(defun print-usage ()
  (format t "Usage: sbcl --script ch-1.lsp <integer> ... / <unsigned integer> ..."
          (first *cmdline*)))
(when (< (length *cmdline*) 5) (print-usage) (quit))

(defparameter *sep* nil)
(defparameter *a-array* '())
(defparameter *b-array* '())

;; ref: http://clhs.lisp.se/Body/05_abc.htm
(setf (values *a-array* *b-array*)
  (loop for arg in (rest *cmdline*)
        for n = (parse-integer arg :junk-allowed t)
        if (null n) do (when (null *sep*) (setq *sep* arg))
        else if (null *sep*) collect arg into a-array
             else collect n into b-array
        finally (return (values a-array b-array))))

(format t "@A = ~a~%" *a-array*)
(format t "@B = ~a~%" *b-array*)
(loop for rotated in (map-left-rotate *a-array* *b-array*)
      do (format t "~a~%" rotated))