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.