Tìm một chuỗi bất hợp pháp


81

Thách thức là tìm ra một chuỗi các ký tự không thể xuất hiện trong bất kỳ chương trình pháp lý nào trong ngôn ngữ lập trình bạn chọn. Điều đó bao gồm các bình luận, chuỗi hoặc các phần "không thể thực thi" khác.

Thử thách

  • Chương trình của bạn có thể dành riêng cho một phiên bản cụ thể hoặc việc triển khai môi trường trình biên dịch / trình thông dịch / thời gian chạy ngôn ngữ của bạn. Nếu vậy, xin vui lòng chỉ định các chi tiết.
  • Chỉ cho phép tùy chọn trình biên dịch / trình thông dịch / thời gian chạy tiêu chuẩn. Bạn không thể chuyển một số cờ lạ cho trình biên dịch của mình để có kết quả cụ thể (ví dụ: chuyển cờ để chuyển cảnh báo thành lỗi).
  • Nếu ngôn ngữ lập trình của bạn yêu cầu mã hóa cụ thể (ví dụ UTF-8), chuỗi của bạn cũng phải được mã hóa chính xác (nghĩa là các chuỗi không thành công do lỗi giải mã ký tự không được phép).
  • Mỗi nhân vật trong bài nộp của bạn phải được chấp nhận trong một chương trình pháp lý; nghĩa là, bạn không thể chỉ sử dụng một ký tự luôn bị từ chối.
  • Trình biên dịch / trình thông dịch / thời gian chạy phải đưa ra lỗi khi được cung cấp bất kỳ mã nguồn nào chứa chuỗi của bạn dưới dạng chuỗi con. Lỗi không nhất thiết phải giống nhau trên các chương trình - một chuỗi nhúng chuỗi của bạn có thể gây ra lỗi cú pháp, trong khi một lỗi khác có thể gây ra lỗi thời gian chạy.

Chấm điểm

  • Chuỗi bất hợp pháp ngắn nhất cho mỗi ngôn ngữ chiến thắng.
  • Bạn nên giải thích tại sao chuỗi của bạn là bất hợp pháp (tại sao nó không thể xuất hiện ở bất kỳ đâu trong chương trình hợp pháp).
  • Tranh chấp giải pháp không chính xác trong các ý kiến. Cụ thể hơn, bạn nên cung cấp một liên kết đến TIO hoặc tương đương thể hiện một chương trình pháp lý (tức là một chương trình không tạo ra bất kỳ lỗi nào) có chứa chuỗi con được đề xuất.
  • Một số ngôn ngữ (ví dụ Bash, Batch, Perl) cho phép dữ liệu nhị phân tùy ý được thêm vào chương trình mà không ảnh hưởng đến tính hợp lệ (ví dụ: sử dụng __DATA__trong Perl). Cho các ngôn ngữ như vậy, bạn có thể gửi một giải pháp mà có thể xuất hiện chỉ trong một phần dấu như vậy. Hãy chắc chắn để ghi chú về điều đó trong câu trả lời của bạn. (Định nghĩa của "phần đuôi" này phụ thuộc vào ngôn ngữ, nhưng nói chung có nghĩa là bất kỳ văn bản nào sau khi trình phân tích cú pháp đã hoàn toàn ngừng đọc tập lệnh).

Thí dụ

Trong Python, tôi có thể gửi

