잘못된 문자열 찾기


81

문제는 문자열 찾는 것입니다 수 없습니다 에 나타나는 어떤 선택의 프로그래밍 언어로 법적 프로그램. 여기에는 주석, 문자열 또는 기타 "실행 불가능한"부분이 포함됩니다.

도전

  • 귀하의 프로그램은 특정 버전 또는 특정 언어의 컴파일러 / 통역사 / 런타임 환경 구현에 따라 달라질 수 있습니다. 그렇다면 세부 사항을 지정하십시오.
  • 표준 컴파일러 / 통역사 / 런타임 옵션 만 허용됩니다. 특정 결과를 얻기 위해 이상한 플래그를 컴파일러에 전달할 수 없습니다 (예 : 경고를 오류로 변환하기 위해 플래그 전달).
  • 프로그래밍 언어에 특정 인코딩 (예 : UTF-8)이 필요한 경우 문자열도 올바르게 인코딩해야합니다 (예 : 문자 디코딩 오류로 인해 실패하는 문자열은 허용되지 않음).
  • 제출 한 모든 개별 인물은 법적 프로그램에서 허용되어야합니다. 즉, 항상 거부되는 문자 만 사용할 수는 없습니다.
  • 컴파일러 / 인터프리터 / 런타임은 문자열을 하위 문자열로 포함 하는 소스 코드가 제공 될 때 오류를 발생시켜야합니다 . 오류는 프로그램 전체에서 동일 할 필요는 없습니다. 한 문자열을 포함하면 구문 오류가 발생하고 다른 하나는 런타임 오류가 발생할 수 있습니다.

채점

  • 각 언어마다 가장 짧은 불법 문자열이 이깁니다.
  • 문자열이 불법 인 이유 를 설명해야합니다 (법적 프로그램의 어느 곳에도 표시 할 수없는 이유).
  • 의견에 잘못된 해결책을 제시하십시오. 보다 구체적으로, 제안 된 하위 문자열을 포함하는 법적 프로그램 (즉, 오류를 생성하지 않는 프로그램)을 보여주는 TIO 또는 이에 상응하는 링크를 제공해야합니다.
  • 일부 언어 (예 : Bash, Batch, Perl)는 유효성에 영향을 미치지 않고 (예 : __DATA__Perl에서 사용) 임의의 이진 데이터를 프로그램에 추가 할 수 있습니다 . 이러한 언어의 경우, 후행 섹션 에만 표시 될 수있는 솔루션을 제출할 수 있습니다 . 답에 메모 해 두십시오. 이 "트레일 링 섹션"의 정의는 언어에 따라 다르지만 일반적으로 파서가 스크립트 읽기를 완전히 중단 한 후에는 모든 텍스트를 의미합니다.

파이썬에서는 제출할 수 있습니다.

