ปิดคอมพิวเตอร์!


83

ท้าทาย:

ในภาษาการเขียนโปรแกรมที่คุณเลือกให้ปิดเครื่องที่ใช้รหัสของคุณ

กฎระเบียบ

  • ไม่มีการปิดตัวลงด้วยความอ่อนล้าของทรัพยากร (เช่น: forkbomb เพื่อบังคับให้ปิดระบบ)
  • คุณได้รับอนุญาตให้เขียนโค้ดที่ทำงานในสภาพแวดล้อม / OS เฉพาะหากคุณต้องการ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

นี่คือซึ่งจำนวนไบต์ต่ำสุดชนะ!


62
ฉันมีเพื่อนที่ทำสิ่งนี้ในโรงเรียนและคิดว่าพวกเขา 'แฮ็ค': D
RaisingAgent

12
เราควรคิดกฎหนึ่งครั้งเพื่อหยุดเช่น`whatever`;Bash / Perl / PHP / Ruby / etc stupiglots
จัดการ

260
Windows, 0 ไบต์ เปิดคอมพิวเตอร์ทิ้งไว้สองสามวันแล้วปล่อยให้การอัปเดตอัตโนมัติทำงานได้
Luis Mendo

28
มีใครสังเกตเห็นการขาดลิงค์ของ TIO อีกไหม
steenbergh

8
@MontyHarder หลังจากอ่านหน้านั้นฉันได้ตัดสินใจที่จะเหรียญคำshatdown: past tense of the verb shutdown
FGreg

คำตอบ:


92

ชุดประกอบ (x86 / x64, Linux, as) , 22 21 19 ไบต์

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

จะต้องเรียกใช้เป็นราก

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

ทดสอบการทำงาน

$ 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:

ตามมาด้วยความมืดมิด

มันทำงานอย่างไร

int $0x80เรียกใช้ซอฟต์แวร์ขัดจังหวะ ใช้งานได้ทั้ง x86 และ x64 แต่ได้รับการคัดค้านมานานกว่าทศวรรษแล้วและไม่ควรใช้ในรหัสการผลิต ควรใช้รหัส x64 syscallแทน x86 ควรใช้sysenterแต่มันยุ่งยากเกินไปสำหรับการตีกอล์ฟ

การกระทำที่เกิดขึ้นจาก syscall นั้นขึ้นอยู่กับการลงทะเบียน EAX - EDX, ESI และ EDI ลินุกซ์ syscall อ้างอิงแสดง syscalls int $0x80ทั้งหมดที่มีอยู่ผ่านทาง

เมื่อ EAX ถือ0x58 (88) , รีบูตเรียกว่าซึ่งยังสามารถนำมาใช้เพื่อปิดใส่จะนอนหลับหรือจำศีลคอมพิวเตอร์เช่นเดียวกับการเปลี่ยนเมล็ดและปิดการใช้งานหรือการเปิดใช้Ctrl - Alt - Delคำสั่งผสมที่สำคัญ

ในช่วงเริ่มต้นของโปรแกรม - และโดยการรวบรวมด้วยasหรือgcc -nostdlibเราสามารถทำให้แน่ใจว่าเรากำลังจริงในช่วงเริ่มต้นของโปรแกรม - ลงทะเบียนส่วนใหญ่จะตั้งค่าเป็น0 ซึ่งรวมถึงการ EAX เพื่อให้เราสามารถใช้mov $0x58, %alการตั้งค่าที่ต่ำกว่า 8 บิตของ EAX เพื่อ0x58จึงตั้ง EAX ตัวเองไป0x58 สิ่งนี้จะช่วยประหยัดสองไบต์ไปที่การลงทะเบียนด้วยตนเองที่ศูนย์ด้วยตนเองxor %eax, %eaxและอีกหนึ่งทางเหนือmov $0x58, %eaxที่มีการเข้ารหัส0x58ใน 32 บิต

ข้อโต้แย้งสองข้อแรกในการรีบูตคือหมายเลขมายากลสันนิษฐานว่าสามารถป้องกันการรีบูตโดยไม่ตั้งใจและอ่านจากการลงทะเบียน EBX และ ECX ยกเว้นว่าตัวเลขเหล่านี้มีค่าคงที่บางค่ารีบูตปฏิเสธที่จะดำเนินการใด ๆ

  • หมายเลขเวทย์มนตร์แรกต้องเท่ากับ0xfee1dead ( รู้สึกว่าตาย ) ซึ่งอาจหมายถึงการปิด / ปิดเครื่องพีซี

  • เลขเวทย์มนตร์ที่สองสามารถมีค่าคงที่ได้ถึงสี่ค่าแม้ว่าค่าสามค่าหลังนั้นไม่สามารถใช้งานได้ใน Linux รุ่นโบราณ ดูเหมือนว่าทั้งหมดจะอ้างถึงการเปิด / ปิดเครื่อง PC ในภายหลัง

    • 0x28121969แสดงถึงวันเกิดของ Linus Torvalds (28 ธันวาคม 2512)

    • 0x05121996แสดงถึงวันเกิดของ Patricia Torvalds (5 ธันวาคม 1996)

    • 0x16041998แสดงถึงวันเกิดของ Daniela Torvalds (16 เมษายน 2541)

    • 0x20112000แสดงถึงวันเกิดของ Celeste Torvalds (20 พฤศจิกายน 2000)

    Patricia, Daniela และ Celeste Torvalds เป็นลูกสาวสามคนของ Linus Torvalds

  • การลงทะเบียน EDX เลือกประเภทของ "reboot" ที่เราต้องการ 0x4321fedcคือRB_POWER_OFFปิดพีซีและปิดเครื่อง

  • ในที่สุดคุ้มค่าของการลงทะเบียน ESI ถูกละเว้นสำหรับRB_POWER_OFF ; คุ้มค่าของการลงทะเบียน EDI จะถูกละเลยโดยสิ้นเชิงรีบูต

รุ่นอื่น, x64- เท่านั้น, 19 ไบต์

บน x64 เราสามารถใช้ syscall ที่เหมาะสมสำหรับจำนวนไบต์เดียวกัน

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

ความแตกต่างเพียงอย่างเดียวคือคำสั่ง ( syscallvs int $0x80) ค่าของ__NR_REBOOT ( 0xa9เทียบกับ0x58 ) และผู้ลงทะเบียนที่เกี่ยวข้อง


ปกติเราจะนับแอสเซมบลีเป็นไบต์ที่คอมไพล์โดยไม่มีไบต์เฟรมที่จำเป็นสำหรับส่วนหัว exe หรือไม่?
โยชูวา

ใช่เพราะแต่ละคำสั่งนั้นสอดคล้องกับไบต์ที่ระบุในไฟล์ไบนารี่ ไฟล์ ELF (หรือรูปแบบที่ระบบปฏิบัติการของคุณใช้) ถือเป็นภาษาอื่นและจะต้องสร้างขึ้นเองเพื่อให้ได้คะแนนที่ดี
Dennis

คุณสามารถเพิ่มฐานสิบหกหลังจากประกอบรหัสได้หรือไม่
ckjbgames


ฉันfee1ดังนั้นdeadในขณะนี้
arminb

49

PowerShell ขนาด 13 ไบต์

Stop-Computer

พริตตี้อธิบายด้วยตนเอง? ไม่ทำงานบน PowerShell core ดังนั้นจึงไม่สามารถใช้งานได้กับ PowerShell สำหรับ Linux / MacOS (ทดลองใช้กับ TIO :-D แล้ว)

การส่งขยะโบนัส 12 ไบต์

gcm s*r|iex

ในการทดสอบของฉันสิ่งนี้ใช้ได้กับ Windows 2003 ด้วย PowerShell 2.0 มันจะไม่ทำงานในเวอร์ชั่นที่ใหม่กว่าส่วนใหญ่และมันอาจไม่ทำงานขึ้นอยู่กับโมดูลที่ติดตั้ง มันค่อนข้างแย่มาก!

สิ่งนี้จะค้นหารายการคำสั่งสำหรับรูปแบบใด ๆs*rแล้วรันคำสั่งทั้งหมด! เพื่อความชัดเจนนี่เป็นอันตรายอย่าทำเช่นนี้!

เคล็ดลับคือการรับรายการคำสั่งที่ไม่มีพารามิเตอร์บังคับมิฉะนั้น PowerShell จะแจ้งให้ทราบค่า

บนเครื่อง 2003 ของฉันคำสั่ง 3 คำสั่งที่ส่งคืนคือ:

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...

ใช่มันไม่เปิดหน้าจอปะรำ Stop-Computerแต่ไม่มีก็ไม่ได้รอให้เสร็จสิ้นก่อนที่จะเปิด

วิธีการนี้สามารถทำงานกับเครื่องรุ่นใหม่ได้ขึ้นอยู่กับโมดูลที่ติดตั้ง แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้ใน Windows 2012 และ 2016 คือ14 ไบต์ :

gcm sto*er|iex

(และใช่แน่นอนว่าการส่ง winbatch นั้นจะทำงานใน PowerShell และมันก็สั้นกว่า แต่ .. ก็ไม่สนุก)


4
ตัวย่อสำหรับ Win7 & Win10 (และอาจมากกว่า): gcm *p-c*|iex- และมีเพียงผลลัพธ์เดียวเช่นกัน!
Bob

@Bob ยังขึ้นอยู่กับโมดูลที่ติดตั้งยัง; บนเครื่อง Win10 ของฉันมันส่งคืนผลลัพธ์ 6 รายการซึ่งหลายรายการจะมีพารามิเตอร์บังคับ (ดังนั้นพวกเขาจะแจ้งให้ทราบและไม่เคยทำStop-Computerซึ่งเป็นผลลัพธ์สุดท้าย)
นักเทศน์

39

แบตช์ 10 ไบต์

บน windows สิ่งนี้จะเพียงพอ

shutdown/s

สิ่งนี้จะตั้งค่าการปิดระบบในหนึ่งนาที

หรืออีกทางหนึ่งเป็น @flashbang คะแนน:

shutdown/p

สิ่งนี้จะปิดเครื่องคอมพิวเตอร์ทันที


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

96
@RaisingAgent ที่นี่ที่ PPCG เราแก้ปัญหาของเราในรหัส มีการใช้แรงงานทางกายภาพ
steenbergh

12
@steenbergh ฉันไม่รู้ ... กดหนึ่งปุ่มใหญ่เทียบกับ 10 keystrokes? ฉันจะไปกับปุ่ม
WorldSEnder

16
@RaisingAgent ข้อเสนอของคุณมีปัญหาเรื่องความยืดหยุ่น ลองทำกับคอมพิวเตอร์ 10,000 เครื่องสี่ครั้งต่อสัปดาห์
Emilio M Bumachar

10
@RaisingAgent ผู้ชายที่แท้จริงใช้สวิตช์ที่เหมาะสมกับ PSU
Cruncher

35

รหัสเครื่อง x86, Lenovo Z510, DOS COM หรือ Bootloader, 7 ไบต์

BITS 16

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

ประกอบเป็น B8 00 3C BA 04 18 EF

ฉันใช้ประโยชน์จาก " คุณได้รับอนุญาตให้เขียนโค้ดที่ทำงานในสภาพแวดล้อม / OS เฉพาะหากคุณต้องการ " ในระดับสูงสุด: สิ่งนี้จะใช้ได้กับ Lenovo Z510 1เท่านั้น

นี้เขียนSLP_TYPa << 10 | SLP_ENไปยังการPM1a_CNTลงทะเบียน ACPI ฉันทิ้งค่านี้จากตาราง ACPI เดือนที่ผ่านมาสำหรับคำตอบเกี่ยวกับการปิด (ที่ฉันให้บริบทกับรหัสข้างต้น)

สิ่งนี้สามารถเรียกใช้ภายใต้ DOS เป็น COM (เพียงเขียนข้อมูลไบนารีลงในไฟล์และเปลี่ยนนามสกุลเป็น "com") หรือเป็น bootloader
สำหรับหลังเขียนลายเซ็นมาตรฐานและระวังของปัญหาที่มีเฟิร์มแวทันสมัย


1ไม่จริงอย่างเคร่งครัดระบบใด ๆ ที่เกิดขึ้นกับการกำหนดค่า ACPI เดียวกันจะปิดด้วยเช่นกัน


13
อัปโหลดเนื่องจากแพลตฟอร์มที่ จำกัด
ท่อ

ฮา! ใครบางคนชนะเดนนิส!
Joshua

หากคุณไปด้วยการนับ 7 ไบต์คุณควรเรียกสิ่งนี้ว่าการส่งรหัสเครื่องแทนที่จะเป็นชุดประกอบ การส่งแอสเซมบลีคือ 63 ไบต์
Jakob

