스스로 삭제하는 프로그램


22

컴파일 된 언어가 사용되는 경우 프로그램은 컴파일 된 실행 파일을 삭제해야하지만 소스 파일은 삭제할 필요가 없습니다. 해석 된 언어가 사용되는 경우 프로그램은 소스 파일을 삭제해야합니다.

내 첫 입찰 :

파이썬 (29 자)

import os;os.remove(__file__)

편집 : rm -rf / 와 같은 솔루션을 방지하기 위해 프로그램은 실행 파일이나 소스 파일 이외의 것을 삭제해서는 안됩니다.

html,body{margin:0;padding:0;height:100%;overflow:hidden}
 <iframe src="https://xmikee1.github.io/ppcg-leaderboard/?id=19355" width="100%" height="100%" style="border:none;">Oops, your browser is too old to view this content! Please upgrade to a newer version of your browser that supports HTML5.</iframe>



2
@JanDvorak이 질문은 더 엄격해서 .exe 파일이 필요합니다. 이것은 더 허술하다.
EMBLEM

흠 ... 반대 방향으로 투표하면 어떻게 되나요?
John Dvorak

3
인기 대회가 아닌 코드 골프 ? 앗
Justin

10
@Quincunx 나는 인기 콘테스트를 믿지 않습니다. 실제 코드는 먼저 우아함이 검증되지 않고 정확성이 검증됩니다.
EMBLEM

답변:


21

배쉬 스크립트 (7 자, 7 바이트)

rm "$0"

1
스크립트 파일 이름에 공백이 있으면 작동하지 않습니다.
user80551

좋은 눈! 공백이있는 파일로 작업 할 수 있도록 스크립트를 업데이트했습니다. 두 문자 만 더 추가합니다. 감사!
anthony.c

파일 이름에 큰 따옴표가 포함되어 있으면 작동합니까?
John Dvorak

1
@ JanDvorak : 그렇습니다. 예를 들어 것입니다 실행하여 ./the\"program, ./'the"program', './tha"program'. 모든 것이 의도 한대로 작동합니다. (따옴표는 이스케이프하거나 호출시 작은 따옴표로 묶어야합니다.) 줄 바꿈 등의 이름이 포함 된 파일에서도 작동합니다.
Runium

1
@ StéphaneGourichon 아마도 배치 스크립트 대신 rm "$0"Bash 에서 실행 중일 수 있습니다 . 다음과 같이 헤더를 편집해야합니다.# Bash script, 7 bytes
MD XF

15

유닉스? (9) :

#!/bin/rm

고전. rm즉각적인 자기 삭제를 위해 통역사로 사용합니다 . 그러나 가장 짧은 것은 아닙니다.


5
또는 당신이 건의를 원한다면 : 0 바이트 rm프로그램.
nyuszika7 시간

1
#!라인은 점수에 계산되지 않습니다.
Pavel

@Phoenix : 사용중인 언어가 특이한 경우입니다. #!언어의 기본 인터프리터 이름을 0으로 지정하는 완전한 표준 행만 사용합니다. 이것은 #!Bash가가 는 한 매우 특이한 라인입니다. (실제로 다른 언어가 있지만 Bash에서는 실제로 작동하지는 않습니다.)

