โปรแกรมที่ลบตัวเอง


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>


อาจเป็นไปได้ซ้ำกับการเขียนโปรแกรมที่ลบตัวเองออกไป
John Dvorak

2
@JanDvorak คำถามนั้นเข้มงวดกว่าต้องใช้ไฟล์. exe นี่คือหละหลวมมากขึ้น
EMBLEM

หืม…ถ้าฉันลงคะแนนให้ปิดในทิศทางตรงกันข้ามล่ะ
John Dvorak

3
รหัสกอล์ฟไม่ใช่การประกวดความนิยม ? Aww
Justin

10
@Quincunx ฉันไม่เชื่อเรื่องการประกวดความนิยม รหัสจริงไม่ได้รับการตรวจสอบความสง่างามก่อน แต่ความถูกต้อง
EMBLEM

คำตอบ:


21

Bash script (7 ตัวอักษร, 7 ไบต์)

rm "$0"

1
ไม่ทำงานหากชื่อไฟล์สคริปต์มีช่องว่าง
user80551

ตาดี! ฉันได้อัปเดตสคริปต์เพื่อทำงานกับไฟล์ที่มีช่องว่างในนั้น เพิ่มอักขระอีกสองตัวเท่านั้น ขอบคุณ!
anthony.c

ใช้งานได้หรือไม่หากชื่อไฟล์มีเครื่องหมายคำพูดคู่
John Dvorak

1
@JanDvorak: ใช่ โดยการดำเนินการที่จะเป็นเช่น./the\"program, ,./'the"program' './tha"program'งานทั้งหมดตามที่ตั้งใจไว้ (ต้องใส่เครื่องหมายคำพูดเพื่อหลบหนีหรือปิดล้อมด้วยเครื่องหมายอัญประกาศเดี่ยวขณะโทร) จะทำงานกับไฟล์ที่มีชื่อขึ้นบรรทัดใหม่เป็นต้น
Runium

1
@ StéphaneGourichonอาจ 'ทำให้เขาทำงานrm "$0"ในทุบตีเปลือกแทนในชุดสคริปต์ คุณควรแก้ไขส่วนหัวดังนี้:# Bash script, 7 bytes
MD XF

15

Unix? (9):

#!/bin/rm

คลาสสิก ใช้rmเป็นล่ามสำหรับการลบตัวเองทันที ไม่ใช่ว่าสั้นที่สุด


5
หรือถ้าคุณต้องการที่จะ cheaty: 0 ไบต์rmโปรแกรม
nyuszika7h

1
#!บรรทัดจะไม่นับคะแนน
พาเวล

@ ฟีนิกซ์: ถ้ามันเป็นเรื่องแปลกสำหรับภาษาที่คุณใช้ #!บรรทัดมาตรฐานที่สมบูรณ์เท่านั้นที่เพิ่งตั้งชื่อให้ล่ามแปลภาษาเริ่มต้นเป็นศูนย์ นี่เป็น#!เส้นที่ผิดปกติมากเมื่อไปถึง Bash (ไม่ใช่ว่าใช้งานได้จริงใน Bash แม้ว่าจะมีภาษาอื่นที่ใช้งานได้)

1
นี่ไม่ใช่โปรแกรม Bash (หากคุณเรียกใช้โดยชัดแจ้งbashจะไม่ลบอะไรเลย) มันเป็นปฏิบัติการ UNIX / Linux (นอกจากนี้ยังทำงานใน Perl ซึ่งเลียนแบบการจัดการ#!บรรทัดของ UNIX / Linux เพื่อให้สามารถใช้ในการรัน shellscripts บนแพลตฟอร์มที่ไม่สามารถทำได้โดยกำเนิด)

@Pavel Hmm ... 0 ไบต์?
Sepıʇǝɥʇuʎs

10

รุ่นที่ - 6 ไบต์

Del %0

ค่อนข้างง่าย หมายเหตุ: ใช้งานได้แม้ว่าชื่อจะมีช่องว่าง


เฉพาะในกรณีที่ชื่อไฟล์ไม่มีช่องว่าง
Isiah Meadows

@impinball ขอโทษไหม
ลุง

เพียงแค่ชี้ข้อผิดพลาดเล็กน้อย ถ้าคุณระบุ DOS มันไม่ใช่ แต่มันจะพังง่ายใน Windows (เช่นใน Program Files) ไม่จำเป็นต้องขอโทษ
Isiah Meadows

ไม่ดี ... มันโอเค ฉันเข้าใจผิดว่าการเสนอราคาไม่จำเป็นในกรณีนี้เนื่องจากมีการรวมไว้ในนี้โดยอัตโนมัติ
Isiah Meadows

ทั้งหมดดี. การเพิ่มตัวหนอนจะลบเครื่องหมายคำพูดล้อมรอบ %~0.
ลุง

9

Ruby, 14 ตัวอักษร

File.delete $0

$0 เป็นตัวแปรโกลบอลพิเศษที่มีชื่อของสคริปต์ที่รันอยู่ในปัจจุบัน


ฉันค่อนข้างแน่ใจว่าคุณสามารถปล่อยพื้นที่
Darren Stone

นี่คือเหตุผลที่ฉันสร้างคำถามที่เข้มงวดมากขึ้น การตีความภาษาสามารถทำได้โดยไม่มีปัญหา แนวคิดก็คือแอปพลิเคชั่นที่ใช้งานอยู่จะไม่สามารถดึงพรมออกมาจากด้านล่างได้
Cruncher

6

BASIC-80 / BASICA / GW-BASIC / IBM BASIC / Commodore 64 พื้นฐาน / วินเทจขั้นพื้นฐาน / Commodore LCD พื้นฐาน / Atari BASIC *

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__);โปรแกรมพิมพ์ มันไม่ได้ลบไฟล์
rightfold

