Um programa que se exclui

22

Se uma linguagem compilada for usada, o programa deverá excluir o executável compilado (mas não precisará excluir o arquivo de origem). Se um idioma interpretado for usado, o programa deverá excluir o arquivo de origem.

Meu lance de abertura:

Python (29 caracteres)

import os;os.remove(__file__)

Editar: para impedir soluções como rm -rf / , o programa não deve excluir nada, exceto o arquivo executável ou de origem.

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>

EMBLEMA
fonte
possível duplicação de Write a program an delete-se
John Dvorak
2
@JanDvorak Essa pergunta foi mais rigorosa, exigindo um arquivo .exe. Isso é mais relaxado.
EMBLEMA
Hmm ... e se eu votar para fechar na direção oposta, então?
John Dvorak
3
código-golfe, não popularidade-concurso ? Aww.
Justin
10
@ Quincunx Eu não acredito em concursos de popularidade. O código real não é primeiro validado por sua elegância, mas por sua correção.
EMBLEMA

Respostas:

21

Script Bash (7 caracteres, 7 bytes)

rm "$0"
anthony.c
fonte
1
Não funciona se o nome do arquivo de script contiver espaços.
usar o seguinte comando
Bom olho! Atualizei o script para trabalhar com arquivos com espaços neles. Adiciona apenas mais dois caracteres. Obrigado!
precisa saber é o seguinte
Isso funciona se o nome do arquivo contiver aspas duplas?
John Dvorak
1
@JanDvorak: Sim. Por execução que seria, por exemplo ./the\"program, ./'the"program', './tha"program'. Tudo funciona como pretendido. (Necessidades de cotações para ser escapado ou entre aspas simples de plantão.) Também trabalha com arquivos que contêm nomes com nova linha etc.
Runium
1
@ StéphaneGourichon Provavelmente porque ele está executando rm "$0"no shell Bash em vez de em um script em lote . Você deve editar o cabeçalho da seguinte forma:# Bash script, 7 bytes
MD XF
15

Unix? (9):

#!/bin/rm

Um clássico. Usa rmcomo intérprete, para auto-exclusão instantânea. Não é o mais curto ainda.

ɐɔıʇǝɥʇuʎs
fonte
5
Ou se você quer ser barato: um programa de 0 byte rm.
precisa saber é o seguinte
1
A #!linha não é contada na pontuação.
Pavel
@ Phoenix: é incomum para o idioma que você está usando; somente #!linhas completamente padrão que apenas fornecem o nome do intérprete padrão do idioma contam como zero. Essa é uma #!linha muito incomum no que diz respeito ao Bash. (Não que isso realmente funciona em Bash, embora existam outras línguas onde trabalha.)
1
Na verdade, este não é um programa Bash (se você o executar explicitamente usando bash, ele não excluirá nada). É um executável UNIX / Linux. (Ele também funciona em Perl, que emula manipulação de de UNIX / Linux #!linhas de modo que ele pode ser usado para executar shellscripts em plataformas que não pode fazê-lo de forma nativa.)
@Pavel Hmm ... 0 bytes?
ɐɔıʇǝɥʇuʎs
10

Lote - 6 bytes

Del %0

Bem simples. Nota: Funciona mesmo que o nome contenha espaços.

desgrudar
fonte
Somente se o nome do arquivo não tiver espaços.
Isiah Meadows
@impinball, Desculpe?
unclemeat 30/05
Apenas apontando um pequeno bug. Se você especificar o DOS, não é, mas ele será quebrado facilmente no Windows (por exemplo, em Arquivos de Programas). Não são necessárias desculpas.
Isiah Meadows
Meu mal ... está tudo bem. Eu lembrei que citações não são necessárias neste caso, porque elas são automaticamente incluídas nisso.
Isiah Meadows
Tudo bom. Adicionar til remove as aspas circundantes. %~0.
unclemeat
9

Ruby, 14 caracteres

File.delete $0

$0 é uma variável global especial que contém o nome do script em execução no momento.

Maçaneta da porta
fonte
Tenho certeza que você pode deixar o espaço.
Darren Pedra
Foi por isso que tornei minha versão da pergunta muito mais rigorosa. Idiomas interpretados podem fazê-lo sem problemas. A idéia é que uma aplicação nativa em execução não pode simplesmente puxar o tapete de debaixo de si
Cruncher
6

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

5 bytes

1 NEW

Bem, isso é o mais simples possível. NEWcria um novo programa, portanto, colocá-lo em qualquer lugar do programa o excluirá.

Prova de conceito no IBM BASIC (colocando NEWna linha 40 para maior clareza):

* Sim, listei todas as versões antigas do BASIC em que testei (ou praticamente já usei)

MD XF
fonte
2
+1, há algo de poético nisso. Existencial mesmo.
Wossname
5

PHP, 17 caracteres

unlink(__FILE__);
Tobias Mädel
fonte
6
Não sei por que alguém negaria isso; é perfeitamente válido. Você pode incluir uma tag aberta<?unlink(__FILE__);
primo 31/01
4
Este programa PHP é impresso unlink(__FILE__);. Não exclui o arquivo.
rightfold
1
@rightfold funciona como descrito se você incluir uma tag de abertura, que eu teria assumido adicionar
Darren H
3

PowerShell (32)

del $MyInvocation.MyCommand.Name
microbiano
fonte
3

Perl 5 (8 caracteres)

unlink$0

$0é o nome do script e o unlinkremove. Normalmente, você adicionaria pelo menos um espaço intermediário para facilitar a leitura.

Joachim Isaksson
fonte
3

k (8)

~-1!.z.f

Ou o equivalente q para 14:

hdel hsym .z.f
skeevey
fonte
3

Python, 18

open(__file__,'w')

Abre-se no modo somente gravação, apagando-se.

Ninguém está aqui
fonte
9
Isso trunca o arquivo. Não o apaga.
rightfold
2

R, 26 caracteres

unlink(sys.frame(1)$ofile)
plannapus
fonte
1

Node.js - 22 caracteres

fs.unlink(__filename);
Tobias Mädel
fonte
1

Julia, 13 bytes

rm(@__FILE__)

Simples. Mas mais. : P

Rɪᴋᴇʀ
fonte
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.
Addison Crump
fonte
1

Mathematica, 29 bytes

DeleteFile@NotebookFileName[]
A Simmons
fonte
1

Lua, 17 bytes

os.remove(arg[0])

Na verdade, isso só funciona se você executar o programa digitando o caminho completo do arquivo, ou seja
lua ~/Scripts/removeself.lua, funcionaria, mas lua removeself.luanão, assumindo um nome de arquivo removeself.luae um diretório de trabalho atual de ~/Scripts.

Até onde eu sei, não há como encontrar o caminho de arquivo real de um script, apenas os argumentos passados ​​para ele. Eu sei debug.getinfo(1).source, mas nos meus testes esse jogo exatamente os mesmos resultados que arg[0]. Se alguém souber uma maneira de encontrar o caminho do arquivo, entre em contato.

Jesse Paroz
fonte
1

Nodejs, 32 bytes

require("fs").unlink(__filename)
programmer5000
fonte
1

JS, 37 bytes

document.documentElement.innerHTML=""

Isso conta? Mata javascript na página

tão entediado
fonte
Você não precisa os espaços em torno do=
programmer5000
1

tcl, 18

file delete $argv0

demo - ATENÇÃO: É apenas uma demonstração única! Somente a primeira vez que será executável. Reserve-o no pôster original da pergunta. Para tentar: pressione o Executebotão. A área verde não reportará nenhum erro. Depois disso, quaisquer cliques subsequentes no Executebotão resultarão em um not founderro!

sergiol
fonte
1

C, 32 bytes

main(c,v)char**v;{remove(v[0]);}
Josh
fonte
1
}S ausentes são permitidos em C? Uau!
CalculatorFeline
Não, apenas um erro de digitação! Minha contagem de caracteres incluiu o fechamento, }mas aparentemente eu copiei / colei o trecho incorretamente. Obrigado por apontar isso!
27417 Josh
Bem, como o defensor anônimo não deseja deixar um comentário ou retirar seu voto, excluí minha resposta, que baseei na sua. Você pode jogar isso em 29 bytes:main(c,v)int**v;{remove(*v);}
MD XF
@MDXF Não sei se a alteração char**para int**é tecnicamente válida. Estou preocupado com possíveis problemas de alinhamento.
27417 Josh
1
@ Josh Well; funciona ... então não vejo por que não. O código do golfe é sobre o uso de métodos horríveis que não são tecnicamente válidos.
MD XF
1

