कोड स्ट्रिंग आउटपुट से बाहर निकलें


18

आप एक प्रोग्राम या समारोह लिखना चाहिए कि, जब एक दिया अरिक्त स्ट्रिंग एस के एन प्रिंट योग्य ASCII वर्ण , एक प्रोग्राम है जो बाहर निकलने के कोड के साथ बाहर निकल जाएगा आउटपुट सी , जहां सी में स्थिति 0 पर ASCII कोडपॉइंट है एस । यह प्रोग्राम जो आप लिखते हैं, अतिरिक्त रूप से एक प्रोग्राम P को आउटपुट करेगा , जैसे कि, जब रन होता है, तो यह एग्जिट कोड C with से बाहर निकलता है , जहां C 1 S में स्थिति 1 पर ASCII कोडपॉइंट है । प्रोग्राम P एक और प्रोग्राम P ′ आउटपुट करेगा । यह प्रक्रिया तब तक दोहराती है जब तक कि S में कोई वर्ण शेष न हो। ऐसा होने के बाद, आपको कुछ भी आउटपुट नहीं करना चाहिए, उसके बाद वैकल्पिक न्यूलाइन; और बाहर निकलें कोड 0 के साथ बाहर निकलना चाहिए।

Characters पात्रों के बीच 0x20और 0x7eसमावेशी।

कुछ और नियम:

  • स्व-संशोधित कार्यक्रमों की अनुमति नहीं है: आपको स्रोत को STDOUT में आउटपुट करना होगा (या, प्रारंभ में मान लौटाएं)
  • आप अपने स्वयं के स्रोत कोड को नहीं पढ़ सकते हैं।

बाइट्स में इस तरह का सबसे छोटा कार्यक्रम जीत जाएगा।

कुछ अल्पविकसित परीक्षण के लिए, इस रूबी स्क्रिप्ट का उपयोग किया जा सकता है। (पहला तर्क वह तरीका है जो आप स्क्रिप्ट को लागू करते हैं, दूसरा प्रोग्राम है, और तीसरा इनपुट स्ट्रिंग है।)

हाइपोथेटिकल उदाहरण

कहो कार्यक्रम है FOO। जब स्ट्रिंग "एबीसी" दिया जाता है, तो यह आउटपुट करता है BARA। यह प्रोग्राम कोड 65और आउटपुट के साथ बाहर निकलता है BARB। यह बदले में कोड 66और ouputs से बाहर निकलता है BARC। यह प्रोग्राम कोड 67और आउटपुट के साथ बाहर निकलता है BAR!। यह कुछ भी आउटपुट नहीं करता है, और कोड के साथ बाहर निकलता है 0


क्या यह गणना फोर्थ में बाहर निकलने के कोड के रूप में की जाएगी? अन्य OS त्रुटियों को देखने के लिए पैरामीटर बदलें। 0सफलता है। tio.run/nexus/…
mbomb007

@ mbomb007 मुझे फोर्थ के बारे में ज्यादा जानकारी नहीं है। यह है कि कैसे एक पारंपरिक रूप से फोर्थ में "त्रुटि कोड" का उपयोग करेगा?
कॉनर ओ'ब्रायन

यह निर्भर करता है कि आपका लक्ष्य ओएस-स्तरीय त्रुटि कोड है या नहीं। यदि केवल संख्या मायने रखती है, तो आप सिर्फ 33 throwमनमानी संख्या फेंकने के लिए कुछ कर सकते हैं । आप ओएस-स्तर के लिए नकारात्मक का उपयोग करते हैं, और ऑफसेट -512 है। Idk बहुत या तो, लेकिन मैं यहाँ देख रहा हूँ: Complang.tuwien.ac.at/forth/gforth/Docs-html/…
mbomb007

जवाबों:


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 

जहां प्रत्येक पंक्ति में निकास कोड और पहले निष्पादित कार्यक्रम का उत्पादन (पहली पंक्ति पहला कार्यक्रम) है।


आपका जवाब मेरे जैसा है ... बस आपने इसे विपरीत दिशा में किया है ... मैं इसके लिए खुद का सामना कर रहा हूं।
लीक नून


@LeakyNun हाँ, लेकिन मैंने आपके जवाब का इस्तेमाल एक शुरुआती बिंदु के रूप में नहीं किया, अगर आपका यही मतलब है
vaultah

मैं सिर्फ यह कह रहा हूं कि मुझे ऐसा सोचना चाहिए था।
लीकी नून

@vaultah आप को 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
खाली कार्यक्रम के लिए एक TIO लिंक? आपके लिए यही समर्पण है!
नील

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 देता है।


@ mbomb007 धन्यवाद, यह अब ठीक हो गया है (और यह प्रक्रिया में छोटा हो गया)।
शाम

2
जब ऐसा होता है तो उसे प्यार करना चाहिए।
mbomb007

2

पायथन 2, 67 बाइट्स

