Un programa que se elimina

22

Si se utiliza un lenguaje compilado, el programa debe eliminar el ejecutable compilado (pero no necesita eliminar el archivo fuente). Si se utiliza un idioma interpretado, el programa debe eliminar el archivo fuente.

Mi oferta inicial:

Python (29 caracteres)

import os;os.remove(__file__)

Editar: para evitar soluciones como rm -rf / , el programa no debe eliminar nada excepto el archivo ejecutable o fuente.

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
fuente
posible duplicado de Escribir un programa que se borre a sí mismo
John Dvorak
2
@ JanDvorak Esa pregunta era más estricta y requería un archivo .exe. Esto es más laxo.
EMBLEMA
Hmm ... ¿y si voto para cerrar en la dirección opuesta, entonces?
John Dvorak
3
código de golf, no concurso de popularidad ? Aww.
Justin
10
@Quincunx No creo en los concursos de popularidad. El código real no se valida primero por su elegancia, sino por su corrección.
EMBLEMA

Respuestas:

21

Script Bash (7 caracteres, 7 bytes)

rm "$0"
anthony.c
fuente
1
No funciona si el nombre del archivo de script contiene espacios.
user80551
¡Buen ojo! He actualizado el script para trabajar con archivos con espacios en ellos. Solo agrega dos personajes más. ¡Gracias!
anthony.c
¿Funciona esto si el nombre del archivo contiene comillas dobles?
John Dvorak el
1
@ JanDvorak: Sí. Por ejecución que sería por ejemplo ./the\"program, ./'the"program', './tha"program'. Todo funciona según lo previsto. (Necesidades de cotizaciones que se escaparon o entre comillas simples de guardia.) También trabajan con archivos que contienen nombres con salto de línea, etc
Runium
1
@ StéphaneGourichon Probablemente porque se está ejecutando rm "$0"en el shell Bash en lugar de en un script por lotes . Debería editar el encabezado de esta manera:# Bash script, 7 bytes
MD XF
15

Unix? (9):

#!/bin/rm

Un clásico. Usos rmcomo intérprete, para auto borrado instantáneo. Sin embargo, no es el más corto.

ɐɔıʇǝɥʇuʎs
fuente
55
O si quieres ser tramposo: un programa de 0 bytes rm.
nyuszika7h
1
La #!línea no se cuenta en la puntuación.
Pavel
@ Phoenix: es si es inusual para el idioma que estás usando; solo las #!líneas completamente estándar que solo dan el nombre del intérprete predeterminado del idioma cuentan como cero. Esta es una #!línea muy inusual en lo que respecta a Bash. (No es que esto realmente funcione en Bash, aunque hay otros idiomas donde funciona).
1
Esto no es realmente un programa Bash (si lo ejecuta explícitamente usando bash, no eliminará nada). Es un ejecutable UNIX / Linux. (También funciona en Perl, que emula el manejo de de UNIX / Linux #!líneas para que pueda ser utilizado para ejecutar shellscripts en plataformas que no pueden hacerlo de forma nativa.)
@Pavel Hmm ... 0 bytes?
Sepıʇǝɥʇuʎs
10

Lote - 6 bytes

Del %0

Bastante simple. Nota: funciona incluso si el nombre contiene espacios.

carne sin carne
fuente
Solo si el nombre del archivo no tiene espacios.
Isiah Meadows
@impinball, lo siento?
Unclemeat
Solo estoy señalando un pequeño error. Si especifica DOS, no lo es, pero se romperá con bastante facilidad en Windows (por ejemplo, en Archivos de programa). No se necesitan disculpas.
Isiah Meadows
Mi mal ... está bien. Me acordé de que las citas no son necesarias en este caso porque se incluyen automáticamente.
Isiah Meadows
Todo bien. Agregar tilde elimina las comillas circundantes. %~0.
Unclemeat
9

Ruby, 14 caracteres.

File.delete $0

$0 es una variable global especial que contiene el nombre del script que se está ejecutando actualmente.

Pomo de la puerta
fuente
Estoy bastante seguro de que puedes soltar el espacio.
Darren Stone el
Es por eso que hice mi versión de la pregunta mucho más estricta. Los idiomas interpretados pueden hacerlo sin problema. La idea es que una aplicación que se ejecuta de forma nativa no puede simplemente sacar la alfombra de debajo de sí misma
Cruncher
6

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

5 bytes

1 NEW

Bueno, eso es lo más simple posible. NEWcrea un nuevo programa, por lo que si lo coloca en cualquier lugar de su programa, lo eliminará.

Prueba de concepto en IBM BASIC (poner NEWen línea 40 para mayor claridad):

* Sí, enumeré todas las versiones BASIC antiguas en las que he probado esto (o casi las he usado)

MD XF
fuente
2
+1, hay algo bastante poético en esto. Existencial incluso.
Wossname
5

PHP, 17 caracteres

unlink(__FILE__);
Tobias Mädel
fuente
66
No estoy seguro de por qué alguien rechazaría esto; Es perfectamente válido. Sin embargo, es posible que desee incluir una etiqueta abierta<?unlink(__FILE__);
primo
44
Este programa PHP imprime unlink(__FILE__);. No elimina el archivo.
derecha
1
@rightfold funciona como se describe si incluye una etiqueta de apertura, que habría asumido agregar
Darren H
3

PowerShell (32)

del $MyInvocation.MyCommand.Name
microbiano
fuente
3

Perl 5 (8 caracteres)

unlink$0

$0es el nombre del script y lo unlinkelimina. Normalmente, al menos agregaría un espacio intermedio para facilitar la lectura.

Joachim Isaksson
fuente
3

k (8)

~-1!.z.f

O el q equivalente para 14:

hdel hsym .z.f
skeevey
fuente
3

Pitón, 18

open(__file__,'w')

Se abre solo en modo de solo escritura, borrándose a sí mismo.

No hay nadie aquí
fuente
99
Esto trunca el archivo. No lo borra.
derecha
2

R, 26 caracteres

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

Node.js - 22 caracteres

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

Julia, 13 bytes

rm(@__FILE__)

Simple. Pero por más tiempo. :PAGS

Rɪᴋᴇʀ
fuente
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
fuente
1

Mathematica, 29 bytes

DeleteFile@NotebookFileName[]
Un simmons
fuente
1

Lua, 17 bytes

os.remove(arg[0])

En realidad, esto solo funciona si ejecuta el programa escribiendo la ruta de archivo completa, es decir
lua ~/Scripts/removeself.lua, funcionaría, pero lua removeself.luano funcionaría, suponiendo un nombre de archivo deremoveself.lua y un directorio de trabajo actual de~/Scripts .

Hasta donde sé, no hay forma de encontrar la ruta de archivo real de un script, solo los argumentos que se le pasan. Lo sé debug.getinfo(1).source, pero en mis pruebas ese juego tiene exactamente los mismos resultados que arg[0]. Si alguien conoce una manera de encontrar la ruta del archivo, hágamelo saber.

Jesse Paroz
fuente
1

Nodos, 32 bytes

require("fs").unlink(__filename)
programador 5000
fuente
1

JS, 37 bytes

document.documentElement.innerHTML=""

¿Esto cuenta? Mata javascript en la página

tan aburrido
fuente
No es necesario los espacios alrededor del=
programmer5000
1

tcl, 18

file delete $argv0

demo - ATENCIÓN: ¡es solo una demostración única! Solo la primera vez será ejecutable. Por favor, resérvelo en el póster original de la pregunta. Para probar: presione el Executebotón. El área verde no informará ningún error. Después de eso, ¡cualquier clic posterior en el Executebotón dará como resultado un not founderror!

sergiol
fuente
1

C, 32 bytes

main(c,v)char**v;{remove(v[0]);}
Josh
fuente
1
¿Faltan }s permitidos en C? ¡Guauu!
CalculatorFeline
No, solo un error tipográfico! Mi recuento de caracteres incluyó el cierre, }pero aparentemente copié / pegué el fragmento incorrectamente. ¡Gracias por mencionarlo!
Josh
Bueno, dado que el votante anónimo no tiene ganas de dejar un comentario o retractarse de su voto, he eliminado mi respuesta, que me basé en la suya. Puede jugar golf hasta 29 bytes:main(c,v)int**v;{remove(*v);}
MD XF
@MDXF No estoy seguro si cambiar char**a int**es técnicamente válido. Me preocupan los posibles problemas de alineación.
Josh
1
@ Josh Bueno; funciona ... así que no veo por qué no. El golf de código se trata de usar métodos horribles que no son técnicamente válidos.
MD XF
1

