ASCII कला गोल्फ के लिए टिप्स


18

मुझे लगता है कि PPCG पर ASCII कला प्रश्न करने में मज़ा आता है, लेकिन व्यक्तिगत रूप से मुझे लगता है कि यह बहुत कठिन हो सकता है, खासकर जब प्रश्न को रूप में टैग किया जाता है ।

मुझे आश्चर्य है कि अगर यहां किसी के पास कुछ सुझाव हो सकते हैं जो एएससीआईआई कला के उत्पादन के लिए उपयोगी होंगे।

बस वर्णों को व्यवस्थित करना आसान है, लेकिन (लघु) एल्गोरिदम के साथ, चीजें अधिक जटिल हो जाएंगी।

मैं ASCII कला के बारे में बात कर रहा हूँ जैसे:

  • ASCII कला के लिए पाठ (अक्षर)
  • छवियाँ (लोगो या आइकन)

मैं सिर्फ सामान्य युक्तियों की तलाश कर रहा हूं, लेकिन भाषा-विशेष की अनुमति है क्योंकि उनमें से अधिकांश किसी भी तरह अनुवादित किए जा सकते हैं।

जवाबों:


8

संपीड़न एल्गोरिदम

आप स्ट्रिंग को LZMA संपीड़न लागू कर सकते हैं।
कई भाषाएं इसका समर्थन करती हैं।

रन-लंबाई एन्कोडिंग

आप प्रसंस्करण निर्देशों का उपयोग कर सकते हैं जैसे [char][number](जैसे b12)।
इस संपीड़न एल्गोरिदम का उपयोग यहां किया गया है: /codegolf//a/20589/10920

आगे पढ़े: http://en.wikipedia.org/wiki/Run-length_encoding

पूर्णांक पैकिंग

आप छोटे आकार को संग्रहीत करने के लिए पूर्णांकों के सरणियों का उपयोग कर सकते हैं जैसे:

// This is an invader!
// (SE line height makes it looks awful)
// ~158 characters

    ##          ##    
      ##      ##      
    ##############    
  ####  ######  ####  
######################
##  ##############  ##
##  ##          ##  ##
      ####  ####       

प्रत्येक स्थान का अनुवाद एक में किया जाएगा 0
प्रत्येक तीखे का अनुवाद किया जाएगा 1

// ~58 characters
// Saved ~100 bytes!
[
  196656,  49344,   262128,  999228,
  4194303, 3407859, 3342387, 62400
]

प्रत्येक बिट तब बिटवाइज़ ऑपरेटर का उपयोग करके पढ़ा जाता है &

एक बड़े पूर्णांक आधार का उपयोग करके उपरोक्त एल्गोरिथ्म में सुधार किया जा सकता है:

// ~44 characters
// Integers are in base 36.
// Use `_` as a separator (or a line break).
"47qo_122o_5m9c_lf0c_2hwcf_211ir_1zn03_1c5c"

3
आपके प्रसंस्करण निर्देशों को सामान्यतः रन-लेंडिंग एन्कोडिंग , FYI के रूप में जाना जाता है ।
फायरफली

@FireFly धन्यवाद! मुझे नहीं पता था कि इसके लिए एक नाम था।
फ्लोरेंट

बराबर (मेरी भाषा) में इसे और बढ़ाया जा सकता है क्योंकि यह पूर्णांक 62 तक एन्कोड किए गए पूर्णांक का समर्थन करता है:[0-9A-Za-z]
Cyoce

5

समरूपता के लिए देखें

कभी-कभी आवश्यक ASCII कला कुछ बिंदु पर सममित होती है। उदाहरण के लिए, Argyle ASCII Art को इसके समान आउटपुट की आवश्यकता होती है:

    /\        /\
   /  \  /\  /  \
/\/    \/  \/    \/\
\/\    /\  /\    /\/
   \  /  \/  \  /
    \/        \/

कोई भी इसे सामान्य रूप से प्रिंट कर सकता है, लेकिन भाषा के आधार पर, आवश्यक कोड को परिणाम के शीर्ष आधे हिस्से को उत्पन्न करके छोटा किया जा सकता है, इसे उलटा और स्वैपिंग /और \

रोपाई का प्रयास करें

में ASCII कला तीरंदाजी तीर प्रिंट परिणाम यह है, किसी दिए गए के अनुसार आकार n:

     /\
    /  \
   /    \
  /      \
  \      /
   \____/
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
   /|  |\
  / |  | \
 /  |  |  \
