깨끗한 세상을 프로그래밍


87

원시 프로그램 을 오류 자체는 없지만 N 문자의 연속 된 하위 문자열을 제거하여 수정하면 오류가 발생하는 프로그램 으로 정의 해 봅시다 1 <= N < program length.

예를 들어, 3 문자 Python 2 프로그램

`8`

깨끗한 프로그램입니다 ( 감사, SP는 ) 모든 길이 1 원인 오류 문자열 제거로 인한 프로그램 (사실 구문 오류 만 할 것 오류의 유형) 때문에 :

8`
``
`8

또한 길이가 2 인 하위 문자열을 제거하면 발생하는 모든 프로그램에서 오류가 발생합니다.

`
`

예를 들어, 오류 가없는 `8프로그램 인 경우 부분 문자열 제거의 모든 결과가 오류 여야 `8`하므로 원시적이지 않습니다 .

이 과제의 과제는 입력을받지 않고 다음 5 개 단어 중 하나를 출력하는 가능한 가장 짧은 원시 프로그램을 작성하는 것입니다.

world
earth
globe
planet
sphere

당신이 선택한 단어는 전적으로 당신에게 달려 있습니다. 유일한 단어와 선택적인 후행 줄 바꿈은 stdout (또는 귀하의 언어에서 가장 가까운 대안)으로 인쇄해야합니다. 바이트 단위의 최단 프로그램이 이깁니다.

노트:

  • 기능이 아닌 독립형 프로그램이 필요합니다.
  • 단어는 대소 문자를 구분합니다. 출력 World또는 EARTH허용되지 않습니다.
  • 컴파일러 경고는 오류로 간주되지 않습니다.
  • 오류 서브 프로그램은 항상 오류가 발생하는 한 입력을 받거나 출력을 제공하거나 다른 작업을 수행 할 수 있습니다.

다음은 잠재적으로 깨끗한 프로그램에서 오류가있는 프로그램을 나열하는 스택 스 니펫입니다.

<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>


1
@geokavel 예. 예외를 포착하면 더 이상 오류가 아닙니다.
Calvin 's Hobbies

33
삭제되지 않은 답변보다 2 배 많은 삭제 된 답변. 그것은 업적입니다!
DLosc

1
프로그램이 자체 소스 코드를 읽을 수 있습니까?
Shelvacu

2
"담배는 있지만 시가는 없다"는 답변과 의견을 어디에서 볼 수 있습니까?
Vi.

1
@Vi. 삭제 된 게시물을 볼 수 있도록 2,000 명의 담당자를 받습니다.
ThisSuitIsBlackNot

답변:


46

레일 , 24 바이트

$'main'    #
 -[world]o/

나는 이것이 효과가 있다고 생각한다 . 그리고 Rail이가는 한 짧고 읽을 수 있습니다.

  • 제거 된 부분 문자열에 $'main'우리가 얻는 부분이 있으면 Internal Error: Crash: No 'main' function found.
  • 제거 된 하위 문자열에을 포함하면 #프로그램을 완전히 종료 할 수있는 방법이 없으므로 항상로 종료됩니다 Crash: No valid move. 트랙이 유효한 (무한한) 루프를 형성하도록 하위 문자열을 삭제할 수는 없다고 생각합니다.
  • 제거 된 하위 문자열이의 앞에 있으면 #트랙의 끝에서 연결이 끊어 지므로 열차가 충돌합니다 (위와 동일한 오류가 발생 함).
  • 제거 된 하위 문자열이. 뒤에 오는 경우 트랙 끝에서 (및 잠재적으로 시작 지점에서 트랙의 시작까지) #연결을 끊습니다 . 다시 같은 오류입니다.#$

실제 프로그램과 관련하여 : 모든 Rail 프로그램 $'main'은 기능의 진입 점으로 (또는 더 긴 변형이지만 골프를 타야합니다.) 기차는 $남동쪽으로 출발합니다 . 첫 번째 줄의 모든 것은 트랙의 일부가 될 수 있으므로 트랙을 제거하는 'main'것은 다음과 같습니다.

$          #
 -[world]o/

-와는 /단순히 우리가 기차가 그 45 ° 회전을 할 필요가 레일의 조각입니다.

[world]문자열을 밀어 world하고 o그것을 인쇄합니다. #레일 프로그램을 안전하게 종료 할 수있는 유일한 방법 인 트랙의 끝을 표시합니다.

흥미롭게도,이 솔루션은 단지 레일 트랙이 통과 할 수 있기 때문에 가능 main이 가능 아니었다면 - 라인 #첫 번째 줄 바꿈 이후가 될 것이며, 코드가 항상 단축 할 수

$'main'
 #

아무것도하지 않는 유효한 프로그램입니다. (사이의 비 공백 문자 '#그 영향을 미치지 않을 것입니다.)

또한 매우 흥미 롭습니다. 방금 인쇄 작업을 골프로 쳤다world훨씬 짧거나 간단하지 않았을 것입니다.

$'main'
 -[world]o#

4
[와] 사이의 문자를 제거하면 어떻게됩니까?
Martin Lütke

@ MartinLütke는에서 연결을 끊 /습니다 #.
Martin Ender

2
@ MartinLütke 대괄호는 인접하지 않기 때문에 제거 할 수 없습니다.
Calvin 's Hobbies

두 줄 사이에서 줄 바꿈을 제거하면 어떻게 되나요?
Vi.

1
@Vi. $이렇게하면 트랙의 시작 부분에서 연결이 끊어 지므로 기차가 즉시 충돌합니다 (레일은 트랙이 남동쪽으로 계속 이어질 것으로 예상합니다 $).
Martin Ender

43

Funciton ( 186 UTF-16에서 136 바이트)

╔══════════════╗
║19342823075080╟
║88037380718711║
╚══════════════╝

이 프로그램은 "world"를 인쇄합니다.

이것에서 제거하는 대부분의 하위 문자열은 파서가 불평하는 완전한 상자가되는 것을 막습니다. 완전한 상자를 남길 수있는 유일한 제거 방법은 다음과 같습니다.

 ╔══════════════╗
|║19342823075080╟  (remove this whole line)
|║88037380718711║
 ╚══════════════╝
 ╔══════════════╗
 ║|19342823075080╟   ← substring starts at | here
 ║|88037380718711║   ← substring ends at | here
 ╚══════════════╝
... ↕ or anything in between these that removes a whole line’s worth ↕ ...
 ╔══════════════╗
 ║19342823075080|╟   ← substring starts at | here
 ║88037380718711|║   ← substring ends at | here
 ╚══════════════╝
 ╔══════════════╗
|║19342823075080╟
 ║88037380718711║  (both lines entirely)
|╚══════════════╝
 ╔══════════════╗
 ║19342823075080╟
|║88037380718711║  (remove this whole line)
|╚══════════════╝

대부분은 출력 커넥터 인 상자 오른쪽 상단에 매달려있는 끝을 제거합니다. 이 느슨한 끝이 없으면 상자는 단지 주석입니다.

╔══════════════╗
║88037380718711║
╚══════════════╝

파서는 정확히 하나의 출력을 가진 프로그램을 기대하기 때문에 더 이상 유효한 프로그램이 아닙니다.

오류 : 소스 파일에 프로그램이 없습니다 (프로그램에 출력이 있어야 함).

출력 커넥터를 떠날 수있는 유일한 가능성은 위의 마지막 것입니다.

╔══════════════╗
║19342823075080╟
╚══════════════╝

그러나이 숫자는 Funciton의 난해한 UTF-21에서 유효한 유니 코드 문자열을 인코딩하지 않습니다. 이것을 실행하면 다음을 얻을 수 있습니다.

처리되지 않은 예외 : System.ArgumentOutOfRangeException : 유효한 UTF32 값은 0x000000에서 0x10ffff 사이이며 대리 코드 점 값 (0x00d800 ~ 0x00dfff)을 포함해서는 안됩니다.

따라서이 프로그램은 깨끗합니다.


3
마지막 사례에서 운이 좋았다고 생각합니다 (실수로 유효한 유니 코드 시퀀스를 얻는 것이 쉽지는 않지만 여전히 ...)
Esolanging Fruit

34

Visual C ++- 96 95 바이트

#include<iostream>
#define I(a,b)a<<b
int main()I({std::cout,I('w',I('o',I('r',I('l','d';)))))}

속성 :

  1. int main()컴파일 오류없이 일부를 제거 할 수 없습니다 .
  2. 당신은 제거, AT ALL 수정 매크로 확장을 제거 할 수 a있는 모든 수단에 main()도착 결코 {제거 b전혀 우리의 라인이 끝나지 않는 의미 ;제거 <수단이 std::cout<'w'오류가 발생하고, 제거 <<원인 std::cout'w', 'w''o'
  3. 매크로 정의 또는 호출에서 매개 변수를 제거 할 수 없습니다, 정의에 대한 유일한 유효한 이름이 될 것이다 I(a), I(b)일치하지 않을있는 및 I이전으로 확장하는 (; 반면에, 사용 I(,원인 <<<<,)세미콜론 (임의의 다른 에러를 금지)에 떨어진다.
  4. std::coutLeading을 실행하지 않고 모든 부분을 제거 <<할 수 없으므로 #include<iostream>컴파일 오류 없이는 처음 부분을 제거 할 수 없습니다 .
  5. 단일 문자의 일부를 제거 할 수 없으며 ''빈 문자 오류가 있으며 'w,등 모든 것을 하나의 문자로 만들려고합니다.
  6. 너무 많 )거나 (다른 쪽 을 떠나지 않고 매크로의 왼쪽 / 오른쪽을 제거 할 수 없습니다 I('w',I('r'. 예를 들어와 같은 작업을 수행 할 수 없습니다 .

Visual C ++를 사용하여 온라인으로 컴파일합니다 .

다시 한번 이것은 완전한 증거가 아닙니다. 당신이 섹션없이 너무 일을 얻을 수 있다고 생각하면 알려 주시기 바랍니다.

이전 버전은 상당히 다른 접근법을 사용했으며 깨끗하지 않은 것으로 판명되었으므로 해당 점수를 제거했습니다.


확인:

다음 프로그램은 clVisual C ++ 2010 의 컴파일러를 사용하여이 버전이 깨끗 하다는 것을 확인했습니다.이 버전을 더 빨리 작성하려고 귀찮았습니다.

#include <fstream>
#include <iostream>
char *S = "#include<iostream>\n#define I(a,b)a<<b\nint main()I({std::cout,I('w',I('o',I('r',I('l','d';)))))}";
//uncomment to print source code before compile
// #define prints
int main(){
   for(int i=0; i<95; i++)
      for(int j=i; j<95; j++){
         std::fstream fs;
         fs.open ("tmptst.cpp",std::fstream::out);
         for(int k=0; k<95; k++)
         if(k<i || k>j){
            fs << S[k];
            #ifdef prints
               std::cout<<S[k];
            #endif
         }
         fs.close();
         #ifdef prints
            std::cout<<'\n';
         #endif
         //Compile and surpress/pipe all output
         //if it doesn't compile we get a nonzero errorlevel (i.e.true) from system.
         if(!system("cl -nologo tmptst.cpp >x"))
            return 0;
      }
      std::cout<<"PRISTINE!";
}

1
우리는 이것이이 컴파일러에서 원시적이지만 모든 컴파일러가 아니라는 점에 유의하십시오.
Joshua

1
예를 들어주세요 ....
Linus

3
일부 컴파일러에서 빈 C ++ 프로그램은 아무것도하지 않는 프로그램을 생성합니다. iostream의 구현에 따라 #include <iostream>도 컴파일 될 수 있습니다.
Joshua

5
@Joshua 길이가 1 이상인 서브 프로그램 만 문제이므로 빈 프로그램이하는 것과 관련이 없습니다.
ThisSuitIsBlackNot

2
@Comintern이 아닙니다. 실행 파일을 실행하기 위해 확인란을 선택하지 않으면 /c옵션이 자동으로 포함되고 프로그램이 아닌 라이브러리를 만드는 것처럼 컴파일됩니다. 사이트에 포함되지 않은 실행 상자를 선택하면 /c성공 메시지가 표시되지 않고 "LINK : 치명적 오류 LNK1561 : 진입 점을 정의해야합니다"라는 자연스러운 메시지가 표시됩니다.
Linus

32

파이썬 3, 79 33

if 5-open(1,'w').write('world'):a

open(1,'w')표준 출력을 연 다음 문자열을 인쇄합니다. write쓴 문자 수를 반환합니다. 문자열의 일부를 제거하면 5 이외의 값이 반환되고 5에서 그 값을 뺀 값이 true로 평가됩니다. 그러나 if이로 인해 -body가 실행되고 a정의되지 않습니다.

이것은 Anders Kaseorg의 영리하고 깨끗한 퀴네를 기반으로 합니다 .

하나의 진술 만 확인하면되므로 기존 솔루션보다 훨씬 짧지 만 일반적이지 않습니다.

오래된 해결책 :

try:
 q="print('world');r=None"
 if exec('e=q')==eval(q[17:]):exec(e)
finally:r

그것이 실제로 깨끗한 프로그램인지 확인하려면 :

w=r'''try:
 q="print('world');r=None"
 if exec('e=q')==eval(q[17:]):exec(e)
finally:r'''
exec(w)
for j in range(1,len(w)):
 for i in range(len(w)+1-j):
  e=w[:i]+w[i+j:]
  try:exec(e,{});print('WORKED',e)
  except:pass

몇 가지 핵심 사항 :

  • 실행 된 모든 문장을 삭제할 수 있습니다. q실행 되었는지 확인 하려면 외부에 명령문이 필요합니다 q. try잘, 적어도 두 개의 문을 요구함으로써 어느 것도 완전히 삭제할 수 있습니다 해결합니다.
  • q실행을 확인하는 r것은 마지막 에 평가 하여 이루어집니다 .
  • 즉, 검증하는 q의해 달성된다 수정되지 않았 eval(q[17:])으로 평가하는 어떤 None위해 q실행된다.
  • if조건이 까다로운 조금 잘 얻는 것입니다. 평가가 이루어 지려면 설정 e해야 할 부작용 이 r있습니다. (이것은 expr함수가 표현 수준의 부작용을 궁금해하기 때문에 Python 3을 사용한 이유 입니다.)

제거하지 않으면 구문 오류가 발생한다는 도전이 아닙니까? 런타임 오류가 발생하는 것 같습니다.
Martin Lütke

5
@ MartinLütke 모든 유형의 오류는 괜찮습니다.
Calvin 's Hobbies

1
음,이게 79 바이트 아닌가요?
Matt

@TheMatt 그래? 방금 다시 세었고 당신이 옳은 것 같습니다. 아마도 과거에 CRLF 줄 바꿈을 계산했을 것입니다 ... 얼마나 난처한 지. 감사!
Philipp

25

하스켈, 61

x=uncurry(:)
main=putStr$x('w',x('o',x('r',x('l',x('d',[])))))

어떤 유형의 오류라도 괜찮습니까? 이 경우 :

하스켈, 39

main=putStr$take 5$(++)"world"undefined

문자 중 하나를 제거하면 작동합니까?
lirtosiast

실행 중에 충돌이 발생합니다. 정의되지 않은 평가를 시도하기 때문입니다.
Martin Lütke

이것은 우수하다. 게으른 평가 FTW가 등장!
DLosc

1
. 전주곡이었다 'inits'나는 그런 :( 바랍니다 : 주 = putStr $를 "세계"! 5 (27 바이트) inits
마틴 Lütke에게

16

자바 스크립트, 74 73 35 바이트

if((alert(a="world")?x:a)[4]!="d")x

대답이 생각보다 훨씬 간단하다는 것이 밝혀졌습니다 ...

설명

if(
  (
    alert(a="world") // throws a is not defined if '="world"' is removed
        ?x           // throws x is not defined if 'alert' or '(a="world")' is removed
        :a           // throws a is not defined if 'a="world"' or 'a=' is removed
  )
  [4]!="d"           // if "world" is altered fifth character will not be "d"
                     // if 'd' is removed it will compare "world"[4] ("d") with ""
                     // if '[4]' is removed it will compare "world" with "d"
                     // if '(alert(a="world")?x:a)' is removed it will compare [4] with "d"
                     // if '?x:a' is removed [4] on alert result (undefined[4]) will error
                     // if '[4]!="d"' is removed the if will evaluate "world" (true)
                     // if '!', '!="d"' or '(alert...[4]!=' is removed the if will
                     //     evaluate "d" (true)
)x                   // throws x is not defined if reached

// any other combination of removing substrings results in a syntax error

를 제외한 모든 것을 제거하고 a="world"오류가 발생하지 않습니다
anOKsquirrel

3
@anOKsquirrel 단일 하위 문자열 만 제거 할 수 있습니다.
Dennis

4
"이걸 제거 할 수 있습니까? 아니오,이 오류가 발생합니다. 삭제할 수 있습니까? 글쎄, 다른 오류가 발생했을 것 같아요. 아하! 그 문자를 제거 할 수 있습니다. 아 잠깐만 ..."+1
ETHproductions

if(a="world")["bol"+a[4]]오류가 없습니다.
anOKsquirrel

4
성스러운 소, 이제 두 배나 인상적입니다! 다시 +1 할 수 있기를 바랍니다 ...
ETHproductions

15

자바 8, 301 바이트

모든 질문에는 Java 답변이 필요하기 때문입니다.

class C{static{System.out.print(((((w='w')))));System.out.print((((o='o'))));System.out.print(((r='r')));System.out.print((l='l'));System.out.print(d='d');e=(char)((f=1)/((g=8)-C.class.getDeclaredFields()[h=0].getModifiers()));}public static void main(String[]a){}static final char w,o,r,l,d,e,f,g,h;}

넓히는

class C {
    static {
        System.out.print(((((w = 'w')))));
        System.out.print((((o = 'o'))));
        System.out.print(((r = 'r')));
        System.out.print((l = 'l'));
        System.out.print(d = 'd');
        e = (char) ((f = 1) / ((g = 8) - C.class.getDeclaredFields()[h = 0].getModifiers()));
    }

    public static void main(String[] a) { }

    static final char w, o, r, l, d, e, f, g, h;
}

설명

  • public static main(String[]a){} 필요합니다.
  • 필드 선언을 제거하거나 비 정적으로 만들면 첫 번째 정적 블록에서 찾을 수 없습니다.
  • 정적 블록이 제거되거나 정적이 아닌 경우 필드가 초기화되지 않습니다.

제일 어려운 부분:

  • 는 IF final키워드가 제거되고, 두 번째 행은 평가 1/(8-8)일으키는 / by zero예외.

왜 인쇄 명세서의 내부를 제거 할 수 없습니까?
Nic Hartley

2
@QPaysTaxes 빈 System.out.print()메소드 가 없습니다 . 에는 println()있지만에는 없습니다 print(). 따라서 제거 d='d'하면 The method print(boolean) in the type PrintStream is not applicable for the arguments ()오류가 발생하고 제거 d=하면 The blank final field d may not have been initialized오류가 발생합니다.
Kevin Cruijssen

15

Funciton , 143 (142) 136 바이트

UTF-16은 (BOM 때문에) 2 바이트 더 커지므로 점수는 평소와 같이 UTF-8입니다.

╔══════════╗
║1934282307║╔╗
║5080880373╟╚╝
║80718711  ║
╚══════════╝

그래서 나는 잠시 동안 Funciton 답변을 고려해 왔으며 항상 전체 줄을 제거 할 수 있고 코드는 여전히 유효한 블록을 형성하기 때문에 불가능하다는 것을 알았습니다. 그럼 난 그것에 대해 Timwi 이야기, 그리고 그가 알아 낸 당신은 단지 그것을 제거하는 출력 커넥터의 부족으로 프로그램을 끊을 있도록, 한 줄에 전체 번호를 넣을 수있다.

그러나 한 줄에 리터럴은 악명이 모두 있기 때문에 더 큰 글자 수의 비싼 하고 있기 때문에 비 ASCII 문자의 많은 수의. 그리고 "빈 코멘트"블록에 대한 그의 언급은 저를 생각하게했습니다 ...

그래서 리터럴 블록을 그대로 두는 것을 제거하려고 할 때 추가 빈 주석 블록을 사용하는 이보다 효율적인 솔루션을 생각해 냈습니다.

  • 우리는 출력 커넥터를 제거하기 때문에 세 번째 줄을 제거 할 수 없습니다.
  • 두 번째 줄을 제거하면 주석 블록이 위쪽 가장자리를 잃고 끊어집니다.

두 가지 옵션이 남습니다 ( 스티브 에게 지적 해 주셔서 감사합니다 ).

  • 네 번째 줄을 제거하십시오. 두 상자를 모두 그대로 유지합니다. 그러나 결과 정수 19342823075080880373가 디코딩되면 해당 문자열 0x18D53B에 유효한 유니 코드 문자가 아닌 코드 포인트가 포함되며 에 System.Char.ConvertFromUtf32충돌이 발생합니다 ArgumentOutOfRangeException.
  • 오른쪽 상단 모서리부터 시작하여 전체 줄을 제거하십시오. 다시 말하지만, 두 상자는 재치에 남아 있지만 결과 정수 508088037380718711이 유효하지 않은 코드 포인트를 포함하는 것 0x1B06350x140077같은 예외로 이어지는.

빈 주석 블록이 없어도 두 번째 줄을 제거하면 유효하지 않은 코드 포인트가 생깁니다. 그러나 주석 블록 은 두 번째 줄 내부 에서 한 줄을 가져 와서 정수와 같은 정수를 얻지 193428037380718711못하므로 오류가 발생하지 않습니다.


출력 커넥터 뒤의 문자로 시작하여 정확히 한 줄 후에 마무리하는 부분 문자열을 제거하면 어떻게됩니까? 즉, 주석 블록의 중간 라인과 메인 블록에 "80718711"을 포함하는 라인을 제거하지만 두 상자의 모서리는 그대로 둡니다.
Steve

@Steve 나는 그 사건을 다루기 위해 답변을 수정했습니다. 좀 더 살펴본 후에 실제로 2 자 / 6 바이트를 저장할 수있었습니다.
Martin Ender

10

루비, 36

eval(*[(s="planet")[$>.write(s)^6]])

를 할당 s="planet"한 다음 해당 문자열을 STDOUT에 씁니다. 쓴 문자 수를 반환합니다. 우리는 6으로 그것을 조정하여 6 문자 이외의 것이 쓰여지면 0이 아닌 정수를 얻습니다. 그런 다음 s해당 색인 으로 분할 합니다. s"p" 의 0 번째 문자 만 유효한 코드 문자열 (no-op)입니다. 메소드 호출 외부에서 유효하지 않다는 것을 제외하고 는 구문을 eval사용하여이를 전달합니다 .(*[argument])(argument)

Ruby 1.9.3 및 2.2에서 프로그래밍 방식으로 검증 됨


이런 세상에. 이것은 놀랍다.
박수 :

를 제거하면 어떻게됩니까 *?
LegionMammal978

그런 다음 ArgumentError 인 문자열 대신 배열을 eval에 전달합니다.
histocrat

9

C #을 128 118 101 바이트

인접한 부분 문자열 규칙을 남용 할 생각.

코드

class h{static void Main()=>System.Console.Write(new char[1
#if!i
*5]{'w','o','r','l','d'
#endif
});}

작동하는 이유

  1. class hstatic void Main()필요합니다.
  2. 'w','o','r','l','d'문자 배열을 제거 하면 오류가 발생하고 char 배열은 length로 초기화됩니다 1*5.
  3. 부분이 사전 프로 시저로 분리되어 연속 문자 규칙을 위반하지 않으면 Main () 내부의 내용을 제거 할 수 없습니다. (아래 참조)

골프와 분리 전

class h
{
    static void Main() =>
        System.Console.Write(new char[1 * 5]{'w','o','r','l','d'});
}

인증

https://ideone.com/wEdB54

편집하다:

  • #if !x대신에 를 사용하여 일부 바이트를 저장했습니다 #if x #else.
  • 사용 된 =>func 구문. #if!x대신에 #if !x. @JohnBot의 크레딧.
  • =>func 구문 으로 인해 추가 전처리 조건을 제거 할 수 있습니다.

안녕 나선! 답변이 어떻게, 왜 더 효과가 있는지 설명 할 수 있다고 생각하십니까?
isaacg

@isaacg 편집했습니다. 따라야합니다.
Helix Quar

나는 그것이없이 실행 얻을 수 없습니다 staticMain.
Johnbot

@ 존봇 예. 잘못 복사 했어야합니다. 결정된.
Helix Quar

당신하여 문자를 저장할 수 있습니다 표현 바디 기능 멤버 전처리 조건 전에 공백을 제거하여 2 더 : . 내 카운트는 115입니다. Mainclass h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
Johnbot

9

MATLAB, 37 36 33 바이트

feval(@disp,reshape('world',1,5))

ans = 도 출력 할 수 있는지 확실하지 않기 때문에 적절한 방법으로 출력하기위한 해결 방법을 찾아야했습니다. 내가 시도한 것이 무엇이든간에 단순히 오류를 거부했기 때문에 fprintf 자체를 사용 하는 것은 효과가 없었습니다. disp 자체를 사용 하는 것은 하나의 인수를 취하고 인수 자체는 분명히 오류없이 실행될 것이기 때문에 옵션이 아닙니다.

출력에 ans = 도 포함 시키는데 문제가 없다면 20 바이트 로 MATLAB을 수행 할 수 있습니다 .

reshape('world',1,5)

나는 실제로 내장 함수에 대해 더 배워야한다. (+1) // btw 프로그램 점수 20
Abr001am

2
그것은 실제로 규칙이 얼마나 엄격한 지에 달려 있습니다. 그들은 것을 주장 에만 그래서 다음 33 바이트의 '세계'(+ 옵션 뒤에 줄 바꿈)를 인쇄해야합니다.
slvrbld

네, 우리는 이것을 33으로 세겠습니다. 이해해 주셔서 감사합니다 :)
Calvin 's Hobbies

9

> <> , 17 바이트

e"ooooo7-c0pBhtra

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

"지구"를 인쇄합니다.

><>프로그램이 오류없이 종료 되는 유일한 방법 은 ;문자를 실행하는 것입니다. 이는 그 전에 모든 문자를 제거 할 수 있으므로 ;첫 번째 문자가 실행 되므로 문제 가됩니다. p명령을 사용하여 ;대신 실행 중에 포함하도록 프로그램을 수정 하여 문제를 해결할 수 있습니다 . 코드의 어떤 부분을 제거하면이 원인이 ;잘못된 지침을 통해 오류의 원인이 생성되지 않을 위해 B, h그리고 t, 언더 플로우 스택, 그리고 무한 루프는 결국 메모리가 부족하고. 모든 무한 루프가 계속 스택을 채우도록해야했습니다.

이 변형 코드를 사용하여 모든 변형을 테스트했습니다.

code = 'e"ooooo7-c0pBhtra'
count = {"invalid":0, "underflow":0, "memory":0}
for l in range(1, len(code)):
    for x in range(0, len(code)-l+1):
        print(code[:x] + code[x+l:], "\t\t", end='')
        try:
            interp = Interpreter(code[:x]+code[x+l:])
            for _ in range(0,1000):
                interp.move()
            print(len(interp._stack), "< ", end='')
            interp2 = Interpreter(code[:x]+code[x+l:])
            for _ in range(0,2000):
                interp2.move()
            print(len(interp2._stack))
            count["memory"] += 1
        except Exception as e:
            print(e)
            if str(e) == "pop from empty list": count["underflow"] += 1
            else: count["invalid"] += 1
print(count) 
#don't judge me

> <> 제작자가 공식 fish.py 해석기에 추가 (약간 수정 된 버전)했습니다 . 152 개의 가능한 하위 프로그램 중, 잘못된 명령에서 92 개, 스택 언더 플로에서 18 개, 메모리 부족에서 42 개 오류가 발생했습니다.

재미있는 사실, 이것의 첫 번째 버전 에는 잘못된 명령 대신에 e"ooooo6-c0pAhtraput 명령을 사용 [하여 스택을 지우는 괴물 하위 프로그램이 두 개 있습니다 A. 또한 "earth"는 첫 번째 문자 e가에서 유효한 명령어이므로이 방법으로 작동하는 구문 중 유일한 단어입니다 ><>. 그렇지 않으면 "명령이 프로그램의 전면에 위치해야하며 유효한 서브 프로그램만으로도 가능 "합니다.


8

루비, 34

eval(*[($>.write("world")-1).chr])

여기에는 몇 가지 구성 요소가 있습니다.

eval(*[ EXPR은 ]) 에서 빌려 histocrat의 대답 하고 깨끗한뿐만 아니라의 반환 값 검증이다 EXPR하는 오류를하지 않는 유효한 루비 프로그램입니다. 인수로 값 method(*arr)을 호출하는 루비 구문입니다 . 여기에 필요한 이유 는 메소드의 매개 변수 로만 유효하므로 제거 하면 구문 오류 이기 때문입니다 . 경우 EXPR이 제거되고, 대한 충분한 인자를 가지고 있지 불평methodarreval(*[expr])eval

$>.write("world")-1문자열 내부와 빼기를 제외하고는 엉망이 될 수 없습니다. $>.write("world")"world"를 STDOUT에 기록하고 기록 된 문자 수를 리턴 한 다음 1을 뺍니다. 따라서 프로그램이 풀리지 않으면 값은 정확히 4가 됩니다. 엉망인 경우 ( -1가 제거되거나 문자열이 짧아짐) -1,0,1,2,3 또는 5 중 하나를 반환 합니다. 다른 맹 글링으로 인해 구문 오류가 발생합니다.

chr숫자를 호출 하면 해당 숫자로 표시되는 문자가 반환됩니다. 따라서 위 예제의 결과에서 호출되면 -1에서 오류가 발생하고 그렇지 않으면 단일 문자 문자열을 리턴합니다.

나는 이것이 왜 그런지 잘 모르겠지만, 루비 \x04는 공백 문자로 해석 되는 것처럼 보입니다 . 이는 표현식이 유효하다는 것을 의미합니다 (빈 루비 프로그램은 아무것도하지 않습니다). 그러나 다른 문자 ( \x00- \x03\x05)는 결과입니다 Invalid char '\x01' in expression. 나는 반환 된 숫자로 할 수있는 가능한 수학을 단순히 반복하여 이것을 발견했습니다. 이전에는

$>.write("planet
")*16

여기서 "planet"과 줄 바꿈은 7 자 (16 자 곱하기 112) p로 기본적으로 정의 된 루비의 유일한 단일 문자 함수입니다. 논증이 없을 때, 사실상 논란의 여지가 없다


존경할만한 언급 : $><<"%c"*5%%w(w o r l d)매우 가깝지만 깨끗하지는 않습니다. 제거 "%c"*5%하면 오류가 발생하지 않습니다. 미니 설명 :

$>stdout이며 <<호출되는 함수입니다. "%c"*5형식 문자열 생성 "%c%c%c%c%c"후 다음 포맷 할려고 ( %: 배열에 의해) %w(w o r l d)더 짧은 버전이다 ['w','o','r','l','d']. 배열에 요소가 너무 적거나 너무 많아서 형식 문자열과 일치하지 않으면 오류가 발생합니다. 아킬레스 건은입니다 "%c"*5. 그리고 %w(w o r l d)둘 다 독립적으로 존재할 수 있으며, $><<어느 쪽의 인수 만 필요합니다. 따라서이 프로그램을 오류가없는 사촌으로 처리하는 몇 가지 방법이 있습니다.


이것을 사용하여 확인 :

s = 'eval(*[($>.write("world")-1).chr])'
puts s.size
(1...s.length).each do |len| #how much to remove
  (0...len).each do |i| #where to remove from
    to_test = s.dup
    to_test.slice!(i,len)
    begin #Feels so backwards; I want it to error and I'm sad when it works.
      eval(to_test)
      puts to_test
      puts "WORKED :("
      exit
    rescue SyntaxError
      #Have to have a separate rescue since syntax errors
      #are not in the same category as most other errors
      #in ruby, and so are not caught by default with 
      #a plain rescue
    rescue
      #this is good
    end
  end
end

histocrat의 답변에 따라 설명 하면 좋을 것입니다. 동일한 기본 접근 방식을 사용하는 것 같지만 Ruby를 모르기 때문에 세부 사항을 이해할 수 없습니다.
ThisSuitIsBlackNot

@ThisSuitIsBlackNot 당신이 이해하지 못하는 최선을 다했습니까?
Shelvacu

훌륭한 설명, 감사합니다!
ThisSuitIsBlackNot

6

파이썬 3 , 43 바이트

for[]in{5:[]}[open(1,"w").write("world")]:a

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

작동 원리

부분 문자열 삭제를 방지하기 위해 open(1,"w").write대신을 사용 합니다 print. 파이썬 3에서는 write쓰여진 문자 수를 반환하는데 5, 문자열의 일부가 삭제되지 않았는지 확인합니다. 딕셔너리에서 반환 값을 찾아서 {5:[]}결과를 for[]in…:a반복하면 빈 iterable을 얻지 못하거나 for명령문이 삭제 되면 실패합니다 .


4

자바 스크립트 (Node.js), 93 95 바이트

if(l=arguments.callee.toString().length,l!=158)throw l;console.log("world");if(g=l!=158)throw g

자체 크기가 두 번 확인되어 문자가 누락되면 오류가 발생합니다. Node.js function (exports, require, module, __filename, __dirname) {가 런타임시 코드 앞에 추가되므로 길이는 156 입니다.

오류를 지적한 Martin Büttner에게 감사합니다. 지금 수정했습니다.


4

Perl 5.10+, 71 63 바이트

(${open 0;@{\(read(0,$a,63)!=63?die:@_)};say"world"});{$a//die}

world후행 줄 바꿈으로 인쇄합니다 . 다음과 같이 실행하십시오.

perl -M5.010 file

이것은 소스 코드의 바이트 수에 의존하므로 file위의 코드와 그 밖의 아무것도 포함 하지 않아야합니다 (shebang 없음, 후행 줄 바꿈 없음). Perl 5.10+ say및 정의 된 연산자 또는 연산자 가 필요합니다 //.


Perl로 원시 프로그램을 만드는 것은 매우 어렵습니다.

  • 어떤 bareword는 식별자 (예 foo, a, _)와 유효한 문입니다 no strict 'subs';(기본값). 이것은 프로그램이 문자, 숫자 또는 밑줄로 시작하거나 끝날 수 없음을 의미합니다.

  • tchrist가 설명 했듯이 "기호 역 참조를 통해 지정된 식별자 는 이름에 전혀 제한이 없습니다 ." 이것은 sigils의로 시작할 수 없습니다 프로그램을 의미한다 $, @, %, 또는 *, 첫 번째와 마지막 문자 남기고 모두 제거하기 때문에 항상 유효한 변수 이름을 떠날 것이다.

  • 많은 내장 함수 (출력을 생성 할 수있는 대부분의 함수 포함) $_는 기본적으로 작동 하므로 인수를 제거하더라도 호출이 종종 작동합니다 (예 : say"world"vs say).

작동 원리

이 솔루션은 Naouak의 Node.js answer 에서 영감을 얻었습니다.이 답변 은 고유 한 길이를 확인하여 문자가 제거되지 않았는지 확인합니다.

프로그램에는 두 개의 섹션이 있는데, 하나는 괄호 안에 있고 다른 하나는 블록 안에 있습니다 :

(...);{...}

첫 번째 섹션은 소스 파일을 읽고 길이가 63 자 미만인 경우 죽습니다. 두 번째 섹션은 read성공적으로 실행되었는지 확인합니다 . 괄호 나 중괄호를 포함하거나 포함하지 않고 섹션을 제거하면 다른 섹션에서 예외가 발생합니다.

프로그램의 중간 또는 왼쪽 또는 오른쪽을 제거하면 괄호 및 / 또는 중괄호의 균형이 맞지 않아 구문 오류가 발생합니다.

첫 번째 경우가 die변경된다 (에 d, e, di, de, 또는 ie, 모든 유효한 식별자있는) 길이 체크된다 :

@{\(read(0,$a,63)!=63?di:@_)};

다음과 같이 평가됩니다.

@{\'di'};

이것은 문자열에 대한 참조를 취하고 그것을 문자열로 역 참조하려고 시도하여 오류를 생성합니다.

Not an ARRAY reference

다른 명령문이 변경되면 길이 검사가 실패하고 프로그램이 종료됩니다.


다음 프로그램으로 깨끗하게 검증되었습니다.

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use File::Temp;
use List::MoreUtils qw(uniq);

sub delete_substr {
    my ($str, $offset, $len) = @_;

    my $tmp = $str;
    substr($tmp, $offset, $len) = '';

    return $tmp;
}

sub generate_subprograms {
    my ($source) = @_;

    my $tot_len = length $source;
    my @subprograms;                                             

    foreach my $len (1 .. $tot_len - 1) { 
        foreach my $offset (0 .. $tot_len - $len) {
            push @subprograms, delete_substr($source, $offset, $len);
        }                                                        
    }                                                            

    return uniq @subprograms;                                    
}                                                                

chomp(my $source = <DATA>);                                                                                                       
my $temp = File::Temp->new;                                                                                        

foreach my $subprogram ( generate_subprograms($source) ) {       
    print $temp $subprogram;

    my $ret = system(qq{/usr/bin/perl -M5.010 $temp > /dev/null 2>&1});
    say($subprogram), last if $ret == 0;

    truncate $temp, 0;
    seek $temp, 0, 0;
}

__DATA__
(${open 0;@{\(read(0,$a,63)!=63?die:@_)};say"world"});{$a//die}

4

Ruby + coreutils, 33 27 26 바이트

`base#{$>.write"world
"}4`

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