@ Jakob คุณพูดถูก!
Margaret Bloom

คุณดูเหมือนคนที่เหมาะสมที่จะตอบคำถามนี้: stackoverflow.com/questions/2019463/ ...... (ฉันล้มเหลวอย่างน่าสังเวชที่ต้องลบ "คำตอบ" ของฉันออกจากความอัปยศ)
ศ. Falken

34

เชลล์ GRUB ขนาด 4 ไบต์

แข็งแรงเล่นกอล์ฟ

halt

คำสั่ง: หยุด - no-apm

คำสั่งหยุดทำงานคอมพิวเตอร์ หากระบุตัวเลือก --no-apm จะไม่มีการเรียก APM BIOS มิฉะนั้นคอมพิวเตอร์จะปิดโดยใช้ APM

โบนัส

นี่คือหลักฐานว่าเปลือก GRUB เป็น Tur - ing ที่สมบูรณ์ (ดูความคิดเห็น):

ป้อนคำอธิบายรูปภาพที่นี่


เปลือกด้วงไม่ได้เป็น "ภาษาการเขียนโปรแกรม" - มันไม่ทัวริงสมบูรณ์
Alnitak

9
@ Alnitak อะไรที่ทำให้คุณคิดอย่างนั้น? มันมีคุณสมบัติค่อนข้างสูงbuilt-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivativesและรองรับตัวแปร, การสร้างแบบมีเงื่อนไข, ฟังก์ชั่นและอื่นๆ อย่างเห็นได้ชัดมันคือการเปิด - สมบูรณ์โดยการวัดใด ๆ
เรือเหาะ

1
ตกลงฉันจะเอากลับมา - ฉันไม่พบสิ่งนั้นเมื่อฉันดู
Alnitak

28
เมื่อไม่สามารถแสดงเครื่องปั่นด้ายเห็นได้ชัดว่าไม่ใช่ Tur - ing ที่สมบูรณ์
J_F_B_M

1
ใน Bash มันเป็นคำสั่งเดียวกัน
Paweł Tokarz

31

รหัสเครื่อง 65C02 1 ไบต์

คำสั่ง STP (0xDB):

STP จะหยุดอินพุตนาฬิกาของ 65C02 และทำการปิด 65C02 ได้อย่างมีประสิทธิภาพจนกว่าการรีเซ็ตฮาร์ดแวร์จะเกิดขึ้น (เช่นขา RES ทำงานต่ำ) สิ่งนี้ทำให้ 65C02 เข้าสู่สถานะพลังงานต่ำ สิ่งนี้มีประโยชน์สำหรับแอปพลิเคชัน (วงจร) ที่ต้องการการใช้พลังงานต่ำ แต่ STP ก็ไม่ค่อยเห็นเป็นอย่างอื่น

(ที่มา: http://www.6502.org/tutorials/65c02opcodes.html )

การถ่ายโอนข้อมูล xxd:

00000000: db                                       .

noice ฉันเป็นแฮ็กเกอร์ Apple II ย้อนกลับไปในวันนั้นและไม่เคยจำรหัสนี้เลย
kindall

1
ใช่หลังจากเขียนอีมูเลเตอร์ 65c816 พร้อมคุณสมบัติเพิ่มเติมและเห็นความท้าทายนี้ฉันรู้ว่าต้องทำอย่างไร: P ด้วยดูเหมือนว่านี่เป็นคำตอบเพียง 1 ไบต์เท่านั้น! \ o /
therealfarfetchd

24

Matlab, 21 ไบต์

system('shutdown -s')

ฉันไม่ได้ลองทำสิ่งนี้ (ปิดโปรแกรมทั้งหมดเพื่อเริ่มการทำงานใหม่ในช่วงกลางวันไม่ดึงดูดจริงๆ) แต่มันควรจะได้ผล . มันใช้งานได้ ...

ฉันจะเพิ่มคำอธิบายสั้น ๆ ในภายหลังแล็ปท็อปของฉันปิดอยู่


105
"ฉันจะเพิ่มคำอธิบายสั้น ๆ ในภายหลังแล็ปท็อปของฉันปิดอยู่" <- อันตรายจากความท้าทายในการปิดระบบ
Suever

4
Axaxaxaxa เอาล่ะรีสตาร์ทเครื่องคอมพิวเตอร์ของคุณทุกครั้งไม่นานก็ไม่เลว :)
RaisingAgent

