आप कहाँ से आये हैं?


9

INTERCAL एक अद्भुत भाषा है, लेकिन अन्य लोगों के कोड को समझना हमेशा आसान नहीं होता है। यह विशेष रूप से ऐसा मामला है यदि वे कथन विवरण से आते हैं।

इंटरकास्ट मैडनेस है

चुनौती की परिभाषा

  1. एक प्रोग्राम या फ़ंक्शन लिखें जो एक इंटरकैल प्रोग्राम के स्रोत कोड को एक पाठ / डेटा स्ट्रीम के रूप में लेते हैं। यदि आप एक फ़ंक्शन लिखते हैं तो यह अनुशंसा की जाती है कि आप फ़ंक्शन को कॉल करने के लिए एक कार्यक्रम भी प्रदान करते हैं, लेकिन यह आपके स्कोर की ओर नहीं गिना जाएगा।
  2. फ़ंक्शन आउटपुट निम्न निर्देशों के अनुसार, प्रोग्राम के जंप का एक टेक्स्ट / डेटा स्ट्रीम होगा। आउटपुट को मुद्रित करने की आवश्यकता नहीं है, लेकिन इसके लिए एकल टेक्स्ट की आवश्यकता होती है, न कि स्ट्रिंग्स की एक सरणी (उदाहरण के लिए)।
  3. आउटपुट की प्रत्येक पंक्ति में स्टेटमेंट होगा, जो COM FROM होगा और इसके COME FROM स्टेटमेंट की लाइन नंबर, द्वारा अलग किया जाएगा ->। एक उदाहरण:

    (310)   DO .4 <- .3 -> 55
    
  4. आप स्रोत कोड की इन पंक्तियों को ट्रिम कर सकते हैं, लेकिन यह आवश्यक नहीं है।

  5. परीक्षण के मामलों में केवल गैर-विवादास्पद लेबल (यानी, पूर्णांक लेबल) शामिल होंगे।
  6. आउटपुट को उन बयानों के स्रोत कोड क्रम द्वारा सॉर्ट किया जाना चाहिए, जो COME FROM होंगे, न कि उनका लेबल और न ही कथन या उनके लेबल का क्रम।
  7. एक ही लेबल से कई बयानों के लिए यह संभव है। ऐसे मामलों में COME FROM लाइन नंबरों को क्रमबद्ध किया जाना चाहिए, और कॉमा द्वारा अलग किया जाना चाहिए।
  8. यह कथन से स्वयं के लिए संभव है।
  9. एक कथन से एक कथन कथन के साथ उपसर्ग किया जा सकता है। ऐसे मामलों में लाइन संख्या को वर्ग कोष्ठक में लपेटा जाना चाहिए।
  10. COME FROM शब्द एक टिप्पणी में दिखाई दे सकता है और इसे अनदेखा किया जाना चाहिए। आपको फ़ाइल को पूरी तरह से पार्स करने की आवश्यकता नहीं है: यदि उन्हें एक लेबल (कोष्ठकों में एक संख्या) द्वारा पालन किया जाता है, तो आप मान सकते हैं कि यह एक वास्तविक विवरण है।

स्कोरिंग

प्रवेशकों को उनके कार्यक्रम या फ़ंक्शन की चरित्र लंबाई द्वारा रन बनाए जाएंगे ।

परीक्षण के मामलों

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

rot13.i

(10) PLEASE DON'T GIVE UP -> 87
(33) DON'T GIVE UP -> 92

primes.i

(15)    DO (13) NEXT -> 26
(16)    DO .12 <- .1 -> 6
(23)    DO (21) NEXT -> 3

unlambda.i

(7202)  DO RETRIEVE .203+,202 -> 75
(4202)  DO ,202SUB.201.202#7 <- ,201SUB.201.202#7 -> 108
(6202)  DO ,201SUB.201.202#7 <- ,202SUB.201.202#7 -> 117
(4203)  DO READ OUT ,201SUB.201.202#7 -> 133
(4302)  DO .302 <- .2 -> 181
(5410)  DO ,400SUB#124 <- #4 $ #17 -> 293
(3410)  PLEASE (4410) NEXT -> 288
(5402)  DO (412) NEXT -> 328
(4412)  PLEASE (3412) NEXT -> 334
(3423)  DO FORGET #2 -> 375
(4404)  DO RETRIEVE .311+.312 -> 411
(5404)  PLEASE DO (414) NEXT -> 430
(4434)  DO FORGET #1 -> 441
(3454)  DO (103) NEXT -> 451
(5502)  DO .512 <- .312 -> 520
(8503)  PLEASE RETRIEVE .311+.312 -> 621
(7503)  DO (302) NEXT -> 515
(3622)  DO (302) NEXT -> 514
(603)   PLEASE FORGET #2 -> 622

