รหัสที่จะดำเนินการเพียงครั้งเดียว


223

เป้าหมาย

เป้าหมายของการท้าทายนี้คือการเขียนโค้ดที่จะทำงานครั้งเดียวและครั้งเดียว ซึ่งหมายความว่าโดยทั่วไปแล้วจะทำให้โปรแกรมสคริปต์หรือสภาพแวดล้อมเสียหายในบางวิธี หากรีบูตระบบอนุญาตให้โค้ดรันอีกครั้งที่ได้รับอนุญาต

เกณฑ์การให้คะแนน

จำนวนโหวต สมมติฐานทั้งหมดจะต้องระบุไว้อย่างชัดเจน คำตอบใด ๆ ที่เพิ่งเริ่มต้นการรีบูตหรือหยุดจะถูกตัดสิทธิ์

กฎเพิ่มเติมเนื่องจาก Greg Hewgill เป็นปีศาจ

ไม่อนุญาตการเข้าถึงรูท

วันที่สิ้นสุด

การประกวดจะปิดในวันที่ 31 พฤษภาคม 2014

แก้ไข

การประกวดนี้ได้ถูกเปลี่ยนเป็นการประกวดความนิยม


7
@PeterTaylor โซลูชันที่เป็นไปได้จะเป็นการลบตัวเอง แต่ผลที่ออกมาจะแสดงให้เห็นว่าไม่ใช่ตัวเดียว
Lukei

101
สำหรับผู้คนจำนวนมากที่โทรมาviในเทอร์มินัลสภาพแวดล้อมเดียวจะมีเอฟเฟกต์นี้ไม่มีการหลบหนีจากมันจนกว่าคุณจะรีบูต :) แค่เรื่องตลกที่นี่
orion

6
เว็บไซต์ฟรีสำหรับคุณที่จะเสนอคำถามดังกล่าว
ojblass

16
echo "If you try to execute me again, it means you are an idiot.";<- ไม่มีใครจะดำเนินการมากกว่าหนึ่งครั้ง: P
user3459110

25
ซอฟต์แวร์ที่เกี่ยวข้องกับขีปนาวุธมีคุณสมบัติหรือไม่ ;)
rsegal

คำตอบ:


518

การเฝ้า

ในที่สุดก็เป็น Usecase สำหรับ Vigil!

def main():
  raise Exception()

ข้อความที่ตัดตอนมาจาก "ข้อกำหนดภาษา":

มันไปโดยไม่บอกว่าฟังก์ชั่นใด ๆ ที่ส่งข้อยกเว้นที่ไม่ถูกจับนั้นผิดและต้องถูกลงโทษ

...

หากคำสาบานถูกทำลายฟังก์ชั่นที่ละเมิด [... ] จะถูกลงโทษอย่างถูกต้อง

อย่างไร?

ง่าย ๆ : มันจะถูกลบออกจากซอร์สโค้ดของคุณ

วิธีเดียวที่จะทำให้แน่ใจว่าโปรแกรมของคุณตรงตามข้อกำหนดในการห้ามใช้รหัสที่ไม่สามารถทำได้ ด้วย Vigil มันจะทำสิ่งนี้ให้คุณโดยอัตโนมัติ

มีวิธีอื่นในการทำเช่นนี้เพราะ Vigil ให้คำหลักimploreและswearเป็นคำสาบานที่จะต้องปฏิบัติตามเงื่อนไขก่อนและหลัง:

def main():
  swear 0 > 1

116
ไม่ต้องสงสัยเลยว่าสิ่งนี้สมควรที่จะชนะ
Matteo Italia

77
ในที่สุดภาษาที่ตื่นตัวพอสมควรสำหรับยุคสมัยใหม่! ฉันจะเริ่มใช้มันในการผลิต ข้อผิดพลาดทั้งหมดจะต้องถูกกำจัด
Claudiu

13
สำหรับฉันดูเหมือนว่ามันไม่จำเป็นต้องเป็นความผิดของฟังก์ชั่นที่ส่งข้อยกเว้นที่ไม่ถูกตรวจจับมาได้ซึ่งอาจเป็นไปได้ว่าฟังก์ชั่นใน call stack นั้นไม่ได้ใส่ใจกับความล้มเหลวในการจับมัน มันยังสามารถแนะนำสถาปัตยกรรมของแอปพลิเคชั่นทั้งหมดว่ามีข้อบกพร่อง (เพราะอาจไม่มีวิธีจัดการข้อยกเว้นอย่างถูกต้องโดยไม่ต้องปรับโครงสร้างโค้ด?) ในระยะสั้นโปรแกรมทั้งหมดควรถูกลบ
Jonathan Pullano


32
คะแนนเพิ่มเติมสำหรับการสาบาน โปรแกรมที่สร้างข้อความเท็จอย่างมั่นใจไม่ต้องสงสัยเลยว่าต้องถูกกำจัด
orion

293

สวยมากลินุกซ์ distro, 9 ตัวอักษร

อันนี้คลาสสิก!

#!/bin/rm

วางไว้ในไฟล์และเรียกใช้:

> ed
a
#!/bin/rm
.
wq foo
> ls
Mail mbox foo
> chmod 777 foo
> ./foo
> ls
Mail mbox

Aaand มันหายไปแล้ว!

