FizzBuzzって何のことかわかりますか?
»
FizzBuzzという単語を最近見かけた記憶はありますか?
というエントリから始まったこの問題。
1から100までの数字について以下のルールの通りに
出力するプログラムを2分間で作れるか?という問題です。
- 3で割り切れる場合はFIZZと出力する
- 5で割り切れる場合はBUZZと出力する
- 15で割り切れる場合はFIZZBUZZと出力する
- それ以外は元の数字を出力する
という問題です。
私も挑戦してみました。
SEが名前を明かして取り組むのはかなりの勇気が必要です。
しかしこれも自己研鑽の1つと思ってやってみました。
結果は以下の通りです。
000100****************************************************************** 000110 IDENTIFICATION DIVISION. 000120 PROGRAM-ID. FIZZBUZZ. 000130 AUTHOR. YOUHEI YAMAGUCHI 000140 DATE. 2007.05.10. 000150* 000160 ENVIRONMENT DIVISION. 000170* 000180 INPUT-OUTPUT SECTION. 000190 FILE-CONTROL. 000200 SELECT LP-FILE ASSIGN TO PRINT. 000210* 000220 DATA DIVISION. 000230 FILE SECTION. 000240 FD LP-FILE 000250 RECORDING MODE IS F 000260 BLOCK CONTAINS 1 RECORDS 000270 RECORD CONTAINS 133 CHARACTERS 000280 LABEL RECORD STANDARD 000290 DATA RECORD LP-REC. 000300 01 LP-REC. 000310 03 FILLER PIC X(133). 000320* 000330 WORKING-STORAGE SECTION. 000340 01 COUNT-AREA. 000350 03 IM-CNT PIC S9(15) VALUE ZERO COMP-3. 000360 03 IM-GVN PIC S9(15) VALUE ZERO COMP-3. 000370 03 IM-RMD PIC S9(15) VALUE ZERO COMP-3. 000380 01 WORD-AREA. 000390 03 IM-FIZZ PIC X(04) VALUE 'フィズ'. 000400 03 IM-BUZZ PIC X(04) VALUE 'バズ'. 000410 03 IM-FZBZ PIC X(04) VALUE 'フィズバズ'. 000420 01 PRINT01. 000430 03 FILLER PIC X(10) VALUE SPACE. 000440 03 PGNAME PIC X(10) 000450 VALUE '(FIZZBUZZ)'. 000460 03 FILLER PIC X(20) VALUE SPACE. 000470 03 PGNAME PIC X(93) 000480 VALUE '*** フィズ ト バズ ヲ シュツリョク スル プログラム ***'. 000490 01 PRINT02. 000500 03 FILLER PIC X(20) VALUE SPACE. 000510 03 PR-IDX PIC 9(03). 000520 03 FILLER PIC X(10) VALUE SPACE. 000530 03 PR-OUT PIC X(10). 000540 03 FILLER PIC X(90) VALUE SPACE. 000550 EJECT 000560* 000570 PROCEDURE DIVISION. 000580 FIZZBUZZ-RTN SECTION. 000590 PERFORM INIT-RTN. 000600 PERFORM MAIN-RTN UNTIL IM-CNT=100. 000610 PERFORM TERM-RTN. 000620 STOP RUN. 000630 FIZZBUZZ-EXIT. 000640 EXIT. 000650* 000660 INIT-RTN SECTION 000670 OPEN OUTPUT LP-FILE. 000680 MOVE ZERO TO IM-CNT. 000690 WRITE LP-REC FROM PRINT01 AFTER CC1. 000700 INIT-EXIT. 000710 EXIT. 000720* 000730 MAIN-RTN SECTION. 000740 COMPUTE IM-CNT = IM-CNT + 1 000750 MOVE IM-CNT TO PR-IDX. 000760 DIVIDE IM-CNT BY 15 000770 GIVING IM-GVN 000780 REMINDER IM-RMD. 000790 IF IM-RMD = ZERO 000800 GO TO MAIN-FIFTEEN. 000810 DIVIDE IM-CNT BY 3 000820 GIVING IM-GBN 000830 REMINDER IM-RMD. 000840 IF IM-RMD = ZERO 000850 GO TO MAIN-THREE. 000860 DIVIDE IM-CNT BY 5 000870 GIVING IM-GBN 000880 REMINDER IM-RMD. 000890 IF IM-RMD = ZERO 000900 GO TO MAIN-FIVE. 000910 MAIN-OTHER. 000920 MOVE IM-IDX TO PR-OUT. 000930 GO TO MAIN-EXIT. 000940 MAIN-FIFTEEN 000950 MOVE IM-FZBZ TO PR-OUT. 000960 GO TO MAIN-EXIT. 000970 MAIN-THREE. 000980 MOVE IM-FIZZ TO PR-OUT. 000990 GO TO MAIN-EXIT. 001000 MAIN-FIVE. 001010 MOVE IM-BUZZ TO PR-OUT. 001020 GO TO MAIN-EXIT. 001030 MAIN-EXIT. 001040 WRITE LP-REC FROM PRINT02 AFTER 2. 001050 EXIT. 001060* 001070 TERM-RTN SECTION. 001080 CLOSE LP-FILE 001090 TERM-EXIT. 001100 EXIT. 001110 ***************************************************************** |
設計は数分で終わったんですが、コーディングに30分もかかりました。
JCLも用意してあります。
どなたかコンパイル指示書と実行指示書にハンコください。
というジョークです。
コーディングはテキストエディタ上で本当にやりました。
30分かかりました。
普段はNotesとVB.NETを守備範囲にしてます。
私はCOBOLでお金をいただいたことはありません。
新人の時に座学で学んだのみです。
(※そう言うわけで上記の例は弊社のCOBOL技術力とまったく関係ありません)
小中学生のときにn88-BASICに慣れ親しんだ者として
私はGOTOに拒絶反応を示さない体質です。
でもこれがダメな人って多いですよね。
わざとたっぷり使ってみました。大盛りGOTOダク、0C7乗せで。
SpecialPR