Một chương trình tự xóa


22

Nếu một ngôn ngữ được biên dịch được sử dụng, chương trình phải xóa tệp thực thi được biên dịch (nhưng không cần xóa tệp nguồn). Nếu một ngôn ngữ thông dịch được sử dụng, chương trình phải xóa tệp nguồn.

Giá thầu mở của tôi:

Con trăn (29 ký tự)

import os;os.remove(__file__)

Chỉnh sửa: để ngăn các giải pháp như rm -rf / , chương trình không được xóa bất cứ thứ gì ngoại trừ tệp thực thi hoặc tệp nguồn.

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>


bản sao có thể có của Viết chương trình tự xóa
John Dvorak

2
@JanDvorak Câu hỏi đó chặt chẽ hơn, yêu cầu tệp .exe. Điều này là lỏng lẻo hơn.
EMBLEM

Hmm ... nếu tôi bỏ phiếu để đóng theo hướng ngược lại thì sao?
John Dvorak

3
Code-golf, không phổ biến cuộc thi ? À.
Justin

10
@Quincunx Tôi không tin vào các cuộc thi nổi tiếng. Mã thực không phải được xác nhận đầu tiên về tính thanh lịch của nó, nhưng tính chính xác của nó.
EMBLEM

Câu trả lời:


21

Tập lệnh Bash (7 ký tự, 7 byte)

rm "$0"

1
Không hoạt động nếu tên tệp script chứa khoảng trắng.
dùng80551

Có mắt quan sát! Tôi đã cập nhật tập lệnh để làm việc với các tệp có khoảng trắng trong đó. Chỉ thêm hai nhân vật nữa. Cảm ơn!
anthony.c

Điều này có hoạt động nếu tên tập tin chứa dấu ngoặc kép?
John Dvorak

1
@JanDvorak: Vâng. Bằng cách thực hiện đó sẽ là ví dụ ./the\"program, ./'the"program', './tha"program'. Tất cả đều hoạt động như dự định. (Báo giá nhu cầu để được thoát hoặc bằng dấu ngoặc đơn theo yêu cầu.) Sẽ cũng làm việc trên các tập tin có chứa tên bằng dòng mới, vv
Runium

1
@ StéphaneGourichon Có lẽ vì anh ta đang chạy rm "$0"trong vỏ Bash thay vì trong một tập lệnh bó . Bạn nên chỉnh sửa tiêu đề như vậy:# Bash script, 7 bytes
MD XF

15

Unix? (9):

#!/bin/rm

Một cổ điển. Sử dụng rmnhư thông dịch viên, để tự xóa ngay lập tức. Không phải là rất ngắn nhất mặc dù.


5
Hoặc nếu bạn muốn gian lận: một rmchương trình 0 byte .
nyuszika7h

1
Các #!dòng không tính vào điểm.
Pavel

@Phoenix: Nếu ngôn ngữ bạn sử dụng là bất thường; chỉ các #!dòng hoàn toàn tiêu chuẩn chỉ cung cấp tên của trình thông dịch mặc định của ngôn ngữ là 0. Đây là một #!dòng rất bất thường theo như Bash đi. (Không phải điều này thực sự hoạt động ở Bash, mặc dù có những ngôn ngữ khác nơi nó hoạt động.)

