Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun check (x &optional (l '(I V X L C D M)) (c 1))
- (cond ((null l) 0)
- ((eq x (car l)) c)
- (t (check x (cdr l) (+ c 1)))))
- (defun f2(lis &optional (lst nil) )
- (
- let ((cur (car lis))
- (nxt (cadr lis)))
- (let ((cVal (check cur)) ; получаем величину римской цифры
- (curHalf (> (check cur '(V L D)) 0))) ; является ли текущий половинкой
- (let ((sb (< cVal (check nxt)))) ; если сейчас вычитание
- (
- cond
- ( (null lis) t ) ; если конец списка
- ( (and sb curHalf) -3 ) ; если вычитание половинки (cur = V L D)
- ( (and sb (eq cur (caddr lis))) -6) ; если после вычитания добавляет то, что вычитает (X L X)
- ( (and sb (eq lst nxt) (> (check nxt '(V L D)) 0)) -4 ) ; если сейчас вычитание и предыдущий и следующий половинки(L X L)
- ( (and lst (> (check nxt) (check lst))) -5 ) ; если предыдущий меньще следующего(X X L)
- ( t (f2 (cdr lis) cur) )
- )
- ))))
- ; считает число вхождений ch в списке l
- (defun counter (ch l &optional (c 0))
- (
- cond
- ( (null l) c )
- ( (eq ch (car l)) (counter ch (cdr l) (+ c 1)) )
- ( t (counter ch (cdr l) c))
- ))
- ; проверка допустимых вхождений римских цифр
- (defun checkRep(l)
- (
- and ( <= (counter 'I l) 3)
- ( <= (counter 'V l) 1)
- ( <= (counter 'X l) 3)
- ( <= (counter 'L l) 1)
- ( <= (counter 'C l) 3)
- ( <= (counter 'D l) 1)
- ( <= (counter 'M l) 4)
- ))
- (defun checkRom (l)
- (
- cond
- ( (null l) t )
- ( (not (member (car l) '(I V X L C D M))) nil )
- ( t (checkRom (cdr l)) )
- ))
- (defun f(l)
- (
- and (checkRom l) (checkRep l) (f2 l)
- ))
- ;(trace f2)
- ;(trace check)
- (print (f '(x c i i i ))) ; t
- (print (f '(X C L ))) ; nil
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement