Tắt máy tính!


83

Thử thách:

Trong ngôn ngữ lập trình bạn chọn, hãy tắt máy mà mã của bạn đã được thực thi.

Quy tắc

  • Không tắt do cạn kiệt tài nguyên (ví dụ: forkbomb để buộc tắt máy)
  • Bạn được phép viết mã chỉ hoạt động trong một môi trường / HĐH cụ thể, nếu bạn muốn.
  • Sơ hở tiêu chuẩn bị cấm

Đây là , do đó số byte thấp nhất sẽ thắng!


62
Tôi có những người bạn, những người làm điều này ở trường và nghĩ rằng họ đang 'hack': D
RaisingAgent

12
Chúng ta nên đưa ra một số quy tắc một lần để ngăn chặn `whatever`;Bash / Perl / PHP / Ruby / etc. bảo tháp.
thao tác

260
Windows, 0 byte. Để máy tính trong vài ngày và để cập nhật tự động thực hiện công việc của họ
Luis Mendo

28
Bất cứ ai khác nhận thấy sự thiếu liên kết TIO?
steenbergh

8
@MontyHarder Sau khi đọc trang đó, tôi đã quyết định đổi xushatdown: past tense of the verb shutdown
FGreg

Câu trả lời:


92

Hội (x86 / x64, Linux, dưới dạng) , 22 21 19 byte

mov  $0x58,       %al  # 2 bytes: b0 58
mov  $0xfee1dead, %ebx # 5 bytes: bb ad de e1 fe
mov  $0x28121969, %ecx # 5 bytes: b9 69 19 12 28
mov  $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
int  $0x80             # 2 bytes: cd 80

Phải được chạy như root.

Điều này tương đương với việc nhấn nút nguồn và không phải là cách an toàn để tắt nguồn PC của bạn. Đảm bảo bạn đóng tất cả các ứng dụng đang mở và thực thi syncđể xóa tất cả các bộ đệm hệ thống tệp trước khi thực hiện chương trình này, để ít nhất giảm thiểu rủi ro hỏng tệp.

Chạy thử nghiệm

$ as -o poweroff.o poweroff.s
$ ld -o poweroff   poweroff.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078
$ sudo sh -c 'sync && ./poweroff'
root's password:

Tiếp theo là bóng tối.

Làm thế nào nó hoạt động

int $0x80gọi một ngắt phần mềm. Nó hoạt động trên cả x86 và x64, nhưng đã bị phản đối trong hơn một thập kỷ nay và không nên được sử dụng trong mã sản xuất. Mã x64 nên sử dụng syscallthay thế. x86 nên sử dụng sysenter, nhưng nó quá cồng kềnh đối với mã golf.

Hành động kết quả từ tòa nhà phụ thuộc vào các thanh ghi EAX - EDX, ESI và EDI. Các Linux syscall tham khảo cho thấy tất cả syscalls mà có sẵn thông qua int $0x80.

Khi EAX giữ 0x58 (88) , khởi động lại được gọi, cũng có thể được sử dụng để tắt nguồn, đưa vào chế độ ngủ hoặc ngủ đông máy tính, cũng như chuyển đổi hạt nhân và vô hiệu hóa hoặc bật tổ hợp phím Ctrl - Alt - Del .

Khi bắt đầu chương trình - và bằng cách biên dịch với ashoặc gcc -nostdlib, chúng tôi có thể đảm bảo rằng chúng tôi thực sự bắt đầu chương trình - hầu hết các thanh ghi được đặt thành 0 . Điều này bao gồm EAX, vì vậy chúng ta có thể sử dụng mov $0x58, %alđể đặt 8 bit EAX thấp hơn thành 0x58 , do đó tự đặt EAX thành 0x58 . Điều này giúp tiết kiệm hai byte bằng cách hủy bỏ thanh ghi xor %eax, %eaxmột cách thủ công và thêm một byte qua straighforward mov $0x58, %eaxmã hóa 0x58 trong 32 bit.

