九州の七つの県を三色で塗り分ける問題を Squeak Smalltalk で

688 :デフォルトの名無しさん:2014/08/03(日) 16:21:36.50 ID:vVRF2pWw
お題:九州の七つの県を三色で塗り分ける。

プログラミングのお題スレ Part4
| 九州 配色 状態 待行列 |
九州 := {
   #福岡 -> #(佐賀 熊本 大分).
   #佐賀 -> #(福岡 長崎).
   #長崎 -> #(佐賀).
   #大分 -> #(福岡 熊本 宮崎).
   #熊本 -> #(福岡 大分 宮崎 鹿児島).
   #宮崎 -> #(大分 熊本 鹿児島).
   #鹿児島 -> #(熊本 宮崎)
}.

配色 := 九州 inject: Dictionary new into: [:辞書 :kv | 辞書 at: kv key put: #(赤 青 黄) asOrderedCollection; yourself].
配色 at: #福岡 put: #(赤) asOrderedCollection.
状態 := 九州 collect: [:kv | kv key -> (配色 at: kv key) -> (kv value collect: [:val | 配色 at: val])].
待行列 := OrderedCollection with: 状態.
[待行列 notEmpty] whileTrue: [
   | 県と候補色群 |
   状態 := 待行列 removeFirst.
   配色 := 状態 collect: #key.
   県と候補色群 := 配色 detect: [:kv | kv value size > 1] ifNone: [^配色 collect: [:kv | kv value: kv value first; yourself]].
   県と候補色群 value do: [:候補色 |
      | 次状態 |
      次状態 := 状態 veryDeepCopy.
      (次状態 detect: [:kv | kv key key == 県と候補色群 key]) key value removeAllSuchThat: [:val | val ~= 候補色].
      次状態 do: [:kv | kv key value size = 1 ifTrue: [kv value do: [:vals | vals removeAllFoundIn: kv key value]]].
      (次状態 noneSatisfy: [:kv | kv key value isEmpty]) ifTrue: [待行列 add: 次状態]]
]
=> {#'福岡'->#'赤' . #'佐賀'->#'青' . #'長崎'->#'赤' . #'大分'->#'青' . #'熊本'->#'黄' . #'宮崎'->#'赤' . #'鹿児島'->#'青'} 


読み下すとき、kv のキーが何で対応する値がなんなのかわからずピンとこないのでイマイチ。