100までの整数から素数を列挙せよ…を Squeak の Smalltalk で


まずはお約束から。

Integer primesUpTo: 100
=> #(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)


愚直に。

(2 to: 100) select: [:nn | (2 to: nn sqrt) noneSatisfy: [:mm | nn isDivisibleBy: mm]]


ちょっと効率を考えているようなフリをしつつも、#inject:into: を使いあくまで1行野郎で。

(3 to: 100 by: 2) inject: #(2) into: [:primes :nn |
   (primes noneSatisfy: [:mm | nn isDivisibleBy: mm])
      ifTrue: [primes copyWith: nn]
      ifFalse: [primes]]


やっぱり素直が一番…と、上の #inject:into: 版をループで。

| primes |
primes := OrderedCollection with: 2.
(3 to: 100 by: 2) do: [:nn |
   (primes noneSatisfy: [:mm | nn isDivisibleBy: mm]) ifTrue: [primes add: nn]].
^ primes


さらに、無限数列もどきを用い、指定された個数の素数を列挙できるよう改造。

| size primes |
size := 100.
primes := OrderedCollection new: size.
primes add: 2.
(3 to: Float infinity by: 2) do: [:nn |
   (primes noneSatisfy: [:mm | nn isDivisibleBy: mm]) ifTrue: [
      primes add: nn.
      primes size = size ifTrue: [^ primes]]]