「Rubyでどう書く?:連続した数列を範囲形式にまとめたい」を Squeak Smalltalk で


なんか見覚えがあって前にも書いたような気もするのですが気にしない。

| shorten |
shorten := [:array |
   (array inject: #() into: [:acc :xx |
      (acc notEmpty and: [acc last value + 1 = xx])
         ifTrue: [acc last value: xx. acc] ifFalse: [acc, {xx->xx}]
   ]) collect: [:kv | kv key = kv value ifTrue: [kv value] ifFalse: [kv]]].

shorten value: #(1 2 3).  "=> {1->3} "
shorten value: #(1 2 3 5 7 8).  "=> {1->3 . 5 . 7->8} "
shorten value: #(1 3 4 5 7).  "=> {1 . 3->5 . 7} "