Возвращаемое значение - Lisp

Узнай цену своей работы

Формулировка задачи:

Код проверки билета на "Счастливость" (сумма первой группы из 3х цифр равна сумме второй группе цифр)
(defun razr-pq (num n)
    (rem
        (truncate
            (/ (abs num) (expt 10 n)))
            10))
(defun happy-ticket(num)
    (and (>= num 0) (<= num 999999)
        (=  (+  (razr-pq num 0)
                (razr-pq num 1)
                (razr-pq num 2))
            (+  (razr-pq num 3)
                (razr-pq num 4)
                (razr-pq num 5)))))
(happy-ticket 123261)
после компиляции выдаёт T а не Nil как сделать чтобы выдал nil? компилирую строчку в отдельном файле (equalp 10 "10") тоже T P.S. только начал изучать lisp пишу в Notepad++ компилирую SBCL

Решение задачи: «Возвращаемое значение»

textual
Листинг программы
(defun lucky-tktp (m n
                   &aux
                   (s (add-zero (write-to-string m) n)))
  (loop for a across s
        for b from 1 to n
        if (> b (/ n 2)) sum (digit-char-p a) into p2
        else sum (digit-char-p a) into p1
        finally (return (= p1 p2))))
 
(defun add-zero (s n)
  (if (< (length s) n) (add-zero (concatenate 'string "0" s) n) s))
 
> (lucky-tktp 000001 6)
NIL
> (lucky-tktp 010001 6)
T

Объяснение кода листинга программы

В коде присутствуют две функции: lucky-tktp и add-zero.

  1. lucky-tktp принимает два аргумента: m и n. Аргумент m — это строка, представляющая собой номер, возможно, с нечетным количеством цифр. Аргумент n — это целое число, представляющее собой количество цифр, которые должны быть в числе m.
  2. Внутри функции lucky-tktp создается новая переменная s, которая равна m, дополненному до n нулями, если m короче n, или просто m, если m уже содержит достаточное количество цифр.
  3. Затем используется цикл loop, который перебирает символы строки s. На каждой итерации цикла проверяется, является ли текущий символ цифрой. Если символ является цифрой и его позиция в числе n четная, то значение переменной p1 увеличивается на единицу. Если символ является цифрой и его позиция в числе n нечетная, то значение переменной p2 увеличивается на единицу.
  4. В конце цикла проверяется, равны ли значения p1 и p2. Если равны, то возвращается NIL, что означает, что номер m не является счастливым. Если не равны, то возвращается T, что означает, что номер m является счастливым.
  5. Функция add-zero принимает два аргумента: s и n. Аргумент s — это строка, которую нужно дополнить нулями до длины n. Аргумент n — это целое число, представляющее собой количество нулей, которые необходимо добавить.
  6. Внутри функции add-zero проверяется, является ли длина строки s меньше n. Если да, то к строке s добавляются нули в начале до тех пор, пока длина строки не станет равной n. Если длина строки уже равна n, то возвращается исходная строка s.

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы