सीलोन, 1431 , 764 , 697 , 571 , 547 , 538 , 501 , 493 , 467 , 451
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}
यह मूल, असंयमी था:
Integer footprintCharacter(Integer b) {
return sum({0, for(i in 0..7) if(b.get(i)) 1 });
}
Integer footPrintString(String s) {
if(s == "test") {return 0;}
return sum({0, for(c in s) footprintCharacter(c.integer)});
}
shared void footprint() {
if(exists s = process.arguments[0]) {
print(footPrintString(s));
} else {
print("This program needs at least one parameter!");
}
}
यह एक कमांड लाइन पैरामीटर से तर्क लेता है ... process.arguments स्ट्रिंग्स का एक (संभवतः खाली) अनुक्रम है, इसलिए उनमें से किसी एक का उपयोग करने से पहले, हमें यह जांचने की आवश्यकता है कि क्या यह वास्तव में मौजूद है। दूसरे मामले में हम एक त्रुटि संदेश आउटपुट करते हैं (यह प्रश्न द्वारा आवश्यक नहीं है और अगले संस्करणों में फेंक दिया जाएगा)।
सीलोन का sum
कार्य कुछ प्रकार के तत्वों का एक गैर-रिक्त Iterable लेता है Summable
, जिसे संतुष्ट करने की आवश्यकता होती है , अर्थात एक plus
विधि होती है, जैसे Integer। (यह खाली अनुक्रमों के साथ काम नहीं करता है क्योंकि प्रत्येक योग योग्य प्रकार का अपना शून्य होगा, और रनटाइम को यह जानने का कोई मौका नहीं है कि इसका मतलब क्या है।)
एक स्ट्रिंग के तत्व, या एक पूर्णांक के एक बिट, एक गैर-खाली चलने योग्य नहीं हैं। इसलिए हम यहां कुछ तत्वों को निर्दिष्ट करके पुनरावृत्त बनाने की सुविधा का उपयोग कर रहे हैं, फिर एक "समझ" (जिसका मूल्यांकन शून्य या अधिक तत्वों के लिए किया जाएगा)। इसलिए चरित्र के मामले में हम लोगों को जोड़ रहे हैं (लेकिन केवल जब संबंधित बिट सेट होता है), स्ट्रिंग मामले में हम वर्णों के परिणाम को जोड़ रहे हैं। (बोध का मूल्यांकन केवल तब किया जाएगा जब प्राप्त समारोह वास्तव में इसके बारे में पुनरावृत्त करता है, जब Iterable का निर्माण नहीं होता है।)
आइए देखें कि हम इसे कैसे छोटा कर सकते हैं। सबसे पहले, प्रत्येक फ़ंक्शन को केवल एक स्थान पर बुलाया जाता है, इसलिए हम उन्हें इनलाइन कर सकते हैं। इसके अलावा, जैसा कि ऊपर बताया गया है, त्रुटि संदेश से छुटकारा पाएं। (764 फुटप्रिंट अंक)
shared void footprint() {
if (exists s = process.arguments[0]) {
if (s == "test") {
print(0);
} else {
print(sum({ 0, for (c in s) sum({ 0, for (i in 0..7) if (c.integer.get(i)) 1 }) }));
}
}
}
हमें वास्तव में आंतरिक नेस्टेड की आवश्यकता नहीं है sum
, हम इसे एक बड़ी समझ बना सकते हैं। (यह हमें 37 फ़ुटप्रिंट पॉइंट्स के लिए बचाता है sum({0,})
, और व्हॉट्सएप के लिए कुछ और, जो किसी भी तरह समाप्त हो जाएंगे।) यह 697 है:
shared void footprint() {
if (exists s = process.arguments[0]) {
if (s == "test") {
print(0);
} else {
print(sum({ 0, for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
}
}
हम विशेष आवरण "test"
स्ट्रिंग के लिए एक समान सिद्धांत लागू कर सकते हैं : जैसा कि उस स्थिति में परिणाम 0 है (अर्थात योग में कुछ भी योगदान नहीं है), हम इसे केवल योग के एक हिस्से के रूप में कर सकते हैं (लेकिन हमें स्थिति को उल्टा करना होगा) । यह मुख्य रूप से हमें बचाता है print(0);
, कुछ ब्रेसिज़ और इंडेंटेशन रिक्त स्थान का एक गुच्छा, 571 के पदचिह्न तक नीचे आ रहा है:
shared void footprint() {
if (exists s = process.arguments[0]) {
print(sum({ 0, if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
}
हम पहले के लिए भी ऐसा ही करते हैं if
, साइड इफ़ेक्ट के साथ कि अब बिना तर्क के भी 0
कुछ नहीं करने के बजाय आउटपुट देता है । (कम से कम मैंने सोचा था कि यहाँ होगा, इसके बजाय यह एक अनन्त लूप के साथ लटका हुआ लगता है? अजीब।)
shared void footprint() {
print(sum({ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
हम वास्तव में यहां फ़ंक्शन के ()
लिए छोड़ सकते sum
हैं, एक वैकल्पिक फ़ंक्शन कॉल सिंटैक्स का उपयोग कर सकते हैं, जो {...}
इसके बजाय का उपयोग करता है ()
, और पुनरावृत्त तर्कों में समझ भर देगा। यह पदचिह्न 538 है:
shared void footprint() {
print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}
फ़ंक्शन नाम footprint
(40) को p
(3) से बदलकर अन्य 37 बिंदुओं को सहेजता है, जो हमें 501 तक पहुंचाता है। (सीलोन फ़ंक्शन नामों को कम केस वर्णों से शुरू करना पड़ता है, इसलिए हम यहां 3 अंक से कम नहीं प्राप्त कर सकते हैं।)
shared void p() {
print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}
चर नाम s
(5) और c
(4), i
(4) भी इष्टतम नहीं हैं। आइए उन्हें a
(तर्क), d
(अंक?) b
(बिट-इंडेक्स) द्वारा प्रतिस्थापित करें । पदचिह्न 493:
shared void p() {
print(sum{ 0, if (exists a = process.arguments[0]) if (a != "test") for (c in a) for (b in 0..7) if (c.integer.get(b)) 1 });
}
मुझे कोई शेष नॉन-व्हॉट्सएप ऑप्टिमाइज़ेशन दिखाई नहीं देता है, इसलिए आइए गैर-आवश्यक व्हाट्सएप को हटा दें (प्रत्येक स्थान के लिए 1 बिंदु, प्रत्येक दो लाइन ब्रेक के लिए दो):
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.integer.get(b))1});}
API ब्राउज़ करते समय, मैंने पाया कि Character.hash वास्तव में इसकी integer
विशेषता के समान मूल्य देता है । लेकिन इसमें 30 के बजाय सिर्फ 14 अंक हैं, इसलिए हम 451 पर आ गए!
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}