루비의 백틱은 그 안의 명령을 실행하고 프로그램이 STDOUT에 넣은 모든 것을 문자열로 반환합니다. 이 #{expr}구문을 사용하면 문자열과 백틱에 식을 포함시킬 수 있습니다. 이 프로그램은 다음과 같이 다시 작성 될 수 있습니다.

system("base" + (STDOUT.write("world\n")).to_s + "4")

IO#write쓴 바이트 수를 반환하므로 문자열이 짧아지면 올바른 숫자가 아닙니다. #{}포함하면 자동으로 숫자가 문자열로 만들어집니다. 일부 조각이 제거되어 구문 오류가 발생하지 않으면 잘못된 명령이 실행됩니다. 의 일부 "world"가 제거되면 base04관통 중 하나 base54가 실행됩니다.

문자열 안팎에 줄 바꿈이 필요합니다. 그렇지 않으면 처음 5 자 ( `base)를 제거하여 전체 줄을 주석으로 만들 수 있습니다. 또한 첫 번째 백틱과 사이에 하나 이상의 문자가 있어야합니다 #. 그렇지 않으면 {전체를 주석 으로 만들기 위해 제거 할 수 있습니다 .


exec(*[(s="ec%co earth")%s[10]])

exec현재 루비 프로세스를 지정된 명령으로 바꿉니다. 구문과 그 필요성에 대한 설명은 다른 답변 을 참조하십시오 meth(*[]).

(s="ec%co earth")문자열 "ec % co earth"를 변수에 할당합니다 s. 할당은 할당 된 것을 반환하므로 문자열도 반환됩니다.

"format string %d" % 5에 대한 구문 설탕 sprintf("format string %d",5)이지만 주변 공간 %은 필요하지 않습니다.

s[10]문자열 10에서 문자열의 문자를 가져옵니다. 얽 히지 않으면이 문자는 문자열의 마지막 문자 인 "h"입니다. 그러나, 문자열의 모든 문자를 제거하는 문자열이 짧은 것을 의미하므로이 인덱스 10시에는 문자, 그래서없는 s[10]반환 nil하고, "%c" % nil오류가 발생합니다.

경우 %s[10]제거 후 루비는 명령을 실행하려고 ec%co earth작동하지 않습니다.

변경 1010또한 것은 (중 알 수없는 명령 결과 eceoecco). #[]문자열 에서 메소드 를 호출하기 때문에 완전히 제거하는 것은 기술적으로 구문 오류가 아니지만 인수가 충분하지 않다고 불평합니다.


일반적 으로이 문제를 해결하기위한 참고 사항 : 코드 자체를 자연스럽게 확인하면서 내부적으로 코드를 확인하는 래퍼가 있어야합니다. 예를 들어, 끝 부분 ( blablabla/somevar)이 있는 프로그램 은 항상 부분을 제거 할 수 있기 때문에 작동하지 않습니다 ( blablabla). 이들은 지금까지 사용한 그런 래퍼입니다.

  • eval(*[])histocrat와 첫 번째 답변에서 사용되는 코드 . 출력이 유효한 루비 프로그램인지 확인
  • exec(*[])위에서 사용한 코드 는 응답이 유효한 명령인지 확인합니다.
  • `#{ 암호 }`

백틱 구문은 명령을 실행하기 때문에 유효한 명령인지 확인하지만 STDOUT은 상위 프로세스 '(Ruby 's) STDOUT으로 출력되는 대신 문자열로 캡처됩니다. 이 때문에이 답변에 사용할 수 없었습니다. 편집 : 작동하게했습니다. 위에서 설명한 제한 사항.

