Mã sẽ chỉ thực thi một lần


223

Mục tiêu

Mục tiêu của thử thách này là viết mã sẽ thực thi một lần và chỉ một lần. Điều này có nghĩa là về cơ bản, nó làm hỏng chương trình, tập lệnh hoặc môi trường theo một cách nào đó. Nếu khởi động lại hệ thống cho phép mã chạy lại được phép.

Chấm điểm

Số phiếu. Tất cả các giả định phải được liệt kê rõ ràng. Bất kỳ câu trả lời nào chỉ cần khởi động lại hoặc dừng lại sẽ bị loại.

Các quy tắc bổ sung vì Greg Hewgill là một vị thần

Không có quyền truy cập root được cho phép.

Ngày cuối

Cuộc thi sẽ kết thúc vào ngày 31 tháng 5 năm 2014.

Biên tập

Cuộc thi này đã được thay đổi thành cuộc thi phổ biến.


7
@PeterTaylor, một giải pháp khả thi sẽ là tự xóa nhưng kết quả là nó không phải là giải pháp duy nhất.
Lukei

101
Đối với nhiều người gọi vitrong một môi trường thiết bị đầu cuối duy nhất có hiệu ứng này, không có lối thoát khỏi nó trừ khi bạn khởi động lại :) Chỉ là một trò đùa ở đây.
orion

6
Các trang web là miễn phí cho bạn để đề xuất một câu hỏi như vậy.
ojblass

16
echo "If you try to execute me again, it means you are an idiot.";<- Không ai sẽ thực hiện nhiều lần: P
user3459110

25
Phần mềm liên quan đến tên lửa có đủ điều kiện? ;)
rsegal

Câu trả lời:


518

Cảnh giác

Cuối cùng là một usecase cho Vigil!

def main():
  raise Exception()

Trích từ "đặc tả ngôn ngữ":

Không cần phải nói rằng bất kỳ chức năng nào ném ra một ngoại lệ không bị bắt là sai và phải bị trừng phạt.

...

Nếu lời thề bị phá vỡ, chức năng vi phạm [...] sẽ bị trừng phạt thích đáng.

Làm sao?

Đơn giản: nó sẽ bị xóa khỏi mã nguồn của bạn.

Cách duy nhất để đảm bảo chương trình của bạn đáp ứng các yêu cầu của nó là tuyệt đối cấm mã không thực hiện được. Với Vigil, nó sẽ tự động làm điều này cho bạn .

Có nhiều cách khác để làm điều này, bởi vì Vigil cung cấp các từ khóa imploreswearvề cơ bản là lời thề tuân thủ một số điều kiện trước và sau:

def main():
  swear 0 > 1

116
Không còn nghi ngờ gì nữa, điều này xứng đáng để giành chiến thắng.
Matteo Italia

77
Cuối cùng, một ngôn ngữ đủ cảnh giác cho thời đại hiện đại! Tôi sẽ bắt đầu sử dụng nó trong sản xuất. Tất cả các lỗi phải được thanh trừng.
Claudiu

13
Đối với tôi, có vẻ như đó không nhất thiết là lỗi của hàm ném ra một ngoại lệ chưa được phát hiện, nó cũng có thể là các chức năng trên ngăn xếp cuộc gọi là sơ suất vì không bắt được nó. Nó thậm chí có thể đề xuất kiến ​​trúc của toàn bộ ứng dụng là thiếu sót (Bởi vì có lẽ không có cách nào để xử lý đúng ngoại lệ đó mà không cấu trúc lại mã?) Tóm lại, toàn bộ chương trình nên bị xóa.
Jonathan Pullano


32
Điểm bổ sung cho chửi thề. Một chương trình đưa ra tuyên bố sai tự tin chắc chắn cần phải được loại bỏ.
orion

293

Khá nhiều bản phân phối Linux, 9 ký tự

Điều này là một cổ điển!

#!/bin/rm

Đặt nó trong một tập tin và chạy nó:

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

Aaand đã biến mất!

