ค้นหาสตริงที่ผิดกฎหมาย


81

ความท้าทายคือการค้นหาสตริงของอักขระที่ไม่สามารถปรากฏในโปรแกรมทางกฎหมายใด ๆในภาษาการเขียนโปรแกรมที่คุณเลือก ซึ่งรวมถึงความคิดเห็นสตริงหรือส่วนอื่น ๆ "ที่ไม่สามารถเรียกใช้งานได้"

ท้าทาย

  • โปรแกรมของคุณอาจเฉพาะเจาะจงกับรุ่นที่เฉพาะเจาะจงหรือการใช้สภาพแวดล้อมคอมไพเลอร์ / ล่าม / รันไทม์ของภาษาของคุณ ถ้าเป็นเช่นนั้นโปรดระบุรายการ
  • อนุญาตเฉพาะตัวเลือกคอมไพเลอร์ / ล่าม / รันไทม์มาตรฐาน คุณไม่สามารถส่งแฟล็กแปลก ๆ ไปยังคอมไพเลอร์ของคุณเพื่อรับผลลัพธ์เฉพาะ (เช่นการส่งแฟล็กเพื่อแปลงคำเตือนเป็นข้อผิดพลาด)
  • หากภาษาการเขียนโปรแกรมของคุณต้องการการเข้ารหัสที่เฉพาะเจาะจง (เช่น UTF-8) สตริงของคุณจะต้องเข้ารหัสอย่างถูกต้อง (เช่นสตริงที่ล้มเหลวเพียงอย่างเดียวเนื่องจากข้อผิดพลาดในการถอดรหัสอักขระไม่ได้รับอนุญาต)
  • ตัวละครทุกตัวที่คุณส่งจะต้องเป็นที่ยอมรับในโปรแกรมทางกฎหมาย นั่นคือคุณไม่สามารถใช้ตัวละครที่ถูกปฏิเสธได้เสมอ
  • คอมไพเลอร์ / ล่าม / รันไทม์จะต้องให้ข้อผิดพลาดเมื่อได้รับรหัสที่มาใด ๆที่มีสตริงของคุณเป็นสตริงย่อย ข้อผิดพลาดไม่จำเป็นต้องเหมือนกันในทุกโปรแกรม - การฝังสตริงของคุณอาจทำให้เกิดข้อผิดพลาดทางไวยากรณ์ขณะที่อีกอันอาจทำให้เกิดข้อผิดพลาดรันไทม์

เกณฑ์การให้คะแนน

  • สตริงผิดกฎหมายที่สั้นที่สุดสำหรับแต่ละภาษาชนะ
  • คุณควรอธิบายว่าทำไมสายของคุณจึงผิดกฎหมาย (เหตุใดจึงไม่ปรากฏที่ใดก็ได้ในโปรแกรมทางกฎหมาย)
  • ข้อพิพาทที่ไม่ถูกต้องในการแสดงความคิดเห็น โดยเฉพาะอย่างยิ่งคุณควรให้ลิงค์ไปยัง TIO หรือเทียบเท่าแสดงให้เห็นถึงโปรแกรมทางกฎหมาย (เช่นหนึ่งที่ไม่ได้ผลิตข้อผิดพลาดใด ๆ ) ที่มีซับสตริงที่เสนอ
  • บางภาษา (เช่น Bash, Batch, Perl) อนุญาตให้ผนวกข้อมูลโดยพลการเข้ากับโปรแกรมโดยไม่มีผลต่อความถูกต้อง (เช่นใช้__DATA__ใน Perl) สำหรับภาษาดังกล่าวคุณสามารถส่งโซลูชันที่สามารถปรากฏได้เฉพาะในส่วนต่อท้าย ตรวจสอบให้แน่ใจว่าได้จดบันทึกสิ่งนั้นไว้ในคำตอบของคุณ (คำจำกัดความของ "ส่วนต่อท้าย" นี้ขึ้นอยู่กับภาษา แต่โดยทั่วไปหมายถึงข้อความใด ๆ หลังจากตัวแยกวิเคราะห์หยุดอ่านสคริปต์ทั้งหมด)

ตัวอย่าง

ใน Python ฉันอาจส่ง

