Как этот код генерирует карту Индии?

Этот код печатает карту Индии. Как это работает?

#include <stdio.h>
main()
{
    int a,b,c;
    int count = 1;
    for (b=c=10;a="- FIGURE?, UMKC,XYZHello Folks,\
    TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
    UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
    NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
    HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
    T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
    Hq!WFs XDt!" [b+++21]; )
    for(; a-- > 64 ; )
    putchar ( ++c=='Z' ? c = c/ 9:33^b&1);
    return 0;
}
169
задан Sankalp 1 August 2013 в 04:18
поделиться

2 ответа

Длинная строка - это просто двоичная последовательность, преобразованная в ASCII. Первый оператор for заставляет b начинаться с 10, а [b +++ 21] после строки дает 31. Обработка строки как массива , смещение 31 - это начало «реальных» данных в строке (вторая строка в предоставленном вами примере кода). Остальная часть кода просто перебирает последовательность битов, преобразуя 1 и 0 в! И пробелы и печатая по одному символу за раз.

Менее запутанная версия:

#include "stdio.h"
int main (void) {
    int a=10, b=0, c=10;
    char* bits ="TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn^r^r\\tZvYxXyT|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!";
    a = bits[b];
    while (a != 0) {
        a = bits[b];
        b++;
        while (a > 64) {
            a--;
            if (++c == 'Z') {
                c /= 9;
                putchar(c);
            } else {
                putchar(33 ^ (b & 0x01));
            }
        }
    }
    return 0;
}

странная умная часть находится в операторах putchar . Возьмем первый путчар . ASCII 'Z' - это 90 в десятичной системе счисления, поэтому 90/9 = 10, что является символом новой строки. Во втором, десятичное 33 - это ASCII для '!' . Переключение младшего бита 33 дает вам 32, что является ASCII для пробела. Это вызывает ! будет напечатано, если b нечетное, и пустое место, которое будет напечатано, если b четное. Остальная часть кода предназначена просто для перемещения «указателя» a по строке.

154
ответ дан 23 November 2019 в 20:52
поделиться

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

Закодированная строка

Первый 31 символ этой строки игнорируется. Остальные содержат инструкции по нанесению изображения. Отдельные символы определяют, сколько пробелов или восклицательных знаков рисовать подряд.

Внешний цикл for

Этот цикл перебирает символы в строке. Каждая итерация увеличивает значение b на единицу и присваивает следующему символу в строке a .

Внутренний цикл for

Этот цикл рисует отдельные символы и новую строку всякий раз, когда достигает конца строки. Количество выпавших знаков a - 64 . Значение c изменяется от 10 до 90 и сбрасывается до 10, когда достигается конец строки.

putchar

Его можно переписать как:

++c;
if (c==90) {       //'Z' == 90
    c = 10;        //Note: 10 == '\n'
    putchar('\n');
}
else {
    if (b % 2 == 0)
        putchar('!');
    else
        putchar(' ');
}

Он рисует соответствующий символ, в зависимости от того, является ли b четным или нечетным, или при необходимости переводится новая строка.

89
ответ дан 23 November 2019 в 20:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: