International Radiotelephony Spelling Alphabet II by hebiyan

(defun position-all (ch)
  #'(lambda (str)
      (labels ((inner (n l rv)
                 (cond
                   ((<= l n) (reverse rv))
                   (t
                    (let ((pos (position ch str :start n)))
                      (if pos
                          (inner (1+ pos) l (cons pos rv))
                          (reverse rv)))))))
        (inner 0 (length str) '()))))

(defun titles (str)
  (let ((positions (cons -1 (funcall (position-all #\Space) str))))
    (labels ((inner (lst rv)
               (if (endp lst)
                   (reverse rv)
                   (let ((n (first lst)))
                     (if (and (<= 3 (length lst))
                              (= (+ n 1) (second lst))
                              (= (+ n 2) (third lst)))
                         (inner (nthcdr 2 lst) (cons #\Space rv))
                         (inner (cdr lst) (cons (elt str (1+ n)) rv)))))))
      (inner positions '()))))

(format t "~{~a~}~%"
        (titles (read-line)))

Note that non-ascii characters in the above source code will be escaped (such as \x9f).

download

return to the top page