종료 코드 문자열 출력


18

당신은 주어진하면 해당 프로그램 또는 기능을 작성해야 비어 있지 않은 문자열 SN 인쇄 가능한 ASCII 문자 , 종료 코드로 종료하는 프로그램 출력 C , C가 에 위치 0에서 ASCII 코드 점이다 S를 . 작성하는이 프로그램은 프로그램 P를 추가로 출력하므로 실행시 종료 코드 C ' 로 종료됩니다 . 여기서 C'S의 1 위치에있는 ASCII 코드 포인트 입니다. 프로그램 P 는 다른 프로그램 P '를 출력 할 것이다 . 이 프로세스는 S에 문자가 남지 않을 때까지 반복됩니다.. 이 작업이 끝나면 아무 것도 출력하지 않고 선택적 개행 문자를 따라야합니다. 종료 코드 0으로 종료해야합니다.

사이의 문자 0x200x7e포함.

몇 가지 규칙 :

  • 자체 수정 프로그램은 허용되지 않습니다. 소스를 STDOUT으로 출력해야합니다 (또는 초기에 값을 반환).
  • 자신의 소스 코드를 읽을 수 없습니다.

바이트 단위의 가장 짧은 프로그램이 이길 것입니다.

일부 기본적인 테스트의 경우이 루비 스크립트를 사용할 수 있습니다. (첫 번째 인수는 스크립트를 호출하는 방식이고, 두 번째 인수는 프로그램이며, 세 번째 인수는 입력 문자열입니다.)

가상의 예

프로그램이라고 가정하십시오 FOO. 문자열 "ABC"가 주어지면을 출력 BARA합니다. 이 프로그램은 코드 65와 출력으로 종료됩니다 BARB. 이것은 차례로 코드 66와 출력 으로 종료됩니다 BARC. 이 프로그램은 코드 67와 출력으로 종료됩니다 BAR!. 아무것도 출력하지 않고 code로 종료됩니다 0.


이 작업을 Forth에서 종료 코드로 간주합니까? 다른 OS 오류를 보려면 매개 변수를 변경하십시오. 0성공입니다. tio.run/nexus/…
mbomb007

@ mbomb007 나는 Forth에 대해 잘 모른다. 이것이 Forth에서 전통적으로 "오류 코드"를 사용하는 방법입니까?
코너 오브라이언

목표는 OS 레벨 오류 코드를 갖는지 여부에 달려 있습니다. 숫자 만 중요하다면 33 throw임의의 숫자를 던지는 것과 같은 일을 할 수 있습니다 . OS 수준에 음수를 사용하고 오프셋은 -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])

온라인으로 시도하십시오 (디버그 정보에 종료 코드 표시)


아래의 비어 있지 않은 각 프로그램에는 후행 줄 바꿈이 있습니다.

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

파이썬 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 네,하지만 당신의 대답을 출발점으로 사용하지 않았습니다. 그것이 당신의 뜻
이라면

그냥 생각 했어야했는데
Leaky Nun

@ 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.

온라인으로 사용해보십시오!


위의 프로그램은 아무것도 인쇄하지 않고 code로 종료됩니다 111.

온라인으로 사용해보십시오!


빈 프로그램은 아무것도 인쇄하지 않고 code로 종료됩니다 0.

온라인으로 사용해보십시오!


2
빈 프로그램의 TIO 링크? 그것은 당신을위한 헌신입니다!
Neil

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}+ +»

(편의를 위해 아무것도 입력하기 전에 α 키를 두 번 눌러 알파 입력 모드를 잠그는 것이 좋습니다. 나중에 DEL 키를 사용하여 자동으로 삽입 된 닫는 구분 기호를 취소하십시오. ENTER 키를 사용하여 유효성을 검사하십시오. 찌르기 연산자.)

이 기능은 즉시 스택 형태로 자체 수정 프로그램을 목록 형식으로 푸시합니다. 그러나 위의 기능은 자체적으로 수정되지 않습니다. RPL의 L은 원래 LISP를 나타내므로 EVAL 키를 누르면 실제로이 프로그램을 평가합니다. 그것은 수정 출구 스택 레벨이에 코드 및 잎 자체를 (예, 반환 여기 후자의 EVAL을 위해, 그것은 의문이다). 따라서 프로그램이 스택 레벨 1에서 떨어질 때까지 EVAL을 반복해서 누릅니다. 최종 종료 코드 0은 레벨 1에 표시되며, 과거 종료 코드는 위와 같습니다. 를 잊어 버린 경우 -52 SF▴ 키를 눌러 각 EVAL 후 스택을 탐색 할 수 있습니다 (ON 키로이 탐색 모드를 그대로 두십시오). 위의 기능은 문자열을 만들기 위해 내부 0x0으로의 문자와 문자열을 받아 수행 0 CHR하고+당신의 친구입니다. 자체 수정은 포함 된 문자열 ( SUB 2 SWAP PUT분기) 에서 사용 된 문자를 제거하는 것으로 구성됩니다 . 따라서 삭제 된 프로그램은 각 EVAL 후에 더 짧습니다. 이 4 DROPN분기는 OP 의 출력 명령이 존중 되지 않도록 하여 프로그램 자체를 제거합니다. 물론이 모든 것은 당신의 노트를 -55 SF능숙하게 가정합니다 . 의 사용자는 -55 SF금지됩니다. 영원히.

나는 RPL / 2 솔루션이 존재하고 실제 유닉스 종료 코드를 특징으로 할 수 있다고 가정하지만 afaik RPL / 2는 제한된 내성을 가지고 있으며 목록을 평가할 수 없습니다.


자체 수정 코드를 사용하는 것은 자체 소스 코드에 액세스 할 수 있기 때문에 합의에 따라 유효한 quine으로 간주한다고 생각하지 않습니다. 의견에 OP를 요청할 것입니다. 관련 메타 게시물을 참조하십시오 : 무엇이 적절한 quine로 간주됩니까? ; SMBF를 사용하는 것은 부정 행위로 간주됩니까? <-이것은 적용되는 것
mbomb007

1
생성 된 프로그램 만 문제를 해결하는 기능이 아닌 자체 수정됩니다. 그러나 나는 이것이 의심 스럽다! 이를 강조하기 위해 몇 가지 수정 사항을 추가했습니다.
Nacre

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 개가 있음), (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.