Như những gì đang diễn ra: Tôi thực sự chỉ đang chạy rm! #!được gọi là shebang . Và nếu bạn đặt một trong những tiếp theo là một đường dẫn đến một số thực thi như dòng đầu tiên trong kịch bản của bạn, bộ nạp chương trình sẽ thực thi tập tin kịch bản của bạn với bất cứ điều gì bạn đã viết ở đó - mặc định thường là #!/bin/bashhay #!/bin/sh(Bourne-again shell / Bourne shell) . Đối số đầu tiên được truyền cho tập lệnh này sẽ là chính tên tệp (đó là lý do tại sao bạn thấy rất nhiều giải pháp bao gồm %0hoặc $0và các lượt thích ở đây); vì vậy bằng cách làm cho tệp của tôi chứa #!/bin/rmvà chạy nó, tất cả những gì tôi đang làm là chuyển tên tệp của tệp của mình sang rm.


9
Không bao giờ tự mình sử dụng Linux, tôi nghĩ rằng nó sẽ xóa tệp script.
urur

56
@NateKerkhofs #!trình tự bắt đầu một shebang, xác định trình thông dịch nào bạn sẽ sử dụng cho tập lệnh - thông thường /bin/bash. Ở đây, Flonk đã sử dụng /bin/rmnhư một "thông dịch viên". rmlà một chương trình xóa các tập tin. bởi vì Linux nghĩ rằng chúng tôi muốn rmtrở thành một thông dịch viên, nên nó chuyển tên tệp làm đối số cho nó. do đó, tệp sẽ tự xóa

19
Đây là sự kích động
ojblass

25
@ user80551 Tôi không cần quyền truy cập root cho việc này.
Flonk

9
hmm ..../foo mbox
Izkata

241

nhị phân x86, 4 byte

F0 0F C7 C8

Giả định: Phải được chạy trên CPU Pentium P5.

Hướng dẫn trên thường được gọi là lỗi F00F . Nó cố gắng thực hiện một lệnh không hợp lệ, có tiền tố là khóa .

Điều này đóng băng CPU hoàn toàn (không dừng lại hoặc khởi động lại) và thậm chí nó không yêu cầu quyền truy cập root.


4
Wow ... điều đó thực sự thú vị.
ojblass

31
@JackM: Nó sẽ, nhưng điều đó được cho phép rõ ràng trong câu hỏi.
Dennis

34
@JackM, đó có vẻ là một cách tuyệt vời để ngăn "tập lệnh" chạy.
Paul Draper

5
Tôi nhớ khi lỗi này được thực hiện các vòng. Một cách giải quyết khác của hạt nhân đã được tìm thấy gần như ngay lập tức - nó sẽ không làm sập máy tính trừ khi bạn đang chạy HĐH mà không có bản vá.
zwol

3
@RosLuP 209 người dùng khác nhau, rõ ràng. Nếu bạn không đồng ý, hãy downvote và tiếp tục.
Dennis

150

Bash, 5

>"$0"

Cắt ngắn chính nó đến độ dài bằng không.

Nếu tên tệp không chứa khoảng trắng, >$0hoạt động trong 3 ký tự !


2
Trên thực tế, các trích dẫn không bao giờ cần thiết cho một biến được sử dụng trong tên tệp chuyển hướng như thế này, ngay cả khi chương trình hoặc đường dẫn đến chương trình có khoảng trắng, do một trường hợp đặc biệt trong quy tắc phân tích cú pháp shell. Vì vậy, bạn luôn có thể làm điều đó trong 3 ký tự!
apenwarr

3
@apenwarr nó nói "$ 0: chuyển hướng mơ hồ" khi không có dấu ngoặc kép và tên tệp chứa khoảng trắng

1
@apenwarr, cần thiết nếu trình bao diễn giải tập lệnh đó dựa trên ksh88 hoặc bash không ở chế độ posix. Nó không phải là về không gian, mà là về bất kỳ ký tự nào $IFScho bash và ký tự đại diện cho bash và ksh88. Một tập lệnh ít cô ấy thường sẽ được giải thích bởi sh của hệ thống, nhưng một số shell bao gồm bash và ksh88 sẽ diễn giải chúng trong một đứa trẻ của chính chúng.
sch

144

gzip

#!/bin/gzip

