どう書く?org ;コインを減らす払い方 を commonlispで その1
コインを減らす払い方
難しい。単純にロジックどう書けばいいかわからんぞ。
ひょっとして俺ってものすごいバカなのかも?(ショック)
とりあえず、今書いたところまでのせとく。
関数を作るマクロを初めて書いた。
おもしろーい。
;;コインを減らす払い方 (defstruct coin (name nil) (value nil)) (defmacro make-??yen(value) (let ((g (gensym)) (nm (concatenate 'string "make-" (princ-to-string value) "yen"))) `(defun ,(intern (string-upcase nm)) (count) (let ((,g (make-coin))) (setf (coin-name ,g) (intern (string-upcase (concatenate 'string ,(princ-to-string value) "yen")))) (setf (coin-value ,g) ,value) (list ,g count))))) (defmacro force0(val) (if (null val) 0 val)) (make-??yen 1) (make-??yen 5) (make-??yen 10) (make-??yen 50) (make-??yen 100) (make-??yen 500) (defun make-moneybag( 1yen-count 5yen-count 10yen-count 50yen-count 100yen-count 500yen-count) (list (make-1yen (force0 1yen-count)) (make-5yen (force0 5yen-count)) (make-10yen (force0 10yen-count)) (make-50yen (force0 50yen-count)) (make-100yen (force0 100yen-count)) (make-500yen (force0 500yen-count)))) (defun get-coin(coins name) (assoc name coins :key #'(lambda (k) (coin-name k)))) (defun sum-coins(coins) (reduce #'(lambda (sum alist) (progn (+ sum (* (coin-value (car alist)) (cadr alist))))) coins :initial-value 0)) (defun get-oturi(kakaku shiharai) (let ((oturi (- shiharai kakaku)) (ps (reverse (make-moneybag 0 0 0 0 0 0)))) (get-oturi_ oturi ps))) (defun get-oturi_(oturi coins) (if (null coins) nil (let ((coin (car (car coins)))) (if (or (null coin) (< oturi 0)) nil (let* ((multiple-value-bind (maisu amari) (truncate oturi (coin-value coin)))) (nextoturi (- oturi (* maisu (coin-value coin))))) (append (get-oturi_ nextoturi (cdr coins)) (list coin maisu))))))) (defun kono-coin-detariru?(kingaku alist) (let ((coin (car alist)) (maisu (cadr alist))) (if (kingaku (defun kaisi-coin-search(kingaku moneybag)