Comment detail

「組合せ型の最小完全ハッシュ関数」の逆関数 (Nested Flatten)
Squeak Smalltalk で。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
| n r val pas ans pat |
n := 5. r := 2. val := 8.
pas := OrderedCollection with: (0 to: n - r).
(r - 1) timesRepeat: [
    pas addFirst: (
        pas first inject: #(0) into: [:new :each | new, {each + new last}])].
ans := OrderedCollection new.
pas do: [:arr | val := val - (arr at: (ans add: (arr findLast: [:m | val >= m])))].
pat := Array new: n withAll: 0.
ans do: [:idx | pat at: (n - idx + 1) put: 1].
^pat   "=> #(1 0 1 0 0) "
テーブル(パスカルの三角形)を用意せず、富豪的に。
1
2
3
4
5
6
7
8
9
| n r val pat |
n := 6. r := 3. val := 18.
pat := Array new: n withAll: 0.
r to: 1 by: -1 do: [:r0 |
    | idx last |
    idx := (1 to: n - (r - r0)) findLast: [:n0 | val >= (last := n0 - 1 take: r0)].
    pat at: n - idx + 1 put: 1.
    val := val - last].
^pat   "=> #(1 1 0 1 0 0) "
shiro さん、tell さんのを読んで、上のは少々冗長だと遅まきながら気づきました(^_^;)。
1
2
3
4
5
6
7
8
9
| val n r pat c |
n := 5.  r := 2.  val := 8.
pat := Array new: n withAll: 0.
1 to: n do: [:idx |
    val >= (c := n - idx take: r) ifTrue: [
        pat at: idx put: 1.
        r := r - 1.
        val := val - c]].
^pat   "=> #(1 0 1 0 0) "

Index

Feed

Other

Link

Pathtraq

loading...