편집 : 약간의 결함을 지적 한 @histocrat에게 감사드립니다.


멋진 접근 방식! write문자열의 시작과 시작 사이의 공백을 제거 할 수는 있지만 필연적으로 영향을 미치지는 않습니다. 또한 내 컴퓨터 base64에서 입력을 기다리는 동안 응답이 중단되어 규칙에 위배 될 수 있습니다.
histocrat

@histocrat 와우, 나는 그것이 $>.write"world"작동 하는 놀랍습니다 , 감사합니다! base64는 입력 대기 중이며 시스템마다 다릅니다. TIO는 잘 작동합니다. 그것은 규칙을 따르는 지 여부에 대해 더 모호합니다.
Shelvacu

3

PowerShell, (프로그램 이름은 97 바이트 + 5) = 102 바이트

"$(try{if(($a=(gc .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a

스스로 깨지기 전에 스스로를 확인합니다 ... 두 번.

다음 c.ps1과 같이 로컬 디렉토리에 저장 하고 실행할 것으로 예상됩니다
PS C:\Tools\Scripts\Golfing\> .\c.ps1..

별명 gc은 파일을 읽는 Get-Content것과 짧으며 cat(이 경우에는 실행 경로 .\c.ps1) 유사 합니다. .Length파일을 가져 와서로 설정하고 $a와 97이 아닌지 확인합니다 -eq97. 같으면 (즉, 프로그램이 수정되지 않은 경우)로 인쇄하고 "world"유효하지 않은 command를 실행 a합니다. 이로 인해 강제로 catch적용되어 다시 확인할 수 있습니다. 이번에는 코드가 97이 아닌 경우 잘못된 명령이 발생하여 프로그램에서 오류 텍스트를 출력하여 출력했습니다. 그런 다음 clear()오류가 발생 exit합니다.