x
"""
'''

그러나 이것은 더 큰 프로그램에 포함될 수 있습니다

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

허용되지 않습니다.


2
반대의 예가 STDIN의 입력에 의존 할 수 있습니까?
Zacharý

5
이것이 좋은 CnR을 만들까요?
CalculatorFeline

2
너무 늦었지만 지금은 경찰과 강도 도전이었던 것 같습니다. 유효한 프로그램을 만들려는 시도와 처음에 문자열을 생각해내는 데 많은 기술이 있습니다.
user2390246

4
Perl 시도에 대한 나의 애도. :)
Kaz

2
중첩 된 주석 덕분에 문맹이 아닌 Haskell에서는 완전히 불가능하다고 확신합니다.
dfeuer

답변:


57

변신 , 2 바이트를




그것은 두 개의 줄 바꿈입니다. 유효한 Changeling은 항상 인쇄 가능한 ASCII 문자의 완벽한 제곱을 형성해야하므로 한 행에 두 개의 줄 바꿈을 포함 할 수 없습니다.

오류는 항상 파서 오류이며 항상 같습니다.

This shape is unpleasant.

종료 코드 1이 수반됩니다 .

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


이것은 2Col 에서도 작동합니다 . 온라인으로 사용해보십시오! . 그러나 2Col에서 이것이 깨지는 이유는 모든 줄이 정확히 2 문자로 구성되어야하지만 빈 줄은 그것을 끊기 때문입니다.
Kritixi Lithos

2
"1이 항상 거부되는 문자 만 사용할 수 없기 때문에 1 바이트 솔루션은 허용되지 않기 때문에 +1이 자동으로 승자이므로 +1입니다.
Zacharý

1
@Cowsquack tfw 나는 내 언어를 잊어 버렸다
Skidsdev

1
@Skidsdev tfw 나는 내 자신의 언어를 잊어 버렸고, 내 자신의 언어를 잊어 버렸음을 잊어 버렸습니다
Skidsdev

@ Zacharý 0 바이트 솔루션은 어떻습니까?
PyRulez

32

자바, 4 바이트

;\u;

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

잘못된 유니 코드 이스케이프 시퀀스이므로 컴파일러에서 오류가 발생합니다.

error: illegal unicode escape

작동하지 않습니다-같은 문자열 리터럴을 가질 수 있습니다 "\\u;".
feersum

@feersum 1 바이트의 비용으로 수정
Kritixi Lithos

21
@TheLethalCoder는 : 자바 소스 코드를 변경하는 사전 처리 \uXXXX하기 전에 탈출을 아무것도 다른, 그래서 네, 심지어 comments.za 내에서 작동합니다
nneonneo

3
나는이 .. 아직이 사이트의 역사에서 가장 짧은 자바 대답 생각
매직 문어 항아리

1
@MagicOctopusUrn 실제로이 0 바이트 Java 응답이 있습니다 (STDOUT 대신 STDERR로 출력되므로 현재 메타에서는 더 이상 관련이 없습니다). 둘 다 꽤 놀랍고 영리합니다. :)
Kevin Cruijssen

25

COBOL (GNU) , 8 바이트


THEGAME

먼저, 줄 바꿈으로 인해 내 단어를 주석 처리 된 줄에 넣지 못하게합니다.

그런 다음 역사적으로 COBOL 프로그램은 코딩 시트에 인쇄되었으며 컴파일러는 80 자 제한 줄에 크게 의존하고 여러 줄 주석이 없으며 처음 6 문자는 주석 (종종 편집 가능한 줄 번호로 사용)이며 거의 모든 것을 넣을 수 있습니다 , AFAIK. THEGAM다음 줄의 시작 부분에서 선택했습니다 .

그런 다음 모든 줄의 7 번째 기호는 공백 (효과 없음), 별표 (줄의 나머지 부분 주석), 하이픈, 슬래시 등 매우 제한된 문자 목록 만 허용합니다 E.

예를 들어 GnuCobol이 제공 한 오류는 다음과 같습니다.

error: invalid indicator 'E' at column 7

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

또한, 당신은 게임을 잃었습니다.


30
Also, you just lost the game.나는 거의 downvoted
Stephen

24

자바 스크립트, 7 바이트


;*/\u)

선행 줄 바꿈에 유의하십시오.

  • \u) 유효하지 않은 유니 코드 이스케이프 시퀀스이므로이 문자열이 유효하지 않은 이유입니다.
  • //맨 앞에 줄을 추가해도 여전히 줄 바꿈으로 인해 작동하지 않으므로 두 번째 줄은 주석 처리하지 않습니다.
  • a /*를 추가 하면 문자열이 완성되어 문자열을 완전히 주석 처리하지 않고 노출 된 */채로 둡니다.\u)
  • @tsh에서 언급 한 바와 같이, 하단 라인이를함으로써 정규식으로 설정할 수 있습니다 /함으로써, 그래서 문자열 이후 )의 앞을 \u, 우리는 정규식 리터럴은 항상 유효하지 않을 것이라는 점을 보장 할 수 있습니다
  • @asgallant가 언급했듯이 1||1(string)/정규 표현식을 평가하지 않아도됩니다. 두 번째 줄의 시작 부분에있는 세미콜론은 두 번째 줄에 1||1닿기 전에 표현식을 종료하여 발생하지 않도록 합니다 ;*. 따라서 SyntaxError with with .

시도 해봐!


2
/* */\u0045 = 3유효한 JavaScript 코드 인 것 같습니다.
tsh

2
3 */\u;/여전히 유효합니다.
tsh

3
재미있는 (이 올해 말까지 공식되지 않습니다) ES2018의 당신이 단지 인해 역 따옴표로 전체를 래핑 할 수 있습니다하는 . 뒤에 백틱을 삽입 하여이 문제를 해결할 수도 있습니다 (고칠 /필요는 없습니다). (또한 ;나쁜 정규 표현식의 구문 분석을 강제하지 않으며,를 사용하여 SyntaxError를 강제합니다 *.)
ETHproductions

1
@Leushenko 그러나 #if 0여기에 표시된 것처럼 작동하지 않습니다 : 온라인으로보십시오!
Kritixi Lithos

3
최신 JS 버전에서 템플릿 문자열이있는 String.raw 는 잘못된 이스케이프가 실패하기 때문에이를 중단시키지 않을 수 있습니다. String.raw`code here`
iovoid

15

파이썬, 10 바이트 (파이썬이 아님)


?"""?'''?

선행 줄 바꿈에 유의하십시오. 줄 바꿈으로 인해 주석을 달 수 없으며 올바르게 생각하면 삼중 따옴표로 묶인 문자열의 조합이 작동하지 않아야합니다.

주석의 @feersum은 파일의 시작 부분에 0x1A 문자를 추가하여 알 수있는 한 Windows의 모든 cpython 프로그램을 완전히 손상시킨 것으로 보입니다. 아마도 (?) 이것은 운영 체제 가이 문자를 처리하는 방식 때문일 수 있으며, 일부 기존 DOS 표준으로 인해 stdin을 통과 할 때 EOF로 변환 된 것 같습니다.

매우 실제적인 의미에서 이것은 파이썬의 문제가 아니라 운영 체제의 문제입니다. 파일을 읽고 내장 파일을 사용하는 python 스크립트를 작성 compile하면 구문 오류가 발생할 것으로 예상되는 동작이 제공됩니다. Pypy (아마도 내부적 으로이 작업을 수행함)도 오류를 발생시킵니다.

편집하다:

파이썬 인터프리터를 깨뜨리는 모호한 방법을 찾는 @feersum의 성실로 인해이 답변은 내가 말할 수있는 한 일반적인 cpython 환경에서는 완전히 무효화됩니다! (Windows 및 Linux 모두에 대한 Python 2 및 3) 여전히이 균열은 모든 플랫폼 (내가 테스트 한 다른 Python 구현)에서 Pypy에 작동하지 않는다고 생각합니다.


1
@officialaimm 고려"""?'''"""
KSab

3
내 컴퓨터에서 실행되는이 하위 문자열로 프로그램을 만들었습니다. 그러나 많은 인터프리터 / 플랫폼 / 버전에서 실행되지 않는다고 생각합니다. 이 답변이 어떤 버전의 Python 인터프리터 및 OS를 대상으로 지정할 수 있습니까?
feersum

1
Windows 7의 Python 3은 균열이 작동하는 정확한 위치에 있습니다. base64 인코딩 프로그램의 Pastebin
feersum

1
이것도 깨뜨릴 수 있습니다. 파일의 시작 부분에 0x1A 문자를 넣으면 나머지는 모두 무시됩니다 (실제로 Python 3에서도 작동합니다).
feersum

1
나는 이것이 정말로 오래
되었다는

14

C (클랑) , 16 바이트

 */
#else
#else

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

*//*주석이 닫히고 선행 공백으로 시작하지 않았는지 확인합니다. 개행은 //주석을 닫고 문자열 리터럴을 끊 습니다 . 그런 다음 내부 에 얼마나 많은 수에 관계없이 #else without #if또는 #else after #else오류 가 발생합니다 #if 0.



2
또한 C ++ 11 원시 문자열이 작동하는 것처럼 보이므로 gcc로는 솔루션을 사용할 수 없습니다.
feersum

@feersum Huh, GCC가 C 코드의 코드를 허용한다는 TIL. 을 지정할 수 -std=c99는 있지만 clang으로 전환 해 봅시다.
Anders Kaseorg

3
gcc가 C ++ 11 원시 문자열을 허용한다는 사실에 정말 놀랐습니다. 컴파일러 버전이나 구현을 지정하는 것은 완벽하므로 Clang에서 불법이라면 공정한 게임입니다.
nneonneo

1
@ l4m2 나는 (그들이 인 사람, 당신은 다시 무엇을 의미합니까?) 질문을 구문 분석 할 수 있지만, C ++ 문자 그대로의 원시 문자열이 정의 분리 문자를 지원 참고 : R"foobar(...)foobar", 단지 오른쪽에 괄호가 일치하는 분리 문자와 다음 견적이 닫힙니다.
Anders Kaseorg

11

Pyth, 6 바이트

¡¡$¡"¡

¡는 구현되지 않은 문자입니다. 즉, Pyth 파서가이를 평가하면 PythParseError로 오류가 발생합니다. 코드는 이것이 ¡s 중 하나에서 발생하도록합니다 .

바이트가 Pyth 프로그램에 존재할 수 있고 파싱되지 않는 방법은 세 가지가 있습니다 : 문자열 리터럴 ( "또는 .", 동등하게 파싱되는), 파이썬 리터럴 ( $) 및 바로 뒤에 \.

이 코드 \는 바로 뒤에 오는 바이트와 두 번째 ¡오류 에만 영향을주기 때문에 오류없이 평가하지 못하게 합니다.

$의 코드를 $컴파일 된 Python 코드에 직접 포함시킵니다. 나는 그곳에서 일어날 수있는 일에 대해 어떤 가정도하지 않습니다.

프로그램이 $컨텍스트 에서이 코드에 도달하면 프로그램 은에서 끝나고 $¡직후에는 파서 오류가 발생합니다. Pyth의 Python 리터럴 $은 Python 코드의 기능에 관계없이 항상 다음에 끝납니다 .

프로그램이 "컨텍스트 에서 시작되면 "문자열을 끝내고 마지막 ¡은 파서 오류를 만듭니다.


11

에이다-2 바이트

나는 이것이 작동해야한다고 생각한다.


_

줄 바꿈 밑줄입니다. 줄 바꿈은 주석을 종료하고 문자열에는 허용되지 않습니다. 밑줄은 공백을 따라갈 수 없습니다. 문자와 숫자 뒤에 만 허용되었지만 유니 코드를 도입하면 상황이 복잡해졌습니다.


2
사이트에 오신 것을 환영합니다! :)
DJMcMayhem

9

x86 32 비트 머신 코드, 11 바이트 (및 미래 보장 64 비트)

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

이것은 times 9 nop/ ud2입니다. 기본적으로 NOP sled 이므로 선행 opcode의 피연산자로 소비 된 바이트 수에 관계없이 여전히 0 이상으로 실행 된 nop다음 ud2예외를 발생 0x90시킵니다. 다른 1 바이트 명령어 (예 times 9 xchg eax, ecx:)도 작동합니다.

x86 64 비트 머신 코드, 10 바이트 (현재 CPU)

향후 일부 ISA 확장에서 32 비트 모드의 의미와 별개로 64 비트 모드에서만 멀티 바이트 opcode의 접두사 또는 부분으로 용도를 변경할 때까지 64 비트 모드에는 1 바이트의 잘못된 명령이 있습니다. 0x0e입니다 push cs32 비트 모드로하지만, 현재의 CPU에서 불법적 64 비트에서 (인텔 스카이 레이크 테스트).

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

실행 가능한 머신 코드에 대한 규칙 해석 :

  • "파싱되지 않은"제한과 같이 바이트를 건너 뛸 수 없습니다. CPU는 실제로 비추 론적으로 디코딩 / 실행하려고 시도 할 때까지 예외를 발생시키지 않기 때문입니다.

  • 불법 수단은 항상 예외 (예 : 불법 지시 예외)를 발생시킵니다. (실제 프로그램은 베어 메탈의 예외 처리기를 사용하여이를 포착하거나 OS 신호 처리기를 설치할 수 있지만 이것이 도전 정신을 포착한다고 생각합니다.)


더 짧은 바이트 문자열로 끝나는 것은 ud2다른 명령에 대한 imm32 및 / 또는 주소 지정 모드의 일부로 나타나거나 명령 쌍으로 나눌 수 있기 때문에 작동 합니다 . 명령의 일부로 바이트를 "소비"하기 위해 문자열 앞에 넣을 수있는 것과 관련하여 생각하는 것이 가장 쉬운 방법입니다.

나는 명령이 최대 9 바이트의 임의의 물건을 소비 할 수 있다고 생각합니다 : SIB 바이트, disp32 및 imm32. 즉,이 명령어의 처음 2 바이트는 8 개의 NOP와 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 / machine code answer 게시를 고려할 정도로 명확하지 않았습니다. 예를 들어 왜 그렇게 할 수 ud2없습니까? 바이트를 뛰어 넘지 않는 규칙을 해석한다고 말하고있는 것 같습니다 ud2. 오… 문제가 ud2유효한 명령의 접두사로 나타날 수 있다고 말하는 것 같습니까? 이 답변의 두 번째 부분은 이해하기가 조금 어려웠습니다.
코디 그레이

@CodyGray : 그렇습니다. 인코딩하는 2 바이트 는 어떤 명령어에도 ud2나타날 수 있습니다 imm32. 나는 이것을 0f 0b디코딩하는 대신 이전 명령의 일부로 "사용"하는 문자열 앞에 어떤 바이트를 넣을 수 있는지에 대해 생각하고있었습니다 ud2. 나는 그것을 제시하는 방법에 완전히 만족하지 못했지만, 왜 8 nop초 만으로 충분하지 않은지, 9 nop초 +로 일어난 일 을 설명하고 싶었습니다 ud2.
Peter Cordes

@CodyGray : asm 소스 프로그램은 완전히 다른 답변입니다. 그것은 고장난 기계 코드를 생성하지 않고 어셈블러가 사용하는 파서를 오류로 만들어야합니다. 따라서 무효화 된 텍스트가 파싱되는 것을 일반적으로 보호 할 수있는 %else/ 와 같은 %else것이 패배하도록 작동 할 %if 0수 있습니다. (CPP 답변의 아이디어)
Peter Cordes

만족하지 마십시오. 귀하의 솔루션은 .data에있을 수 있습니다. (불가능하지만)
l4m2 2

@ l4m2 : 질문에 대답하고 흥미롭게 만들려면 실행 된 코드 로 제한해야했습니다 (그리고 뛰어 넘지 않아야 함). 내 답변의 규칙 해석 글 머리 기호를 참조하십시오. 물론 정적 데이터도 배제 할 것입니다. 머신 코드가 아니기 때문에 데이터 일뿐입니다. 이 질문은 기계 코드 응답이 이해하기 위해 대부분의 것보다 더 많은 적응이 필요했습니다. 파서 오류를 일으킬 수있는 컴파일 / 어셈블 단계가 없기 때문에 이미 메모리에있는 바이트에 대해서만 이야기하고 있습니다.
Peter Cordes

7

C #, 16 바이트


*/"
#endif<#@#>

다음과 같은 이유로 작동합니다.

  • // 줄 바꿈 때문에 주석이 작동하지 않습니다
  • /* 때문에 댓글이 작동하지 않습니다 */
  • 코드에만 상수를 가질 수는 없습니다
  • #if false때문에 시작에 추가 가 작동하지 않습니다#endif
  • "임의의 문자열 리터럴을 닫습니다
  • <#@#>이름없는 지시어가 너무 T4 템플릿 실패입니다.
  • 새로운 라인은 트릭을 /시작 하므로 처음 시작할 때*/

각 변형은 컴파일 오류와 함께 실패합니다.


1
코드에 T4 템플릿을 포함하기로 결정한 것이 이상합니다. T4는 별도의 언어로 간주되지 않습니까?
Arturo Torres Sánchez

1
@ ArturoTorresSánchez 나는 그들에 대해 들어 본 적이 없습니다. 누군가가 T4 템플릿을 포함했을 때이 기능이 작동하지 않는다고 언급하여 수정 프로그램을 추가했습니다.
TheLethalCoder


5

Haskell 리터럴 , 15 바이트

nimi에 의해 삭제 된 시도 복구 .


\end{code}
5
>

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

nimi의 원래 시도는 Literate Haskell을 기반으로 한 마지막 두 줄입니다. 문 해법 >주석 줄 (literate comment line) ( 5여기) 에 스타일 리터럴 코드가 인접한 줄에있을 수 없습니다 . 대체 ( "LaTeX") 리터럴 코딩 스타일의 주석에 포함될 수 있기 때문에 실패했습니다.

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

그러나 \begin{code}Literate Haskell 의 스타일은 자체 또는 여러 줄 주석으로 중첩 되지 않으므로{- -} 으로 줄 \end{code}바로 앞에 줄을 넣으면 5해당 해결 방법이 실패하며 다른 줄은 보이지 않습니다.


4

프리 파스칼, 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
@Neil, 유효한 즉시 모드 명령이지만 유효한 프로그램은 아닙니다.
Mark

4

Brain-Hack ( Brain-Flak 변형 ), 3 2 바이트

Brain-Hack은 주석을 지원하지 않으므로 바이트를 절약 할 수 있다고 지적한 Wheat Wizard 에게 감사합니다 .

(}

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


Brain-Flak에서 의견을 어떻게 말합니까? 나는 그것을 할 수있는 방법을 모른다.
Outgolfer 에릭

@EriktheOutgolfer # TIO
라일리

허위 문서화되지 않은 행동.
Outgolfer 에릭

@EriktheOutgolfer 나는 항상 어딘가에 문서화되어 있다고 가정했습니다. 그것들을 추가 할 것입니다.
Riley

BrainHack 또는 Craneflak에서 줄 바꿈이 필요하지 않은 Rain-Flak은 줄 설명이있는 세 가지 버전 중 하나입니다. Craneflak가 즉시 구문 분석되어 Craneflak 에서이 문제를 해결할 수는 없지만 접두사를 사용하면 모든 솔루션을 이길 수 있습니다 (()){()}.
밀 마법사


3

VBA, 2 바이트

줄 바꿈 뒤에 밑줄이 붙습니다 .VBA _에서 줄 연속 문자로 기능하며 줄 연속에서 왼쪽이나 바로 위에 줄이 없으면 VBA의 여러 줄 주석이 없기 때문에 항상 컴파일을 던집니다. 시간 오류Compile Error: Invalid character


_

줄 바꿈으로 시작하는 패턴에 의존하므로 줄 바꿈을 추가하십시오.
중복 제거기

@Deduplicator 그것은 이미 새로운 줄을 가지고 있습니다.-뒤에 오는 것은 중요하지 않습니다 _. 왼쪽이나 그 위에 유효한 줄은 없습니다
Taylor Scott

다음과 같이 포함 된 경우 : myfunction( \n_ )?
중복 제거기

@Deduplicator 줄 연속 문자는 계속되는 것과 같은 줄에 있어야합니다 Public Function Foo( ByVal bar as Integer, _ ( 예 : 줄 바꿈). bas as long) as double예, 설명 된 함수를 호출하면 오류가 발생합니다.
Taylor Scott

좋아,이 경우에는 더 비슷 myfunction( _ \n_ )합니다. 혼란을 드려 죄송합니다. 다시 말하면, 두 줄 바꿈을 사용해야합니다.
중복 제거기

3

SmileBASIC, 2 바이트


!

줄 끝을 지나가는 것은 없으므로 줄 바꿈 다음에 문장의 시작이 될 수없는 것이 필요합니다. !논리 연산자가 아니지만 표현식의 결과를 무시할 수 없으므로 !10( X=!10물론 작동 하는 동안 )

코드가 실행되기 전에 코드를 구문 분석하는 한 모든 것이 줄의 끝에서 끝나는 모든 언어에서 비슷한 기능이 작동합니다.

여기서 사용할 수있는 대체 문자가 많이 있으므로 COULD가 유효한 문자를 나열하는 것이 더 흥미로울 것이라고 생각합니다.

@예를 들어, 레이블의 시작입니다 @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 POLITE또는 ICL099I PROGRAMMER IS OVERLY POLITE.


전에 발생할 수있는 다른 컴파일 타임 오류가 몇 개있을 수 있습니다 ICL993I I GAVE UP LONG AGO.
관련이없는 문자열

모든 라인 레이블을 사용하는 동안 모든 라인 레이블을 사용하는 경우 COME FROM블록 주위의 제어 흐름을 전환하는 것이 약간 어려울 수 있지만 전혀 막을 수는 없습니다 GIVING UP!
관련이없는 문자열

3

AWK , 4 바이트



/

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

AWK여러 줄 주석을 처리하는 방법이 없기 때문에 주석을 달거나 /이것을 정규 표현식으로 바꾸지 못하게하려면 전후에 2 줄 바꿈이 필요합니다 ( 예 : add) 1/. `예상치 못한 개행 또는 문자열 끝인 가장 일반적인 메시지.

이전 균열


2

포트란, 14 바이트


end program
e

Fortran에 여러 줄 주석 또는 전 처리기 지시문이 없습니다.


1
온라인에서 이것을 테스트하는 좋은 방법이 있습니까? 또한 Fortran의 어떤 버전 / 컴파일러입니까?
Robert Benson

2

자바 스크립트 (Node.js) , 9 8 바이트

`*/
\u`~

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

나는 이것이 불법이라고 생각합니다.

다른 답변의 이전 JS 시도

;*/\유)

작성자 : @Cows quack

ES5 답변으로 이것은 유효해야하지만 ES6에서는 한 쌍의 백 틱으로 코드를 줄 바꿈하면이 문제가 발생합니다. 결과적으로 유효한 ES6 답변에는 백틱이 포함되어야합니다.

`
`* /} ' "`\ u!

@iovoid 제작

이것은 백틱과 관련된 개선 된 버전입니다. 그러나 단일 /코드 (이것은, 정규식 승산되는 리터럴 쓸모하지만 구문 유효 주형이된다.)이 끊어 후 @Neil 변하고 있다고 제안했다 !에이 ). 이론적으로 작동해야 /합니다 (잘못된 형식의 정규 표현식으로 인해 끝에 추가 하는 것이 더 이상 작동하지 않기 때문에).

설명

`*/
\u`~

이것은 그 자체로 불법이며, 모든 단일 및 이중 따옴표도 블록은 그 인용은하지 않고 라인에 걸쳐 수 없기 때문에 \줄 끝에

//`*/
\u`~

/*`*/
\u`~

잘못된 이스케이프 시퀀스 를 도입하여 주석 차단

``*/
\u`~

종료되지 않은 RegExp 리터럴을 도입하여 초기 백틱을 차단합니다

console.log`*/
\u`~

두 백틱 사이에 예상되는 연산자를 도입하여 태그가 지정된 템플릿 리터럴을 차단합니다.


2

록 스타 , 4 5 바이트

4를 넘어서도 여전히 4 :(

)
"""