JavaScript (ES6), 13 bytes

f=_=>delete f

Intentalo

Registra la fuente de f, llamadas f(que elimina f), intenta iniciar sesión fnuevamente pero arroja un error porque fahora no está definido.

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

Lanudo
fuente
0

PowerShell v3 - 17

ri $PSCommandPath
Rynant
fuente
0

Julia - 25 bytes

Escriba esto en un archivo, y luego incluya el archivo con include("<filename here>")y ejecute f():

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

Obviamente, esta es una función: no estoy seguro de cómo se podría detectar el nombre de un archivo que se ejecuta directamente (como una declaración de inclusión sin una definición de función).

Glen O
fuente
0

C ++, 137 bytes.

Funciona la mayor parte del tiempo en 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
fuente
La mayor parte del tiempo?
Addison Crump
1
Puede ahorrar muchos bytes eliminando los no utilizados #include <string>, eliminando espacios extraños y creando esta C, que le permite eliminar el inty return. Además, debe #include <stdio.h>hacer que esto funcione, ya que es donde sprintfse declara.
Mego
0

MATLAB, 36 bytes

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

Guarde el código anterior como un archivo m siguiendo las pautas de nombre de archivo de Matlab.

slvrbld
fuente
0

VBA, 69 67 bytes

Subrutina que no toma entrada y se elimina a sí misma.

Requiere que el siguiente código sea la primera línea en el panel de código activo y que VBA tenga acceso de confianza al modelo del Proyecto VBE.

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

-2 bytes para reemplazar ActiveCodePane con conCodePane(1)

Taylor Scott
fuente
0

T-SQL, 28 bytes

CREATE PROC d AS DROP PROC d

Simplemente elimina / elimina el procedimiento y el código cuando se ejecuta. Uso:

EXECUTE d
TRABAJANDO TODO
fuente
0

shortC , 10 bytes

Aremove(*@

Cómo 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
fuente
0

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

aa    stosb

Suposiciones

  • Los registros CS, IP, ES, DI y AL son todos inicialmente 0.
  • Este código se coloca en la dirección 0.

los stosb instrucción almacena el byte en el registro AL en la ubicación de memoria señalada por ES y DI, luego incrementa o disminuye DI. En este caso, almacena el byte 0 en la dirección de memoria 0, que es donde está la instrucción en sí.

Por supuesto, este programa no elimina un archivo ni nada. Pero si logras obtener un procesador 8086, meter este programa en la memoria y ejecutarlo, de hecho se sobrescribirá.

Tanner Swett
fuente