lisp lang solution №1

This commit is contained in:
Дмитрий Голондарев 2026-03-28 20:48:30 +03:00
parent 04eede7e76
commit 2a3ed164a3
3 changed files with 103 additions and 0 deletions

39
lisp/solution1.lisp Normal file
View file

@ -0,0 +1,39 @@
(defun ten-to-bin (x)
"Преобразует число в список бит"
(let ((bin '()))
(loop while (/= 0 x) do
(multiple-value-bind (quotient remainder) (truncate x 2)
(setf x quotient)
(push remainder bin)))
bin))
(defun calculate-sum (numbers mask)
"Считает сумму элементов, соответствующих единицам в маске."
(loop for num in numbers
for flag in mask
when (= flag 1)
sum num))
(defun find-sum (target numbers)
"Перебирает все комбинации (через битовые маски) для поиска целевой суммы."
(let* ((len (length numbers))
(total-combinations (1- (expt 2 len))))
(loop for index from 0 to total-combinations
for mask = (ten-to-bin index)
for current-sum = (calculate-sum numbers mask)
do (when (= current-sum target)
(format t "OK: ~A~%" mask)
(return-from find-sum mask)))
(progn
(format t "NO: not found ~%")
'())))
(defun main (args)
(let ((len (length args)))
(if (or (< len 5) (> len 30))
(progn
(format t "ER: input parameters~%")
(uiop:quit 1))
(let ((target (parse-integer (first args)))
(numbers (mapcar #'parse-integer (rest args))))
(find-sum target numbers)))))