এই সাইটের দোভাষী ট্যাগে বিভিন্ন ভাষা প্রয়োগের সাথে জড়িত অনেক সমস্যা ছিল । যাইহোক, কার্যতঃ এগুলি সমস্তই গুপ্ত ভাষা ছিল যা কেউ ব্যবহার করে না। ব্যবহারিক ভাষার জন্য দোভাষী তৈরি করার সময় যা এখানকার বেশিরভাগ ব্যবহারকারী সম্ভবত ইতিমধ্যে জানেন। হ্যাঁ, এটি শেল স্ক্রিপ্ট, যদি আপনার শিরোনামটি পড়তে সমস্যা হয় (তবে এটি আপনার নেই)। (হ্যাঁ, আমি ইচ্ছাকৃতভাবে এই চ্যালেঞ্জটি করেছি, যেহেতু আমি গল্ফস্ক্রিপ্ট এবং বেফুঞ্জের মতো সব কিছু জয়ের মত ভাষাগুলিতে বিরক্ত হয়েছি, তাই আমি আরও কিছু চ্যালেঞ্জ রেখেছি যেখানে আরও ব্যবহারিক প্রোগ্রামিং ভাষায় জয়ের বড় সম্ভাবনা রয়েছে)
তবে শেল স্ক্রিপ্টটি তুলনামূলকভাবে বড় ভাষা, সুতরাং আমি আপনাকে এটি প্রয়োগ করতে বলব না। পরিবর্তে, আমি শেল স্ক্রিপ্ট কার্যকারিতা একটি ছোট উপসেট তৈরি করতে যাচ্ছি।
আমি যে সাবসেটটির বিষয়ে সিদ্ধান্ত নিয়েছি তা হ'ল নিম্নলিখিত উপসেটটি:
- প্রোগ্রামগুলি কার্যকর করা (প্রোগ্রামগুলিতে কেবলমাত্র অক্ষর থাকবে, তবে একক উদ্ধৃতি অনুমোদিত হলেও)
- প্রোগ্রাম আর্গুমেন্ট
- একক উদ্ধৃতি (একক উদ্ধৃতি ব্যতীত হোয়াইটস্পেস সহ কোনও মুদ্রণযোগ্য ASCII অক্ষর গ্রহণ করা)
- অব্যাহত স্ট্রিং (এএসসিআইআই অক্ষর, সংখ্যা এবং ড্যাশগুলির অনুমতি দেওয়া)
- পাইপ
- খালি বিবৃতি
- একাধিক বিবৃতি নতুন লাইনের দ্বারা পৃথক করা
- চলমান / শীর্ষস্থানীয় / একাধিক স্পেস
এই টাস্কে আপনাকে এসটিডিআইএন থেকে ইনপুটটি পড়তে হবে এবং অনুরোধ করা প্রতিটি কমান্ড চালাতে হবে। আপনি নিরাপদে POSIX- সামঞ্জস্যপূর্ণ অপারেটিং সিস্টেম ধরে নিতে পারেন, সুতরাং উইন্ডোজের সাথে পোর্টেবিলিটি বা এর মতো কোনও দরকার নেই। আপনি নিরাপদে ধরে নিতে পারেন যে প্রোগ্রামগুলি অন্য প্রোগ্রামগুলিতে পাইপ করা হয় না সেগুলি STDIN থেকে পড়বে না। আপনি নিরাপদে ধরে নিতে পারেন যে কমান্ডগুলি উপস্থিত থাকবে। আপনি নিরাপদে ধরে নিতে পারেন যে অন্য কিছু ব্যবহার করা হবে না। যদি কিছু নিরাপদ অনুমান ভেঙে যায় তবে আপনি যে কোনও কিছু করতে পারেন। আপনি নিরাপদে সর্বাধিক 15 টি যুক্তি, এবং 512 অক্ষরের নীচে লাইন ধরে নিতে পারেন (যদি আপনার স্পষ্টরূপে মেমরির বরাদ্দ প্রয়োজন হয় বা কোনও কিছুর প্রয়োজন হয় - আমি সত্যই সি এর পক্ষে জয়ের ছোট সম্ভাবনা দেব, যদিও তারা এখনও ছোট)। আপনাকে ফাইল বর্ণনাকারী পরিষ্কার করতে হবে না।
সম্পূর্ণ লাইন পাওয়ার পরেও বা এসটিডিএন শেষ হওয়ার পরেও - আপনাকে যে কোনও সময়ে প্রোগ্রামগুলি সম্পাদন করার অনুমতি দেওয়া হয়েছে। আপনি চান যে কোনও পদ্ধতির চয়ন করুন।
সাধারণ টেস্টকেস যা আপনাকে আপনার শেলটি পরীক্ষা করতে দেয় (তৃতীয় কমান্ডের পরে ট্রেলিং হোয়াইটস্পেস নোট করুন):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
উপরের প্রোগ্রামটির ফলাফল নিম্নলিখিত হওয়া উচিত:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
শেলটি নিজেই চালিত করার অনুমতি নেই, যদি না আপনার কমান্ডের জন্য কোনও যুক্তি না থাকে (পার্লের জন্য এই ব্যতিক্রমটি তৈরি করা হয়েছিল, এটি শেলটিতে কমান্ডটি চালায় যখন কেবল যুক্তি দেওয়া হয় system
, তবে অন্যথায় এই ব্যতিক্রমটিকে অপব্যবহার করতে দ্বিধা বোধ করবেন না ভাষাগুলিও, আপনি যদি এমনভাবে অক্ষর সংরক্ষণ করতে পারেন) বা আপনি যে কমান্ডটি চালাচ্ছেন তা হ'ল শেল। এটি সম্ভবত এই চ্যালেঞ্জের মধ্যে সবচেয়ে বড় সমস্যা, কারণ অনেকগুলি ভাষায় system
ফাংশন রয়েছে যা শেল চালায়। পরিবর্তে ল্যাঙ্গনের subprocess
মডিউলটির মতো প্রোগ্রামগুলিকে সরাসরি কল করে এমন ভাষা API ব্যবহার করুন । এটি যাইহোক সুরক্ষার জন্য একটি ভাল ধারণা, এবং ভাল, আপনি কোনও সুরক্ষিত শেল তৈরি করতে চান না, আপনি চান? এটি সম্ভবত পিএইচপি থামায়, তবে যে কোনওভাবেই বেছে নিতে অন্য ভাষা রয়েছে।
আপনি শেল স্ক্রিপ্ট-এ আপনার প্রোগ্রাম করতে যাচ্ছে হয়, আপনি ব্যবহার করতে অনুমতি দেওয়া হয় না eval
, source
অথবা .
(, একটি ফাংশন, না একটি অক্ষর হিসাবে)। এটি আমার মতে চ্যালেঞ্জটিকে খুব সহজ করে তুলবে।
চালাক নিয়মের অপব্যবহার অনুমোদিত allowed আমি প্রচুর জিনিস স্পষ্টভাবে প্রত্যাখ্যান করেছি, তবে আমি নিশ্চিত যে আমার এখনও এমন জিনিস করার অনুমতি দেওয়া হচ্ছে যা আমি এখনও করি নি। লোকেরা কীভাবে আমার নিয়মকে ব্যাখ্যা করে সে সম্পর্কে আমি কখনও কখনও অবাক হয়ে যাই। এছাড়াও, মনে রাখবেন যে আমি উল্লেখ না করে এমন কোনও কিছুর জন্য আপনি কিছু করতে পারেন। উদাহরণস্বরূপ, আমি যদি ভেরিয়েবলগুলি ব্যবহার করার চেষ্টা করি তবে আপনি হার্ড ডিস্কটি মুছতে পারেন (তবে দয়া করে তা করবেন না)।
সংক্ষিপ্ততম কোডটি জয়ী হয়, কারণ এটি কোডগল্ফ।