組み合わせの数を使うとこんな感じ?
(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