x
"""
'''

nhưng điều này có thể được nhúng vào chương trình lớn hơn

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

vì vậy nó không được chấp nhận


2
Một ví dụ ngược có thể dựa vào đầu vào từ STDIN không?
Zacharý

5
Điều này sẽ làm cho một CnR tốt?
Máy

2
Bây giờ tôi đã đoán quá muộn, nhưng có vẻ như đây có thể là một thử thách của cảnh sát và tên cướp. Có rất nhiều kỹ năng rõ ràng trong các nỗ lực để tạo ra các chương trình hợp lệ, cũng như đưa ra các chuỗi ở vị trí đầu tiên.
dùng2390246

4
Tôi xin chia buồn với những nỗ lực của Perl. :)
Kaz

2
Tôi khá chắc chắn rằng Haskell không biết chữ, hoàn toàn không thể biết được, nhờ những bình luận lồng nhau.
dfeuer

Câu trả lời:


57

Thay đổi , 2 byte




Đó là hai nguồn cấp dữ liệu. Thay đổi hợp lệ phải luôn tạo thành một hình vuông hoàn hảo của các ký tự ASCII có thể in được, vì vậy nó không thể chứa hai nguồn cấp dữ liệu liên tiếp.

Lỗi luôn là lỗi trình phân tích cú pháp và luôn giống nhau:

This shape is unpleasant.

kèm theo mã thoát 1 .

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


Điều này cũng hoạt động với 2Col . Hãy thử trực tuyến! . Nhưng lý do điều này phá vỡ trong 2Col là vì mỗi dòng cần bao gồm chính xác 2 ký tự, nhưng dòng trống sẽ phá vỡ điều đó.
Kritixi Lithos

2
+1 vì đây tự động là người chiến thắng, vì các giải pháp 1 byte không được phép vì "bạn không thể chỉ sử dụng một ký tự luôn bị từ chối".
Zacharý

1
@Cowsquack tfw Tôi quên mất ngôn ngữ của chính mình
Skidsdev

1
@Skidsdev tfw Tôi lại quên ngôn ngữ của chính mình và quên tôi quên ngôn ngữ của chính mình
Skidsdev

@ Zacharý Còn các giải pháp 0 byte thì sao?
PyRulez

32

Java, 4 byte

;\u;

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

Đây là một chuỗi thoát Unicode không hợp lệ và sẽ gây ra lỗi trong trình biên dịch.

error: illegal unicode escape

Không hoạt động - người ta có thể có một chuỗi theo nghĩa đen "\\u;".
frageum

@feersum Đã sửa với giá một byte
Kritixi Lithos

21
@TheLethalCoder: Java tiền xử lý mã nguồn để thay đổi \uXXXXthoát trước khi làm bất cứ điều gì khác, vì vậy, điều này sẽ hoạt động ngay cả trong các bình
luận.za

3
Tôi nghĩ rằng đây là câu trả lời Java ngắn nhất trong lịch sử của trang này vẫn còn ..
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn Trên thực tế, có câu trả lời Java 0 byte này (không còn phù hợp nữa trong meta hiện tại, vì nó xuất ra STDERR thay vì STDOUT). Mặc dù cả hai đều khá tuyệt vời và thông minh. :)
Kevin Cruijssen 20/03/18

25

COBOL (GNU) , 8 byte


THEGAME

Đầu tiên, một nguồn cấp dữ liệu để ngăn bạn đặt từ của tôi vào một dòng nhận xét.

Sau đó, trong lịch sử, các chương trình COBOL được in trên các bảng mã, trình biên dịch phụ thuộc rất nhiều vào các dòng giới hạn 80 ký tự, không có nhận xét đa dòng và 6 ký tự đầu tiên là các nhận xét (thường được sử dụng làm số dòng có thể chỉnh sửa), bạn có thể đặt hầu hết mọi thứ ở đó , AFAIK. Tôi đã chọn THEGAMở đầu dòng tiếp theo.

Sau đó, biểu tượng thứ 7 trong bất kỳ dòng nào chỉ chấp nhận một danh sách các ký tự rất hạn chế: Space (không có hiệu lực), Asterisk (bình luận phần còn lại của dòng), Hyphen, Slash, có thể có những cái khác, nhưng chắc chắn là không E.

Ví dụ, lỗi do GnuCobol đưa ra là:

error: invalid indicator 'E' at column 7

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

Ngoài ra, bạn vừa thua trò chơi.


30
Also, you just lost the game.Tôi gần như bị hạ bệ
Stephen

24

JavaScript, 7 byte


;*/\u)

Lưu ý các dòng mới hàng đầu.

  • \u) là một chuỗi thoát Unicode không hợp lệ và đây là lý do tại sao chuỗi này không hợp lệ
  • Thêm một //từ đầu sẽ vẫn không hoạt động vì dòng mới hàng đầu, khiến dòng thứ hai không bị lỗi
  • Việc thêm một chuỗi /*sẽ không bỏ sót chuỗi hoàn toàn vì việc đóng hoàn thành chuỗi */đó, để lại \u)tiếp xúc
  • Như @tsh đã nêu, dòng dưới cùng có thể được biến thành regex bằng cách có /chuỗi sau, do đó, )ở phía trước chuỗi \u, chúng tôi có thể đảm bảo rằng regex nghĩa đen sẽ luôn không hợp lệ
  • Như tuyên bố của @asgallant, người ta có thể làm 1||1(string)/để tránh phải đánh giá regex. Dấu chấm phẩy ở đầu dòng thứ hai ngăn điều đó xảy ra bằng cách chấm dứt biểu thức 1||1trước khi nó chạm vào dòng thứ hai, do đó buộc một SyntaxError với ;*.

Thử nó!


2
/* */\u0045 = 3có vẻ như mã JavaScript hợp lệ.
tsh

2
3 */\u;/vẫn còn hợp lệ.
tsh

3
Điều thú vị cần lưu ý là kể từ ES2018 (sẽ không chính thức cho đến cuối năm nay), bạn chỉ có thể gói toàn bộ mọi thứ trong backticks do điều này . Bạn có thể có thể khắc phục điều này mặc dù chỉ bằng cách chèn một backtick sau /(không phải là bạn cần sửa nó). (Ngoài ra, việc ;không phân tích cú pháp của regex xấu, nó buộc SyntaxError với *.)
ETHproductions 20/07/17

1
@Leushenko Nhưng điều này không có tác dụng #if 0như đã thấy ở đây: Hãy thử trực tuyến!
Kritixi Lithos

3
Trong các phiên bản JS mới hơn, String.raw với chuỗi mẫu có thể làm cho điều này không bị phá vỡ, vì thoát không hợp lệ không thành công. Sẽ là: String.raw`code here`
iovoid 14/2/18

15

Python, 10 byte (không phải cpython)


?"""?'''?

Lưu ý các dòng mới hàng đầu. Không thể nhận xét do dòng mới và không có kết hợp chuỗi ba trích dẫn nào hoạt động nếu tôi nghĩ về điều này một cách chính xác.

@feersum trong các bình luận dường như đã phá vỡ hoàn toàn bất kỳ chương trình cpython nào trên Windows theo như tôi có thể nói bằng cách thêm ký tự 0x1A vào đầu tệp. Có vẻ như có lẽ (?) Điều này là do cách xử lý của nhân vật này bởi hệ điều hành, rõ ràng là được dịch sang EOF khi nó đi qua stdin vì một số tiêu chuẩn DOS kế thừa.

Theo một nghĩa rất thực thì đây không phải là vấn đề với python mà là với hệ điều hành. Nếu bạn tạo một tập lệnh python đọc tệp và sử dụng nội dung compiletrên nó, nó sẽ mang lại hành vi mong đợi hơn khi ném lỗi cú pháp. Pypy (có lẽ chỉ làm điều này trong nội bộ) cũng đưa ra một lỗi.

Biên tập:

Do sự siêng năng của @ frageum trong việc tìm ra những cách tối nghĩa để phá vỡ trình thông dịch Python, câu trả lời này hoàn toàn vô hiệu đối với bất kỳ môi trường cpython điển hình nào như tôi có thể nói! (Python 2 và 3 cho cả Windows và Linux) Tôi vẫn tin rằng các vết nứt này sẽ không hoạt động đối với Pypy trên bất kỳ nền tảng nào (cách triển khai Python khác mà tôi đã thử nghiệm).


1
@officialaimm xem xét"""?'''"""
KSab

3
Tôi đã tạo một chương trình với chuỗi con này chạy trên máy của tôi. Tuy nhiên, tôi nghĩ rằng nó không chạy trên nhiều phiên dịch / nền tảng / phiên bản. Bạn có thể chỉ định phiên bản nào của trình thông dịch Python và HĐH mà câu trả lời này đang nhắm mục tiêu không?
frageum

1
Python 3 trên Windows 7 xảy ra chính xác là nơi crack của tôi hoạt động. Pastebin của chương trình mã hóa base64
frageum

1
Tôi có thể crack cái này là tốt. Đơn giản chỉ cần đặt một ký tự 0x1A ở đầu tệp và tất cả phần còn lại của nó bị bỏ qua (điều này thực sự cũng hoạt động với Python 3).
frageum

1
Tôi biết điều này thực sự cũ, nhưng sau khi làm việc với một số người trong Python Discord, chúng tôi đã tìm thấy vết nứt này , mặc dù tôi không biết nếu thay đổi mã hóa có thể được coi là gian lận
EdgyNerd

14

C (tiếng kêu) , 16 byte

 */
#else
#else

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

*/đóng bất kỳ /*bình luận nào và không gian hàng đầu đảm bảo chúng tôi không chỉ bắt đầu một bình luận. Dòng mới đóng bất kỳ //bình luận và phá vỡ bất kỳ chuỗi ký tự. Sau đó, chúng tôi gây ra một lỗi #else without #ifhoặc #else after #elsebất kể #if 0chúng tôi có thể ở bên trong bao nhiêu giây).



2
Ngoài ra, vì chuỗi thô C ++ 11 dường như hoạt động, một giải pháp là không thể với gcc.
frageum

@feersum Huh, TIL rằng GCC chấp nhận những người trong mã C. Tôi có thể chỉ định -std=c99, nhưng hãy thử chuyển sang tiếng kêu.
Anders Kaseorg

3
Tôi thực sự ngạc nhiên khi gcc chấp nhận chuỗi thô C ++ 11. Chỉ định phiên bản trình biên dịch hoặc triển khai là hoàn toàn OK, vì vậy nếu nó bất hợp pháp trong Clang, thì đó là trò chơi công bằng.
nneonneo

1
@ l4m2 Tôi không thể phân tích câu hỏi của bạn (họ là ai và bạn có ý gì nữa?), nhưng lưu ý rằng một chuỗi ký tự thô C ++ hỗ trợ một dấu phân cách tùy chỉnh: R"foobar(...)foobar"và chỉ có một paren đúng theo dấu phân cách phù hợp và một trích dẫn sẽ đóng nó.
Anders Kaseorg

11

Bình thường, 6 byte

¡¡$¡"¡

¡là một ký tự chưa được thực hiện, có nghĩa là nếu trình phân tích cú pháp Pyth từng đánh giá nó, nó sẽ báo lỗi với PythPudeError. Mã đảm bảo điều này sẽ xảy ra trên một trong các ¡s.

Có ba cách một byte có thể được trình bày trong chương trình Pyth và không được phân tích cú pháp: Trong một chuỗi ký tự ( "hoặc .", được phân tích cú pháp tương đương), trong một chữ Python ( $) và ngay sau a \.

Mã này ngăn không \cho nó đánh giá mà không có lỗi, bởi vì điều đó chỉ ảnh hưởng đến byte ngay sau đó và các ¡lỗi thứ hai .

$nhúng mã trong $s vào mã Python được biên dịch trực tiếp. Tôi không đưa ra giả định về những gì có thể xảy ra ở đó.

Nếu chương trình đạt đến mã này trong một $ngữ cảnh, nó sẽ kết thúc tại $¡ngay sau khi nó sẽ gây ra lỗi trình phân tích cú pháp. Các chữ Python của Pyth luôn kết thúc ở phần tiếp theo $, bất kể mã Python có thể làm gì.

Nếu chương trình bắt đầu trong một "ngữ cảnh, "sẽ làm cho chuỗi kết thúc và cuối cùng ¡sẽ gây ra lỗi trình phân tích cú pháp.


11

Ada - 2 byte

Tôi nghĩ rằng điều này sẽ làm việc:


_

Đó là dòng mới-gạch dưới. Dòng mới chấm dứt ý kiến ​​và không được phép trong một chuỗi. Một dấu gạch dưới không thể theo khoảng trắng; nó chỉ được phép sử dụng sau các chữ cái và số, nhưng việc giới thiệu Unicode khiến mọi thứ trở nên phức tạp.


2
Chào mừng đến với trang web! :)
DJMcMayhem

9

mã máy x86 32 bit, 11 byte (và 64 bit bằng chứng trong tương lai)

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

Đây là times 9 nop/ ud2. Về cơ bản, nó là một NOP kéo dài , do đó, nó vẫn chạy từ 0 trở lên nopvà sau đó ud2đưa ra một ngoại lệ, bất kể có bao nhiêu 0x90byte được tiêu thụ dưới dạng toán hạng cho một mã op trước đó. Các lệnh đơn byte khác (như times 9 xchg eax, ecx) cũng sẽ hoạt động.

Mã máy x86 64 bit, 10 byte (CPU hiện tại)

Có một số hướng dẫn bất hợp pháp 1 byte ở chế độ 64 bit, cho đến khi một số phần mở rộng của ISA trong tương lai sử dụng lại chúng dưới dạng tiền tố hoặc các phần của opcode nhiều byte ở chế độ 64 bit, tách biệt với ý nghĩa của chúng ở chế độ 32 bit. 0x0epush csở chế độ 32-bit, nhưng bất hợp pháp trên các CPU hiện nay (thử nghiệm trên Intel Skylake) trong 64-bit.

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

Giải thích quy tắc cho mã máy thực thi :

  • Các byte không thể được nhảy qua (như hạn chế "không được phân tích cú pháp"), vì CPU không đưa ra ngoại lệ cho đến khi chúng thực sự cố gắng giải mã / thực thi (không theo suy đoán).

  • Các phương tiện bất hợp pháp luôn làm tăng một ngoại lệ, ví dụ như một ngoại lệ hướng dẫn bất hợp pháp. (Các chương trình thực sự có thể bắt được điều đó với một trình xử lý ngoại lệ trên kim loại trần hoặc cài đặt trình xử lý tín hiệu HĐH, nhưng tôi nghĩ điều này nắm bắt được tinh thần của thách thức.)


Nó hoạt động vì một chuỗi byte ngắn kết thúc bằng ud2có thể xuất hiện dưới dạng một số 32 và / hoặc một phần của chế độ địa chỉ cho một lệnh khác hoặc chia thành một cặp hướng dẫn . Dễ dàng nhất để suy nghĩ về điều này theo những gì bạn có thể đặt trước chuỗi để "tiêu thụ" các byte như một phần của hướng dẫn và để lại thứ gì đó không bị lỗi.

Tôi nghĩ rằng một lệnh có thể tiêu thụ tối đa 9 byte nội dung tùy ý: byte SIB, dist32 và im32. tức là 2 byte đầu tiên của hướng dẫn này có thể tiêu thụ 8 NOP và ud2, nhưng không phải là 9.

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

Không thể đánh bại 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    

Chế độ 64 bit:

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

Nhưng các byte cho 8 NOP + ud2 (hoặc times 9 db 0x0e) có thể xuất hiện như một phần của các nội dung khác:

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

Các quy tắc ở đây không thực sự đủ rõ ràng để tôi xem xét đăng câu trả lời mã máy / mã. Ví dụ, tại sao bạn không thể làm gì ud2? Có vẻ như bạn đang nói rằng bạn diễn giải các quy tắc là cấm nhảy qua các byte, vậy ud2nó sẽ tự hoạt động tốt chứ? Ồ, tôi đoán bạn đang nói rằng vấn đề ud2có thể xuất hiện dưới dạng tiền tố của một hướng dẫn hợp lệ? Phần thứ hai của câu trả lời này là một chút khó khăn cho tôi để hiểu.
Cody Grey

@CodyGray: Phải, 2 byte mã hóa ud2có thể xuất hiện trong imm32bất kỳ lệnh nào. Tôi đã suy nghĩ về điều này về các byte bạn có thể đặt trước một chuỗi "tiêu thụ" 0f 0bnhư một phần của một hướng dẫn trước đó thay vì giải mã như ud2. Tôi không hoàn toàn hài lòng với cách tôi kết thúc việc trình bày nó, nhưng tôi muốn minh họa tại sao chỉ 8 nopgiây là không đủ, và những gì đã xảy ra với 9 nopgiây + ud2.
Peter Cordes

@CodyGray: Một chương trình nguồn asm sẽ là một câu trả lời hoàn toàn khác. Điều đó sẽ phải lỗi trình phân tích cú pháp được trình biên dịch sử dụng, không tạo ra mã máy bị lỗi. Vì vậy, một cái gì đó như %else/ %elsecó thể hoạt động để đánh bại %if 0, thường có thể bảo vệ bất kỳ văn bản không hợp lệ nào khỏi bị phân tích cú pháp. (ý tưởng từ câu trả lời CPP)
Peter Cordes

Đừng khá hài lòng. Giải pháp của bạn có thể chỉ trong .data. (mặc dù điều đó là không thể)
l4m2

@ l4m2: Để làm cho câu hỏi có thể trả lời / thú vị, tôi đã phải giới hạn nó ở mã được thực thi (và không nhảy qua). Xem các gạch đầu dòng giải thích quy tắc trong câu trả lời của tôi. Điều đó cũng sẽ loại trừ dữ liệu tĩnh, tất nhiên. Bởi vì sau đó nó hoàn toàn không phải là mã máy, nó chỉ là dữ liệu. Câu hỏi này đòi hỏi sự thích ứng nhiều hơn hầu hết cho câu trả lời mã máy có ý nghĩa, bởi vì không có giai đoạn biên dịch / lắp ráp mà bạn có thể lỗi trình phân tích cú pháp, chúng ta chỉ nói về byte đã có trong bộ nhớ.
Peter Cordes

7

C #, 16 byte


*/"
#endif<#@#>

Hoạt động vì:

  • // bình luận sẽ không hoạt động vì dòng mới
  • /* bình luận sẽ không hoạt động vì */
  • Bạn không thể có hằng số trong mã một mình
  • Thêm #if falsevào đầu sẽ không hoạt động vì#endif
  • Việc "đóng bất kỳ chuỗi ký tự
  • Đây <#@#>là một lệnh không tên nên không thành công cho các mẫu T4.
  • Các dòng mới đánh lừa nó khi /bắt đầu sẽ không lừa*/

Mỗi biến thể không thành công với một lỗi biên dịch.


1
Thật kỳ lạ khi bạn quyết định đưa các mẫu T4 vào mã của mình. Không phải T4 được coi là một ngôn ngữ riêng biệt?
Arturo Torres Sánchez

1
@ ArturoTorresSánchez Tôi không biết tôi chưa bao giờ nghe nói về họ. Ai đó đã nhận xét điều này không hoạt động khi bạn bao gồm các mẫu T4 vì vậy tôi đã thêm bản sửa lỗi.
TheLethalCoder


5

Biết chữ Haskell , 15 byte

Sửa chữa một nỗ lực bị xóa bởi nimi.


\end{code}
5
>

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

Nỗ lực ban đầu của nimi là hai dòng cuối cùng, dựa trên Literate Haskell không cho phép >mã biết chữ theo kiểu nằm trên một dòng lân cận với dòng nhận xét biết chữ ( 5ở đây). Nó thất bại bởi vì nó có thể được nhúng trong một nhận xét theo kiểu mã hóa thay thế ("LaTeX"):

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

Tuy nhiên, \begin{code}phong cách của Literate Haskell không lồng nhau, bản thân nó cũng không phải trong các {- -}bình luận đa dòng, vì vậy bằng cách đặt một dòng \end{code}ngay trước dòng với 5, cách giải quyết đó thất bại, và tôi không thấy một cái khác.


4

Pascal miễn phí, 18 byte


*)}{$else}{$else}

Đầu tiên đóng tất cả các ý kiến ​​có thể, sau đó xử lý biên dịch có điều kiện.

Hãy bình luận ở đây nếu tôi quên một cái gì đó.


3
@ user902383 Ví dụ của bạn có chứa dòng mới hàng đầu của đoạn trích của anh ấy không?
Brian J

@BrianJ không, tôi nghĩ đó chỉ là vấn đề định dạng, xấu của tôi
dùng902383

Tôi không nghĩ nó có thể trong Pascal miễn phí. Chỉ cần đặt chúng sau begin end..
jimmy23013

@ jimmy23013 nhưng có vẻ như các mã sau khi end.trở thành hợp lệ được cho phép bởi câu hỏi.
tsh

4

Hàng hóa 64 cơ bản, 2 byte


B

(đó là một dòng mới theo sau chữ "B").

Bất kỳ dòng nào trong chương trình Commodore 64 phải bắt đầu bằng số dòng hoặc từ khóa BASIC và các chương trình được lưu trữ chỉ cho phép số dòng. Không có từ khóa bắt đầu bằng "B" (hoặc "H", "J", "K", "Q", "X", "Y" hoặc "Z").


Nếu tôi nối thêm =0thì đây chỉ là một tuyên bố chuyển nhượng ...
Neil

1
@Neil, đó sẽ là một lệnh chế độ tức thời hợp lệ, nhưng không phải là một chương trình hợp lệ.
Đánh dấu

4

Brain-Hack (một biến thể của Brain-Flak ), 3 2 byte

Cảm ơn Wheat Wizard đã chỉ ra rằng Brain-Hack không hỗ trợ bình luận, tiết kiệm cho tôi một byte.

(}

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


Làm thế nào để bạn nhận xét trong Brain-Flak? Tôi không biết cách nào để làm những việc đó.
Erik các Outgolfer

@EriktheOutgolfer # TIO
Riley

Huh hành vi không có giấy tờ.
Erik the Outgolfer

@EriktheOutgolfer Tôi luôn cho rằng chúng được ghi lại ở đâu đó. Tôi sẽ xem xét thêm chúng.
Riley

Bạn không cần dòng mới trong BrainHack hoặc Craneflak, Rain-Flak là một trong ba phiên bản có dòng nhận xét. Mặc dù Craneflak phân tích cú pháp nhanh chóng để không thể giải quyết vấn đề này trong Craneflak, bất kỳ giải pháp nào cũng có thể bị đánh bại bằng cách trả trước (()){()}.
Thuật sĩ lúa mì


3

VBA, 2 byte

Một dòng cấp theo sau là dấu gạch dưới - các _chức năng như ký tự tiếp tục dòng trong VBA và vì không có gì trong dòng trực tiếp ở bên trái hoặc bên trên dòng tiếp tục, cùng với việc thiếu các bình luận đa dòng của VBA có nghĩa là điều này sẽ luôn ném biên dịch lỗi thời gianCompile Error: Invalid character


_

Bạn phụ thuộc vào mẫu của bạn bắt đầu trên một dòng mới ... vì vậy, hãy thêm một dòng mới.
Ded repeatator

@Ded repeatator nó đã có một dòng mới, - không quan trọng chuyện gì xảy ra _, chỉ có điều không có dòng hợp lệ ở bên trái hoặc phía trên nó
Taylor Scott

Điều gì nếu nó được nhúng như thế này : myfunction( \n_ )?
Ded repeatator

@Ded repeatator, ký tự tiếp tục dòng phải nằm trên cùng một dòng khi nó đang tiếp tục tức là Public Function Foo( ByVal bar as Integer, _ (dòng mới) bas as long) as double- vì vậy, nó sẽ dẫn đến lỗi nếu bạn gọi hàm bạn đã mô tả
Taylor Scott

Ok, trong trường hợp đó nó giống như myfunction( _ \n_ ). Xin lỗi vì sự nhầm lẫn. Nói cách khác, bạn nên sử dụng hai dòng mới.
Ded repeatator

3

SmileBASIC, 2 byte


!

Không có gì tiếp tục đi qua cuối dòng, vì vậy tất cả những gì bạn cần là ngắt dòng theo sau là thứ không thể là bắt đầu của một tuyên bố. !là toán tử không logic, nhưng bạn không được phép bỏ qua kết quả của một biểu thức, do đó, ngay cả những thứ như thế !10sẽ không hợp lệ ( X=!10tất nhiên là trong khi hoạt động)

Những thứ tương tự sẽ hoạt động trong bất kỳ ngôn ngữ nào, nơi mọi thứ kết thúc ở cuối dòng, miễn là nó phân tích mã trước khi thực thi nó.

Có rất nhiều ký tự thay thế có thể được sử dụng ở đây, vì vậy tôi nghĩ sẽ thú vị hơn khi liệt kê những ký tự mà COULD hợp lệ.

@là sự khởi đầu của một nhãn, ví dụ , @DATA; (có thể là một phần của một biểu thức (X)=1được cho phép vì một số lý do; bất kỳ chữ cái hoặc _có thể là một tên biến X=1, gọi hàm LOCATE 10,2hoặc từ khóa WHILE 1; 'là một bình luận; và ?là viết tắt của PRINT.


ồ, vì một số lý do khi tôi chỉnh sửa bài đăng, nó đã bị trùng lặp ...
12Me21

3

INTERCAL , 12 byte

DOTRYAGAINDO

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

Cách tiếp cận của INTERCAL đối với các lỗi cú pháp là một chút đặc biệt. Về cơ bản, một tuyên bố không hợp lệ sẽ không thực sự có lỗi trừ khi chương trình cố gắng thực thi nó. Trong thực tế, cú pháp thành ngữ cho các bình luận là để bắt đầu chúng PLEASE NOTE, mà thực sự chỉ bắt đầu một câu lệnh, tuyên bố rằng nó không được thực thi, và sau đó bắt đầu nó bằng chữ cái E. Nếu mã của bạn có DODOở giữa mã, bạn có thể trả trước DOABSTAINFROM(1)(1)và giải quyết bất kỳ tuyên bố hợp lệ nào cho đến cuối và bạn sẽ ổn, nếu DODODObạn chỉ có thể uốn cong thực thi xung quanh nó (1)DON'TDODODOCOMEFROM(1). Mặc dù INTERCAL thiếu cú ​​pháp chuỗi ký tự để thoát chúng, nhưng không có cách nào sử dụng lỗi cú pháp để tạo một chuỗi bất hợp pháp, thậm chí làm cạn kiệt mọi số dòng có thể với(1)DO(2)DO...(65535)DODODO, vì dường như rất nhiều khả năng có các số dòng trùng lặp khi COME FROMlàm việc với bất kỳ số nào trong số chúng.

Để tạo một chuỗi bất hợp pháp, chúng tôi thực sự cần phải sử dụng một tuyên bố hoàn toàn hợp lệ : TRY AGAIN. Ngay cả khi nó không được thực thi, nó hoàn toàn phải là câu lệnh cuối cùng trong một chương trình nếu nó hoàn toàn nằm trong chương trình. Theo tôi biết, 12 byte là chuỗi ngắn nhất bất hợp pháp có thể sử dụng TRY AGAIN, bởi vì nó cần đảm bảo rằng có một câu lệnh sau nó (được thực thi hay không) vì vậy DOTRYAGAINchỉ là mã bình thường và nó cần đảm bảo rằng toàn bộ câu lệnh thực sự là vậy TRY AGAIN, vì vậy TRYAGAINDOkhông hoạt động vì nó có thể dễ dàng bị biến thành một lỗi cú pháp thông thường bị bỏ qua : DON'TRYAGAINDOGIVEUP, hoặc PLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK. Không có vấn đề gì bạn đặt ở hai bên DOTRYAGAINDO, bạn sẽ lỗi, với một trong hai ICL993I I GAVE UP LONG AGO, ICL079I PROGRAMMER IS INSUFFICIENTLY POLITEhoặc ICL099I PROGRAMMER IS OVERLY POLITE.


Có thể có một vài lỗi thời gian biên dịch khác có thể kích hoạt trước đó ICL993I I GAVE UP LONG AGO.
Chuỗi không liên quan

Nếu, trong khi sử dụng mọi nhãn dòng, bạn cũng như COME FROMmọi nhãn dòng, có thể hơi khó khăn để chuyển hướng dòng điều khiển xung quanh khối, nhưng không có gì ngăn cản bạn cả GIVING UP!
Chuỗi không liên quan

3

AWK , 4 byte



/

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

AWKkhông có phương pháp để thực hiện nhận xét nhiều dòng, cần 2 dòng mới trước và 1 sau /để ngăn bình luận hoặc biến điều này thành biểu thức chính quy, ví dụ: thêm 1/. Thông báo phổ biến nhất là `dòng mới bất ngờ hoặc kết thúc chuỗi.

Với vết nứt trước


2

Fortran, 14 byte


end program
e

Không có bình luận đa dòng hoặc chỉ thị tiền xử lý trong Fortran.


1
Có một cách tốt để kiểm tra trực tuyến này? Ngoài ra, phiên bản / trình biên dịch nào của Fortran?
Robert Benson

2

JavaScript (Node.js) , 9 8 byte

`*/
\u`~

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

Tôi nghĩ rằng điều này là đủ bất hợp pháp.

Các lần thử trước của JS trong các câu trả lời khác

; * / \ u)

Bởi @ Quách quạc

Như một câu trả lời ES5, điều này sẽ hợp lệ, nhưng trong ES6 gói mã bằng một cặp backticks phá hỏng điều này. Kết quả là các câu trả lời ES6 hợp lệ phải liên quan đến backticks.

`
`* /} '" `\ u!

Bởi @ visualoid

Đây là một phiên bản cải tiến liên quan đến backticks. Tuy nhiên, một lần duy nhất /sau khi mã phá vỡ điều này (Nó trở thành một mẫu chữ được nhân với một biểu thức chính quy, vô dụng nhưng có giá trị về mặt cú pháp.) @Neil đã đưa ra một đề nghị thay đổi !thành ). Điều này về mặt lý thuyết sẽ hoạt động vì việc thêm /vào cuối không còn hoạt động nữa (do regex không đúng định dạng.)

Giải trình

`*/
\u`~

Điều này tự nó là bất hợp pháp và cũng chặn tất cả các trích dẫn đơn và kép vì các trích dẫn đó không thể trải dài trên các dòng mà không có \ở cuối dòng

//`*/
\u`~

/*`*/
\u`~

Chặn bình luận bằng cách giới thiệu các chuỗi thoát bất hợp pháp

``*/
\u`~

Chặn backtick ban đầu bằng cách giới thiệu RegExp không kết thúc bằng chữ

console.log`*/
\u`~

Chặn các ký tự mẫu được gắn thẻ bằng cách giới thiệu một toán tử dự kiến ​​giữa hai backticks


2

Rockstar , 4 5 byte

Vượt qua 4 vẫn là 4 :(

)
"""

