val()=hd[(fn s=>let val$ =s^"\""^String.toString s^"\"]"val(189,%)=(size$,$)in print%end)"val()=hd[(fn s=>let val$ =s^\"\\\"\"^String.toString s^\"\\\")\"val(189,%)=(size$,$)in print%end)"]
इसे ऑनलाइन आज़माएं!
MLton के लिए, पूर्ण SML प्रोग्राम या तो अभिव्यक्त किए जाते हैं और ;(जैसे print"Hello";print"World";) varऔर fun( और var _=print"Hello"var _=print"World") और कीवर्ड (जैसे ) के साथ घोषणाओं को समाप्त कर दिया जाता है जहां _एक वाइल्ड कार्ड होता है जिसे किसी भी चर नाम से बदला जा सकता है।
पहला विकल्प प्राचीन प्रोग्रामिंग के लिए बेकार है क्योंकि ;अपने आप ही एक वैध कार्यक्रम है (जो कुछ भी नहीं करता है, लेकिन त्रुटि भी नहीं करता है)। दूसरे दृष्टिकोण के साथ समस्या यह है कि इस तरह की घोषणाओं var _=print"Hello"को सिर्फ var _="Hello"(या सम var _=print) तक छोटा किया जा सकता है क्योंकि varजब तक दाएं हाथ से काम करने की घोषणा वैध SML अभिव्यक्ति या मूल्य नहीं है (SML एक कार्यात्मक भाषा है, इसलिए फ़ंक्शन हो सकते हैं मूल्यों के रूप में भी उपयोग किया जाता है)।
इस बिंदु पर, मैं SML असंभव में प्राचीन प्रोग्रामिंग की घोषणा करने के लिए तैयार था, जब संयोग से मैं पैटर्न- इन- valसेक्लेरेशन से मेल खाता था । यह पता चला है कि घोषणाओं के लिए वाक्यविन्यास नहीं है , val <variable_name> = <expression>लेकिन val <pattern> = <expression>जहां एक पैटर्न में चर नाम, स्थिरांक और निर्माता शामिल हो सकते हैं। जैसा कि printफ़ंक्शन का प्रकार होता है string -> unit, हम यह लागू करने के लिए unit-value पर एक पैटर्न मैच का उपयोग कर सकते हैं ()कि प्रिंट फ़ंक्शन वास्तव में स्ट्रिंग पर लागू होता है val()=print"Hey":। इस दृष्टिकोण के साथ, printया तो हटाने या "Hey"परिणाम में Pattern and expression disagree।
हाथ में प्राचीन मुद्रण के इस तरीके के साथ, अगला कदम एक क्वीन लिखना है, इससे पहले अंत में कुछ और बचत-रक्षक को जोड़ना होगा। मैंने पहले एक आसान एसएमएल क्वीन तकनीक का इस्तेमाल किया था ( संशोधन इतिहास देखें ), लेकिन एंडर्स केसेर्ग ने एक अलग दृष्टिकोण बताया जो उनके मामले में कुछ बाइट्स को बचा सकता है। यह String.toStringस्ट्रिंग से बचने के लिए अंतर्निहित फ़ंक्शन का उपयोग करता है और सामान्य रूप का होता है <code>"<data>", जहां पहले से "<data>"बचा हुआ स्ट्रिंग है code:
val()=(fn s=>print(s^"\""^String.toString s^"\""))"val()=(fn s=>print(s^\"\\\"\"^String.toString s^\"\\\"\"))"
यह एक काम कर रहा है लेकिन अभी तक प्राचीन नहीं है। सबसे पहले एंडर्स कासोर्ग ने पाया कि MLton "त्रुटियों के उत्पादन के बिना कोड के रूप में एक एकल उद्धरण को स्वीकार करता है , जिसका अर्थ है कि हम ऊपर के रूप में एक उद्धरण में कोड को समाप्त नहीं कर सकते हैं। इसे रोकने का सबसे छोटा तरीका यह होगा कि val()=कोष्ठक की एक जोड़ी के बाद सब कुछ लपेट दिया जाए , हालांकि तब कोड को कम किया जा सकता है val()=()। दूसरा सबसे छोटा तरीका जो मैंने पाया है val()=hd[ ... ], वह है कि हम हर चीज को एक सूची में लपेटते हैं और टाइप चेकर को खुश करने के लिए अपना पहला तत्व वापस करते हैं।
यह सुनिश्चित करने के लिए कि डेटा स्ट्रिंग के किसी भी हिस्से को बिना देखे हटाया नहीं जा सकता है, पैटर्न-मिलान इन- valडिक्लेरेशन फिर से काम में आता है: अंतिम स्ट्रिंग की लंबाई मुद्रित होने के लिए (और इस प्रकार प्रोग्राम की लंबाई) 195 के बराबर होनी चाहिए, इसलिए हम इसके बजाय अमूर्त let val t=... val 195=size t in print t endके शरीर में लिख सकते fnहैं print(...)। स्ट्रिंग के एक हिस्से को हटाने से 189 से कम लंबाई होती है, इस प्रकार एक Bindअपवाद को फेंक दिया जाता है।
अभी भी एक मुद्दा बाकी है: पूरी val 195=size tजाँच को केवल गिराया जा सकता है। हम चैक पर मिलान के लिए चेक का विस्तार करके इसे रोक सकते हैं: val t=... val(216,u)=(n+size t,t)in print u endजैसे कि एक अनबाउंड वैरिएबल में चेक रिजल्ट निकालना u।
कुल मिलाकर, यह निम्नलिखित 195 बाइट समाधान का उत्पादन करता है:
val()=hd[(fn s=>let val t=s^"\""^String.toString s^"\")"val(195,u)=(size t,t)in print u end)"val()=hd[(fn s=>let val t=s^\"\\\"\"^String.toString s^\"\\\")\"val(195,u)=(size t,t)in print u end)"]
जैसे ऑपरेटर चर नाम का उपयोग करने का गोल्फ चाल को लागू करने !, $और %के बजाय n, tऔर uआदेश कुछ सफेद स्थान को बचाने के लिए (देखें इस टिप अंतिम 182 बाइट संस्करण के लिए) की ओर जाता है।
अन्य सभी स्थानापन्न-निष्कासन, जहां स्पष्टीकरण में स्पष्ट रूप से नहीं कहा गया है, एक सिंटैक्स या टाइप त्रुटि में परिणाम होना चाहिए।
संपादित करें 1: length(explode t) बस है size t।
संपादित करें 2: एक अलग रानी दृष्टिकोण के लिए एंडर्स कासोर्ग के लिए धन्यवाद और "भेद्यता" को इंगित करता है।