Hai đối số đầu tiên để khởi động lại là các số ma thuật, có lẽ là để ngăn chặn việc khởi động lại ngẫu nhiên và được đọc từ các thanh ghi EBX và ECX. Trừ khi những con số này bằng với một số hằng số nhất định, khởi động lại từ chối thực hiện bất kỳ hành động nào.

  • Số ma thuật đầu tiên phải bằng 0xfee1dead ( cảm thấy đã chết ), có lẽ liên quan đến việc tắt / chết máy tính.

  • Số ma thuật thứ hai có thể bằng bốn hằng số khác nhau, mặc dù ba hằng số sau không hoạt động trong các phiên bản Linux cổ. Tất cả chúng dường như đề cập đến việc bật / tắt nguồn tiếp theo của PC.

    • 0x28121969 đại diện cho sinh nhật của Linus Torvalds (ngày 28 tháng 12 năm 1969).

    • 0x05121996 đại diện cho sinh nhật của Patricia Torvalds (ngày 5 tháng 12 năm 1996).

    • 0x16041998 đại diện cho sinh nhật của Daniela Torvalds (ngày 16 tháng 4 năm 1998).

    • 0x20112000 đại diện cho sinh nhật của Celeste Torvalds (ngày 20 tháng 11 năm 2000).

    Patricia, Daniela và Celeste Torvalds là ba cô con gái của Linus Torvalds.

  • Thanh ghi EDX chọn loại "khởi động lại" mà chúng ta muốn. 0x4321fedcRB_POWER_OFF , tắt PC và tắt nguồn.

  • Cuối cùng, giá trị của thanh ghi ESI bị bỏ qua cho RB_POWER_OFF ; giá trị của thanh ghi EDI bị bỏ qua hoàn toàn bằng cách khởi động lại .

Phiên bản thay thế, chỉ x64, 19 byte

Trên x64, chúng ta có thể sử dụng một tòa nhà cao tầng thích hợp cho cùng một số byte.

mov     $0xa9,       %al  # 2 bytes: b0 a9
mov     $0xfee1dead, %edi # 5 bytes: bf ad de e1 fe
mov     $0x28121969, %esi # 5 bytes: be 69 19 12 28
mov     $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
syscall                   # 2 bytes: 0f 05

Sự khác biệt duy nhất nằm ở hướng dẫn ( syscallvs int $0x80), giá trị của __NR_REBOOT ( 0xa9 so với 0x58 ) và các thanh ghi liên quan.


Chúng ta thường tính lắp ráp như các byte được biên dịch mà không có các byte khung cần thiết cho tiêu đề exe?
Joshua

Có, bởi vì mỗi lệnh tương ứng với các byte cụ thể trong tệp nhị phân. Các tệp ELF (hoặc bất kỳ định dạng nào mà HĐH của bạn sử dụng) được coi là một ngôn ngữ khác và sẽ phải được tạo thủ công để đạt được số điểm khá.
Dennis

Bạn có thể thêm kết xuất hex sau khi lắp ráp mã?
ckjbgames

@ckjbgames Đây rồi.
Dennis

Tôi fee1rất deadngay bây giờ.
arminb

49

PowerShell, 13 byte

Stop-Computer

Khá tự giải thích? Không hoạt động trên lõi PowerShell, vì vậy nó sẽ không hoạt động trên PowerShell cho Linux / MacOS (đã thử trên TIO :-D).

Tiền thưởng rác, 12 byte

gcm s*r|iex

Trong thử nghiệm của tôi, điều này hoạt động trên Windows 2003 với PowerShell 2.0. Nó sẽ không hoạt động trên hầu hết các phiên bản mới hơn và nó có thể không hoạt động tùy thuộc vào mô-đun nào được cài đặt. Nó khá là khủng khiếp!

Điều này tìm kiếm danh sách các lệnh cho bất kỳ với mẫu s*rvà sau đó chạy tất cả chúng! Để rõ ràng, điều này là nguy hiểm, đừng làm điều này!

Thủ thuật tất nhiên là lấy danh sách các lệnh không có bất kỳ tham số bắt buộc nào, nếu không PowerShell sẽ nhắc về giá trị.

Trên máy 2003 của tôi, 3 lệnh mà nó trả về là:

CommandType     Name                                                Definition                                         
-----------     ----                                                ----------                                         
Application     scrnsave.scr                                        C:\WINDOWS\system32\scrnsave.scr                   
Application     ssmarque.scr                                        C:\WINDOWS\system32\ssmarque.scr                   
Cmdlet          Stop-Computer                                       Stop-Computer [[-ComputerName] <String[]>] [[-Cr...

Vâng, nó không khởi chạy trình bảo vệ màn hình marquee, nhưng không, nó không đợi nó hoàn thành trước khi khởi chạy Stop-Computer.

Cách tiếp cận này có thể hoạt động trên các máy mới hơn, một lần nữa tùy thuộc vào mô-đun nào được cài đặt, nhưng cách tốt nhất tôi có thể làm trên Windows 2012 và 2016 là 14 byte :

gcm sto*er|iex

(và vâng, chắc chắn, việc gửi winbatch sẽ hoạt động trong PowerShell và nó ngắn hơn, nhưng .. điều đó không vui chút nào)


4
Một cái ngắn hơn cho Win7 & Win10 (và có thể nhiều hơn): gcm *p-c*|iex- và cũng chỉ có một kết quả!
Bob

@Bob phụ thuộc nhiều vào các mô-đun cài đặt vẫn còn; trên máy Win10 của tôi, nó trả về 6 kết quả, một vài trong số đó sẽ có các tham số bắt buộc (vì vậy chúng sẽ nhắc và không bao giờ thực hiện Stop-Computer, đó là kết quả cuối cùng).
nghĩa anh hùng

39

Mẻ, 10 byte

Trên cửa sổ, điều này sẽ đủ

shutdown/s

Điều này sẽ thiết lập tắt máy trong một phút.

Ngoài ra, như @flashbang chỉ ra:

shutdown/p

Điều này tắt máy tính ngay lập tức.


79
Press the big button on the front of your computer= 0 byte
RaisingAgent

96
@RaisingAgent Ở đây tại PPCG, chúng tôi giải quyết các vấn đề của chúng tôi trong mã. Lao động thể chất được nhăn mặt.
steenbergh

12
@steenbergh Tôi không biết ... nhấn một nút lớn so với 10 lần nhấn phím? Tôi sẽ đi với nút
WorldSEnder

16
@RaisingAgent Đề xuất của bạn có vấn đề về khả năng mở rộng. Hãy thử làm nó cho 10.000 máy tính bốn lần một tuần.
Emilio M Bumachar

10
@RaisingAgent Những người đàn ông thực thụ sử dụng công tắc ngay trên PSU
Cruncher

35

Mã máy x86, Lenovo Z510, DOS COM hoặc Bootloader, 7 byte

BITS 16

mov ax, (1 << 13) | (7 << 10)
mov dx, 1804h
out dx, ax

Lắp ráp thành B8 00 3C BA 04 18 EF

Tôi đang khai thác " Bạn được phép viết mã chỉ hoạt động trong một môi trường / HĐH cụ thể, nếu bạn muốn " đến mức tối ưu: điều này sẽ chỉ hoạt động trên Lenovo Z510 1 .

Điều này ghi SLP_TYPa << 10 | SLP_ENvào PM1a_CNTthanh ghi ACPI, tôi đã bỏ các giá trị này từ các bảng ACPI vài tháng trước để có câu trả lời về việc tắt máy (nơi tôi đưa ra một chút bối cảnh cho mã ở trên).

Điều này có thể được chạy trong DOS dưới dạng COM (chỉ cần ghi dữ liệu nhị phân vào tệp và thay đổi phần mở rộng thành "com") hoặc dưới dạng bộ nạp khởi động.
Để sau này viết chữ ký tiêu chuẩn và cảnh giác với các vấn đề với phần sụn hiện đại .


1 Không đúng hoàn toàn, bất kỳ hệ thống nào có cùng cấu hình ACPI cũng sẽ tắt.


13
Nâng cao vì nền tảng hạn chế.
ống

Hà! Ai đó đã đánh bại Dennis!
Joshua

Nếu bạn đang đi với số lượng 7 byte, bạn nên gọi đây là đệ trình mã máy thay vì giải pháp lắp ráp. Trình đệ trình lắp ráp là 63 byte.
Jakob

@Jakob Bạn nói đúng!
Margaret Bloom

Bạn trông giống như người phù hợp để trả lời câu hỏi này: stackoverflow.com/questions/2019463/ (Tôi đã thất bại thảm hại với nó, đã phải xóa "câu trả lời" của tôi ra khỏi sự xấu hổ.)
Giáo sư Falken

34

Vỏ GRUB , 4 byte

Chơi gôn

halt

Lệnh: dừng lại --no-apm

Lệnh dừng máy tính. Nếu tùy chọn --no-apm được chỉ định, sẽ không có cuộc gọi BIOS APM nào được thực hiện. Nếu không, máy tính sẽ tắt bằng APM.

Thêm

Dưới đây là một bằng chứng cho thấy shell GRUB thực sự là Tur n ing-Complete (xem bình luận):

nhập mô tả hình ảnh ở đây


shell grub không phải là một "ngôn ngữ lập trình" - nó không hoàn thành Turing
Alnitak

9
@Alnitak, điều gì khiến bạn nghĩ như vậy? Nó có tính năng khá tiên tiến built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivativesvà hỗ trợ các biến, cấu trúc có điều kiện, chức năng và hơn thế nữa , vì vậy rõ ràng, nó đang hoàn thiện, bằng bất kỳ biện pháp nào.
zeppelin

1
OK, tôi sẽ lấy lại - Tôi đã không tìm thấy thứ đó khi tôi nhìn
Alnitak

28
Khi nó không thể hiển thị một spinner nó được rõ ràng không phải TUR n ing động hoàn tất
J_F_B_M

1
Trong Bash đó là cùng một lệnh.
Paweł Tokarz

31

Mã máy 65C02, 1 byte

Hướng dẫn STP (0xDB):

STP dừng đầu vào đồng hồ của 65C02, tắt 65C02 một cách hiệu quả cho đến khi thiết lập lại phần cứng xảy ra (tức là chân RES xuống thấp). Điều này đặt 65C02 vào trạng thái năng lượng thấp. Điều này hữu ích cho các ứng dụng (mạch) yêu cầu tiêu thụ điện năng thấp, nhưng STP hiếm khi được nhìn thấy khác.

(Nguồn: http://www.6502.org/tutorials/65c02opcodes.html )

bãi rác xxd:

00000000: db                                       .

Noice. Tôi là một hacker Apple II ngày trước và thậm chí không nhớ opcode này.
kindall

1
Vâng, sau khi viết một trình giả lập 65c816 với nhiều tính năng hơn và thấy thử thách này tôi đã biết phải làm gì: P Ngoài ra, có vẻ như đây là câu trả lời 1 byte duy nhất cho đến nay! \ o /
trị liệu

24

Matlab, 21 byte

system('shutdown -s')

Tôi đã không thử điều này (đóng tất cả các chương trình để thực hiện khởi động lại vào giữa ngày không thực sự hấp dẫn), nhưng nó sẽ hoạt động. . Những công việc này...

Tôi sẽ thêm một lời giải thích ngắn sau, máy tính xách tay của tôi hiện đang tắt.


105
"Tôi sẽ thêm một lời giải thích ngắn sau, máy tính xách tay của tôi hiện đang tắt." <- Nguy cơ của một thách thức tắt máy
Suever

4
Axaxaxaxa, tốt, thỉnh thoảng khởi động lại máy tính của bạn không thể tệ được :)
RaisingAgent

6
uptimeMặc dù vậy, có làm hỏng bạn không
Wayne Werner

Tại sao phải gửi cái này dưới dạng MATLAB, thay vì gửi shutdown -sdưới dạng shell?
dùng253751

10
Bởi vì đối với tôi, vỏ là thứ gì đó tôi tìm thấy trên bãi biển, hoặc trạm xăng.
Stewie Griffin

21

MATLAB, 11 byte

!shutdown/p

Khá giống với cách tiếp cận của Stewie Griffin . Tuy nhiên, MATLAB có cách gọi các lệnh hệ thống ngắn hơn; trong trường hợp này, !được sử dụng. Windows không cần .exetên lệnh, vì vậy cũng bị bỏ qua. Các /tùy chọn vẫn được hỗ trợ (Tôi đang chạy Windows 10), và phủ nhận sự cần thiết của không gian. Các lựa chọn thay thế là:

system shutdown/p % 17 bytes; uses so-called 'command' syntax.
dos shutdown/p    % 14 bytes; the 'dos' command can be used just as well.

19

SmileBASIC, 14 11 6 byte

OPTION

Kích hoạt sự cố khiến 3DS khởi động lại. Tôi hy vọng điều này được tính.

Hoạt động trong phiên bản gần đây nhất.


Tôi nghĩ rằng điều này đã được vá ... Vui lòng bao gồm một số phiên bản.
wizzwizz4

3
Nó đã được vá trong phiên bản 3.5, chưa được phát hành bên ngoài Nhật Bản.
12Me21

4
@ 12Me21 Chắc chắn là nó có giá trị. Đẹp lựa chọn môi trường.
P. Ktinos

Nếu chỉ REBOOTtừ SBv2 được tính là một câu trả lời hợp lệ.
ốc_

16

Bash, 7 6 byte

init 0

Giả sử rằng chương trình được chạy như root.


Thật vậy, cần tắt nguồn máy. Do đó, bạn cần 'tạm dừng -p' làm câu trả lời hợp lệ
P. Ktinos

4
Vụ thảm sát chỉnh sửa này :)
RaisingAgent

@ P.Ktinos: powerofflà một từ đơn, mặc dù nhiều chữ hơn một chút.
ccpizza

1
@ccpizza Đúng, nhưng tiêu chí chấm điểm điển hình là số byte
Suever

13

Java, 101 98 62 42 byte

()->{Runtime.getRuntime().exec("init 0");}

Như @Snowman đã chỉ ra, câu hỏi đã không xác định nếu cần một chương trình đầy đủ, vì vậy điều này vẫn có thể được chấp nhận.


2
Đó là ngắn hơn để thay thế classvới interfacenhư cho phép bạn bỏ qua publictừ chính.
Pavel

6
Bạn có thể sử dụng một phương thức, vì câu hỏi không chỉ định việc gửi phải là một chương trình đầy đủ:void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}

1
Sẽ không phải là phiên bản Linux là một chút ngắn hơn?
jpmc26

2
()->{Runtime.getRuntime().exec("init 0");}hoặc dự kiến ()->Runtime.getRuntime().exec("init 0")(không thể kiểm tra tại thời điểm này). Đó là một lambda thực hiện một khoảng trống tùy chỉnh, giao diện không tranh cãi.
Olivier Grégoire

1
Điều này nên được gắn nhãn là một câu trả lời dành riêng cho Linux, ví dụ: "Java trên LInux".
Jakob

13

Python 2, 29 byte

import os;os.system('init 0')

Hoạt động trên các hệ thống Linux và cần đặc quyền root.

Đối với Windows, 33 byte

import os;os.system('shutdown/p')

Đây chỉ có thể là mã ít thú vị hoặc hữu ích nhất mà tôi từng viết.


2
Một số người khác đã đăng phiên bản shell Linux.
jpmc26

1
À, tệ quá ..
FlipTack

12

Hàng hóa 64, 11 byte

0 sys64738

Đây là từ dấu nhắc BASIC. Hoặc là...

Hàng hóa 64, lắp ráp 6502, 3 byte (lắp ráp), 16 byte (nguồn)

*=8000
JMP $FCE2

Tôi nghĩ rằng việc sử dụng chế độ nhập trực tiếp của Commodore 64 từ BASIC sys64738sẽ sử dụng byte không vì không có chương trình hoặc bất cứ thứ gì khác để lưu trữ; Bạn đang sử dụng RAM màn hình nhưng RAM đó sẽ bị lấp đầy khoảng trống, vì vậy bạn chỉ cần thay thế các không gian đó bằng văn bản.
Shaun Bebbers

