VI, 108 बाइट्स
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>
<CR>
है Enter
स्ट्रोक, <C-?>
से मेल खाती है Control + ?
, और <Esc>
करने के लिए Escape
स्पष्ट रूप से। 1 बाइट के लिए इनमें से प्रत्येक की गिनती ( मेटा देखें )। समाधान में लाइन ब्रेक पठनीयता के लिए है। केवल <CR>
वास्तविक Enter
स्ट्रोक का प्रतिनिधित्व करता है ।
इनपुट
इनपुट फ़ाइल में केवल 1 वर्ण होना चाहिए, जिसका प्रतिनिधित्व करना चाहिए n
।
प्रक्षेपण
VI को इस तरह शुरू किया जाना चाहिए:
vi -u NONE input
स्पष्टीकरण
समाधान में 3 भाग हैं। मैं पहले भाग (दूसरी पंक्ति) का वर्णन करूंगा, क्योंकि यह व्याख्या करना सबसे आसान है।
सूर्य को आकर्षित करना
सूर्य को आकर्षित करने की आज्ञा है:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
सूरज के साथ तैयार किया जाना चाहिए
, *
, 0
, 1
और 3
, इस तरह:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
एक समरूपता ने इस हिस्से के बाइट्स के आकार को कम करने में मदद की होगी, लेकिन यह उतना महत्वपूर्ण नहीं है। मैं पूरी लाइन की व्याख्या नहीं करूंगा, लेकिन पैटर्न *****
का उपयोग आसानी से अंतिम लाइन उत्पन्न करने के लिए किया जाता है, और पैटर्न **1110333**
को 3 अन्य लाइनों को उत्पन्न करने के लिए एक संदर्भ के रूप में लिया गया है 0
, 1
और 3
।
इसका उपयोग करना महत्वपूर्ण है 0
, 1
और 3
सूरज के हिस्सों के लिए जिसे भरा जा सकता है (अगले स्पष्टीकरण देखें)। इस सूरज को आकर्षित करने में 55 बाइट्स लगते हैं , और संभवत: इसे कुछ ट्रिकों के साथ चलाया जा सकता है।
सूर्य को अनुसार भरना n
सूरज को सही ढंग से भरने के लिए, पालन करने के निर्देश हैं:
- यदि
n = 0
, तब 0
, 1
और 3
(सभी अंक) को प्रतिस्थापित किया जाना चाहिए
- यदि
n = 1
, तो , के साथ अन्य अंकों के साथ 1
प्रतिस्थापित किया जाना चाहिए
*
- यदि
n = 2
, तब 0
, 1
और 3
(सभी अंक) को प्रतिस्थापित किया जाना चाहिए*
- यदि
n = 3
, तो , के साथ अन्य अंकों के साथ 3
प्रतिस्थापित किया जाना चाहिए
*
- यदि
n = 4
, तब 0
, 1
और 3
(सभी अंकों) को प्रतिस्थापित किया जाना चाहिए
(जैसे n = 0
)
उस से, हम अनुमान लगा सकते हैं कि आवश्यक प्रतिस्थापन निम्नलिखित हैं:
( पहले प्रतिस्थापन ) द्वारा कुछ अंकों को बदलें
*
( दूसरे प्रतिस्थापन ) द्वारा अन्य सभी अंकों को बदलें
ध्यान दें कि "कुछ अंक" का अर्थ "कोई अंक नहीं" हो सकता है ( n = 2
उदाहरण के लिए)। और "सभी अन्य अंक" भी "कोई अंक नहीं" का प्रतिनिधित्व कर सकते हैं, यदि सभी अंक पहले प्रतिस्थापन ( n = 0
उदाहरण के लिए) द्वारा प्रतिस्थापित किए गए हैं ।
दूसरा प्रतिस्थापन आसानी से में लिखा जा सकता है 11 बाइट्स :
:%s/\d/*/g<CR>
पहले प्रतिस्थापन पर निर्भर करता है n
, इसलिए पहले हम गणना करने के लिए क्या अंक प्रतिस्थापित किया जा करने के लिए जा रहे हैं। यदि प्रतिस्थापित वर्णों को रजिस्टर में संग्रहीत किया जाता है a
, तो प्रतिस्थापन कमांड को 11 बाइट्स में भी लिखा जाता है :
:%s/<C-r>a/ /g<CR>
<C-r>a
a
जब आदेश टाइप किया जाता है तो रजिस्टर की सामग्री द्वारा प्रतिस्थापित किया जाता है।
a
पिछले निर्देशों का पालन करते हुए, मान की गणना करने के लिए , एल्गोरिथ्म (छद्म कोड में) है:
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"
स्ट्रिंग का उपयोग तब किया जाता है क्योंकि जब n = 2
, कोई अंक रिक्त स्थान द्वारा प्रतिस्थापित नहीं किया जाता है। कोई भी स्ट्रिंग जो सूरज नहीं है, उसका उपयोग यहां किया जा सकता है, जब तक कि पहला प्रतिस्थापन कुछ भी नहीं करता है।
यह 31 बाइट्स में लिखा जा सकता है :
D # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
:let@a= # define register "a content
@"%2 # if (n % 2 != 0)
? # then
@" # n
: # else
@"%4 # if (n % 4 != 0)
? # then
"X" # "X"
: # else
"\\d" # "\\d"
<CR> # calculate "a
समाधान
इन सभी भागों को सही क्रम में रखें, और आपके पास इसका हल है:
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR> # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR> # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR> # replace the remaining digits with stars