世界のナベアツに Squeak Smalltalk で挑戦する(改訂)


流行っているみたいなので。


ただし、ふつうに書いてもつまらないので、例によって Smalltalk ならではの“はるか斜め上”に向かってかっ飛ばしてみました。w (#改訂:最初のバージョンはアホになるはずがなぜか気持ちよくなっていたので差し替え。ついでに、複数の条件にも対応できるようにしました。)


▼コード

1から:40まで数えて:[(3の倍数 と:[3がつく数字])の時だけ:#アホに]なります

▼出力

1
2
さ〜ん
4
5
ろ〜く
7
8
き〜ゅう
10
11
じ〜ゅうに
じ〜ゅうさん
14
じ〜ゅうご
16
17
じ〜ゅうはち
19
20
に〜じゅういち
22
に〜じゅうさん
に〜じゅうよん
25
26
に〜じゅうなな
28
29
さ〜んじゅう
さ〜んじゅういち
さ〜んじゅうに
さ〜んじゅうさん
さ〜んじゅうよん
さ〜んじゅうご
さ〜んじゅうろく
さ〜んじゅうなな
さ〜んじゅうはち
さ〜んじゅうきゅう
40

▼別のコード

1から:40まで数えて:
[(3の倍数 と:[3がつく数字])の時だけ:#アホに]なって,
[5の倍数 の時だけ:#犬っぽく]なって,
[8の倍数 の時だけ:#気持ちよく]なります

▼出力

1
2
さ〜ん
4
ごバフッ
ろ〜く
7
はちぃ〜〜ッ
き〜ゅう
じゅうバフッ
11
じ〜ゅうに
じ〜ゅうさん
14
じ〜ゅうごバフッ
じゅうろくぅ〜〜ッ
17
じ〜ゅうはち
19
にじゅうバフッ
に〜じゅういち
22
に〜じゅうさん
に〜じゅうよん〜〜ッ
にじゅうごバフッ
26
に〜じゅうなな
28
29
さ〜んじゅうバフッ
さ〜んじゅういち
さ〜んじゅうにぃ〜〜ッ
さ〜んじゅうさん
さ〜んじゅうよん
さ〜んじゅうごバフッ
さ〜んじゅうろく
さ〜んじゅうなな
さ〜んじゅうはち
さ〜んじゅうきゅう
よんじゅうバフッぅ〜〜ッ

▼必要な定義

Object >> なって
    ^self なります
Object >> なります
    ^{self}
Boolean >> と: 別の条件
    ^self or: 別の条件
Boolean >> の時だけ: すること
    ^self ifTrue: [すること]
Integer >> から: 終わり まで数えて: すること群
    World findATranscript: nil.
    self to: 終わり do: [:各々 |
        | 出力 セレクタ群 |
        セレクタ群 := すること群 collect: [:すること | すること value].
        出力 := セレクタ群 inject: '' into: [:結果 :セレクタ |
            セレクタ ifNil: [結果] ifNotNil: [
                結果 ifEmpty: [結果 := 各々 の読み].
                結果 perform: セレクタ]].
        出力 ifEmpty: [出力 := 各々 asString].
        Transcript cr; show: 出力]
Integer >> がつく数字
    ^thisContext 各々 asString includesSubString: self asString
Integer >> の倍数
    ^thisContext 各々 isDivisibleBy: self
Integer >> の読み
    | 残り |
    self = 0 ifTrue: [^''].
    self < 10 ifTrue: [^(#(いち に さん よん ご ろく なな はち きゅう) at: self) asString].
    self >= 1e4 ifTrue: [^self error].
    残り := self.
    ^#('' 'じゅう' 'ひゃく' 'せん') inject: '' into: [:結果 :小位 |
        | 桁数字 |
        桁数字 := 残り \\ 10. 残り := 残り // 10.
        桁数字 isZero ifTrue: [結果] ifFalse: [
            ((桁数字 = 1 and: [小位 notEmpty]) ifTrue: [''] ifFalse: [桁数字 の読み]), 小位, 結果]]
MethodContext >> 各々
    | 環境 # |
    環境 := thisContext sender.
    [(# := 環境 tempNames indexOf: #各々) > 0]
        whileFalse: [(環境 := 環境 sender) ifNil: [^self error]].
    ^環境 tempAt: #
String >> アホに
    ^self first asString, '〜', self allButFirst
String >> 気持ちよく
    | # |
    # := #('な' 'ちに' 'くうッ' 'ご') findFirst: [:語尾群 | 語尾群 includes: self last].
    ^self, (#('' 'ぁ' 'ぃ' 'ぅ' 'ぉ') at: # + 1), '〜〜ッ'
String >> 犬っぽく
    ^self, 'バフッ'


やっていることの解説はこちら