Thoát đầu ra chuỗi mã


18

Bạn phải viết một chương trình hoặc chức năng đó, khi đưa ra một không rỗng chuỗi S của N ký tự ASCII in , kết quả đầu ra một chương trình mà sẽ thoát với mã exit C , nơi C là điểm mã ASCII ở vị trí 0 trong S . Chương trình này bạn viết sẽ bổ sung sản lượng một chương trình P , như vậy mà, khi chạy, nó thoát với mã lối ra C ' , nơi C' là điểm mã ASCII tại vị trí 1 trong S . Chương trình P sẽ ra một chương trình P ' . Quá trình này lặp lại cho đến khi không còn ký tự nào trong S. Sau khi hoàn thành, bạn phải xuất ra bất cứ thứ gì, theo sau là một dòng mới tùy chọn; và nên thoát với mã thoát 0.

Các nhân vật giữa 0x200x7etoàn diện.

Một số quy tắc khác:

  • Các chương trình tự sửa đổi không được phép: bạn phải xuất nguồn sang STDOUT (hoặc, trả về giá trị ban đầu)
  • Bạn không thể đọc mã nguồn của riêng bạn.

Chương trình ngắn nhất như vậy tính bằng byte sẽ giành chiến thắng.

Đối với một số thử nghiệm thô sơ, kịch bản ruby ​​này có thể được sử dụng. (Đối số đầu tiên là cách bạn gọi tập lệnh, thứ hai là chương trình và thứ ba là chuỗi đầu vào.)

Ví dụ giả thuyết

Nói chương trình là FOO. Khi cho chuỗi "ABC", nó xuất ra BARA. Chương trình này thoát với mã 65và đầu ra BARB. Điều này lần lượt thoát với mã 66và ouputs BARC. Chương trình này thoát với mã 67và đầu ra BAR!. Điều này đầu ra không có gì, và thoát với mã 0.


Sẽ làm điều này được tính là mã thoát trong Forth? Thay đổi tham số để xem các lỗi hệ điều hành khác. 0là thành công. tio.run/nexus/ từ
mbomb007

@ mbomb007 Tôi không biết nhiều về Forth. Đó có phải là cách người ta thường sử dụng "mã lỗi" trong Forth không?
Conor O'Brien

Nó phụ thuộc nếu mục tiêu của bạn là có mã lỗi cấp độ hệ điều hành. Nếu chỉ có số quan trọng, bạn có thể làm một cái gì đó như 33 throwném một số tùy ý. Bạn sử dụng phủ định cho cấp độ hệ điều hành và độ lệch là -512. Idk nhiều, hoặc, nhưng tôi đang tìm ở đây: complang.tuwien.ac.at/forth/gforth/Docs-html/...
mbomb007

Câu trả lời:


6

Python 2, 126 101 94 byte

Trong quá trình thực hiện điều này, tôi thấy rằng mã Python có thể không chứa các byte NUL bằng chữ.

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

Dùng thử trực tuyến (hiển thị mã thoát trong thông tin Gỡ lỗi)


Lưu ý rằng mỗi chương trình không trống bên dưới có một dòng cấp dữ liệu.

Đối với đầu vào Hello, các đầu ra trên:

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

mà in

...

mà in

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

mà in

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

không in gì cả (chương trình trống)

trong đó in không có gì và thoát với mã 0.


4

Python 3, 77 byte

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

Mã này nhận đầu vào từ STDIN và xuất chương trình đầu tiên sang STDOUT.

Nếu đầu vào là ABCDE, kết quả là

 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 

trong đó mỗi dòng chứa mã thoát và đầu ra của chương trình được thực hiện trước đó (dòng đầu tiên là chương trình đầu tiên).


Câu trả lời của bạn giống như của tôi ... chỉ là bạn đã làm điều đó theo hướng ngược lại ... Tôi đang tự quảng cáo cho mình về điều đó.
Leaky Nun


@LeakyNun yeah, nhưng tôi đã không sử dụng câu trả lời của bạn làm điểm bắt đầu, nếu đó là ý bạn
vaultah

Tôi chỉ nói rằng tôi nên nghĩ về điều đó.
Nữ tu rò rỉ

@vaultah Bạn sẽ chơi golf của mình tới 67 byte, hay tôi nên đăng nó dưới dạng câu trả lời riêng?
mbomb007

3

Python 3 , 115 108 100 byte

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

Hãy thử trực tuyến!


Đối với đầu vào Hello, chương trình in:

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

Chương trình trên in:

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

và thoát với mã 72.

Hãy thử trực tuyến!


Chương trình trên in

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

và thoát với mã 101.

Hãy thử trực tuyến!


Chương trình trên in:

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

và thoát với mã 108.

Hãy thử trực tuyến!


Chương trình trên in:

print("");exit(111)

và thoát với mã 108.

Hãy thử trực tuyến!


Chương trình trên không in gì và thoát bằng mã 111.

Hãy thử trực tuyến!


Chương trình trống không in gì và thoát bằng mã 0.

Hãy thử trực tuyến!


2
Một liên kết TIO cho chương trình trống? Đó là sự cống hiến cho bạn!
Neil