if문장 중 하나라도 무단 변경하면 다른 문장에 오류가있을 것입니다. 일부 "world";가 변경되면 첫 번째 부분 if에서 오류가 발생합니다. 연속적이어야하므로 두 if명령문을 모두 제거 할 수 없습니다 . 중간에있는 문자열은 괄호가 일치하지 않거나 두 번째 {a}가 실행됩니다. try/는 catch처음부터 오류를 잡을 것입니다 if그것 때문에 우리가 할 수있는 제대로 분명 문. 바깥 쪽 "$( )"끈은 한쪽 끝이 막히는 것을 방지합니다. 마지막 ;a은 유효한 프로그램을 생성하는 중간 부분이 잘리지 않도록하는 것입니다 (예 : "it}a)";a인쇄 it}a)후 오류가 발생 함).

몇 가지 특별한 상황이 있습니다 :

  • 경우 gc, gc<space>또는 gc .\제거, 프로그램은 결국 일부 (반복 자동 실행 호출로 인해) 메모리 부족 오류의 맛과 가능성이 충돌 쉘 (그리고 아마도 컴퓨터) 함께 오류가 있습니다. 검증되지 않은.
  • 경우 <space>.\c.ps1또는이 .\c.ps1제거되고, 프로그램은 중지하고 사용자 입력하라는 메시지가 표시됩니다. 사용자가 무엇을 입력하더라도 크기 카운트가 잘못되어 프로그램이 여전히 오류가 발생합니다.
  • 에서 시작 $하여 마지막 이전에 끝나는 부분 문자열을 "빼면 프로그램은 남아있는 모든 것을 출력 한 다음 a유효하지 않기 때문에 오류를 출력 합니다.

