स्मॉलटाक स्क्वैक 4.x स्वाद कई बाइट्स!
मैं 71 चार्जर में इंटेगर में एक पुनरावर्ती रूप को लागू कर सकता था
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
फिर एक फ़ाइल या FileStream स्टड से पढ़ने से मुझे एक हाथ खर्च होगा ... स्क्वेक स्पष्ट रूप से स्क्रिप्टिंग भाषा के रूप में डिज़ाइन नहीं किया गया था। इसलिए मैं समस्या से असंबंधित अपनी सामान्य उद्देश्य उपयोगिताओं को बनाने के लिए कई बाइट्स खर्च करूंगा:
स्ट्रीम में इस 21 चार विधि को लागू करें (सीपैटर्स को छोड़ने के लिए)
s self skipSeparators
व्यवहार में इस 20 चार विधि को लागू करें (एक स्ट्रीम से एक उदाहरण पढ़ने के लिए)
<s^self readFrom:s s
फिर स्ट्रिंग में 28 वर्ण (फ़ाइल हैंडल बनाने के लिए)
f^FileDirectory default/self
फिर FileDirectory में 59 चार्ट्स (एक readStream बनाने के लिए)
r^FileStream concreteStream readOnlyFileNamed:self fullName
फिर ब्लॉक क्लोजर में 33 बार (इसका मूल्यांकन करने के लिए n बार)
*n^(1to:n)collect:[:i|self value]
तब ऐरे में 63 चार्ट (रिसीवर से तर्क और एरे से ली गई दलीलों का मूल्यांकन करें)
`s^self first perform:s asSymbol withArguments:self allButFirst
तो x नाम की फ़ाइल से पढ़ने के लिए कहीं भी इस 31 चार स्निपेट का मूल्यांकन करके समस्या को हल करें
|s|s:='x'f r.[0class<s]*3`#f:n:
उपयोगिताओं की गिनती के बिना भी, यह 71 + 31 = 102 चार्ट पहले से ही है ...
अब, जब से मैं कोडगुल्फ को खोना सुनिश्चित कर रहा हूं, मेरे पास इंटेगर में एक मजेदार कार्यान्वयन है:
doesNotUnderstand:m
(m selector allSatisfy:[:c|c=$+])or:[^super doesNotUnderstand:m].
self class compile:
m selector,'y y=0or:[^(2to:y)inject:self into:[:x :i|self'
,m selector allButLast,'x]].^'
,(Character digitValue:()asBit)
,(m selector size-2min:1)hex last.
thisContext sender restart
यह विधि परिभाषित करेगी (संकलन) n + से बना एक द्विआधारी संदेश यदि यह मौजूद नहीं है (संदेश एम के रिसीवर द्वारा समझा नहीं जाता है), और प्रेषक संदर्भ की शुरुआत में निष्पादन को फिर से शुरू करेगा। मैंने पठनीयता के लिए अतिरिक्त गाड़ी वापसी और स्थान सम्मिलित किए।
ध्यान दें कि (m selector size-2min:1)hex last
एक छोटा रूप है (m selector size>2)asBit printString
।
यदि यह स्मॉलटॉक बुराई महाशक्तियों को प्रदर्शित करने के लिए नहीं था, तो अंतिम विवरण को छोटे और सरल द्वारा प्रतिस्थापित किया जा सकता है
^m sendTo:self
अब वर्ण में 28 वर्ण उपयोगिता लागू करें (इसे स्ट्रिंग में n बार दोहराने के लिए)
*n^String new:n withAll:self
फिर इस 43 वर्ण अभिव्यक्ति का मूल्यांकन करें:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
हम इंटेगर में लागू करके 10 और चार्टों में तेजी ला सकते हैं:
++y^self*y
और इस मामले में हम भी है क्योंकि हम जगह ले सकता है कम कोड है ^',(m selector size-2min:1)hex last
साथ^1'
इतनी अधिक कीमत के लिए, कोड दूसरे पूर्णांक के साथ काम करता है = 0 :)
n=1
? यदि यह है ,x+y
या वापस लौटना चाहिएx+1
1 1 1
2