子供だと5分で解けてプログラマだと1時間かかる問題を Squeak Smalltalk で

ネタバレ注意。

問題となっている画像は次のもの。問題文はテキストを記載している。

<問題>

This problem can be solved by pre-school children in 5-10 minutes, by programmers -in 1 hour, by people with higher education… well, check it yourself! (この問題は就学前の子供であれば5〜10分、プログラマーであれば1時間以内で解けます。高等教育を受けた人間であれば…自分自身で試してみて!)

http://ict.pken.com/2012/02/facebook_sansu/


これは Squeak Smalltalk ならではの特徴を活かせるいい問題なんじゃないかなぁーと思えたのでソルバー?(というよりはネタは割れているので単なるデコーダーか)を書いてみました。

| numEnclosedOf | 

numEnclosedOf := [:str |
   | form count |
   form := (' ', str, ' ') asDisplayText form stencil.
   count := 0.
   0 to: form width-1 do: [:x |
      0 to: form height-1 do: [:y |
         (form colorAt: x@y) = Color white ifTrue: [
            form floodFill: Color black at: x@y.
            count := count + 1]]].
   count - 1].

{  '8809' -> 6.
   '7111' -> 0.
   '2172' -> 0.
   '6666' -> 4.
   '1111' -> 0.
   '3213' -> 0.
   '7662' -> 2.
   '9313' -> 1.
   '0000' -> 4.
   '2222' -> 0.
   '3333' -> 0.
   '5555' -> 0.
   '8193' -> 3.
   '8096' -> 5.
   '7777' -> 0.
   '9999' -> 4.
   '7756' -> 1.
   '6855' -> 3.
   '9881' -> 5.
   '5531' -> 0
} allSatisfy: [:assoc | (numEnclosedOf value: assoc key) = assoc value].   "=> true "

numEnclosedOf value: '2581'   "=> 2 "