록 스타는 매우 ... 내 지식에 와 같이 문자열을 정의하는 데 사용할 수는
있지만 주석 외부에 3 개의 따옴표를 표시 할 수있는 방법이 없으며 가까운 괄호는 발생하지 않도록합니다 (Rockstar의 주석은 괄호로 묶습니다. 이)."Put "Hello" into myVar

또한 Rockstar는 구두점이 무시되는 시적 리터럴 구문을 가지고 있으므로 개행은 3 개의 따옴표가 코드 줄의 시작이며 항상 유효하지 않아야합니다.


무엇에 대한 (()"""), 그건 어떤 조합이 될하지 않을 것이다?
ბიმო

이 주석 3 괄호 주석을 닫고 있기 때문에 @BMO 첫 번째 괄호 코멘트를 열고, 2 괄호는 아무것도하지 않는다, 당신은 한 """)무효 인 코드로 해석되고
Skidsdev

흠, 중첩 된 주석은 사양에 없습니다. 어쨌든 의견은 낙담하는 것 같습니다. 그러나 모든 문자열을 허용하는 시적 문자열 리터럴 을 감독 했기 때문에 Goethe says )"""유효합니다 .
ბიმო

@BMO 좋은 점, 해당 증속 개행을 삽입하여 고정 할 수 )"""
Skidsdev

