Ну, для начала, я не думаю, что вам нужны и я, и смещение.Они оба переходят от 0 до len в шаге друг с другом.
Тогда вы можете сделать что-то вроде этого, чтобы свернуть +/- случаи для <или> = 50 в одно утверждение:
(+ (/ pos 10) (* (if (< pos 50) 1 -1) offset))
Это дает вам (не проверено):
(defun place-boat (len pos dir)
(dotimes (offset len)
(if (= dir 0)
(setf (aref *ans-board*
(+ (/ pos 10) (* (if (< pos 50) 1 -1) offset))
(mod pos 10))
'#)
(setf (aref *ans-board*
(/ pos 10)
(+ (mod pos 10) (* (if (< pos 50) 1 -1) offset)))
'#))))
, которая все еще имеет некоторую избыточность.Но это то, что у меня так далеко.
Обратите внимание, я очень мало знаю об Common Lisp, так что я уверен, что кто-то другой мог бы сделать намного лучше:)