x
"""
'''

แต่สิ่งนี้สามารถฝังลงในโปรแกรมที่มีขนาดใหญ่ขึ้น

"""
x
"""
'''
y
'''

ดังนั้นจึงไม่อนุญาต


2
ตัวอย่างเคาน์เตอร์สามารถพึ่งพาอินพุตจาก STDIN ได้หรือไม่?
Zacharý

5
สิ่งนี้จะทำให้ CnR ดีหรือไม่?
CalculatorFeline

2
สายเกินไปฉันเดา แต่ดูเหมือนว่านี่อาจเป็นความท้าทายของตำรวจและโจร มีทักษะมากมายที่เห็นได้ชัดในความพยายามที่จะสร้างโปรแกรมที่ถูกต้องเช่นเดียวกับการสร้างสตริงในตอนแรก
user2390246

4
แสดงความเสียใจต่อความพยายามของ Perl :)
Kaz

2
ฉันค่อนข้างมั่นใจว่ามันเป็นไปไม่ได้อย่างสมบูรณ์ใน Haskell ที่ไม่ใช้ความรู้ขอบคุณด้วยความคิดเห็นที่ซ้อนกัน
dfeuer

คำตอบ:


57

การเปลี่ยนแปลง 2 ไบต์




นั่นคือสองฟีด การเปลี่ยนที่ถูกต้องจะต้องเป็นรูปสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบของอักขระ ASCII ที่พิมพ์ได้ดังนั้นจึงไม่สามารถมีสองบรรทัดป้อนบรรทัดในแถวได้

ข้อผิดพลาดเป็นข้อผิดพลาดในการแยกวิเคราะห์เสมอและเหมือนกันเสมอ:

This shape is unpleasant.

พร้อมด้วยรหัสทางออก1

ลองออนไลน์!


นี้ยังทำงานร่วมกับ2Col ลองออนไลน์! . แต่สาเหตุที่ทำให้แตกใน 2Col นี้คือทุกบรรทัดต้องประกอบด้วยอักขระ 2 ตัว แต่บรรทัดว่างนั้น
Kritixi Lithos

2
+1 เนื่องจากเป็นผู้ชนะโดยอัตโนมัติเนื่องจากไม่อนุญาตให้ใช้โซลูชัน 1 ไบต์เนื่องจาก "คุณไม่สามารถใช้อักขระที่ถูกปฏิเสธได้เสมอ"
Zacharý

1
@Cowsquack tfw ฉันลืมภาษาของตัวเอง
Skidsdev

1
@Skidsdev tfw ฉันลืมภาษาของฉันอีกครั้งและลืมเกี่ยวกับฉันลืมภาษาของตัวเอง
Skidsdev

@ Zacharýแล้ว 0-byte solutions เป็นอย่างไร?
PyRulez

32

Java, 4 ไบต์

;\u;

ลองออนไลน์!

นี่เป็นลำดับ Unicode escape ที่ไม่ถูกต้องและจะทำให้เกิดข้อผิดพลาดในคอมไพเลอร์

error: illegal unicode escape

ไม่ทำงาน - "\\u;"หนึ่งอาจมีสตริงตัวอักษรเช่น
feersum

@feersum แก้ไขค่าหนึ่งไบต์
Kritixi Lithos

21
@TheLethalCoder: ซอร์สโค้ดของ Java ทำการแก้ไข\uXXXXescapes ก่อนที่จะทำสิ่งอื่นดังนั้นใช่สิ่งนี้จะใช้ได้แม้ใน comments.za
nneonneo

3
ฉันคิดว่านี่เป็นคำตอบ Java ที่สั้นที่สุดในประวัติศาสตร์ของเว็บไซต์นี้ ..
Magic Octopus Urn

1
@MagicOctopusUrn จริงๆแล้วมันมี0 ไบต์ไบต์คำตอบ Java (ซึ่งไม่เกี่ยวข้องอีกต่อไปในเมตาปัจจุบันเนื่องจากมันส่งออกไปยัง STDERR แทนที่จะเป็น STDOUT) แม้ว่าทั้งสองจะค่อนข้างน่าทึ่งและฉลาด :)
Kevin Cruijssen

25

COBOL (GNU) , 8 ไบต์


THEGAME

ก่อนอื่นให้ป้อนบรรทัดเพื่อป้องกันไม่ให้คุณใส่คำของฉันในบรรทัดความคิดเห็น

จากนั้นในอดีตโปรแกรมภาษาโคบอลถูกพิมพ์ลงบนแผ่นการเข้ารหัสคอมไพเลอร์อาศัยบรรทัดที่ จำกัด จำนวน 80 ตัวอักษรไม่มีความคิดเห็นแบบหลายบรรทัดและตัวอักษร 6 ตัวแรกเป็นความคิดเห็น (มักใช้เป็นหมายเลขบรรทัดที่สามารถแก้ไขได้) , AFAIK. ฉันเลือกTHEGAMที่จุดเริ่มต้นของบรรทัดถัดไป

จากนั้นเป็นสัญลักษณ์ที่ 7 ในสายใด ๆ จะยอมรับเฉพาะรายการที่ จำกัด มากของตัวอักษร: อวกาศ (ไม่มีผล) ดอกจัน (ความเห็นส่วนที่เหลือของบรรทัด) ยัติภังค์, Slash อาจจะมีคนอื่น ๆ Eแต่ไม่แน่นอน

ตัวอย่างเช่นข้อผิดพลาดที่ได้รับจาก GnuCobol คือ:

error: invalid indicator 'E' at column 7

ลองออนไลน์!

นอกจากนี้คุณเพิ่งแพ้เกม


30
Also, you just lost the game.ฉันเกือบถูกโหวต
สตีเฟน

24

JavaScript ขนาด 7 ไบต์


;*/\u)

หมายเหตุ newline ชั้นนำ

  • \u) เป็นลำดับ Unicode escape ที่ไม่ถูกต้องและนี่คือสาเหตุที่สตริงนี้ไม่ถูกต้อง
  • การเพิ่ม//ที่จุดเริ่มต้นจะยังคงไม่ทำงานเนื่องจากการขึ้นบรรทัดใหม่นำโดยปล่อยให้บรรทัดที่สองไม่ใส่เครื่องหมายข้อคิดเห็น
  • เพิ่ม/*จะไม่ uncomment สตริงสมบูรณ์เนื่องจากการปิดที่*/ว่าเสร็จสมบูรณ์ออกจาก\u)การสัมผัส
  • ตามที่ระบุโดย @tsh บรรทัดล่างสามารถกลายเป็น regex โดยมี/สตริงหลังดังนั้นโดยมี)ด้านหน้าของ\uเราสามารถมั่นใจได้ว่าตัวอักษร regex จะไม่ถูกต้องเสมอ
  • ตามที่ระบุโดย @asgallant เราสามารถทำได้1||1(string)/เพื่อหลีกเลี่ยงการประเมิน regex กึ่งลำไส้ใหญ่ที่จุดเริ่มต้นของบรรทัดที่สองจะหยุดไม่ให้เกิดขึ้นโดยยกเลิกการแสดงออก1||1ก่อนที่จะ hits บรรทัดที่สองจึงบังคับให้ SyntaxError ;*กับ

ลองมัน!


2
/* */\u0045 = 3ดูเหมือนว่ารหัส JavaScript ที่ถูกต้อง
tsh

2
3 */\u;/ยังคงใช้ได้
tsh

3
สนใจที่จะทราบว่าเป็นของ ES2018 (ซึ่งจะไม่เป็นทางการจนถึงสิ้นปีนี้) คุณก็สามารถตัดสิ่งที่ทั้งใน backticks เนื่องจากการนี้ คุณอาจแก้ไขได้ด้วยการแทรก backtick หลังจาก/(ไม่ใช่ว่าคุณต้องแก้ไข) (นอกจากนี้ยัง;ไม่บังคับให้แยกวิเคราะห์ regex ที่ไม่ดีมันบังคับ SyntaxError กับ*.)
ETHproductions

1
@Lushushenko แต่นี่ไม่ได้ผล#if 0เหมือนที่นี่: ลองออนไลน์!
Kritixi Lithos

3
ในเวอร์ชัน JS ที่ใหม่กว่าString.rawพร้อมสตริงเท็มเพลตสามารถทำให้สิ่งนี้ไม่หยุดทำงานเนื่องจากการหลีกเลี่ยงที่ไม่ถูกต้องล้มเหลว จะเป็น: String.raw`code ที่นี่ `
iovoid

15

Python 10 ไบต์ (ไม่ใช่ cpython)


?"""?'''?

หมายเหตุ newline ชั้นนำ ไม่สามารถออกความเห็นเนื่องจาก newline และไม่มีการรวมกันของสามสตริงที่ยกมาควรทำงานถ้าฉันคิดเกี่ยวกับเรื่องนี้อย่างถูกต้อง

@feersum ในความคิดเห็นดูเหมือนจะแตกโปรแกรม cpython ใด ๆ บน Windows อย่างสมบูรณ์เท่าที่ฉันสามารถบอกได้โดยการเพิ่มอักขระ 0x1A ไปยังจุดเริ่มต้นของไฟล์ ดูเหมือนว่าอาจ (?) นี่เป็นเพราะวิธีการที่ตัวละครนี้ได้รับการจัดการโดยระบบปฏิบัติการซึ่งดูเหมือนว่าจะถูกแปลเป็น EOF เมื่อมันผ่าน stdin เนื่องจากมาตรฐาน DOS ดั้งเดิมบางตัว

ในความเป็นจริงอย่างมากนี่ไม่ใช่ปัญหาของงูหลาม แต่กับระบบปฏิบัติการ หากคุณสร้างสคริปต์ไพ ธ อนที่อ่านไฟล์และใช้บิวอินcompileในนั้นมันจะให้พฤติกรรมที่คาดหวังมากขึ้นของการขว้างปาข้อผิดพลาดทางไวยากรณ์ Pypy (ซึ่งอาจทำแค่ภายในนี้) ก็มีข้อผิดพลาดเช่นกัน

แก้ไข:

เนื่องจากความขยันของ @ feersum ในการหาวิธีที่ชัดเจนในการทำลายล่าม Python คำตอบนี้จึงไม่ถูกต้องสมบูรณ์สำหรับสภาพแวดล้อม cpython ทั่วไปเท่าที่ฉันสามารถบอกได้! (Python 2 และ 3 สำหรับทั้ง Windows และ Linux) ฉันยังเชื่อว่ารอยแตกเหล่านี้จะไม่ทำงานสำหรับ Pypy บนแพลตฟอร์มใด ๆ (การติดตั้ง Python อื่น ๆ ที่ฉันได้ทดสอบเท่านั้น)


1
@officialaimm พิจารณา"""?'''"""
KSab

3
ฉันสร้างโปรแกรมด้วยซับสตริงนี้ที่ทำงานบนเครื่องของฉัน อย่างไรก็ตามฉันคิดว่ามันไม่ทำงานกับล่าม / แพลตฟอร์ม / รุ่นต่าง ๆ มากมาย คุณสามารถระบุล่าม Python เวอร์ชันใดและระบบปฏิบัติการคำตอบนี้มีการกำหนดเป้าหมายอย่างไร
feersum

1
Python 3 บน Windows 7 เกิดขึ้นตรงที่รอยแตกของฉันทำงาน Pastebin ของโปรแกรมที่เข้ารหัส
พื้นฐาน 64

1
ฉันสามารถถอดรหัสอันนี้ได้เช่นกัน เพียงแค่ใส่อักขระ 0x1A ที่จุดเริ่มต้นของไฟล์และส่วนที่เหลือทั้งหมดของมันจะถูกละเว้น (สิ่งนี้ใช้ได้กับ Python 3 เช่นกัน)
feersum

1
ฉันรู้ว่านี้คือเก่าจริงๆ แต่หลังจากทำงานร่วมกับคนบางคนมากกว่าในหลามบาดหมางกันเราพบรอยแตกนี้แต่ผมไม่ทราบว่าถ้าเปลี่ยนการเข้ารหัสที่ถือได้ว่าโกง
EdgyNerd

14

C (เสียงดังกราว) 16 ไบต์

 */
#else
#else

ลองออนไลน์!

*/ปิด/*ความคิดเห็นใด ๆและพื้นที่ชั้นนำทำให้แน่ใจว่าเราไม่ได้เพิ่งเริ่มต้น ขึ้นบรรทัดใหม่ปิด//ความคิดเห็นและแบ่งสตริงตัวอักษรใด ๆ จากนั้นเราก็ทำให้เกิดการ#else without #ifหรือ#else after #elseข้อผิดพลาด (โดยไม่คำนึงถึงวิธีการหลาย#if 0s เราอาจจะภายใน)



2
นอกจากนี้เนื่องจาก C ++ 11 สตริงดิบดูเหมือนจะทำงานวิธีแก้ปัญหาเป็นไปไม่ได้กับ gcc
feersum

@feersum Huh TIL ที่ GCC ยอมรับในรหัส C ฉันสามารถระบุ-std=c99ได้ แต่ลองเปลี่ยนมาเป็นเสียงดังกราว
Anders Kaseorg

3
ฉันประหลาดใจจริงๆที่ gcc ยอมรับสตริงดิบ C ++ 11 การระบุเวอร์ชันคอมไพเลอร์หรือการนำไปใช้นั้นสมบูรณ์แบบดังนั้นถ้ามันผิดกฎหมายใน Clang มันเป็นเกมที่ยุติธรรม
nneonneo

1
@ l4m2 ฉันไม่สามารถแยกคำถามของคุณ (พวกเขาคือใครและคุณหมายถึงอะไรอีกครั้ง) แต่โปรดทราบว่าตัวอักษรสตริง C ++ ดิบสนับสนุนการกำหนดขอบเขตที่กำหนดเอง: R"foobar(...)foobar"และมีเพียง paren ที่เหมาะสมตามด้วย delimeter ที่ตรงกันและ อ้างจะปิดมัน
Anders Kaseorg

11

Pyth, 6 ไบต์

¡¡$¡"¡

¡เป็นอักขระที่ไม่ได้ดำเนินการซึ่งหมายความว่าหากตัวแยกวิเคราะห์ Pyth เคยประเมินค่ามันจะเกิดข้อผิดพลาดด้วย PythParseError รหัสทำให้แน่ใจว่าสิ่งนี้จะเกิดขึ้นกับหนึ่งใน¡s

มีสามวิธีไบต์สามารถจะนำเสนอในโปรแกรม Pyth และไม่สามารถแยกวิเคราะห์เป็น: ในสตริงตัวอักษร ( "หรือ."ซึ่งมีการแยกวิเคราะห์เท่า) ในหลามตัวอักษร ( $) \และทันทีหลังจากที่

รหัสนี้ป้องกันไม่ให้\ทำการประเมินโดยไม่มีข้อผิดพลาดเนื่องจากจะมีผลเฉพาะกับไบต์ที่ตามมาทันทีและ¡ข้อผิดพลาดที่สอง

$ฝังโค้ดภายใน$s ลงในโค้ด Python ที่คอมไพล์แล้วโดยตรง ฉันไม่มีข้อสมมติฐานเกี่ยวกับสิ่งที่อาจเกิดขึ้นที่นั่น

หากโปรแกรมเข้าถึงรหัสนี้ใน$บริบทโปรแกรมจะสิ้นสุดที่$และ¡หลังจากนั้นโปรแกรมจะทำการแยกวิเคราะห์ข้อผิดพลาด ตัวอักษร Python ของ Pyth จะลงท้ายด้วยตัวถัดไป$เสมอไม่ว่ารหัส Python นั้นจะทำอะไร

หากโปรแกรมเริ่มต้นใน"บริบทโปรแกรม"จะทำการจบการทำงานของสตริงและโปรแกรมสุดท้าย¡จะทำการแยกวิเคราะห์ข้อผิดพลาด


11

Ada - 2 ไบต์

ฉันคิดว่าสิ่งนี้ควรใช้งานได้:


_

นั่นคือบรรทัดใหม่ - ขีดล่าง ขึ้นบรรทัดใหม่ยุติความคิดเห็นและไม่อนุญาตในสตริง ขีดเส้นใต้ไม่สามารถติดตามช่องว่าง มันเคยได้รับอนุญาตหลังจากตัวอักษรและตัวเลขเท่านั้น แต่การแนะนำ Unicode ทำให้สิ่งต่าง ๆ มีความซับซ้อน


2
ยินดีต้อนรับสู่เว็บไซต์! :)
DJMcMayhem

9

x86 รหัสเครื่อง 32 บิต, 11 ไบต์ (และหลักฐานในอนาคต 64 บิต)

90 90 90 90 90 90 90 90 90 0f 0b

นี่คือtimes 9 nop/ ud2. เป็นพื้นเลื่อน NOPดังนั้นจึงยังคงทำงานเป็น 0 หรือมากกว่าnopนั้นแล้วud2ยกข้อยกเว้นโดยไม่คำนึงถึงจำนวน0x90ไบต์ที่ถูกใช้เป็นตัวถูกดำเนินการไปยัง opcode ก่อนหน้านี้ คำแนะนำแบบไบต์เดียวอื่น ๆ (เช่นtimes 9 xchg eax, ecx) จะใช้ได้เช่นกัน

x86 รหัสเครื่อง 64 บิต, 10 ไบต์ (CPU ปัจจุบัน)

มีคำแนะนำที่ผิดกฎหมาย 1 ไบต์ในโหมด 64 บิตจนกว่าส่วนขยาย ISA ในอนาคตจะแสดงคำนำหน้าเหล่านั้นเป็นส่วนนำหน้าหรือบางส่วนของหลายไบต์ opcodes ในโหมด 64 บิตเท่านั้นแยกจากความหมายในโหมด 32 บิต 0x0eอยู่push csในโหมด 32 บิต แต่ผิดกฎหมายในซีพียูปัจจุบัน (ทดสอบกับ Intel Skylake) เป็น 64 บิต

0e 0e 0e 0e 0e 0e 0e 0e 0e 0e

การตีความกฎสำหรับรหัสเครื่องที่ปฏิบัติการได้ :

  • ไบต์ไม่สามารถข้ามไปได้ (เช่นข้อ จำกัด "ไม่แจง") เนื่องจาก CPU ไม่ยกข้อยกเว้นจนกว่าพวกเขาจะพยายามถอดรหัส / ดำเนินการ (ไม่ใช่แบบพิเศษ)

  • วิธีการที่ผิดกฎหมายทำให้เกิดข้อยกเว้นเสมอตัวอย่างเช่นข้อยกเว้นการสอนที่ผิดกฎหมาย (โปรแกรมจริงสามารถตรวจจับสิ่งนั้นได้ด้วยตัวจัดการข้อยกเว้นบนโลหะเปลือยหรือติดตั้งตัวจัดการสัญญาณ OS แต่ฉันคิดว่านี่เป็นสิ่งที่จับวิญญาณของความท้าทาย)


มันทำงานได้เพราะสั้นไบต์สตริงลงท้ายud2อาจปรากฏเป็น imm32 และ / หรือบางส่วนของโหมดการเรียนการสอนอื่นหรือข้ามแยกคู่ของคำแนะนำ เป็นการง่ายที่สุดที่จะคิดเกี่ยวกับสิ่งนี้ในแง่ของสิ่งที่คุณสามารถนำหน้าสตริงเพื่อ "กิน" ไบต์เป็นส่วนหนึ่งของการเรียนการสอนและปล่อยสิ่งที่ไม่ผิด

ฉันคิดว่าคำสั่งสามารถใช้งานได้สูงสุด 9 ไบต์ของสิ่งที่กำหนดเอง: SIB ไบต์, disp32 และ imm32 เช่น 2 ไบต์แรกของคำสั่งนี้สามารถใช้งาน 8 NOPs และ ud2 ได้ แต่ไม่ใช่ 9

c7 84 4b 00 04 00 00 78 56 34 12        mov dword [rbx+rcx*2+0x400],0x12345678

ไม่สามารถเอาชนะ 9 nops:

    db 0xc7, 0x84   ; opcode + mod/rm byte: consumes 9 bytes (SIB + disp32 + imm32)
    times 9 nop          ; 1-byte xchg eax, ecx or whatever works, too
    ud2
  ----
   b:   c7 84 90 90 90 90 90 90 90 90 90        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0x90909090
  16:   0f 0b                   ud2    

โหมด 64 บิต:

 c7 84 0e 0e 0e 0e 0e 0e 0e 0e 0e        mov    DWORD PTR [rsi+rcx*1+0xe0e0e0e],0xe0e0e0e
 0e                      (bad)  

แต่ไบต์สำหรับ 8 NOPs + ud2 (หรือtimes 9 db 0x0e) สามารถปรากฏเป็นส่วนหนึ่งของ insns อื่น ๆ :

    db 0xc7, 0x84   ; defender's opcode + mod/rm that consumes 9 bytes

    times 8 nop          ; attacker code
    ud2

    times 10 nop    ;; defenders's padding to be consumed by the 0b opcode (2nd half of ud2)
----
  18:   c7 84 90 90 90 90 90 90 90 90 0f        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0xf909090
  23:   0b 90 90 90 90 90       or     edx,DWORD PTR [rax-0x6f6f6f70]
  29:   90                      nop
  2a:   90                      nop
  ...

กฎที่นี่ยังไม่ชัดเจนพอที่ฉันจะพิจารณาโพสต์คำตอบ asm / รหัสเครื่อง ตัวอย่างเช่นทำไมคุณทำud2ไม่ได้ ดูเหมือนว่าคุณกำลังบอกว่าคุณตีความกฎว่าห้ามกระโดดข้ามไบต์ดังนั้นud2มันจะใช้ได้ผลดีใช่ไหม? โอ้…ฉันคิดว่าคุณกำลังพูดถึงปัญหาที่ud2อาจปรากฏเป็นคำนำหน้าของคำสั่งที่ถูกต้องหรือไม่ ส่วนที่สองของคำตอบนี้ยากสำหรับฉันที่จะเข้าใจ
Cody Grey

@CodyGray: ใช่ไบต์ 2 ที่เข้ารหัสud2สามารถปรากฏในimm32คำสั่งใด ๆ ผมคิดเกี่ยวกับเรื่องนี้ในแง่ของสิ่งไบต์คุณสามารถใส่ก่อนเช่นสตริงที่ "กิน" ซึ่งเป็นเป็นส่วนหนึ่งของการเรียนการสอนก่อนหน้านี้แทนการถอดรหัสเป็น0f 0b ud2ผมไม่ได้มีความสุขโดยสิ้นเชิงกับวิธีการที่ฉันจบลงด้วยการนำเสนอมัน แต่ผมต้องการที่จะแสดงให้เห็นว่าทำไมเพียง 8 nops ไม่เพียงพอและสิ่งที่เกิดขึ้นกับ 9 nops ud2+
Peter Cordes

@CodyGray: โปรแกรมต้นทาง asm จะเป็นคำตอบที่แตกต่างกันโดยสิ้นเชิง ที่จะต้องมีข้อผิดพลาด parser ที่ใช้โดยแอสเซมเบลอร์ไม่สร้างข้อบกพร่องรหัสเครื่อง ดังนั้นบางอย่างเช่น%else/ %elseอาจทำงานเพื่อเอาชนะ%if 0ซึ่งปกติสามารถป้องกันข้อความที่ไม่ถูกต้องใด ๆ จากการแยกวิเคราะห์ (แนวคิดจากคำตอบ CPP)
Peter Cordes

ไม่ค่อยพอใจ โซลูชันของคุณอาจอยู่ในรูปแบบ. data (แม้ว่ามันจะทำให้มันเป็นไปไม่ได้)
l4m2

@ l4m2: เพื่อให้ตอบคำถามได้ / น่าสนใจฉันต้อง จำกัดรหัสที่ถูกประมวลผล (และไม่ข้าม) ดูกฎการตีความสัญลักษณ์แสดงหัวข้อย่อยในคำตอบของฉัน แน่นอนว่าจะต้องตัดข้อมูลคงที่ออกไปด้วย เพราะมันไม่ใช่รหัสเครื่องเลยมันเป็นแค่ข้อมูล คำถามนี้ต้องการการปรับตัวมากกว่าคำตอบของรหัสเครื่องเพื่อให้เหมาะสมเนื่องจากไม่มีขั้นตอนการรวบรวม / ประกอบที่คุณสามารถแยกวิเคราะห์ตัวแยกวิเคราะห์ได้เราแค่พูดถึงจำนวนไบต์ในหน่วยความจำ
Peter Cordes

7

C #, 16 ไบต์


*/"
#endif<#@#>

ทำงานได้เพราะ:

  • // ความคิดเห็นจะไม่ทำงานเนื่องจากบรรทัดใหม่
  • /* ความคิดเห็นจะไม่ทำงานเพราะ */
  • คุณไม่สามารถมีค่าคงที่ในรหัสเพียงอย่างเดียว
  • การเพิ่ม#if falseไปยังจุดเริ่มต้นจะไม่ทำงานเนื่องจาก#endif
  • "ปิดสตริงตัวอักษร
  • <#@#>เป็นคำสั่งนิรนามจึงล้มเหลวสำหรับแม่แบบ T4
  • การขึ้นบรรทัดใหม่/จะเป็นการหลอกลวงเมื่อเริ่มต้นจะไม่เป็นการหลอกลวง*/

แต่ละรูปแบบล้มเหลวด้วยข้อผิดพลาดในการรวบรวม


1
แปลกที่คุณตัดสินใจที่จะรวมเทมเพลต T4 ในรหัสของคุณ T4 ถือเป็นภาษาอื่นหรือไม่
Arturo Torres Sánchez

1
@ ArturoTorresSánchezฉันไม่รู้ว่าฉันไม่เคยได้ยินพวกเขา มีคนแสดงความคิดเห็นว่าสิ่งนี้ไม่ทำงานเมื่อคุณรวมเทมเพลต T4 ดังนั้นฉันจึงเพิ่มการแก้ไข
TheLethalCoder

6

APLและMATLและFortranขนาด 3 ไบต์


'

Newline, Quote, Newline จะพ่นข้อผิดพลาดเสมอเนื่องจากไม่มีความคิดเห็นบล็อก:


สิ่งนี้ใช้ได้กับ MATL ด้วย
Luis Mendo

ฉันคิดว่ามันจะทำงานใน Fortran ด้วย
Steadybox

5

Literary Haskell , 15 ไบต์

การซ่อมแซมความพยายามที่ถูกลบโดย nimi


\end{code}
5
>

ลองออนไลน์!

ความพยายามดั้งเดิมของ nimi คือสองบรรทัดสุดท้ายโดยยึดตาม Literate Haskell ที่ไม่อนุญาตให้ใช้>รหัสการรู้หนังสือสไตล์ในบรรทัดข้างเคียงกับบรรทัดความคิดเห็นที่รู้ ( 5ที่นี่) ล้มเหลวเนื่องจากสามารถฝังในความคิดเห็นในรูปแบบการเขียนสำรอง ("LaTeX")

\begin{code}
{-
5
>
-}
\end{code}

อย่างไรก็ตาม\begin{code}สไตล์ของ Literate Haskell ไม่ได้ซ้อนอยู่ทั้งในตัวเองและใน{- -}ความคิดเห็นหลายบรรทัดดังนั้นโดยการวางบรรทัด\end{code}ก่อนหน้าบรรทัดด้วย5วิธีแก้ปัญหานั้นจะล้มเหลวและฉันไม่เห็นอีกแบบหนึ่ง


4

ฟรี Pascal ขนาด 18 ไบต์


*)}{$else}{$else}

ก่อนปิดความคิดเห็นที่เป็นไปได้ทั้งหมดจากนั้นจัดการคอมไพล์ตามเงื่อนไข

โปรดแสดงความคิดเห็นที่นี่ถ้าฉันลืมบางสิ่งบางอย่าง


3
@ user902383 ตัวอย่างของคุณมีการขึ้นบรรทัดใหม่ของตัวอย่างข้อมูลหรือไม่
Brian J

@BrianJ ไม่ฉันคิดว่ามันเป็นเพียงแค่การจัดรูปแบบปัญหาของฉันไม่ดี
user902383

ฉันไม่คิดว่าเป็นไปได้ใน Free Pascal begin end.เพียงแค่ใส่พวกเขาหลังจากที่
jimmy23013

@ jimmy23013 แต่ดูเหมือนว่ารหัสหลังจากที่end.ถูกต้องจะได้รับอนุญาตโดยคำถาม
tsh

4

พลเรือจัตวา 64 พื้นฐาน 2 ไบต์


B

(นั่นคือบรรทัดใหม่ตามด้วยตัวอักษร "B")

บรรทัดใด ๆ ในโปรแกรม Commodore 64 จะต้องเริ่มต้นด้วยหมายเลขบรรทัดหรือคีย์เวิร์ด BASIC และโปรแกรมที่เก็บไว้จะอนุญาตเฉพาะหมายเลขบรรทัดเท่านั้น ไม่มีคำหลักที่ขึ้นต้นด้วย "B" (หรือ "H", "J", "K", "Q", "X", "Y" หรือ "Z")


ถ้าฉันต่อท้าย=0นี่จะกลายเป็นคำแถลงการมอบหมาย ...
Neil

1
@Nil นั่นจะเป็นคำสั่งโหมดทันทีที่ถูกต้อง แต่ไม่ใช่โปรแกรมที่ถูกต้อง
Mark

4

Brain-Hack (รูปแบบของBrain-Flak ) ขนาด3 2 ไบต์

ขอบคุณWheat Wizardสำหรับการชี้ให้เห็นว่า Brain-Hack ไม่สนับสนุนความคิดเห็นช่วยฉันไบต์

(}

ลองออนไลน์!


คุณแสดงความคิดเห็นใน Brain-Flak ได้อย่างไร ฉันไม่รู้วิธีที่จะทำสิ่งนั้น
Erik the Outgolfer

@EriktheOutgolfer # TIO
Riley

พฤติกรรมที่ไม่มีเอกสารหือ
Erik the Outgolfer

@EriktheOutgolfer ฉันมักจะคิดว่าพวกเขาถูกบันทึกไว้ที่ไหนสักแห่ง ฉันจะดูที่การเพิ่มพวกเขา
Riley

คุณไม่จำเป็นต้องขึ้นบรรทัดใหม่ใน BrainHack หรือ Craneflak Rain-Flak เป็นเพียงหนึ่งในสามเวอร์ชันที่มีความคิดเห็นในบรรทัด แม้ว่า Craneflak จะแยกวิเคราะห์ได้ทันทีดังนั้นจึงเป็นไปไม่ได้ที่จะแก้ปัญหานี้ใน Craneflak แต่การแก้ปัญหาใด ๆ ก็อาจถูกเอาชนะได้โดยการ(()){()}เตรียม
ข้าวสาลีตัวช่วยสร้าง


3

VBA, 2 ไบต์

Linefeed ตามด้วยขีดล่าง - _ฟังก์ชั่นเป็นตัวต่อเนื่องของสายอักขระใน VBA และเนื่องจากไม่มีสิ่งใดในบรรทัดตรงไปทางซ้ายหรือด้านบนของความต่อเนื่องของบรรทัดควบคู่ไปกับการขาดความคิดเห็นหลายบรรทัดของ VBA หมายความว่า ข้อผิดพลาดเวลาCompile Error: Invalid character


_

คุณขึ้นอยู่กับรูปแบบของคุณเริ่มต้นในบรรทัดใหม่ ... ดังนั้นเพิ่มขึ้นบรรทัดใหม่
Deduplicator

@Dupuplicator มีบรรทัดใหม่แล้ว - ไม่สำคัญว่าจะตามหลัง_เพียงว่าไม่มีบรรทัดที่ถูกต้องทางด้านซ้ายหรือด้านบน
Taylor Scott

เกิดอะไรขึ้นถ้ามันจะถูกฝังอยู่เช่นนี้myfunction( \n_ )?
Deduplicator

@Deduplicator ตัวอักษรบรรทัดต่อเนื่องจะต้องอยู่ในบรรทัดเดียวกันในขณะที่มันเป็นอย่างต่อเนื่องเช่นPublic Function Foo( ByVal bar as Integer, _ (สายใหม่) bas as long) as double- ดังนั้นใช่มันจะส่งผลให้เกิดข้อผิดพลาดถ้าคุณเรียกว่าฟังก์ชั่นที่คุณอธิบาย
เทย์เลอร์สกอตต์

ตกลงในกรณีนี้มันเป็นเช่นmyfunction( _ \n_ )นั้นมากกว่า ขอโทษสำหรับความสับสน. หากต้องการกล่าวอีกวิธีหนึ่งคุณควรใช้บรรทัดใหม่สองบรรทัด
Deduplicator

3

SmileBASIC ขนาด 2 ไบต์


!

ไม่มีสิ่งใดดำเนินต่อไปจนจบบรรทัดดังนั้นสิ่งที่คุณต้องมีก็คือการแบ่งบรรทัดตามด้วยสิ่งที่ไม่สามารถเป็นจุดเริ่มต้นของคำสั่งได้ !เป็นตัวดำเนินการแบบลอจิคัลไม่ใช่ แต่คุณไม่ได้รับอนุญาตให้เพิกเฉยต่อผลลัพธ์ของนิพจน์ดังนั้นแม้บางอย่าง!10จะไม่ถูกต้อง (ในขณะที่X=!10ทำงานแน่นอน)

สิ่งที่คล้ายกันจะทำงานในภาษาใดก็ได้ที่ทุกอย่างสิ้นสุดที่ส่วนท้ายของบรรทัดตราบใดที่มันแยกวิเคราะห์รหัสก่อนดำเนินการ

มีอักขระทางเลือกมากมายที่สามารถใช้ที่นี่ได้ดังนั้นฉันคิดว่ามันน่าสนใจกว่าที่จะแสดงรายการอักขระที่สามารถใช้ได้

@คือจุดเริ่มต้นของป้ายกำกับตัวอย่างเช่น@DATA; (อาจเป็นส่วนหนึ่งของการแสดงออก(X)=1ที่ได้รับอนุญาตด้วยเหตุผลบางอย่าง; จดหมายหรือ_อาจจะเป็นชื่อตัวแปรX=1, การเรียกใช้ฟังก์ชันLOCATE 10,2หรือคำหลักWHILE 1; 'คือความคิดเห็น; และสั้นสำหรับ?PRINT


โอ้ด้วยเหตุผลบางอย่างเมื่อฉันแก้ไขโพสต์มันซ้ำซ้อน ...
12Me21

3

INTERCAL 12 ไบต์

DOTRYAGAINDO

พยายามที่จะถอดรหัสออนไลน์!

วิธีการของข้อผิดพลาดทางไวยากรณ์ของ INTERCAL นั้นค่อนข้างพิเศษ โดยพื้นฐานแล้วคำสั่งที่ไม่ถูกต้องจะไม่เกิดข้อผิดพลาดยกเว้นในกรณีที่โปรแกรมพยายามดำเนินการ ในความเป็นจริงไวยากรณ์สำนวนสำหรับความคิดเห็นคือการเริ่มต้นพวกเขาด้วยซึ่งจริงๆเพียงแค่เริ่มต้นคำสั่งบอกว่ามันไม่ได้ที่จะดำเนินการและจากนั้นเริ่มต้นด้วยตัวอักษรPLEASE NOTE EหากรหัสของคุณมีDODOที่อยู่ตรงกลางของมันคุณสามารถย่อหน้าDOABSTAINFROM(1)(1)และกลัดคำสั่งที่ถูกต้องใด ๆ ลงบนปลายและคุณจะปรับถ้ามันDODODOคุณสามารถดำเนินการเพียงแค่โค้งรอบ ๆ (1)DON'TDODODOCOMEFROM(1)มันเป็น แม้ว่า INTERCAL จะไม่มีไวยากรณ์ตามตัวอักษรของสตริงสำหรับการหลบหนี แต่ก็ไม่มีวิธีที่จะใช้ข้อผิดพลาดทางไวยากรณ์เพื่อสร้างสตริงที่ผิดกฎหมายได้แม้จะหมดทุกหมายเลขบรรทัดที่เป็นไปได้ด้วย(1)DO(2)DO...(65535)DODODOเนื่องจากดูเหมือนว่าเป็นไปได้ที่จะมีหมายเลขบรรทัดซ้ำกับCOME FROMการทำงานกับหมายเลขใด ๆ

TRY AGAINเพื่อให้เป็นสตริงที่ผิดกฎหมายเราจริงต้องใช้คำสั่งที่ถูกต้องสมบูรณ์: แม้ว่าจะไม่ได้รับการดำเนินการมันจะต้องเป็นคำสั่งสุดท้ายในโปรแกรมอย่างเคร่งครัดหากอยู่ในโปรแกรมเลย 12 ไบต์คือความรู้ของฉันสตริงที่สั้นที่สุดที่ผิดกฎหมายสามารถใช้TRY AGAINงานได้เนื่องจากมันต้องรับประกันว่าจะมีคำสั่งหลังจากนั้น (ดำเนินการหรือไม่) ดังนั้นจึงDOTRYAGAINเป็นเพียงรหัสปกติและต้องการให้แน่ใจว่าคำสั่งทั้งหมดนั้น เป็นที่แน่นอนTRY AGAINจึงTRYAGAINDOไม่ทำงานเพราะมันสามารถจะกลายเป็นละเว้นไวยากรณ์ผิดพลาดปกติหรือDON'TRYAGAINDOGIVEUP PLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORKไม่ว่าสิ่งที่คุณใส่ที่ด้านข้างของทั้งDOTRYAGAINDOคุณจะเกิดข้อผิดพลาดอย่างใดอย่างหนึ่งICL993I I GAVE UP LONG AGO, หรือICL079I PROGRAMMER IS INSUFFICIENTLY POLITEICL099I PROGRAMMER IS OVERLY POLITE


อาจมีข้อผิดพลาดในการรวบรวมเวลาอื่น ๆ ซึ่งสามารถดำเนินการก่อนหน้าICL993I I GAVE UP LONG AGOนี้ได้
สตริงที่ไม่เกี่ยวข้อง

ถ้าในขณะที่ใช้ฉลากทุกบรรทัดคุณยังCOME FROMป้ายทุกบรรทัดก็อาจจะมีบิตยากที่จะเบี่ยงเบนความสนใจการควบคุมการไหลรอบบล็อก แต่มีอะไรที่ทุกคนหยุดคุณจากการเป็นเพียงแค่GIVING UP!
สตริงที่ไม่เกี่ยวข้อง

3

AWK , 4 ไบต์



/

ลองออนไลน์!

เนื่องจากAWKไม่ได้มีวิธีการที่จะทำความเห็นหลายคู่สายที่ต้องใช้เวลา 2 บรรทัดใหม่ก่อนและหลังจาก 1 /เพื่อป้องกันไม่ให้แสดงความคิดเห็นออกหรือเปลี่ยนนี้ใน regex e 1/กรัมเพิ่ม ข้อความที่พบบ่อยที่สุดคือ `บรรทัดใหม่หรือจุดสิ้นสุดที่ไม่คาดคิด

ด้วยรอยร้าวก่อนหน้า


2

Fortran, 14 ไบต์


end program
e

ไม่มีความคิดเห็นหลายบรรทัดหรือคำสั่ง preprocessor ใน Fortran


1
มีวิธีที่ดีในการทดสอบออนไลน์หรือไม่ นอกจากนี้เวอร์ชั่น / คอมไพเลอร์ของ Fortran
Robert Benson

2

JavaScript (Node.js)ขนาด9 8 ไบต์

`*/
\u`~

ลองออนไลน์!

ฉันคิดว่านี่น่าจะผิดกฎหมายพอสมควร

JS ก่อนหน้าพยายามในคำตอบอื่น ๆ

;*/\ยู)

โดย @Cows นักต้มตุ๋น

ในฐานะที่เป็นคำตอบ ES5 นี้ควรจะถูกต้อง แต่ใน ES6 ห่อรหัสด้วยคู่ของ backticks ทำลายนี้ ดังนั้นคำตอบของ ES6 ที่ถูกต้องจะต้องมี backticks

`
`* /}" `\ U!

โดย @iovoid

นี่เป็นรุ่นปรับปรุงที่เกี่ยวข้องกับ backticks อย่างไรก็ตามเดียว/หลังจากรหัสแบ่งนี้ (มันจะกลายเป็นแม่แบบตัวอักษรที่ถูกคูณด้วย regex ที่ไร้ประโยชน์ แต่ที่ถูกต้อง syntactically.) @Neil ทำข้อเสนอแนะว่าการเปลี่ยนไป! )ในทางทฤษฎีควรใช้งานได้เนื่องจากการเพิ่ม/ในตอนท้ายไม่สามารถใช้งานได้อีกต่อไป (เนื่องจาก regex ที่มีรูปแบบไม่ถูกต้อง)

การอธิบาย

`*/
\u`~

สิ่งนี้เป็นสิ่งผิดกฎหมายและยังปิดกั้นการเสนอราคาเดี่ยวและคู่ทั้งหมดเนื่องจากราคาไม่สามารถครอบคลุมข้ามบรรทัดโดยไม่มีเครื่องหมาย\ที่ท้ายบรรทัด

//`*/
\u`~

และ

/*`*/
\u`~

บล็อกความคิดเห็นโดยแนะนำ ลำดับการหลบหนีที่ผิดกฎหมาย

``*/
\u`~

บล็อก backtick เริ่มต้นด้วยการแนะนำ RegExp ที่ไม่สิ้นสุด

console.log`*/
\u`~

บล็อกตัวอักษรเทมเพลตที่ติดแท็กโดยแนะนำตัวดำเนินการที่คาดหวังระหว่างสอง backticks


2

Rockstar , 4 5 ไบต์

ข้ามออก 4 ยังคงเป็น 4 :(

)
"""

Rockstar เป็นภาษาที่พูดมาก ...
ในขณะที่"สามารถใช้ในการกำหนดสตริงเช่นPut "Hello" into myVarความรู้ของฉันไม่มีวิธีสำหรับ 3 คำพูดที่จะปรากฏอยู่นอกความคิดเห็นและ Paren ปิดมั่นใจว่าจะไม่เกิดขึ้นอย่างใดอย่างหนึ่ง (ความเห็นใน Rockstar จะอยู่ในวงเล็บเช่น นี้).

Rockstar ยังมีไวยากรณ์ตัวอักษรบทกวีโดยที่เครื่องหมายวรรคตอนจะถูกละเว้นดังนั้นการขึ้นบรรทัดใหม่ทำให้แน่ใจว่าการเสนอราคา 3 รายการเป็นการเริ่มต้นของบรรทัดรหัสซึ่งควรจะไม่ถูกต้องเสมอ


ถ้าอย่าง(()""")นั้นจะไม่เป็นใคร
ბიმო

@BMO คำสั่ง paren แรกเปิดความคิดเห็น paren ที่ 2 ไม่ได้ทำอะไรเพราะแสดงความคิดเห็น paren ที่ 3 ปิดความคิดเห็นจากนั้นคุณได้""")รับการแยกวิเคราะห์เป็นรหัสซึ่งไม่ถูกต้อง
Skidsdev