1
@ Rightfold จะทำงานตามที่อธิบายไว้ถ้าคุณใส่แท็กเปิดซึ่งฉันน่าจะสันนิษฐานได้ว่าจะเพิ่ม
Darren H


3

Perl 5 (8 ตัวอักษร)

unlink$0

$0เป็นชื่อสคริปต์และunlinkลบออก โดยปกติคุณจะต้องเพิ่มช่องว่างเพื่อให้อ่านง่าย




3

Python, 18

open(__file__,'w')

เปิดตัวเองในโหมดเขียนอย่างเดียวการลบตัวเอง


9
วิธีนี้จะตัดทอนไฟล์ มันไม่ได้ลบมัน
rightfold




1

Vitsy + bash, 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])

นี้จริงจะทำงานเฉพาะถ้าคุณเรียกใช้โปรแกรมโดยการพิมพ์ออก filepath เต็มรูปแบบคือ
lua ~/Scripts/removeself.luaจะทำงาน แต่lua removeself.luaจะไม่สมมติว่าชื่อไฟล์ของและไดเรกทอรีการทำงานปัจจุบันของremoveself.lua~/Scripts

เท่าที่ฉันรู้ไม่มีทางที่จะหา filepath ที่แท้จริงของสคริปต์เพียงแค่ข้อโต้แย้งที่ส่งผ่านไป ฉันรู้เกี่ยวกับdebug.getinfo(1).sourceแต่ในการทดสอบของฉันเกมนั้นได้ผลลัพธ์เหมือนarg[0]กันทุกประการ หากใครรู้วิธีหาไฟล์พา ธ โปรดแจ้งให้เราทราบ



1

JS, 37 ไบต์

document.documentElement.innerHTML=""

สิ่งนี้นับหรือไม่ มันฆ่าจาวาสคริปต์บนหน้า


คุณไม่ต้องการช่องว่างรอบ ๆ=
programmer5000

1

tcl, 18

file delete $argv0

สาธิต - ความสนใจ:มันเป็นเพียงการสาธิตครั้งเดียว! เฉพาะครั้งแรกที่จะสามารถเรียกใช้งานได้ กรุณาจองกับโปสเตอร์ต้นฉบับของคำถาม วิธีลอง: กดExecuteปุ่ม พื้นที่สีเขียวจะไม่รายงานข้อผิดพลาดใด ๆ หลังจากนั้นการคลิกที่Executeปุ่มใด ๆจะส่งผลให้เกิดnot foundข้อผิดพลาด!


1

C, 32 ไบต์

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

1
หาย}s ได้รับอนุญาตใน C? ว้าว!
เครื่องคิดเลขแมว

ไม่เพียงแค่พิมพ์ผิด! จำนวนตัวละครของฉันรวมถึงการปิด}แต่เห็นได้ชัดว่าฉันคัดลอก / วางตัวอย่างไม่ถูกต้อง ขอบคุณที่ชี้นำ!
จอช

เนื่องจากผู้ลงคะแนนนิรนามไม่รู้สึกอยากออกความคิดเห็นหรือถอนการลงคะแนนของพวกเขาฉันได้ลบคำตอบของฉันซึ่งฉันยึดตามของคุณ คุณสามารถตีกอล์ฟนี้ได้ถึง 29 ไบต์:main(c,v)int**v;{remove(*v);}
MD XF

@MDXF ฉันไม่แน่ใจว่ามีการเปลี่ยนแปลงหรือไม่ char**ที่จะint**มีผลบังคับใช้ในทางเทคนิค ฉันกังวลเกี่ยวกับปัญหาการจัดตำแหน่งที่อาจเกิดขึ้น
Josh

1
@Josh ดี; มันใช้งานได้ ... ดังนั้นฉันไม่เห็นว่าทำไม โค้ดกอล์ฟนั้นเกี่ยวกับการใช้วิธีการที่น่ากลัวซึ่งไม่ถูกต้องทางเทคนิค
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

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

เวลาส่วนใหญ่?
Addison Crump

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 Project

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 แล้วเพิ่มขึ้นหรือ decrements DI ในกรณีนี้มันจะจัดเก็บไบต์ 0 ที่อยู่หน่วยความจำ 0 ซึ่งเกิดขึ้นกับคำสั่งนั้น

ได้รับโปรแกรมนี้จะไม่ลบไฟล์หรืออะไร แต่ถ้าคุณจัดการกับโพรเซสเซอร์ 8086 ให้โผล่โปรแกรมนี้ไปยังหน่วยความจำแล้วรันมันมันจะเขียนทับตัวเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.