एक ऐसा प्रोग्राम जो खुद को डिलीट कर देता है


22

यदि संकलित भाषा का उपयोग किया जाता है, तो प्रोग्राम को संकलित निष्पादन योग्य को हटाना चाहिए (लेकिन स्रोत फ़ाइल को हटाने की आवश्यकता नहीं है)। यदि एक व्याख्या की गई भाषा का उपयोग किया जाता है, तो प्रोग्राम को स्रोत फ़ाइल को हटाना होगा।

मेरी शुरुआती बोली:

पायथन (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>



2
@JDDvorak यह प्रश्न सख्त था, जिसे .exe फ़ाइल की आवश्यकता थी। यह अधिक ढीला है।
EMBLEM

हम्म ... क्या होगा अगर मैं विपरीत दिशा में बंद करने के लिए वोट देता हूं, तो?
जॉन ड्वोरक


10
@Quincunx मैं लोकप्रियता प्रतियोगिताओं में विश्वास नहीं करता। वास्तविक कोड को पहले इसकी लालित्य पर मान्य नहीं किया गया है, लेकिन इसकी शुद्धता।
EMBLEM

जवाबों:


21

बैश स्क्रिप्ट (7 अक्षर, 7 बाइट्स)

rm "$0"

1
स्क्रिप्ट फ़ाइल नाम में रिक्त स्थान हैं, तो काम नहीं करता है।
user80551

अच्छी नज़र! मैंने उनके साथ रिक्त स्थान वाली फ़ाइलों के साथ काम करने के लिए स्क्रिप्ट को अपडेट किया है। केवल दो और वर्ण जोड़ता है। धन्यवाद!
anthony.c

यदि फ़ाइल नाम में दोहरे कोट्स हैं तो क्या यह काम करता है?
जॉन ड्वोरक

1
@JDDvorak: हाँ। निष्पादन कि हो सकता है जैसे करके ./the\"program, ./'the"program', './tha"program'। सभी इच्छानुसार काम करता है। (उद्धरण कॉल पर एकल उद्धरणों में बचने या संलग्न होने की आवश्यकता है।) नई फ़ाइलों के नाम वाली फाइलों पर भी काम करेंगे आदि
Runium

1
@ StéphaneGourichon शायद वह बैच स्क्रिप्ट के बजाय rm "$0"बैश शेल में चल रहा है । आपको हेडर को इस तरह संपादित करना चाहिए:# Bash script, 7 bytes
एमडी एक्सएफ

15

यूनिक्स? (9):

#!/bin/rm

एक पारम्परिक। rmतत्काल आत्म-विलोपन के लिए दुभाषिया के रूप में उपयोग करता है । हालांकि बहुत छोटा नहीं है।


5
या यदि आप धोखा देना चाहते हैं: एक 0-बाइट rmप्रोग्राम।
nyuszika7h

1
#!लाइन स्कोर में नहीं गिना जाता है।
पावेल

@Phoenix: यदि यह उस भाषा के लिए असामान्य है जो आप उपयोग कर रहे हैं; केवल पूरी तरह से मानक #!लाइनें जो सिर्फ भाषा के डिफ़ॉल्ट दुभाषिया की संख्या को शून्य का नाम देती हैं। यह एक बहुत ही असामान्य #!रेखा है जहां तक ​​बैश जाता है। (ऐसा नहीं है कि यह वास्तव में बैश में काम करता है, हालांकि अन्य भाषाएं भी हैं जहां यह काम करता है।)

1
यह वास्तव में एक बैश कार्यक्रम नहीं है (यदि आप इसे स्पष्ट रूप से उपयोग करते हैं bash, तो यह कुछ भी नहीं हटाएगा)। यह एक यूनिक्स / लिनक्स निष्पादन योग्य है। (यह पर्ल में भी काम करता है, जो UNIX / Linux की #!पंक्तियों को संभालने का अनुकरण करता है ताकि इसका इस्तेमाल उन प्लेटफार्मों पर

@ पावेल हम्म ... 0 बाइट्स?
atı

10

बैच - 6 बाइट्स

Del %0

बहुत साधारण। नोट: नाम में रिक्त स्थान होने पर भी काम करता है।


केवल अगर फ़ाइल नाम में स्थान नहीं है।
इस्याह मीडोज

@impinball, क्षमा करें?
चाचा

बस थोड़ा सा बग इशारा कर दिया। यदि आप डॉस निर्दिष्ट करते हैं, तो यह नहीं है, लेकिन यह विंडोज में बहुत आसानी से टूट जाएगा (उदाहरण के लिए प्रोग्राम फ़ाइलें)। कोई माफी की जरूरत है।
इशाया मीडोज

मेरा बुरा ... यह ठीक है। मैंने गुमराह किया कि इस मामले में उद्धरण की आवश्यकता नहीं है क्योंकि वे स्वचालित रूप से इसमें शामिल हैं।
इशाया मीडोज

सब अच्छा। टिल्ड को जोड़ने से आसपास के उद्धरण हट जाते हैं। %~0
अंकल

9

रूबी, 14 वर्ण

File.delete $0

$0 एक विशेष वैश्विक चर है जिसमें वर्तमान में चल रही स्क्रिप्ट का नाम है।


मुझे पूरा यकीन है कि आप अंतरिक्ष छोड़ सकते हैं।
डैरेन स्टोन

यही कारण है कि मैंने सवाल के अपने संस्करण को और अधिक सख्त बना दिया। व्याख्या की गई भाषाएं इसे बिना किसी समस्या के कर सकती हैं। विचार यह है कि एक मूल रूप से चल रहे एप्लिकेशन को केवल नीचे से गलीचा नहीं खींच सकता है
Cruncher

6

BASIC-80 / BASICA / GW-BASIC / IBM BASIC / Commodore 64 BASIC / विंटेज बेसिक / कमोडोर एलसीडी बेसिक / अटारी बेसिक *

5 बाइट्स

1 NEW

खैर, यह जितना आसान हो जाता है। NEWएक नया प्रोग्राम बनाता है, इसलिए इसे अपने प्रोग्राम में कहीं भी रखने से यह डिलीट हो जाएगा।

आईबीएम बेसिक पर अवधारणा का प्रमाण ( NEWस्पष्टता के लिए लाइन 40 पर डाल ):

* हाँ, मैंने हर पुराने बेसिक संस्करण को सूचीबद्ध किया है जिसका मैंने इसमें परीक्षण किया है (या कभी बहुत ज्यादा इस्तेमाल किया गया है)


2
+1, इस बारे में कुछ काव्यात्मक है। अस्तित्व भी।
वॉसनामे

5

PHP, 17 अक्षर

unlink(__FILE__);

6
मुझे यकीन नहीं है कि कोई भी इसे कम क्यों करेगा; यह पूरी तरह से वैध है। आप एक खुला टैग शामिल करना चाह सकते हैं, हालांकि<?unlink(__FILE__);
प्रिमो

4
यह PHP प्रोग्राम प्रिंट करता है unlink(__FILE__);। यह फाइल को डिलीट नहीं करता है।
'

1
@ राइटफोल्ड यह वर्णित के रूप में काम करता है यदि आप एक ओपनिंग टैग शामिल करते हैं, जिसे मैंने जोड़ना माना होगा
डैरेन एच


3

पर्ल 5 (8 अक्षर)

unlink$0

$0स्क्रिप्ट नाम है, और unlinkइसे निकालता है। आम तौर पर, आप कम से कम पठनीयता के बीच में एक स्थान जोड़ सकते हैं।




3

अजगर, १ 18

open(__file__,'w')

स्वयं को मिटाते हुए, लेखन-विधा में ही खुलता है।


9
यह फ़ाइल को काट देता है। इसे डिलीट नहीं करता है।
'



1

जूलिया, 13 बाइट्स

rm(@__FILE__)

सरल। लेकिन लंबे समय तक। : पी


1

विटसी + बैश, 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

लुआ, 17 बाइट्स

os.remove(arg[0])

यह वास्तव में केवल तभी काम करता है जब आप प्रोग्राम को पूरा फाइलपाथ टाइप करके चलाते हैं, अर्थात
lua ~/Scripts/removeself.luaकाम करेंगे, लेकिन वर्तमान में काम कर रहे डायरेक्टरी के lua removeself.luaफ़ाइलनाम को नहीं मानेंगे ।removeself.lua~/Scripts

जहाँ तक मुझे पता है, किसी स्क्रिप्ट की वास्तविक फ़ाइलपथ को खोजने का कोई तरीका नहीं है, बस उसके लिए तर्क दिए गए हैं। मुझे इसके बारे में पता है debug.getinfo(1).source, लेकिन मेरे परीक्षण में उस खेल के समान परिणाम हैं arg[0]। अगर किसी को फ़ाइलपथ खोजने का कोई तरीका पता है, तो कृपया मुझे बताएं।



1

जेएस, 37 बाइट्स

document.documentElement.innerHTML=""

क्या यह गिनती है? यह पृष्ठ पर जावास्क्रिप्ट को मारता है


आप के आसपास रिक्त स्थान की जरूरत नहीं है=
प्रोग्रामर

1

tcl, १,

file delete $argv0

डेमो - ध्यान: यह केवल एक बार डेमो है! केवल पहली बार यह runnable होगा। कृपया इसे प्रश्न के मूल पोस्टर में आरक्षित करें। प्रयास करने के लिए: Executeबटन दबाएं। हरित क्षेत्र किसी भी त्रुटि की रिपोर्ट नहीं करेगा। उसके बाद, Executeबटन पर किसी भी बाद के क्लिक में एक not foundत्रुटि होगी!


1

सी, 32 बाइट्स

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

1
}C में गुम s की अनुमति है? वाह!
कैलक्यूलेटरफल

नहीं, बस एक टाइपो! मेरे कैरेक्टर काउंट में क्लोजिंग शामिल थी }लेकिन मैंने स्निपेट को गलत तरीके से कॉपी / पेस्ट किया। इस पर ध्यान दिलाने के लिए धन्यवाद!
जोश

खैर, चूंकि अनाम डाउनवॉटर एक टिप्पणी छोड़ने या उनके वोट को वापस लेने का मन नहीं करता है, इसलिए मैंने अपना उत्तर हटा दिया है, जो मैंने आपके आधार पर किया था। आप इसे 29 बाइट तक नीचे कर सकते हैं:main(c,v)int**v;{remove(*v);}
एमडी एक्सएफ

@MDXF मुझे यकीन है कि नहीं कर रहा हूँ अगर बदलते char**करने के लिए int**तकनीकी रूप से वैध है। मैं संभावित संरेखण मुद्दों के बारे में चिंतित हूं।
जोश

1
@ जोश खैर; यह काम करता है ... तो मैं क्यों नहीं देख रहा हूँ। कोड गोल्फ उन सभी भयानक तरीकों का उपयोग करने के बारे में है जो तकनीकी रूप से मान्य नहीं हैं।
एमडी एक्सएफ

1

जावास्क्रिप्ट (ईएस 6), 13 बाइट्स

f=_=>delete f

कोशिश करो

के स्रोत लॉग करता है f को लॉग करता है , कॉल f(जो हटाता है f), fफिर से लॉग इन करने की कोशिश करता है लेकिन एक त्रुटि फेंकता है क्योंकि fअब अपरिभाषित है।

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