Để gây khó chịu cho những người đã sử dụng các công cụ dòng lệnh không phá hủy, gziptheo mặc định sẽ phá hỏng tệp gốc, thay thế nó bằng một phiên bản được nén (thêm một hậu tố).

Đây là một biến thể của #!/bin/rmtùy chọn, ngoại trừ tùy chọn này có thể phục hồi bằng sự can thiệp thủ công của con người (gọi gunzipnó). Là một phần thưởng đặc biệt, tệp kết quả dài hơn nhiều so với bản gốc (sự khác biệt phụ thuộc vào độ dài tên tệp).

Cảnh báo: vị trí của gzipcó thể thay đổi.

EDIT: như được chỉ ra bởi WChargin, cái này dễ mang theo hơn:

#!/usr/bin/env gzip

Phần còn lại của tập tin có thể có bất kỳ nội dung. Về cơ bản, đây là một tệp mà khi được gọi sẽ tự giấu mình trong một hộp và từ chối ra ngoài cho đến khi bạn buộc phải giải nén nó.


7
Tôi chưa bao giờ nghĩ về nó trước đây nhưng bạn hoàn toàn chính xác.
ojblass

rất thú vị
Grijesh Chauhan

11
"Cảnh báo: vị trí gzipcó thể thay đổi" - đây không phải là môn đánh gôn , vì vậy bạn có thể sử dụng#!/usr/bin/env gzip
wchargein

37
+1 chỉ dành cho It's essentially a file that, when called, hides itself in a box and refuses to come out until you forcibly unpack it.Bạn thực hiện một ngày của tôi, và đó là 1 giờ sáng.
vỗ tay

Về cơ bản, đây là một tệp mà khi được gọi sẽ tự giấu mình trong một hộp và từ chối ra ngoài cho đến khi bạn buộc phải giải nén nó. làm tôi cười : D
Mischa

121

Bash, 13 12

Không phải là ngắn nhất, nhưng nó không thực sự xóa tệp hoặc làm cho hệ thống không thể sử dụng được.

chmod 0 "$0"

Nếu tên tệp không chứa dấu cách, bạn có thể xóa dấu ngoặc kép để lưu 2 ký tự.

Giải trình

Nó loại bỏ tất cả các quyền ( rwx) từ chính nó. Khi bạn cố chạy nó, hoặc thậm chí xem mã của nó, lần thứ hai, mà không khôi phục các quyền theo cách thủ công, nó sẽ nói một cái gì đó như

bash: <FILENAME>: Permission denied

Khôi phục quyền với

chmod +rwx <FILENAME>

Phiên bản cũ

Chỉ xóa quyền thực thi, nhưng một char lâu hơn (đây là câu hỏi về trước khi nó được đổi thành ):

chmod -x "$0"

Phiên bản lén lút của Łukasz Niemier

#!/bin/chmod 0

4
chmod 0hoạt động quá
gnibbler

@gnibbler thnx, đã thêm

Tôi nghĩ bạn có thể gọi chương trình avà lưu 3 ký tự:chmod 0 a
yo '

@tohecz về cơ bản là gian lận

5
Thậm chí đẹp hơn#!/bin/chmod 0
Hauleth

112

Mã máy 6800 - 1 byte

0xDD

Điều này được gọi là HCF hoặc Halt và Catch Fire


78
Chà, các quy tắc nói rằng "Bất kỳ câu trả lời nào chỉ bắt đầu khởi động lại hoặc tạm dừng sẽ bị loại", nhưng điều này không chỉ bắt đầu dừng lại, bởi vì nó cũng bắt lửa. Như vậy, +1!
Trejkaz

94

Shell + sed, 16 byte

Không hoàn toàn phá hoại như một số câu trả lời khác ;-)

Kịch bản này chèn một nhận xét #ở đầu mỗi dòng của chính nó:

sed -i s/^/#/ $0

3
Thế còn sed -i g $0?
seshoumara

91

Hàng hóa 64 CƠ BẢN

Cái này không xóa chương trình.

1 POKE 2048,1

Tự hủy

Theo bản đồ bộ nhớ Commodore 64 , địa chỉ 2048không được sử dụng, nhưng nó phải chứa giá trị 0để chương trình BASIC có thể CHẠY.


