আপনি কেবল দুটি সংখ্যার তুলনায় তুলনা করতে dc
পারেন:
dc -e "[$1]sM $2d $1<Mp"
... যেখানে "$1"
আপনার সর্বোচ্চ মান এবং "$2"
এটির চেয়ে কম হলে আপনি যে সংখ্যাটি মুদ্রণ করবেন তা "$1"
। এটির জন্যও জিএনইউ দরকার dc
- তবে আপনি একই জিনিস পোর্টেবলের মতো করতে পারেন:
dc <<MAX
[$1]sM $2d $1<Mp
MAX
উপরের দুটি ক্ষেত্রেই আপনি 0 (ডিফল্ট) এর মতো অন্য কিছুতে নির্ভুলতা সেট করতে পারেন ${desired_precision}k
। উভয়ের জন্য এটিও জরুরী যে আপনি যাচাই করেছেন যে উভয় মান অবশ্যই সংখ্যার কারণ কল / ডাকে অপারেটর dc
করতে পারে ।system()
!
নিম্নলিখিত ছোট স্ক্রিপ্টের সাথে (এবং পরবর্তী)grep -v \!|dc
আপনারও ইনপুটটি যাচাই করা উচিত - পছন্দসই বা যথেচ্ছভাবে ইনপুটটি দৃ rob়তার সাথে পরিচালনা করতে কিছু। আপনার এও জানা উচিত যে dc
negativeণাত্মক সংখ্যাকে _
উপসর্গের চেয়ে উপসর্গের সাথে ব্যাখ্যা করে -
- কারণ পরবর্তীটি বিয়োগফল অপারেটর।
যে ছাড়াও এই স্ক্রিপ্টের সাথে dc
পড়তে হবে হিসাবে অনেক অনুক্রমিক \n
ewline সংখ্যার পৃথক হিসাবে আপনি এটা প্রদান যত্ন নেবেন, এবং প্রতিটি হয় আপনার জন্য প্রিন্ট $max
মান বা ইনপুট, যার উপর নির্ভর করে Wo কম হল:
dc -e "${max}sm
[ z 0=? d lm<M p s0 lTx ]ST
[ ? z 0!=T q ]S?
[ s0 lm ]SM lTx"
তাই ... যারা প্রতিটি [
বর্গ বন্ধনী করা ]
expanses একটি হল dc
স্ট্রিং বস্তুর যে S
কোনো একটি - তার নিজ নিজ অ্যারের প্রতিটি aved T
, ?
অথবা M
। স্ট্রিংয়েরdc
সাথে কিছু অন্যান্য কাজ করা যেতে পারে , এটি ম্যাক্রো হিসাবেও এটিকে উত্সাহিত করতে পারে । আপনি যদি এটি ঠিকঠাকভাবে সাজান তবে একটি সম্পূর্ণ কার্যকরী ছোট স্ক্রিপ্টটি কেবল যথেষ্ট পরিমাণে একত্রিত হয়।x
dc
dc
একটি স্ট্যাক উপর কাজ করে । সমস্ত ইনপুট অবজেক্টগুলি প্রতিটি শেষের দিকে স্ট্যাক করা হয় - প্রতিটি নতুন ইনপুট অবজেক্ট সর্বশেষ শীর্ষ বস্তু এবং তার নীচে সমস্ত বস্তু এক হিসাবে যুক্ত হওয়ার সাথে সাথে স্ট্যাকের নীচে চাপিয়ে দেয়। কোনও বস্তুর সর্বাধিক উল্লেখগুলি শীর্ষ স্ট্যাক মানের সাথে থাকে এবং সর্বাধিক উল্লেখগুলি স্ট্যাকের শীর্ষে পপ হয় (যা নীচে সমস্ত বস্তু একের সাথে টান দেয়) ।
মূল স্ট্যাকটি ছাড়াও, আরও রয়েছে (কমপক্ষে) 256 অ্যারে এবং প্রতিটি অ্যারের উপাদানটি স্ট্যাকের সাথে সমস্ত নিজস্ব হয়। আমি এখানে খুব বেশি ব্যবহার করি না। আমি উল্লিখিত স্ট্রিংগুলি কেবলমাত্র সংরক্ষণ করি যাতে আমি l
যখন চাইতাম তখন সেগুলি ওড করতে পারি এবং শর্তসাপেক্ষে এটিকে উত্সাহিত করতে পারি x
, এবং আমি অ্যারের শীর্ষে মানটি s
ছিঁড়ে ফেলি ।$max
m
যাইহোক, dc
আপনার শেল-স্ক্রিপ্টটি কী করে এই মূলত কিছুটা করে। এটি GNU-ism -e
বিকল্পটি ব্যবহার করে - dc
সাধারণত স্ট্যান্ডার্ড-ইন থেকে এটির পরামিতিগুলি নেয় - তবে আপনি একইভাবে করতে পারেন:
echo "$script" | cat - /dev/tty | dc
... $script
উপরের বিটের মতো দেখতে যদি ।
এটি এর মতো কাজ করে:
lTx
- এই l
ওডস এবং ই x
শীর্ষে সঞ্চিত ম্যাক্রোকে এক্সুট করে তোলে T
(পরীক্ষার জন্য, আমি অনুমান করি - আমি সাধারণত নামগুলি নির্বিচারে চয়ন করি) ।
z 0=?
- T
এরপরে স্ট্যাকের গভীরতা ডাব্লু / z
এবং পরীক্ষা করে , যদি স্ট্যাকটি খালি থাকে (পড়ুন: 0 টি অবজেক্ট ধারণ করে) এটি ?
ম্যাক্রোকে কল করে ।
? z0!=T q
- ?
ম্যাক্রোটি ?
dc
বিল্টিন কমান্ডের জন্য নামকরণ করা হয়েছে যা স্টিডিনের ইনপুটটির একটি লাইন পড়ে, তবে আমি z
এটিতে আরও একটি স্ট্যাক গভীরতার পরীক্ষা যুক্ত করেছি, যাতে এটি q
ফাঁকা লাইনে টানলে বা ইওএফ হিট হলে পুরো ছোট্ট প্রোগ্রামটি তৈরি করতে পারে। তবে যদি এটির !
পরিবর্তে এবং সফলভাবে স্ট্যাকটি পপুলেটে না করে তবে এটি T
পুনরায় ইস্টকে কল করে ।
d lm<M
- T
এরপরে d
স্ট্যাকের শীর্ষটি সরানো হবে এবং এর সাথে তুলনা করা হবে $max
(সঞ্চিত হিসাবে m
) । যদি m
কম মান হয় dc
তবে M
ম্যাক্রোকে কল করুন ।
s0 lm
- M
কেবল স্ট্যাকের শীর্ষটিকে পপ করে এবং এটিকে ডামি স্কেলারে ফেলে দেয় 0
- স্ট্যাকটি পপ করার কেবলমাত্র সস্তা উপায়। এটি l
এস্টে m
ফেরার আগে আবারও ওডস হয় T
।
p
- এর অর্থ হ'ল যদি m
স্ট্যাকের বর্তমান শীর্ষের চেয়ে কম হয়, তবে m
এটি প্রতিস্থাপন করুন ( d
যাইহোক যাইহোক, এটির ফলস্বরূপ) এবং এখানে p
rinted হয়, অন্যথায় এটি হয় না এবং p
পরিবর্তে ইনপুটটি কীভাবে rinted হয়।
s0
- এর পরে (কারণ p
স্ট্যাকটি পপ করে না) আমরা স্ট্যাকের শীর্ষটি 0
আবার dumpুকিয়ে দেই এবং তারপরে ...
lTx
- পুনরাবৃত্তির সাথে আরও একবার এটিকে আবার l
উত্তেজিত করুন ।T
x
সুতরাং আপনি এই ছোট স্নিপেটটি চালাতে এবং ইন্টারেক্টিভভাবে আপনার টার্মিনালে নম্বর টাইপ করতে পারেন এবং আপনি যে নম্বরটি লিখেছিলেন সেটির নামটি dc
বা $max
আপনার টাইপ করা সংখ্যাটি আরও বড় হলে আপনার মানটি আবার মুদ্রণ করতে পারে । এটি স্ট্যান্ডার্ড ইনপুট হিসাবে কোনও ফাইল (যেমন একটি পাইপ) গ্রহণ করবে । এটি খালি লাইন বা ইওএফ-এর মুখোমুখি না হওয়া অবধি পড়া / তুলনা / মুদ্রণ লুপটি চালিয়ে যাবে।
যদিও এই সম্পর্কে কিছু নোট - আমি এটি কেবল আপনার শেল ফাংশনটিতে আচরণ অনুকরণ করার জন্য লিখেছি, সুতরাং এটি কেবল দৃ line়তার সাথে প্রতি লাইনে একটি সংখ্যা পরিচালনা করে। dc
যাইহোক, প্রতি লাইনে যতগুলি পৃথক পৃথক সংখ্যক হ্যান্ডল করতে পারে আপনি এটি নিক্ষেপ করার যত্ন নেবেন। তবে , লাইনের শেষ সংখ্যাটি স্ট্যাক করার কারণে এটি প্রথম চালিত হয় এবং তাই লিখিত হিসাবে, dc
আপনি যদি প্রতি লাইনে প্রতি একাধিক সংখ্যক মুদ্রণ / টাইপ করেন তবে এর ফলাফলটি বিপরীতে মুদ্রণ করবে proper সঠিকভাবে এটি হ্যান্ডেল করা মানে অ্যারেতে একটি লাইন সঞ্চয় করা, তারপরে এটি কাজ করা।
এটার মত:
dc -e "${max}sm
[ d lm<M la 1+ d sa :a z0!=A ]SA
[ la d ;ap s0 1- d sa 0!=P ]SP
[ ? z 0=q lAx lPx l?x ]S?
[q]Sq [ s0 lm ]SM 0sa l?x"
তবে ... আমি জানি না যে আমি এটিকে আরও গভীরতার সাথে ব্যাখ্যা করতে চাই কিনা। এটি যথেষ্ট বলুন যে dc
স্ট্যাকের প্রতিটি মান হিসাবে এটি পড়ছে এটি তার মূল্য বা $max
একটি এর সূচকযুক্ত অ্যারেতে এর মান সংরক্ষণ করে এবং এটি যখন স্ট্যাকটি আবার খালি হয় তা সনাক্ত করে, তারপরে এটি অন্য সূচিপত্রকে অন্যটি পড়ার চেষ্টা করার আগে মুদ্রণ করে ইনপুট লাইন।
এবং তাই, প্রথম স্ক্রিপ্টটি যখন ...
10 15 20 25 30 ##my input line
20
20
20
15
10 ##see what I mean?
দ্বিতীয়টি করে:
10 15 20 25 30 ##my input line
10 ##that's better
15
20
20 ##$max is 20 for both examples
20
আপনি যদি k
কমান্ডটি দিয়ে প্রথমে সেট করেন তবে আপনি নির্বিচারে নির্ভুলতার ফ্লোটগুলি পরিচালনা করতে পারেন । এবং আপনি স্বাধীনভাবে i
এনপুট বা o
আউটপুট রেডাইসগুলি পরিবর্তন করতে পারেন - যা কখনও কখনও আপনি আশা নাও করার কারণে কার্যকর হতে পারে। উদাহরণ স্বরূপ:
echo 100000o 10p|dc
00010
... যা প্রথমে dc
100000 এ আউটপুট রেডিক্স সেট করে তারপরে 10 টি প্রিন্ট করে।