एक साधारण गोटो के साथ एक कार्यक्रम बनाएँ


25

XKCD गोटो कॉमिक

आपका कार्य उस सबसे बड़े कार्यक्रम का निर्माण करना है जो आप वास्तव में एक GOTO का उपयोग कर सकते हैं, जिसके बिना पूरे कार्यक्रम (या कम से कम एक बड़ा हिस्सा) को पूरी तरह से पुनर्गठन किया जाना चाहिए। स्कोर को आपके कोड में उन बयानों की संख्या के रूप में गिना जाता है जो स्थान बदलते हैं या नए पेश किए जाते हैं (बयानों को हटाने से आपके स्कोर में कोई फर्क नहीं पड़ता) जब कोड को बिना GOTO के पुनर्गठन किया जाता है (अन्य को आपके पुनर्गठन को चुनौती देने की अनुमति दी जाती है सुरुचिपूर्ण)। जैसा कि यह कोड गेंदबाजी है, उच्चतम स्कोर जीत है।

नोट: मैं इस चुनौती का प्रयास करके वेलोसिरैप्टर हमलों के लिए किसी भी दायित्व का दावा नहीं करता हूं।


2
एक ही गोटो समस्याग्रस्त लगता है। हर सी कोड मैं सोच सकता हूं कि संरचित निर्माणों का उपयोग करने के लिए एक एकल गोटो को तुच्छ रूप से बदला जा सकता है। एकाधिक gotos लेकिन ...
Pubby

@ पबबी का दावा मौजूदा दो समाधानों के खिलाफ है। दोनों के gotoसाथ प्रतिस्थापित करना switchसंभव लगता है।
बदसूरत

@Pubby आपको कितने हल बनाने की आवश्यकता होगी? यदि वर्तमान में बताई गई समस्या असंभव है, तो मैं एक वैकल्पिक समस्या बना सकता हूं।
जो जेड

मुझे लगता है कि आपको कार्टून को एम्बेड करने की अनुमति है, जब तक कि एक लिंक भी है।
लूज़र ने

1
यह योग्य नहीं है, लेकिन मैंने वास्तव में ऐसा किया है
लूजर ने

जवाबों:


11

C फ़िज़बज़्ज़

यह समाधान इंटरप्ट और लेबल चर के विचार के आसपास चलता है (केवल जीसीसी, क्षमा करें)। कार्यक्रम एक टाइमर सेट करता है जो समय-समय पर मुख्य कॉल करता है, जहां हमें गोटो मिलता है जो भी हमारे इंटरप्ट हैंडलर (मुख्य) के अंतिम निष्पादन को बताता है हमें चाहिए।

मैंने पहले कभी टाइमर या लेबल चर का उपयोग नहीं किया है, इसलिए मुझे लगता है कि यहां गेंदबाजी करने के लिए बहुत कुछ है।

#include <sys/time.h>
#include <signal.h>
#include <stdio.h>

int main(int argc)
{
    static int run = 1;
    static int* gotoloc = &&init;
    static int num = 0;
    static int limit = 50;

    goto *gotoloc;
init:
    signal(SIGVTALRM, (void (*)(int)) main);
    gotoloc = &&loop;

    struct itimerval it_val;

    it_val.it_value.tv_sec = 0;
    it_val.it_value.tv_usec = 100000;
    it_val.it_interval.tv_sec = 0;
    it_val.it_interval.tv_usec = 100000;
    setitimer(ITIMER_VIRTUAL, &it_val, NULL);

    while(run);

loop:
    num = num + 1;
    run = num < limit;
    gotoloc = &&notfizz + (&&fizz - &&notfizz) * !(num % 3);
    return 1;

fizz:
    printf("fizz");
    gotoloc = &&notbuzz + (&&buzz - &&notbuzz) * !(num % 5);
    return 1;

notfizz:
    gotoloc = &&notfizzbuzz + (&&buzz - &&notfizzbuzz) * !(num % 5);
    return 1;

buzz:
    printf("buzz\n");
    gotoloc = &&loop;
    return 1;

notbuzz:
    printf("\n");
    gotoloc = &&loop;
    return 1;

notfizzbuzz:
    printf("%d\n", num);
    gotoloc = &&loop;
    return 1;
}

runघोषित किया जाना चाहिए volatile, अन्यथा while(run)"अनुकूलित" किया जा सकता है while(1)। या इसके बजाय, बस कहीं गोटो कि कॉल exit
बदसूरत

@ गुडोरन अच्छी बात है। मैंने अनुकूलन (O1, O2 और Os) को चालू किया और उन सभी ने कार्यक्रम को तोड़ दिया। दुर्भाग्य से रन के सामने सिर्फ 'अस्थिर' जोड़ने से गोटोलोक और संख्या ने इसे ठीक नहीं किया। यह हो सकता है कि इस तरह के कोड के अनुकूलन के लिए gcc का निर्माण नहीं किया गया हो।
शियोना

volatile int numमुख्य के बाहर परिभाषित करना चाहिए। के साथ static, जीसीसी को लगता है कि यह जानता है कि कौन इसके साथ गड़बड़ कर सकता है।
बदसूरत

