読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

FactorでFizzBuzz

factorcode

factorらしく?TUPLEとlexical-variableをふんだんに使ってみた。自動でお掃除してくれるからswap/dup/drop減らせていいカンジ。Forthとしては邪道なのかもしれないけど、Concatenative Languageとしては良いのではなかろうか。

USING: math.parser locals ;

: divisible? ( n m -- bool ) mod 0 = ;

TUPLE: fzbz-data num text ;

:: init-fzbz ( n -- fzbz-data ) fzbz-data new n >>num "" >>text ;

:: fizzbuzzer ( fzbz-data n str -- fzbz-data )
    fzbz-data num>> n divisible?
    [ fzbz-data [ str append ] change-text ] [ fzbz-data ] if
;

:: print-fizzbuzz ( fzbz-data -- )
    fzbz-data text>>
        dup "" = [ drop fzbz-data num>> number>string ] when
    print
;

100 iota [
    1 +
    init-fzbz
    3 "Fizz!" fizzbuzzer
    5 "Buzz!" fizzbuzzer
    7 "Jazz!!" fizzbuzzer
    11 "Get the funk out!!" fizzbuzzer
    print-fizzbuzz
] each

実行結果

1
2
Fizz!
4
Buzz!
Fizz!
Jazz!!
8
Fizz!
Buzz!
Get the funk out!!
Fizz!
13
Jazz!!
Fizz!Buzz!
16
17
Fizz!
19
Buzz!
Fizz!Jazz!!
Get the funk out!!
23
Fizz!
Buzz!
26
Fizz!
Jazz!!
29
Fizz!Buzz!
31
32
Fizz!Get the funk out!!
34
Buzz!Jazz!!
Fizz!
37
38
Fizz!
Buzz!
41
Fizz!Jazz!!
43
Get the funk out!!
Fizz!Buzz!
46
47
Fizz!
Jazz!!
Buzz!
Fizz!
52
53
Fizz!
Buzz!Get the funk out!!
Jazz!!
Fizz!
58
59
Fizz!Buzz!
61
62
Fizz!Jazz!!
64
Buzz!
Fizz!Get the funk out!!
67
68
Fizz!
Buzz!Jazz!!
71
Fizz!
73
74
Fizz!Buzz!
76
Jazz!!Get the funk out!!
Fizz!
79
Buzz!
Fizz!
82
83
Fizz!Jazz!!
Buzz!
86
Fizz!
Get the funk out!!
89
Fizz!Buzz!
Jazz!!
92
Fizz!
94
Buzz!
Fizz!
97
Jazz!!
Fizz!Get the funk out!!
Buzz!
広告を非表示にする