1
Đây thực sự không phải là một chương trình Bash (nếu bạn chạy nó một cách rõ ràng bằng cách sử dụng bash, nó sẽ không xóa bất cứ thứ gì). Đó là một thực thi UNIX / Linux. (Nó cũng hoạt động trong Perl, mà giả lập xử lý UNIX / Linux #!dòng để nó có thể được sử dụng để chạy shellscripts trên nền tảng mà không thể làm điều đó tự nhiên.)

@Pavel Hmm ... 0 byte?
ɐɔıʇǝɥʇuʎs

10

Mẻ - 6 byte

Del %0

Khá đơn giản. Lưu ý: Hoạt động ngay cả khi tên chứa khoảng trắng.


Chỉ khi tên tệp không có khoảng trắng.
Isiah Meadows

@impinball, xin lỗi?
khai mạc

Chỉ cần chỉ ra một lỗi nhỏ. Nếu bạn chỉ định DOS, thì không, nhưng nó sẽ dễ bị hỏng trong Windows (ví dụ: trong Tệp chương trình). Không cần lời xin lỗi.
Isiah Meadows

Xấu của tôi ... không sao đâu Tôi đã đánh giá sai rằng các trích dẫn không cần thiết trong trường hợp này bởi vì chúng được tự động đưa vào đây.
Isiah Meadows

Tất cả đều tốt. Thêm dấu ngã loại bỏ dấu ngoặc kép xung quanh. %~0.
khai mạc

9

Ruby, 14 ký tự

File.delete $0

$0 là một biến toàn cục đặc biệt chứa tên của tập lệnh hiện đang chạy.


Tôi khá chắc chắn rằng bạn có thể thả không gian.
Darren Stone

Đây là lý do tại sao tôi làm cho phiên bản câu hỏi của tôi nghiêm ngặt hơn nhiều. Ngôn ngữ diễn giải có thể làm điều đó mà không có vấn đề. Ý tưởng là một ứng dụng chạy tự nhiên không thể kéo tấm thảm ra khỏi bên dưới
Cruncher

6

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

5 byte

1 NEW

Vâng, đó là về đơn giản như nó được. NEWtạo một chương trình mới, vì vậy đặt nó ở bất cứ đâu trong chương trình của bạn sẽ xóa nó.

Bằng chứng về khái niệm trên IBM BASIC (đặt NEWdòng 40 cho rõ ràng):

* Vâng, tôi đã liệt kê mọi phiên bản BASIC cũ mà tôi đã thử nghiệm này (hoặc được sử dụng khá nhiều)


2
+1, Có một cái gì đó khá thi vị về điều này. Hiện hữu thậm chí.
Wossname

5

PHP, 17 ký tự

unlink(__FILE__);

6
Tôi không chắc tại sao mọi người lại đánh giá thấp điều này; nó hoàn toàn hợp lệ Tuy nhiên, bạn có thể muốn bao gồm một thẻ mở<?unlink(__FILE__);
primo

4
Chương trình PHP này in unlink(__FILE__);. Nó không xóa tập tin.
đúng vào

1
@rightprint nó hoạt động như được mô tả nếu bạn bao gồm một thẻ mở, mà tôi sẽ giả sử thêm
Darren H


3

Perl 5 (8 ký tự)

unlink$0

$0là tên tập lệnh và unlinkloại bỏ nó. Thông thường, ít nhất bạn sẽ thêm một khoảng trắng ở giữa để dễ đọc.




3

Con trăn, 18 tuổi

open(__file__,'w')

Mở chính nó trong chế độ chỉ viết, xóa chính nó.


9
Điều này cắt ngắn các tập tin. Nó không xóa nó.
đúng vào



1

Julia, 13 byte

rm(@__FILE__)

Đơn giản. Nhưng lâu hơn. : P


1

Vitsy + bash, 8 byte

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

Lua, 17 byte

os.remove(arg[0])

Điều này thực sự chỉ hoạt động nếu bạn chạy chương trình bằng cách gõ filepath đầy đủ, tức là
lua ~/Scripts/removeself.luasẽ hoạt động, nhưng lua removeself.luasẽ không, giả sử tên tệp removeself.luavà thư mục làm việc hiện tại của ~/Scripts.

Theo như tôi biết, không có cách nào để tìm ra filepath thực sự của một kịch bản, chỉ có các đối số được truyền cho nó. Tôi biết debug.getinfo(1).source, nhưng trong thử nghiệm của tôi, trò chơi đó có kết quả giống hệt như vậy arg[0]. Nếu bất cứ ai biết một cách để tìm filepath, xin vui lòng cho tôi biết.



1

JS, 37 byte

document.documentElement.innerHTML=""

Điều này có tính không? Nó giết javascript trên trang


Bạn không cần khoảng trống xung quanh=
lập trình

1

tcl, 18

file delete $argv0

bản demo - CHÚ Ý: Đây chỉ là bản demo một lần! Chỉ lần đầu tiên nó sẽ có thể chạy được. Vui lòng đặt nó vào poster gốc của câu hỏi. Để thử: nhấn Executenút. Khu vực màu xanh lá cây sẽ không báo cáo bất kỳ lỗi. Sau đó, bất kỳ lần nhấp tiếp theo nào vào Executenút sẽ dẫn đến not foundlỗi!


1

C, 32 byte

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

1
Missing }s are allowed in C? Wow!
CalculatorFeline