6
ไม่ทำลายของคุณuptimeแม้ว่า
เวย์นเวอร์เนอร์

ทำไมส่งนี่เป็น MATLAB แทนที่จะส่งshutdown -sเป็นเชลล์?
immibis

10
เพราะสำหรับฉันเปลือกเป็นสิ่งที่ฉันพบบนชายหาดหรือปั๊มน้ำมัน
Stewie Griffin

21

MATLAB 11 ไบต์

!shutdown/p

ค่อนข้างคล้ายกับวิธีการที่สตีวีกริฟฟิ อย่างไรก็ตาม MATLAB มีวิธีวิธีที่สั้นกว่าของการเรียกคำสั่งระบบ; ในกรณี!นี้ใช้ Windows ไม่จำเป็นต้อง.exeใช้ชื่อคำสั่งดังนั้นมันจึงถูกทิ้งเช่นกัน /ตัวเลือกที่ได้รับการสนับสนุนยังคง (ฉันใช้ Windows 10) และขัดแย้งกับความจำเป็นสำหรับพื้นที่ ทางเลือกคือ:

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 ไบต์

OPTION

ก่อให้เกิดความผิดพลาดทำให้ 3DS เริ่มต้นใหม่ ฉันหวังว่าสิ่งนี้จะนับ

ทำงานได้ในเวอร์ชันล่าสุด


ฉันคิดว่าสิ่งนี้ได้รับการแก้ไขแล้ว ... โปรดระบุหมายเลขเวอร์ชัน
wizzwizz4

3
มันได้รับการติดตั้งในเวอร์ชั่น 3.5 ซึ่งยังไม่ได้ออกนอกประเทศญี่ปุ่น
12Me21

4
@ 12Me21 แน่นอนมันนับ ทางเลือกที่ดีของสภาพแวดล้อม
P. Ktinos

ถ้าREBOOTนับจาก SBv2 เท่านั้นนับเป็นคำตอบที่ถูกต้อง
หอยทาก _

16

Bash, 7 6 ไบต์

init 0

สมมติว่าโปรแกรมรันเป็น root


แน่นอนต้องปิดเครื่อง ดังนั้นคุณต้อง 'halt -p' เป็นคำตอบที่ถูกต้อง
P. Ktinos

4
การสังหารหมู่การแก้ไขนี้ :)
RaisingAgent

@ P.Ktinos: poweroffเป็นคำเดียวแม้ว่าจะมีตัวอักษรเพิ่มขึ้นเล็กน้อย
ccpizza

1
@ccpizza ถูกต้อง แต่เกณฑ์การให้คะแนนทั่วไปคือนับไบต์
Suever

13

Java, 101 98 62 42 ไบต์

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

ตามที่ @Snowman ชี้ให้เห็นว่าคำถามไม่ได้ระบุว่าจำเป็นต้องใช้โปรแกรมแบบเต็มหรือไม่ดังนั้นจึงควรยอมรับได้


2
มันสั้นกว่าที่จะแทนที่classด้วยinterfaceเนื่องจากอนุญาตให้คุณละเว้นpublicจาก main
Pavel

6
คุณสามารถใช้วิธีการเนื่องจากคำถามไม่ได้ระบุการส่งจะต้องเป็นโปรแกรมเต็มรูปแบบ:void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}

1
จะไม่ได้เป็นรุ่นลินุกซ์เป็นบิตสั้น?
jpmc26

2
()->{Runtime.getRuntime().exec("init 0");}หรือไม่แน่นอน()->Runtime.getRuntime().exec("init 0")(ไม่สามารถตรวจสอบได้ในขณะนี้) มันเป็นแลมบ์ดาที่ใช้โมฆะที่กำหนดเองได้
Olivier Grégoire

1
สิ่งนี้ควรมีการระบุว่าเป็นคำตอบเฉพาะของ Linux เช่น "Java on LInux"
Jakob

13

Python 2, 29 ไบต์

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

ทำงานบนระบบ Linux และต้องการสิทธิ์รูท

สำหรับ Windows 33 ไบต์

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

นี่อาจเป็นรหัสที่น่าสนใจหรือมีประโยชน์น้อยที่สุดที่ฉันเคยเขียน


2
มีคนอื่นโพสต์เวอร์ชันของเชลล์ Linux
jpmc26