สิ่งที่กำลังเกิดขึ้น: ฉันแค่วิ่งไปrm! #!จะเรียกว่าเป็นshebang และถ้าคุณใส่หนึ่งในนั้นตามด้วยพา ธ ไปยังไฟล์ที่เรียกทำงานได้บางส่วนเป็นบรรทัดแรกในสคริปต์ของคุณตัวโหลดโปรแกรมจะดำเนินการไฟล์สคริปต์ของคุณด้วยสิ่งที่คุณเขียนที่นั่น - ค่าเริ่มต้นคือปกติ#!/bin/bashหรือ#!/bin/sh(บอร์น - เชลล์อีกครั้ง . อาร์กิวเมนต์แรกที่ส่งผ่านไปยังสคริปต์นี้จะเป็นชื่อไฟล์ของตัวเอง (ซึ่งเป็นเหตุผลที่คุณเห็นวิธีแก้ปัญหาจำนวนมากรวมถึง%0หรือ$0ชอบที่นี่) ดังนั้นโดยการทำให้ไฟล์ของฉันมีและใช้มันทั้งหมดที่ฉันทำจะผ่านชื่อไฟล์ของไฟล์ของฉันไป#!/bin/rmrm


9
โดยไม่ต้องใช้ Linux ฉันคิดว่ามันลบไฟล์สคริปต์
Οurous

56
@NateKerkhofs #!ลำดับเริ่ม shebang ซึ่งระบุสิ่งที่ล่ามคุณจะใช้สำหรับสคริปต์ - /bin/bashปกติ ที่นี่ Flonk ใช้/bin/rmเป็น "ล่าม" rmเป็นโปรแกรมที่ลบไฟล์ เนื่องจากลีนุกซ์คิดว่าเราต้องการrmเป็นล่ามมันจะผ่านชื่อไฟล์เป็นอาร์กิวเมนต์ ดังนั้นไฟล์จะลบตัวเอง

19
นี่คือตีโพยตีพาย
ojblass

25
@ user80551 ฉันไม่ต้องการการเข้าถึงรูทสำหรับสิ่งนี้
Flonk

9
อืมม ..../foo mbox
Izkata

241

x86 ไบนารี 4 ไบต์

F0 0F C7 C8

ข้อสันนิษฐาน: ต้องเรียกใช้บน P5 Pentium CPU

การเรียนการสอนดังกล่าวข้างต้นเป็นที่รู้จักกันทั่วไปว่าเป็นข้อผิดพลาด F00F ก็พยายามที่จะดำเนินการเรียนการสอนที่ไม่ถูกต้องนำหน้าด้วยล็อค

สิ่งนี้จะทำให้ CPU หยุดทำงานอย่างสมบูรณ์ (ไม่ใช่หยุดหรือรีบูต) และไม่จำเป็นต้องใช้การเข้าถึงรูท


4
ว้าว ... นั่นน่าสนใจจริงๆ
ojblass

31
@JackM: มันจะ แต่ได้รับอนุญาตอย่างชัดเจนในคำถาม
Dennis

34
@ Jackm ดูเหมือนจะเป็นวิธีที่ดีในการหยุด "สคริปต์" ไม่ให้ทำงาน
พอลเดรเปอร์

5
ฉันจำได้ว่าข้อผิดพลาดนี้เกิดขึ้นเมื่อไหร่ พบวิธีแก้ปัญหาแบบ kernelside เกือบจะในทันที - จะไม่ทำให้คอมพิวเตอร์เสียหายเว้นแต่ว่าคุณใช้ระบบปฏิบัติการโดยไม่มีโปรแกรมปะแก้
zwol

3
@RosLuP 209 ผู้ใช้ที่แตกต่างกันเห็นได้ชัด หากคุณไม่เห็นด้วยให้ลงคะแนนและไปต่อ
เดนนิส

150

Bash, 5

>"$0"

ตัดให้เหลือความยาวศูนย์

หากชื่อไฟล์ไม่มีช่องว่างใช้>$0งานได้3 ตัวอักษร !


2
ที่จริงแล้วอัญประกาศไม่จำเป็นสำหรับตัวแปรที่ใช้ในชื่อไฟล์การเปลี่ยนเส้นทางเช่นนี้แม้ว่าโปรแกรมหรือพา ธ ไปยังโปรแกรมจะมีช่องว่างเนื่องจากมีกรณีพิเศษในกฎการแยกวิเคราะห์เชลล์ ดังนั้นคุณสามารถทำได้ใน 3 ตัวอักษร!
apenwarr

3
@apenwarr พูดว่า "$ 0: การเปลี่ยนเส้นทางที่ไม่ชัดเจน" เมื่อไม่มีเครื่องหมายคำพูดและชื่อไฟล์มีช่องว่าง

1
@apenwarr มีความจำเป็นถ้าเชลล์ที่ตีความสคริปต์นั้นใช้ ksh88 หรือไม่ใช้ bash ในโหมด posix มันไม่เกี่ยวกับที่ว่างมันเกี่ยวกับตัวละครของ$IFSbash และ wildcard สำหรับ bash และ ksh88 สคริปต์ที่บางกว่าเธอมักจะถูกตีความโดย sh ของระบบ แต่เชลล์บางตัวที่รวมถึง bash และ ksh88 จะตีความมันเป็นลูกของตัวเองแทน
sch

144

gzip

#!/bin/gzip

