Программа, которая удаляет себя


22

Если используется скомпилированный язык, программа должна удалить скомпилированный исполняемый файл (но не нужно удалять исходный файл). Если используется интерпретированный язык, программа должна удалить исходный файл.

Моя начальная ставка:

Python (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. Это более слабый.
ЭМБЛЕМА

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

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

10
@Quincunx Я не верю в конкурсы популярности. Настоящий код сначала не проверяется на его элегантность, но на правильность.
ЭМБЛЕМА

Ответы:


21

Скрипт Bash (7 символов, 7 байтов)

rm "$0"

1
Не работает, если имя файла скрипта содержит пробелы.
user80551

Хороший глаз! Я обновил скрипт для работы с файлами с пробелами в них. Только добавляет еще два символа. Благодарность!
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. (Не то, чтобы это на самом деле работало в Bash, хотя есть и другие языки, на которых это работает.)

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

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

10

Пакет - 6 байт

Del %0

Довольно просто Примечание: работает, даже если имя содержит пробелы.


Только если в имени файла нет пробелов.
Исия Медоуз

@impinball, прости?
unclemeat

Просто указываю на небольшую ошибку. Если вы укажете DOS, это не так, но в Windows это довольно легко сломается (например, в Program Files). Никаких извинений не требуется.
Исия Медоуз

Мой плохой ... все в порядке. Я неправильно запомнил, что кавычки не нужны в этом случае, потому что они автоматически включаются в это.
Исия Медоуз

Все хорошо. Добавление тильды удаляет окружающие цитаты. %~0,
unclemeat

9

Рубин, 14 знаков

File.delete $0

$0 это специальная глобальная переменная, которая содержит имя запущенного в данный момент скрипта.


Я почти уверен, что вы можете оставить это место.
Даррен Стоун

Вот почему я сделал свою версию вопроса гораздо более строгой. Интерпретированные языки могут сделать это без проблем. Идея состоит в том, что нативно работающее приложение не может просто вытащить коврик из-под себя
Cruncher

6

Бейсик-80 / Бейсика / GW-Бейсик / IBM Бейсик / Коммодор 64 Бейсик / Винтаж Бейсик / Коммодор ЖК Бейсик / Atari Бейсик *

5 байт

1 NEW

Ну, это так просто, как только может. NEWсоздает новую программу, поэтому, поместив это в любое место в вашей программе, вы удалите ее.

Подтверждение концепции IBM BASIC ( NEWдля ясности в строке 40):

* Да, я перечислил каждую старую версию BASIC, в которой я проверял это (или почти всегда использовал)


2
+1, в этом есть что-то довольно поэтичное. Экзистенциально даже.
Wossname

5

PHP, 17 символов

unlink(__FILE__);

6
Я не уверен, почему кто-то понизит это; это совершенно верно. Вы можете включить открытый тег, хотя<?unlink(__FILE__);
primo

4
Эта программа PHP печатает unlink(__FILE__);. Это не удаляет файл.
правостороннее

1
@ Rightfold это работает, как описано, если вы включите открывающий тег, который я бы предположил добавить
Даррен H


3

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

unlink$0

$0имя скрипта и unlinkудаляет его. Обычно, вы бы хотя бы добавили пробел между ними для удобства чтения.








1

Витси + Баш, 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

Lua, 17 байт

os.remove(arg[0])

На самом деле это работает, только если вы запустите программу, введя полный путь к файлу, то есть
lua ~/Scripts/removeself.luaсработает, но lua removeself.luaне сработает, предполагая имя файла removeself.luaи текущий рабочий каталог ~/Scripts.

Насколько я знаю, нет никакого способа найти фактический путь к файлу скрипта, только передаваемые ему аргументы. Я знаю об этом debug.getinfo(1).source, но в моем тестировании эта игра показала те же результаты, что и arg[0]. Если кто-нибудь знает способ найти путь к файлу, пожалуйста, дайте мне знать.




1

ткл, 18

file delete $argv0

демо - ВНИМАНИЕ: Это только одноразовая демонстрация! Только в первый раз он будет запущен. Пожалуйста, зарезервируйте его для оригинального постера вопроса. Чтобы попробовать: нажмите Executeкнопку. Зеленая область не сообщит ни об одной ошибке. После этого любые последующие нажатия на Executeкнопку приведут к not foundошибке!


1

C, 32 байта

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

1
Отсутствующие }s разрешены в C? Вот Это Да!
CalculatorFeline

Нет, просто опечатка! Мой счетчик символов включал закрытие, }но я, видимо, неправильно скопировал / вставил фрагмент. Спасибо за указание на это!
Джош

Ну, так как анонимный пользователь не хочет оставлять комментарий или отозвать свой голос, я удалил свой ответ, который я основал на вашем. Вы можете main(c,v)int**v;{remove(*v);}
MD XF

@MDXF Я не уверен, что переход char**на int**технически действителен. Я беспокоюсь о возможных проблемах выравнивания.
Джош

1
@ Джош Хорошо; это работает ... так что я не понимаю, почему нет. Код-гольф - это все, что связано с использованием ужасных методов, которые технически недопустимы.
MD XF

1

JavaScript (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])

Это, очевидно, функция - я не уверен, как можно определить имя файла для запускаемого файла (как оператора включения без определения функции в нем).


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);} 

Большую часть времени?
Эддисон Крамп

1
Вы можете сэкономить много байтов, удаляя неиспользуемые #include <string>, удаляя лишние пробелы, и создавая этот C, который позволяет вам удалять intи return. Кроме того, вам нужно #include <stdio.h>сделать эту работу, так как это, где sprintfобъявлено.
Mego

0

MATLAB, 36 байт

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

Сохраните приведенный выше код в виде m-файла, следуя указаниям Matlab по именам файлов.


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магазинах команд байт в регистре AL в ячейке памяти , на которую указывает ES и DI, а затем увеличивает или уменьшает DI. В этом случае он хранит байт 0 по адресу памяти 0, который находится там, где находится сама инструкция.

Конечно, эта программа не удаляет файл или что-либо еще. Но если вам удастся заполучить процессор 8086, вставить эту программу в память и запустить ее, она фактически перезапишет себя.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.