यह कोड भारत का नक्शा कैसे तैयार करता है?


169

यह कोड भारत के नक्शे को प्रिंट करता है। यह कैसे काम करता है?

#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
यह सिर्फ ओफ़्फ़िकेटेड सी है ... इस तरह के पागलपन के लिए समर्पित पूरे समाज हैं।
मार्क


2
#include "Stdio.h": क्या वह सभी कंपाइलरों पर काम करता है? मुझे यह देखकर आश्चर्य हुआ कि आप मिसकैप के साथ वर्किंग कोड प्राप्त कर सकते हैं। शायद विंडोज पर इसका (गैर-संवेदनशील मामला एफएस)
वैकल्पिक

2
इस तरह के और अधिक मजेदार कोड के लिए [अंतर्राष्ट्रीय Obfuscated C कोड प्रतियोगिता] देखें [ ioccc.org/]
डार्कडस्ट

12
बस इस बात से अवगत रहें कि कोड को जानबूझकर समझना मुश्किल है, और यह पता लगाने से बहुत कुछ हासिल नहीं किया जा सकता है, जहां तक ​​एक शुरुआती स्तर से सी सीखने का संबंध है।
टायलर मैकहेनरी

जवाबों:


154

लंबी स्ट्रिंग बस एक द्विआधारी अनुक्रम है जिसे एएससीआईआई में परिवर्तित किया गया है। पहला forकथन b10 पर शुरू होता है, और [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बयान। पहले ले लो putchar। ASCII 'Z'दशमलव में 90 है, इसलिए 90/9 = 10 जो एक नया वर्ण है। दूसरे में, दशमलव 33 के लिए ASCII है '!'। 33 के कम-क्रम बिट को टॉगल करने से आपको 32 मिलता है, जो एक स्थान के लिए ASCII है। !यदि bयह विषम है, तो मुद्रित करने का कारण बनता है, और यदि रिक्त स्थान मुद्रित किया जाता है तो bभी। बाकी कोड aस्ट्रिंग के माध्यम से "पॉइंटर" पर चलने के लिए है।


22
स्ट्रिंग थोड़ा अनुक्रम नहीं है (ध्यान दें कि कोड में कोई बिट-शिफ्ट ऑपरेशन नहीं हैं)। यह इमेज की रन-लेंथ एन्कोडिंग है।
अंतरजाल

89

मूल रूप से, स्ट्रिंग छवि का रन-लंबाई एन्कोडिंग है: स्ट्रिंग में वैकल्पिक वर्ण कहते हैं कि किसी स्थान को खींचने के लिए कितनी बार, और कितनी बार एक विस्मयादिबोधक चिह्न को लगातार खींचने के लिए। इस कार्यक्रम के विभिन्न तत्वों का विश्लेषण इस प्रकार है:

एन्कोडेड स्ट्रिंग

इस स्ट्रिंग के पहले 31 अक्षरों को अनदेखा किया गया है। बाकी में चित्र बनाने के निर्देश हैं। व्यक्तिगत वर्ण निर्धारित करते हैं कि कितने स्थान या विस्मयादिबोधक चिह्न लगातार खींचने के लिए।

पाश के लिए बाहरी

यह लूप स्ट्रिंग में वर्णों के ऊपर जाता है। प्रत्येक पुनरावृत्ति एक के मूल्य को बढ़ाती है b, और स्ट्रिंग में अगले वर्ण को असाइन करती है a

भीतर का पाश

जब भी यह लाइन के अंत तक पहुँचता है, तो यह लूप व्यक्तिगत पात्रों और एक नई रेखा खींचता है। तैयार किए गए वर्णों की संख्या है a - 64। मान का मान c10 से 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सम या विषम है, या आवश्यकता होने पर एक नई रेखा ।


1
पहले 31 पात्रों को क्यों नजरअंदाज किया जाता है?
पंकज महतो

3
@PankajMahato क्योंकि b10 में शुरू होती है और सूचकांक है (b++)+21जो 31 पर शुरू होता है,
interjay
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.