(defun collect-with-indexes (seq predicate)
(loop for i from 0 upto (1- (length seq))
for e = (elt seq i)
when (funcall predicate e)
collect e into elements
and collect i into indexes
finally (return (values elements indexes))))
(defun odai-pt11-77 (seq selector comparer &key key)
(multiple-value-bind (targets indexes)
(collect-with-indexes seq selector)
(loop for e in (sort targets comparer :key key)
for i in indexes
do (setf (elt seq i) e))
seq))
(let ((s "213cba213cba213cba"))
(format t "~@{~S~%~}"
(odai-pt11-77 (copy-seq s) #'alpha-char-p #'char<)
(odai-pt11-77 (copy-seq s) #'digit-char-p #'char<)))
KGRlZnVuIGNvbGxlY3Qtd2l0aC1pbmRleGVzIChzZXEgcHJlZGljYXRlKQogIChsb29wIGZvciBpIGZyb20gMCB1cHRvICgxLSAobGVuZ3RoIHNlcSkpCiAgICAgICAgZm9yIGUgPSAoZWx0IHNlcSBpKQogICAgICAgIHdoZW4gKGZ1bmNhbGwgcHJlZGljYXRlIGUpCiAgICAgICAgICBjb2xsZWN0IGUgaW50byBlbGVtZW50cwogICAgICAgICAgYW5kIGNvbGxlY3QgaSBpbnRvIGluZGV4ZXMKICAgICAgICBmaW5hbGx5IChyZXR1cm4gKHZhbHVlcyBlbGVtZW50cyBpbmRleGVzKSkpKQoKKGRlZnVuIG9kYWktcHQxMS03NyAoc2VxIHNlbGVjdG9yIGNvbXBhcmVyICZrZXkga2V5KQogIChtdWx0aXBsZS12YWx1ZS1iaW5kICh0YXJnZXRzIGluZGV4ZXMpCiAgICAgIChjb2xsZWN0LXdpdGgtaW5kZXhlcyBzZXEgc2VsZWN0b3IpCiAgICAobG9vcCBmb3IgZSBpbiAoc29ydCB0YXJnZXRzIGNvbXBhcmVyIDprZXkga2V5KQogICAgICAgICAgZm9yIGkgaW4gaW5kZXhlcwogICAgICAgICAgZG8gKHNldGYgKGVsdCBzZXEgaSkgZSkpCiAgICBzZXEpKQoKKGxldCAoKHMgIjIxM2NiYTIxM2NiYTIxM2NiYSIpKQogIChmb3JtYXQgdCAifkB7flN+JX59IgogICAgICAgICAgKG9kYWktcHQxMS03NyAoY29weS1zZXEgcykgIydhbHBoYS1jaGFyLXAgIydjaGFyPCkKICAgICAgICAgIChvZGFpLXB0MTEtNzcgKGNvcHktc2VxIHMpICMnZGlnaXQtY2hhci1wICMnY2hhcjwpKSkK