/   |  |   \
/   |  |   \
/   |__|   \
/  /    \  \
/ /      \ \
//        \\
/          \

यदि हम तीर पर एक नज़र डालें, तो हम देख सकते हैं कि 8 प्रकार की लाइनें हैं:

/ \
\ /
\_/
| |
/ | | \
/ |_| \
/ / \ \
/ \

आइए इसके संक्रमण के लिए समान प्रयास करें।

                         ///////
                        /     / 
   /\                  /     /  
  /  \                /     /   
 /   _||||||||||||||||||||||    
/    _                     _    
\    _                     _    
 \   _||||||||||||||||||||||    
  \  /                \     \   
   \/                  \     \  
                        \     \ 
                         \\\\\\\

यहां, 10 प्रकार की लाइनें हैं।

/
/ /
/ \ / /
/ _|
/ _ _
\ _ _
\ _|
\ / \ \
\ \
\

लेकिन यहाँ पकड़ है: नीचे 5 गमागमन /और को छोड़कर, शीर्ष 5 के समान हैं \। पिछले नियम के अनुसार, आप पहले 5 उत्पन्न कर सकते हैं, कॉपी कर सकते हैं, स्वैप कर सकते हैं, और अंत में तीर प्राप्त करने के लिए स्थानांतरित कर सकते हैं। इससे बहुत सारे कोड को बचाया जा सकता है।


5

नियंत्रण वर्ण, क्रम और भागने कोड को नियंत्रित करें

जब तक सवाल उन्हें मना नहीं करता है, मेटा पर वर्तमान सहमति यह है कि ASCII कला चुनौतियों को एक विशिष्ट बाइट स्ट्रीम की आवश्यकता नहीं है, लेकिन आउटपुट जो सही दिखता है।

इसका मतलब यह है कि हम अपने जवाबों में ASCII कंट्रोल कैरेक्टर्स , ANSI एस्केप सीक्वेंस और लिनक्स कंसोल कोड का उपयोग कर सकते हैं ।

जब तक अन्यथा निर्दिष्ट नहीं किया जाता है, इस उत्तर के बाकी लिनक्स टर्मिनलों के व्यवहार की व्याख्या करेंगे, जो कि मेरे पास अभी परीक्षण के लिए उपलब्ध है।

ASCII नियंत्रण वर्ण

समर्थन / व्याख्या टर्मिनल से टर्मिनल और चरित्र से चरित्र में भिन्न होती है। सबसे पोर्टेबल एक linefeed (होना चाहिए \n, \x0a) है, जो अगली पंक्ति की शुरुआत करने के लिए चरित्र ले जाता है।

अन्य उपयोगी पात्रों में शामिल हैं:

  • ऊर्ध्वाधर टैब ( \v, \x0b) कर्सर को एक स्थिति सही करने के लिए, एक स्थान नीचे ले जाता है तो।

    $ echo -e 'a\vb'
    a
     b
    
  • गाड़ी वापसी ( \r, \x0d) की शुरुआत के लिए कर्सर ले जाता है वर्तमान लाइन। कोई भी बाद का मुद्रण योग्य वर्ण वर्तमान पंक्ति के पहले वर्ण को अधिलेखित कर देगा।

    $ echo -e 'ab\rc'
    cb
    
  • बैकस्पेस ( \b, \x08) बाईं ओर कर्सर एक स्थान ले जाता है। कोई भी बाद में मुद्रित करने योग्य वर्ण बैकस्पेस से पहले वर्ण को अधिलेखित कर देगा।

    $ echo -e 'ab\bc'
    ac
    
  • भागने ( ) \e, \x1bअपने दम पर कुछ भी नहीं करता है, लेकिन एएनएसआई एस्केप सीक्वेंस (वैकल्पिक रूप से) और लिनक्स कंसोल कोड का हिस्सा बनता है।

कई भाषाएँ स्रोत कोड में वास्तविक नियंत्रण वर्णों को अनुमति देती हैं।

एएनएसआई बच क्रम

(अभी आने वाला है)

लिनक्स कंसोल कोड

हालांकि कई और भी हैं, ASCII कला के लिए सबसे उपयोगी कंसोल कोड शायद ये हैं:

  • अनुक्रम टर्मिनल \ecको रीसेट करेगा । यह स्क्रीन को साफ करता है, कर्सर को ऊपरी बाएँ कोने में मिटा देता है और उनके डिफ़ॉल्ट मानों के आगे और पीछे का रंग, कर्सर ब्लिंकिंग रेट आदि सेट करता है।

  • अनुक्रम रिवर्स लाइनफीड का\eM कारण बनता है , अर्थात, कर्सर एक स्थिति को ऊपर ले जाएगा।

    $ echo -e '\na\eMb\n'
     b
    a
    
  • अनुक्रम वर्तमान स्तंभ पर टैब स्टॉप\eH सेट करता है ।

    $ echo -e '   \eHa\n\tb'
       a
       b
    