อืมความเห็นแบบซ้อนไม่ได้อยู่ในรายละเอียด ความคิดเห็นที่ดูเหมือนจะหมดกำลังใจอย่างไรก็ตาม แต่คุณคุมตัวอักษรของสตริงบทกวีซึ่งจะช่วยให้สตริงใด ๆ เพื่อให้มีผลบังคับใช้Goethe says )"""
ბიმო

@ จุดที่ดี BMO สามารถแก้ไขได้โดยการแทรกขึ้นบรรทัดใหม่ระหว่าง)และ"""
Skidsdev

2

Powershell, 10 8 12 14 13 14 16 ไบต์

ต้องขอบคุณ -2 by Mazzy เพื่อหาวิธีที่ดีกว่าในการทำลายมัน
+4 -1 bytes ขอบคุณ IsItGreyOrGray

$#>
'@';
"@";
@=

ฉันหวังว่างานนี้ 'และ"เพื่อป้องกันเครื่องหมายคำพูด#>เพื่อแยกความคิดเห็นบล็อกบรรทัดใหม่เพื่อหยุดความคิดเห็นบรรทัดเดียวทั้งคู่'@และ"@เพื่อจับรูปแบบของสตริงอื่นแล้วเริ่มอาร์เรย์ที่ไม่เหมาะสมเพื่อโยนข้อผิดพลาดทางไวยากรณ์

