退出码字符串输出


18

必须编写一个程序或函数,给定当非空字符串小号Ñ打印的ASCII字符,输出一个程序,将与退出代码退出Ç,其中Ç是在位置0处的ASCII码点小号。您编写的该程序将另外输出一个程序P,以便在运行时以退出代码C'退出,其中C'S中位置1的ASCII码点。程序P将输出另一个程序P'。重复此过程,直到S中没有剩余字符为止。完成此操作后,您必须输出任何内容,后跟可选的换行符;并应以退出代码0退出。

0x20和之间的字符(0x7e含)。

其他一些规则:

  • 不允许自修改程序:您必须将源输出到STDOUT(或最初返回值)
  • 您可能无法阅读自己的源代码。

以字节为单位的此类最短程序将获胜。

对于某些基本测试,可以使用此ruby脚本。(第一个参数是调用脚本的方式,第二个参数是程序,第三个参数是输入字符串。)

假设的例子

说程序是FOO。给定字符串“ ABC”时,输出BARA。此程序代码退出65并输出BARB。依次返回代码66和输出BARC。此程序代码退出67并输出BAR!。这不会输出任何内容,并使用code退出0


这样算作Forth中的退出代码吗?更改参数以查看其他操作系统错误。0是成功。tio.run/nexus/…–
mbomb007

@ mbomb007我对Forth不太了解。这是按惯例在Forth中使用“错误代码”的方式吗?
科纳·奥布赖恩

这取决于您的目标是否是操作系统级错误代码。如果只有数字很重要,则可以执行一些操作,例如33 throw抛出任意数字。您在操作系统级别使用负片,并且偏移量为-512。两者都不是,但我在这里看:complang.tuwien.ac.at/forth/gforth/Docs-html/…–
mbomb007

Answers:


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])

在线尝试 (在调试信息中显示退出代码)


请注意,下面的每个非空程序都有一个换行符。

对于input 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 

其中每行包含退出代码和先前执行的程序的输出(第一行是第一个程序)。


您的回答就像我的...只是您是朝相反的方向做...我为此而自满。
Leaky Nun


@LeakyNun是的,但是如果您的意思是我的意思,我并没有以您的回答为起点
Vault

我只是说我应该想到这一点。
Leaky Nun

@vaultah您打算打高尔夫球至67个字节,还是应该将其作为单独的答案发布?
mbomb007 '17

3

Python 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

在线尝试!


上面的程序不打印任何内容,并使用code退出111

在线尝试!


空程序不输出任何内容,并以code退出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 '17

2
当那件事发生时,一定要爱它。
mbomb007 '17

2

Python 2,67个字节

基于此答案,但修改为使用Python 2,并使用普通程序0不显示任何内容并退出。

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

在线尝试


1

RPL,73个字节

带有hp8代码页。

打开HP48或类似产品,或启动droid48。不要忘记-52 SF为了更好地可视化堆栈。我假设您已经将字符串(例如)压入"ABC"堆栈。然后键入以下功能:

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

(为方便起见,我建议您在键入任何内容之前先按两次α键,从而锁定alpha输入模式。后者只需使用DEL键即可取消自动插入的关闭定界符。只需使用ENTER键进行确认。请不要忘记输入空格刺破运算符。)

此函数以列表的形式立即将自修改程序推入堆栈。(但是上面的函数不会自行修改)。由于RPL中的L最初代表LISP,因此按EVAL键确实可以评估该程序。它返回第二层堆栈的退出代码,并留下自己进行修改(是的,在这里是有问题的),以供以后的EVAL使用。因此,请反复按EVAL,直到程序最终停止将其自身降到堆栈一级。因此,最终的退出代码0出现在第一级,而过去的退出代码在上面。如果您忘记了-52 SF,则可以在每次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 '17

1
只有生成的程序是可自我修改的,而不能回答挑战的功能。但是我同意,这是有问题的!添加了一些编辑以突出显示此内容。
珍珠层

1

sed467461字节

字符代码很难:

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哦,对。谢谢!
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.