Rockstar là một ngôn ngữ rất ...
Mặc dù "có thể được sử dụng để xác định một chuỗi, chẳng hạn như Put "Hello" into myVar, theo hiểu biết của tôi, không có cách nào để 3 trích dẫn xuất hiện bên ngoài một nhận xét và paren chặt chẽ đảm bảo rằng điều đó sẽ không xảy ra (Nhận xét trong Rockstar được đặt trong ngoặc đơn, như điều này).

Rockstar cũng có một cú pháp theo nghĩa đen đầy thi vị, trong đó dấu chấm câu bị bỏ qua, vì vậy dòng mới đảm bảo rằng 3 dấu ngoặc kép là bắt đầu của một dòng mã, luôn luôn không hợp lệ


Thế còn (()"""), đó không phải là một no-op?
ბიმო

@BMO paren đầu tiên mở một bình luận, paren thứ 2 không làm gì cả vì nó đã bình luận, paren thứ 3 đóng bình luận, sau đó bạn đã """)được phân tích cú pháp dưới dạng mã, không hợp lệ
Skidsdev 22/11/18

Hmm, bình luận lồng nhau không có trong thông số kỹ thuật. Bình luận dường như được khuyến khích dù sao đi nữa. Nhưng bạn giám sát các chuỗi ký tự thơ cho phép bất kỳ chuỗi nào, vì vậy Goethe says )"""là hợp lệ .
ბიმო

@BMO điểm tốt, có thể được khắc phục bằng cách chèn một dòng mới giữa )"""
Skidsdev