เพื่อสร้างความรำคาญให้กับคนที่เคยใช้เครื่องมือ commandline แบบไม่ทำลายgzipโดยค่าเริ่มต้นจะทำลายไฟล์ต้นฉบับแทนที่มันด้วยเวอร์ชัน gzipped (เพิ่มส่วนต่อท้าย)

นี่คือรูปแบบของ#!/bin/rmตัวเลือกยกเว้นสิ่งนี้สามารถกู้คืนได้โดยการแทรกแซงของมนุษย์ด้วยตนเอง (เรียกgunzipใช้) เป็นโบนัสพิเศษไฟล์ที่ได้จะยาวกว่าต้นฉบับมาก (ความแตกต่างขึ้นอยู่กับความยาวของชื่อไฟล์)

คำเตือน: ตำแหน่งของgzipอาจแตกต่างกันไป

แก้ไข: ตามที่ WChargin ชี้ให้เห็นมันเป็นแบบพกพามากขึ้น

#!/usr/bin/env gzip

ส่วนที่เหลือของไฟล์สามารถมีเนื้อหาใด ๆ โดยพื้นฐานแล้วมันคือไฟล์ที่เมื่อถูกเรียกมันจะซ่อนตัวเองในกล่องและปฏิเสธที่จะออกมาจนกว่าคุณจะแกะมันออกมา


7
ฉันไม่เคยคิดมาก่อน แต่คุณถูกต้องแน่นอน
ojblass

น่าสนใจมาก
Grijesh Chauhan

11
"คำเตือน: ตำแหน่งของgzipอาจแตกต่างกันไป" - นี่ไม่ใช่โค้ดกอล์ฟดังนั้นคุณสามารถใช้งานได้#!/usr/bin/env gzip
wchargin

37
+1 เพียงIt's essentially a file that, when called, hides itself in a box and refuses to come out until you forcibly unpack it.คุณสร้างวันของฉันและมันคือ 01:00
ตบมือ

โดยพื้นฐานแล้วมันเป็นไฟล์ที่เมื่อถูกเรียกว่าซ่อนตัวอยู่ในกล่องและปฏิเสธที่จะออกมาจนกว่าคุณจะแกะมันออกมา ทำให้ฉันหัวเราะ : D
Mischa

121

Bash, 13 12

ไม่ใช่ไฟล์ที่สั้นที่สุด แต่ไม่ได้ลบไฟล์หรือทำให้ระบบใช้ไม่ได้

chmod 0 "$0"

หากชื่อไฟล์ไม่มีช่องว่างคุณสามารถลบเครื่องหมายคำพูดเพื่อบันทึก 2 ตัวอักษร

คำอธิบาย

มันลบสิทธิ์ทั้งหมด ( rwx) จากตัวเอง เมื่อคุณพยายามเรียกใช้หรือแม้แต่ดูรหัสในครั้งที่สองโดยไม่เรียกคืนสิทธิ์ด้วยตนเองมันจะพูดบางอย่างเช่น

bash: <FILENAME>: Permission denied

คืนค่าการอนุญาตด้วย

chmod +rwx <FILENAME>

เวอร์ชั่นเก่า

ลบสิทธิ์ดำเนินการเท่านั้น แต่จะใช้เวลานานกว่าหนึ่งชั่วโมง (นี่เป็นคำถามเกี่ยวกับก่อนที่จะเปลี่ยนเป็นการ ):

chmod -x "$0"

รุ่นส่อเสียดโดยŁukasz Niemier

#!/bin/chmod 0

4
chmod 0ทำงานด้วย
gnibbler

@gnibbler ขอบคุณ, เพิ่ม

ฉันคิดว่าคุณสามารถโทรหาโปรแกรมaและบันทึกได้ 3 ตัวอักษร:chmod 0 a
yo '

@tohecz โดยพื้นฐานแล้วการโกง

5
Even nicer#!/bin/chmod 0
Hauleth

112

รหัสเครื่อง 6800 - 1 ไบต์

0xDD

สิ่งนี้เรียกว่า HCF หรือHalt and Catch Fire


78
กฎบอกว่า "คำตอบใด ๆ ที่เพิ่งเริ่มต้นการรีบูตหรือหยุดจะถูกตัดสิทธิ์" แต่นี่ไม่เพียง แต่เริ่มต้นการหยุดเพราะมันยังจับไฟ ดังนั้น +1!
Trejkaz

94

Shell + sed ขนาด 16 ไบต์

ไม่ค่อนข้างทำลายล้างเท่าคำตอบอื่น ๆ ;-)

สคริปต์นี้แทรกความคิดเห็น#ที่จุดเริ่มต้นของทุกบรรทัดของตัวเอง:

sed -i s/^/#/ $0

3
แล้วไงsed -i g $0ล่ะ
seshoumara

91

พลเรือจัตวา 64 พื้นฐาน

อันนี้ไม่ได้ลบโปรแกรม

1 POKE 2048,1

ทำลายตัวเอง

ตามการแม็พหน่วยความจำ Commodore 64 ที่อยู่2048ไม่ได้ใช้ แต่ต้องมีค่า0เพื่อให้โปรแกรม BASIC สามารถเป็น RUN


1
โผล่ย้ายตัวแปรไปยังตำแหน่งหรือไม่?
ojblass

12
@ojblass ใช่อย่างมีประสิทธิภาพ เทียบเท่ากับรหัสซีpoke a, b *((unsigned char *)a) = b;
จูลส์