pass.i

(10)    DO  NOTHING -> 5, 11
(20)    PLEASE  (100) NEXT -> 6
(30)    PLEASE  (200) NEXT -> 12
(103)   DO  (104) NEXT -> 27
(104)   DO  (105) NEXT -> 19
(1) DO  (2) NEXT -> 36
(2) DO  (105) NEXT -> 194
(202)   DO NOT  .2 <- #2 AGAIN -> [196]
(203)   DO  (204) NEXT -> 167
(204)   DO  (205) NEXT -> 159

continuation.i

(8201)  DO NOTHING -> 165, 271
(8202)  PLEASE NOTE Fork threads, one dormant, one alive -> 53, 58
(8211)  DO COME FROM (8211) -> 60
(8216)  DO NOTHING -> 71
(8215)  DO NOTHING -> 68
(8217)  DO COME FROM (8217) AGAIN -> 118
(8299)  DO COME FROM (8299) AGAIN -> 141
(8274)  DO (8273) NEXT ONCE -> 158
(8259)  PLEASE DO NOTHING -> 166
(8276)  DO COME FROM (8276) AGAIN -> 199
(8278)  PLEASE DO COME FROM (8278) AGAIN -> 237

2
यह मुझे चकित करता है कि अभी तक किसी ने कॉटन आईज जो संदर्भ नहीं दिया है :-)।
mnnxomaτ

22
INTERCAL is a wonderful languageआक्रामक भाषा के लिए डाउनवोट किया गया।
घातक

क्या आप वाकई पात्र की लंबाई से स्कोर करना चाहते हैं? आमतौर पर यहां बाइट्स की लंबाई को चुनौती दी जाती है।
घातक

@ घातक मैंने इसके बारे में दोनों तरीकों से सोचा। चरित्र स्कोरिंग के सामान्य लाभ बड़ी संख्या में यूनिकोड वर्ण के रूप में एन्कोडिंग की तरह शायद उपयोगी नहीं होंगे, लेकिन मैंने सोचा कि अगर कोई स्कोरिंग का फायदा उठा सकता है तो मुझे यह देखने में दिलचस्पी होगी कि वे क्या कर सकते हैं।
जिज्ञासु

क्या हम मान सकते हैं कि लेबल एक पंक्ति के प्रारंभ में है? ऐसा है कि ^(\d+)लेबल पकड़ लेता है?
orlp

जवाबों:


2

जावास्क्रिप्ट, 232 बाइट्स

function c(d){for(var l,o,f,c,p=/^.(\d+).+?$/gm,a=/(T\s+)?C.{7}M .(\d+)/g,r='';l=p.exec(d);)for(f=0;o=a.exec(d);)o[2]==l[1]&&(c=d.slice(0,o.index).split('\n').length,r+=f++?', ':'\n'+l[0]+' -> ',r+=o[1]?'['+c+']':c);return r.trim()}

के साथ बुलाया जाए

var data = require( 'fs' ).readFileSync( process.argv[2] ).toString();
console.log( c( data ) );

व्याख्या

function c(d){
    for(
        // Initialise variables
        var l,o,f,c,p=/^.(\d+).+?$/gm,a=/(T\s+)?C.{7}M .(\d+)/g,r='';
        // Find lines beginning with a label
        l=p.exec(d);)
            for(
                // Reset a have-we-output-this-line flag
                f=0;
                // Find CALL FROM statements
                o=a.exec(d);)
                    // Filter to CALL FROM statements which have the current line
                    o[2]==l[1]&&(
                        // Calculate the line number of this CALL FROM statement
                        c=d.slice(0,o.index).split('\n').length,
                        // Concat the output for this line
                        r+=f++?', ':'\n'+l[0]+' -> ',r+=o[1]?'['+c+']':c);
    // Trim an initial new line
    return r.trim()}

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