Help us understand the problem. What is going on with this article?

COBOLで彼女をつくりたかった

More than 3 years have passed since last update.

いろいろ勉強不足でした、クソダサコードしか書けませんでした。

こんなウンコードをご覧頂いて恐縮です。
こちらhttps://paiza.jp/poh/andoにてウンコードを投げてました。paiza様、楽しいゲームありがとうございます。
一応レアアイテム以外はコンプしましたが、正直人様に見せるには恥ずかしすぎるレベルです。
「それでも」と言う大先輩方、アドバイスよろしくお願いします…
※下記のコードでアイテム解禁確認済み(使用言語:COBOL)

つり目

        IDENTIFICATION DIVISION.
        PROGRAM-ID. Slant-eyes.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
            01 IN-NUM   PIC 9(2).
            01 UNION-X  PIC X(30) VALUE "AnnAnnAnnAnnAnnAnnAnnAnnAnnAnn".
        PROCEDURE DIVISION.
            ACCEPT IN-NUM FROM CONSOLE.
            COMPUTE IN-NUM = IN-NUM * 3.
            DISPLAY UNION-X (1 : IN-NUM).
        STOP-RUN.

今回の中で一番短く書けた。UNION-Xの中身を見るとコーディングした人間のあたまのよわさが伺えます。

ショートヘア

        IDENTIFICATION DIVISION.
        PROGRAM-ID. Short-hair.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
            01 INPUT-NUM1       PIC 9(3).
            01 INPUT-NUM2       PIC 9(3).
            01 OUT1             PIC 9(1).
            01 OUT2             PIC 9(2).
            01 OUT3             PIC 9(3).
        PROCEDURE DIVISION.
            ACCEPT INPUT-NUM1 FROM CONSOLE.
            ACCEPT INPUT-NUM2 FROM CONSOLE.
            COMPUTE OUT3 = INPUT-NUM1 + INPUT-NUM2.
            IF OUT3 > 99 THEN
                DISPLAY OUT3
                STOP RUN
            END-IF.
            IF OUT3 > 9 THEN
                MOVE OUT3 TO OUT2
                DISPLAY OUT2
                STOP RUN
            END-IF.
            MOVE OUT3 TO OUT1.
            DISPLAY OUT1.
        STOP-RUN.

桁数の対策がこれしかないとは思えないのだが…

ロングヘア

        IDENTIFICATION DIVISION.
        PROGRAM-ID. Long-hair.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
            01 DAT.
                03 YL OCCURS 5.
                    05 INPUT-CHAR   PIC X(3).
            01 CTP                  PIC 9(1) VALUE 1.
            01 CTY                  PIC 9(1) VALUE 0.
            01 CTN                  PIC 9(1) VALUE 0.
        PROCEDURE DIVISION.
            PERFORM UNTIL CTP = 6
                ACCEPT INPUT-CHAR(CTP) FROM CONSOLE
                IF INPUT-CHAR(CTP) = "yes" THEN
                    ADD 1 TO CTY
                ELSE
                    ADD 1 TO CTN
                END-IF
                ADD 1 TO CTP
            END-PERFORM.
            IF CTY > CTN THEN
                DISPLAY "yes"
            ELSE
                DISPLAY "no"
            END-IF.
        STOP-RUN.

ただの比較ですがもう少し短くできないものか…

ポニーテール

        IDENTIFICATION DIVISION.
        PROGRAM-ID. Pony-tail.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
            01 CTP PIC 9(1) VALUE 9.
            01 IN1 PIC 9(1) VALUE 0.
            01 IN2 PIC 9(2) VALUE 0.
            01 IN3 PIC 9(3).
            01 FLG PIC 9(1) VALUE 0.
        PROCEDURE DIVISION.
            ACCEPT IN3 FROM CONSOLE.
            IF IN3 = 100 THEN
                DISPLAY IN3
                MOVE 99 TO IN2
            ELSE
                MOVE IN3 TO IN2
            END-IF.
            IF IN3 < 10
                MOVE IN3 TO IN1
                MOVE 1 TO FLG
            END-IF.
            IF IN2 > 9 AND IN2 < 100
                PERFORM UNTIL CTP = IN2
                    DISPLAY IN2
                    COMPUTE IN2 = IN2 - 1
                END-PERFORM
                MOVE 9 TO IN1
                MOVE 0 TO CTP
            END-IF.
            IF IN1 = 9 AND FLG = 0 THEN
                PERFORM UNTIL CTP = IN1
                    DISPLAY IN1
                    COMPUTE IN1 = IN1 - 1
                END-PERFORM
            END-IF
            MOVE 0 TO CTP.
            IF FLG = 1 THEN
                PERFORM UNTIL 0 = IN1
                    DISPLAY IN1
                    COMPUTE IN1 = IN1 - 1
                END-PERFORM
            END-IF.
            DISPLAY "0!!".
        STOP-RUN.