0

जूलिया - 25 बाइट्स

इसे किसी फ़ाइल में लिखें और फिर फ़ाइल को इसमें शामिल करें include("<filename here>")और चलाएं f():

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

यह, स्पष्ट रूप से, एक फ़ंक्शन है - मुझे यकीन नहीं है कि कोई व्यक्ति सीधे चलाए जा रहे फ़ाइल के फ़ाइल नाम का पता लगाने के बारे में कैसे जाएगा (इसमें फ़ंक्शन परिभाषा के बिना एक विवरण शामिल करें)।


0

सी ++, 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);}

सी, 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>, बाहरी रिक्त स्थान को दूर करने, और बनाने के लिए इस सी, आप निकालना देता है intऔर return। इसके अतिरिक्त, आपको #include <stdio.h>यह काम करने की आवश्यकता है, क्योंकि sprintfयह घोषित किया गया है।
मेगो

0

MATLAB, 36 बाइट्स

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

Matlab के फ़ाइल नाम दिशानिर्देशों के बाद उपरोक्त कोड को एक एम-फ़ाइल के रूप में सहेजें।


0

VBA, 69 67 बाइट्स

सबरूटीन जो कोई इनपुट नहीं लेता है और स्वयं हटा देता है।

यह आवश्यक है कि नीचे दिया गया कोड सक्रिय कोड फलक में पहली पंक्ति हो, और VBA ने VBE प्रोजेक्ट मॉडल तक पहुंच पर भरोसा किया हो।

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

के ActiveCodePaneसाथ बदलने के लिए -2 बाइट्सCodePane(1)


0

टी-एसक्यूएल, 28 बाइट्स

CREATE PROC d AS DROP PROC d

यह केवल प्रक्रिया और कोड को हटा देता है / निष्पादित करता है। उपयोग:

EXECUTE d

0

शॉर्ट सी , 10 बाइट्स

Aremove(*@

यह काम किस प्रकार करता है:

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

समतुल्य सी कार्यक्रम:

int main(int argc, char **argv){remove(*argv);}

0

8086/8088 मशीन कोड, 1 बाइट

aa    stosb

मान्यताओं:

  • रजिस्टर CS, IP, ES, DI और AL सभी शुरुआत में 0 हैं।
  • यह कोड पता 0 पर रखा गया है।

stosbअनुदेश भंडार स्मृति स्थान पर अल रजिस्टर में बाइट ES और डि द्वारा की ओर इशारा किया वेतन वृद्धि तो, या डि decrements। इस स्थिति में, यह बाइट 0 को मेमोरी एड्रेस 0 पर संग्रहीत करता है, जो कि ऐसा होता है जहां निर्देश स्वयं होता है।

दी, यह कार्यक्रम एक फ़ाइल या कुछ भी नहीं हटाता है। लेकिन अगर आप एक 8086 प्रोसेसर पर अपने हाथों को प्राप्त करने का प्रबंधन करते हैं, तो इस प्रोग्राम को मेमोरी में पोक करें, और इसे चलाएं, यह वास्तव में स्वयं को अधिलेखित कर देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.