1
Có chọc chỉ đơn giản là di chuyển một biến đến một vị trí?
ojblass

12
@ojblass vâng, hiệu quả. poke a, btương đương với mã C *((unsigned char *)a) = b;.
Jules

4
Tôi muốn hình dung ra FaceBook của tôi chọc theo cách đó!
Sunny R Gupta

3
Ôi chà ... Tôi nhớ PEEK và POKE từ C64 BASIC! Tôi đã viết những thứ này vào khoảng năm 1977.
Fixee

lưu ý phụ: Một 0byte được sử dụng để đánh dấu sự kết thúc của các dòng mã; vì vậy địa chỉ 0x800 có lẽ cần một để đánh dấu sự bắt đầu của dòng mã đầu tiên.
Tít

89

Giả định: Chạy Solaris, đăng nhập bằng root

killall

3
Solaris thực sự có một điều như vậy?
ojblass

21
Vâng, nó thực hiện đúng như những gì nó nói trên hộp thiếc và giết chết tất cả các quy trình đang chạy.
Greg Hewgill

một upvote cho bạn!
ojblass

9
1, Câu hỏi đề cập đến không có quyền truy cập root được cho phép.
user80551

119
@ user80551 anh ấy là lý do cho quy tắc đó.
Seiyria

68

Con trăn, 18 tuổi

open(__file__,'w')

Cắt bớt tệp bằng cách mở tệp ở chế độ chỉ ghi.


14
Chỉ trong trường hợp bạn nghiêm túc, nó sẽ tự mở ( __file__đề cập đến tên tệp của chính nó). Mở trong wchế độ cắt ngắn tập tin, về cơ bản xóa nó.
Bob

7
Tôi nghĩ rằng việc cắt xén xảy ra khi mở, nhưng bất kể thời gian chạy Python sẽ xóa tất cả các tệp đang mở ở cuối chương trình và Python hoặc HĐH sẽ đóng chúng khi quá trình kết thúc. Tất nhiên, nói chung là thực hành tốt để đóng tay cầm mở một cách rõ ràng khi bạn hoàn thành chúng.
Bob

5
Cách "đúng" để xử lý các tệp trong Python là với ... er, với. with open("myfile.txt","r") as thefile:và sau đó mã xử lý tệp của bạn sẽ tự động đóng tệp khi bạn hoàn tất.
Schilcote

1
Điều này có thể được rút ngắn để một cái gì đó như open("f.py","w").
Ethan Bierlein

1
Không ngừng hoạt động khi vẫn còn .pyc
minmaxavg

66

Mẻ: 5 byte

%0|%0

Nó về cơ bản là forkbomb cho Windows.

Ứng dụng bắt đầu đối số đầu tiên của nó hai lần. Đừng chạy nó trong một môi trường năng suất;)


83
Có một môi trường cửa sổ năng suất? (Tất nhiên là tôi đang đùa).
orion

17
Trông thật hồn nhiên!
ojblass

15
Ok, chắc chắn không thử điều đó. Nó đã không đi tốt.
rmobis

75
Không có đại diện để downvote, nhưng nó vi phạm "chỉ chạy một lần" theo cách nghiêm trọng nhất có thể.
Xan

14
Tôi tin rằng một con người chỉ thực hiện nó một lần và nó đủ điều kiện.
ojblass

54

JavaScript

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

Lần đầu tiên bạn chạy nó, nó sẽ chạy tốt:

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

Nếu bạn cố chạy nó nhiều hơn (ngay cả khi bạn làm mới), bạn sẽ gặp lỗi:

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

5
Vì vậy, nếu bạn chạy nó nhiều lần, bạn sẽ có được chủ đề Batman. +1 cho điều đó.
Hankrecords

2
@Hankrecords Đáng buồn thay, không thực sự, vì điều này sẽ không được thực thi sau này ...
RedClover

@Soaku Bummer ...
Hankrecords

@Hankrecords trừ khi bạn xóa eval, nhưng sau đó nó sẽ không hoàn thành thử thách này
RedClover

46

