Advertisement
Guest User

Untitled

a guest
Nov 13th, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.91 KB | None | 0 0
  1. (defun check (x &optional (l '(I V X L C D M)) (c 1))
  2.     (cond ((null l) 0)
  3.           ((eq x (car l)) c)
  4.           (t (check x (cdr l) (+ c 1)))))
  5.  
  6. (defun f2(lis &optional (lst nil) )
  7. (
  8.  let ((cur (car lis))
  9.       (nxt (cadr lis)))
  10.       (let ((cVal (check cur)) ; получаем величину римской цифры
  11.             (curHalf (> (check cur '(V L D)) 0))) ; является ли текущий половинкой
  12.            (let ((sb (< cVal (check nxt)))) ; если сейчас вычитание
  13.   (
  14.    cond
  15.     ( (null lis) t ) ; если конец списка
  16.     ( (and sb curHalf) -3 ) ; если вычитание половинки (cur = V L D)
  17.     ( (and sb (eq cur (caddr lis))) -6) ; если после вычитания добавляет то, что вычитает (X L X)
  18.     ( (and sb (eq lst nxt) (> (check nxt '(V L D)) 0)) -4 ) ; если сейчас вычитание и предыдущий и следующий половинки(L X L)
  19.     ( (and lst (> (check nxt) (check lst))) -5 ) ; если предыдущий меньще следующего(X X L)
  20.     ( t (f2 (cdr lis) cur) )
  21.   )
  22. ))))
  23.  
  24. ; считает число вхождений ch в списке l
  25. (defun counter (ch l &optional (c 0))
  26. (
  27. cond
  28.     ( (null l) c )
  29.     ( (eq ch (car l)) (counter ch (cdr l) (+ c 1)) )
  30.     ( t (counter ch (cdr l) c))
  31. ))
  32.  
  33. ; проверка допустимых вхождений римских цифр
  34. (defun checkRep(l)
  35. (
  36. and ( <= (counter 'I l) 3)
  37.     ( <= (counter 'V l) 1)
  38.     ( <= (counter 'X l) 3)
  39.     ( <= (counter 'L l) 1)
  40.     ( <= (counter 'C l) 3)
  41.     ( <= (counter 'D l) 1)
  42.     ( <= (counter 'M l) 4)
  43. ))
  44.  
  45. (defun checkRom (l)
  46. (
  47. cond
  48.  ( (null l) t )
  49.  ( (not (member (car l) '(I V X L C D M))) nil )
  50.  ( t (checkRom (cdr l)) )
  51. ))
  52.  
  53. (defun f(l)
  54. (
  55. and (checkRom l) (checkRep l) (f2 l)
  56. ))
  57.  
  58. ;(trace f2)
  59. ;(trace check)
  60.  
  61. (print (f '(x c i i i ))) ; t
  62. (print (f '(X C L ))) ; nil
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement