zsh, 603 594 566 561 548 440 415 399 378 370 बाइट्स
ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}
Coreutils + पर निर्भर करता है dc
।
इसे ऑनलाइन आज़माएं!
वह था ... एक यात्रा।
इस उत्तर के तीन भाग हैं। पहली 4 लाइनें कुछ विशेष मामलों को संभालती हैं जो कोड को सरल बनाते हैं। अगली 2 पंक्तियाँ और अंतिम पंक्ति दोनों अनिवार्य रूप से एक ही चीज़ को पूरा करते हैं, लेकिन वास्तव में किसी भी चरित्र को हटाने के साथ चलाया जाता है। वे ज्यादातर पूरक चरित्र सेटों के साथ लिखे गए हैं, ताकि किसी भी चरित्र को हटाने से अधिकतम एक ही टूटता है, जिससे दूसरे को कार्य करना जारी रखने की अनुमति मिलती है।
पहले भाग को देखते हुए, हम पहले संभालते हैं
- साथ नई हटाने
ec\nho \\n
- अंतरिक्ष हटाने के साथ
ca t<<<$'\x20'
(बाद में exi t
चलने वाले कोड से बचने के लिए, जिसके परिणामस्वरूप बाहरी उत्पादन होगा)
$
d$c -e8BC6P
( 8BC6
= 9226
है 36*256 + 10
, और 36 और 10 के साथ हटाने के $
क्रमशः और newline वर्ण के बाइट मान हैं; हम लाइन 6 में बड़ी टिप्पणी में उन्हें शामिल करने से बचने के लिए दशमलव में हेक्स अंक का उपयोग करते हैं)
0
हटाने के साथ d0c -eKp
( K
दशमलव सटीक मिलता है, जो 0
डिफ़ॉल्ट रूप से है)
अगले भाग में, उपयोग किए जाने वाले एकमात्र वर्ण (दूसरी पंक्ति के अंत में कचरे से अलग) $'\01234567v;
, स्थान और नई रेखा हैं । इनमें से चार का हिसाब किया गया है, इसलिए शेष ( '\1234567v
) अंतिम पंक्ति में नहीं हो सकता है। ऑक्टेल का विस्तार करना ( $'\123'
मूल्य 123 8 के साथ ASCII वर्ण का प्रतिनिधित्व करता है ), हमें मिलता है:
zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'
पहली पंक्ति कार्यक्रम में उपयोग किए गए सभी वर्णों के माध्यम से लूप करती है और अपने स्वयं के स्रोत कोड में प्रत्येक को खोजती है ( $0
जो स्क्रिप्ट का फ़ाइल नाम चलाया जा रहा है), किसी भी वर्ण को प्रिंट करना जो कि नहीं मिला है।
दूसरी पंक्ति थोड़ी अजीब लगती है, और ऐसा ही प्रतीत होता है जैसे कि exit
नोड्स का एक गुच्छा। हालांकि, exit
ऑक्टल के रूप में सीधे एन्कोडिंग में परिणाम होता है $'\145\170\151\164'
, जिसमें शामिल नहीं है 2
या 3
। हमें वास्तव में इसे हटाने के लिए कम लचीला बनाने की आवश्यकता है । ऐसा इसलिए है क्योंकि यदि किसी '\014567v
को हटा दिया जाता है, तो पहली पंक्ति को तोड़कर, दूसरी पंक्ति भी टूट जाती है, जिससे शेष कोड निष्पादित हो जाता है। हालांकि, हमें इसकी आवश्यकता है कि अगर इसे हटा दिया जाए 2
या 3
हटा दिया जाए ताकि 3 और 4 लाइनें चल सकें। इस में shoehorning द्वारा पूरा किया है :
और ;
, जो उनके अष्टाधारी प्रतिनिधित्व में क्रमश: एक 2 और 3 की है।
लाइन 2 के अंत में कबाड़ बस यह सुनिश्चित करने के लिए है कि प्रत्येक मुद्रण योग्य ASCII वर्ण कम से कम एक बार दिखाई देता है, जिस तरह से प्रत्येक के माध्यम से लूपिंग करके चेकिंग की आवश्यकता होती है।
यदि exit
पहले खंड में नहीं बुलाया गया था (अर्थात यह एक को हटाने के द्वारा मंगाई गई थी '\01234567v
), हम दूसरे पर चलते हैं, जिसमें हमें इन वर्णों का उपयोग किए बिना एक ही चीज़ को पूरा करना होगा। अंतिम पंक्ति डिकोड की गई पहली पंक्ति के समान है, सिवाय इसके कि हम कुछ बाइट्स को बचाने के लिए लूप की सीमा को अनुबंधित कर सकते हैं, क्योंकि हम पहले से ही जानते हैं कि सभी पात्रों को '\01234567v
कवर किया गया है। इसके 0# $#
पहले यह भी है , जो इसे टिप्पणी करता है और यदि इसे हटा दिया गया है 0
या इसे बाहरी उत्पादन से रोकता $
है।