1
Ah ตกลงที่ไม่ดีของฉัน ..
FlipTack

12

พลเรือจัตวา 64, 11 ไบต์

0 sys64738

นี่คือจากพรอมต์พื้นฐาน หรือ...

Commodore 64 แอสเซมบลี 6502, 3 ไบต์ (ประกอบ), 16 ไบต์ (แหล่งที่มา)

*=8000
JMP $FCE2

ฉันคิดว่าการใช้โหมดป้อนข้อมูลโดยตรง Commodore 64 จาก BASIC ด้วยsys64738จะใช้ศูนย์ไบต์เนื่องจากไม่มีโปรแกรมหรือสิ่งอื่นใดที่จะเก็บ; คุณกำลังใช้ RAM หน้าจอ แต่ RAM นั้นเต็มไปด้วยช่องว่างแล้วดังนั้นคุณเพียงแค่แทนที่ช่องว่างเหล่านั้นด้วยข้อความ
Shaun Bebbers

2
ซอร์สโค้ดใช้พื้นที่ว่าง เพียงเพราะมันไม่ได้จองพื้นที่บนเครื่องเป้าหมายไม่ได้หมายความว่ามันใช้เวลาถึง 0 ไบต์ มิฉะนั้นคำตอบจะเป็น ``
wizzwizz4

3
คุณไม่ต้องการช่องว่างระหว่าง0และsys64738คุณสามารถแทนที่sysด้วยรูปแบบทางลัดsYและฉันไม่นับบรรทัดใหม่ตามความยาวของโปรแกรม อย่างไรก็ตามฉันไม่คิดว่ารหัสของคุณตรงตามข้อกำหนด: รหัสที่ 64738 ทำการรีเซ็ตแบบนุ่มนวลไม่ใช่ poweroff
Mark

2
ไม่ปิดเครื่อง
TecBrat

1
ฉันเคยดื่มเบียร์ที่ Commodore 64 ของฉันซึ่งมันปิดอย่างถาวร สิ่งนี้นับหรือไม่
Shaun Bebbers

12

TI-Nspire CX CAS ขนาด 3 ไบต์

" "+" "

รวมสองสตริงที่ว่างเปล่า

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

วิดีโอโดย Adriweb


ไม่ใช่ขนาด 7 ไบต์ใช่ไหม
Roman Gräf


ฟังดูน่าเชื่อถือสำหรับฉัน
Roman Gräf

11

C ++, 51 40 ไบต์

-11 ไบต์ขอบคุณIngve !

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

ใช้งานได้เฉพาะในIncludeOS (v0.10.0-rc.1)

ทดสอบ:

$ 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
ตอนนี้ฉันอยากรู้เกี่ยวกับ IncludeOS
Karl Napf

@KarlNapf อัลเฟรดจัดงานนำเสนอที่ยอดเยี่ยมที่ CppCon 2016 เกี่ยวกับ IncludeOS: youtube.com/watch?v=t4etEwG2_LYหากคุณต้องการทราบข้อมูลเพิ่มเติม :-)
simon

1
คุณไม่จำเป็นต้องใช้void Service::start, int main การทำงานใน IncludeOSเช่นกัน
Ingve


9

AutoHotkey 11 11ไบท์

บันทึกเป็นไบต์ขอบคุณGurupad Mamadapur

Shutdown,9

AHK รองรับคำสั่งปิดเครื่องตามค่าเริ่มต้น 9เป็นธงประกอบด้วย+Shutdown=1PowerDown=8


1
AHKลึกลับ
Gurupad Mamadapur

คุณต้องการพื้นที่ว่างหลังเครื่องหมายจุลภาคหรือไม่
therealfarfetchd

พื้นที่หลัง,ไม่จำเป็น ลองทดสอบด้วยธงอื่น ฉันคิดว่าสิ่งนี้จะไม่ปิดเครื่องทันทีและใส่ไว้ในสคริปต์หลักของฉันซึ่งโหลดเมื่อเริ่มต้น: D ตอนนี้ฉันโหลดในเซฟโหมดและแก้ปัญหา ถอนหายใจ
Gurupad Mamadapur

9

รหัสเครื่อง (x86, ตัวโหลดบูต) 18 ไบต์

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

ถอดชิ้นส่วน:

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