2

Powershell, 10 8 12 14 13 14 16 바이트

Mazzy 덕분에 -2 바이트는 그것을 깨는 더 좋은 방법
을 찾았습니다 .ItItGreyOrGray 덕분에 +4 -1 바이트

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

이것이 효과가 있기를 바랍니다. '그리고 ", 따옴표를 방지하기 위해 #>블록 주석을 깨고, 새로운 라인을 모두 단일 행 주석을 중지 '@하고 "@문자열의 또 다른 스타일을 잡기 위해, 다음 구문 오류가 발생하는 부적절한 배열을 시작합니다.

논리는 따옴표를 사용하여 들어갈 수 없으며, 주석 처리를 할 수 없으며, @"사용되면 나중에 토큰을 가질 수없는 here-string을 생성합니다. 그대로두면 깨진 배열을 만들려고합니다. 이 문장은 너무 열심히 살고 싶어, 나는 갑옷에 더 많은 구멍을 계속 찾습니다.


1
또는 수호자 +@=
mazzy

1
@IsItGreyOrGray AAAAAAAAAAAw 도대체.
Veskah

2
#>를 $ #>로 변경하면 "Cmdlet의 이름으로 인식되지 않습니다 ..."로 표시됩니다. 다시는 합법적으로 만들 수 있지만 방법이 없습니다. 아직. :)
GreyOrGray