Hệ điều hành CMS của IBM, là hệ điều hành một người dùng chạy với tư cách là khách trong VM Hypervisor của IBM, có cấu trúc tệp thú vị.

Các tệp bao gồm ba thành phần, Tên tệp, Loại tệp và Chế độ tệp. Chế độ tệp bao gồm hai thành phần, một chữ cái duy nhất, để dễ giải thích có thể được xem xét theo cách tương tự như Tên ổ đĩa cho Windows / MS-DOS và một chữ số.

Chữ số duy nhất có ý nghĩa, http://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.dmsa3/hcsd0b10127.htm và cho nhiệm vụ này đó là số 3 thú vị:

Chế độ tệp số 3
Chế độ tệp số 3 có nghĩa là các tệp bị xóa sau khi chúng được đọc. Bạn có thể sử dụng chế độ tệp số 3 nếu bạn không muốn duy trì các bản sao trên minidisks hoặc trong các thư mục SFS của mình.

Vì vậy, hãy dành hàng giờ để viết kịch bản của bạn và gửi nó dưới dạng 'LOST FOREVER A3'. Chạy nó, nó hoạt động lần đầu tiên. Đặt nhà, làm tốt lắm.

Lưu ý, không có tin nhắn được tạo ra chỉ ra việc xóa. Rốt cuộc, mọi người đều biết điều đó 3có nghĩa là gì, phải không?

Nó thực sự là tất nhiên rất hữu ích. Bạn có thể, sau khi kiểm tra hoàn tất, sử dụng các 3tệp tạm thời và không phải dọn dẹp sau đó, vì chúng là các tệp đã đọc một lần.


44

Hàng hóa 64 CƠ BẢN

0 NEW

NEW xóa chương trình.


1
Cái đó làm gì
Darth Egregious

3
@ user973810 nếu tôi nhớ cơ bản, mới là để làm sạch bộ nhớ, vì vậy nó sẽ xóa chương trình
user902383

3
Đẹp. Không cụ thể đối với Commodore 64, có thể hoạt động như trên hầu hết mọi máy BASIC 8 bit từ thập niên 80 ...
ysap

Bạn có thể OLD hoặc O. nó cũng trở lại. Tôi mới 12 tháng tuổi thiên tài mã hóa trò chơi 12 tuổi, một lần tình cờ làm việc. Sau đó vô tình lưu thay vì cũ. O. đã không làm việc nữa :( Tôi đã học được cách các biên tập viên hex hoạt động khá sắc nét :)
Matt Warren

3
@ysap: Sẽ dễ mang theo hơn nếu sử dụng 1 làm số dòng; không phải tất cả các triển khai BASIC đều hỗ trợ số dòng 0.
celtschk

41

Bash, 12

Lưu ý: Đây là phá hoại.

:(){ :|:&};:

Đó là quả bom bash nổi tiếng. Nó ăn theo cấp số nhân tất cả bộ nhớ và PID đang khóa hệ thống. Khởi động lại cứng sẽ cho phép mã được chạy lại mặc dù tại sao bạn muốn làm điều đó?


Bash, 10

:(){ :&};:

Đối với hai ký tự ít hơn, điều này ăn bộ nhớ của bạn một cách tuyến tính.


Bash, 7

w;PATH=

w được chọn là thực thi ngắn nhất mà tôi có thể nghĩ đến.

Điều này chỉ đơn giản là xóa biến đường dẫn để shell không thể tìm thấy /usr/bin/wlần sau. Khởi động lại shell sẽ sửa nó vì đường dẫn thường được lưu trữ trong~/.profile


Chết tiệt: DI chỉ có cùng một ý tưởng: P
Knerd

1
:(){ :&};:không nên ăn trí nhớ của bạn. Nó dừng lại ngay khi nó rẽ nhánh, vì vậy chỉ có O(1)hoạt động. Bạn đã làm xong while(fork());, những gì sẽ ăn bộ nhớ của bạn một cách tuyến tính là tương đương với fork(); while(1);.
bến tàu

