Взлом кода: обнаружение палиндромов в COBOL

Ах, COBOL, почтенный язык программирования, который существует с момента зарождения компьютеров. Хотя это, возможно, и не самый модный язык в мире, он по-прежнему сохраняет свои позиции в некоторых устаревших системах. Сегодня мы собираемся исследовать увлекательный мир обнаружения палиндромов в COBOL. Так что пристегнитесь и приготовьтесь погрузиться в старый добрый код!

Метод 1: подход обратного и сравнения
Один из самых простых способов проверить, является ли строка палиндромом, — перевернуть ее и сравнить с исходной строкой. Вот как это можно сделать на COBOL:

IDENTIFICATION DIVISION.
PROGRAM-ID. REVERSE-COMPARE-PALINDROME.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STRING-LENGTH PIC 9(3).
01 STRING-INPUT PIC X(100).
01 STRING-REVERSED PIC X(100).
01 IS-PALINDROME PIC X(3) VALUE 'NO '.
PROCEDURE DIVISION.
MAIN-LOGIC.
    DISPLAY "Enter a string: ".
    ACCEPT STRING-INPUT.
    MOVE FUNCTION LENGTH (STRING-INPUT) TO STRING-LENGTH.

    PERFORM REVERSE-STRING.
    PERFORM COMPARE-STRINGS.

    DISPLAY "Is it a palindrome? " IS-PALINDROME.
    STOP RUN.
REVERSE-STRING.
    MOVE SPACES TO STRING-REVERSED.
    PERFORM VARYING I FROM STRING-LENGTH BY -1 UNTIL I = 0
        MOVE STRING-INPUT(I:1) TO STRING-REVERSED(STRING-LENGTH - I + 1:1)
    END-PERFORM.
COMPARE-STRINGS.
    IF STRING-INPUT = STRING-REVERSED
        MOVE 'YES' TO IS-PALINDROME
    END-IF.

Метод 2: проверка наполовину
Другой подход заключается в сравнении символов, начиная с начала и конца строки, постепенно продвигаясь к центру. Если в какой-то момент символы не совпадают, мы можем сделать вывод, что строка не является палиндромом. Вот пример:

IDENTIFICATION DIVISION.
PROGRAM-ID. HALFWAY-CHECK-PALINDROME.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STRING-LENGTH PIC 9(3).
01 STRING-INPUT PIC X(100).
01 IS-PALINDROME PIC X(3) VALUE 'NO '.
PROCEDURE DIVISION.
MAIN-LOGIC.
    DISPLAY "Enter a string: ".
    ACCEPT STRING-INPUT.
    MOVE FUNCTION LENGTH (STRING-INPUT) TO STRING-LENGTH.

    PERFORM CHECK-PALINDROME.

    DISPLAY "Is it a palindrome? " IS-PALINDROME.
    STOP RUN.
CHECK-PALINDROME.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > STRING-LENGTH / 2
        IF STRING-INPUT(I:1) NOT = STRING-INPUT(STRING-LENGTH - I + 1:1)
            EXIT PERFORM
        END-IF
    END-PERFORM.
    IF I > STRING-LENGTH / 2
        MOVE 'YES' TO IS-PALINDROME
    END-IF.

Метод 3: игнорирование небуквенно-цифровых символов
В некоторых случаях мы можем захотеть игнорировать небуквенно-цифровые символы (например, пробелы или знаки препинания) при проверке палиндромов. Вот как вы можете изменить предыдущий метод, чтобы добиться этого:

IDENTIFICATION DIVISION.
PROGRAM-ID. IGNORE-NONALPHA-PALINDROME.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STRING-LENGTH PIC 9(3).
01 STRING-INPUT PIC X(100).
01 IS-PALINDROME PIC X(3) VALUE 'NO '.
PROCEDURE DIVISION.
MAIN-LOGIC.
    DISPLAY "Enter a string: ".
    ACCEPT STRING-INPUT.
    MOVE FUNCTION LENGTH (STRING-INPUT) TO STRING-LENGTH.

    PERFORM CHECK-PALINDROME.

    DISPLAY "Is it a palindrome? " IS-PALINDROME.
    STOP RUN.
CHECK-PALINDROME.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > STRING-LENGTH / 2
        IF STRING-INPUT(I:1) IS NOT ALPHANUMERIC
            ADD 1 TO I
            CONTINUE
        END-IF
        IF STRING-INPUT(STRING-LENGTH - I + 1:1) IS NOT ALPHANUMERIC
            SUBTRACT 1 FROM I
            CONTINUE
        END-IF
        IF STRING-INPUT(I:1) NOT = STRING-INPUT(STRING-LENGTH - I + 1:1)
            EXIT PERFORM
        END-IF
    END-PERFORM.
    IF I > STRING-LENGTH / 2
        MOVE 'YES' TO IS-PALINDROME
    END-IF.

В этой статье мы рассмотрели различные методы обнаружения палиндромов в COBOL. Мы рассмотрели подход обратного и сравнения, полупроверку и вариант, игнорирующий небуквенно-цифровые символы. COBOL, возможно, не самый популярный язык сегодня, но он по-прежнему занимает свое место в устаревших системах, и знание того, как с ним работать, может быть ценным. Так что давайте, попробуйте эти методы в своих проектах на COBOL!