ตรรกะที่พวกเขาไม่สามารถใช้ทั้งชุดของคำพูดที่จะได้รับพวกเขาไม่สามารถปิดกั้นความคิดเห็นออกถ้า@"ใช้มันจะสร้างสตริงที่นี่ซึ่งไม่สามารถมีโทเค็นในภายหลังและถ้าพวกเขา ทิ้งไว้ตามลำพังมันจะพยายามสร้างอาเรย์ที่เสียหาย คำแถลงนี้ต้องการมีชีวิตที่หนักหนาสาหัสฉันค้นหาช่องโหว่ของเกราะได้มากขึ้นเรื่อย ๆ


1
หรือผู้คุ้มครอง +@=
mazzy

1
@IsItGreyOrGray AAAAAAAAAAAw ห่า
Veskah

2
ดูเหมือนว่าการเปลี่ยน #> เป็น $ #> จะทำให้แตกเป็น "ไม่เป็นที่รู้จักในชื่อของ cmdlet ... " มันอาจถูกกฎหมายอีกครั้ง แต่ฉันก็ไม่มีทาง ยัง :)
GreyOrGray

1
@IsItGreyOrGray Sonofagun ตอนนี้มีเกราะเซมิโคลอนไหม?
Veskah

1
ดี! ฉันไม่มีอะไร ทุกสิ่งที่ฉันพยายามล้มเหลว
GreyOrGray

