কোড স্ট্রিং আউটপুট থেকে প্রস্থান করুন


18

আপনি একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যে, যখন একটি প্রদত্ত nonempty স্ট্রিং এস এর এন মুদ্রণযোগ্য ASCII অক্ষর , একটি প্রোগ্রাম যা প্রস্থান কোড সহ থেকে প্রস্থান করা হবে আউটপুট সি , যেখানে সি অবস্থান 0 এ হওয়া ASCII কোডপয়েন্ট হয় এস । এই প্রোগ্রামটি আপনি লিখতে হবে অতিরিক্ত আউটপুট একটি প্রোগ্রাম পি , যেমন যে, যখন চালানো, এটা প্রস্থান কোড সহ প্রস্থান করে সি ' , যেখানে সি' অবস্থান 1 হওয়া ASCII কোডপয়েন্ট হয় এস । প্রোগ্রাম পি ইচ্ছা আউটপুট অন্য প্রোগ্রাম পি ' । এই প্রক্রিয়া পুনরাবৃত্তি অবশেষে আর অক্ষর বাকি হয় এস। এটি সম্পন্ন হওয়ার পরে, আপনাকে অবশ্যই কোনও কিছুই আউটপুট করতে হবে না, তার পরে একটি alচ্ছিক নিউলাইন; এবং প্রস্থান কোড 0 দিয়ে প্রস্থান করা উচিত।

And0x20 এবং 0x7eসমেতের মধ্যে চরিত্রগুলি ।

আরও কিছু বিধি:

  • স্ব-সংশোধনকারী প্রোগ্রামগুলি অনুমোদিত নয়: আপনাকে অবশ্যই উত্সটি STDOUT এ আউটপুট করতে হবে (বা, প্রাথমিকভাবে ফেরতের মান)
  • আপনি নিজের উত্স কোডটি না পড়তে পারেন।

বাইটস মধ্যে সংক্ষিপ্ততম এই প্রোগ্রামটি জিতবে।

