Shiro さんの組み合わせの数版を Smalltalk で

組み合わせの数を使うとこんな感じ?

(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
value _ 99999999999999999. chars _ '!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'. ^ chars probCLoopWith: #() andWith: value => "%'[03569FfLoUXy

かないません。w orz