इस उत्तर के आधार पर , लेकिन 0कुछ भी नहीं और बाहर निकलने के लिए तुच्छ कार्यक्रम के साथ पायथन 2 का उपयोग करने के लिए संशोधित किया गया ।

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

इसे ऑनलाइन आज़माएं


1

आरपीएल, 73 बाइट्स

Hp8 कोड पेज के साथ।

अपने HP48 या समान, या आग droid48 चालू करें-52 SFस्टैक के बेहतर दृश्य के लिए मत भूलना । मुझे लगता है कि आपने पहले ही स्ट्रिंग को धकेल दिया है, जैसे "ABC", स्टैक पर। फिर निम्नलिखित फ़ंक्शन में कुंजी:

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

(सुविधा के लिए मैं कुछ भी टाइप करने से पहले दो बार α कुंजी को धक्का देने का सुझाव देता हूं, इसलिए अल्फा इनपुट मोड को लॉक कर देता हूं। लैटर सिर्फ DEL कुंजी का उपयोग करता है जो स्वचालित रूप से डाले गए समापन सीमांकक को रद्द करने के लिए है। बस सत्यापन के लिए ENTER कुंजी का उपयोग करें। स्थान के बाद भूल न जाएं। छुरा चलाने वाला।)

यह फ़ंक्शन सूची के रूप में, तुरंत एक स्व-संशोधित कार्यक्रम स्टैक पर धक्का देता है। (लेकिन उपरोक्त फ़ंक्शन स्वयं को संशोधित नहीं करता है)। जैसा कि RPL में L मूल रूप से LISP के लिए खड़ा है, EVAL कुंजी दबाने से वास्तव में इस कार्यक्रम का मूल्यांकन होगा। यह स्टैक स्तर दो पर निकास कोड लौटाता है, और बाद वाले EVAL के लिए खुद को संशोधित (हां, यहां यह संदिग्ध है) छोड़ देता है । इसलिए EVAL को बार-बार दबाएं जब तक कि कार्यक्रम अंत में स्टैक लेवल एक पर खुद को छोड़ने के लिए बंद न हो जाए। अंतिम एग्जिट कोड 0 इस प्रकार लेवल वन पर दिखाई देता है, जिसमें पिछले एग्जिट कोड ऊपर होते हैं। यदि आप भूल गए हैं -52 SF, तो आप leave कुंजी दबाकर प्रत्येक EVAL के बाद स्टैक में नेविगेट कर सकते हैं (इस नेविगेशन मोड को ON कुंजी के साथ छोड़ दें)। उपरोक्त फ़ंक्शन ऐसे तार बनाने के लिए 0x0 वर्णों के साथ तार को स्वीकार करता है 0 CHRऔर+आपके दोस्त हैं सेल्फ मॉडिफिकेशन में एम्बेडेड स्ट्रिंग ( SUB 2 SWAP PUTब्रांच) से इस्तेमाल किए गए चार को निकालना शामिल है । इसलिए प्रत्येक ईवीएएल के बाद गिरा हुआ कार्यक्रम छोटा होता है। 4 DROPNशाखा सुनिश्चित करता है उत्पादन कुछ भी नहीं , ओपी से निर्देश सम्मान दिया जाता है, दूसरों के बीच कार्यक्रम में ही छोड़ने। बेशक यह सब आपके नोट को एक -55 SFअडॉप्ट करता है। उपयोगकर्ताओं को -55 SFप्रतिबंधित किया जाएगा। सदैव।

मुझे लगता है कि एक आरपीएल / 2 समाधान मौजूद है, और एक वास्तविक यूनिक्स निकास कोड की सुविधा हो सकती है, लेकिन आरएपीएल / 2 में सीमित आत्मनिरीक्षण है, और सूचियों का मूल्यांकन नहीं किया जा सकता है।


मुझे नहीं लगता कि स्व-संशोधित कोड का उपयोग हमारी सर्वसम्मति के अनुसार मान्य क्वीन के रूप में होता है, क्योंकि इसकी अपने सोर्स कोड तक पहुंच है। मैं एक टिप्पणी में ओपी से पूछूंगा। संबंधित मेटा पोस्ट देखें: एक उचित क्वीन के रूप में क्या मायने रखता है? ; क्या SMBF की गिनती चीटिंग क्वीन के रूप में होती है? <- यह एक है जो लागू होता है
mbomb007

1
केवल उत्पन्न कार्यक्रम स्वयं-संशोधित है, न कि फ़ंक्शन जो चुनौती का जवाब देता है। लेकिन मैं सहमत हूं, यह संदिग्ध है! इसे हाइलाइट करने के लिए कुछ संपादन जोड़े गए।
नाकेरे

1

sed , 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 के बीच वर्ण दिए जाएंगे। अच्छा समाधान! :)
कॉनर ओ'ब्रायन

@ ConorO'Brien ओह, ठीक है। धन्यवाद!
14:17

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.