26
Ồ Đó là một số biểu tượng cảm xúc chết người! Tôi tốt nhất không gọi máy tính của tôi bị nhăn mặt :(){ ....
Level River St

1
Nếu tôi nhớ chính xác ... quả bom ngã ba định kỳ sẽ mở một PID. Kịch bản có thể được chạy lại trong khoảng thời gian đó ... và nếu điều đó không được tính, có thể giết tất cả các nhánh bằng một số nỗ lực. Khởi động lại đơn giản là giải pháp đơn giản nhất.
Brilliand

11
Tôi không nghĩ rằng điều này đủ điều kiện. Nó không làm cho tập lệnh không thể chạy lại, thay vào đó nó đảm bảo rằng nó chạy lại (nhiều lần).
Ben Voigt

20

C #

Mã ngắn nhất để tự xóa

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

Mã để làm cho nó không được chú ý trong 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
Cuối cùng, một câu trả lời C #!
Pharap

Tại sao cần phải lựa chọn?
wizzwizz4

19

C ++ 71

Tập tin thực thi "golf" bị từ chối cấp phép để chạy lần sau.

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

JavaScript / HTML 137, 145 với kiểm tra bảng điều khiển

<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 trong ngữ cảnh của JavaScript, tôi nghĩ rằng việc làm mới trang được tính là khởi động lại (có thể?)

2
Ngay cả khi bạn không xóa tập lệnh khỏi trang, nó vẫn chỉ thực hiện một lần. Không có điểm này.
nderscore

2
@nderscore Hình như chức năng h là thứ sẽ chỉ thực hiện một lần. Bạn phải thực sự gọi nó từ một nơi khác (tương tự như chạy một chương trình, tôi đoán vậy). Nói <button onclick="h();">.
Bob

4
Cho rằng việc tải lại trang được cho phép và mục tiêu của bạn chỉ là ngăn h không thể thực thi được nhiều lần trong khi nó đã được tải, có gì sai function h(){h=0}?
Keen

1
Với #include <sys/stat.h>bạn có thể truy cập chmodchức năng trực tiếp, tiết kiệm khá nhiều byte ( <stdlib.h>không còn cần thiết và cũng không còn system). Ngoài ra, không returncần thiết.
Ben Voigt

19

Tên tôi là ... PowerShell

Thông điệp tự hủy cổ điển:

@'
##################################
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})

Xin giải thích?
noɥʇʎԀʎzɐɹƆ

@ noɥʇʎԀʎzɐɹƆ Dòng đến 13 chỉ là vô nghĩa. Sau đó, giống như mọi shell khác, PowerShell tải tập lệnh đang chạy vào bộ nhớ và do đó, nó không còn cần tệp tập lệnh gốc nữa ... vì vậy nó sẽ tự xóa.
Một sốShinyObject

18

Bash (5)

rm $0

Giả sử bạn không có khoảng trắng trong tên tệp.


40
Đây là lý do tại sao Unix tốt hơn Windows: rm thay vì del giúp bạn tiết kiệm một byte.
MadTux

1
@MadTux Tôi thích * nix hơn Unix.
wizzwizz4

14

sh

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

Sẽ chỉ chạy một lần (và nó hiển thị "Xin chào, thế giới!" Nếu nó chạy), ngay cả khi bạn cài đặt lại hệ thống và đặt lại tập lệnh.


EDIT: Tôi hình dung tôi cũng sẽ phát hành một kịch bản đằng sau runonce. Không có gì đặc biệt, vì nó không được cho là sẽ được phát hành, nhưng dù sao đi nữa.

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

Cũng như lược đồ cơ sở dữ liệu

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

Dữ liệu được lưu trữ trong cơ sở dữ liệu của Heroku, vui lòng kiểm tra chính sách bảo mật của họ nếu bạn muốn. Tôi không kiểm tra dữ liệu được lưu trữ trong cơ sở dữ liệu, nó được lưu trữ hoàn toàn để cho phép mã thực thi một lần.


4
Tôi cho rằng điều này sẽ chạy nhiều lần, nó chỉ tạo ra kết quả đầu tiên.
Brilliand

5
Điều đó thậm chí không một lần hiển thị "Hello World" cho tôi.
Paŭlo Ebermann