2
Mã nguồn chiếm không gian. Chỉ vì nó không dành không gian trên máy mục tiêu không có nghĩa là nó chiếm 0 byte. Nếu không, câu trả lời sẽ là ``.
wizzwizz4

3
Bạn không cần khoảng trắng giữa 0sys64738, bạn có thể thay thế sysbằng hình thức phím tắt sYvà tôi không tính dòng mới theo chiều dài chương trình. Tuy nhiên, tôi không nghĩ rằng mã của bạn đáp ứng các yêu cầu: mã ở 64738 thực hiện thiết lập lại mềm, không phải là một nguồn điện.
Đánh dấu

2
Không tắt nguồn.
TecBrat

1
Tôi đã từng làm đổ bia trên chiếc Commodore 64 của mình, nó đã tắt nó vĩnh viễn. Điều này có tính không?
Shaun Bebbers

12

TI-Nspire CX CAS, 3 byte

" "+" "

tổng hai chuỗi trống.

Trên phiên bản cũ hơn của máy tính, điều này sẽ làm sập thiết bị và khiến thiết bị khởi động lại (không có cách nào để tắt thiết bị mà không khởi động lại ngoài các tổ hợp nút vật lý).

Video của Adriweb


Không phải là 7 byte sao?
Roman Gräf


