まずはお約束から。
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]]]