2

Powershell, 10 8 12 14 13 14 16 byte

-2 byte nhờ Mazzy tìm ra cách tốt hơn để phá vỡ nó
+4 -1 byte nhờ vào IsItGreyOrGray

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

Tôi mong cái này sẽ thành công. '"để bảo vệ chống lại dấu ngoặc kép, #>để phá vỡ nhận xét khối, các dòng mới để dừng nhận xét một dòng, cả hai '@"@để bắt một kiểu chuỗi khác, sau đó bắt đầu một mảng không chính xác để đưa ra lỗi cú pháp.

Logic là họ không thể sử dụng một trong hai dấu ngoặc kép để tham gia, họ không thể chặn nhận xét đó, Nếu @"được sử dụng, nó sẽ tạo ra một chuỗi ở đây không thể có mã thông báo sau đó và nếu họ để nó một mình, nó sẽ cố gắng tạo ra một mảng bị hỏng. Tuyên bố này muốn sống thật chăm chỉ, tôi tiếp tục tìm thấy nhiều lỗ hổng hơn trong bộ giáp.


1
Hoặc người bảo vệ +@=
mazzy

1
@IsItGreyOrGray AAAAAAAAAAAw quái.
Veskah

2
Có vẻ như việc thay đổi #> thành $ #> sẽ phá vỡ nó thành "không được công nhận là tên của một lệnh ghép ngắn ..." Nó có thể được làm lại hợp pháp bằng cách nào đó, nhưng tôi không có cách nào. Chưa. :)
GreyOrGray

