sumim #6296(2008/05/18 13:30 GMT) [ Smalltalk ] Rating0/0=0.00
Squeak Smalltalk で。
ソートの際の比較は、文字とその位置の一致の数を調べる #howManyMatch: を使っています。三つでは収束しないので五つに変えました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| ゴール 全英字 文字数 上位群 世代数 | ゴール := 'METHINKSITISWEASEL'. 文字数 := ゴール size. 全英字 := Character alphabet asUppercase. 上位群 := OrderedCollection new. 300 timesRepeat: [ | 元文字列 | 元文字列 := ((1 to: 文字数) collect: [:idx | 全英字 atRandom]) as: String. 上位群 add: {元文字列 howManyMatch: ゴール. 元文字列}]. 世代数 := 0. World findATranscript: nil. [上位群 first last = ゴール] whileFalse: [ | 候補群 | 候補群 := OrderedCollection new. 上位群 do: [:each | 5 timesRepeat: [ | 変異文字列 | 変異文字列 := each last copy. 変異文字列 at: 文字数 atRandom put: 全英字 atRandom. 候補群 add: {変異文字列 howManyMatch: ゴール. 変異文字列}]]. 候補群 := 候補群 asArray sort: [:a :b | a first > b first]. 上位群 := 候補群 first: 300. Transcript cr; show: (世代数 := 世代数 + 1) -> 上位群 first]. ^世代数
Rating0/0=0.00-0+
[ reply ]
sumim
#6296()
[
Smalltalk
]
Rating0/0=0.00
Squeak Smalltalk で。
ソートの際の比較は、文字とその位置の一致の数を調べる #howManyMatch: を使っています。三つでは収束しないので五つに変えました。
| ゴール 全英字 文字数 上位群 世代数 | ゴール := 'METHINKSITISWEASEL'. 文字数 := ゴール size. 全英字 := Character alphabet asUppercase. 上位群 := OrderedCollection new. 300 timesRepeat: [ | 元文字列 | 元文字列 := ((1 to: 文字数) collect: [:idx | 全英字 atRandom]) as: String. 上位群 add: {元文字列 howManyMatch: ゴール. 元文字列}]. 世代数 := 0. World findATranscript: nil. [上位群 first last = ゴール] whileFalse: [ | 候補群 | 候補群 := OrderedCollection new. 上位群 do: [:each | 5 timesRepeat: [ | 変異文字列 | 変異文字列 := each last copy. 変異文字列 at: 文字数 atRandom put: 全英字 atRandom. 候補群 add: {変異文字列 howManyMatch: ゴール. 変異文字列}]]. 候補群 := 候補群 asArray sort: [:a :b | a first > b first]. 上位群 := 候補群 first: 300. Transcript cr; show: (世代数 := 世代数 + 1) -> 上位群 first]. ^世代数Rating0/0=0.00-0+
[ reply ]