1
@IsItGreyOrGray 소 노파 건. 이제 세미콜론 갑옷을 특징으로합니까?
Veskah

1
좋은! 난 아무것도 없어 내가 시도한 모든 것이 실패했습니다.
GreyOrGray

2

룬 마법, 3 바이트

가능한 많은 변형 중 하나입니다.

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

Runic은 유니 코드 조합 문자를 "" M의 동작 수정 C"( C명령이있는 곳 ) 에서 문자를 결합합니다 . 따라서 두 개의 수정자가 동일한 명령을 수정할 수 없으며 그러한 발생이 발견되면 구문 분석기는 오류를 발생시킵니다.

마찬가지로, 방향 수정 수식 문자가 존재하여 IP를 리디렉션하는 특정 명령은 어떤 방식 으로든 수정할 수 없습니다 (같은 셀에 둘 다 의미가 없음).

문자열을 유효하게 만들기 위해 이스케이프하거나 리터럴화할 방법이 없습니다. Tio 링크에는 ;우선 순위가 높은 "터미네이터 없음"오류를 무시하기 위해가 포함되어 있습니다 .


2

TI 기본 (83 + / 84 + / SE, 24500 바이트)

A

(24500 회)

TI (-83 + / 84 + / SE) -Basic은 도달 한 명령문에 대해서만 구문 검사를 수행하므로 End행에서 5000 개의 명령문도 생략 할 수 있습니다 Return. 반대로, 이것은 TI-83 + / 84 + / SE의 RAM에 맞지 않기 때문에 어떤 프로그램도이 문자열을 포함 할 수 없습니다. 여기 문자 수에 약간 보수적입니다.

