MacOSX1.6.8にOpenCOBOL1.1をインストールする/COBOLでFizzBuzz
http://ideone.com/NWXzs
MacOSX1.6.8 64bitカーネル、homebrewによるライブラリ追加支援にて、OpenCOBOL1.1をインストールした。
GnuCOBOL (formerly OpenCOBOL) download | SourceForge.net
open-cobol-1.1を用意。ディレクトリに移動。
./configure を実行するとエラーが出る。ライブラリが足らないのでhomebrewで追加する。
brew install gmp
brew install gettext
brew install libiconv
brew install db
もし足らなかったら、configure.logから判断して追加してください。
あとはmakeするだけ。
./cobc/cobc がOpenCOBOLコンパイラです。
使用例: -xオプションは実行形式を作ります。
./cobc/cobc -x fizzbuzz.cob ; ./fizzbuzz
不完全なFizzBuzzのソースリストはこちら:
IDENTIFICATION DIVISION. PROGRAM-ID. FIZZBUZZ. DATA DIVISION. WORKING-STORAGE SECTION. 01 CT PIC 999 VALUE 1. 01 FZ PIC 999 VALUE 1. 01 BZ PIC 999 VALUE 1. PROCEDURE DIVISION. PERFORM 100 TIMES IF FZ = 3 THEN IF BZ = 5 THEN DISPLAY "FizzBuzz" COMPUTE BZ = 0 ELSE DISPLAY "Fizz" END-IF COMPUTE FZ = 0 ELSE IF BZ = 5 THEN DISPLAY "Buzz" COMPUTE BZ = 0 ELSE DISPLAY CT END-IF END-IF ADD 1 TO CT ADD 1 TO FZ ADD 1 TO BZ END-PERFORM STOP RUN.
ちゃんとできた。Anarchy Golfで確認済。anarchy golf - FizzBuzz
IDENTIFICATION DIVISION. PROGRAM-ID. FIZZBUZZ. DATA DIVISION. WORKING-STORAGE SECTION. 01 CT PIC 999 VALUE 1. 01 CT2 PIC 99 VALUE 1. 01 CT1 PIC 9 VALUE 1. 01 FZ PIC 999 VALUE 1. 01 BZ PIC 999 VALUE 1. PROCEDURE DIVISION. PERFORM 100 TIMES IF FZ = 3 THEN IF BZ = 5 THEN DISPLAY "FizzBuzz" MOVE 0 TO BZ ELSE DISPLAY "Fizz" END-IF MOVE 0 TO FZ ELSE IF BZ = 5 THEN DISPLAY "Buzz" MOVE 0 TO BZ ELSE IF CT < 10 THEN MOVE CT TO CT1 DISPLAY CT1 ELSE IF CT < 100 THEN MOVE CT TO CT2 DISPLAY CT2 ELSE DISPLAY CT END-IF END-IF END-IF END-IF ADD 1 TO CT ADD 1 TO FZ ADD 1 TO BZ END-PERFORM STOP RUN.
さらにEVALUATE文ですっきり。
IDENTIFICATION DIVISION. PROGRAM-ID. FIZZBUZZ. DATA DIVISION. WORKING-STORAGE SECTION. 01 CT PIC 999 VALUE 1. 01 CT2 PIC 99 VALUE 1. 01 CT1 PIC 9 VALUE 1. 01 FZ PIC 999 VALUE 1. 01 BZ PIC 999 VALUE 1. PROCEDURE DIVISION. PERFORM 100 TIMES EVALUATE FZ ALSO BZ WHEN 3 ALSO 5 DISPLAY "FizzBuzz" MOVE 0 TO FZ MOVE 0 TO BZ WHEN 3 ALSO ANY DISPLAY "Fizz" MOVE 0 TO FZ WHEN ANY ALSO 5 DISPLAY "Buzz" MOVE 0 TO BZ WHEN OTHER EVALUATE CT WHEN 1 THRU 9 MOVE CT TO CT1 DISPLAY CT1 WHEN 10 THRU 99 MOVE CT TO CT2 DISPLAY CT2 WHEN OTHER DISPLAY CT END-EVALUATE END-EVALUATE ADD 1 TO CT ADD 1 TO FZ ADD 1 TO BZ END-PERFORM STOP RUN.