Làm thế nào để mã này tạo ra bản đồ của Ấn Độ?


169

Mã này in bản đồ của Ấn Độ. Làm thế nào nó hoạt động?

#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;
}

63
Nó chỉ làm xáo trộn C ... có cả xã hội dành riêng cho loại điên rồ này.
Đánh dấu


2
#include "Stdio.h": Nó có hoạt động trên tất cả các trình biên dịch không? Tôi ngạc nhiên khi thấy rằng bạn có thể nhận được mã làm việc với sảy thai. Có thể nó có trên Windows (FS không phân biệt chữ hoa chữ thường)
thay thế vào

2
Để biết thêm mã thú vị như thế, hãy xem [Cuộc thi mã C bị xáo trộn quốc tế] [ ioccc.org/] .
DarkDust

12
Chỉ cần lưu ý rằng mã là cố tình khó hiểu, và không có nhiều để được thu được từ tìm nó ra, theo như học tập C từ mức một người mới bắt đầu là có liên quan.
Tyler McHenry

Câu trả lời:


154

Chuỗi dài đơn giản là một chuỗi nhị phân được chuyển đổi thành ASCII. Câu forlệnh đầu tiên bbắt đầu từ 10 và [b+++21]sau chuỗi mang lại 31. Xử lý chuỗi là một mảng, offset 31 là bắt đầu của dữ liệu "thực" trong chuỗi (dòng thứ hai trong mẫu mã bạn cung cấp). Phần còn lại của mã chỉ đơn giản là lặp qua chuỗi bit, chuyển đổi 1 và 0 thành! Khoảng trắng và in một ký tự một lần.

Phiên bản ít bị xáo trộn hơn:

#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;
}

Phần thông minh kỳ lạ là trong các putchartuyên bố. Đi đầu tiên putchar. ASCII 'Z'là số thập phân 90, vì vậy 90/9 = 10 là ký tự dòng mới. Trong lần thứ hai, số thập phân 33 là ASCII cho '!'. Việc điều chỉnh bit thứ tự thấp 33 mang lại cho bạn 32, đó là ASCII cho một khoảng trắng. Điều này gây ra !được in nếu blà số lẻ và một khoảng trống sẽ được in nếu blà số chẵn. Phần còn lại của mã chỉ đơn giản là ở đó để đưa "con trỏ" ađi qua chuỗi.


22
Chuỗi không phải là một chuỗi bit (lưu ý rằng không có hoạt động dịch chuyển bit trong mã). Nó là một mã hóa chiều dài của hình ảnh.
interjay

89

Về cơ bản, chuỗi là mã hóa hình ảnh có độ dài chạy : Các ký tự xen kẽ trong chuỗi cho biết cần vẽ bao nhiêu lần và bao nhiêu lần để vẽ dấu chấm than liên tiếp. Dưới đây là một phân tích về các yếu tố khác nhau của chương trình này:

Chuỗi được mã hóa

31 ký tự đầu tiên của chuỗi này được bỏ qua. Phần còn lại chứa các hướng dẫn để vẽ hình ảnh. Các ký tự riêng lẻ xác định có bao nhiêu dấu cách hoặc dấu chấm than để vẽ liên tiếp.

Vòng lặp ngoài

Vòng lặp này đi qua các ký tự trong chuỗi. Mỗi lần lặp làm tăng giá trị của bmột và gán ký tự tiếp theo trong chuỗi cho a.

Vòng lặp bên trong

Vòng lặp này vẽ các ký tự riêng lẻ và một dòng mới bất cứ khi nào nó đến cuối dòng. Số lượng ký tự được vẽ là a - 64. Giá trị của cđi từ 10 đến 90 và đặt lại thành 10 khi đạt đến cuối dòng.

Các putchar

Điều này có thể được viết lại như:

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

Nó vẽ ký tự phù hợp, tùy thuộc vào việc bchẵn hay lẻ, hoặc một dòng mới khi cần.


1
Tại sao 31 ký tự đầu tiên bị bỏ qua?
Pankaj Mahato

3
@PankajMahato vì bbắt đầu từ 10 và chỉ số (b++)+21bắt đầu từ 31.
interjay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.