Âm thanh thuyết phục tôi.
Roman Gräf

11

C ++, 51 40 byte

-11 byte nhờ Ingve !

#include<os>
int main(){OS::shutdown();}

Chỉ hoạt động trong Bao gồm (v0.10.0-rc.1)

Kiểm tra:

$ pwd
/home/simon/IncludeOS/examples/demo_service

$ cat service.cpp
#include<os>
int main(){OS::shutdown();}

$ mkdir build && cd build && cmake .. && make && cd ..
[...]

$ boot build/IncludeOS_example
[...]
================================================================================
================================================================================
 IncludeOS v0.10.0-rc.1-9-g151a2b9
 +--> Running [ IncludeOS minimal example ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$

1
Bây giờ tôi tò mò về Bao gồm
Karl Napf

@KarlNapf Alfred đã tổ chức một buổi thuyết trình tuyệt vời tại CppCon 2016 về Bao gồm: youtube.com/watch?v=t4etEwG2_LY nếu bạn muốn biết thêm :-)
simon

1
Bạn không cần phải sử dụng void Service::start, cũng int main hoạt động trong Bao gồm .
Nhập

10

AppleScript, 30 byte

tell app "Finder" to shut down

Không chính xác những gì nó nói: bảo Finder tắt máy tính.


9

AutoHotkey, 11 10 byte

Lưu một byte nhờ Gurupad Mamadapur

Shutdown,9

AHK Hỗ trợ lệnh Tắt theo mặc định. Đây 9là một lá cờ, bao gồm Shutdown=1+ PowerDown=8.


1
AHKlà bí ẩn.
Gurupad Mamadapur

Bạn có cần không gian sau dấu phẩy?
trị liệu

không gian sau ,là không cần thiết. Hãy thử kiểm tra nó với một lá cờ khác. Tôi nghĩ rằng điều này sẽ không tắt máy tính ngay lập tức và đưa nó vào tập lệnh chính của tôi tải khi khởi động: D Bây giờ tôi đã tải ở chế độ an toàn và giải quyết vấn đề. Thở dài.
Gurupad Mamadapur

9

Mã máy (x86, bộ tải khởi động) 18 byte

b8 01 53 33 db cd 15 b8 07 53 bb 01 00 b9 03 00 cd 15

Tháo gỡ:

mov ax, 0x5301 ; connect to real-mode APM services
xor bx, bx     ; device id 0 - APM BIOS
int 0x15       ; call APM
mov ax, 0x5307 ; set power state
mov bx, 0x0001 ; on all devices
mov cx, 0x0003 ; to Off
int 0x15       ; call APM

Bạn có thể kiểm tra nó trong trình gỡ lỗi của Bochs bằng các lệnh sau (sau khi bắt đầu mô phỏng, có một số ổ đĩa được thiết lập):

pb 0x7c00
c
setpmem 0x7c00 4 0x335301b8
setpmem 0x7c04 4 0xb815cddb
setpmem 0x7c08 4 0x01bb5307
setpmem 0x7c0c 4 0x0003b900
setpmem 0x7c10 2 0x15cd
c

Mã máy tương tự này cũng sẽ hoạt động như một tệp thực thi DOS ( *.COM).


7

C #, 79 54 53 byte

Điều này hoạt động trên Windows.

79 byte :

