終了コード文字列出力


18

与えられたときは、そのプログラムや関数を記述しなければならない空でない文字列SN印刷可能なASCII文字、終了コードで終了しますプログラム出力CCは位置0でASCIIコードポイントであるSを。あなたが書いたこのプログラム意志に加えて、出力プログラムP、実行したときに、それが終了コードで終了し、このようなことをC 'C'の中の位置1でのASCIIコードポイントであるS。プログラムPは別のプログラムP 'を出力します。このプロセスは、Sに文字がなくなるまで繰り返されます。。これが行われた後、何も出力せず、オプションの改行が続きます。終了コード0で終了します。

両端の文字0x200x7e含む。

いくつかのルール:

  • 自己修正プログラムは許可されていません。ソースをSTDOUTに出力する必要があります(または、最初に値を返す)
  • 独自のソースコードを読むことはできません。

バイト単位の最短のプログラムが勝ちます。

いくつかの初歩的なテストでは、このルビースクリプトを使用できます。(最初の引数はスクリプトの呼び出し方法、2番目はプログラム、3番目は入力文字列です。)

仮説の例

プログラムはであると言いFOOます。文字列「ABC」を指定すると、が出力されますBARA。このプログラムは、コード65を出力して終了しますBARB。これは、コード66と出力で終了しますBARC。このプログラムは、コード67を出力して終了しますBAR!。これは何も出力せず、codeで終了します0


これを行うと、Forthの終了コードとしてカウントされますか?パラメーターを変更して、他のOSエラーを表示します。0成功です。tio.run/nexus/...
mbomb007

@ mbomb007私はフォースについてあまり知りません。Forthで従来の「エラーコード」をどのように使用するのでしょうか。
コナーオブライエン

目標がOSレベルのエラーコードを持つかどうかによって異なります。数字だけが重要な場合は33 throw、任意の数字を投げるようなことをすることができます。OSレベルにマイナスを使用し、オフセットは-512です。多くのいずれかIDKが、私はここで探しています:complang.tuwien.ac.at/forth/gforth/Docs-html/...
mbomb007を

回答:


6

Python 2、126 101 94バイト

これを作成する過程で、Pythonコードにリテラル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

Python 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

Pythonの3115の 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

C、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);}

オンラインでお試しください!(デバッグタブを開いて終了コードを確認します。)

入力をコマンドライン引数として受け取ります。

入力「ABC」の場合、これはプログラムを出力します

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ありがとう、これは修正されました(そして、その過程で短くなりました)。
Steadybox

2
それが起こるとき、それを愛さなければならない。
mbomb007


1

RPL、73バイト

hp8コードページ。

HP48などをオンにするか、droid48を起動します。-52 SFスタックの視覚化を改善することを忘れないでください。私はあなたがすでに文字列をプッシュしていると仮定します"ABC"。例えば、スタックに。次に、次の関数をキー入力します。

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

(便宜上、入力する前にαキーを2回押すことをお勧めします。したがって、アルファ入力モードをロックします。後者はDELキーを使用して、自動的に挿入された終了デリミタをキャンセルします。スタブ演算子。)

この関数は、リストの形式で、すぐに自己修正プログラムをスタックにプッシュします。(ただし、上記の関数はそれ自体を変更しません)。RPLのLは元々LISPの略であるため、EVALキーを押すと実際にこのプログラムが評価されます。スタックレベル2で終了コードを返し、後のEVALのために、変更されたまま(はい、ここでは疑わしい)そのままになります。そのため、プログラムが最終的に停止してスタックレベル1にドロップするまで、EVALを繰り返し押します。したがって、レベル1には最終的な終了コード0が表示され、上記の過去の終了コードが表示されます。を忘れた場合は-52 SF、Eキーを押して、各EVALの後にスタック内を移動できます(このナビゲーションモードをONキーのままにします)。上記の関数は、内部に0x0文字を含む文字列を受け入れ、そのような文字列を作成し0 CHR+あなたの友達です。自己修正は、埋め込まれた文字列(SUB 2 SWAP PUTブランチ)から使用済みの文字を削除することで構成されます。したがって、ドロップされたプログラムは、各EVALの後に短くなります。この4 DROPN分岐により、OPからの何も出力されない命令が尊重され、プログラム自体が削除されます。もちろん、これはすべてあなたのメモが-55 SF熟練していることを前提としています。のユーザーは-55 SF禁止されます。永遠に。

RPL / 2ソリューションが存在し、実際のUNIX終了コードを備えている可能性があると思いますが、afaik RPL / 2のイントロスペクションは限られており、リストを評価できません。


私たちのコンセンサスによれば、自己修正コードカウントを使用することは、独自のソースコードにアクセスできるため、有効なクインとしては考えていません。OPにコメントをお願いします。関連するメタ投稿を参照してください:適切なクインとは何ですか?; SMBFを使用すると、不正行為としてカウントされますか?<-これは適用されるものです
-mbomb007

1
生成されたプログラムのみが自己修正的であり、チャレンジに答える機能ではありません。しかし、私は同意します、これは疑わしいです!これを強調するためにいくつかの編集を追加しました。
真珠層

1

sed467 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つあります)をエスケープする、(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ああ、そうです。ありがとう!
eush77

1

PowerShell、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.