;;;; Adam Comella

;;;; Fair Lawn High School

;;;; 12th Grade

;;;; Senior 5 Division

 

(defun word-char-p (c)

  (or (char= #\- c) (alpha-char-p c)))

 

(defun distance (str start &key (reverse-search nil) (fn (complement #'word-char-p)))

  (let* ((str (if reverse-search (reverse (subseq str 0 (1+ start)))

                          (subseq str start)))

             (pos (or (position-if fn str)

                          (length str))))

    pos))

 

(defun make-dist-rule (dist &key (reverse-search nil))

  #'(lambda (line index old-line old-index)

      (<= (distance line index :reverse-search reverse-search) dist)))

 

(defun i-rule (line index old-line old-index)

  (when (> old-index 0)

    (let ((dist->start (1- (distance old-line old-index :reverse-search t)))

              (dist->i (1+ (distance old-line (1- old-index) :reverse-search t

                                                 :fn #'(lambda (c) (char-equal c #\i))))))

      (and (> dist->start 0) (>= dist->i dist->start)))))

 

(defun make-rule (new old &optional (func #'(lambda (line index

                                                                             old-line old-index) t)))

  (list new old func))

 

(defparameter *rules*

  (list (make-rule "." ". BORK BORK BORK!")

            (make-rule "THE" "ZEE")

            (make-rule "AN" "UN")

            (make-rule "AU" "OO")

            (make-rule "A" "E" (complement (make-dist-rule 1)))

            (make-rule "OW" "OO")

            (make-rule "O" "U")

            (make-rule "IR" "UR")

            (make-rule "TION" "SHUN")

            (make-rule "I" "EE" #'i-rule)

            (make-rule "EN" "EE" (make-dist-rule 2))

            (make-rule "F" "FF")

            (make-rule "E" "E-A" (make-dist-rule 1))

            (make-rule "U" "OO" (complement (make-dist-rule 1 :reverse-search t)))

            (make-rule "V" "F")

            (make-rule "W" "V")))

 

(defun main ()

  (dotimes (i 5)

    (let* ((line (read-line *query-io*)) (old-line line))

      (do ((index 0 (1+ index))

               (old-index 0 (1+ old-index)))

              ((>= index (length line)))

            (dolist (rule *rules*)

              (let ((old (car rule))

                        (new (cadr rule))

                        (func (caddr rule)))

                (when (and (eql (search old line :start2 index) index)

                               (funcall func line index old-line old-index))

                  (setf line (concatenate 'string (subseq line 0 index)

                                                      new

                                                      (subseq line (+ index (length old)))))

                  ;; The index vars are incremented by length - 1 because they

                  ;; are incremented by 1 automatically every loop iteration

                  (incf index (1- (length new)))

                  (incf old-index (1- (length old)))

                  (return)))))

      (format *query-io* "~a~%" line))))