4
ฉันต้องการจะเห็นภาพ FaceBook ของฉันโผล่ออกมาอย่างนั้น!
ซันนี่ R Gupta

3
โอ้ว้าว ... ฉันจำ PEEK และ POKE จาก C64 BASIC ได้! ฉันกำลังเขียนสิ่งนี้ประมาณปี 1977
Fixee

หมายเหตุด้านข้าง: 0ไบต์ที่ใช้ในการทำเครื่องหมายจุดสิ้นสุดของบรรทัดรหัส; ดังนั้นที่อยู่ 0x800 อาจต้องใช้รหัสเพื่อทำเครื่องหมายจุดเริ่มต้นของบรรทัดรหัสแรก
ติตัส

89

ข้อสันนิษฐาน: การเรียกใช้ Solaris เข้าสู่ระบบในฐานะ root

killall

3
โซลาริสมีอะไรแบบนี้จริงเหรอ?
ojblass

21
ใช่มันเป็นเพียงสิ่งที่มันบอกในกระป๋องและฆ่ากระบวนการทำงานทั้งหมด
Greg Hewgill

หนึ่งโหวตสำหรับคุณ!
ojblass

9
1, คำถามที่กล่าวถึงไม่อนุญาตการเข้าถึงรูท
user80551

119
@ user80551 เขาเป็นเหตุผลสำหรับกฎนั้น
เซย์เรีย

68

Python, 18

open(__file__,'w')

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


14
ในกรณีที่คุณจริงจังมันจะเปิดตัวเอง ( __file__หมายถึงชื่อไฟล์ของตัวเอง) การเปิดในwโหมดตัดทอนไฟล์โดยทั่วไปจะเป็นการลบไฟล์
บ๊อบ

7
ฉันคิดว่าการตัดทอนเกิดขึ้นในการเปิด แต่ไม่ว่า Python runtime ควรล้างไฟล์ที่เปิดทั้งหมดเมื่อสิ้นสุดโปรแกรมและ Python หรือ OS จะปิดเมื่อกระบวนการสิ้นสุดลง 'โดยทั่วไปเป็นแนวปฏิบัติที่ดีในการปิดที่เปิดอย่างชัดเจนเมื่อคุณทำเสร็จแล้ว
บ๊อบ

5
วิธี "สิทธิ" ในการจัดการไฟล์ใน Python นั้นคือ ... er, with with open("myfile.txt","r") as thefile:จากนั้นรหัสการจัดการไฟล์ของคุณจะปิดไฟล์โดยอัตโนมัติเมื่อคุณทำเสร็จ
Schilcote

1
open("f.py","w")ซึ่งอาจจะสั้นลงเพื่อสิ่งที่ต้องการ
Ethan Bierlein

1
ไม่หยุดทำงานเมื่อเหลือ
pyc

66

ชุด: 5 ไบต์

%0|%0

มันเป็นทางแยกสำหรับ Windows

แอปเริ่มการโต้แย้งครั้งแรกสองครั้ง อย่าใช้มันในสภาพแวดล้อมที่มีประสิทธิผล;)


83
มีสภาพแวดล้อมของ windows ที่มีประสิทธิภาพหรือไม่ (ฉันล้อเล่นแน่นอน)
orion

17
มันดูไร้เดียงสา!
ojblass

15
ตกลงไม่ลองแน่นอน มันไม่เป็นไปด้วยดี
rmobis

75
ไม่มีตัวแทนลงคะแนนเสียง แต่มันละเมิด "วิ่งเพียงครั้งเดียว" ในทางที่รุนแรงที่สุดเท่าที่จะทำได้
Xan

14
ฉันเชื่อว่ามนุษย์ทำหน้าที่เพียงครั้งเดียวและมีคุณสมบัติ
ojblass

54

JavaScript

localStorage.x = eval(localStorage.x + localStorage.x)

ครั้งแรกที่คุณเรียกใช้มันจะทำงานได้ดี:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
NaN

หากคุณพยายามเรียกใช้งานเพิ่มเติม (แม้ว่าคุณจะรีเฟรช) คุณจะได้รับข้อผิดพลาด:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
ReferenceError: NaNNaN is not defined

5
ดังนั้นหากคุณเรียกใช้หลายครั้งคุณจะได้รับชุดรูปแบบแบทแมน +1 สำหรับสิ่งนั้น
Hankrecords

2
@Hankrecords น่าเศร้าไม่ใช่จริง ๆ เพราะนี่จะไม่ดำเนินการในภายหลัง ...
RedClover

@Soaku Bummer ...
Hankrecords

@Hankrecords เว้นแต่คุณจะลบevalแต่มันจะไม่ตอบสนองความท้าทายนี้
RedClover

46

ระบบปฏิบัติการ CMS ของ IBM ซึ่งเป็นระบบปฏิบัติการแบบผู้ใช้เดียวซึ่งทำงานในฐานะแขกภายใต้ VM Hypervisor ของ IBM มีโครงสร้างไฟล์ที่น่าสนใจ

ไฟล์ประกอบด้วยสามองค์ประกอบชื่อไฟล์ประเภทไฟล์และโหมดไฟล์ โหมดไฟล์ประกอบด้วยองค์ประกอบสองตัวคือตัวอักษรตัวเดียวซึ่งสามารถอธิบายได้ง่ายในลักษณะเดียวกับตัวอักษรชื่อไดรฟ์สำหรับ Windows / MS-DOS และตัวเลขหลักเดียว