class _{static void Main(){System.Diagnostics.Process.Start("shutdown","/s");}}

53 byte , nhờ TheLethalCoder:

_=>System.Diagnostics.Process.Start("shutdown","/s");

2
Lưu ý rằng thách thức không yêu cầu chương trình đầy đủ và không cho phép nhập dữ liệu (dĩ nhiên không sử dụng) để bạn có thể biên dịch thành Action<int>và thực hiện _=>System.Diagnostics.Process.Start("shutdown", "/s");trong 54 byte.
TheLethalCoder

@TheLethalCoder, đã cập nhật, cảm ơn!
Dariusz Woźniak

Bạn cũng có thể loại bỏ không gian không cần thiết.
nothrow

Tất nhiên là có! Cảm ơn bạn, @nothrow :)
Dariusz Woźniak

6

Tự động, 11 byte

Shutdown(1)

Chức năng tắt được kết hợp các mã sau

0 = Logoff
1 = Shutdown
2 = Reboot
4 = Force
8 = Power down
16= Force if hung
32= Standby
64= Hibernate

Để tắt máy và tắt nguồn, ví dụ, mã sẽ là 9 (tắt máy + tắt nguồn = 1 + 8 = 9).


1
0(logoff) là một trường hợp đặc biệt ở đây; nó không kết hợp với Standby hoặc Hibernate ngầm.
wizzwizz4

OK0 + 32 = 32
rahnema1

Hừm, vậy nó có luôn đăng xuất trước khi chuyển sang chế độ chờ / ngủ đông không?
Ruslan

@Ruslan Tôi không biết chính xác nó hoạt động như thế nào, Bạn có thể tham khảo diễn đàn người dùng AutoIt để nhận thêm phản hồi :-)
rahnema1

6

Windows - NativeAPI, 212 byte

Ok đây không thực sự là phiên bản ngắn nhất. Nhưng có lẽ thú vị với một số. Điều này sẽ không thực thi trên hệ thống con Win32. Tuy nhiên, nó sẽ chạy khi được thực thi trong ngữ cảnh của api gốc (giống như autochk.exe)

#define WIN32_NO_STATUS
#include <windef.h>
#include <winnt.h>
#include <ntndk.h>
NTSTATUS main() {
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,TRUE,FALSE,NULL);
return ZwShutdownSystem(ShutdownPowerOff);
}

Xây dựng

Để xây dựng điều này, hãy sử dụng build.execông cụ WinDDK (với một sourcetệp thích hợp choNMAKE )

Hoặc sử dụng các lệnh này để biên dịch và liên kết:

cl /Gd /D_X86_ /showIncludes /I%DDK_INC_PATH% /I%CRT_INC_PATH% /c main.c
link /verbose /nodefaultlib /subsystem:native /machine:X86 /entry:NtProcessStartup@4 C:\WinDDK\7600.16385.1\lib\win7\i386\nt.lib C:\WinDDK\7600.16385.1\lib\win7\i386\ntdllp.lib C:\WinDDK\7600.16385.1\lib\win7\i386\BufferOverflow.lib .\main.obj 

Lưu ý: Điều này sẽ xây dựng một thực thi gốc x86. Thay đổi các bit thích hợp nếu bạn muốn xây dựng điều này cho một kiến ​​trúc khác.

Kiểm tra

Để kiểm tra một tệp thực thi riêng, bạn phải thực thi nó trước khi hệ thống con win32 được tải. Một cách phổ biến để làm điều đó là nối thêm tệp thực thi trong khoá đăng ký sau:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute

Cảnh báo

Tuy nhiên, nếu bạn làm điều này, bạn cần có một tùy chọn để chỉnh sửa trung tâm đăng ký của HĐH đích từ một HĐH khác. Vì bạn sẽ không thể khởi động hệ điều hành đích nữa!

Tôi đã làm điều đó trên máy ảo nơi tôi có thể dễ dàng trở lại ảnh chụp nhanh trước đó!



5

Hầu hết các shell Linux, 15 byte

# echo o>/p*/*ger

Nó có thể dài 11 byte, nếu bạn có trong /procthư mục:

# echo o>*ger