2

C, 156 byte

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

Hãy thử trực tuyến! (Mở tab gỡ lỗi để xem mã thoát.)

Đưa đầu vào như một đối số dòng lệnh.

Đối với đầu vào "ABC", điều này xuất ra chương trình

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];}

trả về 65 và đầu ra

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];}

trả về 66 và đầu ra

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];}

trả về 67 và đầu ra

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];}

mà đầu ra không có gì và trả về 0.


@ mbomb007 Cảm ơn, giờ nó đã được sửa (và nó đã rút ngắn trong quá trình này).
Steadybox

2
Phải yêu nó khi điều đó xảy ra.
mbomb007


1

RPL, 73 byte

Với trang mã hp8.

Bật HP48 của bạn hoặc tương tự, hoặc bắn droid48 . Đừng quên để -52 SFhình dung tốt hơn về ngăn xếp. Tôi giả sử bạn đã đẩy chuỗi, ví dụ "ABC", trên ngăn xếp. Sau đó, phím trong chức năng sau:

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

(Để thuận tiện, tôi khuyên bạn nên ấn phím α hai lần trước khi nhập bất cứ thứ gì, do đó khóa chế độ nhập alpha. Latter chỉ cần sử dụng phím DEL để hủy các dấu phân cách đóng tự động được chèn. toán tử đâm.)

Hàm này ngay lập tức đẩy vào ngăn xếp một chương trình tự sửa đổi, dưới dạng một danh sách. (Nhưng chức năng trên không tự sửa đổi). Vì L trong RPL ban đầu là viết tắt của LISP, nhấn phím EVAL thực sự sẽ đánh giá chương trình này. Nó trả về mã thoát ở ngăn xếp cấp hai và để lại chính nó, đã sửa đổi (vâng, đây là câu hỏi), cho EVAL sau. Vì vậy, nhấn EVAL nhiều lần cho đến khi chương trình cuối cùng dừng lại để tự rơi vào cấp độ ngăn xếp một. Do đó, mã thoát 0 cuối cùng xuất hiện ở cấp một, với các mã thoát quá khứ ở trên. Nếu bạn quên -52 SF, bạn có thể điều hướng trong ngăn xếp sau mỗi EVAL bằng cách nhấn phím ((để chế độ điều hướng này bằng phím BẬT). Hàm trên không chấp nhận các chuỗi có ký tự 0x0 bên trong, để tạo các chuỗi như vậy 0 CHR+là bạn của bạn Việc tự sửa đổi bao gồm loại bỏ char được sử dụng khỏi chuỗi nhúng ( SUB 2 SWAP PUTnhánh). Do đó chương trình bỏ ngắn hơn sau mỗi EVAL. Các 4 DROPNchi nhánh đảm bảo không có gì đầu ra hướng dẫn từ OP được tôn trọng, giảm số những người khác chương trình riêng của mình. Tất nhiên tất cả điều này giả định lưu ý của bạn một -55 SFlão luyện. Người dùng -55 SFsẽ bị cấm. Mãi mãi.

Tôi giả sử tồn tại giải pháp RPL / 2 và có thể có mã thoát unix thực, nhưng RPL / 2 có giới hạn nội tâm và không thể đánh giá danh sách.


Tôi không nghĩ việc sử dụng mã tự sửa đổi được tính là một nguyên tắc hợp lệ theo sự đồng thuận của chúng tôi, vì nó có quyền truy cập vào mã nguồn của chính nó. Tôi sẽ hỏi OP trong một bình luận. Xem các bài đăng meta có liên quan: Điều gì được coi là một câu hỏi thích hợp? ; Có phải sử dụng SMBF được coi là một mánh gian lận? <- cái này là cái được áp dụng
mbomb007

1
Chỉ có chương trình được tạo là tự sửa đổi, không phải là chức năng trả lời thử thách. Nhưng tôi đồng ý, đây là câu hỏi! Đã thêm một số chỉnh sửa để làm nổi bật điều này.
Xà cừ

1

sed , 467 461 byte

Mã ký tự khó:

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

Hãy thử trực tuyến!

Mặt khác, logic khá đơn giản: (1) thoát các ký tự đặc biệt (có hai), (2) bọc trong một s/^/…/;q\1lớp bổ sung , (3) lặp lại.

Đây là đầu ra cho hello:

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

Và một đoạn script nhỏ mà tôi đã sử dụng:

#!/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

Bạn không cần phải lo lắng về các dòng mới, vì bài đăng cho biết bạn sẽ chỉ được cung cấp các ký tự trong khoảng từ 0x20 đến 0x7E. Giải pháp tốt đẹp! :)
Conor O'Brien

@ ConorO'Brien ơi, đúng rồi. Cảm ơn!
eush77

1

PowerShell, 172 156 byte.

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"

Đầu h3l}'{l0vào sẽ cho kết quả đầu ra tiếp theo

Hãy thử trực tuyến!

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

Đến lượt mình sẽ xuất ra

Hãy thử trực tuyến!

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

Lần chạy cuối cùng sẽ không có gì và mã thoát sẽ là 0.

Hãy thử trực tuyến!

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.