ตัวเลขตัวเลขเดียวมีความหมายhttp://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.dmsa3/hcsd0b10127.htmและสำหรับงานนี้ มันเป็นหมายเลข 3 ที่น่าสนใจ:

หมายเลข
โหมดไฟล์3 หมายเลขโหมดไฟล์ 3 หมายความว่าไฟล์จะถูกลบหลังจากที่อ่านแล้ว คุณสามารถใช้หมายเลขโหมดไฟล์ 3 หากคุณไม่ต้องการเก็บสำเนาไว้ใน minidisks ของคุณหรือในไดเรกทอรี SFS ของคุณ

ดังนั้นใช้เวลาหลายชั่วโมงในการเขียนสคริปต์และยื่นมันเป็น 'LOST FOREVER A3' เรียกใช้มันใช้งานได้ในครั้งแรก ออกจากบ้านทำงานได้ดี

หมายเหตุไม่มีข้อความใดที่แสดงถึงการลบ ท้ายที่สุดทุกคนรู้ว่ามัน3แปลว่าอะไร

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


44

พลเรือจัตวา 64 พื้นฐาน

0 NEW

NEW ลบโปรแกรม


1
นั่นทำอะไร
Darth Egregious

3
@ user973810 ถ้าฉันจำพื้นฐานใหม่คือการทำความสะอาดหน่วยความจำดังนั้นมันจะลบโปรแกรม
user902383

3
ดี ไม่เฉพาะเจาะจงกับ Commodore 64 อาจใช้งานได้เหมือนเครื่องทั่วไปทุก ๆ 8 บิตจากยุค 80 ...
ysap

คุณสามารถ OLD หรือ O. กลับมาได้เช่นกัน ฉันเพิ่งได้ 12 เดือนของเด็กอายุ 12 ปีที่มีพรสวรรค์ในการเขียนรหัสเกมโดยทำงานครั้งเดียวโดยบังเอิญ จากนั้นบันทึกโดยไม่ตั้งใจแทนการบันทึกแบบเก่า O. ไม่ทำงานอีกต่อไป :( ฉันได้เรียนรู้ว่าตัวแก้ไขฐานสิบหกทำงานได้ค่อนข้างดีอย่างไร :)
Matt Warren

3
@ysap: มันจะพกพาได้มากกว่าถ้าใช้ 1 เป็นหมายเลขบรรทัด การใช้งานขั้นพื้นฐานทั้งหมดไม่รองรับหมายเลขบรรทัด 0
celtschk

41

Bash, 12

หมายเหตุ: นี่คือการทำลายล้าง

:(){ :|:&};:

มันเป็นทุบตีระเบิดที่โด่งดัง มันจะกินหน่วยความจำทั้งหมดและการล็อคระบบของ PID แทน การรีบูตเครื่องจะทำให้โค้ดสามารถรันได้อีกครั้ง แต่ทำไมคุณถึงต้องการทำเช่นนั้น?


Bash, 10

:(){ :&};:

สำหรับสองตัวอักษรที่น้อยกว่านี้จะกินหน่วยความจำของคุณเป็นเส้นตรง


Bash, 7

w;PATH=

w ถูกเลือกให้เป็นไฟล์ที่สั้นที่สุดที่ฉันนึกได้

สิ่งนี้จะลบตัวแปรพา ธ เพื่อให้เชลล์ไม่สามารถหาได้/usr/bin/wในครั้งถัดไป การรีสตาร์ทเชลล์จะแก้ไขได้ตามปกติจะเก็บเส้นทางไว้~/.profile


Darn it: DI เพิ่งมีความคิดเดียวกัน: P
Knerd

1
:(){ :&};:ไม่ควรกินความทรงจำของคุณ จะหยุดเร็วที่สุดเท่าที่จะได้คดเคี้ยวจึงมีเพียงเคยO(1)ใช้งาน คุณได้ทำสิ่งที่จะกินหน่วยความจำของคุณเป็นเส้นตรงเทียบเท่าของwhile(fork()); fork(); while(1);
marinus