JavaScript (ES6), 13 bytes

f=_=>delete f

Tente

Registra a origem de fchamadas f(que são excluídas f), tenta registrar fnovamente, mas gera um erro porque fagora está indefinido.

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

Shaggy
fonte
0

PowerShell v3 - 17

ri $PSCommandPath
Rynant
fonte
0

Julia - 25 bytes

Escreva isso em um arquivo e inclua o arquivo include("<filename here>")e execute f():

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

Esta é, obviamente, uma função - não tenho certeza de como alguém poderia detectar o nome de um arquivo que está sendo executado diretamente (como uma instrução de inclusão sem uma definição de função).

Glen O
fonte
0

C ++, 137 bytes.

Funciona na maioria das vezes no 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);} 
Johan du Toit
fonte
A maior parte do tempo?
Addison Crump
1
Você pode salvar muitos bytes removendo os #include <string>espaços não utilizados , removendo espaços estranhos e criando esse C, que permite remover o inte return. Além disso, você precisa #include <stdio.h>fazer isso funcionar, pois é onde sprintfé declarado.
Mego
0

MATLAB, 36 bytes

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

Salve o código acima como um arquivo m, seguindo as diretrizes de nome de arquivo do Matlab.

slvrbld
fonte
0

VBA, 69 67 bytes

Sub-rotina que não recebe entrada e se exclui.

Requer que o código abaixo seja a primeira linha no painel de código ativo e que o VBA tenha acesso confiável ao modelo do Projeto VBE.

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

-2 bytes para substituir ActiveCodePaneporCodePane(1)

Taylor Scott
fonte
0

T-SQL, 28 bytes

CREATE PROC d AS DROP PROC d

Ele simplesmente remove / remove o procedimento e o código ao se executar. Uso:

EXECUTE d
WORNG ALL
fonte
0

shortC , 10 bytes

Aremove(*@

Como funciona:

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

Programa C equivalente:

int main(int argc, char **argv){remove(*argv);}
MD XF
fonte
0

Código de máquina 8086/8088, 1 byte

aa    stosb

Suposições:

  • Os registros CS, IP, ES, DI e AL são todos inicialmente 0.
  • Este código é colocado no endereço 0.

A stosbinstrução armazena o byte no registro AL no local da memória apontado por ES e DI e depois aumenta ou diminui o DI. Nesse caso, ele armazena o byte 0 no endereço de memória 0, que é onde está a própria instrução.

Concedido, este programa não exclui um arquivo ou qualquer coisa. Mas se você conseguir colocar um processador 8086 em suas mãos, colocar esse programa na memória e executá-lo, ele se substituirá.

Tanner Swett
fonte