1
이것은 실제로 Bash 프로그램이 아닙니다 (을 사용하여 명시 적으로 실행하면 bash아무것도 삭제되지 않습니다). UNIX / Linux 실행 파일입니다. (또한 Perl에서 작동하는데, 이는 UNIX / Linux의 #!행 처리를 에뮬레이트 하여 기본적으로 수행 할 수없는 플랫폼에서 쉘 스크립트를 실행하는 데 사용할 수 있습니다.)

@Pavel 흠 ... 0 바이트?
ɐɔıʇǝɥʇuʎs

10

배치-6 바이트

Del %0

꽤 간단합니다. 참고 : 이름에 공백이 포함 된 경우에도 작동합니다.


파일 이름에 공백이없는 경우에만.
Isiah Meadows

@impinball, 미안?
unclemeat

약간의 버그를 지적하십시오. DOS를 지정하면 그렇지 않지만 Windows (예 : 프로그램 파일)에서는 쉽게 깨질 수 있습니다. 사과 할 필요가 없습니다.
Isiah Meadows

내 나쁜 ... 괜찮아. 나는이 경우 따옴표가 자동으로 포함되기 때문에 따옴표가 필요하지 않다는 것을 기억했다.
Isiah Meadows

문제 없다. 물결표를 추가하면 주변 인용 부호가 제거됩니다. %~0.
unclemeat

9

루비, 14 자

File.delete $0

$0 현재 실행중인 스크립트의 이름을 포함하는 특수 전역 변수입니다.


나는 당신이 공간을 떨어 뜨릴 수 있다고 확신합니다.
대런 스톤

이것이 내가 질문의 버전을 훨씬 더 엄격하게 한 이유입니다. 통역 된 언어는 문제없이 수행 할 수 있습니다. 아이디어는 기본적으로 실행되는 응용 프로그램은 그 자체에서 깔개를 끌어낼 수 없다는 것입니다
Cruncher

6

BASIC-80 / BASICA / GW-BASIC / IBM BASIC / Commodore 64 BASIC / Vintage BASIC / Commodore LCD BASIC / Atari BASIC *

5 바이트

1 NEW

글쎄, 그것은 얻는 것만 큼 간단합니다. NEW새로운 프로그램을 생성하므로 프로그램의 아무 곳에 나 넣으면 삭제됩니다.

IBM BASIC의 개념 증명 ( NEW명확성을 위해 40 행에 입력) :

* 예, 나는 이것을 테스트 한 모든 이전 기본 버전을 나열했습니다 (또는 거의 사용되었습니다)


2
+1, 이것에 대해 다소 시적인 것이 있습니다. 존재조차도.
Wossname

5

PHP, 17 자

unlink(__FILE__);

6
왜 누군가가 이것을 다운 피트했는지 모르겠습니다. 완벽하게 유효합니다. 하지만 공개 태그를 포함하고 싶을 수도 있습니다<?unlink(__FILE__);
primo

4
이 PHP 프로그램은 인쇄합니다 unlink(__FILE__);. 파일을 삭제하지 않습니다.
rightfold

1
@rightfold 시작 태그를 포함하면 설명 된대로 작동합니다. 추가 할 것으로 가정합니다
Darren H


3

Perl 5 (8 자)

unlink$0

$0스크립트 이름이며 unlink제거합니다. 일반적으로 가독성을 위해 사이에 공백을 추가해야합니다.







1

줄리아, 13 바이트

rm(@__FILE__)

단순한. 그러나 더 길다. :피


1

Vitsy + bash, 8 바이트

iG' mr',

iG       Get the name of the use declaration at the top item (-1) (returns the current one)
  ' mr'  Concatenate "rm " to the front of it.
       , Execute via shell.

1

매스 매 티카, 29 바이트

DeleteFile@NotebookFileName[]

1

루아, 17 바이트

os.remove(arg[0])

이것은 실제로 전체 파일 경로를 입력하여 프로그램을 실행하는 경우에만 작동합니다. 즉 , 파일 이름 과 현재 작업 디렉토리를 가정하면
lua ~/Scripts/removeself.lua작동 lua removeself.lua하지 않습니다 .removeself.lua~/Scripts

내가 아는 한 스크립트의 실제 파일 경로를 찾을 수있는 방법이 없으며 인수 만 전달됩니다. 나는 알고 debug.getinfo(1).source있지만 테스트에서 그 게임과 정확히 같은 결과를 얻습니다 arg[0]. 파일 경로를 찾는 방법을 아는 사람이 있으면 알려주십시오.




1

tcl, 18

file delete $argv0

데모주의 : 한 번만 데모입니다! 처음으로 실행할 수 있습니다. 질문의 원래 포스터에 예약하십시오. 시도하려면 : Execute버튼을 누릅니다. 녹색 영역은 오류를보고하지 않습니다. 그 후, Execute버튼을 클릭 하면 not found오류가 발생합니다!


1

C, 32 바이트

main(c,v)char**v;{remove(v[0]);}

1
}C에서 누락 된 것이 허용됩니까? 와우!
CalculatorFeline

