fork(1) download
  1.  
  2. (defparameter *n* 0)
  3.  
  4. (defun calc-counts (total-weight keys &aux results)
  5. (labels ((calc (left-weight keys-count keys)
  6. (incf *n*)
  7. (cond ((= left-weight 0)
  8. (push keys-count results))
  9. ((and (> left-weight 0) (consp keys))
  10. (destructuring-bind (key &rest rest-keys) keys
  11. (calc (- left-weight (key-weight key))
  12. (add-key keys-count key)
  13. keys)
  14. (calc left-weight keys-count rest-keys))))))
  15. (calc total-weight (make-counts keys) keys)
  16. results))
  17.  
  18. (defun make-counts (keys)
  19. (loop :for key :in keys
  20. :collect (cons key 0)))
  21.  
  22. (defun add-key (counts k)
  23. (loop :for (key . count) :in counts
  24. :collect (cons key (if (eq key k) (1+ count) count))))
  25.  
  26. (defun get-key-count (counts k)
  27. (cdr (assoc k counts)))
  28.  
  29. (defun key-weight (k)
  30. (get k :weight))
  31.  
  32. (defun (setf key-weight) (w k)
  33. (setf (get k :weight) w))
  34.  
  35. ; --------
  36.  
  37. (defconstant cake&tea-weight 50)
  38. (defconstant apple-weight 65)
  39.  
  40. (setf (key-weight 'sour) (+ apple-weight (* 3 cake&tea-weight)))
  41. (setf (key-weight 'half-sour) (+ apple-weight (* 2 cake&tea-weight)))
  42. (setf (key-weight 'sweet) (+ apple-weight cake&tea-weight) )
  43.  
  44. (defparameter *fmt*
  45. "~%Result #~d
  46. Sour apples: ~4d
  47. Half-sour apples: ~4d
  48. Sweet apples: ~4d
  49. Total apples: ~d, cakes: ~d, tea drinks: ~d
  50. ")
  51.  
  52. (defun main ()
  53. (let ((results (calc-counts 1435 '(sour half-sour sweet))))
  54. (loop :for i :upfrom 1
  55. :for result :in results :do
  56. (let* ((sour (get-key-count result 'sour))
  57. (half (get-key-count result 'half-sour))
  58. (sweet (get-key-count result 'sweet))
  59. (apples (+ sour half sweet))
  60. (c&t (+ (* 3 sour) (* 2 half) sweet)))
  61. (format t *fmt* i sour half sweet apples c&t c&t)))
  62. (format t "~%~a cases~%" *n*)))
  63.  
  64. (main)
Success #stdin #stdout 0.01s 10736KB
stdin
Standard input is empty
stdout
Result #1
  Sour      apples:    0
  Half-sour apples:    8
  Sweet     apples:    1
  Total apples: 9, cakes: 17, tea drinks: 17

Result #2
  Sour      apples:    1
  Half-sour apples:    6
  Sweet     apples:    2
  Total apples: 9, cakes: 17, tea drinks: 17

Result #3
  Sour      apples:    2
  Half-sour apples:    4
  Sweet     apples:    3
  Total apples: 9, cakes: 17, tea drinks: 17

Result #4
  Sour      apples:    3
  Half-sour apples:    2
  Sweet     apples:    4
  Total apples: 9, cakes: 17, tea drinks: 17

Result #5
  Sour      apples:    4
  Half-sour apples:    0
  Sweet     apples:    5
  Total apples: 9, cakes: 17, tea drinks: 17

471 cases