दुर्भाग्य से मैं मुख्य के बाहर गेटोलॉक नहीं बना सकता, या मैं कर सकता था, लेकिन मुझे इसे बाहर शून्य पर सेट करना होगा और फिर शून्य होने पर ही मुख्य की शुरुआत में रीसेट करना होगा। और अपील के आँकड़े फीका करने के लिए। इसलिए मुझे लगता है कि यह कहना सबसे अच्छा है कि मैं सी का उपयोग खराब तरीके से कर रहा हूं, सही तरीके से इसे अनुकूलित नहीं करता है इसलिए कोशिश न करें।
शियोना

5

पर्ल

मैं गेंदबाजी में बहुत अच्छा नहीं हूं, लेकिन मुझे संदेह है कि इससे ओपी को रुचि हो सकती है। यह एक चर गोटो का उपयोग करके इरेटोस्थनीज की छलनी है। यह 'रिफैक्टेड' होने के लिए थे, मुझे संदेह है कि इसमें से कोई भी पुन: प्रयोज्य होगा, शायद पहली कुछ पंक्तियों के अलावा। जब छलनी समाप्त हो जाती है, 1तो @primesसरणी में शेष सभी शेष प्रमुख मूल्यों के अनुरूप होते हैं।

अतिरिक्त मौज-मस्ती के लिए, no, ands, ors, ternaries, सशर्त या किसी भी प्रकार के तुलना ऑपरेटरों का उपयोग किया जाता है।

@primes[2..1e4]=(1)x9999;
$a=2;
Y:
  $b=$a*~-$a;
X:
  $primes[$b+=$a+=$c=$a/100%2+$b/1e4%2]=0;
  goto"$c"^h;
Z:

इस मामले में कि मैं इसे यहां क्यों पोस्ट कर रहा हूं, इस बारे में कोई भ्रम है, एक अलग प्रश्न में (अब हटा दिया गया), ओपी ने कहा कि, "यह वह सवाल था जिसे वह वास्तव में पूछना चाहता था", लेकिन यह संभव नहीं था अगर यह संभव था ।
प्रिमो

यदि मुझे कोई प्रश्न पोस्ट करना है, तो यह भ्रम होता है कि यह केवल एक के बजाय केवल GOTO का उपयोग करके कोड बनाने के बारे में एक प्रश्न था ।
जो जेड

1
@ जोज़ेंग मैं मूल रूप से तीन थे, लेकिन मैंने इसे कम कर दिया ताकि यह इस समस्या का एक वैध समाधान बन जाए।
प्रिमो

3

सी

मैक्रोज़ का मेरा उपयोग शायद इसे "एक गोटो" नहीं बनाता है।
और यह काफी छोटा है, इसलिए "पूरी तरह से पुनर्गठित" ज्यादा नहीं है।
लेकिन यहाँ मेरी कोशिश वैसे भी है।

मानक इनपुट से एक नंबर पढ़ता है, यह 3 modulu प्रिंट करता है।

int main() {
    char s[100], *p, r=0;
    void *pl[] = { &&a, &&b, &&c, &&d, &&e, &&f, &&g, &&h, &&i, &&j, &&a, &&b, &&x, &&y, &&z }, *p1;
    p = gets(s);
    #define N(n) (pl+n)[!*p*60+*p-48];p++;goto *p1
    a: p1=N(0);
    b: p1=N(1);
    c: p1=N(2);
    d: p1=N(0);
    e: p1=N(1);
    f: p1=N(2);
    g: p1=N(0);
    h: p1=N(1);
    i: p1=N(2);
    j: p1=N(0);
    z: r++;
    y: r++;
    x: printf("%d\n", r);

    return 0;
}

1
हाँ, मैक्रोज़ का उपयोग करना "एक गोटो" नहीं है। लेकिन फिर भी, आपको GOTO का उपयोग किए बिना कार्यक्रम के पुनर्गठन की आवश्यकता होगी। स्टेटमेंट निकालना आपके स्कोर में नहीं जुड़ता है।
जो जे

मुद्रण एक नंबर 3 modulo सिर्फ एक का उपयोग करके आसान होगा printfऔर scanf। आपके समाधान का स्कोर सबसे अधिक 2 या 3 के बारे में होगा
जो

1
निष्पक्ष बिंदु। मैं यह नहीं सोच सकता कि कोई भी कभी भी इस तरह से कुछ प्रिंट करने के लिए क्यों प्रोग्राम करना चाहेगा n%3। यह एक ऐसा कार्यक्रम होना चाहिए जो GOTO हटाए जाने पर दृढ़ हो जाए , न कि जब इसे पेश किया जाए
जो

2
"क्यूं कर?" इस साइट के लिए अप्रासंगिक है - यह बेवकूफी भरे तरीकों से भरी हुई है। यदि आप निकालते हैं goto, तो प्रोग्राम काम नहीं करेगा। लेकिन आप क्या उम्मीद करते थे - कि कार्यक्रम अकेले हटाने से दृढ़ हो जाएगा?
बदसूरत

1
हटाने और बाद के पुनर्गठन से, हाँ। एक सरल उदाहरण कई नेस्टेड लूप से बाहर निकलने के लिए गोटो का उपयोग हो सकता है।
जो जे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.