1
@IsItGreyOrGray Sonofagun. Bây giờ có tính năng áo giáp bán đại tràng?
Veskah

1
Đẹp! Tôi không có gì cả. Mọi thứ tôi đã thử đều thất bại.
GreyOrGray

2

Bùa mê, 3 byte

Một trong nhiều biến thể có thể.

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

Runic sử dụng các ký tự kết hợp unicode trong một " Msửa đổi hành vi của C" (trong đó Clà một lệnh). Như vậy, không có hai bộ sửa đổi nào được phép sửa đổi cùng một lệnh và trình phân tích cú pháp sẽ đưa ra lỗi nếu tìm thấy sự cố như vậy.

Tương tự, một số lệnh nhất định chuyển hướng IP không thể được sửa đổi theo bất kỳ cách nào, do sự tồn tại của các ký tự sửa đổi hướng sửa đổi (và cả hai trong cùng một ô đều không có ý nghĩa).

Không có cách nào để thoát hoặc hiểu theo nghĩa đen của chuỗi để làm cho nó hợp lệ. Liên kết Tio chứa một ;để bỏ qua lỗi "không có đầu cuối" có mức độ ưu tiên cao hơn.


2

TI-Basic (83 + / 84 + / SE, 24500 byte)

A

(24500 lần)