26
ว้าว! นั่นคืออีโมติคอนที่อันตรายถึงตาย! ฉันไม่ควรเรียก frownyface คอมพิวเตอร์ bignosed ของฉันดีที่สุด:(){ ....
ระดับแม่น้ำเซนต์

1
ถ้าฉันจำได้ถูกต้อง ... fork fork วางระเบิดเป็นระยะ ๆ เปิด PID หนึ่งใบ สคริปต์สามารถทำงานได้อีกครั้งในช่วงเวลานั้น ... และหากยังไม่ได้นับเป็นไปได้ที่จะฆ่าส้อมทั้งหมดด้วยความพยายาม การรีบูตเครื่องเป็นวิธีแก้ปัญหาที่ง่ายที่สุด
Brilliand

11
ฉันไม่คิดว่าสิ่งนี้มีคุณสมบัติ มันไม่ได้เป็นไปไม่ได้ที่สคริปต์จะทำงานอีกครั้ง แต่เป็นการรับประกันว่าสคริปต์จะทำงานอีกครั้ง (หลายครั้ง)
Ben Voigt

20

C #

รหัสที่สั้นที่สุดสำหรับการลบตัวเอง

Process.Start(new ProcessStartInfo("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location + "\""));

รหัสที่ทำให้ไม่สามารถสังเกตเห็นได้ใน UI

Process.Start( new ProcessStartInfo()
{
    Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location+"\"",
    WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = "cmd.exe"
});

7
ในที่สุดคำตอบ C #!
Pharap

ทำไมต้องเลือกตัวเลือก
wizzwizz4

19

C ++ 71

ไฟล์ปฏิบัติการ "กอล์ฟ" ถูกปฏิเสธไม่ให้เรียกใช้ในครั้งถัดไป

#include <stdlib.h>
int main()
{
system("chmod a-x golf");
return 0;
}

JavaScript / HTML 137, 145 พร้อมการทดสอบคอนโซล

<script id="s"> 
function h(){
console.log(1);
var s=document.getElementById("s");
h=s.innerHTML;
h=h.replace("h","g");
s.innerHTML=h;
}

11
@Templar ในบริบทของ JavaScript ฉันคิดว่าการรีเฟรชหน้าจะนับเป็นการรีบูตเครื่อง (อาจเป็นได้หรือไม่)

2
แม้ว่าคุณจะไม่ได้ลบสคริปต์ออกจากหน้ามันก็จะยังคงดำเนินการเพียงครั้งเดียว ไม่มีประเด็นใดที่จะชี้ประเด็นนี้
nderscore

2
@ncorecore ดูเหมือนว่าฟังก์ชั่น hคือสิ่งที่จะดำเนินการเพียงครั้งเดียว คุณต้องเรียกมันจากที่อื่น (คล้ายกับการรันโปรแกรมฉันเดา) <button onclick="h();">พูดว่า
Bob

4
เนื่องจากอนุญาตให้โหลดหน้าซ้ำได้และเป้าหมายของคุณคือเพื่อป้องกันไม่ให้ h สามารถเรียกใช้งานได้มากกว่าหนึ่งครั้งในขณะที่โหลดแล้วมีอะไรผิดปกติfunction h(){h=0}หรือไม่
Keen

1
ด้วย#include <sys/stat.h>คุณสามารถเข้าถึงchmodฟังก์ชั่นได้โดยตรงประหยัดได้ไม่กี่ไบต์ ( <stdlib.h>ไม่จำเป็นอีกต่อไปและไม่เป็นsystem) นอกจากนี้ไม่returnจำเป็นต้องใช้
Ben Voigt

19

เชลล์ชื่อของฉัน ... PowerShell

ข้อความการทำลายตนเองแบบคลาสสิก:

@'
##################################
Project X is a go

Meet Eagle 1 at WP Alpha

Further comms is hereby prohibited
##################################
This message will self destruct in 
5 seconds
'@
5..1| %{$_;Sleep 1;}
"Goodbye"
rm $(.{$MyInvocation.ScriptName})

ได้โปรด
noɥʇʎԀʎzɐɹƆ

@ noɥʇʎԀʎzɐɹƆเส้นจนถึง 13 เป็นแค่เรื่องไร้สาระ หลังจากนั้นเช่นเดียวกับเชลล์ตัวอื่น ๆ PowerShell โหลดสคริปต์ที่กำลังรันลงในหน่วยความจำและทำให้ไม่ต้องการไฟล์สคริปต์ดั้งเดิมอีกต่อไป ... ดังนั้นจึงจะลบตัวเอง
SomeShinyObject

18

Bash (5)

rm $0

สมมติว่าคุณไม่มีช่องว่างในชื่อไฟล์


40
นี่คือเหตุผลที่ Unix ดีกว่า Windows: rm แทนที่จะบันทึกเป็นไบต์
MadTux

1
@ MadTux ฉันชอบ * ระวังให้ Unix
wizzwizz4

14

ดวลจุดโทษ

#!/bin/sh
curl http://runonce.herokuapp.com/

จะทำงานเพียงครั้งเดียว (และจะแสดง "Hello, world!" ถ้ามันทำงาน) แม้ว่าคุณจะติดตั้งระบบและใส่สคริปต์อีกครั้ง


แก้ไข: ฉันคิดว่าฉันจะปล่อยสคริปต์หลัง runonce เช่นกัน ไม่มีอะไรพิเศษเพราะไม่ควรปล่อยออกมา แต่อย่างใด

<?php
$db = pg_connect("[connection information]");
$ip = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];

pg_query("DELETE FROM users WHERE time < now() - interval '1 day'");

$result = pg_query_params($db, "SELECT * FROM users WHERE ip = $1 LIMIT 1", array($ip));

if (!pg_fetch_row($result)) {
    echo "Hello, world!\n";
    pg_query_params($db, "INSERT INTO users (ip) VALUES ($1)", array($ip));
}

เช่นเดียวกับสคีมาฐานข้อมูล

CREATE TABLE users (
    ip inet PRIMARY KEY,
    time timestamp with time zone NOT NULL DEFAULT now()
);
CREATE INDEX ON users (time);

ข้อมูลจะถูกเก็บไว้ในฐานข้อมูลของ Heroku อย่าลังเลที่จะตรวจสอบนโยบายความเป็นส่วนตัวของพวกเขาหากคุณต้องการ ฉันไม่ตรวจสอบข้อมูลที่เก็บอยู่ในฐานข้อมูล แต่จะเก็บไว้เพื่อให้โค้ดทำงานเพียงครั้งเดียว


4
ฉันจะเถียงว่าสิ่งนี้จะทำงานหลายครั้งมันแค่สร้างผลลัพธ์ไม่หลังจากครั้งแรก
Brilliand

