fork download
  1. (defun collect-with-indexes (seq predicate)
  2. (loop for i from 0 upto (1- (length seq))
  3. for e = (elt seq i)
  4. when (funcall predicate e)
  5. collect e into elements
  6. and collect i into indexes
  7. finally (return (values elements indexes))))
  8.  
  9. (defun odai-pt11-77 (seq selector comparer &key key)
  10. (multiple-value-bind (targets indexes)
  11. (collect-with-indexes seq selector)
  12. (loop for e in (sort targets comparer :key key)
  13. for i in indexes
  14. do (setf (elt seq i) e))
  15. seq))
  16.  
  17. (let ((s "213cba213cba213cba"))
  18. (format t "~@{~S~%~}"
  19. (odai-pt11-77 (copy-seq s) #'alpha-char-p #'char<)
  20. (odai-pt11-77 (copy-seq s) #'digit-char-p #'char<)))
  21.  
Success #stdin #stdout 0.01s 25248KB
stdin
Standard input is empty
stdout
"213aaa213bbb213ccc"
"111cba222cba333cba"