원래 TI-83의 RAM 용량은 27000 바이트이므로 27500 초가 필요합니다 A.

TI 기본 (89 / Ti / 92 + / V200, 3 바이트)

"

줄 바꿈, 따옴표, 줄 바꿈. 줄 바꿈은 주석을 닫고 (AFAIK 여러 줄 문자열 상수는 허용되지 않으므로 잘못된 문자를 문자열에 포함하는 것을 허용하지 않음), 다른 줄 바꿈은 문자열을 닫는 것을 허용하지 않으며 따옴표는 구문 오류를 발생시킵니다.

당신은 2 바이트를 얻을 수 있습니다

±

줄 바꿈이 없으면 ±문자열 상수에서만 유효 하기 때문에 이것이 계산되는지 확실하지 않습니다 .


감사합니다. :)
bb94

2

이동 , 6 바이트를


*/```

온라인으로 해킹하십시오!

억음 악센트 (`)는 원시 문자열 리터럴을 표시하며, 그 안에 줄 바꿈 및 백 슬래시를 포함하여`를 제외한 모든 문자는 문자 그대로 문자열의 일부로 해석됩니다. 연속 된 세 개의`가 핵심이다 : 인접한 문자열 리터럴은 유효하지 않으며`는 항상 ` 문자열을 닫으 므로,이를 이해할 수있는 방법이 없다. 우회 방지, 개행에 3 바이트를 더 사용해야했기 때문에 한 줄 주석이나 일반 인용 문자열 안에있을 수 없으며 * /이므로 여러 줄 주석 안에있을 수 없습니다.