2

Runic Enchantments ขนาด 3 ไบต์

หนึ่งในหลากหลายรูปแบบที่เป็นไปได้

ลองออนไลน์!

Runic ใช้ unicode รวมอักขระใน " Mปรับเปลี่ยนพฤติกรรมของC" (โดยที่Cคำสั่ง) ดังนั้นจึงไม่มีตัวดัดแปลงสองตัวที่ได้รับอนุญาตให้แก้ไขคำสั่งเดียวกันและ parser จะโยนข้อผิดพลาดหากพบเหตุการณ์ดังกล่าว

ในทำนองเดียวกันคำสั่งบางอย่างที่เปลี่ยนเส้นทาง IP ไม่สามารถแก้ไขได้ในทุกวิถีทางเนื่องจากการมีอยู่ของทิศทางการปรับเปลี่ยนอักขระตัวแก้ไข (และทั้งสองในเซลล์เดียวกันไม่มีเหตุผล)

ไม่มีวิธีที่จะหลบหนีหรือตามตัวอักษรสตริงเพื่อให้ถูกต้อง ลิงก์ Tio มี;ข้อผิดพลาด "ไม่ต้องปิด" ที่มีลำดับความสำคัญสูงกว่า


2

TI-Basic (83 + / 84 + / SE, 24500 ไบต์)