TI (-83 + / 84 + / SE) -Basic chỉ kiểm tra cú pháp trên các câu lệnh mà nó đạt được, do đó, thậm chí 5000 Endcâu lệnh liên tiếp có thể được bỏ qua với a Return. Ngược lại, điều này không thể phù hợp với RAM của TI-83 + / 84 + / SE, vì vậy không có chương trình nào có thể chứa chuỗi này. Là một chút bảo thủ với số lượng nhân vật ở đây.

TI-83 ban đầu có 27000 byte RAM, vì vậy bạn sẽ cần 27500 Agiây trong trường hợp đó.

TI-Basic (89 / Ti / 92 + / V200, 3 byte)

"

Dòng mới, báo giá, dòng mới. Dòng mới đóng bất kỳ nhận xét nào (và không cho phép nhúng ký tự không hợp lệ vào chuỗi, vì các hằng số chuỗi đa dòng AFAIK không được phép), dòng mới này không cho phép đóng chuỗi và trích dẫn đưa ra lỗi cú pháp.

Bạn có thể nhận được tới 2 byte với

±

không có dòng mới, nhưng tôi không chắc liệu số này có được tính hay không vì ±chỉ hợp lệ trong các hằng chuỗi.


Xong, cảm ơn :)
bb94

2

Đi , 6 byte