কিছু প্রাথমিক পরীক্ষার জন্য, এই রুবি স্ক্রিপ্টটি ব্যবহার করা যেতে পারে। (প্রথম যুক্তিটি হ'ল আপনি যেভাবে স্ক্রিপ্টটি চালু করবেন, দ্বিতীয়টি প্রোগ্রাম এবং তৃতীয়টি ইনপুট স্ট্রিং)

হাইপথেটিকাল উদাহরণ

বলুন প্রোগ্রামটি FOO। "ABC" স্ট্রিংটি দেওয়া হলে এটি আউটপুট হয় BARA। এই প্রোগ্রামটি কোড 65এবং আউটপুট সহ প্রস্থান করে BARB। এটি ঘুরে ফিরে কোড 66এবং আউটপুটগুলির সাথে প্রস্থান করে BARC। এই প্রোগ্রামটি কোড 67এবং আউটপুট সহ প্রস্থান করে BAR!। এটি কোনও ফল দেয় না এবং কোড সহ প্রস্থান করে 0


এই গণনাটি ফোরথের প্রস্থান কোড হিসাবে করবে? অন্যান্য ওএস ত্রুটিগুলি দেখতে প্যারামিটারটি পরিবর্তন করুন। 0সাফল্য। tio.run/nexus/…
mbomb007

@ mbomb007 আমি ফোর্থ সম্পর্কে খুব বেশি জানি না। এইভাবে কীভাবে ফোরটিতে একজন "ত্রুটি কোড" ব্যবহার করবেন?
কনর ও'ব্রায়েন

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

উত্তর:


6

পাইথন 2, 126 101 94 বাইট

এটি তৈরির প্রক্রিয়ায়, আমি খুঁজে পেয়েছি যে পাইথন কোডে আক্ষরিক NUL বাইট নাও থাকতে পারে।

lambda i,s='''i=%r;s=%r
try:print s%%(i[1:],s,i[0])
except:0
exit(ord(%r))''':s%(i[1:],s,i[0])

এটি অনলাইনে ব্যবহার করে দেখুন (ডিবাগের তথ্যে প্রস্থান কোডটি দেখায়)


নোট করুন যে নীচের খালি খালি প্রোগ্রামগুলির প্রত্যেকটিতে একটি ট্রেলিং লাইনফিড রয়েছে।

ইনপুট জন্য Hello, উপরের আউটপুট:

i='ello';s='i=%r;s=%r\ntry:print s%%(i[1:],s,i[0])\nexcept:print s%%(0,s,"\\0")*(i>0)\nexit(ord(%r))'
try:print s%(i[1:],s,i[0])
except:0
exit(ord('H'))

যা প্রিন্ট করে

...

যা প্রিন্ট করে

i='o';s='i=%r;s=%r\ntry:print s%%(i[1:],s,i[0])\nexcept:print s%%(0,s,"\\0")*(i>0)\nexit(ord(%r))'
try:print s%(i[1:],s,i[0])
except:0
exit(ord('l'))

যা প্রিন্ট করে

i='';s='i=%r;s=%r\ntry:print s%%(i[1:],s,i[0])\nexcept:print s%%(0,s,"\\0")*(i>0)\nexit(ord(%r))'
try:print s%(i[1:],s,i[0])
except:0
exit(ord('o'))

যা কিছুই মুদ্রণ করে না (খালি প্রোগ্রাম)

যা কিছুই প্রিন্ট করে এবং কোড 0 দিয়ে প্রস্থান করে।


4

পাইথন 3, 77 বাইট

p='exit(0)'
for c in input()[::-1]:p='print(%r);exit(ord(%r))'%(p,c)
print(p)

এই কোডটি STDIN থেকে ইনপুট নেয় এবং প্রথম প্রোগ্রামটি STDOUT এ আউটপুট করে।

যদি ইনপুট হয় ABCDE, ফলাফলগুলি

 0 print('print(\'print(\\\'print("print(\\\\\\\'exit(0)\\\\\\\');exit(ord(\\\\\\\'E\\\\\\\'))");exit(ord(\\\\\\\'D\\\\\\\'))\\\');exit(ord(\\\'C\\\'))\');exit(ord(\'B\'))');exit(ord('A'))
65 print('print(\'print("print(\\\'exit(0)\\\');exit(ord(\\\'E\\\'))");exit(ord(\\\'D\\\'))\');exit(ord(\'C\'))');exit(ord('B'))
66 print('print("print(\'exit(0)\');exit(ord(\'E\'))");exit(ord(\'D\'))');exit(ord('C'))
67 print("print('exit(0)');exit(ord('E'))");exit(ord('D'))
68 print('exit(0)');exit(ord('E'))
69 exit(0)
 0 

যেখানে প্রতিটি লাইনে প্রস্থান কোড এবং পূর্ববর্তী সম্পাদিত প্রোগ্রামের আউটপুট থাকে (প্রথম লাইনটি প্রথম প্রোগ্রাম)।


আপনার উত্তর আমার মত ... ঠিক আপনি বিপরীত দিকে এটি করেছেন ... আমি তার জন্য নিজেকে ফেসমেলিং করছি।
লিকি নুন


@ লেকিউন হ্যাঁ, তবে আমি আপনার উত্তরটি একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করি নি, যদি
এটিই

আমি শুধু বলছি যে আমার এটি চিন্তা করা উচিত ছিল।
লিকি নুন

@ ভলতাঃ আপনি 67 67 বাইটে গল্ফ যাচ্ছেন, না আমার আলাদা উত্তর হিসাবে পোস্ট করা উচিত?
mbomb007

3

পাইথন 3 , 115 108 100 বাইট

i=input()
r="%s"
k=""
for c in i:r%="print(%s\"%%s%s\");exit(%i)"%(k,k,ord(c));k+=k+"\\"
print(r%"")

এটি অনলাইন চেষ্টা করুন!


ইনপুটটির জন্য Hello, প্রোগ্রামটি মুদ্রণ করে:

print("print(\"print(\\\"print(\\\\\\\"print(\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\");exit(111)\\\\\\\");exit(108)\\\");exit(108)\");exit(101)");exit(72)

উপরের প্রোগ্রামটি প্রিন্ট করে:

print("print(\"print(\\\"print(\\\\\\\"\\\\\\\");exit(111)\\\");exit(108)\");exit(108)");exit(101)

এবং কোড সহ প্রস্থান করে 72

এটি অনলাইন চেষ্টা করুন!


উপরের প্রোগ্রামটি প্রিন্ট করে

print("print(\"print(\\\"\\\");exit(111)\");exit(108)");exit(108)

এবং কোড সহ প্রস্থান করে 101

এটি অনলাইন চেষ্টা করুন!


উপরের প্রোগ্রামটি প্রিন্ট করে:

print("print(\"\");exit(111)");exit(108)

এবং কোড সহ প্রস্থান করে 108

এটি অনলাইন চেষ্টা করুন!


উপরের প্রোগ্রামটি প্রিন্ট করে:

print("");exit(111)

এবং কোড সহ প্রস্থান করে 108

এটি অনলাইন চেষ্টা করুন!


উপরের প্রোগ্রামটি কিছুই প্রিন্ট করে এবং কোড সহ প্রস্থান করে 111

এটি অনলাইন চেষ্টা করুন!


খালি প্রোগ্রামটি কিছুই প্রিন্ট করে এবং কোড সহ প্রস্থান করে 0

এটি অনলাইন চেষ্টা করুন!


2
খালি প্রোগ্রামটির জন্য একটি টিআইও লিঙ্ক? এটা আপনার জন্য উত্সর্গ!
নিল

2

সি, 156 বাইট

char*s="char*s=%c%s%c;n=%d;char*t=%c%s%c;main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}";main(i,t)char**t;{printf(s,34,s,34,0,34,t[1],34);}

এটি অনলাইন চেষ্টা করুন! (প্রস্থান কোডটি দেখতে ডিবাগ-ট্যাবটি খুলুন))

