Возвращаемое значение - Lisp
Формулировка задачи:
Код проверки билета на "Счастливость" (сумма первой группы из 3х цифр равна сумме второй группе цифр)
после компиляции выдаёт T а не Nil
как сделать чтобы выдал nil?
компилирую строчку в отдельном файле (equalp 10 "10") тоже T
P.S. только начал изучать lisp
пишу в Notepad++
компилирую SBCL
(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)
Решение задачи: «Возвращаемое значение»
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
.
lucky-tktp
принимает два аргумента:m
иn
. Аргументm
— это строка, представляющая собой номер, возможно, с нечетным количеством цифр. Аргументn
— это целое число, представляющее собой количество цифр, которые должны быть в числеm
.- Внутри функции
lucky-tktp
создается новая переменнаяs
, которая равнаm
, дополненному доn
нулями, еслиm
корочеn
, или простоm
, еслиm
уже содержит достаточное количество цифр. - Затем используется цикл
loop
, который перебирает символы строкиs
. На каждой итерации цикла проверяется, является ли текущий символ цифрой. Если символ является цифрой и его позиция в числеn
четная, то значение переменнойp1
увеличивается на единицу. Если символ является цифрой и его позиция в числеn
нечетная, то значение переменнойp2
увеличивается на единицу. - В конце цикла проверяется, равны ли значения
p1
иp2
. Если равны, то возвращаетсяNIL
, что означает, что номерm
не являетсясчастливым
. Если не равны, то возвращаетсяT
, что означает, что номерm
являетсясчастливым
. - Функция
add-zero
принимает два аргумента:s
иn
. Аргументs
— это строка, которую нужно дополнить нулями до длиныn
. Аргументn
— это целое число, представляющее собой количество нулей, которые необходимо добавить. - Внутри функции
add-zero
проверяется, является ли длина строкиs
меньшеn
. Если да, то к строкеs
добавляются нули в начале до тех пор, пока длина строки не станет равнойn
. Если длина строки уже равнаn
, то возвращается исходная строкаs
.