क्या आप मेरे टर्मिनल को कम उबाऊ बना सकते हैं?


11

टर्मिनल इन दिनों बहुत उबाऊ हैं । वे इस तरह दिखते थे:

टर्मिनल 1 टर्मिनल 2

अब वे सिर्फ गोरे और सुस्त और काले-गोरे हैं। मैं चाहता हूं कि आप मुझे एक कार्यक्रम लिखें, जो मेरे टर्मिनल को फिर से रंगीन बना देगा!

विवरण

इस उदाहरण को रूबी कोड लें:

उदाहरण कोड

अधिकांश लिनक्स टर्मिनल इन एस्केप अनुक्रमों ( \eएस्केप चरित्र के लिए खड़ा है) का समर्थन करते हैं, और विंडोज उन्हें ANSICON के साथ समर्थन कर सकते हैं । यहां विशिष्ट एस्केप सीक्वेंस का सिंटैक्स है जो किसी स्ट्रिंग के टेक्स्ट या बैकग्राउंड कलर को बदल सकता है:

\e[{{COLOR}}m

जहां \eभागने के चरित्र ( 0x1BASCII में) के लिए खड़ा है और {{COLOR}}उस रंग की संख्या से बदल दिया जाता है जिसे आप उपयोग करना चाहते हैं (बाद में अधिक विवरण)। इस एस्केप सीक्वेंस के बाद आने वाले टेक्स्ट को निर्देशानुसार फॉर्मेट किया जाएगा, और 0सभी फॉर्मेटिंग को रीसेट कर दिया जाएगा।

आपकी चुनौती कुछ ऐसे टेक्स्ट को निर्दिष्ट करने के लिए है जिसमें रंग शामिल हो सकता है, और इसका एक रंगीन संस्करण आउटपुट कर सकता है।

इनपुट आउटपुट

सामान्य पाठ सामान्य की तरह काम करता है, और शाब्दिक रूप से मुद्रित होता है। उदाहरण के लिए, इनपुट wafflesसमान आउटपुट देता है, जिसमें कोई विशेष रंग नहीं होता है।

रंग निर्दिष्ट करने के लिए सिंटैक्स, विकिपीडिया के सिंटैक्स के समान है । उदाहरण के लिए, वाक्य में लाल रंग में "रंग लाल" शब्दों को रंगने के लिए, This is the color red!इनपुट होगा:

This is {{red|the color red}}!

पृष्ठभूमि के रंग भी काम करते हैं। यदि आप एक सफेद पृष्ठभूमि पर काले अक्षर चाहते हैं, तो आप इसका उपयोग करेंगे:

{{black|white|This text is black on white}}

केवल एक पृष्ठभूमि रंग प्राप्त करने के लिए, अग्रभूमि को छोड़ दें:

{{|red|This text has a red background}}

विशिष्टता

दो खुले घुंघराले कोष्ठक हमेशा एक रंग निर्देश की शुरुआत को निर्दिष्ट करते हैं । दो समापन घुंघराले कोष्ठक अंत निर्दिष्ट करते हैं। ब्रैकेट हमेशा मेल खाएंगे; वहाँ {{एक इसी के बिना कभी नहीं होगा }}, और }}अपनी इसी से पहले कभी नहीं आएगा {{। इन रंग निर्देशों को नस्ट नहीं किया जाएगा, और {{रंग निर्देशन में कभी दिखाई नहीं देगा।

एक रंग निर्देश के भीतर, हमेशा एक या दो |प्रतीक होंगे। यदि एक है, तो पाठ से पहले यह अग्रभूमि रंग है और पाठ उस रंग में दिखाने के लिए स्ट्रिंग है। यदि दो हैं, तो पहले वाले पाठ से पहले अग्रभूमि रंग है, पाठ पहले के बाद लेकिन दूसरे से पहले पृष्ठभूमि का रंग है, और दूसरे के बाद का पाठ प्रदर्शित करने के लिए स्ट्रिंग है। ये ऊर्ध्वाधर पट्टियाँ एक रंग निर्देश के बाहर मौजूद हो सकती हैं, और इसे शाब्दिक रूप से मुद्रित किया जाना चाहिए।

अग्रभूमि रंग या पृष्ठभूमि रंग (लेकिन दोनों नहीं) खाली हो सकता है, जिस स्थिति में आपको उन्हें डिफ़ॉल्ट के रूप में छोड़ देना चाहिए। अंतिम स्ट्रिंग (आउटपुट में एक) कभी खाली नहीं होगी।

यहां एक निश्चित रंग के टेक्स्ट को आउटपुट करने की दिशाएं दी गई हैं:

  • एक रंग अनुक्रम "विवरण" खंड में परिभाषित किया गया है। उदाहरण के लिए, 42 का रंग क्रम होगा "\e[42m"

  • रंग सेट करने के लिए, नीचे निर्धारित संख्या का रंग क्रम प्रिंट करें:

     Color name   | Color sequence number (foreground / background)
    --------------+----------
     black        | 30 / 40
     red          | 31 / 41
     green        | 32 / 42
     yellow       | 33 / 43
     blue         | 34 / 44
     magenta      | 35 / 45
     cyan         | 36 / 46
     lightgray    | 37 / 47
     darkgray     | 90 / 100
     lightred     | 91 / 101
     lightgreen   | 92 / 102
     lightyellow  | 93 / 103
     lightblue    | 94 / 104
     lightmagenta | 95 / 105
     lightcyan    | 96 / 106
     white        | 97 / 107
    
  • रंग नाम केस संवेदी हैं, और अमान्य रंग नाम कभी प्रदान नहीं किया जाएगा। आपको ( REDया के lightgreyसाथ वर्तनी e) जैसे सामान को संभालने की आवश्यकता नहीं है ।

  • आपके द्वारा रंग क्रम मुद्रित करने के बाद, यह उसके बाद के सभी पाठ के लिए लागू होगा। एक रंग अनुक्रम (डिफ़ॉल्ट रंग पर रीसेट) को समाप्त करने के लिए, 0( "\e[0m") के रंग अनुक्रम को आउटपुट करें ।

परीक्षण का मामला

 {{|yellow|     }}
{{|yellow| }}     {{|yellow| }}
{{|yellow| }} {{red|'}} {{red|'}} {{|yellow| }}
{{|yellow| }} \_/ {{|yellow| }}
{{|yellow| }}     {{|yellow| }}
 {{|yellow|     }}

यह एक स्माइली चेहरे का उत्पादन करना चाहिए ... बुरी लाल आंखों के साथ।

नियम

  • हो सकता है कि आप किसी रंग को पार्स करने के लिए अपनी प्रोग्रामिंग लैंग्वेज के किसी भी लाइब्रेरी या फंक्शन का इस्तेमाल न करें। इसका मतलब यह है कि आप का"red" मतलब निर्धारित करने के लिए एक होना चाहिए ; आपके पास अपने लिए एक पुस्तकालय नहीं है।

  • यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाएगा!


यह वास्तव में एक टर्मिनल माना जाता है? या सिर्फ एक रंगीन पाठ दर्शक? यह आज्ञाओं को चलाने वाला है?
नाथन मेरिल

मुझे इसका परीक्षण करना कठिन लग रहा है। निर्दिष्ट सिंटैक्स का उपयोग करके मुझे जो कुछ भी एसटीडी के लिए भेजा जाता है वह सादे पाठ में आता है। मेरी बैश प्रोफ़ाइल एक रंगीन प्रॉम्प्ट का उपयोग करती है, इसलिए मैंने \n\[\e[32m\]\w\n\[\e[0m\]> उससे चोरी करने की कोशिश की (हरी निर्देशिका का नाम, अगली पंक्ति पर सादा संकेत), लेकिन मैं इसे किसी प्रोग्राम से काम करने की कोशिश नहीं कर सकता (अभी तक अजगर और जावा की कोशिश की)। कोई विचार?
Geobits

@Geobits प्रयास करें echo -e "\e[31mtest\e[0m"
दरवाज़े

4
मुझे लगता है कि आपको मज़ा आएगा lolcat
एको

1
मुझे लगता है कि उनके द्वारा youलाक्षणिक your programरूप से इसका मतलब है (जैसा कि एक लाइब्रेरी फंक्शन के लिए कॉल का विरोध किया जाता है), और यह कि वह determineउस अर्थ में लेते हैं , जैसे कि figure outनहीं choose। यानी, यह आपका कार्यक्रम है जिसे मानचित्रण को संभालना चाहिए: स्ट्रिंग ("लाल") | -> पूर्णांक (31)। redकेवल 31इसलिए कि वह ऐसा कहता है, उस जानकारी को कार्यक्रम में एकीकृत करने की आवश्यकता है। हालाँकि, यह तर्क दिया जा सकता है कि वास्तव में क्या गिना जाएगा your program- क्या हम सामान्य प्रयोजन स्ट्रिंग हेरफेर कार्यों का उपयोग कर सकते हैं? - धोखा / गाली न दें।
blutorange

जवाबों:


6

रूबी, 205 189 188 186 185 182 174 170 165 161 159 154 बाइट्स

अपने कोड में रंग नामों के लंबे तार लगाना पर्याप्त नहीं दिखता है।

170 से नीचे आंशिक रूप से धन्यवाद rubik। अब स्क्रॉलिंग बार चले गए हैं!

एक स्पष्ट और एक इतना स्पष्ट सुधार नहीं है, फ्लेक्स उत्तर के लिए धन्यवाद, इसमें सुधार के बिना, मैंने इस पर दोबारा गौर नहीं किया होगा!

अब और नहीं, मैंने #sum के साथ 4 बाइट्स बचाए। मैंने इसका इरादा नहीं किया था, लेकिन मैंने देखा कि यह समाधान केस-असंवेदनशील है। यह खुशी से प्रक्रिया करता है {{RED|Red text}}

हेक्स डंप:

0000000: 7a3d 2d3e 6a7b 693d 2240 3054 2d44 1547  z=->j{i="@0T-D.G
0000010: 5155 0034 3256 2f46 1749 0b22 2e69 6e64  QU.42V/F.I.".ind
0000020: 6578 2028 415b 6a5d 2e74 6f5f 732e 7375  ex (A[j].to_s.su
0000030: 6d25 3839 292e 6368 723b 692b 3d69 3e39  m%89).chr;i+=i>9
0000040: 3f38 303a 3330 7d0a 243e 3c3c 243c 2e72  ?80:30}.$><<$<.r
0000050: 6561 642e 6773 7562 282f 7b7b 282e 2a3f  ead.gsub(/{{(.*?
0000060: 297d 7d2f 297b 413d 2431 2e73 706c 6974  )}}/){A=$1.split
0000070: 277c 273b 221b 5b25 693b 2569 6d23 7b41  '|';".[%i;%im#{A
0000080: 2e70 6f70 7d1b 5b30 6d22 255b 7a5b 305d  .pop}.[0m"%[z[0]
0000090: 2c31 302b 7a5b 315d 5d7d                 ,10+z[1]]}

आप इसके साथ परिवर्तित कर सकते हैं xxd -r hex.dump

सभी गैर-मुद्रण योग्य वर्णों वाला कार्यक्रम संदर्भ उद्देश्यों के लिए बच गया:

z=->j{i="@0T-D\x15GQU\x0042V/F\x17I\v".index (A[j].to_s.sum%89).chr;i+=i>9?80:30}
$><<$<.read.gsub(/{{(.*?)}}/){A=$1.split'|';"\x1b[%i;%im#{A.pop}\x1b[0m"%[z[0],10+z[1]]}

वह एक पंक्ति है। इसे इस तरह इस्तेमाल करें

ruby colors.rb -W0 < input.txt

-W0झंडा चेतावनी है कि करने के लिए भेज दिया जायेगा को दबा stderrनहीं तो। हालांकि, कार्यक्रम बिना किसी झंडे के ठीक काम करता है।

आउटपुट:

उत्पादन


1
आह, मेरे पास एक ही विचार था, लेकिन आपने मुझे हरा दिया! मुझे लगता है कि आप आधार 35, मापांक 98 और xor 1 के साथ एक चार्ट बचा सकते हैं। स्ट्रिंग यह होगा '1?IYU_N[(\x0c\x16&",\x1f\x01':। मेरी स्ट्रिंग 16 लंबाई की है। मुझे लगता है कि तुम्हारा 18 साल का है, इसलिए तुम्हें शायद समायोजित करना होगा।
रुबिक

धन्यवाद। दो एडिटिव बाइट्स कलर कोड 39/49 को सपोर्ट करने के लिए हैं, जो डिफॉल्ट बैक / फोरग्राउंड कलर सेट करता है। लेकिन टिप के लिए धन्यवाद, मैं वर्तमान में काम पर हूं और जब मैं घर वापस आऊंगा तो मैं इसे कुछ और सोचूंगा।
blutorange

1
वैसे मैंने देखा कि आपके द्वारा उपयोग किए जाने वाले एकमात्र आधार 35 और 36 हैं (कम से कम पायथन का int()कार्य 36 से अधिक नहीं हो सकता है)। तब मैंने मापांक (2 से 10000 तक) के लिए सभी संयोजनों की कोशिश की, लेकिन सिद्धांत रूप में एक यूनिकोड के सभी के लिए खोज को चौड़ा कर सकता था ) और एक्सोर के लिए, जिसे मैंने छोटा (1 से 9) रखा। तब मैंने केवल उन स्वीकार्य परिणामों पर विचार किया जिनमें डुप्लिकेट वर्ण नहीं थे।
रबिक

हां, कमोबेश यही मैंने भी किया। मूल रूप से, मैं खुद को प्रिंट करने योग्य पात्रों तक सीमित कर रहा था, क्योंकि इससे आपको सिरदर्द कम होता है और अच्छा लगता है। लेकिन जब से मैं पहले से ही भागने के अनुक्रम के बजाय बाइट 0x1e का उपयोग कर रहा हूं, तो मैं अधिक गैर-मुद्रण योग्य वर्णों का उपयोग कर सकता हूं। प्रिंट करने योग्य पात्रों को प्राप्त करने के लिए, मैंने उपयोग किया x.to_i(base)%mod+offset। मैंने इसके +साथ बदल दिया ^, क्योंकि अच्छी तरह से, यह कूलर दिखता है। इसके अलावा, यह अस्वाभाविक है। गिराने ^99और बदलते <<करने के लिए +और अधिक बाइट्स के लिए बचा लिया। टिप के लिए धन्यवाद, मैंने अन्यथा ध्यान नहीं दिया होगा!
ब्लुटोरांगे

4

रूबी, 329 बाइट्स।

h={};(y=0..15).each{|i|h[%w(black red green yellow blue magenta cyan lightgray darkgray lightred lightgreen lightyellow lightblue lightmagenta lightcyan white)[i]]=y.map{|j|[30,40].map{|k|k+i%8+i/8*60}}[i]}
loop{puts gets.gsub(/{{.+?}}/){|x|"\e[#{h[(g=x.scan(/[^{}|]+/))[0]][0]}m#{(g[2]? "\e[#{h[g[1]][1]}m":'')}#{g.last}\e[0m"}}

मुझे इसे चलाने के लिए रूबी के किस संस्करण की आवश्यकता है? मैं इस्तेमाल किया ruby 2.1.2p95और यह त्रुटि फेंक undefined method 'gsub' for nil:NilClass (NoMethodError) :।
रे

हाय @ रे, यह 2.0.0-p451 में काम करता है। मैंने इसे 2.1.2 में आज़माया नहीं था। यहाँ यह एक स्क्रिप्ट के रूप में काम करता है और यहाँ यह irb में काम करता है
एलेक्स देव

यह काम करता है जब आप पाठ को मैन्युअल रूप से दर्ज करते हैं। यदि आप करते हैं ruby colors.rb < input.txt, तो यह सभी इनपुट पढ़ने के बाद लूपिंग रखेगा। फिर getsरिटर्न nil, जो एक #gsubविधि के अधिकारी नहीं है , इस प्रकार एक त्रुटि उठा रहा है। के $><<$<.readबजाय का उपयोग करें loop{puts gets, यह भी कम है; )
ब्लुटोरेंज

मैंने सिर्फ स्माइली फेस के साथ इस स्क्रिप्ट का परीक्षण किया (प्रश्न और मेरी पोस्ट से छवि देखें), और स्माइली के आसपास कोई पीला बॉर्डर नहीं है?
ब्लुटोरांगे

4

फ्लेक्स (लेक्सर) - 226 197 192 182 168 (या 166)

इसे 166 तक लाने के \33लिए, एक वास्तविक भागने चरित्र में बदलें ।

 int z;p(i){printf("\33[%dm",i);}
%%
"{{" z=2;
[a-z]*\| if(!z)REJECT;~-yyleng&&p("062q00t03058ns7uo0p90r4"[*(int*)&yytext[yyleng>7?4:0]%131%27]-10*z);z--;
"}}" p(z=0);

संकलित करें और चलाएं:

$ flex -o colour.c colour.l
$ gcc -o colour colour.c -lfl
$ ./colour < input

3

अजगर - 351

import re,sys
R=range
E=lambda n,d=0:'\033[%dm'%(T[n]+d)if n else''
def P(m):f,b,t=m.groups();return'%s%s%s\033[0m'%(E(f),E(b,10),t)
x='!red!green!yellow!blue!magenta!cyan'.replace
T=dict(zip(('black'+x('!',' ')+' lightgray darkgray'+x('!',' light')+' white').split(),R(30,38)+R(90,98)))
print re.sub(r'{{(\w+)?\|?(\w+)?\|?(.+?)}}',P,sys.stdin.read())

1

कोबरा - 496

यह लगभग सिंगल प्रिंट स्टेटमेंट हो सकता है।

use System.Text.RegularExpressions
class P
    def main
        print Regex.replace(Console.readLine,r'\{\{('+(l=List<of String>(((m=' black red green yellow blue magenta cyan'.split).join(' ')+' lightgray darkgray'+m.join(' light')+' white').split))[1:].join('|')+r')?\|?('+l[1:].join('|')+r')?\|(.*?)\}\}',do(a as Match))
            return if(x=l.indexOf('[a.groups[1]]'),r'\e['+'[if(x>8,x+81,x+29)]m','')+if(y=l.indexOf('[a.groups[2]]'),r'\e['+'[if(y>8,y+91,y+39)]m','')+'[a.groups[3]]'+if(x+y,r'\e[0m','')

1

पायथन, 561

स्टड से प्रारूप को पाठ पढ़ता है।

import re,sys
def p(f,b,t):
    p=''
    m='\033[%dm'
    if f!=0:p+=m%f
    if b!=0:p+=m%b
    return p+t+m%0
def c(n,b=0):
    s='black:30#red:31#green:32#yellow:33#blue:34#magenta:35#cyan:36#lightgray:37#darkgray:90#lightred:91#lightgreen:92#lightyellow:93#lightblue:94#lightmagenta:95#lightcyan:96#white:97'
    r=0
    for i in s.split('#'):
        (t,c)=i.split(':')
        if t==n:
            r=int(c)
            if b==1:r+=10
    return r
def r(m):
    i=m.groups()
    f=b=0
    if i[0]!='':f=c(i[0])
    if i[1]!=None:b=c(i[1],1)
    return p(f,b,i[2])
print re.sub('{{(\w*)\|(?:(\w*)\|)?([^}]+)}}',r,sys.stdin.read())

2
यह भी is not Noneएक कोडगॉफ़ में होने की क्रिया है। आप !=Noneउदाहरण के लिए उपयोग कर सकते हैं ।
रे

इसके अलावा, में def p(f,b,t), आपका कोड एक फेंक देगा ZeroDivisionError। कुछ भी आधुनिक 0 असंभव है।
बीटा डेके

@ BetaDecay एक पूर्णांक नहीं है जो मापांक है, यह एक स्ट्रिंग स्वरूपित किया जा रहा है।
सैममिच

मुझे इसे re.subचलाने में अमान्य सिंटैक्स त्रुटियाँ मिल रही हैं
ArtOfCode

(देर से टिप्पणी) क्या यह 499-बाइट कोड काम करता है?
आउटगोल्फ जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.