これぞウンコード、書いた本人ですらよくわからない、読みたくない。

ツインテール

        IDENTIFICATION DIVISION.
        PROGRAM-ID. Twin-tail.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
            01 TYPE1.
                03 IN-NUM1  PIC X(9).
                03 C1-F     PIC 9(4).
                03 P1-F     PIC 9(4).
                03 DUST1    PIC X(6).
                03 RATIO1   PIC 9(4)V99999999999999.
            01 TYPE2.
                03 IN-NUM2  PIC X(9).
                03 C2-F     PIC 9(4).
                03 P2-F     PIC 9(4).
                03 DUST2    PIC X(6).
                03 RATIO2   PIC 9(4)V99999999999999.
        PROCEDURE DIVISION.
            ACCEPT IN-NUM1 FROM CONSOLE.
            ACCEPT IN-NUM2 FROM CONSOLE.
            UNSTRING
                IN-NUM1 DELIMITED BY " " INTO   C1-F
                                                P1-F
                                                DUST1
            END-UNSTRING.
            UNSTRING
                IN-NUM2 DELIMITED BY " " INTO   C2-F
                                                P2-F
                                                DUST2
            END-UNSTRING.
            COMPUTE RATIO1 = C1-F / P1-F.
            COMPUTE RATIO2 = C2-F / P2-F.
            IF RATIO1 > RATIO2 THEN
                DISPLAY "1"
            ELSE
                DISPLAY "2"
            END-IF.
        STOP-RUN.

STRING句でPOINTERを使いたい人生だった。多分UNSTRING句でオーバーフロー(?)してる。

セーラー服

        IDENTIFICATION DIVISION.
        PROGRAM-ID. Sera.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
            01 CNT-PER              PIC 9(2).
            01 INPUT-NUM            PIC 9(2).
            01 LENG                 PIC 9(3).
            01 UNION-X              PIC X(100).
            01 DAT.
                03 YL OCCURS 10.
                    05 INPUT-CHAR   PIC X(10).
       PROCEDURE DIVISION.
            ACCEPT INPUT-NUM FROM CONSOLE.
            MOVE 1 TO CNT-PER.
            ADD 1 TO INPUT-NUM.
            PERFORM UNTIL CNT-PER = INPUT-NUM
                ACCEPT INPUT-CHAR(CNT-PER)
                ADD 1 TO CNT-PER
            END-PERFORM.
            COMPUTE INPUT-NUM = INPUT-NUM - 1.
            EVALUATE INPUT-NUM
                WHEN 2
                    STRING
                         INPUT-CHAR(1) DELIMITED BY " "
                         "_" DELIMITED BY SIZE
                         INPUT-CHAR(2) DELIMITED BY " "
                         INTO UNION-X
                    END-STRING
                WHEN 3
                    STRING
                         INPUT-CHAR(1) DELIMITED BY " "
                         "_" DELIMITED BY SIZE
                         INPUT-CHAR(2) DELIMITED BY " "
                         "_" DELIMITED BY SIZE
                         INPUT-CHAR(3) DELIMITED BY " "
                         INTO UNION-X
                    END-STRING
                WHEN 4
                    STRING
                        INPUT-CHAR(1) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(2) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(3) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(4) DELIMITED BY " "
                        INTO UNION-X
                    END-STRING
                WHEN 5
                    STRING
                        INPUT-CHAR(1) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(2) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(3) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(4) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(5) DELIMITED BY " "
                        INTO UNION-X
                    END-STRING
                WHEN 6
                    STRING
                        INPUT-CHAR(1) DELIMITED BY " "
                         "_" DELIMITED BY SIZE
                        INPUT-CHAR(2) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(3) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(4) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(5) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(6) DELIMITED BY " "
                        INTO UNION-X
                    END-STRING
                WHEN 7
                    STRING
                        INPUT-CHAR(1) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(2) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(3) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(4) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(5) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(6) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(7) DELIMITED BY " "
                        INTO UNION-X
                    END-STRING
                WHEN 8
                    STRING
                        INPUT-CHAR(1) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(2) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(3) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(4) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(5) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(6) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(7) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(8) DELIMITED BY " "
                        INTO UNION-X
                    END-STRING
                WHEN 9
                    STRING
                        INPUT-CHAR(1) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(2) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(3) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(4) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(5) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(6) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(7) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(8) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(9) DELIMITED BY " "
                        INTO UNION-X
                    END-STRING
                WHEN 10
                    STRING
                        INPUT-CHAR(1) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(2) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(3) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(4) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(5) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(6) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(7) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(8) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(9) DELIMITED BY " "
                        "_" DELIMITED BY SIZE
                        INPUT-CHAR(10) DELIMITED BY " "
                        INTO UNION-X
                    END-STRING
                WHEN OTHER
                    STRING
                        "ERROR" DELIMITED BY SIZE
                        INTO UNION-X
                    END-STRING
            END-EVALUATE.
            COMPUTE LENG = FUNCTION STORED-CHAR-LENGTH(UNION-X).
            DISPLAY UNION-X (1 : LENG).
        STOP-RUN.

