টেক্স, 216 বাইট (4 টি লাইন, 54 টি অক্ষর প্রতিটি)
কারণ এটি বাইট গণনা সম্পর্কে নয়, এটি টাইপসেট আউটপুটটির গুণমান সম্পর্কে :-)
{\let~\catcode~`A13 \defA#1{~`#113\gdef}AGG#1{~`#1 13%
\global\let}GFF\elseGHH\fiAQQ{Q}AII{\ifxQ}AEE#1#2#3|{%
I#3#2#1FE{#1#2}#3|H}ADD#1#2|{I#1FE{}#1#2|H}ACC#1#2|{D%
#2Q|#1 }ABBH#1 {HI#1FC#1|BH}\gdef\S#1{\iftrueBH#1 Q }}
অনলাইনে চেষ্টা করে দেখুন! (ওভারলিফ; এটি কীভাবে কাজ করে তা নিশ্চিত নয়)
সম্পূর্ণ পরীক্ষার ফাইল:
{\let~\catcode~`A13 \defA#1{~`#113\gdef}AGG#1{~`#1 13%
\global\let}GFF\elseGHH\fiAQQ{Q}AII{\ifxQ}AEE#1#2#3|{%
I#3#2#1FE{#1#2}#3|H}ADD#1#2|{I#1FE{}#1#2|H}ACC#1#2|{D%
#2Q|#1 }ABBH#1 {HI#1FC#1|BH}\gdef\S#1{\iftrueBH#1 Q }}
\S{swap the a first and last letters of each word}
pwas eht a tirsf dna tasl setterl fo hace dorw
\S{SWAP THE A FIRST AND LAST LETTERS OF EACH WORD}
\bye
আউটপুট:
ল্যাটেক্সের জন্য আপনার কেবল বয়লারপ্লেট দরকার:
\documentclass{article}
\begin{document}
{\let~\catcode~`A13 \defA#1{~`#113\gdef}AGG#1{~`#1 13%
\global\let}GFF\elseGHH\fiAQQ{Q}AII{\ifxQ}AEE#1#2#3|{%
I#3#2#1FE{#1#2}#3|H}ADD#1#2|{I#1FE{}#1#2|H}ACC#1#2|{D%
#2Q|#1 }ABBH#1 {HI#1FC#1|BH}\gdef\S#1{\iftrueBH#1 Q }}
\S{swap the a first and last letters of each word}
pwas eht a tirsf dna tasl setterl fo hace dorw
\S{SWAP THE A FIRST AND LAST LETTERS OF EACH WORD}
\end{document}
ব্যাখ্যা
টেক্স একটি অদ্ভুত জন্তু। সাধারণ কোড পড়া এবং এটি বোঝা নিজেই একটি কৃতিত্ব। অবরুদ্ধ টেক্সট কোড বোঝা আরও কয়েক ধাপ এগিয়ে যায়। আমি টেকসকেও জানেন না এমন লোকদের জন্য এটি বোধগম্য করার চেষ্টা করব, তাই জিনিসগুলি অনুসরণ করা সহজ করার জন্য টেক্স সম্পর্কে কয়েকটি ধারণা এখানে শুরু করার আগে:
(তাই নয়) নিখুঁত টেক্স এক্স শুরুর জন্য
প্রথম, এবং এই তালিকায় সবচেয়ে গুরুত্বপূর্ণ আইটেম: কোড নেই না আয়তক্ষেত্র আকৃতির হতে হবে, যদিও পপ সংস্কৃতি আপনি হতে পারে তাই মনে করি ।
টেক্স একটি ম্যাক্রো সম্প্রসারণের ভাষা। আপনি উদাহরণ হিসাবে, সংজ্ঞায়িত করতে পারেন \def\sayhello#1{Hello, #1!}
এবং তারপরে \sayhello{Code Golfists}
টেক্সটি প্রিন্ট করার জন্য লিখতে পারেন Hello, Code Golfists!
। এটিকে একটি "অনির্দিষ্ট ম্যাক্রো" বলা হয় এবং এটি প্রথম (এবং কেবলমাত্র এই ক্ষেত্রে) প্যারামিটার খাওয়ানোর জন্য আপনি এটি বন্ধনী দ্বারা আবদ্ধ করেছেন। ম্যাক্রো আর্গুমেন্টটি ধরলে টেক্স সেই সব ধনুগুলিগুলি সরিয়ে দেয়। আপনি 9 টি পর্যন্ত পরামিতি ব্যবহার করতে পারেন: \def\say#1#2{#1, #2!}
তারপরে \say{Good news}{everyone}
।
Undelimited ম্যাক্রো সহযোগীর হয়, unsurprisingly, সীমায়িত বেশী :) তুমি কি সে আগের সংজ্ঞা একটি বাচ্চা আরো বানাতে পারে semantical : \def\say #1 to #2.{#1, #2!}
। এই ক্ষেত্রে পরামিতিগুলি তথাকথিত প্যারামিটার পাঠ্য অনুসরণ করে । এই জাতীয় প্যারামিটার পাঠ্য ম্যাক্রোর যুক্তিটি #1
সীমিত করে ( ␣to␣
স্থান দ্বারা অন্তর্ভুক্ত করা, এবং এর #2
দ্বারা সীমিত করা হয় .
) the সেই সংজ্ঞার পরে আপনি লিখতে পারেন \say Good news to everyone.
, যা প্রসারিত হবে Good news, everyone!
। ভাল, তাই না? :) তবে একটি সীমিত যুক্তিটি হ'ল ( টেক্সবুকের উদ্ধৃতি দিয়ে ) "সঠিকভাবে নেস্টেড {...}
গ্রুপগুলির সাথে টোকেনগুলির সংক্ষিপ্ততর (সম্ভবত খালি) ক্রম যা এই নির্দিষ্ট তালিকা-পরামিতি টোকেনগুলির ইনপুট অনুসরণ করা হয়"। এর অর্থ হল এর প্রসার\say Let's go to the mall to Martin
একটি অদ্ভুত বাক্য উত্পাদন করা হবে। এই ক্ষেত্রে আপনি "গোপন করুন" প্রথম প্রয়োজন চাই ␣to␣
সঙ্গে {...}
: \say {Let's go to the mall} to Martin
।
এ পর্যন্ত সব ঠিকই. এখন বিষয়গুলি অদ্ভুত হতে শুরু করে। টেক্স যখন একটি অক্ষর পড়েন (যা একটি "চরিত্র কোড" দ্বারা সংজ্ঞায়িত করা হয়), তখন সেই চরিত্রটিকে "বিভাগ কোড" (ক্যাটকোড, বন্ধুদের জন্য বরাদ্দ করা হয়) যা সেই চরিত্রটির অর্থ কী তা নির্ধারণ করে। অক্ষর এবং বিভাগের কোডের এই সংমিশ্রণটি একটি টোকেন করে তোলে ( উদাহরণস্বরূপ, এখানে আরও কিছু )। আমাদের এখানে আগ্রহের বিষয়গুলি মূলত:
ক্যাটকোড 11 , যা টোকেনগুলি সংজ্ঞায়িত করে যা একটি নিয়ন্ত্রণ সিকোয়েন্স তৈরি করতে পারে (ম্যাক্রোর জন্য একটি পশ নাম)। ডিফল্টরূপে সমস্ত অক্ষর [a-zA-Z] 11 টি ক্যাটকোড হয়, সুতরাং আমি লিখতে পারি \hello
, এটি একটি একক নিয়ন্ত্রণ অনুক্রম, যখন দুটি অক্ষর অনুসরণ করে \he11o
নিয়ন্ত্রণ অনুক্রম \he
হয় 1
, পরে অক্ষর হয় o
, কারণ 1
যদি ক্যাটকোড হয় না 11 যদি আমি না \catcode`1=11
, যে বিন্দু থেকে \he11o
একটি নিয়ন্ত্রণ ক্রম হবে। একটি গুরুত্বপূর্ণ বিষয় হ'ল টেক্স যখন হাতের অক্ষরটি প্রথম দেখেন তখন ক্যাটকোডগুলি সেট করা হয় এবং এই জাতীয় ক্যাটকোড হিমশীতল ... সর্বদা ! (শর্তাবলী প্রযোজ্য হতে পারে)
ক্যাটকোড 12 , যা অন্যান্য চরিত্রগুলির মধ্যে বেশিরভাগ যেমন 0"!@*(?,.-+/
and তারা কেবলমাত্র কাগজে স্টাফ লেখার জন্য পরিবেশন করার কারণে তারা সর্বনিম্ন বিশেষ ধরণের ক্যাটকোড। তবে আরে, লেখার জন্য কে টেক্স ব্যবহার করে?!? (আবার, শর্তাবলী প্রযোজ্য হতে পারে)
ক্যাটকোড 13 , যা নরক :) সত্যিই। পড়া বন্ধ করুন এবং আপনার জীবন থেকে কিছু করতে যান। আপনি ক্যাটকোড 13 কী তা জানতে চান না। 13 শে শুক্রবার কখনও শুনেছেন? অনুমান করুন এটি কোথা থেকে এর নাম পেয়েছে! আপনার নিজের ঝুঁকিতে চালিয়ে যান! একটি ক্যাটকোড 13 অক্ষর, একে "সক্রিয়" চরিত্রও বলা হয়, এটি কেবল একটি চরিত্র নয়, এটি নিজেই ম্যাক্রো! আপনি এটি প্যারামিটারগুলি সংজ্ঞায়িত করতে এবং আমরা উপরে যেমন দেখেছি তেমন কিছুতে প্রসারিত করতে পারি। \catcode`e=13
আপনার মনে হওয়ার পরে আপনি কি করতে পারবেন \def e{I am the letter e!}
, তবে। আপনি. না পারেন! e
এখন আর কোনও চিঠি নয়, আপনি কি জানেন না, তাই \def
না ! ওহ, আপনি অন্য একটি চিঠি চয়ন? ঠিক আছে! । খুব ভাল, জিমি, চেষ্টা করে দেখুন! আমি আপনাকে সাহস করি যে আপনি এটি করতে এবং আপনার কোডে একটি লিখুন ! এটি একটি ক্যাটকোড 13 আমি শান্ত আছি! চল এগোই.\def
\d e f
\catcode`R=13 \def R{I am an ARRR!}
R
ঠিক আছে, এখন দলবদ্ধকরণ। এটি মোটামুটি সোজা। একটি গোষ্ঠীতে যা কিছু অ্যাসাইনমেন্ট ( \def
একটি অ্যাসাইনমেন্ট অপারেশন, \let
(আমরা এতে প্রবেশ করব) আরেকটি কাজ) সেই অ্যাসাইনমেন্টটি বিশ্বব্যাপী না হলে এই গোষ্ঠীটি শুরু হওয়ার আগে তারা যা করেছিল তা পুনরুদ্ধার করা হয়। গোষ্ঠীগুলি শুরু করার বিভিন্ন উপায় রয়েছে যার মধ্যে একটি হ'ল ক্যাটকোড 1 এবং 2 টি অক্ষর (ওহ, আবার ক্যাটকোড)। ডিফল্টরূপে {
ক্যাটকোড 1, বা শুরুর-গ্রুপ হয় এবং }
এটি ক্যাটকোড 2, বা শেষ-গ্রুপ হয়। একটি উদাহরণ: \def\a{1} \a{\def\a{2} \a} \a
এই মুদ্রণ 1 2 1
। গোষ্ঠীর বাইরে \a
ছিল 1
, তারপরে এটির ভিতরে এটির নতুন সংজ্ঞা দেওয়া হয়েছিল 2
এবং গোষ্ঠীটি শেষ হলে এটি পুনরায় পুনঃস্থাপন করা হয়েছিল 1
।
\let
অপারেশন মত অন্য নিয়োগ অপারেশন \def
, বরং আলাদা। সঙ্গে \def
আপনি সংজ্ঞায়িত ম্যাক্রো যা স্টাফ প্রসারিত হবে, সঙ্গে \let
যদি আপনার আগে থেকেই বিদ্যমান জিনিস কপি তৈরি করুন। পরে \let\blub=\def
( =
ঐচ্ছিক) আপনি শুরু পরিবর্তন করতে পারেন e
উপরে catcode 13 আইটেম থেকে উদাহরণ \blub e{...
এবং যে এক সঙ্গে মজা আছে। অথবা ভাল, যে জিনিস নিয়ে আপনি করতে পারেন ভঙ্গ পরিবর্তে ঠিক (যদি আপনি যে দেখাবে!) R
উদাহরণ: \let\newr=R \catcode`R=13 \def R{I am an A\newr\newr\newr!}
। তাত্ক্ষণিক প্রশ্ন: আপনি কি নাম পরিবর্তন করতে পারবেন \newR
?
অবশেষে, তথাকথিত "উদ্দীপনা"। এটি এক প্রকারের নিষিদ্ধ বিষয়, কারণ এমন লোকেরা আছেন যারা দাবি করেন যে টেক্স - লাটেক্স স্ট্যাক এক্সচেঞ্জের "জালিয়াতি স্থান" প্রশ্নের উত্তর দিয়ে সুনাম অর্জন করেছেন , অন্যরা আন্তরিকভাবে দ্বিমত পোষণ করবেন না। কার সাথে একমত? আপনার বেট রাখুন! এদিকে: টেক্স একটি লাইন বিরতি স্থান হিসাবে বোঝে। তাদের মধ্যে একটি লাইন ব্রেক ( খালি লাইন নয় ) দিয়ে কয়েকটি শব্দ লেখার চেষ্টা করুন। %
এই লাইনগুলির শেষে একটি যুক্ত করুন add দেখে মনে হচ্ছে আপনি এই লাইনের শেষের জায়গাগুলি "মন্তব্য করছেন"। এটাই :)
কোড সাজানো (সাজানো)
আসুন যে আয়তক্ষেত্রটি অনুসরণ করা সহজ কিছু (তর্কযুক্ত) হিসাবে সহজ করুন:
{
\let~\catcode
~`A13
\defA#1{~`#113\gdef}
AGG#1{~`#113\global\let}
GFF\else
GHH\fi
AQQ{Q}
AII{\ifxQ}
AEE#1#2#3|{I#3#2#1FE{#1#2}#3|H}
ADD#1#2#3|{I#2FE{#1}#2#3|H}
ACC#1#2|{D{}#2Q|#1 }
ABBH#1 {HI#1FC#1|BH}
\gdef\S#1{\iftrueBH#1 Q }
}
প্রতিটি পদক্ষেপের ব্যাখ্যা
প্রতিটি লাইনে একটি একক নির্দেশ থাকে। আসুন একে অপরকে বিচ্ছিন্ন করে:
{
প্রথমে আমরা কিছু পরিবর্তন স্থানীয়ভাবে রাখার জন্য একটি গোষ্ঠী শুরু করি (যথা ক্যাটকোড পরিবর্তনগুলি) যাতে তারা ইনপুট পাঠকে গোলমাল না করে।
\let~\catcode
মূলত সমস্ত টেক্স এক্সফেসেশন কোড এই নির্দেশনা দিয়ে শুরু হয়। ডিফল্টরূপে, প্লেইন টেক্স এবং ল্যাটেক্স উভয় ক্ষেত্রেই, ~
অক্ষরটি হ'ল একটি সক্রিয় অক্ষর যা আরও ব্যবহারের জন্য ম্যাক্রোতে তৈরি করা যায়। এবং টেক্স কোডকে অদ্ভুত করার জন্য সেরা সরঞ্জামটি হ'ল ক্যাটকোড পরিবর্তন, সুতরাং এটি সাধারণত সেরা পছন্দ। এখন পরিবর্তে \catcode`A=13
আমরা লিখতে পারি ~`A13
(এটি =
alচ্ছিক):
~`A13
এখন চিঠিটি A
একটি সক্রিয় চরিত্র, এবং আমরা এটি কিছু করার জন্য সংজ্ঞা দিতে পারি:
\defA#1{~`#113\gdef}
A
এখন একটি ম্যাক্রো যা একটি যুক্তি নেয় (যা অন্য একটি চরিত্র হওয়া উচিত)। প্রথমে যুক্তিটির ক্যাটকোডটি 13 এ পরিবর্তন করে এটি সক্রিয় করা হয়: ~`#113
( ~
দ্বারা প্রতিস্থাপন করুন \catcode
এবং একটি যুক্ত করুন =
এবং আপনার কাছে:\catcode`#1=13
:)। অবশেষে এটি ইনপুট প্রবাহে একটি \gdef
(গ্লোবাল \def
) ছেড়ে যায় । সংক্ষেপে, A
অন্য একটি চরিত্রকে সক্রিয় করে তোলে এবং এর সংজ্ঞা শুরু করে। চল এটা চেষ্টা করি:
AGG#1{~`#113\global\let}
AG
প্রথমে "অ্যাক্টিভেট" করে G
এবং তা করে \gdef
, যার পরেরটি G
সংজ্ঞাটি শুরু করে। সংজ্ঞাটি এর G
সাথে খুব মিল A
, \gdef
এটির পরিবর্তে এটি একটি করে \global\let
(এর \glet
মতো একটি নেই \gdef
)। সংক্ষেপে, G
একটি চরিত্রকে সক্রিয় করে এটিকে অন্য কিছু করে তোলে। আসুন দুটি কমান্ডের শর্টকাট তৈরি করা যাক আমরা পরে ব্যবহার করব:
GFF\else
GHH\fi
এখন পরিবর্তে \else
এবং \fi
আমরা সহজভাবে ব্যবহার করতে পারি F
এবং H
। অনেক খাটো :)
AQQ{Q}
এখন আমরা A
আরেকটি ম্যাক্রো সংজ্ঞায়িত করতে আবার ব্যবহার করি Q
,। উপরোক্ত বিবৃতিটি মূলত (কম অবলম্বিত ভাষায়) করে \def\Q{\Q}
। এটি একটি মারাত্মক আকর্ষণীয় সংজ্ঞা নয়, তবে এটির একটি আকর্ষণীয় বৈশিষ্ট্য রয়েছে। আপনি যদি কিছু কোড ভাঙতে না চান তবে একমাত্র ম্যাক্রো যা প্রসারিত হয় Q
তা Q
তাই এটি একটি অনন্য মার্কারের মতো কাজ করে (একে কোয়ার্ক বলা হয় )। আপনি \ifx
যদি ম্যাক্রোর যুক্তিটির সাথে এরকম কোয়ার্ক থাকে তা পরীক্ষার জন্য শর্তযুক্ত ব্যবহার করতে পারেন \ifx Q#1
:
AII{\ifxQ}
সুতরাং আপনি নিশ্চিত হতে পারেন যে আপনি এমন একটি চিহ্নিতকারী পেয়েছেন found লক্ষ্য করুন যে এই সংজ্ঞায় আমি \ifx
এবং এর মধ্যবর্তী স্থান সরিয়েছি Q
। সাধারণত এটি একটি ত্রুটির দিকে নিয়ে যায় (নোট করুন যে সিনট্যাক্স হাইলাইট এটি মনে করে\ifxQ
এটি একটি জিনিস) তবে এখন যেহেতু Q
ক্যাটকোড 13 তাই এটি একটি নিয়ন্ত্রণ ক্রম গঠন করতে পারে না। তবে সাবধান, এই কোয়ার্ক প্রসারিত করতে না অথবা আপনি একটি অসীম লুপে আটকে গেছে পাবেন কারণ Q
বিস্তৃতি Q
যা বিস্তৃতি Q
যা ...
এখন যে প্রিলিমিনারিগুলি করা হয়ে গেছে, আমরা যথাযথ অ্যালগরিদমের কাছে যেতে পারি স্টেটরেল was টেক্সের টোকেনাইজেশনের কারণে অ্যালগরিদমটি পিছনের দিকে লিখতে হয়েছিল। এটি কারণ কারণ আপনি যখন একটি সংজ্ঞা করেন তখন টেক্স বর্তমান সংস্থাগুলি ব্যবহার করে সংজ্ঞাটির অক্ষরগুলিতে টোকনাইজ (ক্যাটকোড বরাদ্দ) দেবে, উদাহরণস্বরূপ, যদি আমি করি:
\def\one{E}
\catcode`E=13\def E{1}
\one E
আউটপুট হয় E1
, যদি আমি সংজ্ঞাগুলির ক্রম পরিবর্তন করি:
\catcode`E=13\def E{1}
\def\one{E}
\one E
আউটপুট হয় 11
। এটি কারণ কারণ প্রথম উদাহরণে E
সংজ্ঞাটিতে ক্যাটকোড পরিবর্তনের আগে একটি চিঠি (ক্যাটকোড 11) হিসাবে চিহ্নিত করা হয় , তাই এটি সর্বদা একটি চিঠি হবে E
। দ্বিতীয় উদাহরণে, তবে E
প্রথমে সক্রিয় করা হয়েছিল এবং কেবল তখনই \one
সংজ্ঞায়িত করা হয়েছিল এবং এখন সংজ্ঞায় ক্যাটকোড 13 রয়েছে E
যা প্রসারিত হয় 1
।
আমি যাইহোক, এই সত্যটিকে উপেক্ষা করব এবং সংজ্ঞাগুলিকে একটি যৌক্তিক (তবে কাজ করছে না) অর্ডার করার জন্য পুনরায় অর্ডার করব। নিম্নলিখিত অনুচ্ছেদের আপনি অনুমান করতে পারেন অক্ষর B
, C
, D
, এবং E
সক্রিয়।
\gdef\S#1{\iftrueBH#1 Q }
(লক্ষ্য করুন পূর্ববর্তী সংস্করণে একটি ছোট ত্রুটি ছিল, এটি উপরের সংজ্ঞায় চূড়ান্ত স্থানটি ধারণ করে নি this এটি লেখার সময় আমি কেবল এটি লক্ষ্য করেছি on পড়ুন এবং আপনি দেখতে পাবেন যে ম্যাক্রোকে সঠিকভাবে সমাপ্ত করার জন্য আমাদের কেন এটি দরকার। )
প্রথমে আমরা ব্যবহারকারী-স্তরের ম্যাক্রো সংজ্ঞায়িত করি, যাতে সাইটের রেন্ডারিং এটি না খায়, যেমন আমি কোডটির পূর্ববর্তী সংস্করণে করেছি। সত্য, তাই এটি প্রসারিত হয় এবং আমরা বাকি আছে । টেক্সটি অপসারণ করে না (\S
,। এটি একটি বন্ধুত্বপূর্ণ (?) সিনট্যাক্সের জন্য একটি সক্রিয় চরিত্র হওয়া উচিত নয়, তাই gwappins এহেট সেটারল এর ম্যাক্রো \S
। ম্যাক্রোটি সর্বদা-সত্য শর্তসাপেক্ষে শুরু হয় \iftrue
(এটি শীঘ্রই কেন স্পষ্ট হবে) এর সাথে শুরু হয় এবং তারপরে B
ম্যাক্রোকে অনুসরণ করে H
(যা আমরা আগে সংজ্ঞায়িত করেছি \fi
) ম্যাচটি করার জন্য \iftrue
। তারপরে আমরা ম্যাক্রোর যুক্তিটি #1
একটি স্থান এবং কোয়ার্কের পরে রেখে দেব Q
। ধরা যাক আমরা ব্যবহার করি \S{hello world}
, তারপরে এই ইনপুট স্ট্রিমচেহারাটি দেখতে হবে:\iftrue BHhello world Q␣
দিয়েছি (আমি শেষ স্থানটি একটি দ্বারা প্রতিস্থাপন করেছি)␣
\iftrue
BHhello world Q␣
\fi
H
) এর পর শর্তসাপেক্ষ মূল্যায়ন করা হয়, এর পরিবর্তে এটি সেখানে ছেড়ে না হওয়া পর্যন্ত \fi
করা হয় আসলে প্রসারিত করা হয়েছে। এখন B
ম্যাক্রো প্রসারিত হয়েছে:
ABBH#1 {HI#1FC#1|BH}
B
যার সীমিত পাঠ্য হ'ল একটি সীমিত ম্যাক্রোH#1␣
, সুতরাং যুক্তিটি H
কোনও স্থান এবং স্পেসের মধ্যে যা হয় is ইনপুট স্ট্রিম সম্প্রসারণ করার পূর্বে উপরোক্ত উদাহরণে অব্যাহত B
হয় BHhello world Q␣
। B
অনুসরণ করা হবে H
, যেমনটি করা উচিত (অন্যথায় টেক্স একটি ত্রুটি উত্থাপন করবে), তারপরে পরবর্তী স্থানটি hello
এবং এর মধ্যে world
, সুতরাং শব্দটির প্রক্রিয়া হওয়া শব্দটি কোয়ার্ক না হওয়া পর্যন্ত পরবর্তী শব্দটি প্রক্রিয়া করে । এর পরে শেষ স্থান#1
শব্দটিও রয়েছে hello
। এবং এখানে আমরা ফাঁকা জায়গায় ইনপুট পাঠ্য বিভক্ত করতে হবে। ইয়ে: এর ডি দ্য সম্প্রসারণ B
ইনপুট স্ট্রীম এবং প্রতিস্থাপিত থেকে প্রথম স্থান থেকে অপসারণ সবকিছু আপ HI#1FC#1|BH
সঙ্গে #1
হচ্ছে hello
: HIhelloFChello|BHworld Q␣
। লক্ষ্য করুন যে BH
ইনপুট স্ট্রিমে একটি নতুন পরে আছে, এর পুচ্ছ পুনরাবৃত্তি করতেB
এবং পরে শব্দ প্রক্রিয়া। এই শব্দটি প্রয়োজন কারণ যুক্তিতের শেষে সীমিত ম্যাক্রোর একটি প্রয়োজন । পূর্ববর্তী সংস্করণ সহ (সম্পাদনা ইতিহাস দেখুন) কোডটি ব্যবহার করা যদি ভুল ব্যবহার করে (এর মধ্যে স্থানটি নষ্ট হয়ে যাবে)।B
Q
Q
B
\S{hello world}abc abc
abc
ঠিক আছে, ইনপুট স্ট্রিম ফিরে: HIhelloFChello|BHworld Q␣
। প্রথমে আছেH
( \fi
) যা প্রাথমিক সম্পন্ন করে \iftrue
। এখন আমাদের এটি রয়েছে (সিউডোকোড):
I
hello
F
Chello|B
H
world Q␣
I...F...H
মনে আসলে একটি হয় \ifx Q...\else...\fi
কাঠামো। \ifx
পরীক্ষা চেক যদি শব্দ (প্রথম নিদর্শনস্বরুপে) ধরলাম হয়Q
কোয়ার্ক। যদি তা না হয় সেখানে এবং অন্য কিছুই মৃত্যুদন্ড বন্ধ, অন্যথায় কি থাকে: Chello|BHworld Q␣
। এখন C
প্রসারিত:
ACC#1#2|{D#2Q|#1 }
প্রথম যুক্তি C
undelimited হয়, তাই যদি না করে রেখেছিলেন এটি একটি একক টোকেন হবে দ্বিতীয় যুক্তি দ্বারা সীমায়িত করা হয় |
, তাই সম্প্রসারণ পর C
(সঙ্গে #1=h
এবং #2=ello
) ইনপুট স্ট্রিম হল: DelloQ|h BHworld Q␣
। লক্ষ্য করুন যে অন্য |
সেখানে রাখা হয়, এবং h
এর hello
পরে করা হয়। অর্ধেক অদলবদল হয়ে গেছে; প্রথম চিঠিটি শেষে রয়েছে। টেক্সে টোকেন তালিকার প্রথম টোকেনটি ধরা সহজ। \def\first#1#2|{#1}
আপনি যখন ব্যবহার করবেন তখন একটি সাধারণ ম্যাক্রো প্রথম অক্ষর পায়\first hello|
। শেষটি একটি সমস্যা কারণ টেক্স সর্বদা যুক্তি হিসাবে "ক্ষুদ্রতম, সম্ভবত খালি" টোকেন তালিকাটি ধরে রাখে, তাই আমাদের কয়েকটি কাজের আশেপাশের প্রয়োজন। টোকেন তালিকার পরবর্তী আইটেমটি হ'ল D
:
ADD#1#2|{I#1FE{}#1#2|H}
এই D
ম্যাক্রোটি চারপাশের কাজের মধ্যে একটি এবং শব্দটির একক অক্ষর রয়েছে এমন একমাত্র ক্ষেত্রে এটি কার্যকর। মনে করুন পরিবর্তে hello
আমাদের ছিল x
। এই ক্ষেত্রে ইনপুট স্ট্রিম হবে DQ|x
, তারপর D
(সঙ্গে প্রসারিত হবে #1=Q
, এবং #2
খালি) করুন: IQFE{}Q|Hx
। এটি I...F...H
( \ifx Q...\else...\fi
) ব্লক ইন এর অনুরূপ, এটি B
দেখতে পাবে যে আর্গুমেন্টটি কোয়ার্ক এবং কেবল x
টাইপসেটিংয়ের জন্য রেখে কার্যকর করতে বাধা দেবে । অন্যান্য ক্ষেত্রে (ফিরে ইন hello
উদাহরণস্বরূপ), D
(সঙ্গে প্রসারিত হবে #1=e
এবং #2=lloQ
) এর: IeFE{}elloQ|Hh BHworld Q␣
। আবার, I...F...H
জন্য চেক করবে Q
কিন্তু ব্যর্থ এবং নিতে হবে \else
শাখা: E{}elloQ|Hh BHworld Q␣
। এখন এই জিনিস শেষ টুকরা,E
ম্যাক্রো প্রসারিত হবে:
AEE#1#2#3|{I#3#2#1FE{#1#2}#3|H}
এখানে প্যারামিটারের পাঠ্যটি বেশ অনুরূপ C
এবংD
; প্রথম এবং দ্বিতীয় আর্গুমেন্টগুলি অননুমোদিত এবং শেষটি একটি দ্বারা সীমিত করা হয় |
। ভালো ইনপুট স্ট্রিম দেখায়: E{}elloQ|Hh BHworld Q␣
তারপর, E
বিস্তৃতি (সঙ্গে #1
খালি, #2=e
আর #3=lloQ
): IlloQeFE{e}lloQ|HHh BHworld Q␣
। আরেকটি I...F...H
কোয়ার্ক জন্য ব্লক চেক (যা দেখেন l
এবং আয় false
): E{e}lloQ|HHh BHworld Q␣
। এখন E
আবার বিস্তৃতি (সঙ্গে #1=e
খালি, #2=l
আর #3=loQ
): IloQleFE{el}loQ|HHHh BHworld Q␣
। আবারও I...F...H
। Q
অবশেষে সন্ধান না পাওয়া এবং true
শাখাটি না নেওয়া পর্যন্ত ম্যাক্রো আরও কয়েকটি পুনরাবৃত্তি করে : E{el}loQ|HHHh BHworld Q␣
-> IoQlelFE{ell}oQ|HHHHh BHworld Q␣
-> E{ell}oQ|HHHHh BHworld Q␣
-> IQoellFE{ello}Q|HHHHHh BHworld Q␣
। এখন কোয়ার্ক পাওয়া যায় এবং শর্তাধীন বিস্তৃতি: oellHHHHh BHworld Q␣
। ইসস।
ওহ, অপেক্ষা করুন, এগুলি কি? সাধারণ চিঠিগুলি? ওহ, ছেলে! অক্ষর পরিশেষে পাওয়া যায় আর টেক্স নিচে লিখেছে oell
, তারপর একটি গুচ্ছ H
( \fi
) পাওয়া যায় এবং (কিছুই) সম্প্রসারিত সঙ্গে ইনপুট স্ট্রিম রেখে করা হয়: oellh BHworld Q␣
। এখন প্রথম শব্দের প্রথম এবং শেষ অক্ষরগুলি অদলবদল হয়েছে এবং টেক্স পরবর্তী কী খুঁজে পাবে তা হল B
পরবর্তী শব্দটির পুরো প্রক্রিয়াটি পুনরাবৃত্তি করা।
}
অবশেষে আমরা গ্রুপটি আবার শুরু করেছি যাতে সমস্ত স্থানীয় অ্যাসাইনমেন্ট পূর্বাবস্থায় ফিরে যায়। স্থানীয় বরাদ্দকরণ বর্ণের catcode পরিবর্তন A
, B
, C
, ... যা ম্যাক্রো তৈরি করা হয়েছে, যাতে তারা তাদের স্বাভাবিক চিঠি অর্থ ফিরে আসতে এবং নিরাপদে টেক্সট ব্যবহার করা যাবে। এবং এটাই. এখন \S
সেখানে সংজ্ঞায়িত ম্যাক্রো উপরের মত লেখার প্রক্রিয়াকরণকে ট্রিগার করবে।
এই কোড সম্পর্কে একটি আকর্ষণীয় বিষয় হ'ল এটি সম্পূর্ণ প্রসারিত। এটি হ'ল, আপনি এটির বিস্ফোরণ ঘটবে ing এমনকি কোনও শব্দের শেষ বর্ণটি \if
পরীক্ষার ক্ষেত্রে দ্বিতীয়টির মতো (যে কারণে আপনার প্রয়োজন হবে) একই কিনা তা পরীক্ষা করতে আপনি কোডটি ব্যবহার করতে পারেন :
\if\S{here} true\else false\fi % prints true (plus junk, which you would need to handle)
\if\S{test} true\else false\fi % prints false
(সম্ভবত খুব বেশি) শব্দযুক্ত ব্যাখ্যাটির জন্য দুঃখিত। আমি অ টেক্সিজকেও এটি যথাসম্ভব স্পষ্ট করার চেষ্টা করেছি :)
অধৈর্য জন্য সংক্ষিপ্তসার
ম্যাক্রো \S
একটি সক্রিয় চরিত্রের সাহায্যে ইনপুটটিকে পূর্বে অন্তর্ভুক্ত করে B
যা কোনও চূড়ান্ত স্থান দ্বারা ডিলিমেটেড টোকেনগুলির তালিকা ধরে এবং এগুলিতে প্রেরণ করে C
। C
সেই তালিকায় প্রথম টোকেন নেয় এবং এটি টোকেন তালিকার শেষের দিকে নিয়ে যায় এবং D
যা অবশিষ্ট রয়েছে তা দিয়ে প্রসারিত হয়। D
"কী অবশিষ্ট রয়েছে" খালি আছে কিনা তা পরীক্ষা করে দেখুন, এক্ষেত্রে একক-বর্ণের শব্দ পাওয়া গেছে, তবে কিছুই করবেন না; অন্যথায় প্রসারিত হয় E
। E
শব্দটির শেষ অক্ষরটি না পাওয়া পর্যন্ত টোকেন তালিকার মধ্য দিয়ে লুপ করে, যখন এটি পাওয়া যায় যে শেষ অক্ষরটি পরে থাকে, তারপরে শব্দের মাঝখানে থাকে, তারপরে টোকেন স্ট্রিমের শেষে প্রথম অক্ষরটি অনুসরণ করা হয় C
।
Hello, world!
হয়ে যায়,elloH !orldw
(একটি অক্ষর হিসাবে বিরামচিহ্ন অদলবদল) বাoellH, dorlw!
(বিরামচিহ্ন স্থানে রাখা)?