*/```

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

Dấu trọng âm (`) đánh dấu một chuỗi ký tự thô, bên trong đó tất cả các ký tự ngoại trừ`, bao gồm các dòng mới và dấu gạch chéo ngược, được hiểu theo nghĩa đen là một phần của chuỗi. Ba `trong một hàng là cốt lõi: chuỗi ký tự liền kề không hợp lệ và` luôn đóng một chuỗi` , vì vậy không có cách nào để hiểu ý nghĩa của chúng. Tôi đã phải sử dụng thêm 3 byte để chống lách, một dòng mới để chúng tôi không thể ở trong một nhận xét một dòng hoặc một chuỗi trích dẫn bình thường và * / vì vậy chúng tôi không thể ở trong một nhận xét nhiều dòng.


1

VẢI , 4 byte

Silo có tính cạnh tranh \ o /


x+

SILOS chạy trên trình thông dịch / trình biên dịch hai pass. Trước khi thực hiện, "trình biên dịch" cố gắng đơn giản hóa nguồn thành một mảng mô tả nguồn gốc Mỗi dòng được xử lý riêng. x + a là một toán tử gán sẽ thêm ea vào giá trị của x và lưu nó vào x. Tuy nhiên, "trình biên dịch" sẽ phá vỡ. Do đó, chúng tôi lấy chuỗi này và thêm một dòng mới trước và sau khi đảm bảo nó trên dòng riêng của nó và phá vỡ trình biên dịch.

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


Tại sao không có ax+lỗi?
Erik các Outgolfer

hành vi trình biên dịch không xác định @EriktheOutgolfer
Rohan Jhunjhunwala

1

AutoHotkey , 5 byte

`là nhân vật thoát. Bạn chỉ có thể thoát một "khi gán nó cho một biến.

\ n * / ngăn không cho nó được nhận xét hoặc gán cho một biến.


*/`"

1

JavaScript, 11 ký tự

`
`*/}'"`\u)

Các backticks đảm bảo tiêu diệt các chuỗi mẫu, các trích dẫn loại bỏ các chuỗi, dòng mới tránh các dòng nhận xét, kết thúc bình luận tránh các bình luận chặn, và backtick cuối cùng và thoát (với a! Để tránh các số bổ sung) cố gắng bắt đầu một số không hợp lệ chuỗi.

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



Câu trả lời ES5 được sử dụng )sau \u, có lẽ nó sẽ hoạt động ở đây?
Neil
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.