আপনি কি আমার টার্মিনালটি কম বিরক্তিকর করতে পারেন?


11

টার্মিনাল আজকাল তাই বিরক্তিকর । তারা এ জাতীয় চেহারা দেখাত:

বন্দর 1 টার্মিনাল ২

এখন তারা কেবল কোমল এবং নিস্তেজ এবং কালো-সাদা। আমি চাই আপনি আমাকে এমন একটি প্রোগ্রাম লিখুন যা আমার টার্মিনালটিকে আবার রঙিন করে তুলবে!

বিবরণ

এই উদাহরণটি রুবি কোডটি নিন:

উদাহরণ কোড

বেশিরভাগ লিনাক্স টার্মিনালগুলি এই পালানোর ক্রমগুলি সমর্থন করে ( \eপালানোর চরিত্রের জন্য দাঁড়ায়), এবং উইন্ডোজ এএনসিকন দিয়ে তাদের সমর্থন করতে পারে । এখানে নির্দিষ্ট পালাবার ক্রমের বাক্য গঠন যা কোনও স্ট্রিংয়ের পাঠ্য বা পটভূমির রঙ পরিবর্তন করতে পারে:

\e[{{COLOR}}m

যেখানে \eপালানোর চরিত্রটি দাঁড়ায় ( 0x1Bএএসসিআইআই তে) এবং {{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"; আপনার কাছে কোনও লাইব্রেরি স্বয়ংক্রিয়ভাবে এটি করতে পারে না।

  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জিতবে!


এটি আসলে টার্মিনাল হওয়ার কথা? নাকি শুধু রঙিন পাঠ্য দর্শকের? কমান্ড চালানোর কথা?
নাথান মেরিল

আমি এটি পরীক্ষা করা কঠিন মনে হচ্ছে। নির্দিষ্ট সিনট্যাক্স ব্যবহার করে আমি STDOUT এ যা কিছু প্রেরণ করি তা সাধারণ পাঠ্যে আসে। আমার বাশ প্রোফাইলটি রঙিন প্রম্পট ব্যবহার করে, তাই চেষ্টা করে থেকে চুরি করে \n\[\e[32m\]\w\n\[\e[0m\]> (সবুজ ডিরেক্টরিের নাম, পরের লাইনে প্লেইন প্রম্পট), তবে আমি এটি কোনও প্রোগ্রাম (এ পর্যন্ত পাইথন এবং জাভা চেষ্টা করে) থেকে কাজ করতে পারি না। কোন ধারনা?
Geobits

@ জিওবিটস চেষ্টা করুন echo -e "\e[31mtest\e[0m"
ডুরকনব

4
আমার মনে হয় আপনি ভোগ করবে lolcat
আনকো

1
আমি মনে করি যে youতিনি রূপকভাবে উপায়ে your program(যেমন একটি লাইব্রেরি ফাংশন একটি কল বিরোধিতা), এবং যে তিনি লাগে determineঅর্থে figure outহিসেবে নয়, choose। অর্থাৎ এটি আপনার প্রোগ্রাম যা ম্যাপিংটি পরিচালনা করবে: স্ট্রিং ("লাল") | -> পূর্ণসংখ্যা (31)। তিনি redকেবল 31তাই বলেছিলেন, সেই তথ্য প্রোগ্রামে সংহত করা দরকার। যদিও এটি যুক্তিযুক্ত হতে পারে ঠিক কী হিসাবে গণনা করা যায় your program- আমরা কী সাধারণ-উদ্দেশ্যে স্ট্রিং ম্যানিপুলেশন ফাংশন ব্যবহার করতে পারি? - অসম্মানজনকভাবে প্রতারণা / গালাগালি করবেন না।
ব্লুটোরেঞ্জ করুন

উত্তর:


6

রুবি, 205 189 188 186 185 182 174 170 165 161 159 154 বাইট

আপনার কোডগুলিতে রঙের দীর্ঘ রঙের স্ট্রিংগুলি রাখার মতো যথেষ্ট নার্ডি লাগছে না।

নিচে আংশিক ধন্যবাদ 170 rubik। এখন স্ক্রোলিং বারগুলি চলে গেছে!

একটি সুস্পষ্ট এবং একটি এতটা সুস্পষ্ট উন্নতি নয়, এটির উন্নতি না করে ফ্লেক্স উত্তরের জন্য ধন্যবাদ, আমি এটি পুনর্বিবেচনা করতাম না!

আর নয়, আমি # সুম দিয়ে 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 সমর্থন করার জন্য রয়েছে যা ডিফল্টটিকে পিছনে / ভুলে যাওয়া রঙ সেট করে। তবে টিপটির জন্য ধন্যবাদ, আমি বর্তমানে কর্মক্ষেত্রে রয়েছি এবং ঘরে ফিরে আমি এটিকে আরও কিছু চিন্তাভাবনা করব।
ব্লুটোরেঞ্জ

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)
রায়

হাই @Ray, এটি 2.0.0-p451 এ কাজ করে। ২.১.২-এ আমি চেষ্টা করে দেখিনি। এখানে এটি স্ক্রিপ্ট হিসাবে কাজ করে এবং এখানে এটি আইআরবিতে কাজ করে
অ্যালেক্স দেবা

আপনি ম্যানুয়ালি পাঠ্য প্রবেশ করার সময় এটি কাজ করে। আপনি যদি ruby colors.rb < input.txtএটি করেন তবে সমস্ত ইনপুট পড়ার পরে এটি লুপিং চালিয়ে যাবে। তারপরে getsফিরে আসে nil, যা কোনও #gsubপদ্ধতির অধিকারী নয় , এইভাবে ত্রুটি উত্থাপন করে। $><<$<.readপরিবর্তে ব্যবহার করুন loop{puts gets, এটিও খাটো; )
ব্লুটোরেঞ্জ

আমি এই স্ক্রিপ্টটি কেবল স্মাইলি মুখের সাথে পরীক্ষা করেছি (প্রশ্ন এবং আমার পোস্টের চিত্রটি দেখুন), এবং স্মাইলির চারপাশে কোনও হলুদ রঙ নেই?
ব্লুটোরেঞ্জ করুন

4

ফ্লেক্স (লেসার) - 226 197 192 182 168 (বা 166)

এটিকে ১ to down-এ নামাতে, \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 মোড অসম্ভব।
বেটা ক্ষয়

@ বেটাডেকে এটি কোনও পূর্ণসংখ্যাকে মডুলাস করা হচ্ছে না, এটি একটি স্ট্রিং ফর্ম্যাট করা হচ্ছে।
সামিটিচ

এটি re.subচালাতে আমি অবৈধ সিনট্যাক্স ত্রুটিগুলি পেয়ে যাচ্ছি
আর্টঅফকোড

(দেরিতে মন্তব্য) এই 499-বাইট কোডটি কি কাজ করে?
এরিক আউটগল্ফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.