Advertisement
Guest User

Untitled

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