Advertisement
Denchi_Himself

denchis_lisp_library

Oct 6th, 2023 (edited)
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 4.28 KB | Source Code | 0 0
  1. ;gnu clisp  2.49.60
  2.  
  3. ;Условие: Дан список из n чисел и натуральное число m<n. Для каждой группы из m элементов, которые находятся рядом, вычислить ее сумму. Написать функцию, которая  выдает список из всех возможных сумм.
  4. ;Пример: (7 1 4 2 3), m=3. S= (12 7 9).
  5.  
  6.  
  7. (defun tp() (terpri)) ;Упрощает перенос.
  8.  
  9. (defun len (w &optional (n 0)) ;ДЛИНА: Вычисляет длину списка.
  10.   (cond ((null w) n)
  11.         (t (len (cdr w) (1+ n))))) ;обращается к
  12.  
  13.  
  14. (defun sumfirst(lst m) ;Суммирует m первых элементов списка lst.
  15.     (cond
  16.         ((< m 0) nil)
  17.         ((= m 0) 0)
  18.         (T (+ (car lst) (sumfirst (cdr lst) (- m 1)))) ;Суммирует первый элемент и сумму остального списка.
  19.         )
  20.     )
  21.  
  22.  
  23. (defun get-sums(lst m &optional (l (len lst))) ;ГЛАВНАЯ ФУНКЦИЯ: вычисляет все суммы списка lst длиной m, которые находятся рядом.
  24.     (setq l (len lst))
  25.     (cond
  26.         ((< m 1) nil)
  27.         ((< l m) nil)
  28.         ((= l m) (cons (sumfirst lst m) nil)) ;преобразует объединение (a.nil) в a
  29.         (T (cons (sumfirst lst m) (get-sums (cdr lst) m))) ;Функция создаёт массив значений функции sumfirst, полученный через рекурсию.
  30.         )
  31.     )
  32.  
  33. ;Создание списков
  34. (setq a '(1 2 3 4 5)
  35.       b '(6 7 8 9 10)
  36.       c '(6 3 7)
  37.       d '(47 24 -77)
  38.       e '(3 5 44 63 46 6 6 5))
  39. (setq ab (append a b)
  40.       bc (append b c)
  41.       cd (append c d)
  42.       de (append d e))
  43. ; ВЫВОД
  44. (format T "~a" (get-sums a 2))(tp)
  45. (format T "~a" (get-sums a 3))(tp)
  46. (format T "~a" (get-sums b 2))(tp)
  47. (format T "~a" (get-sums e 2))(tp)(tp)
  48.  
  49. (format T "~a" (get-sums ab 4))(tp)
  50. (format T "~a" (get-sums bc 4))(tp)
  51. (format T "~a" (get-sums cd 4))(tp)
  52. (format T "~a" (get-sums de 4))(tp)
  53. (tp)
  54. (format T "~a" (get-sums cd 0))(tp)
  55. (format T "~a" (get-sums cd 1))(tp)
  56. (format T "~a" (get-sums cd 8))(tp)
  57.  
  58. ;ИНДИВ 2
  59.  
  60. ;Проверяет наличие элемента в списке.
  61. (defun ss (obj lst)
  62.   (cond ((null lst) nil)
  63.         ((equal obj (car lst)) T)
  64.         (t (ss obj (cdr lst)))))
  65.  
  66. ;Воссоздаёт список с уникальным множеством его элементов
  67. (defun uniquify (lst &optional (calc '()))
  68.           (cond
  69.               ((null lst) calc)
  70.               ((ss (car lst) calc) (uniquify (cdr lst) calc))
  71.               (T (uniquify (cdr lst) (cons (car lst) calc)))
  72.         )
  73.     )
  74.  
  75. ;Сравнивает длины двух списков, не вычисляя их.
  76. (defun len-compare (lst-1 lst-2)
  77.     (cond
  78.         ((null lst-1) (cond((null lst-2) t)(t nil)))
  79.         (t (cond((null lst-2) nil)(t (len-compare (cdr lst-1) (cdr lst-2)))))
  80.         )
  81.     )
  82.  
  83. ;Сравнивает строки lst-1 и lst-2
  84. (defun eq-strings (lst-1 lst-2)
  85.     (setq _1 (uniquify lst-1) _2 (uniquify lst-2) q (uniquify (append _1 _2)))
  86.     (and (len-compare q _2) (len-compare q _1))
  87.     )
  88.  
  89. ;Выводит ответ на экран
  90. (defun ans (s) ;s - bool
  91.     (format t "Списки состоят из ~a элементов" (cond ((null s) "РАЗНЫХ") (t "ОДИНАКОВЫХ")))
  92.     (terpri)
  93. )
  94.  
  95. ;Примеры ввода:
  96. (ans (eq-strings '(1 2 3 4 5 6 7) '(3 4 5 6 7 1 2)))
  97. (ans (eq-strings '(1 2 3 4 5 6 7) '(3 4 5 0 7 1 2)))
  98. (ans (eq-strings '(1 2 3 4) '(4 4 3 2 3 1 2)))
  99. (ans (eq-strings '(1 2 3 4) '(1 1 1 2 d 2 2 2 2 2 3)))
  100. (terpri)
  101. (ans (eq-strings '(() () () () ()) '(nil nil nil)))
  102. (ans (eq-strings '() '()))
  103. (terpri)
  104. (ans (eq-strings '(к а б а н) '(б а н к а)))
  105. (ans (eq-strings '(к а р а т и с т) '(а р т и с т к а)))
  106. (ans (eq-strings '(л и л и я) '(и л ь я)))
  107. (ans (eq-strings '(м а л а я р е к а к я ц и н) '(р е к л а м н а я а к ц и я)))
  108.  
  109. ;4 вариант. f(x)=e^(-2x)∙cos⁡(x/3)
  110. (defmacro f (x)
  111.     (* (exp (* -2 x))
  112.         (cos (/ x 3))
  113.         ))
  114. (print (f 0)) ;f(0)=1
  115. (print (f -1)) ;f(-1)=6.98
  116. (print (f 1)) ;f(1)=0.128
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement