ব্যাচে গল্ফ করার টিপস


14

কোড গল্ফিংয়ের জন্য উইন্ডোজ ব্যাচ (সিএমডি) সম্ভবত সবচেয়ে কম উপযুক্ত ভাষা।

নিউলাইন চরিত্রগুলি এড়িয়ে চলুন । আপনি যদি অক্ষরের বিপরীতে বাইটের মধ্যে সংক্ষিপ্ততম কোডটি সন্ধান করছেন তবে আপনি সমস্ত অপ্রয়োজনীয় ক্যারিয়ারের রিটার্ন (নিউলাইন অক্ষর = 2 বাইট) থেকে মুক্তি পেতে চাইবেন। আপনি &প্রতিটি কমান্ডের জন্য একটি বাইট ছাঁটাই করে এটি করতে অপারেশনটি ব্যবহার করতে পারেন ।

echo Hello&echo World.

ভেরিয়েবল সেট করা হচ্ছে । সুইচগুলি ব্যবহার করে ভেরিয়েবলগুলি সেট করার সময়, setপার্সার স্পেসগুলি উপেক্ষা করবে।

set /a a+=1
set /p b="User Input: "
:: Will be handled the same as..
set/aa+=1
set/pb="User Input: "

নোট করুন যে একই পার্সার বিধিগুলি সমস্ত কমান্ডের ক্ষেত্রে প্রযোজ্য নয় - উদাহরণস্বরূপ, লুপগুলির জন্য ফাঁকা স্থান প্রয়োজন। মধ্যে ছাড়া set, string, or command(অর্থাত কি বন্ধনী ভিতরে হয়) এবং শব্দ do

for /f %%a in (file.txt)do ...

সহজ গাণিতিক এক্সপ্রেশন । এছাড়াও, set /aকমান্ডটিতে বৃদ্ধি করার জন্য আমি যে অভিব্যক্তিটি ব্যবহার করেছি তা লক্ষ্য করুন । সাধারণ গাণিতিক এক্সপ্রেশনগুলির += -= *= /=পরিবর্তে (উদাহরণস্বরূপ) ব্যবহার করুন set /a a=%a%+1

কমান্ড আউটপুট সংগ্রহ করা । কমান্ডের আউটপুট পেতে, এটি কখনও কখনও কোনও ফাইল থেকে আউটপুট আউট করতে এবং পড়তে কার্যকর হতে পারে, যেখানে আপনি অন্যথায় আউটপুট সংগ্রহের জন্য লুপ ব্যবহার করতে পারেন:

for /f %%a in ('echo test') do set a=%%a
:: Can be shortened to
echo test>f&set/pa=<f

echo teststdout কে f নামক একটি ফাইলে প্রেরণ করুন >f, একটি নতুন কমান্ড শুরু &করুন এবং ভেরিয়েবলের মধ্যে ফাইলের বিষয়বস্তুগুলি পান set/pa=<f। অবশ্যই এটি সর্বদা কার্যকর হয় না isn't তবে এটি তখন হতে পারে যখন আপনার প্রয়োজন সমস্ত আউটপুটের একক লাইন।

কমান্ড আউটপুট । কমান্ড আউটপুট দমন @করার সময়, কমান্ডগুলির আগে ব্যবহার করুন, যদি না আপনার 9 টিরও বেশি কমান্ড দমন করার প্রয়োজন হয়, সেক্ষেত্রে @echo off, আপনার স্ক্রিপ্টের শুরুতে ব্যবহার করুন। @echo off9 বাইট দীর্ঘ, এবং তাই সাধারণত দীর্ঘ স্ক্রিপ্ট সহ আরও বাইট সংরক্ষণ করা হবে।

কমান্ডগুলি প্রায়শই সুস্পষ্টর চেয়ে বেশি কিছু করে - আপনার আদেশগুলি কী করছে তা ভেবে দেখুন। উদাহরণ স্বরূপ; যদি আপনার কোনও ভেরিয়েবল সেট করতে হয় এবং এর পরিবর্তে অন্য ভেরিয়েবল প্রতিধ্বনিত হয়:

set a=OUTPUT
echo %a%
echo test>f
set /p b=<f

আপনি আপনার /pজন্য আউটপুট পরিবর্তন করতে সেট কমান্ড ব্যবহার করতে পারেন %a%

set a=OUTPUT
echo test>f
set /p b=%a%<f

সম্পূর্ণ গল্ফড ...

set a=OUTPUT&echo test>f&set/pb=%a%<f

উদাহরণগুলির একটি দম্পতি - সমস্ত অঙ্কের সমষ্টি গণনা - গোল্ডবাচের অনুমান

অন্য যে কোনও টিপস প্রশংসা করার চেয়ে বেশি - আমি অন্য কিছু ভাবলে আমি এটি আপডেট করতে থাকি।


16
দয়া করে এর উত্তর অংশগুলি উত্তর হিসাবে পোস্ট করুন, প্রশ্নের অংশ হিসাবে নয়।
চার্লস

@ চারেলস আমি মোটামুটি নিশ্চিত যে কীভাবে আমি এটি করেছি তা একটি 'টিপস প্রশ্নের' জন্য একটি গ্রহণযোগ্য বিন্যাস। অন্যান্য ব্যক্তি তাদের নিজস্ব টিপস সহ উত্তর যুক্ত করতে পারেন।
চাচাবিশেষ

উত্তর:


4

কাউন্টার

যখনই আপনার কোনও ভেরিয়েবল থাকে যা 0আপনার কাছ থেকে শুরু হয়ে কাউন্টার হিসাবে কাজ করবে আপনি লিখতে চাইতে পারেন

set count=0
set/acount+=1

; যাইহোক, আপনি প্রথম লাইনগুলি মুছে ফেলতে পারেন কারণ যখনই set/aকোনও আনসেট ভেরিয়েবল ব্যবহার করা হয় তখন এর মান হিসাবে ধরে নেওয়া হয়0

set/acounter+=1

কোড ব্লক

যখন আপনাকে কোডের ব্লক ব্যবহার করতে হয় তখন আপনি কয়েকটি বাইট শেভ করতে পারেন।

আপনি যখনই কোনও কোড ব্লক খোলেন, সেই ব্লকে কোডের প্রথম লাইনের আগে আপনাকে একটি লাইন ব্রেক sertোকানোর দরকার নেই। সমাপনী বন্ধনীগুলি নিজের নিজস্ব লাইনে থাকতে হবে না।

If %a%==%b% (
     echo true
) else (
    echo false
)

গল্ফ করা যেতে পারে

If %a%==%b% (echo true)else (echo false)

নতুন লাইনে ট্রেইলিং ছাড়াই মুদ্রণ

এটির জন্য সাধারণ প্যাটার্নটি

echo|set/p=text

কিন্তু, আপনি 2 বাইট পরিবর্তন সংরক্ষণ করতে পারবেন echoকরারcd

cd|set/p=text

2
@ ankp-morpork আরে, আমি কিছুটা দেরি করেছি। তবে আমি আপনাকে জানাতে চাই যে ifবিবৃতিটি আরও গল্ফ করা যেতে পারে। if %a%==%b% (echo true)else echo false
সেরাটি হ'ল

3

অ্যামপারসেন্ট

যদিও এটি কম লাইন ব্যবহার করে কোডটি সংক্ষিপ্ত বলে মনে হচ্ছে, এটি একটি নিউলাইন হিসাবে অনেকগুলি অক্ষর ব্যবহার করেছে। এই যে মানে

echo a&echo b

হিসাবে দীর্ঘ

echo a
echo b

যাতে আপনার কোড অক্ষর নষ্ট না করে পঠনযোগ্য থাকতে পারে।

ব্যতিক্রম হতে পারে কারণ কিছু পাঠ্য সম্পাদকগুলি প্রতিটি নতুন লাইনের জন্য লাইন ফিড এবং ক্যারিজ ফেরত দেয়।


আমি এটিকে মূল পোস্টে অন্তর্ভুক্ত করেছি কারণ আমার ব্যবহৃত প্রতিটি পাঠ্য সম্পাদকটিতে একটি নতুন লাইন দুটি বাইটের জন্য গণনা করে। এই স্পষ্টতা যোগ করার জন্য ধন্যবাদ।
চাচাবিশেষ 6

2
উইন্ডোর ক্যারিজে রিটার্ন লাইনফিডটি দুটি অক্ষর এবং অনেকগুলি পাঠ্য সম্পাদক এটিকে দুটি হিসাবে গণনা করবে, কিন্তু যখন আমি প্রথম গল্ফ প্রশ্নের উত্তর দেওয়া শুরু করি তখন একটি মন্তব্য বামে বলেছিল যে পিপিসিজি লাইনের শেষটি সর্বদা একটি চরিত্র হিসাবে গণনা করা হয়।
জেরি যেরেমিয়া

2
ইউনিক্স স্টাইলের লাইনফিডগুলি সিএমডি স্ক্রিপ্টগুলিতে উইন্ডোজের সাম্প্রতিক সংস্করণগুলিতে ঠিক কাজ করবে।
ব্যবহারকারী 2428118

1
বস্তুত, সিএমডি এমনকি পার্স আগে সি আর অক্ষর সরিয়ে ফেলা হবে: stackoverflow.com/questions/4094699/...
schnaader

3

সরাসরি একটি সংখ্যার গণনার ফলাফল মুদ্রণ করুন

যদি চ্যালেঞ্জটির জন্য এমন একটি সংখ্যা আউটপুট করা প্রয়োজন যা গণনা করা দরকার, আপনি cmd/c set/aগণনা সংরক্ষণের পরিবর্তে গণনার ফলাফল আউটপুট করতে এবং তারপরে এটি প্রতিধ্বনি করতে পারেন। উদাহরণ:

@set/a a=%1+%2
@echo %a%

হয়ে

@cmd/cset/a%1+%2

সম্পাদনা করুন: আরও 2 বাইট সংরক্ষণ করে স্পষ্টত কোনও স্থানের প্রয়োজন নেই।


2

বিলম্বিত প্রসারণ

লম্বাটি ব্যবহার না করে setLocal enableDelayedExpansionআপনি cmd /v on(বা cmd/von) ব্যবহার করতে পারবেন যা দেরীতে পরিবর্তনশীল প্রসারণ সক্ষম করে একটি নতুন দোভাষী চালু করবে।

আমি এখনও এটি বাস্তবায়ন করতে পেরেছি যাতে আমার কোনও উদাহরণ নেই, তবে আপনি সুইচটির সাথে এটি ব্যবহার করতে /cপারেন। উদাহরণ:

@cmd/von/cset test=test^&echo !test!

অ্যাম্পারস্যান্ডের আগে ক্যারেটের ব্যবহারটি লক্ষ্য করুন। আপনার যদি একাধিক অ্যাম্পারস্যান্ড বা অন্য কোনও বিশেষ অক্ষর ব্যবহার /cকরতে হয় তবে উদ্ধৃতি চিহ্নগুলিতে স্যুইচ করার পরে সমস্ত কিছু বন্ধ করে দেওয়া ভাল :

@cmd/von/c"set test=test&set test1=test1&echo !test! !test1!"

এই পদ্ধতিতে সমস্ত ইনপুট @মাস্ক করার জন্য কেবল একটি অক্ষর ব্যবহার করার সুবিধা রয়েছে এবং সুতরাং (বা একাধিক চিহ্ন) এর সংক্ষিপ্ত বিকল্প হিসাবে ব্যবহার করা যায় ।/von@echo off@

9 টি অক্ষর: @echo off
6 টি অক্ষর:@cmd/c

আরও লম্বা স্ক্রিপ্টগুলির জন্য, যা আপনি এক লাইনে করতে পারবেন না, কিছু বাইট সংরক্ষণ করার জন্য আপনি নিম্নলিখিতটি করতে পারেন:

@!! 2>nul||cmd/q/v/c%0&&exit/b

বা, নিরবচ্ছিন্ন:

@!! 2>nul || cmd /q /v on /c %0 && exit/b

@echo off&setLocal enableDelayedExpansionউপরের সাথে প্রতিস্থাপন করুন ।

আপনি যখন প্রথম চালনা করেন তখন আপনার স্ক্রিপ্টটি !!মোটেও প্রসারিত হবে না, সুতরাং আপনি কোনও ত্রুটি পেয়েছেন কারণ "!!"কোনও আদেশ নেই। ত্রুটি আউটপুটটি তখন নুল ( 2>nul) এ পাইপ করা হয় । যখন এই প্রথম 'কমান্ড' ব্যর্থ হয় ( ||), এটি সেমিডির একটি নতুন উদাহরণ কল করে, যা ব্যাচ ফাইলকে নিজে কল করে ( /v (on)দেরী সম্প্রসারণ সক্ষম করার জন্য এবং /qপ্রতিধ্বনি বন্ধ করতে)। তারপরে !!কোনও ভেরিয়েবল নেই বলে কিছুতেই প্রসারিত হবে <NULL>। আপনার স্ক্রিপ্টের বাকি অংশগুলি তখন চলে। যার পরে এটি সেন্টিমিডের আসল উদাহরণে ফিরে আসবে এবং ( &&) /bউইন্ডোটি উন্মুক্ত রাখতে শর্ত সহ প্রস্থান করুন (প্রস্থানটি তাই এটি প্রথম স্ক্রিপ্টের মাধ্যমে প্রথম স্ক্রিনে ইকো সহ প্রবাহিত হবে না) চালু এবং বিলম্বিত সম্প্রসারণ বন্ধ)।