아니, 오타 야! 내 문자 수에는 닫힘이 포함 }되었지만 스 니펫을 잘못 복사 / 붙여 넣었습니다. 지적 해 주셔서 감사합니다!
Josh

익명의 downvoter는 의견을 남기거나 투표를 철회하는 느낌이 들지 않기 때문에 귀하의 답변을 삭제했습니다. 이것을 29 바이트까지 골프 main(c,v)int**v;{remove(*v);}
MD XF

변화하는 경우 @MDXF 나는 확실하지 오전 char**에하는 것이 int**기술적으로 유효합니다. 잠재적 인 정렬 문제가 걱정됩니다.
Josh

1
@ 조쉬 음; 그것은 작동합니다 ... 그래서 나는 왜 안 보입니까. 코드 골프는 기술적으로 유효하지 않은 끔찍한 방법을 사용하는 것입니다.
MD XF

1

자바 스크립트 (ES6), 13 바이트

f=_=>delete f

시도 해봐

의 소스를 f호출하고 f( 호출 을 삭제하는 f) 호출 을 f다시 시도 하지만 f이제 정의되지 않았 으므로 오류가 발생 합니다.

f=_=>delete f
console.log(f)
f()
console.log(f)



0

줄리아-25 바이트

이것을 파일에 쓴 다음 파일을 포함하고 다음 include("<filename here>")을 실행하십시오 f().

f()=rm(functionloc(f)[1])

이것은 분명히 함수입니다-직접 실행중인 파일의 파일 이름을 감지하는 방법을 모르겠습니다 (함수 정의가없는 include 문으로).


0

C ++, 137 바이트

대부분의 시간 동안 창문에서 작동

#include <stdlib.h> 
#include <string>
int main(int, char*v[]){char c[99];sprintf(c,"start cmd /C del \"%s\"/Q", *v);return system(c);}

C, 90 바이트

void main(int n,char**v){char c[99];sprintf(c,"start cmd /C del \"%s\"/Q", *v);system(c);} 

대부분의 시간?
Addison Crump 8

1
당신은 사용되지 않는를 제거하여 바이트를 많이 절약 할 수 #include <string>당신은 제거 할 수 있습니다이 C, 불필요한 공간을 제거하고, 만들기 int등을 return. 또한 #include <stdio.h>이 작업 sprintf이 선언 된 위치 이므로이 작업을 수행 해야 합니다 .
Mego

0

MATLAB, 36 바이트

delete([mfilename('fullpath'),'.m'])

Matlab의 파일 이름 지침에 따라 위 코드를 m 파일로 저장하십시오.


0

VBA, 69 67 바이트

입력을받지 않고 스스로 삭제하는 서브 루틴.

아래 코드가 활성 코드 창의 첫 번째 행이어야하고 VBA가 VBE 프로젝트 모델에 대한 신뢰할 수있는 액세스 권한이 있어야합니다.

Sub a:Application.VBE.CodePanes(1).CodeModule.DeleteLines 1:End Sub

교체 -2 바이트 ActiveCodePane와 함께CodePane(1)


0

T-SQL, 28 바이트

CREATE PROC d AS DROP PROC d

자체 실행시 프로 시저와 코드를 삭제 / 제거합니다. 용법:

EXECUTE d

0

shortC , 10 바이트

Aremove(*@

작동 방식 :

A           main function
 remove(    delete file specified in next string
        *@  program name

동등한 C 프로그램 :

int main(int argc, char **argv){remove(*argv);}

0

8086/8088 기계 코드, 1 바이트

aa    stosb

가정 :

  • 레지스터 CS, IP, ES, DI 및 AL은 모두 초기에 0입니다.
  • 이 코드는 주소 0에 있습니다.

stosb명령어는 ES 및 DI가 가리키는 메모리 위치의 AL 레지스터에 바이트를 저장 한 다음 DI를 증가 또는 감소시킵니다. 이 경우 메모리 주소 0에 바이트 0을 저장합니다.이 주소는 명령 자체의 위치입니다.

물론이 프로그램은 파일이나 어떤 것도 삭제하지 않습니다. 그러나 8086 프로세서를 손에 넣고이 프로그램을 메모리에 넣고 실행하면 실제로 덮어 씁니다.

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