ダサくてごめんなさい、冗長でごめんなさい。STRING句でうまくPOINTER使えませんでした許してください。

カーディガン

        IDENTIFICATION DIVISION.
        PROGRAM-ID. Cardigan.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
            01 INPUT-NUM        PIC 9(1).
            01 CNT-PER          PIC 9(1) VALUE 0.
            01 OUT1             PIC 9(1).
            01 OUT2             PIC 9(2).
            01 OUT3             PIC 9(3).
            01 TMP-COMP         PIC 9(4) VALUE 1.
        PROCEDURE DIVISION.
            ACCEPT INPUT-NUM FROM CONSOLE.
            PERFORM UNTIL CNT-PER = INPUT-NUM
                COMPUTE TMP-COMP = TMP-COMP * INPUT-NUM
                COMPUTE INPUT-NUM = INPUT-NUM - 1
            END-PERFORM.
            IF TMP-COMP > 999 THEN
                DISPLAY TMP-COMP
                STOP RUN
            END-IF.
            IF TMP-COMP > 99 THEN
                MOVE TMP-COMP TO OUT3
                DISPLAY OUT3
                STOP RUN
            END-IF.
            IF TMP-COMP > 9 THEN
                MOVE TMP-COMP TO OUT2
                DISPLAY OUT2
                STOP RUN
            END-IF.
            MOVE TMP-COMP TO OUT1.
            DISPLAY OUT1.
        STOP-RUN.

うまく桁数を減らして表示できないものか…

まとめ

固定長しか扱えないと認識してコーディングしてました。
全体的に同じような変数に値を移動させているのはチェックケースの関係です。
例えば数値3桁の変数に2桁の数値を入れると右揃えになり空いた桁に0が挿入されます。(例:32→032)
このためチェックケースと出力が合わなくて蹴られます。
私はこれを回避するためにMOVEで有効桁分の変数に入れなおす作業をしています。なんとかスマートにできないものか…

見ての通りひどいコードです、応用もへったくれもありません、仕様変更を言われようものなら血涙を流しながら1から書き換えるレベルです。
なんとなく高校でCOBOLを習っていたので興味本位でやりましたがさすがにキツイです。
レアアイテム以外揃っても結局、ワンピースとショートボブ。
一応レアアイテムも挑戦してみますがこの程度のCOBOLの理解度でどこまでいけるものか…
進捗があったら更新します。

nRioki
典型的なダメ人間 必死になって単位にかじりつく薄汚い情報系大学生 唯一の楽しみは最近触り始めたMML
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした