একটি এক্সিকিউটেবল স্ক্রিপ্ট ফাইল যা পসিক্স এবং উইন্ডোতে চলে


16

চ্যালেঞ্জ : একটি একক স্ক্রিপ্ট ফাইল লিখুন foo.cmdযা cmd.exeস্বেচ্ছাসেবী উইন্ডোজ-নির্দিষ্ট কোড সম্পাদন করতে ভ্যানিলা উইন্ডোজ প্রম্পট (পাওয়ারশেল নয়, প্রশাসক মোডে নয়) থেকে আহ্বান করা যেতে পারে ...

> .\foo.cmd
Hello Windows! 

... কিন্তু আরো একটি টিপিক্যাল POSIX-অনুবর্তী (লিনাক্সের / ওএসএক্স) থেকে অবিকৃত শেল প্রার্থনা করা প্রম্পট ( bash, tcsh, অথবা zsh), নির্বিচারে POSIX-নির্দিষ্ট কোড সঞ্চালিত হয়ে:

$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!

... তৃতীয় পক্ষের দোভাষী / সরঞ্জামগুলির ইনস্টলেশন বা নির্মাণের প্রয়োজন ছাড়াই।

আমি জানি এটি সম্ভব, তবে ক্রাফ্টের সাহায্যে (যেমন উইন্ডোজে, "হ্যালো উইন্ডোজ!" এর আগে স্টারডার বা স্টাডআউটে এক বা দুটি লাইনের আবর্জনা / ত্রুটি-বার্তা প্রিন্ট করা হয়)।

বিজয়ী মানদণ্ড হ'ল (প্রথম) ক্রুফট লাইনের সংখ্যা এবং (দ্বিতীয়) ক্রুফট অক্ষরের সংখ্যা হ্রাস করা।

ক্রাফ্টকে এমন কোনও কনসোল আউটপুট (স্টাডআউট বা স্ট্ডার) হিসাবে সংজ্ঞায়িত করা যেতে পারে যা (স্বেচ্ছাসেবী) পেডলোড কোড দ্বারা উত্পাদিত হয় না। ফাঁকা রেখাগুলি লাইন গণনায় গণনা করা হয়। নিউলাইনগুলি চরিত্রের গণনায় গণনা করা হয় না। ক্রাফট স্কোর উভয় প্ল্যাটফর্ম জুড়ে সংক্ষিপ্ত করা উচিত। আসুন এই প্রক্রিয়াটিকে অগ্রাহ্য করি clsক্রুফটিকে সরিয়ে ফেলুন তবে আগের টার্মিনাল আউটপুটটি ফাঁকা করার জন্য ব্যয় করে। যদি উইন্ডোজ আপনার কমান্ডগুলি ইকোস করে কারণ আপনি @echo offএখনও সক্রিয় করেন নি, আসুন বর্তমান ডিরেক্টরি এবং প্রম্পট মুদ্রণে ব্যয় করা অক্ষরগুলি বাদ দিন।

গৌণ মানদণ্ডটি হ'ল অভ্যন্তরের সমাধানের সরলতা / কমনীয়তা foo.cmd: যদি "অবকাঠামো" নির্ধারণ করা হয় এমন কোনও চরিত্র হিসাবে যে স্বেচ্ছাচারিত পেওলড কোডের সাথে সরাসরি জড়িত না হয়, তবে প্রথমে অবকাঠামোগুলি অক্ষর ধারণ করে এমন রেখাগুলির সংখ্যা কমিয়ে দিন এবং দ্বিতীয়টি সামগ্রিক অবকাঠামোর সংখ্যা চরিত্র.

পোরিক্স অংশটি সিআরএলএফ লাইন-এন্ডিং থাকা সত্ত্বেও যদি পসিক্স অংশটি কাজ করে তবে অতিরিক্ত কুডোস! (শেষ অংশটি এমনকি সম্ভব কিনা তা নিশ্চিত নই।)

আমার বিদ্যমান সমাধানটি, যা আমি এখানে অন্য পোস্ট করার পরে এখানে পোস্ট করব, lines টি লাইনের অবকাঠামো কোড ব্যবহার করে (52 টি নতুন অক্ষর বাদে অক্ষর)। এটি ক্রাফটের 5 টি লাইন তৈরি করে, যার মধ্যে দুটি ফাঁকা, এর সবগুলি উইন্ডোজে ঘটে (30 টি অক্ষর নিউলাইনগুলি বাদ দিয়ে এবং বর্তমান ডিরেক্টরি / প্রম্পট স্ট্রিং বাদ দেয় যা সেই দুটি লাইনে প্রদর্শিত হয়)।


হয়েছে , আগে একটি শেল / ব্যাচ স্ক্রিপ্ট হতে?
বিড়াল

1
ডসগুলির জন্য কি কেউ চেষ্টা করে দেখার চেষ্টা করে?
ডিজিটাল ট্রমা

1
আমি এটি একটি পেয়েছি তবে এটি আমাকে ":", "\", "{" বা "}" অক্ষরগুলিতে প্রবেশ করতে দেয় না: - /
ডিজিটাল ট্রমা

@ ডিজিটালট্রামা ওয়াইন আছে (যা আপনি ইনস্টল করা উচিত, যদি আপনি এটি করেন না তবে এটি কার্যকর)
বিড়াল

1
@ বিড়াল ধন্যবাদ - আমার উত্তরটি এখন ওয়াইনের আওতায় কাজ করছে বলে মনে হচ্ছে।
ডিজিটাল ট্রমা

উত্তর:


15

0 ক্রাফ্ট লাইন, 0 ক্রাফ্ট চর, 2 ইনফ্রা। লাইন, 21 ইনফ্রা। অক্ষর, সিআরএলএফ ঠিক আছে

:<<@goto:eof
@echo Hello Windows!
@goto:eof
echo "Hello POSIX!" #

অন্য সমাধান সরিয়ে ফেলেছে।

exit /bডিজিটাল ট্রমার জবাব থেকে 17 টি অক্ষর ব্যবহার :

:<<@exit/b
@echo Hello Windows!
@exit/b
echo "Hello POSIX!" #

শক্ত প্রতিযোগী! বিশেষত দ্বিতীয় সংস্করণ (সরলতা / কমনীয়তার মাপদণ্ডে, প্রথম ভার্সনটি যেভাবে পেইলড লাইনগুলি মুঙ্গ করতে হবে না তা অনেক সুন্দর)। এটি আমার জন্য উইন্ডোজ এবং ওএসএক্সে চলে। প্রথমদিকে আমি একটি লাইন ক্রাফ্ট পেয়েছিলাম : command not foundযখনই বলি যখনই একটি ফাঁকা লাইন প্যাসিক্স পেলোডে প্রবেশ করবে তবে অবশেষে আমি বুঝতে পেরেছিলাম যে :এটি প্রথম লাইনে নয় বরং সিআরএলএফ দ্বারা সুরক্ষিত না থাকার কারণে #। এটি আমার কাছে খবর ছিল যে একটি #!লাইনের প্রয়োজন নেই - এটি আমার আগের সংস্করণে উইন্ডোজ ক্রাফটের দুটি লাইনের জন্য দায়ী ছিল।
jez

প্রথম সংস্করণ স্কোর-যেহেতু এটা সম্ভবতঃ অক্ষর যোগ করা কঠিন : ` >&3` \ থেকে যে পে লোড লাইন, আমি আপনাকে বলতে পারে এর পরিকাঠামো খরচ ইচ্ছামত বেশী অনুমান।
jez

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

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

দেখে মনে হচ্ছে আমাদের উত্তরগুলি রূপান্তরিত হচ্ছে ;-) হেরডোক ব্যবহারের পরেও আপনার কাছে স্কোরিংয়ের প্রান্ত রয়েছে। চূড়ান্ত কি #প্রয়োজনীয়?
ডিজিটাল ট্রমা

4

স্কোর 0 ক্রাফ্ট + 4 ইনফ্রা লাইন + 32 ইনফ্রা অক্ষর। এলএফ এবং সিআরএলএফ ঠিক আছে।

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

@REM ()(:) #
@REM "
@ECHO Hello Windows!
@EXIT /B
@REM "
echo Hello POSIX!

ডস সিআরএলএফ বা * নিক্স এলএফ লাইনটি শেষ হওয়ার সাথে সাথে এটি উবুন্টু, ওএসএক্স এবং ওয়াইনগুলিতে কাজ করে:

ubuntu@ubuntu:~$ ./dosix.bat
Hello POSIX!
ubuntu@ubuntu:~$ wine cmd.exe
Wine CMD Version 5.1.2600 (1.6.2)

Z:\home\ubuntu>dosix.bat
Hello Windows!

Z:\home\ubuntu>exit
ubuntu@ubuntu:~$ 

এটি একটি * নিক্স মেশিনে (ওএসএক্স সহ) ঠিক (সিআরএলএফএস সহ) তৈরি করতে নিম্নলিখিত টার্মিনালে পেস্ট করুন:

[ $(uname) = Darwin ] && decode=-D || decode=-d
ubuntu@ubuntu:~$ base64 $decode > dosix.bat << EOF
QFJFTSAoKSg6KSAjDQpAUkVNICINCkBFQ0hPIEhlbGxvIFdpbmRvd3MhDQpARVhJVCAvQg0KQFJF
TSAiDQplY2hvIEhlbGxvIFBPU0lYIQ0K
EOF

ভাল দেখাচ্ছে! dosixখুব সুন্দর নাম। তবে আমার ম্যাকে (ওএস 10.9.4, ডারউইন কার্নেল সংস্করণ 13.3.0, জিএনইউ বাশ সংস্করণ 3.2.51) এটি চালাতে ব্যর্থ: ./dosix.cmd: line 13: syntax error: unexpected end of file কোনও ধারণা কেন?
jez

@ জেজগুলি নিশ্চিত করুন যে আপনি ইউটিএফ -8 এর সাথে এনকোড করা ফাইলটি সংরক্ষণ করেছেন এবং উইন্ডোজ লাইন শেষটি সংরক্ষণ করুন!
বিড়াল

আহ, এটি ঘটছিল কারণ আমার অজান্তে উইন্ডোজ লাইন-এন্ডিং ছিল এবং প্রথম সংস্করণটি ব্যবহার করা হয়েছিল।
jez

নোট করুন যে আপনি বাশের মধ্যে সিআর অক্ষর ইনপুট করতে পারেন (বা সিভি) সন্নিবেশ করান, (বা সিএম) প্রবেশ করান।
jimmy23013

@ জেজ তাই এই 0 টি ক্রাফট লাইন + 4 অবকাঠামো লাইন + 32 অবকাঠামো চর হিসাবে স্কোর করে। এই সংখ্যাগুলি কি কোনও অর্থবহ উপায়ে একত্রিত করে তুলনার জন্য একটি একক স্কোর তৈরি করতে হবে?
ডিজিটাল ট্রমা

2

আমি ইতিমধ্যে আমার যে সমাধানটি ব্যবহার করছিলাম তা পোস্ট করব, কারণ এটি ইতিমধ্যে মারধর করা হয়েছে। এটি আমার এক সহকর্মীর সৌজন্যে যিনি আমার মতে ডিজিটাল ট্রমা হিসাবে একই ব্লগ এন্ট্রিটি পড়ে থাকতে হবে ।

#!/bin/sh # >NUL 2>&1
echo \
@goto c \
>/dev/null
echo "Hello Posix!"
exit
:c
@echo Hello Windows!
  • উইন্ডোজ ক্রাফ্ট: 5 টি লাইন (যার মধ্যে দুটি ফাঁকা) / 30 টি অক্ষর
  • ওএসএক্স ক্রাফট: 0
  • অবকাঠামো: 6 লাইন / 52 অক্ষর
  • সিআরএলএফ সামঞ্জস্যতা: কেবলমাত্র যদি #!লাইনে নামকরণ করা দোভাষী তার পাত্তা না দেয় (সুতরাং প্রমিত স্ট্যান্ডার্ড দোভাষী shএবং বন্ধুবান্ধবদের ক্ষেত্রে এটি ব্যর্থ হয়)

পসিক্সে একটি স্ক্রিপ্ট সর্বদা শুরু হয় #!, যার অর্থ পসিক্স সিস্টেমে একটি বৈধ স্ক্রিপ্ট হওয়া এখন পর্যন্ত আপনার একমাত্র উত্তর। নিশ্চিত হয়ে নিন যে অন্যদের মধ্যে কেউ যদি চালাতে পারে তবে - তবে কেবল ত্রুটিযুক্ত স্ক্রিপ্টগুলির জন্য এগুলি শেল থেকে শুরু করে যদি কার্যকর হয় না।
ক্যাস্পারড

জানা ভাল! আমি অনুমান করি আমি পসিক্স সম্মতির জন্য কঠোর মানদণ্ডে অস্পষ্ট। আমার আসল লক্ষ্য হ'ল স্ক্রিপ্ট ফাইলগুলি যা "বেশিরভাগ" আধুনিক ডেস্কটপ সিস্টেমে "বক্সের বাইরে" কাজ করে, যার অর্থ যাই হোক না কেন - উইন্ডোজ 7/8/10, উবুন্টু, ওএসএক্স ... শেবাংলেস স্ক্রিপ্টগুলির জন্য বিশ্বব্যাপী কতটা সর্বজনীন, আমি অবাক? যাইহোক, আমি নিজের কাছে পয়েন্টগুলি পুরষ্কার দিতে যাচ্ছি না :-)
jez

আমি লক্ষ্য করিনি যে উত্তর এবং প্রশ্ন উভয়ই একই ব্যক্তি লিখেছিলেন। আমি মনে করি যে আমি যে শেলগুলির সাথে কাজ করেছি #!সেগুলির একটি অনুপস্থিত রেখার জন্য একটি কার্যপ্রণালী রয়েছে , তবে তারা স্ক্রিপ্টটির ব্যাখ্যার জন্য বিভিন্ন শেল ব্যবহার করবে। এর অর্থ একটি "স্ক্রিপ্ট" যা দিয়ে শুরু #!হয় না শুধুমাত্র একটি শেল নয়, তবে প্রতিটি শেল যা এটির দ্বারা ব্যাখ্যাযোগ্য হতে পারে তা বৈধ হতে হবে। তবে আরও খারাপ এটি অন্য শেল থেকে শুরু করার সময় কেবল কাজ করে। এই জাতীয় স্ক্রিপ্টটি কমান্ড লাইন থেকে কাজ করতে পারে তবে আপনি যে প্রসঙ্গে অবশেষে এটি ব্যবহার করার ইচ্ছা করছেন সেই প্রসঙ্গে নয়।
ক্যাস্পারড

আপনাকে ধন্যবাদ, এটি খুব শিক্ষাগত সামগ্রী এবং ঠিক এই ধরণের চ্যালেঞ্জটি শুরু করে আমি শিখার আশা করেছি thing যে ক্ষেত্রে এটি (বা সম্ভবত) গুরুত্বপূর্ণ হবে, #!আমার সম্পাদিত উত্তরের লাইনটি (২১ টি অক্ষরের সাথে 1 অবকাঠামো লাইন) অন্য কারও উত্তরের সাথে উইন্ডোজ-কেবলমাত্র দুটি লাইন ক্রাফ্ট ব্যয়ে (যার মধ্যে একটি ফাঁকা রয়েছে) বা একত্রিত করা যেতে পারে বা 23 অক্ষর।
jez

2

উত্তর এবং আলোচনার সংক্ষিপ্তসার / সংশ্লেষণ

এই মজা ছিল, এবং আমি অনেক শিখেছি।

কিছু উইন্ডোজ-নির্দিষ্ট ক্রাফ্ট অনিবার্য যদি আপনার পসিক্স সিস্টেমে আপনার স্ক্রিপ্টটি একটি #!লাইন দিয়ে শুরু করা দরকার । এটি করা ছাড়া যদি আপনার বিকল্প না থাকে তবে এই লাইনটি:

#!/bin/sh # 2>NUL

এটি সম্ভবত এটি সেরা। এটি উইন্ডোজ কনসোলে একটি ফাঁকা রেখা এবং ক্রাফটের একটি লাইন আউটপুট তৈরি করে। যাইহোক, যদি আপনি পারেন একটি ছাড়া দূরে পেতে সক্ষম হবেন #!লাইন: সবচেয়ে সিস্টেমে শেলটি দোভাষী এক স্ক্রিপ্ট চালাতে শেষ হবে (যে তা বিশ্বজুড়ে আন্দাজের নয় যা ব্যাখ্যাকারী যে হতে হবে - এটা উপর নির্ভর করে, কিন্তু অবিচ্ছিন্নভাবে অভিন্ন হওয়ার দরকার নেই, আপনি শেলটি কমান্ডটি চাওয়ার জন্য ব্যবহার করেন)

সেই জটিল প্রথম লাইনের বাইরেও কিছু সত্যিকারের উদ্ভাবনী ক্রফলেস সমাধান ছিল। জিমি ২৩০১৩ এর বিজয়ী জমাটি কেবল দুটি স্বল্প অবকাঠামো লাইন নিয়ে গঠিত এবং :উভয় প্ল্যাটফর্মে একটি "নীরব" লাইন প্রয়োগ করতে চরিত্রটির দ্বৈত ভূমিকা ব্যবহার করেছে ( ডি-ফ্যাক্টো নো-এপ shএবং বন্ধু হিসাবে এবং লেবেল হিসাবে) চিহ্নিতকারী cmd.exe):

:<<@exit/b

:: Arbitrary Windows code goes here

@exit/b
#
# Arbitrary POSIX code goes here 

এটা তোলে হয় এমনকি CRLF লাইন শেষা w শ সত্ত্বেও POSIX সিস্টেমে যেমন একটি স্ক্রিপ্ট চালানোর জন্য, কিন্তু অধিকাংশ দোভাষী আপনি শেষ করতে আছে তাদের জন্য এই কাজ করা সম্ভব যে একটি মন্তব্য বা মন্তব্যের অক্ষর দিয়ে আপনার POSIX অধ্যায় লাইন (এমনকি ফাঁকা রেখা)।

পরিশেষে, প্রত্যেকের ইনপুটটির ভিত্তিতে আমি বিকাশ করেছি এমন দুটি সমাধানের জন্য এখানে দুটি রূপ রয়েছে। তারা প্রায় সমস্ত বিশ্বের সেরা হতে পারে , এতে তারা অভাব থেকে ক্ষতি হ্রাস করে #!এবং সিআরএলএফ-সামঞ্জস্যকে আরও মসৃণ করে তোলে। দুটি অতিরিক্ত অবকাঠামো লাইন প্রয়োজন। অপ্রত্যাশিত POSIX শেল দ্বারা কেবল একটি (মানযুক্ত) লাইনটি ব্যাখ্যা করতে হবে এবং সেই লাইনটি আপনাকে বাকী স্ক্রিপ্টের জন্য শেলটি নির্বাচন করতে দেয় ( bashনিম্নলিখিত উদাহরণে):

:<<@GOTO:Z

@echo Hello Windows!

@GOTO:Z
bash "$@"<<:Z
#
echo "Hello POSIX!" #
ps # let's throw this into the payload to keep track of which shell is being used
#
:Z

এই বংশগত সমাধানগুলির সৌন্দর্যের অংশটি হ'ল তারা এখনও সিআরএলএফ-মজবুত: যতক্ষণ না লাইনের শেষে<<:Z আসবে , হেরাদোক প্রসেসরটি আসলে টোকেনটি সন্ধান করবে এবং খুঁজে পাবে:Z\r

একটি চূড়ান্ত মোড় হিসাবে, আপনি \rশেল থেকে লাইনগুলি কেটে যাওয়ার আগে অক্ষরগুলি কেটে ফেলা করে, সেইসব জটিল-প্রান্তের লাইনের মন্তব্যগুলি থেকে মুক্তি পেতে পারেন এবং এখনও CRLF- দৃust়তা ধরে রাখতে পারেন। এটি অপ্রত্যাশিত শেলটিতে কিছুটা বেশি বিশ্বাস স্থাপন করে (এটির { tr -d \\r|bash;}পরিবর্তে (tr -d \\r|bash)কোঁকড়ানো বন্ধনীগুলি কেবল ব্যাশ-কেবল সিনট্যাক্স হিসাবে ব্যবহার করা ভাল হবে):

:<<@GOTO:Z

@echo Hello Windows!

@GOTO:Z
(tr -d \\r|bash "$@")<<:Z

echo "Hello POSIX!"
ps

:Z

অবশ্যই, এই পদ্ধতির স্ক্রিপ্টে স্টিডিন ইনপুট পাইপ করার ক্ষমতা ত্যাগ করে।

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