組み合わせの数を使うとこんな感じ?
(let loop ((chars (string->list *chars*)) (str '()) (num *value*)) (if (= (length str) 16) (list->string (reverse str)) (let ((x (c (- (length chars) 1) (- 15 (length str))))) (if (> x num) (loop (cdr chars) (cons (car chars) str) num) (loop (cdr chars) str (- num x)))))) => "\"%'[03569FfLoUXy"
これを、意味を持つ範囲で(reverse とかは真似てもしかたがないので…)できるだけ忠実に Squeak システムの Smalltalk 言語に訳すとこんなかんじ。
SequenceableCollection >> loopWith: str with: num
| chars x |
chars _ self.
str size = 16 ifTrue: [^ str as: String].
x _ chars size - 1 take: 15 - str size.
^ x > num
ifTrue: [chars allButFirst loopWith: (str copyWith: chars first) with: num]
ifFalse: [chars allButFirst loopWith: str with: num - x]
| value chars |
かないません。w orz