FizzBuzz in squeak 2
直前のLispうんぬんを全く無視して (^-^;;) 手続き指向的な考えで
Smalltalk (squeak)でやってみた。
1 to: 100 do:
[ :i | ((i rem: 15) = 0)
ifTrue: [Transcript show: 'FizzBuzz ' ]
ifFalse: [
((i rem: 3) = 0)
ifTrue: [ Transcript show: 'Fizz ' ]
ifFalse: [ ((i rem: 5) = 0)
ifTrue: [ Transcript show: 'Buzz ' ]
ifFalse: [ Transcript show: i; show:' ' ].
]
]
].
Workspaceで書き込んで選択して do it すれば、Transcript に出ます。
遅い。すごく遅い。
(追記)
これだとあんまりなので、Number クラスのインスタンスメソッドに、asFizzBuzzという
メソッドを作ってみた。
fileOutしたやつ:
'From Squeak3.8 of ''5 May 2005'' [latest update: #6665] on 16 May 2007 at 9:17:45 pm'!
!Number methodsFor: 'testing' stamp: 'd 5/16/2007 21:11'!
asFizzBuzz
"Check the number and return corresponding item: Fizz, Buzz, FizzBuzz, or number as String."
((self rem:15) = 0)
ifTrue: [ ^ 'FizzBuzz' ]
ifFalse: [ ((self rem:3) = 0)
ifTrue: [ ^ 'Fizz' ]
ifFalse: [ ((self rem:5) = 0)
ifTrue: [ ^ 'Buzz' ]
ifFalse: [ ^ self asString ]
]
].! !
これをacceptさせておけば、
1 to: 100 do: [ :i | Transcript show: i asFizzBuzz; show:' ' ]
これで1から100までチェックして表示する。それだけなんだけれど。
# 「おまえはなっちょらん、こう書くべきだ」を募集。
Re: FizzBuzz in squeak (スコア:1)
あと、遅いのはトランスクリプトへの出力処理だけなので、
(1 to: 100) collect: [ :i | ((i rem: 15) = 0) ifTrue: ['FizzBuzz'] ifFalse: [ ((i rem: 3) = 0) ifTrue: ['Fizz'] ifFalse: [ ((i rem: 5) = 0) ifTrue: ['Buzz'] ifFalse: [i] ] ] ] として、print it (alt/cmd + P) すれば一瞬で答えは得られます。
後者の、数値に asFizzBuzz を送るほうが Smalltalk っぽいですよね。w(私も似たような考え方でちょっと前のブームの時に書きました → http://d.hatena.ne.jp/sumim/20070301/p1 [hatena.ne.jp])
Re: FizzBuzz in squeak (スコア:1)
collect: は Collectionクラスのメソッドなんですね。
学生の時、XeroxのSmalltalk-80マシンに触れて以来、付け焼き刃なので
どこにどんなクラスやメソッドがあるか、ちっとも把握していません。(^-^;)
# リンク貼って頂いたページも勉強になりそう。