サンタクロース問題を Squeak Smalltalk で 2


id:sumim:20070607:p1 の続き。


jijixi さんの JoCaml 版に触発されて、トナカイとこびとたちが独立したスレッドになっていてチョーかっこいいっ!&ところでこのサンタってぜんぜん寝ないですげー勤勉に働いてなくなくね?版。

| トナカイたち こびとたち 戻ってきたトナカイたち こびとたちの列 トナカイ こびと 勤務年数 出力 排他 |

トナカイたち := #(ダッシャー  ダンサー  プランサー  ヴィクセン  ドンダー  ブリッツェン  キューピッド  コメット  ルドルフ).
こびとたち := ($A to: $J) collect: [:chr | 'こびと「{1}」' format: {chr}].

戻ってきたトナカイたち := SharedQueue new.
こびとたちの列 := SharedQueue new.

出力 := String new writeStream.
排他 := Semaphore forMutualExclusion.


トナカイ := [:各トナカイ名 |
   [   (Delay forMilliseconds: 100 atRandom) wait.
      戻ってきたトナカイたち nextPut: 各トナカイ名.
      排他 critical: [出力 cr; nextPutAll: '▼トナカイ「', 各トナカイ名, '」、戻る']
   ] fixTemps fork
].


こびと := [:各こびと名 |
   [   (Delay forMilliseconds: 100 atRandom) wait.
      こびとたちの列 nextPut: 各こびと名.
      排他 critical: [出力 cr; nextPutAll: 各こびと名, '、来訪']
   ] fixTemps fork
].

トナカイたち do: [:各名前 | トナカイ value: 各名前].
こびとたち do: [:各名前 | こびと value: 各名前].


勤務年数 := 2.

[勤務年数 > 0] whileTrue: [ "サンタの日常"
   戻ってきたトナカイたち size = 9 ifTrue: [
      勤務年数 := 勤務年数 - 1.
      排他 critical: [出力 cr; nextPutAll: '▼サンタとトナカイたち、出発 → 戻る'].
      9 timesRepeat: [トナカイ value: 戻ってきたトナカイたち next].
      排他 critical: [出力 cr; nextPutAll: '▼トナカイたち、ふたたびバケーションへ']].
   こびとたちの列 size >= 3 ifTrue: [
      | 三人組 |
      三人組 := (1 to: 3) collect: [:idx | こびとたちの列 next].
      排他 critical: [出力 cr; nextPutAll: 三人組 printString, '、サンタと問題を解決'].
      三人組 do: [:各名前 | こびと value: 各名前].
      排他 critical: [出力 cr; nextPutAll: 三人組 printString, '、各自の仕事に戻る']]].


World findATranscript: nil.
Transcript clear.
Transcript show: 出力 contents
こびと「F」、来訪
▼トナカイ「ドンダー」、戻る
こびと「A」、来訪
▼トナカイ「キューピッド」、戻る
こびと「D」、来訪
#('こびと「F」' 'こびと「A」' 'こびと「D」')、サンタと問題を解決
#('こびと「F」' 'こびと「A」' 'こびと「D」')、各自の仕事に戻る
▼トナカイ「プランサー」、戻る
こびと「C」、来訪
こびと「H」、来訪
▼トナカイ「ダッシャー」、戻る
こびと「A」、来訪
#('こびと「C」' 'こびと「H」' 'こびと「A」')、サンタと問題を解決
#('こびと「C」' 'こびと「H」' 'こびと「A」')、各自の仕事に戻る
こびと「I」、来訪
▼トナカイ「ブリッツェン」、戻る
こびと「G」、来訪
こびと「B」、来訪
#('こびと「I」' 'こびと「G」' 'こびと「B」')、サンタと問題を解決
#('こびと「I」' 'こびと「G」' 'こびと「B」')、各自の仕事に戻る
▼トナカイ「ヴィクセン」、戻る
▼トナカイ「ルドルフ」、戻る
▼トナカイ「ダンサー」、戻る
こびと「E」、来訪
こびと「J」、来訪
▼トナカイ「コメット」、戻る
こびと「D」、来訪
▼サンタとトナカイたち、出発 → 戻る
▼トナカイたち、ふたたびバケーションへ
#('こびと「E」' 'こびと「J」' 'こびと「D」')、サンタと問題を解決
#('こびと「E」' 'こびと「J」' 'こびと「D」')、各自の仕事に戻る
こびと「A」、来訪
こびと「F」、来訪
こびと「I」、来訪
こびと「G」、来訪
#('こびと「A」' 'こびと「F」' 'こびと「I」')、サンタと問題を解決
#('こびと「A」' 'こびと「F」' 'こびと「I」')、各自の仕事に戻る
▼トナカイ「プランサー」、戻る
▼トナカイ「ダンサー」、戻る
こびと「C」、来訪
こびと「H」、来訪
こびと「A」、来訪
▼トナカイ「ブリッツェン」、戻る
こびと「B」、来訪
▼トナカイ「ダッシャー」、戻る
▼トナカイ「キューピッド」、戻る
こびと「F」、来訪
こびと「D」、来訪
こびと「J」、来訪
▼トナカイ「ルドルフ」、戻る
▼トナカイ「コメット」、戻る
こびと「E」、来訪
▼トナカイ「ドンダー」、戻る
▼トナカイ「ヴィクセン」、戻る
こびと「I」、来訪
#('こびと「G」' 'こびと「C」' 'こびと「H」')、サンタと問題を解決
#('こびと「G」' 'こびと「C」' 'こびと「H」')、各自の仕事に戻る
▼サンタとトナカイたち、出発 → 戻る
▼トナカイたち、ふたたびバケーションへ
#('こびと「A」' 'こびと「B」' 'こびと「F」')、サンタと問題を解決
#('こびと「A」' 'こびと「B」' 'こびと「F」')、各自の仕事に戻る
▼トナカイ「ブリッツェン」、戻る
▼トナカイ「ダッシャー」、戻る
こびと「A」、来訪
こびと「F」、来訪
こびと「G」、来訪
こびと「H」、来訪
こびと「C」、来訪
▼トナカイ「キューピッド」、戻る
▼トナカイ「ヴィクセン」、戻る
こびと「B」、来訪
▼トナカイ「ドンダー」、戻る
▼トナカイ「プランサー」、戻る
▼トナカイ「ダンサー」、戻る
▼トナカイ「コメット」、戻る
▼トナカイ「ルドルフ」、戻る


id:sumim:20070612:p1 に続く。