Програма, яка видаляє себе


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

Хм ... а що, якщо я проголосую, щоб закрити в зворотному напрямку?
Джон Дворак

3
код-гольф, не популярність-конкурс ? Aww.
Джастін

10
@Quincunx Я не вірю в конкурси на популярність. Справжній код спочатку не підтверджується своєю елегантністю, а правильністю.
ЕМБЛЕМ

Відповіді:


21

Баш сценарій (7 символів, 7 байт)

rm "$0"

1
Не працює, якщо ім'я файлу сценарію містить пробіли.
користувач80551

Добре око! Я оновив сценарій для роботи з файлами з пробілами в них. Тільки додає ще два символи. Спасибі!
anthony.c

Чи працює це, якщо ім'я файлу містить подвійні лапки?
Джон Дворак

1
@JanDvorak: Так. До виконання , яке було б , наприклад ./the\"program, ./'the"program', './tha"program'. Всі роботи за призначенням. (Котирування потрібно уникати або вкладати в єдині лапки під час дзвінка.) Також буде працювати над файлами, що містять імена з
новим

1
@ StéphaneGourichon Мабуть тому, що він працює rm "$0"в оболонці Bash замість пакетного сценарію . Ви повинні редагувати заголовок так:# Bash script, 7 bytes
MD XF

15

Unix? (9):

#!/bin/rm

Класика. Використовується rmяк інтерпретатор для миттєвого самовидалення. Не дуже короткий, хоча.


5
Або якщо ви хочете бути обманливими: програма на 0 байтів rm.
nyuszika7h

1
#!Лінії не враховуються в рахунку.
Павло

@Phoenix: це незвично для мови, якою ви користуєтеся; лише абсолютно стандартні #!рядки, які просто дають ім'я інтерпретатора за замовчуванням мови, вважаються нулем. Це дуже незвичайна #!лінія, наскільки йде Баш. (Не те, що це насправді працює на Bash, хоча там працюють інші мови.)

1
Це насправді не програма Bash (якщо ви запускаєте її явно за допомогою bash , вона нічого не видалить). Це виконуваний файл UNIX / Linux. (Він також працює в Perl, який імітує обробку #!ліній UNIX / Linux, щоб його можна було використовувати для запуску оболонок на платформах, які не можуть це зробити на

@Pavel Хм ... 0 байт?
ɐɔıʇǝɥʇuʎs

10

Пакетна - 6 байт

Del %0

Досить просто. Примітка. Працює навіть якщо ім'я містить пробіли.


Тільки якщо в назві файла немає пробілів.
Іся Медоуз

@impinball, вибачте?
нечисте

Тільки вказуючи на маленьку помилку. Якщо ви вказали DOS, це не так, але він зламається досить легко в Windows (наприклад, у програмних файлах). Ніяких вибачень не потрібно.
Ісія Медоуз

Моє погано ... це добре. Я згадав, що лапки в цьому випадку не потрібні, оскільки вони автоматично включаються до цього.
Іся Медоуз

Все добре. Додавання тильду видаляє навколишні лапки. %~0.
нечисте

9

Рубі, 14 символів

File.delete $0

$0 - це спеціальна глобальна змінна, яка містить ім'я поточного запущеного сценарію.


Я впевнений, що ви можете скинути місце.
Даррен Стоун

Ось чому я зробив свою версію питання набагато суворішою. Інтерпретовані мови можуть це робити без проблем. Ідея полягає в тому, що натиснута програма не може просто витягнути килим з-під себе
Cruncher

6

BASIC-80 / BASICA / GW-BASIC / IBM BASIC / Commodore 64 BASIC / Vintage BASIC / ЖК-дисплей Commodore BASIC / Atari BASIC *

5 байт

1 NEW

Ну, це так просто, як це виходить. NEWстворює нову програму, тож помістивши це де-небудь у вашій програмі, її буде видалено.

Доказ концепції в IBM BASIC (розміщення NEWв рядку 40 для ясності):

* Так, я перерахував кожну стару версію BASIC, яку я перевірив (або майже коли-небудь використовувану)


2
+1, в цьому є щось досить поетичне. Екзистенціальний рівний.
Wossname

5

PHP, 17 символів

unlink(__FILE__);

6
Я не впевнений, чому хтось спростував би це; це абсолютно дійсно. Можливо, ви хочете включити відкритий тег<?unlink(__FILE__);
прим

4
Ця програма PHP друкує unlink(__FILE__);. Він не видаляє файл.
праворуч

1
@rightfold працює так, як описано, якщо ви включите тег відкриття, який я б припустив додати
Darren H


3

Perl 5 (8 символів)

unlink$0

$0- це ім'я сценарію та unlinkвидаляє його. Зазвичай вам слід принаймні додати пробіл між ними для читання.








1

Vitsy + bash, 8 bytes

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 bytes

os.remove(arg[0])

This actually only works if you run the program by typing out the full filepath, i.e.
lua ~/Scripts/removeself.lua would work, but lua removeself.lua would not, assuming a filename of removeself.lua and a current working directory of ~/Scripts.

As far as I know, there's no way to find the actual filepath of a script, just the arguments passed to it. I do know about debug.getinfo(1).source, but in my testing that game exactly the same results as arg[0]. If anyone knows of a way to find the filepath, please let me know.




1

tcl, 18

file delete $argv0

demoATTENTION: It is only a one time demo! Only the first time it will be runnable. Please reserve it to the question's original poster. To try: press the Execute button. The green area will not report any error. After that, any subsequent clicks on the Execute button will result on a not found error!


1

C, 32 bytes

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 I am not sure if changing char** to int** is technically valid. I'm worried about potential alignment issues.
Josh

1
@Josh Well; it works... so I don't see why not. Code golf is all about using horrible methods that aren't technically valid.
MD XF

1

JavaScript (ES6), 13 bytes

f=_=>delete f

Try It

Logs the source of f, calls f (which deletes f), tries to log f again but throws an error because f is now undefined.

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



0

Julia - 25 bytes

Write this into a file, and then include the file with include("<filename here>") and run f():

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

This is, obviously, a function - I'm not sure how one would go about detecting the file name of a file being run directly (as an include statement without a function definition in it).


0

C++, 137 bytes.

Works most of the time on 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 bytes

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

Most of the time?
Addison Crump

1
You could save a lot of bytes by removing the unused #include <string>, removing extraneous spaces, and making this C, which lets you remove the int and return. Additionally, you need #include <stdio.h> to make this work, since that's where sprintf is declared.
Mego

0

MATLAB, 36 bytes

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

Save the above code as an m-file following Matlab's filename guidelines.


0

VBA, 69 67 Bytes

Subroutine that takes no input and deletes itself.

Requires that the code below be the first line in the active code pane, and that VBA has trusted access to the VBE Project model.

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

-2 bytes for replacing ActiveCodePane with with CodePane(1)


0

T-SQL, 28 bytes

CREATE PROC d AS DROP PROC d

It just drops/removes the procedure and the code when executing itself. Usage:

EXECUTE d

0

shortC, 10 bytes

Aremove(*@

How it works:

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

Equivalent C program:

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

0

8086/8088 machine code, 1 byte

aa    stosb

Assumptions:

  • The registers CS, IP, ES, DI, and AL are all initially 0.
  • This code is placed at address 0.

The stosb instruction stores the byte in the AL register at the memory location pointed to by ES and DI, then increments or decrements DI. In this case, it stores the byte 0 at the memory address 0, which happens to be where the instruction itself is.

Granted, this program doesn't delete a file or anything. But if you manage to get your hands on an 8086 processor, poke this program into memory, and run it, it will in fact overwrite itself.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.