কমান্ড লাইন আর্গুমেন্ট হিসাবে ইনপুট নেয়।

"এবিসি" ইনপুট দেওয়ার জন্য, এটি প্রোগ্রামটি আউটপুট করে

char*s="char*s=%c%s%c;n=%d;char*t=%c%s%c;main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}";n=0;char*t="ABC";main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}

যা 65 এবং আউটপুট দেয়

char*s="char*s=%c%s%c;n=%d;char*t=%c%s%c;main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}";n=1;char*t="ABC";main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}

যা 66 এবং আউটপুট দেয়

char*s="char*s=%c%s%c;n=%d;char*t=%c%s%c;main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}";n=2;char*t="ABC";main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}

যা 67 এবং আউটপুট দেয়

char*s="char*s=%c%s%c;n=%d;char*t=%c%s%c;main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}";n=3;char*t="ABC";main(){n<strlen(t)&&printf(s,34,s,34,n+1,34,t,34);return t[n];}

যা কিছুই না করে এবং 0 প্রদান করে।


@ এমবম্ব ২০০7 ধন্যবাদ, এটি এখনই ঠিক করা হয়েছে (এবং এটি প্রক্রিয়াটি আরও সংক্ষিপ্ত হয়ে গেছে)।
স্টেডিবক্স

2
যখন এটি হয় ভালবাসা হবে।
mbomb007

2

পাইথন 2, 67 বাইট

এই উত্তরের উপর ভিত্তি করে , তবে পাইথন 2 ব্যবহার করতে সংশোধন করা হয়েছে, 0কিছুই মুদ্রণ করতে এবং প্রস্থান করার জন্য একটি তুচ্ছ প্রোগ্রাম সহ ।

p=0
for c in input()[::-1]:p='print %r;exit(ord(%r))'%(p,c)
print p

এটি অনলাইনে চেষ্টা করুন


1

আরপিএল, 73 বাইট

এইচপি 8 কোড পৃষ্ঠা সহ।

আপনার HP48 বা অনুরূপ অথবা আগুনে চালু করুন droid48-52 SFস্ট্যাকটি আরও ভালভাবে দেখতে ভুলে যাবেন না । আমি ধরে নিচ্ছি আপনি ইতিমধ্যে "ABC"স্ট্যাকের উপর স্ট্রিংটি ধাক্কা দিয়েছেন । তারপরে নিম্নলিখিত ফাংশনে কী:

→ x«{LAST}x{DUP NUM 3ROLLD 2OVER SIZE DUP{SUB 2SWAP PUT}{4DROPN}IFTE}+ +»