Điều này rất đơn giản (không có tác dụng phụ, như không đếm được các hệ thống tập tin hoặc quá trình tiêu diệt) và khá tàn bạo.


1
Lần trước tôi đã thử mở rộng ký tự đại diện khi chuyển hướng, nó đã tạo một tệp có ký tự đại diện trong đó mặc dù đã có tệp phù hợp.
Joshua

5
Tôi tin rằng bạn phải thêm "/ Proc /" vào số byte của mình
zeppelin

@Joshua Nó có thể phụ thuộc vỏ. Tôi thực sự đã thử nó (với bash) trên máy tính của mình :-)
Radovan Garabík

1
@Radovan Garabík - Tôi không nghĩ điều đó thực sự hợp lệ. Điều này về cơ bản giống như ngụ ý rằng có một bí danh "p = poweroff" (không phải là "không thể" quá) và tuyên bố "p" là một giải pháp 1 byte hợp lệ .
zeppelin

1
Nhưng bạn có thể làm cho nó hợp lệ với chi phí chỉ 3 byte, như thế nàyecho o>/p*/*ger
zeppelin


5

AppleScript, 44 byte

tell application "Finder"
shut down
end tell

Tôi không biết cú pháp AppleScript hoạt động như thế nào hoặc bất cứ điều gì, vì vậy nếu có ai biết cách rút ngắn điều này, xin vui lòng cho biết.

Ngoài ra, tôi đang làm điều này trên điện thoại của tôi ở trường ("hack"), vì vậy tôi không thể kiểm tra nó.

Với ít hơn 14 byte (nhờ kindall), bạn có thể nói

tell app "Finder" to shut down

Ai đó đã đưa ra một giải pháp ngắn hơn (với cùng một chương trình) một vài giờ sau khi bạn (nhưng đã đăng nó thay vì bình luận ở đây) codegolf.stackexchange.com/a/107958/62824
devR Rich

Bạn có thể loại bỏ vết lõm
Cyoce

4
tell app "Finder" to shut downTôi nên làm việc, tôi tin rằng (mặc dù việc biên dịch có thể thay thế 'ứng dụng' bằng 'ứng dụng').
bụng

4

J, 14 byte

2!:0'poweroff'

Hoạt động trên các hệ thống Linux. 2!:0thực hiện chuỗi trong /bin/sh.


4

Clojure, 40 39 byte

(.exec(Runtime/getRuntime)"shutdown/s")

-1 byte bằng cách thay đổi cờ từ -s sang /s, cho phép tôi thoát khỏi không gian.

Về cơ bản câu trả lời Java.

Thử nghiệm điều này thật thú vị. Windows quyết định thực hiện cập nhật firmware trên Surface của tôi vào lần thứ hai nó tắt. Tất nhiên.

(defn shutdown []
  (.exec (Runtime/getRuntime) "shutdown -s"))

2

Node.js, 39 byte

Linux

require('child_process').exec('init 0')


2

C ++, 48 47 (Windows) 46 45 (Linux) byte

Đã xóa 1 byte nhờ Snowman

#include<cstdlib>
main(){system("shutdown/p");}

Điều này sẽ tắt hệ thống cho các cửa sổ

#include<cstdlib>
main(){system("poweroff");}

Điều này sẽ tắt hệ thống cho Linux


bạn có cần ;không
RaisingAgent

1
@LliwTelracs Khá chắc chắn đó là "shutdown / p" chứ không phải "-p" và không gian là không cần thiết.
P. Ktinos

Dấu chấm phẩy là cần thiết cho cú pháp c ++ thích hợp, sử dụng dấu gạch chéo cho phép câu trả lời ngắn hơn cho windows nhưng làm cho nó không còn hoạt động cho linux. Mặc dù tôi đã thêm ký tự sai cho tắt máy được chia sẻ giữa windows và linux
fnɛtɪk

@LliwTelracs Mặc dù bạn có thể làm bất cứ điều gì bạn muốn, tôi khuyên bạn nên lạm dụng quy tắc thứ 2 và không quan tâm đến chức năng của Linux, vì đây là một môn đánh gôn và số lượng byte thấp sẽ tốt hơn.
P. Ktinos

1
#include<cstdlib>sẽ cạo sạch một byte.
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.