इस साइट में इंटरप्रेटर टैग में विभिन्न भाषाओं को लागू करने से जुड़ी कई समस्याएं थीं । हालाँकि, व्यावहारिक रूप से वे सभी गूढ़ भाषाएं थीं जिनका कोई उपयोग नहीं करता है। व्यावहारिक भाषा के लिए एक दुभाषिया बनाने का समय जो यहां के अधिकांश उपयोगकर्ता शायद पहले से ही जानते हैं। हां, यह शेल स्क्रिप्ट है, यदि आपको शीर्षक पढ़ने में समस्या है (आपके पास नहीं है)। (हां, मैंने जानबूझकर यह चुनौती दी है, क्योंकि मैं गोल्फस्क्रिप्ट जैसी भाषाओं से ऊब चुका हूं और सब कुछ जीतने वाला हूं, इसलिए मैंने कुछ चुनौती दी जहां अधिक व्यावहारिक प्रोग्रामिंग भाषा के जीतने की संभावना अधिक है)
हालाँकि, शेल स्क्रिप्ट एक अपेक्षाकृत बड़ी भाषा है, इसलिए मैं आपको इसे लागू करने के लिए नहीं कहूंगा। इसके बजाय, मैं शेल स्क्रिप्ट की कार्यक्षमता का एक छोटा सबसेट बनाने जा रहा हूं।
मैंने जो उपसमुच्चय तय किया वह निम्नलिखित उपसमुच्चय है:
- निष्पादन कार्यक्रम (कार्यक्रम में केवल पत्र होंगे, हालांकि, भले ही एकल उद्धरण की अनुमति हो)
- कार्यक्रम के तर्क
- एकल उद्धरण (किसी भी मुद्रण योग्य ASCII वर्ण को स्वीकार करना, जिसमें व्हाट्सएप भी शामिल है, एकल उद्धरण को छोड़कर)
- अयोग्य तार (ASCII पत्र, संख्या और डैश की अनुमति)
- पाइप्स
- खाली बयान
- नई लाइन द्वारा अलग-अलग कथन
- ट्रेलिंग / अग्रणी / कई रिक्त स्थान
इस कार्य में, आपको STDIN से इनपुट को पढ़ना होगा, और प्रत्येक अनुरोधित कमांड को चलाना होगा। आप POSIX- संगत ऑपरेटिंग सिस्टम को सुरक्षित रूप से मान सकते हैं, इसलिए विंडोज के साथ पोर्टेबिलिटी, या ऐसा कुछ भी करने की कोई आवश्यकता नहीं है। आप सुरक्षित रूप से मान सकते हैं कि जिन कार्यक्रमों को अन्य कार्यक्रमों तक नहीं पहुंचाया गया है, वे STDIN से नहीं पढ़ेंगे। आप सुरक्षित रूप से मान सकते हैं कि कमांड मौजूद होंगे। आप सुरक्षित रूप से मान सकते हैं कि कुछ और उपयोग नहीं किया जाएगा। यदि कुछ सुरक्षित धारणा टूट गई है, तो आप कुछ भी कर सकते हैं। आप सुरक्षित रूप से अधिकतम 15 तर्कों, और 512 वर्णों से नीचे की रेखाओं पर विचार कर सकते हैं (यदि आपको स्पष्ट मेमोरी आवंटन की आवश्यकता है, या कुछ और - मैं वास्तव में सी के लिए जीतने के छोटे मौके देने जा रहा हूं, भले ही वे अभी भी छोटे हों)। आपको फ़ाइल डिस्क्रिप्टर साफ़ करने की आवश्यकता नहीं है।
आपको किसी भी बिंदु पर कार्यक्रमों को निष्पादित करने की अनुमति है - यहां तक कि पूरी लाइन प्राप्त करने के बाद, या एसटीडीआईएन समाप्त होने के बाद। मनचाहा तरीका चुनें।
सरल टेस्टकेस जो आपको अपने शेल का परीक्षण करने देता है (तीसरे कमांड के बाद ट्रैपिंग व्हाट्सएप पर ध्यान दें):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
उपरोक्त कार्यक्रम का परिणाम निम्नानुसार होना चाहिए:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
आपको शेल को स्वयं निष्पादित करने की अनुमति नहीं है, जब तक कि आपके पास कमांड के लिए कोई तर्क नहीं है (यह अपवाद पर्ल के लिए बनाया गया था, जो शेल में कमांड चलाता है जब केवल तर्क दिया जाता है system
, लेकिन अन्य के लिए इस अपवाद का दुरुपयोग करने के लिए स्वतंत्र महसूस करें भाषाएँ भी, यदि आप ऐसा कर सकते हैं कि एक तरह से जो पात्रों को बचाता है), या आपके द्वारा चलाए जाने वाले कमांड स्वयं शेल हैं। इस चुनौती में शायद यह सबसे बड़ी समस्या है, क्योंकि कई भाषाओं में ऐसे system
कार्य हैं जो शेल को निष्पादित करते हैं। इसके बजाय भाषा एपीआई का उपयोग करें जो सीधे प्रोग्राम को कॉल करते हैं, जैसे subprocess
पायथन में मॉड्यूल। यह वैसे भी सुरक्षा के लिए एक अच्छा विचार है, और अच्छी तरह से, आप एक असुरक्षित शेल नहीं बनाना चाहेंगे, क्या आप चाहते हैं? यह सबसे अधिक संभावना PHP को रोकता है, लेकिन वैसे भी चुनने के लिए अन्य भाषाएं हैं।
आप खोल स्क्रिप्ट में अपने कार्यक्रम बनाने जा रहे हैं, तो आप का उपयोग करने के लिए अनुमति नहीं है eval
, source
या .
(में एक समारोह, नहीं एक चरित्र के रूप में)। यह मेरी राय में चुनौती को बहुत आसान बना देगा।
चतुर शासन दुरुपयोग की अनुमति दी। ऐसी बहुत सी चीजें हैं जिन्हें मैंने स्पष्ट रूप से अस्वीकार कर दिया है, लेकिन मुझे लगभग यकीन है कि आप अभी भी उन चीजों को करने की अनुमति देते हैं जो मैंने नहीं किए हैं। कभी-कभी मुझे आश्चर्य होता है कि लोग मेरे नियमों की व्याख्या कैसे करते हैं। इसके अलावा, याद रखें कि आपने जो कुछ भी उल्लेख नहीं किया है उसके लिए आप कुछ भी कर सकते हैं। उदाहरण के लिए, यदि मैं चर का उपयोग करने की कोशिश करता हूं, तो आप हार्ड डिस्क को मिटा सकते हैं (लेकिन कृपया नहीं)।
सबसे छोटा कोड जीतता है, क्योंकि यह कोडगोल्फ है।