(সুবিধার জন্য আমি কোনও টাইপ করার আগে দু'বার twice কী টিপানোর পরামর্শ দিই, তাই আলফা ইনপুট মোডটি লক করে Lat ছুরিকাঘাত অপারেটর।)

এই ফাংশনটি তাত্ক্ষণিকভাবে একটি তালিকা আকারে একটি স্ব-পরিবর্তনকারী প্রোগ্রাম স্ট্যাকের দিকে ঠেলে দেয়। (তবে উপরের ফাংশনটি নিজেকে পরিবর্তন করে না)। আরপিলের এলটি মূলত এলআইএসপি হিসাবে দাঁড়িয়েছে, ইভাল কী টিপলে এই প্রোগ্রামটি সত্যই মূল্যায়ন করবে। এটা তোলে স্ট্যাকের দুটি স্তরের উপর প্রস্থান কোড, এবং পাতার নিজেই, পরিবর্তিত (হ্যাঁ, ফেরৎ এখানে একটি আধুনিক Eval জন্য এটি প্রশ্নবিদ্ধ)। সুতরাং প্রোগ্রামটি শেষ পর্যন্ত স্ট্যাক স্তর একের মধ্যে নিজেকে নামানো বন্ধ না হওয়া পর্যন্ত বারবার EVAL টিপুন। চূড়ান্ত প্রস্থান কোড 0 এভাবে উপরের অতীত প্রস্থান কোডগুলি সহ প্রথম স্তরে উপস্থিত হয়। আপনি যদি ভুলে গেছেন তবে আপনি -52 SFপ্রতিটি EVAL এর পরে ▴ কী টিপুন (অন কীটি দিয়ে এই নেভিগেশন মোডটি ছেড়ে যান) স্ট্যাকের মধ্যে নেভিগেট করতে পারেন। উপরের ফাংশনটি 0x0 অক্ষরের সাথে স্ট্রিংগুলি গ্রহণ করে এরকম স্ট্রিং তৈরি করতে0 CHR এবং+আপনার বন্ধু স্ব পরিবর্তনগুলি এম্বেডড স্ট্রিং ( SUB 2 SWAP PUTশাখা) থেকে ব্যবহৃত চরটি অপসারণ করে । সুতরাং বাদ দেওয়া প্রোগ্রামটি প্রতিটি ইভিএলের পরে খাটো হয়। 4 DROPNশাখা নিশ্চিত করে আউটপুট কিছুই , অপ থেকে নির্দেশ বিবেচনা করা হয় অন্যান্যের মধ্যে প্রোগ্রাম নিজেই ড্রপ। অবশ্যই এই সমস্ত আপনার নোটকে একটি -55 SFপারদর্শী বলে ধরেছে। ব্যবহারকারীদের -55 SFনিষিদ্ধ করা হবে। চিরতরে.

আমি ধরে নিই যে একটি আরপিএল / 2 সমাধান বিদ্যমান, এবং এটি একটি বাস্তব ইউনিক্সের প্রস্থান কোডের বৈশিষ্ট্যযুক্ত হতে পারে তবে আফিক আরপিএল / 2 এর সীমিত অন্তঃকরণ রয়েছে, এবং তালিকাগুলি মূল্যায়ন করতে পারে না।


আমি মনে করি না যে স্ব-সংশোধনকারী কোডটি আমাদের sensকমত্য অনুসারে একটি বৈধ কুইন হিসাবে গণনা করা হয়েছে, যেহেতু এটির নিজস্ব উত্স কোডে অ্যাক্সেস রয়েছে। আমি একটি মন্তব্যে ওপিকে জিজ্ঞাসা করব। সম্পর্কিত মেটা পোস্টগুলি দেখুন: একটি সঠিক কোয়াইন হিসাবে গণনা কি? ; এসএমবিএফ ব্যবহার করে কোনও প্রতারণামূলক কুইন হিসাবে গণনা করা যায়? <- এটি হ'ল প্রযোজ্য
mbomb007

1
কেবল উত্পন্ন প্রোগ্রামটি স্ব-সংশোধনকারী, চ্যালেঞ্জের জবাব দেয় এমন ফাংশন নয়। তবে আমি একমত, এটি প্রশ্নবিদ্ধ! এটি হাইলাইট করার জন্য কিছু সম্পাদনা যুক্ত করা হয়েছে।
Nacre

1

সেড , 467 461 বাইট

অক্ষর কোডগুলি শক্ত:

s:^:Y:
:b
s:ZY[ (2<FPZdnx]:0_Y:
s:ZY[ )3=GQ[eoy]:1_Y:
s:ZY[ *4>HR\fpz]:2_Y:
s:ZY[]!+5?ISgq{]:3_Y:
s:ZY[",6@JT^hr|]:4_Y:
s:ZY[-#7AKU_is}]:5_Y:
s:ZY[$.8BLV`jt~]:6_Y:
s:ZY[%/9CMWaku]:7_Y:
s:ZY[&0:DNXblv]:8_Y:
s:ZY['1;EOYcmw]:9_Y:
s:Y[ -']:3Z&:
s:Y[(-1]:4Z&:
s:Y[2-9:;]:5Z&:
s:Y[<=>?@A-E]:6Z&:
s:Y[F-O]:7Z&:
s:Y[P-Y]:8Z&:
s:Y[]Z\-`abc]:9Z&:
s:Y[d-m]:10Z&:
s:Y[n-w]:11Z&:
s:Y[xyz{-~]:12Z&:
tb
s/([^_]+)_Y$/ q\1/
:
s/[/\]/\\&/g
s/([^_]+)_ (.*)/ s\/^\/\2\/;q\1/
/^\S/b

এটি অনলাইন চেষ্টা করুন!

অন্যথায়, যুক্তিটি বরং সহজবোধ্য: (1) বিশেষ অক্ষরগুলি এড়িয়ে চলুন (দুটি আছে), (2) অতিরিক্ত s/^/…/;q\1স্তরে মোড়ানো , (3) পুনরাবৃত্তি।

এখানে ফলাফল hello:

 s/^/s\/^\/s\\\/^\\\/s\\\\\\\/^\\\\\\\/q111\\\\\\\/;q108\\\/;q108\/;q101/;q104

এবং একটি ছোট স্ক্রিপ্ট যা আমি ব্যবহার করেছি:

#!/bin/bash
set -uo pipefail
IFS=$'\n'

P=$(echo $1 | sed -rf q.sed)
echo $P

echo $1 | od -An -tuC

for char in $(echo $1 | sed 's:.:&\n:g'); do
    P=$(echo | sed $P)
    printf ' %3d' $?
done

আপনাকে নতুন লাইনের বিষয়ে চিন্তা করার দরকার নেই, কারণ পোস্টটি বলছে আপনাকে কেবল 0x20 এবং 0x7E এর মধ্যে অক্ষর দেওয়া হবে। চমৎকার সমাধান! :)
কনর ও'ব্রায়েন

@ কনরও ব্রায়ান ওহ, ঠিক আছে। ধন্যবাদ!
eush77

1

পাওয়ারশেল, 172 156 বাইট।

param($i)
$s=@'
if($i='{0}'){{
$s=@'
{1}'@
$s-f($i-replace'^.'-replace"'","''"),"$s`n"
$host.setshouldexit($i[0])
}}
exit
'@
$s-f$i.replace("'","''"),"$s`n"

h3l}'{l0ইনপুট পরবর্তী আউটপুট হবে

এটি অনলাইন চেষ্টা করুন!

if($i='h3l}''{l0'){
$s=@'
if($i='{0}'){{
$s=@'
{1}'@
$s-f($i-replace'^.'-replace"'","''"),"$s`n"
$host.setshouldexit($i[0])
}}
exit
'@
$s-f($i-replace'^.'-replace"'","''"),"$s`n"
$host.setshouldexit($i[0])
}
exit

যা নিজস্ব ঘুরে আউটপুট দেবে

এটি অনলাইন চেষ্টা করুন!

if($i='3l}''{l0'){
$s=@'
if($i='{0}'){{
$s=@'
{1}'@
$s-f($i-replace'^.'-replace"'","''"),"$s`n"
$host.setshouldexit($i[0])
}}
exit
'@
$s-f($i-replace'^.'-replace"'","''"),"$s`n"
$host.setshouldexit($i[0])
}
exit

শেষ রানটি আউটপুট কিছুই দেবে না এবং প্রস্থান কোড 0 হবে।

এটি অনলাইন চেষ্টা করুন!

if($i=''){
$s=@'
if($i='{0}'){{
$s=@'
{1}'@
$s-f($i-replace'^.'-replace"'","''"),"$s`n"
$host.setshouldexit($i[0])
}}
exit
'@
$s-f($i-replace'^.'-replace"'","''"),"$s`n"
$host.setshouldexit($i[0])
}
exit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.