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>


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"

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.


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.


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.


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)


2
+1, há algo de poético nisso. Existencial mesmo.
— Wossname

5

PHP, 17 caracteres

unlink(__FILE__);

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

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.



3

k (8)

~-1!.z.f

Ou o equivalente q para 14:

hdel hsym .z.f





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

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.




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!


1

C, 32 bytes

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

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)



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).


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

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.


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)


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

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

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á.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.