1

SILOS , 4 바이트

사일로 경쟁력 \ o /


x+

SILOS는 2 패스 인터프리터 / 컴파일러에서 실행됩니다. 실행 전에 "컴파일러"는 소스를 소스를 설명하는 배열로 단순화하려고 시도합니다. 각 라인은 개별적으로 처리됩니다. x + a는 x의 값에 ea를 더하고 x에 저장하는 대입 연산자입니다. 그러나 "컴파일러"가 중단됩니다. 따라서이 문자열을 가져 와서 자체 행에 있는지 확인하기 전후에 새 행을 추가하고 컴파일러를 중단합니다.

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


ax+오류가 발생하지 않습니까?
Outgolfer 에릭

정의되지 않은 컴파일러 동작 @EriktheOutgolfer
Rohan Jhunjhunwala

1

오토 핫키 , 5 바이트

`는 이스케이프 문자입니다. 변수에 변수를 할당 할 때만 "이스케이프 할 수 있습니다.

\ n * /는 주석 처리되거나 변수에 할당되지 않습니다.


*/`"

1

자바 스크립트, 11 자

`
`*/}'"`\u)

백틱은 템플릿 문자열을 죽이고, 따옴표는 문자열을 제거하고, 줄 바꿈은 주석 처리 된 줄을 피하고, 주석 끝은 블록 주석을 피하고, 마지막 백틱과 이스케이프 (!는 숫자를 추가하지 않기 위해)로 잘못 시작합니다. 끈.

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



ES5 답변은 )이후에 사용 되었습니다. \u어쩌면 여기서 작동합니까?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.