5
นั่นไม่เคยแม้แต่จะแสดง "Hello World" สำหรับฉัน
Paŭlo Ebermann

1
@ StéphaneGourichon: ใช่แล้วจะจดจำ IP และไม่มีวิธีในการลบ IP ก่อนที่จะลบอัตโนมัติ ฉันตัดสินใจที่จะใส่ซอร์สโค้ดเพื่อให้คุณสามารถตรวจสอบสิ่งที่มันทำ
Konrad Borowski

1
@ StéphaneGourichon: การpg_query_paramsปกป้องจากการฉีด SQL อย่างไรก็ตามจะไม่ถูกบันทึกเนื่องจาก'; DROP TABLE users;--ไม่ใช่ IP ที่ถูกต้อง ( inetยอมรับเฉพาะ IP) และดังนั้นหากคุณมีX-Forwarded-Forส่วนหัวปลอมการเยี่ยมชมของคุณจะไม่ถูกบันทึก ฉันไม่คิดว่ามันเป็นปัญหาด้วยตัวเอง
Konrad Borowski

2
ผมเชื่อว่านี่คือการละเมิดหนีมาตรฐาน: Outsourcing คำตอบที่แท้จริง
juniorRubyist

12

PHP, 22 20 ตัวอักษร

<?=unlink(__FILE__);

แก้ไข: ลบสองตัวอักษรที่สิ้นสุดต่อความคิดเห็น


2
นี้สามารถทำให้ง่ายขึ้นเช่น<?unlink(__FILE__);, ต่อท้าย?>ไม่จำเป็นต้อง
leepowers

คุณต้องเริ่มต้นด้วย<?=หรือไม่รู้จักแท็กเริ่มต้น
Michael Mior

2
PHP ทำลายตัวเอง ... ฮ่า ๆ ! E_NOTICE บรรทัด 3048
metadings

<?+ พื้นที่ก็โอเค คุณไม่สามารถใช้ตัวอักษรหลังแท็กสั้น ๆ
ติตัส

11

ทับทิม 14

มันเขียนรหัสต้นฉบับเป็นชื่อของโปรแกรม

IO.write $0,$0

3
และถ้าโปรแกรมชื่อ "IO.write $ 0, $ 0" "อัสสัมชัญ: ตั้งชื่อโปรแกรมที่ไม่มีรหัสในภาษาใด ๆ "
Brilliand

@Brilland โปรแกรม ruby ​​ควรลงท้ายด้วยเสมอ.rbและแม้ว่าชื่อของมันคือ "IO.write $ 0, $ 0 # .rb" ที่ไม่ทำงานเพราะเมื่อเขียนมันจะรวมเส้นทางแบบเต็ม
Mhmd

3
@Mhmd โปรแกรมทับทิมสามารถลงท้ายด้วยอะไรก็ได้ ตัวอย่างเช่นgemและirbเป็นโปรแกรม Ruby ที่ไม่มีนามสกุล
bfontaine

@bfontaine ซึ่งมี shebangs สิ่งนี้ไม่ได้
wizzwizz4

@ wizzwizz4 Shebangs ไม่มีส่วนเกี่ยวข้องกับส่วนขยาย ruby fooและruby foo.rbจะทำงานแบบเดียวกันโดยมีหรือไม่มี Shebang ./fooและ./foo.rb(สมมติว่าพวกมันใช้งานได้) จะล้มเหลวโดยไม่มี shebang และประสบความสำเร็จ (สมมติว่ามีรหัสที่ถูกต้อง ฯลฯ )
bfontaine

10

แบตช์ (6 ตัวอักษร)

นี่คือการสมมติว่าเราได้รับอนุญาตให้ลบไฟล์และแน่นอนสามารถทำได้บน Windows (อาจเป็น MS-DOS ด้วย)

del %0

10

Bash 9 8 ตัวละคร

nc -l 1&

จะทำงานเพียงครั้งเดียวเท่านั้นเพราะพอร์ตจะถูกบล็อกตลอดไป


1
ฉันคิดว่ามันใช้งานไม่ได้เพราะ0เป็นพอร์ตพิเศษ (มันสงวนไว้) เมื่อฉันเปิดใช้งานบนคอมพิวเตอร์ของฉันฉันสามารถเปิดได้หลายครั้ง นอกจากนี้ยังเป็นพอร์ต< 1024ซึ่งหมายความว่าจำเป็นต้องรับฟังการเข้าถึงรูท
heinrich5991

nc -l 1&จะแก้ไขปัญหาด้วย0และสั้นลงหนึ่งไบต์เนื่องจากไม่จำเป็นต้องใช้พื้นที่สุดท้าย
kasperd

@kasperd ขอบคุณสำหรับการป้อนข้อมูล :-)
Falco

@ heinrich5991 ok - กว่าฉันจะต้อง 11 ตัวอักษรโดยไม่ต้องเข้าถึงรากเพื่อใช้พอร์ตเช่น 9654
Falco

สนใจที่จะอธิบายว่าทำไมคุณ downvote?
Falco

9

NodeJS - 33 ไบต์

require('fs').unlink(__filename);

คุณช่วยอธิบายสิ่งนี้ได้อย่างไรสำหรับผู้ที่ไม่คุ้นเคยกับภาษา
Kyle Kanos

