私はSequenceableCollection
FOでこれを実装してみましょう簡潔さのために:
nextCombination09
| j |
j := self findLast: [:ai | ai < 9] ifAbsent: [^nil].
j + 1 to: self size do: [:i | self at: i put: 0].
self at: j put: (self at: j) + 1
考え方は次のとおりです。すべての組み合わせを並べ替えるには、辞書順を使用します。
(a1, ..., an) < (b1, ..., bn)
i
すべてのためのai = bi
かのいくつかの指標j
aj < bj
以下:他の言葉で。
この順序では、最初の組み合わせは(0, ..., 0)
で、最後のものは(9, ..., 9)
です。
また、組み合わせ(a1, ..., an)
所定の順で次のは、これが最後のインデックスj
aj < 9
で、最低抜群インデックスに1
を付加するものです。たとえば、(2, 3, 8, 9)
の次の文字は(2, 3, 9, 9)
なので、間に何も入れることはできません。
(9, ..., 9)
になると、完了し、nil
と回答します。
上記の方法で受信者が変更されていることに注意してください。その理由は、下記のスクリプトにcopy
が必要な理由です。ここで
は補遺同じ技術が同様の性質の
other problemsのために使用することができる
(n
があなたのN
ある)
n := <whatever>
array := Array new: n withAll: 0.
combinations := OrderedCollection new: (10 raisedTo: n).
[
combinations add: array copy.
array nextCombination09 notNil] whileTrue.
^combinations
すべての組み合わせを生成するスクリプトです。
smalltalk lives! 20年前に野生で最後に聞いた。 – javadba
@javadba Smalltalkなどの言語の面白さは、もはや普及していなくても効果があります。私は何年も前から私が聞いたことから、Smalltalkを好奇心から学びました。私はRubyがSmalltalkからどのくらい持ち上げたのかに驚きました。それは、私が現代の言語でプログラミングすることについて考えている方法のいくつかを改良する原因となっています。私はあなたがSmalltalkを試したかどうか分かりませんが、楽しいです。 :)あなたが本当に誰かを選ぶ場合は、[pdp-11タグ](http://stackoverflow.com/questions/tagged/pdp-11)を参照してください。 :) – lurker
遠い過去に、Smalltalkのプログラマーは当時広く尊敬されていました。 C++のインタビューを受けているSTの仕事は、(私が出会ったSTのプログラマーによると)ほとんど「OKだよ」でした。私は大規模なテレコム設置の孤立した例を除いてまだ生きていたとは思わなかった。 – javadba