এর জন্য, ব্যাচ ফাইলগুলি চালানো cmd /q /v on /c <filename>কেবল 2 বাইট হিসাবে গণনা করা উচিত কারণ সেগুলি পার্ল পতাকাগুলির অনুরূপ দুটি "পতাকা" -pIযা কেবল 2 অতিরিক্ত বাইট হিসাবে গণনা করবে।
আরটিয়ার

1

পুনরাবৃত্ত স্ট্রিং

ভেরিয়েবলগুলিতে পুনরাবৃত্ত কোড ব্লক সেট করুন, যেখানে ভেরিয়েবল সেট করতে ব্যবহৃত বাইটের সংখ্যা + ভেরিয়েবল আউটপুট করতে বাইটের সংখ্যা কেবল কোডটি সরাসরি কল করতে বাইটের সংখ্যার চেয়ে কম হয়।

উদাহরণস্বরূপ, দেখুন: 100 টির বেশি সংযোজন সমন্বয়গুলি আঁকুন

আপনি সেট কমান্ডের প্রতি ব্যবহার 1 বাইট সংরক্ষণ করুন, যদি আপনি কোনও ভেরিয়েবল তৈরি করেন ("অক্ষরের সাথে নামকরণ করা হয়" "s" এর মতো) যা এতে রয়েছে set<space> । আপনি কেবলমাত্র 12 বারেরও বেশি সময় কমান্ড ব্যবহার করলে এটি কেবল মান উত্পন্ন করে। (নোট করুন স্ট্রিংয়ের শেষে একটি অক্ষর রয়েছে set s=set)।

set s=set 
%s%a=1
%s%b=2
%s%c=3
%s%d=4
%s%e=5
%s%f=6
%s%g=7
%s%h=8
%s%i=9
%s%j=10
%s%k=11
%s%l=12
%s%m=13

উপরেরটি 1 বাইটের চেয়ে কম ...

set a=1
set b=2
set c=3
set d=4
set e=5
set f=6
set g=7
set h=8
set i=9
set j=10
set k=11
set l=12
set m=13

এটি সম্ভবত একটি দুর্দান্ত দৃষ্টান্ত - তবে এটি পয়েন্টটি পেয়ে যায়।


1

একটি স্ট্রিং শুরু

স্বরলিপিটি %var:~start,end%ভেরিয়েবলের একটি সাবস্ট্রিং বের করে var। তবে যদি startহয় 0তবে আপনি এটি পুরোপুরি বাদ দিতে পারেন। আমরা ইতিমধ্যে জানি তুমি বাদ পারেন ,endযদি আপনি স্ট্রিং, যার ফলে বাকি চান %var:~%জন্য একটি প্রায় বেহুদা প্রতিশব্দ %var%ছাড়া এটি ফেরৎ ~যখন %var%খালি। (সম্ভবত আপনি এটি একটি পরীক্ষায় ব্যবহার করতে পারেন:? if %var:~%==~)


আমি আপনার শেষ বাক্যটি আমাদের মনে করিয়ে দিচ্ছি এটি এটির জন্য কিছু উদ্ধৃতি সংরক্ষণ করবে :) +1 এর জন্য।
স্টিভেস্টেল

1

সংক্ষিপ্ত IF EQUবিবৃতি

if %a% equ %b% do_something
if %a%==%b% do_something

3 টি বাইট সংরক্ষণের ==পরিবর্তে ব্যবহার করা । equ


সংক্ষিপ্ত উদ্ধৃতি IFবিবৃতিতে সংক্ষিপ্ত

এটি একটি traditional ifতিহ্যবাহী তথাকথিত "নিরাপদ" তুলনা।

if "%a%"=="%b%" do_something

এই বিবৃতিটি সংক্ষিপ্ত করতে, যখন ইনপুটটি কেবলমাত্র বর্ণানুক্রমিক / খালি হতে পারে তখন নিম্নলিখিতটি করুন :

if %a%.==%b%. do_something

মোট 2 বাইট সংরক্ষণ করা হচ্ছে ।


চ্যালেঞ্জগুলি যাতে আউটপুট প্রয়োজন

যদি প্রশ্নটি কিছু বলে:

কমপক্ষে 1 টি দৃশ্যমান চরিত্রের আউটপুট দেয়।

তাহলে আপনি কেবল এটি করতে পারেন:

cd

cdবর্তমান ডিরেক্টরির দেখায় STDOUT


GOTOএকটি লেবেল আইএন