Nope, just a typo! My character count included the closing } but I apparently copy/pasted the snippet incorrectly. Thanks for pointing it out!
Josh

Well, since the anonymous downvoter doesn't feel like leaving a comment or retracting their vote, I have deleted my answer, which I based off of yours. You can golf this down to 29 bytes: main(c,v)int**v;{remove(*v);}
MD XF

@MDXF Tôi không chắc chắn nếu thay đổi char**thành int**hợp lệ về mặt kỹ thuật. Tôi lo lắng về các vấn đề liên kết tiềm năng.
Josh

1
@Josh Vâng; nó hoạt động ... vì vậy tôi không thấy tại sao không. Code golf là tất cả về việc sử dụng các phương pháp khủng khiếp không hợp lệ về mặt kỹ thuật.
MD XF

1

JavaScript (ES6), 13 byte

f=_=>delete f

Thử nó

Ghi nhật ký nguồn f, các cuộc gọi f(sẽ xóa f), cố gắng đăng nhập flại nhưng sẽ xuất hiện lỗi vì fhiện không xác định.

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



0

Julia - 25 byte

Viết phần này vào một tệp, sau đó bao gồm tệp include("<filename here>")và chạy f():

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

Rõ ràng đây là một hàm - Tôi không chắc người ta sẽ phát hiện ra tên tệp của tệp đang được chạy trực tiếp như thế nào (như một câu lệnh bao gồm không có định nghĩa hàm trong nó).


0

C ++, 137 byte.

Hoạt động hầu hết thời gian trên windows

#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 byte

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

Hầu hết thời gian?
Addison Crump

1
Bạn có thể tiết kiệm rất nhiều byte bằng cách loại bỏ các không gian không sử dụng #include <string>, loại bỏ các khoảng trắng bên ngoài và tạo C này, cho phép bạn loại bỏ intreturn. Ngoài ra, bạn cần #include <stdio.h>phải thực hiện công việc này, vì đó là nơi sprintfđược khai báo.
Mego

0

MATLAB, 36 byte

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

Lưu mã ở trên dưới dạng tệp m theo hướng dẫn tên tệp của Matlab.


0

VBA, 69 67 byte

Chương trình con không có đầu vào và tự xóa.

Yêu cầu mã bên dưới là dòng đầu tiên trong khung mã hoạt động và VBA có quyền truy cập đáng tin cậy vào mô hình Dự án VBE.

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

-2 byte để thay thế ActiveCodePanebằngCodePane(1)


0

T-SQL, 28 byte

CREATE PROC d AS DROP PROC d

Nó chỉ làm rơi / loại bỏ thủ tục và mã khi thực thi chính nó. Sử dụng:

EXECUTE d

0

shortC , 10 byte

Aremove(*@

Làm thế nào nó hoạt động:

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

Chương trình C tương đương:

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

0

Mã máy 8086/8088, 1 byte

aa    stosb

Giả định:

  • Các thanh ghi CS, IP, ES, DI và AL ban đầu đều là 0.
  • Mã này được đặt tại địa chỉ 0.

Lệnh stosblưu byte trong thanh ghi AL tại vị trí bộ nhớ được chỉ ra bởi ES và DI, sau đó tăng hoặc giảm DI. Trong trường hợp này, nó lưu byte 0 tại địa chỉ bộ nhớ 0, điều này xảy ra là nơi chính lệnh đó.

Cấp, chương trình này không xóa một tập tin hoặc bất cứ điều gì. Nhưng nếu bạn quản lý để có được bộ xử lý 8086, hãy đưa chương trình này vào bộ nhớ và chạy nó, trên thực tế nó sẽ ghi đè lên chính nó.

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.