คุณสามารถทดสอบในดีบักเกอร์ของ Bochs ด้วยคำสั่งต่อไปนี้ (หลังจากเริ่มการจำลองโดยมีการตั้งค่าดิสก์ไดรฟ์บางส่วน):

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

รหัสเครื่องเดียวกันนี้จะทำงานเป็น DOS ที่สามารถเรียกใช้งานได้ ( *.COM)


7

C #, 79 54 53 ไบต์

สิ่งนี้ใช้ได้กับ Windows

79 ไบต์ :

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

53 ไบต์ขอบคุณ TheLethalCoder:

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

2
โปรดทราบว่าความท้าทายไม่จำเป็นต้องใช้โปรแกรมเต็มรูปแบบและไม่อนุญาตให้ป้อนข้อมูล (ไม่ได้ใช้แน่นอน) เพื่อให้คุณสามารถคอมไพล์Action<int>และทำ_=>System.Diagnostics.Process.Start("shutdown", "/s");กับ 54 ไบต์
TheLethalCoder

@TheLethalCoder อัปเดตขอบคุณ!
Dariusz Woźniak

คุณสามารถลบพื้นที่ที่ไม่จำเป็นออกได้
nothrow

แน่นอนใช่! ขอบคุณ @nothrow :)
Dariusz Woźniak

6

AutoIt 11 ไบต์

Shutdown(1)

ฟังก์ชั่นปิดเครื่องได้รับการรวมกันของรหัสต่อไปนี้

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

ในการปิดเครื่องและปิดเครื่องตัวอย่างเช่นรหัสจะเป็น 9 (ปิดเครื่อง + ปิดไฟ = 1 + 8 = 9)


1
0(ออกจากระบบ) เป็นกรณีพิเศษที่นี่; มันไม่ได้รวมกับสแตนด์บายหรือไฮเบอร์เนตโดยปริยาย
wizzwizz4

ตกลง0 + 32 = 32
rahnema1

หืมมันออกจากระบบเสมอก่อนเข้าสู่โหมดเตรียมพร้อม
Ruslan

@Ruslan ผมไม่ทราบว่าวิธีการทำงาน, คุณสามารถดูฟอรั่มของผู้ใช้ AutoItที่จะได้รับการตอบรับมากขึ้น :-)
rahnema1

6

Windows - NativeAPI, 212 ไบต์

ตกลงนี่ไม่ใช่รุ่นที่สั้นที่สุดจริงๆ แต่น่าสนใจสำหรับบางคน สิ่งนี้จะไม่ทำงานบนระบบย่อย Win32 อย่างไรก็ตามมันจะทำงานเมื่อดำเนินการภายในบริบทของ Native API (เช่นเดียวกับ 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);
}

สร้าง

หากต้องการสร้างสิ่งนี้ให้ใช้build.exeเครื่องมือWinDDK (พร้อมsourceไฟล์ที่เหมาะสมสำหรับNMAKE)

หรือใช้คำสั่งเหล่านี้เพื่อรวบรวมและลิงก์:

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 

หมายเหตุ: สิ่งนี้จะสร้าง x แบบดั้งเดิมที่รันได้ x86 เปลี่ยนบิตที่เหมาะสมหากคุณต้องการสร้างสิ่งนี้สำหรับสถาปัตยกรรมที่แตกต่าง

ทดสอบ

ในการทดสอบความสามารถในการปฏิบัติการแบบเนทีฟคุณต้องดำเนินการก่อนที่จะโหลดระบบย่อย win32 วิธีทั่วไปวิธีหนึ่งในการเพิ่มความสามารถในการปฏิบัติการในคีย์รีจิสตรีต่อไปนี้:

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

การเตือน

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

ฉันทำมันบน VM ที่ฉันสามารถย้อนกลับไปเป็น snapshot ก่อนหน้าได้อย่างง่ายดาย!



5

เชลล์ Linux ส่วนใหญ่ 15 ไบต์

# echo o>/p*/*ger

อาจทำให้มีความยาว 11 ไบต์หากคุณอยู่ใน/procไดเรกทอรี:

# echo o>*ger

สิ่งนี้ตรงไปตรงมามาก (ไม่มีผลข้างเคียงเช่นถอนการติดตั้งระบบไฟล์หรือกระบวนการฆ่า) และค่อนข้างโหดร้าย