다음과 같이 확인되었습니다.

$x='"$(try{if(($a=(gc .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yy='"$(try{if(($a=( .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yyy='"$(try{if(($a=(.\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yyyy='"$(try{if(($a=(c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'

for($i=1;$i-lt$x.Length;$i++){
  for($j=0;$j-lt($x.Length-$i);$j++){
    $y=($x[0..$j]+$x[($i+$j+1)..$x.Length])-join''
    $y>.\c.ps1
    $error.clear()
    if(!($y-in($yy,$yyy,$yyyy))){try{.\c.ps1}catch{};if(!($error)){exit}}
    $q++;
    write-host -n "."
    if(!($q%150)){""}
  }
}
"No success."

(많은 도움을 주신 Martin에게 감사합니다!)


3

C (gcc) (Linux, -Werror=undef), 66 바이트

main(a){a
=
1
/
(puts("world")/
6);
#if(7^__LINE__)
#else
}
#endif

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

큰 도전! 이것은 믿을 수 없을 정도로 힘들었지 만 지금은 유효한 프로그램이 있다고 확신합니다!

에 대괄호 main가 if 만 포함되므로 개행 문자를 제거 할 수 없도록 전 처리기 명령을 사용 합니다 __LINE__==6. 또한 떠 다니는 main잎이 #endif떠 있기 때문에 완전히 지워지지 않도록합니다 (따라서 #endif외부에있는 것이 중요합니다 main).

내가 사용하는 #else내가 거기의 어떤 버전 없어 상당히 확신하게했기 때문에 __LINE__==6문자열 제거가 여전히 모두 있기 때문에, 사실이 될 수없는 그 6__LINE__자신이 truthy 있습니다로. 또한 -Werror=undef같은 #ifdef(LINE__)것을 거짓으로 평가하지 않지만 오류입니다.

gcc (최소한 Linux에서는)를 사용하면 puts인쇄 된 문자 수 (후행 줄 바꿈 포함)를 puts("...")/6반환 0하므로 문자열의 일부를 제거하면 return이 만들어 지므로 1/0부동 소수점 예외가 발생합니다. 이 예외는 1/0무언가에 할당되어 있지 않으면 발생하지 않으므로 a=필수입니다.

오류, 일반적으로 구문 오류 또는 연결 오류를 만들지 않고는 줄의 다른 부분을 제거 할 수 없습니다.

보너스로, 이것은 아주 사소, 단지 추가 ++ C에 대한 86 바이트 솔루션을 제공 #include <cstdio>하고 선언 aint로서을 int. 온라인으로 사용해보십시오! (C ++)


내가 실수하지 않으면 1/줄 바꿈을 떠나는 동안 제거 할 수 있으며 여전히 실행 됩니다.
gastropner

@gastropner 맞아. 1내가 믿었던 이전 줄에 있어야했다.
Chris

슬프게도 같은 일이 있습니다. 그런 다음를 제거 할 수 있습니다 =1. 나는 당신이 1 줄을 스스로 배치해야한다고 생각합니다.
gastropner

@gastropner 당신이 옳다고 생각합니다. 나중에 더 볼게요. 감사!
Chris

2

PHP, 73 바이트

<?=call_user_func(($p='ns')|(($f="u{$p}erialize"))?$f:'','s:5:"world"');

설명

기본 php.ini 구성을 가정합니다. 따라서 short_tags는 비활성화되어 있습니다. 이것은 =여는 태그에서를 제거 할 수 없음을 의미합니다 .

이것은 기본적으로 <?=unserialize('s:5:"world"');입니다.

직렬화 된 문자열의 일부를 제거하면 오류가 발생합니다.

간단히 제거 unserialize하면 스크립트가 직렬화 된 문자열을 출력합니다. 이것을 극복하기 위해 사용 call_user_func합니다. 매개 변수 중 하나를 제거하면 오류가 발생합니다.

'<?=call_user_func('unserialize','s:5:"world"');

그러나을 제거 un하여 serialize함수 를 호출 할 수 있습니다 . 그래서 우리는 'ns`를 꺼냅니다. 문자를 제거해도 기능 이름이 올바르지 않습니다.

<?=call_user_func(($p='ns')&&($f="u{$p}erialize")?$f:'','s:5:"world"');

출력 태그와 함께 변수 할당을 사용하는 경우 인라인을 사용합니다. 사용하는 대신 &&'|' 하나를 &제거하거나 $f과제를 제거 하지 못하도록

를 제거 ='ns')&&($f="u{$p}erialize"하고 끝낼 수 있습니다 ($p)?$f:''. 따라서 주변에 괄호를 추가합니다 $f="u{$p}erialize".

노트

기술적으로 오류없이 시작 태그를 제거 할 수 있습니다. 그러나 이것은 더 이상 PHP 스크립트가 아니라 일반 텍스트 파일입니다.


2
마지막으로, 일반 텍스트 파일은 여전히 ​​유효한 PHP 프로그램 일 것입니다. 따라서 이것이 유효한지 확실하지 않습니다.
Calvin 's Hobbies

더 이상 PHP는 아니지만 일반 텍스트 / html이므로 더 이상 유효한 PHP 프로그램이 아닙니다.
Martijn

1

MATLAB (77)

bsxfun(@(c,b)arrayfun(@(x)getfield(c,{x}),conv(b,ismember(4,b))),'world',1:5)

시도 해봐

노트 :

CPR 또는 무언가를 디자인하는 @Optimiser의 조언에 따라, 제거 할 때 컴파일 오류가 발생하지 않는 예기치 않은 하위 문자열에 직면했습니다. 예 : arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),이 이전 편집에서 제거해 feval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')도 버그가 발생하지 않습니다! 또한, 최근 같은 에디션이 있었다 bsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)그리고 bsxfun(@(a,b)a,'world',1:5)당신이 어떻게 내 출력 콘솔에서 그들을 찾는 때에 대해 질문하면, 나는 아기처럼 울었다, 그래서 여기에 프로그램입니다 :

b=0;string='bsxfun(@(c,b)arrayfun(@(x)getfield(c,{x}),conv(b,ismember(4,b))),''world'',1:5)'
for u=1:numel(string),for j=u:numel(string)-2,try a=eval([string(1:u) string(j+2:end)]);catch(b); a=0;end; if a~=0, ['here is it : ' string(1:u) string(j+2:end)],end;end;end

원시적이지 않은 프로그램의 예

편집하다:

내 이전 코드 (오류가 아님)를 지적 한 @Martin 옆의 모든 사람들에게 감사합니다.


1

SmileBASIC, 63 바이트

REPEAT
A=1/(PRGSIZE(0,1)==63)?"world
UNTIL 1/(PRGSIZE(0,1)==63)

1

배나무 , 17 바이트

이 프로그램에는 높은 비트 세트 (유효한 UTF-8이 아니므로 TIO에 게시 할 수 없음)가있는 바이트가 포함되어 있으므로 xxd가역적 인 16 진 덤프가 있습니다.

00000000: 7072 696e 7427 776f 726c 6427 23cd 4290  print'world'#.B.
00000010: bf                                       .

설명

이것은 print'world'체크섬이 추가 된 것입니다. 나는 가능한 삭제로 인해 유효한 체크섬이있는 프로그램을 제공하지 않는다는 것을 무차별 강제로 확인 했으므로 삭제 후 오류가 발생합니다.

상당히 지루하지만 현재 리더와 관계가 있기 때문에 게시 할 가치가 있다고 생각했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.