Project Euler 012

積みっぱなしだったYsフェルガナを消化。後半きつかった。レベル上げしようにも補正入るからめんどくさい。総合的には面白かったからいいや。


問題12
三角数列のうち、約数の数が最初に500を超えるものを求める。


今回はC#が残ってた。実行してみたら、10分経っても帰ってこない。コードを見直してみると、すべての数値のチェックしてた。なんで?だから、改めて書き直した。

Integer>>divisors
	| list i |
	list := OrderedCollection new.

	i := 1.
	[ i * i <= self ] whileTrue: [
		(i * i = self)
			ifTrue: [ list add: i. ]
			ifFalse: [
				(self \\ i = 0) ifTrue: [
					list add: i.
					list add: (self // i)]].
		i := i + 1].

	^list.
| i |
i := 1.
[true] whileTrue: [
	| list triangle |
	triangle := i * (i + 1) / 2.
	list := triangle divisors.
	list size > 500 ifTrue: [ ^triangle ].
	i := i + 1.
].

12秒。いったい最初のC#コードではなにを書いていたんだか、見なかったことにする。