1
ครั้งล่าสุดที่ฉันลองใช้สัญลักษณ์แทนการขยายบนการเปลี่ยนเส้นทางมันสร้างไฟล์ด้วยไวด์การ์ดในนั้นแม้ว่าจะมีไฟล์ที่ตรงกันอยู่
Joshua

5
ฉันเชื่อว่าคุณต้องเพิ่ม "/ proc /" ไปยังจำนวนไบต์ของคุณ
Zeppelin

@Joshua มันอาจจะขึ้นกับเชลล์ ฉันทดสอบกับbashคอมพิวเตอร์ของฉันจริง ๆ:-)
Radovan Garabík

1
@Radovan Garabík - ฉันไม่คิดว่ามันถูกต้องจริงๆ นี่เป็นพื้นเดียวกันกับที่บ่งบอกว่ามีนามแฝง "p = poweroff" (ซึ่งไม่ใช่ "เป็นไปไม่ได้" ด้วย) และอ้างว่า "p" เป็นโซลูชัน1 ไบต์ที่ถูกต้อง
เรือเหาะ

1
แต่คุณอาจทำให้ค่าใช้จ่ายถูกต้องเพียง 3 ไบต์เช่นนี้echo o>/p*/*ger
zeppelin


5

AppleScript ขนาด 44 ไบต์

tell application "Finder"
shut down
end tell

ฉันไม่รู้ว่าไวยากรณ์ AppleScript ทำงานอย่างไรหรืออะไรก็ตามดังนั้นถ้าใครรู้วิธีย่อให้สั้นลงโปรดบอก

นอกจากนี้ฉันกำลังทำสิ่งนี้ทางโทรศัพท์ที่โรงเรียน ("แฮ็ค") ดังนั้นฉันจึงไม่สามารถทดสอบได้

ที่ 14 ไบต์น้อยลง (ขอบคุณทุกคน) คุณสามารถพูดได้

tell app "Finder" to shut down

มีคนหาคำตอบสั้นลง (ด้วยโปรแกรมเดียวกัน) ไม่กี่ชั่วโมงหลังจากคุณ (แต่โพสต์ไว้แทนที่จะแสดงความคิดเห็นที่นี่) codegolf.stackexchange.com/a/107958/62824
devRicher

คุณสามารถลบการเยื้อง
Cyoce

4
tell app "Finder" to shut downฉันควรทำงานได้ดี (แม้ว่าการรวบรวมอาจแทนที่ 'แอป' ด้วย 'แอปพลิเคชัน')
kindall


4

Clojure, 40 39 ไบต์

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

-1 ไบต์โดยการเปลี่ยนสถานะจาก-sเป็น/sซึ่งทำให้ฉันสามารถกำจัดพื้นที่

โดยทั่วไปคำตอบของจาวา

การทดสอบนี่สนุก Windows ตัดสินใจที่จะทำการอัปเดตเฟิร์มแวร์บน Surface ของฉันครั้งที่สองมันปิดตัวลง แน่นอน.

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



2

C ++, 48 47 (Windows) 46 45 (Linux) ไบต์

ลบ 1 byte ขอบคุณ Snowman

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

สิ่งนี้จะปิดระบบสำหรับ windows

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

สิ่งนี้จะปิดระบบสำหรับ Linux


คุณจะต้อง;?
RaisingAgent

1
@LliwTelracs ค่อนข้างแน่ใจว่ามันเป็น "shutdown / p" และไม่ใช่ "-p" และไม่จำเป็นต้องใช้พื้นที่
P. Ktinos

ใช้เครื่องหมายอัฒภาคสำหรับไวยากรณ์ c ++ ที่เหมาะสมการใช้เครื่องหมายสแลชช่วยให้คำตอบสั้นลงสำหรับ windows แต่ทำให้ใช้งานไม่ได้กับ linux อีกต่อไป แม้ว่าฉันจะเพิ่มตัวละครที่ไม่ถูกต้องสำหรับการปิดระบบที่ใช้ร่วมกันระหว่าง windows และ linux
fəˈnəˈtɪk

@LliwTelracs แม้ว่าคุณจะสามารถทำสิ่งที่คุณต้องการฉันขอแนะนำให้ใช้กฎข้อที่ 2 และไม่สนใจเกี่ยวกับฟังก์ชั่น Linux เนื่องจากนี่เป็น code-golf และไบต์ที่ต่ำกว่าจะดีกว่า
P. Ktinos

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