ออกจากสตริงรหัสเอาท์พุท


18

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่เมื่อได้รับการว่างสตริงSของNตัวอักษรพิมพ์ ASCII , เอาท์พุทโปรแกรมที่จะออกด้วยรหัสทางออกCที่Cเป็นจุดโค้ด ASCII ที่ตำแหน่ง 0 ในS โปรแกรมนี้คุณเขียนจะเพิ่มการส่งออกโปรแกรมPเช่นว่าเมื่อวิ่งออกมาจากทางออกด้วยรหัสC 'ที่C'เป็นจุดโค้ด ASCII ที่ตำแหน่ง 1 ในS โปรแกรมPออกจะอีกหนึ่งโปรแกรมP ' กระบวนการนี้ทำซ้ำจนกว่าจะไม่มีตัวอักษรเหลืออยู่ในS. หลังจากสิ่งนี้เสร็จสิ้นคุณจะต้องไม่แสดงผลใด ๆ ตามด้วยบรรทัดใหม่ที่เป็นทางเลือก และควรออกด้วยรหัสทางออก 0

ตัวอักษรระหว่าง0x20และ0x7eรวม

กฎบางอย่างเพิ่มเติม:

  • ไม่อนุญาตให้แก้ไขโปรแกรมด้วยตนเอง: คุณต้องส่งออกแหล่งข้อมูลไปยัง STDOUT (หรือส่งคืนค่าเริ่มต้น)
  • คุณไม่สามารถอ่านซอร์สโค้ดของคุณเองได้

โปรแกรมที่สั้นที่สุดในหน่วยไบต์จะเป็นผู้ชนะ

สำหรับการทดสอบเบื้องต้นสคริปต์ทับทิมนี้สามารถใช้ได้ (อาร์กิวเมนต์แรกคือวิธีที่คุณเรียกใช้สคริปต์ข้อที่สองคือโปรแกรมและข้อที่สามคือสตริงอินพุต)

ตัวอย่างสมมุติ

FOOกล่าวว่าโครงการคือ เมื่อได้รับสตริง "ABC" BARAมันจะออกผลลัพธ์ โปรแกรมนี้ออกด้วยรหัสและเอาท์พุท65 BARBนี้ในการเปิดออกด้วยรหัสและเพื่อถ่ายทอด66 BARCโปรแกรมนี้ออกด้วยรหัสและเอาท์พุท67 นี้เอาท์พุทอะไรและออกด้วยรหัสBAR!0


การนับเช่นนี้เป็นรหัสออกใน Forth หรือไม่ เปลี่ยนพารามิเตอร์เพื่อดูข้อผิดพลาดของระบบปฏิบัติการอื่น 0คือความสำเร็จ tio.run/nexus/…
mbomb007

@ mbomb007 ฉันไม่รู้อะไรเกี่ยวกับ Forth มากนัก นั่นเป็นวิธีที่คนทั่วไปจะใช้ "รหัสข้อผิดพลาด" ใน Forth หรือไม่?
Conor O'Brien

ขึ้นอยู่กับว่าเป้าหมายของคุณคือการมีรหัสข้อผิดพลาดระดับ OS หากตัวเลขมีความสำคัญคุณสามารถทำสิ่งใดก็ได้เช่น33 throwการโยนหมายเลขโดยพลการ คุณใช้เชิงลบสำหรับระดับระบบปฏิบัติการและออฟเซ็ตคือ -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 

โดยที่แต่ละบรรทัดมีโค้ดทางออกและเอาต์พุตของโปรแกรมที่เรียกใช้ก่อนหน้า (บรรทัดแรกคือโปรแกรมแรก)


คำตอบของคุณเป็นเหมือนของฉัน ... เพียงแค่คุณทำในทิศทางตรงกันข้าม ... ฉันกำลังเผชิญหน้ากับเรื่องนี้
Leun Nun


@LeakyNun ใช่ แต่ผมไม่ได้ใช้คำตอบของคุณเป็นจุดเริ่มต้นถ้านั่นคือสิ่งที่คุณหมาย
vaultah

ฉันแค่บอกว่าฉันควรจะคิดอย่างนั้น
Leun Nun

@vaultah คุณจะเล่นกอล์ฟของคุณถึง 67 ไบต์หรือฉันควรโพสต์มันเป็นคำตอบที่แยกต่างหาก?
mbomb007

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และออกด้วยรหัส

ลองออนไลน์!


111โปรแกรมดังกล่าวข้างต้นพิมพ์อะไรและออกด้วยรหัส

ลองออนไลน์!


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

(เพื่อความสะดวกฉันขอแนะนำให้กดปุ่มαสองครั้งก่อนที่จะพิมพ์อะไรดังนั้นการล็อกโหมด alpha input หลังจากนั้นเพียงใช้ปุ่ม DEL เพื่อยกเลิกตัวคั่นการปิดที่แทรกโดยอัตโนมัติเพียงใช้ปุ่ม ENTER เพื่อตรวจสอบอย่าลืมพื้นที่หลัง ผู้ประกอบการแทง.)

ฟังก์ชั่นนี้จะผลักดันโปรแกรมแก้ไขตัวเองแบบสแต็กทันทีภายใต้รูปแบบของรายการ (แต่ฟังก์ชั่นด้านบนไม่ได้แก้ไขตัวเอง) เนื่องจาก L ใน RPL นั้นแทน LISP การกดปุ่ม EVAL จะประเมินโปรแกรมนี้อย่างแน่นอน ส่งคืนโค้ดการออกในระดับสแต็กที่สองและปล่อยให้ตัวเองถูกแก้ไข (ใช่นี่มันน่าสงสัย) สำหรับ EVAL ตัวหลัง ดังนั้นกด EVAL ซ้ำ ๆ จนกว่าโปรแกรมจะหยุดตัวเองลงในระดับกองซ้อน รหัสทางออกสุดท้าย 0 จึงปรากฏในระดับหนึ่งโดยมีรหัสทางออกที่ผ่านมาด้านบน หากคุณลืม-52 SFคุณสามารถนำทางในกองหลังแต่ละ EVAL โดยกดปุ่ม pressing (ออกจากโหมดนำทางนี้ด้วยปุ่มเปิด) ฟังก์ชั่นด้านบนไม่ยอมรับสตริงที่มีตัวอักษร 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
เฉพาะโปรแกรมที่สร้างขึ้นเท่านั้นที่สามารถแก้ไขตัวเองได้ไม่ใช่ฟังก์ชันที่ตอบความท้าทาย แต่ฉันเห็นด้วยนี่เป็นปัญหา! เพิ่มการแก้ไขบางอย่างเพื่อเน้นสิ่งนี้
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) ล้อมรอบด้วยอักขระเพิ่มเติม 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 เท่านั้น ทางออกที่ดี! :)
Conor O'Brien

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