1
@KyleKanos ได้รับโมดูลระบบไฟล์fsและชื่อไฟล์ปัจจุบัน__filenameและลบชื่อไฟล์นั้นออกจากระบบไฟล์
Keen

7
คุณสามารถลบเครื่องหมายอัฒภาคได้เนื่องจากเป็นตัวเลือกใน JavaScript
ใกล้

8

รุ่นที่ 7 ตัวอักษร

บันทึกงานที่ไม่ได้บันทึกก่อนลองทำเช่นนี้

สมมติว่าเป็นระบบ 64 บิตหรือระบบ 32 บิตที่มีหน่วยความจำ RAM ขนาด <2 GB ต้องบันทึกเป็นไฟล์. bat หรือ. cmd ก่อนเปิดตัวเพียงแค่ป้อนไฟล์ใน cmd.exe จะไม่ทำงาน

^ nul<^

มันใช้ CPU แบบเต็มและเติมหน่วยความจำ RAM ของคุณในอัตราหลายร้อยเมกะไบต์ต่อวินาที หากคุณไม่หยุดทำงานในเวลา (ตัวจัดการงาน) มันจะใช้ RAM ทุกไบต์ในคอมพิวเตอร์ของคุณระบบทั้งหมดของคุณจะหยุดทำงานและคุณไม่สามารถทำอะไรได้ก่อนที่จะบังคับให้ปิดเครื่องและรีสตาร์ทเครื่องคอมพิวเตอร์โดยการตัด เปิดเครื่องหรือกดปุ่มเปิดปิดค้างไว้

เครดิตทั้งหมดไปที่ txtechhelp บน StackOverflow สำหรับสิ่งนี้ดูข้อมูลเพิ่มเติมได้ที่นี่: https://stackoverflow.com/q/23284131/1955334


สิ่งนี้จะเป็นไปได้อย่างไร แล้วเพจจิ้งล่ะ ลำดับความสำคัญของกระบวนการ?
Nicolas Barbulesco

ฉันรันสคริปต์นี้ไม่มีอะไรเกิดขึ้น
Pavel

@Pavel ฉันเดาว่ามันคงอยู่ใน Windows 10 แล้ว ฉันไม่สามารถทำซ้ำได้ใน Windows 10 แต่ใช้งานได้กับ Windows 8.1
bilde2910

1
"มันใช้ซีพียูแบบเต็มและเติมหน่วยความจำ RAM ของคุณในอัตราหลายร้อยเมกะไบต์ต่อวินาทีถ้าคุณไม่หยุดในเวลา (ตัวจัดการงาน) มันจะใช้ RAM ทุกไบต์บนคอมพิวเตอร์ของคุณระบบทั้งหมดของคุณ จะหยุดและคุณไม่สามารถทำอะไรได้ก่อนที่จะบังคับให้ปิดและรีสตาร์ทเครื่องคอมพิวเตอร์โดยการตัดไฟหรือกดปุ่มเปิดปิดค้างไว้ " ฟังดูเหมือนเรื่องสยองขวัญสำหรับคอมพิวเตอร์ ...
noɥʇʎԀʎzɥʇʎԀʎ

7

นี่คือคู่ ซึ่งแตกต่างจากหลาย ๆ คนเหล่านี้ไม่ทำลายเพียงแค่ความคิดสร้างสรรค์และนอกรีต

ทุบตี

#!/usr/bin/env bash
read <<< ''
printf "$REPLY" > "$0"

คนนี้ค่อนข้างเรียบง่าย ตัวแปร$REPLYถูกสร้างโดยนัยโดยreadแต่เต็มไปด้วย herestring ที่ว่างเปล่า สตริงที่ว่างเปล่านั้นจะถูกprintfแก้ไขในสคริปต์ปัจจุบัน มันเป็นสิ่งที่ค่อนข้างสับสนต่อไปนี้:

#!/usr/bin/env bash
cat <<< '' > "$0" # probably a lot more portable

Windows Batch

copy con %0 < nul

ส่วนที่สองโดยทั่วไปจะคัดลอกอินพุตคอนโซลอ่านจากnulไปยังไฟล์ปัจจุบัน


โพสต์หลังจากนี้กลายเป็นการประกวดความนิยม
Isiah Meadows

1
คนแรกจะไม่ทำงานหากไม่มีสิทธิ์การรูท ทำไมคุณพยายามเปลี่ยนอุปกรณ์ที่ไม่มีค่า? เมื่อทำงานในฐานะรูทสิ่งนี้จะทำให้ระบบทำงานผิดปกติ คุณกำลังเขียนทับโมฆะในขณะที่เขียนลงไป :) ทำไมไม่ย้ายมันไปที่อื่นล่ะ? เช่น mv "$ 0" "$ {0} x" หรืออะไรบางอย่าง? มันควรจะทำเคล็ดลับ
orion

ไฟล์ยังคงมีอยู่หลังจากนั้น?
Isiah Meadows

ตอนนี้ฉันเปลี่ยนตัวอย่าง Bash อย่างสมบูรณ์
Isiah Meadows

สิ่งเหล่านี้ไม่ทำลายได้อย่างไร
ysap

7

ซินแคลร์พื้นฐาน

10 POKE 23635,255

ย้ายที่อยู่ของโปรแกรม BASIC ในหน่วยความจำออกจากที่ที่ควรจะเป็น (203) ดังนั้นผู้ล่ามจะพบข้อมูลที่ไม่ถูกต้อง


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