1
@ StéphaneGourichon: Có, nó nhớ IP và không có cách nào để xóa IP trước khi tự động xóa. Tôi quyết định đặt mã nguồn, để bạn có thể kiểm tra xem nó làm gì.
Konrad Borowski

1
@ StéphaneGourichon: pg_query_paramsbảo vệ khá nhiều khỏi SQL tiêm. Tuy nhiên, nó sẽ không được lưu vì '; DROP TABLE users;--đây không phải là IP hợp lệ ( inetchỉ chấp nhận IP) và do đó nếu bạn có X-Forwarded-Fortiêu đề giả , chuyến thăm của bạn sẽ không được lưu. Tôi không coi đó là một vấn đề bản thân mình.
Konrad Borowski

2
Tôi tin rằng đây là một sự vi phạm của một lỗ hổng tiêu chuẩn: Gia công câu trả lời thực sự .
juniorRubyist

12

PHP, 22 20 ký tự

<?=unlink(__FILE__);

EDIT: Đã xóa hai ký tự ở cuối mỗi bình luận.


2
Điều này có thể được đơn giản hóa hơn nữa như : <?unlink(__FILE__);, ?>không cần phải theo dõi
leepowers

Bạn phải bắt đầu bằng <?=hoặc thẻ bắt đầu không được công nhận.
Michael Mior

2
PHP tự hủy hoại ... ha! E_NOTICE dòng 3048
cuộc họp

<?+ không gian cũng ok. Bạn chỉ không thể sử dụng một chữ cái sau thẻ ngắn.
Tít

11

Hồng ngọc, 14

Nó viết lại mã nguồn là tên của chương trình.

IO.write $0,$0

3
Và nếu chương trình được đặt tên là "IO.write $ 0, $ 0" thì sao? "Giả định: Đặt tên cho chương trình một cái gì đó không phải là mã hợp lệ trong bất kỳ ngôn ngữ nào."
Brilliand

@Brilland một chương trình ruby ​​sẽ luôn luôn kết thúc .rbvà ngay cả khi tên của nó là "IO.write $ 0, $ 0 # .rb" sẽ không hoạt động vì khi viết nó sẽ bao gồm đường dẫn đầy đủ.
Mhmd

3
@Mhmd một chương trình ruby ​​có thể kết thúc với bất cứ điều gì. Ví dụ gemirblà các chương trình Ruby không có phần mở rộng.
bfontaine

@bfontaine Mà có shebang. Điều này không.
wizzwizz4

@ wizzwizz4 Shebang không liên quan gì đến phần mở rộng. ruby fooruby foo.rbsẽ làm việc tương tự với hoặc không có shebang. ./foo./foo.rb(giả sử họ có thể thực thi được) sẽ thất bại nếu không có shebang và thành công với nó (giả sử mã chính xác, v.v.).
bfontaine

10

Batch (6 ký tự)

Điều này là giả sử chúng tôi có quyền xóa tệp và tất nhiên có thể được thực hiện trên Windows (có thể cả MS-DOS).

del %0

10

Bash 9 8 Nhân vật

nc -l 1&

Sẽ chỉ chạy một lần, vì cổng bị chặn vĩnh viễn.


1
Tôi nghĩ rằng điều này không hoạt động, bởi vì 0là một cổng đặc biệt (nó dành riêng). Khi tôi chạy cái này trên máy tính, tôi có thể mở nó nhiều lần. Ngoài ra, đó là một cổng < 1024, có nghĩa là nó yêu cầu quyền truy cập root phải được lắng nghe.
heinrich5991

nc -l 1&sẽ khắc phục sự cố với 0và ngắn hơn một byte, vì không cần khoảng trống cuối cùng.
kasperd

@kasperd Cảm ơn bạn đã nhập :-)
Falco

@ heinrich5991 ok - hơn tôi sẽ cần 11 ký tự mà không cần quyền truy cập root để sử dụng Cổng như 9654
Falco

Quan tâm để giải thích lý do tại sao bạn downvote?
Falco

9

NodeJS - 33 byte

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

Bạn có thể mô tả những gì nó làm cho những người không quen thuộc với ngôn ngữ?
Kyle Kanos