2

पैटर्न के लिए देखो

यह थोड़ा स्पष्ट हो सकता है, लेकिन ... आउटपुट में पैटर्न, समानता और दोहराव की तलाश करें। उदाहरण के लिए, जब मैंने 7-सेगमेंट डिस्प्ले पैटर्न टास्क में ट्रांसफॉर्म नंबर देखा तो मैं सोचने लगा कि कोई इसे कैसे गोल्फ सकता है, और समानता की तलाश शुरू कर देता है। जिस तरह से क्षैतिज खण्ड चरित्र मैट्रिक्स में ऊर्ध्वाधर वाले के बीच जाते हैं, एक समय में तीन खंडों से निपटना सबसे आसान होगा, इस तरह से एक साथ समूहीकृत किया गया (पहले के लिए दो "हमेशा खाली" खंडों को जोड़कर, सबसे ऊपर एक) :

सेगमेंट ग्रोपिंग

इस प्रकार, आप की तरह कुछ कर सकता है lc + " "*N + rc + "\n"N-1 बार और फिर lc + bc*N + rcएक बार, हर तीन क्षेत्रों के लिए ( lc, bc, rcबाईं, bottom-, और सही खंड वर्ण, यानी में से एक होने |, _या  )।


2

आधार रूपांतरण का उपयोग करें

यह जवाब एक सवाल था जो एएससीआईआई कला चाहता था जिसमें पात्रों + |-और नई कहानियों का समावेश था । चूंकि केवल 5 संभावित वर्ण हैं, इन्हें आधार 5 नंबर के रूप में माना जा सकता है और बाइट्स में परिवर्तित किया जा सकता है, प्रति बाइट में 3.45 वर्ण पैकिंग करते हैं।

नियमितता को उजागर करें

अक्सर, डेटा में कुछ नियमितताएँ होंगी, भले ही वे नियमितताएँ विशिष्ट उपकरण जैसे मिररिंग को नियोजित करने के लिए पर्याप्त मजबूत न हों। उदाहरण के लिए, उपरोक्त प्रश्न में, वांछित आउटपुट में नए सिरे से समान रूप से समान रूप से पूरे परीक्षण में स्थान दिया गया था, क्योंकि पाठ मोटे तौर पर आयताकार था। मैंने अपने कोड को छोटा करने के लिए इसका शोषण किया, पायथ के विभाजन को n टुकड़ों में उपयोग करके, फिर नई सुर्खियों में शामिल किया।

अपने औजारों को जानें, और नौकरी के लिए सही चुनें।

मेरे द्वारा ज्ञात सबसे शक्तिशाली और कुशल टेक्स्ट प्रोसेसिंग टूल हैं:

रेगेक्स इंजन:, ///रेटिना, पर्ल, शक्ति / सुगमता व्यापार के क्रम में।

यदि आप जिस चीज को करना चाहते हैं, उसका उपयोग करें, जैसे कि रेगेक्स सबस्टीट्यूशंस में, संक्षेप में वर्णित किया जा सकता है इस उत्तर के

अस्पष्ट टेक्स्ट-प्रोसेसिंग टूल: gema, आदि (मुझे यकीन है कि अन्य भी हैं, लेकिन वे बहुत अस्पष्ट हैं)

उपयोग करें यदि उनके पास एक विशेषता है जो वास्तव में आपकी आवश्यकता है, जो कुछ और नहीं है। जैसे कि इसमें इस प्रश्न में , gema के पुनरावर्ती मिलान के साथ।

सामान्य कोड गोल्फिंग भाषाएँ: सीजाम, पायथ, आदि।

यदि आप कुछ सूक्ष्मता से जटिल का उपयोग कर रहे हैं कि कोई अन्य उपकरण काम नहीं करेगा या यह काम कम करता है।

कई तरीकों की कोशिश करो

यह हर कोड-गोल्फ प्रश्न में लागू होता है, लेकिन विशेष रूप से यहां। जब तक आप इसे आज़मा नहीं लेते, आपको पता नहीं चलता कि क्या नियमितता शोषक है। संभवतः कई भाषाओं में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.