A

(24500 ครั้ง)

TI (-83 + / 84 + / SE) ขั้นพื้นฐานไม่ตรวจสอบไวยากรณ์เฉพาะในงบที่จะถึงดังนั้นแม้ 5000 งบในแถวที่สามารถข้ามกับEnd Returnในทางตรงกันข้ามสิ่งนี้ไม่สามารถพอดีกับ RAM ของ TI-83 + / 84 + / SE ดังนั้นจึงไม่มีโปรแกรมใดสามารถมีสตริงนี้ได้ เป็นคนหัวโบราณเล็กน้อยกับจำนวนตัวละครที่นี่

TI-83 ดั้งเดิมมี RAM 27,000 ไบต์ดังนั้นคุณจะต้องใช้ 27500 As ในกรณีนั้น

TI-Basic (89 / Ti / 92 + / V200, 3 ไบต์)

"

ขึ้นบรรทัดใหม่เสนอราคาขึ้นบรรทัดใหม่ ขึ้นบรรทัดใหม่ปิดความคิดเห็นใด ๆ (และไม่อนุญาตให้ฝังอักขระที่ผิดกฎหมายในสตริงเนื่องจากไม่อนุญาตให้มีค่าคงที่สตริงหลายบรรทัดของ AFAIK) บรรทัดใหม่อื่นไม่อนุญาตให้ปิดสตริงและเครื่องหมายคำพูดแสดงข้อผิดพลาดทางไวยากรณ์