1
@KyleKanos Nó lấy mô-đun hệ thống tập tin fsvà tên tệp hiện tại __filenamevà xóa tên tệp đó khỏi hệ thống tập tin.
Keen

7
Bạn có thể bỏ dấu chấm phẩy vì chúng là tùy chọn trong JavaScript.
kể

8

Mẻ, 7 ký tự

Lưu công việc chưa được lưu trước khi thử điều này.

Giả sử hệ thống 64 bit hoặc hệ thống 32 bit có bộ nhớ RAM <2 GB. Phải được lưu vào tệp .bat hoặc .cmd trước khi được khởi chạy, chỉ cần nhập nó vào cmd.exe sẽ không hoạt động.

^ nul<^

Nó tiêu thụ một lõi CPU đầy đủ và lấp đầy bộ nhớ RAM của bạn với tốc độ vài trăm megabyte mỗi giây. Nếu bạn không dừng kịp thời (Trình quản lý tác vụ), nó sẽ tiêu tốn từng byte RAM trên máy tính của bạn, toàn bộ hệ thống của bạn sẽ bị đóng băng và bạn không thể làm gì trước khi buộc phải tắt và khởi động lại máy tính bằng cách cắt nguồn hoặc giữ nút nguồn xuống.

Tất cả các khoản tín dụng vào txtechhelp trên StackOverflow để biết điều này, xem thêm thông tin tại đây: https://stackoverflow.com/q/23284131/1955334


Làm thế nào điều này sẽ có thể? Còn phân trang thì sao? Quá trình ưu tiên ?
Nicolas Barbulesco

Tôi chạy kịch bản này, không có gì xảy ra.
Pavel

@Pavel Tôi đoán nó đã được sửa trong Windows 10 rồi. Tôi không thể sao chép nó trên Windows 10, nhưng nó hoạt động trên Windows 8.1.
bilde2910

1
"Nó tiêu thụ lõi CPU đầy đủ và lấp đầy bộ nhớ RAM của bạn với tốc độ vài trăm megabyte mỗi giây. Nếu bạn không dừng kịp thời (Trình quản lý tác vụ), nó sẽ tiêu tốn từng byte RAM trên máy tính, toàn bộ hệ thống của bạn sẽ đóng băng và bạn không thể làm bất cứ điều gì trước khi bạn buộc phải tắt và khởi động lại máy tính của mình bằng cách cắt điện hoặc giữ nút nguồn. " Nghe có vẻ như một câu chuyện kinh dị cho máy tính ...
noɥʇʎԀʎzɐɹƆ

7

Đây là một cặp vợ chồng. Không giống như nhiều người, đây không phải là phá hoại, chỉ là sáng tạo và không chính thống.

Bash

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

Điều này khá đơn giản. Biến $REPLYđược tạo hoàn toàn bởi read, nhưng chứa đầy một herestring trống. Chuỗi trống đó sau đó được printf'ed vào tập lệnh hiện tại. Nó là một tương đương khá khó hiểu như sau:

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

Batch Windows

copy con %0 < nul

Cái thứ hai về cơ bản sao chép đầu vào giao diện điều khiển, đọc từ nul, vào tệp hiện tại.


Đăng sau khi điều này trở thành một cuộc thi phổ biến
Isiah Meadows

1
Cái đầu tiên sẽ không hoạt động nếu không có quyền root. Tại sao bạn đang cố gắng thay thế thiết bị null? Khi chạy bằng root, điều này thực sự sẽ khiến hệ thống hoạt động thất thường. Bạn cũng đang ghi đè null trong khi viết vào đó :) Tại sao không di chuyển nó đi bất cứ nơi nào khác? Chẳng hạn như mv "$ 0" "$ {0} x" hay gì đó? Nó sẽ làm các trick.
orion

Tập tin vẫn còn tồn tại sau đó?
Isiah Meadows

Bây giờ tôi đã thay đổi hoàn toàn ví dụ Bash.
Isiah Meadows

Làm thế nào là không phá hủy?
ysap

7

CƠ SỞ

10 POKE 23635,255

Di chuyển địa chỉ của chương trình BASIC trong bộ nhớ ra khỏi vị trí của nó (203) để người phiên dịch tìm thấy dữ liệu sai.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.