オルタナティブ・ブログ > 一般システムエンジニアの刻苦勉励 >

身の周りのおもしろおかしい事を探す日々。ITを中心に。

FizzBuzzって何のことかわかりますか?

»

FizzBuzzという単語を最近見かけた記憶はありますか?

どうしてプログラマに・・・プログラムが書けないのか?

というエントリから始まったこの問題。
1から100までの数字について以下のルールの通りに
出力するプログラムを2分間で作れるか?という問題です。

  1. 3で割り切れる場合はFIZZと出力する
  2. 5で割り切れる場合はBUZZと出力する
  3. 15で割り切れる場合はFIZZBUZZと出力する
  4. それ以外は元の数字を出力する

という問題です。

私も挑戦してみました。
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乗せで。

Comment(0)