gotoবাইটগুলির ক্রমবর্ধমান ক্রমে অর্ডারযুক্ত কোনও লেবেল আইনের কয়েকটি পদ্ধতি এখানে রয়েছে ।

goto :l
goto l
goto:l

উপরের পদ্ধতিটি 1 বাইট সংরক্ষণ করে ।


1
বিকল্পভাবে আপনি goto:lযা করতে পারেন যা একই 1 বাইট সংরক্ষণ করে এবং আপনার
কোলনটি

@ ম্যাথিউস ওয়েভেলার: আমি আপনার মন্তব্যে সেই অনুযায়ী সামগ্রী যুক্ত করেছি
স্টিভেফস্টেল

1

স্ল্যাশ সহ কমান্ড এবং পরামিতিগুলির মধ্যে স্থান ছাড়ানো

অননুমোদিত শিরোনাম সম্পর্কে দুঃখিত। আমি যা পেতে চাইছি তা হ'ল কিছু (সকলের নয়) উইন্ডোজ কমান্ডের জন্য, আপনি কমান্ড / প্রোগ্রামের নাম এবং প্যারামিটারের মধ্যে স্থানটি বাদ দিতে পারেন, যতক্ষণ না সেই পরামিতিটি স্ল্যাশ দিয়ে শুরু হয়। উদাহরণ স্বরূপ:

for /f %%G in ...

হয়ে

for/f %%G in ...

-১ বাইট!

ERRORLEVEL ব্যবহার না করে পাইপিং আউটপুট

কমান্ডটি সঠিকভাবে চলেছে কিনা তা নির্ধারণ করতে ERRORLEVEL ব্যবহার করা সবচেয়ে সংক্ষিপ্ত বা সবচেয়ে মার্জিত পদ্ধতি নয়। পরিবর্তে, আপনি পাইপ আউটপুট করতে পারেন। এটি নিম্নলিখিত হিসাবে কাজ করে (মনে রাখবেন &&অপারেটরের পরে যে কোনও কমান্ড কেবল &&ত্রুটি ছাড়াই দৌড়ানোর আগে কমান্ড কার্যকর করে exec অন্যদিকে অপারেটরের পরে কোনও কমান্ড ||কেবল তখনই চলবে যদি কমান্ডটি সঠিকভাবে চালিত না হওয়ার আগে চালিত হয় My আমার উদাহরণটি :

net session>nul
if %errorlevel%==0 (echo 1) else (echo 0)

এটি এর সাথে প্রতিস্থাপন করা যেতে পারে:

net session>nul&&echo 1||echo 0

-26 বাইট, বাহ! নোট করুন যে এটি কমান্ডগুলির মতো কাজ করে নাchoice , যেখানে কিছু ইনপুট অনুসারে ERRORLEVEL এর একটি বিশেষ মান রয়েছে।

শুভেচ্ছা,
গ্যাবে


1

কার্যকরভাবে প্রথম বন্ধনী ব্যবহার করা

আবার হাই,

দ্বিতীয় উত্তর পোস্ট করার জন্য দুঃখিত তবে আমি অনুভব করেছি যে এটি তার প্রাপ্য। আমি লক্ষ্য করেছি যে লোকেরা C:\Windows\System32>echo fooপ্রতিটি কমান্ডের আগে সেই অদ্ভুত লাইনটি প্রদর্শন না করে কমান্ড আউটপুট প্রদর্শন করার জন্য প্রায়শই নীচের একটি পদ্ধতি ব্যবহার করে ।
প্রথম পদ্ধতি (ব্যবহার করে echo off):

@echo off
echo foo
echo bar
echo foobar
echo barfoo

দ্বিতীয় পদ্ধতি:

@echo foo
@echo bar
@echo foobar
@echo barfoo

তবে, এই পদ্ধতির কোনওটিই নীচের মতো সংক্ষিপ্ত নয়:

@(echo foo
echo bar
echo foobar
echo barfoo)

বেশ সহজ, তাই না? অন্য নোটে, এটি সহজেই কোনও ফাইল বা ডিভাইসে একাধিক লাইন আউটপুট পাইপ করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, এই দীর্ঘ কোড:

echo foo>file.txt
echo bar>file.txt
echo foobar>file.txt
echo barfoo>file.txt

উল্লেখযোগ্যভাবে খাটো হয়ে যায়:

(echo foo
echo bar
echo foobar
echo barfoo)>file.txt

এই দীর্ঘ উত্তরটি পড়ার জন্য ধন্যবাদ, এবং আমি আশা করি এটি আপনাকে সহায়তা করবে। শুভেচ্ছা,
গ্যাবে


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