คุณสามารถไปถึง 2 ไบต์ด้วย

±

โดยไม่มีการขึ้นบรรทัดใหม่ แต่ฉันไม่แน่ใจว่าสิ่งนี้นับว่า±ถูกต้องเพราะมีค่าคงที่ในสตริงเท่านั้น


เสร็จสิ้นขอบคุณ :)
bb94

2

ไป 6 ไบต์


*/```

พยายามที่จะถอดรหัสออนไลน์!

สำเนียงหลุมฝังศพ (`) ทำเครื่องหมายสตริงตัวอักษรดิบซึ่งภายในตัวละครทั้งหมดยกเว้น` รวมถึงการขึ้นบรรทัดใหม่และแบ็กสแลชจะถูกตีความอย่างแท้จริงเป็นส่วนหนึ่งของสตริง สามในแถวนั้นเป็นแกนกลาง: ตัวอักษรสตริงที่อยู่ติดกันนั้นไม่ถูกต้องและ `` ปิดสตริงเสมอ'ดังนั้นจึงไม่มีทางที่จะเข้าใจได้ ฉันต้องใช้อีก 3 ไบต์สำหรับการป้องกันการหลบเลี่ยงบรรทัดใหม่ดังนั้นเราจึงไม่สามารถอยู่ในความคิดเห็นบรรทัดเดียวหรือสตริงที่ยกมาตามปกติและ * / ดังนั้นเราจึงไม่สามารถอยู่ในความคิดเห็นแบบหลายบรรทัด


1

SILOS 4 ไบต์

ไซโลมีการแข่งขัน \ o /


x+

SILOS ทำงานบน interpreter / compiler สองตัว ก่อนที่จะดำเนินการ "คอมไพเลอร์" พยายามที่จะลดความซับซ้อนของแหล่งที่มาลงในอาร์เรย์ที่อธิบายถึง sourc แต่ละบรรทัดจะได้รับการปฏิบัติแยกต่างหาก x + a เป็นผู้ดำเนินการที่ได้รับมอบหมายซึ่งจะเพิ่ม ea ให้กับค่าของ x และเก็บไว้ใน x อย่างไรก็ตาม "คอมไพเลอร์" จะแตก ดังนั้นเราจึงใช้สายนี้และเพิ่มบรรทัดใหม่ก่อนและหลังตรวจสอบให้แน่ใจว่ามันอยู่ในบรรทัดของตัวเองและแบ่งคอมไพเลอร์

ลองออนไลน์!


ทำไมax+ข้อผิดพลาดไม่ออก?
Erik the Outgolfer

พฤติกรรมคอมไพเลอร์ที่ไม่ได้กำหนด @EriktheOutgolfer
Rohan Jhunjhunwala

1

AutoHotkey 5 ไบต์

`เป็นตัวละครที่หลบหนี คุณสามารถยกเว้น "เมื่อกำหนดให้ตัวแปรเท่านั้น

\ n * / ป้องกันไม่ให้มีการใส่ความคิดเห็นหรือมอบหมายให้กับตัวแปร


*/`"

1

JavaScript, 11 ตัวอักษร

`
`*/}'"`\u)

backticks ตรวจสอบให้แน่ใจว่าฆ่าสตริงเทมเพลตเครื่องหมายอัญประกาศบรรทัดใหม่จะไม่แสดงความคิดเห็นบรรทัดจุดสิ้นสุดของความคิดเห็นหลีกเลี่ยงความคิดเห็นที่ถูกบล็อกและ backtick สุดท้ายและหลบเลี่ยง (ด้วย! เพื่อหลีกเลี่ยงการต่อท้ายหมายเลข) พยายามเริ่มไม่ถูกต้อง เชือก

ลองออนไลน์!



คำตอบ ES5 ใช้)หลังจาก\uนั้นอาจจะทำงานที่นี่หรือ
Neil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.