Wyłącz komputer!

83

Wyzwanie:

W wybranym języku programowania zamknij maszynę, na której został wykonany kod.

Zasady

  • Brak wyłączania z powodu wyczerpania zasobów (np .: widełki, aby wymusić zamknięcie)
  • Możesz napisać kod, który działa tylko w określonym środowisku / systemie operacyjnym, jeśli chcesz.
  • Standardowe luki są zabronione

To jest , więc wygrywa najmniejsza ilość bajtów!

P. Ktinos
źródło
62
Mam przyjaciół, którzy robią to w szkole i myślą, że „
hakują
12
Powinniśmy raz wymyślić jakąś zasadę, aby zatrzymać takie `whatever`;Bash / Perl / PHP / Ruby / itp. głupoty.
manatwork
260
Windows, 0 bajtów. Pozostaw komputer włączony na kilka dni i pozwól automatycznym aktualizacjom zadziałać
Luis Mendo
28
Czy ktoś jeszcze zauważył brak linków TIO?
steenbergh
8
@MontyHarder Po przeczytaniu tej strony postanowiłem shatdown: past tense of the verb shutdown
zliczyć

Odpowiedzi:

92

Zestaw (x86 / x64, Linux, as) , 22 21 19 bajtów

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

Musi być uruchomiony jako root.

Jest to równoważne z naciśnięciem przycisku zasilania i nie jest bezpiecznym sposobem na wyłączenie komputera. syncPrzed uruchomieniem tego programu należy zamknąć wszystkie otwarte aplikacje i wykonać, aby opróżnić wszystkie bufory systemu plików, aby przynajmniej zminimalizować ryzyko uszkodzenia plików.

Testowe uruchomienie

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

Następnie ciemność.

Jak to działa

int $0x80wywołuje przerwanie oprogramowania. Działa zarówno na x86, jak i x64, ale jest przestarzały od ponad dekady i nie powinien być stosowany w kodzie produkcyjnym. syscallZamiast tego należy użyć kodu x64 . x86 powinno użyć sysenter, ale jest zbyt kłopotliwe dla golfa kodowego.

Wynikowa akcja wywołania syscall zależy od rejestrów EAX - EDX, ESI i EDI. Linux syscall referencyjny pokazuje wszystkie wywołań systemowych, które są dostępne za pośrednictwem int $0x80.

Gdy EAX ma wartość 0x58 (88) , wywoływany jest restart , który można również wykorzystać do wyłączenia zasilania, uśpienia lub hibernacji komputera, a także do przełączania jądra i wyłączania lub włączania kombinacji klawiszy Ctrl - Alt - Del .

Na początku programu - i kompilując się z aslub gcc -nostdlibmożemy upewnić się, że faktycznie jesteśmy na początku programu - większość rejestrów jest ustawiona na 0 . Obejmuje to EAX, więc możemy użyć, mov $0x58, %alaby ustawić niższe 8 bitów EAX na 0x58 , a tym samym ustawić EAX na 0x58 . Pozwala to zaoszczędzić dwa bajty na ręcznym zerowaniu rejestru za pomocą xor %eax, %eaxi jeszcze jeden na prostym, mov $0x58, %eaxktóry koduje 0x58 w 32 bitach.

Pierwsze dwa argumenty do ponownego uruchomienia to magiczne liczby, prawdopodobnie w celu uniknięcia przypadkowego ponownego uruchomienia, i są odczytywane z rejestrów EBX i ECX. Jeśli te liczby nie są równe pewnym stałym, ponowne uruchomienie odmawia wykonania jakiejkolwiek akcji.

  • Pierwsza magiczna liczba musi być równa 0xfee1dead ( czuć się martwym ), prawdopodobnie odnosząc się do wyłączenia zasilania / śmierci komputera.

  • Druga magiczna liczba może być równa czterem różnym stałym, chociaż trzy ostatnie nie działały w starożytnych wersjach Linuksa. Wszystkie wydają się odnosić do późniejszego włączenia / narodzin komputera.

    • 0x28121969 reprezentuje urodziny Linusa Torvaldsa (28 grudnia 1969 r.).

    • 0x05121996 reprezentuje urodziny Patricii Torvalds (5 grudnia 1996 r.).

    • 0x16041998 reprezentuje urodziny Danieli Torvalds (16 kwietnia 1998 r.).

    • 0x20112000 reprezentuje urodziny Celeste Torvalds (20 listopada 2000).

    Patricia, Daniela i Celeste Torvalds są trzema córkami Linusa Torvaldsa.

  • Rejestr EDX wybiera rodzaj „restartu”, jaki chcemy. 0x4321fedc to RB_POWER_OFF , wyłączanie komputera i wyłączanie go.

  • Na koniec wartość rejestru ESI jest ignorowana dla RB_POWER_OFF ; wartość rejestru EDI jest całkowicie ignorowana przez restart .

Wersja alternatywna, tylko x64, 19 bajtów

Na x64 możemy użyć odpowiedniego wywołania systemowego dla tej samej liczby bajtów.

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

Jedyne różnice dotyczą instrukcji ( syscallvs int $0x80), wartości __NR_REBOOT ( 0xa9 vs 0x58 ) i zaangażowanych rejestrów.

Dennis
źródło
Czy zwykle liczymy asembler jako skompilowane bajty bez bajtów ramek wymaganych dla nagłówka exe?
Joshua
Tak, ponieważ każda instrukcja odpowiada określonym bajtom w pliku binarnym. Pliki ELF (lub jakikolwiek inny format używany przez system operacyjny) są uważane za inny język i muszą zostać utworzone ręcznie, aby uzyskać przyzwoity wynik.
Dennis
Czy możesz dodać zrzut heksowy po złożeniu kodu?
ckjbgames
@ckjbgames Oto jest.
Dennis
I fee1tak deadteraz.
arminb
49

PowerShell, 13 bajtów

Stop-Computer

Dość oczywiste? Nie działa na rdzeniu PowerShell, więc nie będzie działać na PowerShell dla Linux / MacOS (już wypróbowałem na TIO :-D).

Dodatkowe zgłoszenie śmieci, 12 bajtów

gcm s*r|iex

W moich testach działa to w systemie Windows 2003 z programem PowerShell 2.0. Nie działa na większości nowszych wersji i może nie działać w zależności od zainstalowanych modułów. To jest okropne!

Przeszukuje listę poleceń pod kątem dowolnego wzorca, s*ra następnie uruchamia je wszystkie! Żeby było jasne, jest to niebezpieczne, nie rób tego!

Sztuką jest oczywiście uzyskanie listy poleceń, które nie mają żadnych obowiązkowych parametrów, w przeciwnym razie PowerShell poprosi o podanie wartości.

Na mojej maszynie z 2003 roku 3 zwracane przez nią polecenia to:

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

Tak, uruchamia wygaszacz ekranu markizy, ale nie, nie czeka na zakończenie przed uruchomieniem Stop-Computer.

Takie podejście może działać na nowszych komputerach, ponownie w zależności od zainstalowanych modułów, ale najlepsze, co mogłem zrobić w systemach Windows 2012 i 2016, to 14 bajtów :

gcm sto*er|iex

(i tak, oczywiście, przesyłanie winbatch będzie działać w PowerShell i jest krótszy, ale .. to nie jest fajne)

briantist
źródło
4
Krótszy dla Win7 i Win10 (i może więcej): gcm *p-c*|iex- i jest tylko jeden wynik!
Bob
@Bob nadal bardzo zależy od zainstalowanych modułów; na mojej maszynie Win10 zwraca 6 wyników, z których kilka będzie miało obowiązkowe parametry (więc będą wyświetlać monity i nigdy tego nie robić Stop-Computer, co jest ostatnim wynikiem).
briantist
39

Partia, 10 bajtów

W systemie Windows to wystarczy

shutdown/s

Spowoduje to zamknięcie za minutę.

Alternatywnie, jak wskazuje @flashbang:

shutdown/p

To natychmiast wyłącza komputer.

Steenbergh
źródło
79
Press the big button on the front of your computer= 0 bajtów
RaisingAgent
96
@ RaisingAgent Tutaj w PPCG rozwiązujemy nasze problemy z kodem. Zmarnowano pracę fizyczną.
steenbergh
12
@steenbergh Nie wiem ... naciśnięcie jednego dużego przycisku vs 10 naciśnięć klawiszy? Pójdę z przyciskiem
WorldSEnder
16
@RaisingAgent Twoja propozycja ma problemy ze skalowalnością. Spróbuj to zrobić dla 10.000 komputerów cztery razy w tygodniu.
Emilio M Bumachar
10
@RaisingAgent prawdziwi mężczyźni używają przełącznika, który jest odpowiedni na zasilaczu
Cruncher
35

kod maszynowy x86, Lenovo Z510, DOS COM lub Bootloader, 7 bajtów

BITS 16

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

Zmontowane w B8 00 3C BA 04 18 EF

Używam „ Możesz pisać kod, który działa tylko w określonym środowisku / systemie operacyjnym, jeśli chcesz ” do najwyższego poziomu: zadziała to tylko na Lenovo Z510 1 .

Zapisuje SLP_TYPa << 10 | SLP_ENto w PM1a_CNTrejestrze ACPI, zrzuciłem te wartości z tabel ACPI kilka miesięcy temu, aby uzyskać odpowiedź na temat zamykania (gdzie podam nieco kontekstu do powyższego kodu).

Można to uruchomić w systemie DOS jako COM (wystarczy zapisać dane binarne w pliku i zmienić rozszerzenie na „com”) lub jako program ładujący.
W tym drugim przypadku napisz standardowy podpis i strzeż się problemów z nowoczesnym oprogramowaniem .


1 Nie do końca prawda, każdy system, który ma taką samą konfigurację ACPI, również się wyłączy.

Margaret Bloom
źródło
13
Pozytywne z powodu ograniczonej platformy.
rura
Ha! Ktoś pokonał Dennisa!
Joshua
Jeśli korzystasz z 7-bajtowej liczby, powinieneś nazwać to wysyłaniem kodu maszynowego, a nie rozwiązaniem montażu. Przesyłanie zestawu wynosi 63 bajty.
Jakob
@Jakob Masz rację!
Margaret Bloom
Wyglądasz jak właściwa osoba, aby odpowiedzieć na to pytanie: stackoverflow.com/questions/2019463/... (Nieszczęśliwie to zawiodłem, musiałem usunąć swoją „odpowiedź” ze wstydu.)
Prof. Falken
34

Powłoka GRUB , 4 bajty

Grał w golfa

halt

Polecenie: halt --no-apm

Polecenie zatrzymuje komputer. Jeśli podano opcję --no-apm, nie jest wykonywane żadne wywołanie APM BIOS. W przeciwnym razie komputer zostanie zamknięty za pomocą APM.

Premia

Tutaj jest dowodem grub rzeczywiście Tur n ie-końca (patrz komentarz)

enter image description here

zepelin
źródło
grub shell nie jest „językiem programowania” - nie jest ukończony przez Turinga
Alnitak
9
@Alnitak, co sprawia, że ​​tak myślisz? Posiada dość zaawansowane built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivativesi obsługuje zmienne, konstrukcje warunkowe, funkcje i wiele innych , więc oczywiście jest kompletny pod każdym względem.
zeppelin
1
OK, cofnę to - nie znalazłem tego, kiedy spojrzałem
Alnitak
28
Kiedy nie można wyświetlać tarczy nie jest oczywiście Tur n ie-complete
J_F_B_M
1
W Bash jest to ta sama komenda.
Paweł Tokarz
31

Kod maszynowy 65C02, 1 bajt

Instrukcja STP (0xDB):

STP zatrzymuje wejście zegara 65C02, skutecznie wyłączając 65C02, dopóki nie nastąpi reset sprzętowy (tzn. Pin RES spadnie). To powoduje, że 65C02 znajduje się w stanie niskiej mocy. Jest to przydatne w aplikacjach (obwodach), które wymagają niskiego zużycia energii, ale STP rzadko widuje się inaczej.

(Źródło: http://www.6502.org/tutorials/65c02opcodes.html )

zrzut xxd:

00000000: db                                       .
tam pobrano
źródło
Noice Wcześniej byłem hakerem Apple II i nawet nie pamiętałem tego kodu.
uprzejmie
1
Tak, po napisaniu emulatora 65c816 z dodatkowymi funkcjami i obejrzeniu tego wyzwania wiedziałem, co zrobić: P Wygląda na to, że jest to jedyna jak dotąd odpowiedź 1-bajtowa! \ o /
pobierał
24

Matlab, 21 bajtów

system('shutdown -s')

Nie próbowałem tego (zamknięcie wszystkich programów w celu ponownego uruchomienia w środku dnia nie jest tak naprawdę kuszące), ale powinno działać. . To działa...

Dodam krótkie wyjaśnienie później, mój laptop jest obecnie wyłączony.

Stewie Griffin
źródło
105
„Później dodam krótkie wyjaśnienie, mój laptop jest obecnie wyłączony”. <- Niebezpieczeństwo wyzwania zamknięcia
Suever
4
Axaxaxaxa, cóż, ponowne uruchamianie komputera co jakiś czas nie może być złe :)
RaisingAgent
6
uptime
Wayne Werner
Po co przesyłać to jako MATLAB, zamiast przesyłać shutdown -sjako powłokę?
immibis
10
Ponieważ dla mnie muszla jest albo czymś, co znajduję na plaży, albo stacją benzynową.
Stewie Griffin
21

MATLAB, 11 bajtów

!shutdown/p

Nieco podobny do podejścia Stewiego Griffina . MATLAB ma jednak znacznie krótsze sposoby wywoływania poleceń systemowych; w tym przypadku !jest używany. System Windows nie potrzebuje .exenazw poleceń, więc to również zostało pominięte. Ta /opcja jest nadal obsługiwana (korzystam z systemu Windows 10) i neguje potrzebę miejsca. Alternatywy to:

system shutdown/p % 17 bytes; uses so-called 'command' syntax.
dos shutdown/p    % 14 bytes; the 'dos' command can be used just as well.
Sanchises
źródło
19

SmileBASIC, 14 11 6 bajtów

OPTION

Wywołuje awarię powodującą ponowne uruchomienie 3DS. Mam nadzieję, że to się liczy.

Działa w najnowszej wersji.

12Me21
źródło
Myślałem, że to załatano ... Podaj numer wersji.
wizzwizz4
3
Zostało załatane w wersji 3.5, która nie została jeszcze wydana poza Japonią.
12Me21
4
@ 12Me21 Pewnie, że się liczy. Dobry wybór środowiska.
P. Ktinos
Gdyby tylko REBOOTz SBv2 liczył się jako poprawna odpowiedź.
snail_
16

Bash, 7 6 bajtów

init 0

Zakładając, że program jest uruchamiany jako root.

Suever
źródło
Rzeczywiście, wymagane jest wyłączenie urządzenia. Dlatego potrzebujesz „halt -p” jako poprawnej odpowiedzi
P. Ktinos
4
Ta edycja masakry :)
RaisingAgent
@ P.Ktinos: poweroffto pojedyncze słowo, choć nieco więcej liter.
ccpizza
1
@ccpizza Racja, ale typowe kryteria punktacji to liczba bajtów
Suever
13

Java, 101 98 62 42 bajty

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

Jak zauważył @Snowman, pytanie nie określało, czy potrzebny jest pełny program, więc powinno to być nadal dopuszczalne.

Tomek
źródło
2
Jest krótszy zastąpić classz interfacejako że pozwala na pominięcie publicz głównym.
Pavel
6
Możesz użyć metody, ponieważ pytanie nie określało, że zgłoszenie musi być pełnym programem:void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}
1
Czy wersja dla Linuksa nie byłaby nieco krótsza?
jpmc26
2
()->{Runtime.getRuntime().exec("init 0");}lub wstępnie ()->Runtime.getRuntime().exec("init 0")(nie można w tej chwili sprawdzić). Jest to lambda implementująca niestandardowy interfejs typu void, bez rzucania argumentami.
Olivier Grégoire
1
Powinno to być oznaczone jako odpowiedź specyficzna dla Linuksa, np. „Java na LInux”.
Jakob
13

Python 2, 29 bajtów

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

Działa w systemach Linux i wymaga uprawnień roota.

W systemie Windows 33 bajty

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

To może być najmniej interesujący lub pomocny kod, jaki kiedykolwiek napisałem.

Gurupad Mamadapur
źródło
2
Ktoś inny opublikował wersję powłoki Linux.
jpmc26
1
Ach ok, mój zły ..
FlipTack
12

Commodore 64, 11 bajtów

0 sys64738

Pochodzi z monitu BASIC. Lub...

Commodore 64, zestaw 6502, 3 bajty (zmontowane), 16 bajtów (źródło)

*=8000
JMP $FCE2
Shaun Bebbers
źródło
Myślę, że użycie trybu bezpośredniego wprowadzania Commodore 64 z BASIC-a sys64738będzie wykorzystywać zero bajtów, ponieważ nie ma programu ani niczego innego do przechowywania; Używasz ekranowej pamięci RAM, ale ta pamięć RAM będzie już wypełniona spacjami, więc po prostu zastępujesz te spacje tekstem.
Shaun Bebbers
2
Kod źródłowy zajmuje miejsce. To, że nie rezerwuje miejsca na maszynie docelowej , nie oznacza, że ​​zajmuje 0 bajtów. W przeciwnym razie odpowiedź brzmiałaby ``.
wizzwizz4
3
Nie potrzebujesz odstępu między 0i sys64738, możesz zastąpić sysje skrótem sY, a ja nie liczę końcowego znaku nowej linii w długości programu. Nie sądzę jednak, aby Twój kod spełniał wymagania: kod w 64738 wykonuje miękki reset, a nie wyłączanie zasilania.
Mark
2
Nie wyłącza się.
TecBrat
1
Kiedyś rozlałem piwo na Commodore 64, co spowodowało jego trwałe wyłączenie. Czy to się liczy?
Shaun Bebbers
12

TI-Nspire CX CAS, 3 bajty

" "+" "

sumując dwa puste ciągi.

W starszej wersji kalkulatora spowodowałoby to awarię urządzenia i spowodowało jego ponowne uruchomienie (nie ma sposobu na wyłączenie urządzenia bez ponownego uruchomienia poza fizycznymi kombinacjami przycisków).

Wideo Adriweb

devRicher
źródło
Czy to nie 7 bajtów?
Roman Gräf
Brzmi dla mnie przekonująco.
Roman Gräf
11

C ++, 51 40 bajtów

-11 bajtów dzięki Ingve !

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

Działa tylko w IncludeOS (v0.10.0-rc.1)

Test:

$ 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 ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$
Szymon
źródło
1
Teraz jestem ciekawy IncludeOS
Karl Napf
@KarlNapf Alfred przeprowadził świetną prezentację na CppCon 2016 na temat IncludeOS: youtube.com/watch?v=t4etEwG2_LY, jeśli chcesz dowiedzieć się więcej :-)
simon
1
Nie musisz go używać void Service::start, int main działa również w IncludeOS .
Ingve
10

AppleScript, 30 bajtów

tell app "Finder" to shut down

Robi dokładnie to, co mówi: każe Finderowi wyłączyć komputer.

znak
źródło
9

AutoHotkey, 11 10 bajtów

Zapisano bajt dzięki Oszczędność Gurupad Mamadapur

Shutdown,9

AHK domyślnie obsługuje polecenie Zamknij. 9Jest flaga, składający się z Shutdown=1+ PowerDown=8.

ATaco
źródło
1
AHKjest tajemniczy.
Gurupad Mamadapur,
Czy potrzebujesz miejsca po przecinku?
tamalfarfetchd
spacja po ,nie jest potrzebna. Spróbuj przetestować go z inną flagą. Myślałem, że to nie od razu zamknie komputer i umieściłem go w głównym skrypcie, który ładuje się przy starcie: D Teraz muszę załadować w trybie awaryjnym i rozwiązać problem. Westchnienie.
Gurupad Mamadapur,
9

Kod maszynowy (x86, moduł ładujący) 18 bajtów

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

Demontaż:

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

Możesz to przetestować w debuggerze Bochsa za pomocą następujących poleceń (po uruchomieniu symulacji, po skonfigurowaniu niektórych napędów dyskowych):

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

Ten sam kod maszynowy będzie również działał jako plik wykonywalny DOS ( *.COM).

Ruslan
źródło
7

C #, 79 54 53 bajtów

Działa to w systemie Windows.

79 bajtów :

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

53 bajty , dzięki TheLethalCoder:

_=>System.Diagnostics.Process.Start("shutdown","/s");
Dariusz Woźniak
źródło
2
Zauważ, że wyzwanie nie wymaga pełnego programu i nie zabrania przyjmowania danych wejściowych (oczywiście nieużywanych), abyś mógł skompilować Action<int>i wykonać _=>System.Diagnostics.Process.Start("shutdown", "/s");dla 54 bajtów.
TheLethalCoder
@TheLethalCoder, zaktualizowano, dzięki!
Dariusz Woźniak
Możesz także usunąć niepotrzebne miejsce.
nothrow
Oczywiście, że tak! Dziękuję, @notrow :)
Dariusz Woźniak
6

AutoIt, 11 bajtów

Shutdown(1)

Funkcja wyłączania otrzymuje kombinację następujących kodów

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

Na przykład, aby wyłączyć i wyłączyć, kod będzie miał wartość 9 (wyłączenie + wyłączenie = 1 + 8 = 9).

rahnema1
źródło
1
0(wylogowanie) jest tutaj szczególnym przypadkiem; nie łączy się domyślnie z trybem gotowości lub hibernacji.
wizzwizz4
OK0 + 32 = 32
rahnema1
Hm, więc czy zawsze się wylogowuje przed przejściem w tryb gotowości / hibernacji?
Ruslan
@ Ruslan Nie wiem dokładnie, jak to działa, możesz się do nich odwołać forum użytkowników AutoIt, aby uzyskać więcej informacji zwrotnych :-)
rahnema1
6

Windows - NativeAPI, 212 bajtów

Ok, to naprawdę nie jest najkrótsza wersja. Ale dla niektórych może interesujące. Nie będzie to działać w podsystemie Win32. Jednak będzie działać, gdy zostanie wykonany w kontekście natywnego interfejsu API (podobnie jak autochk.exe)

Kod

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

Budować

Aby to zbudować, użyj build.exenarzędzia WinDDK (z odpowiednim sourceplikiem dlaNMAKE )

Lub użyj tych poleceń, aby skompilować i połączyć:

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 

Uwaga: Spowoduje to zbudowanie natywnego pliku wykonywalnego x86. Zmień odpowiednie bity, jeśli chcesz zbudować to dla innej architektury.

Test

Aby przetestować natywny plik wykonywalny, należy go wykonać przed załadowaniem podsystemu win32. Jednym z powszechnych sposobów jest dołączenie pliku wykonywalnego do następującego klucza rejestru:

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

Ostrzeżenie

Jeśli to zrobisz, musisz mieć możliwość edycji gałęzi rejestru docelowego systemu operacyjnego z innego systemu operacyjnego. Ponieważ nie będziesz już mógł uruchomić docelowego systemu operacyjnego!

Zrobiłem to na maszynie wirtualnej, w której mogłem łatwo przywrócić poprzednią migawkę!

MrPaulch
źródło
5

Groovy, 23 bajty

'shutdown /p'.execute()
Gurupad Mamadapur
źródło
2
Czy konieczne jest miejsce przed ukośnikiem?
steenbergh
3
@steenbergh Tak, jest to potrzebne.
Gurupad Mamadapur
@GurupadMamadapur jesteś pewien?
TrojanByAccident
5

Większość powłok Linuksa, 15 bajtów

# echo o>/p*/*ger

Może mieć długość 11 bajtów, jeśli akurat jesteś w sieci /proc katalogu:

# echo o>*ger

Jest to bardzo proste (nie ma skutków ubocznych, takich jak odmontowywanie systemów plików lub procesy zabijania) i jest dość brutalne.

Radovan Garabík
źródło
1
Ostatnim razem, gdy próbowałem rozwinięcia symboli zastępczych podczas przekierowania, wygenerowałem plik z tym symbolem, mimo że istnieje pasujący plik.
Joshua
5
Uważam, że musisz dodać „/ proc /” do swojej liczby bajtów
zeppelin,
@Joshua To może być zależne od powłoki. Właściwie to przetestowałem (z bash) na moim komputerze :-)
Radovan Garabík
1
@Radovan Garabík - Nie sądzę, żeby to było naprawdę ważne. Jest to w zasadzie to samo, co sugerowanie, że istnieje alias „p = poweroff” (co nie jest również „niemożliwe”) i twierdzenie, że „p” jest prawidłowym rozwiązaniem 1-bajtowym .
zeppelin
1
Ale prawdopodobnie możesz sprawić, by był ważny kosztem zaledwie 3 bajtów, tak jak toecho o>/p*/*ger
zeppelin
5

Powłoka Androida, 9 bajtów

reboot -p
Pedro Lobito
źródło
7
Witamy w PPCG!
ETHprodukcje
5

AppleScript, 44 bajty

tell application "Finder"
shut down
end tell

Nie wiem, jak działa składnia AppleScript, ani nic takiego, więc jeśli ktoś wie, jak to skrócić, proszę powiedzieć.

Robię to również na telefonie w szkole („hakowanie”), więc nie mogę tego przetestować.

Przy 14 mniej bajtów (dzięki kindall) możesz powiedzieć

tell app "Finder" to shut down
Daniel
źródło
Ktoś wymyślił krótsze rozwiązanie (z tym samym programem) kilka godzin po tobie (ale opublikował je zamiast komentować tutaj) codegolf.stackexchange.com/a/107958/62824
devRicher 25.01.2017
Prawdopodobnie możesz usunąć wcięcie
Cyoce,
4
tell app "Finder" to shut downpowinien działać, jak sądzę (chociaż kompilacja może zastąpić „aplikację” „aplikacją”).
uprzejmie
4

J, 14 bajtów

2!:0'poweroff'

Działa na systemach Linux. 2!:0wykonuje ciąg w /bin/sh.

mile
źródło
4

Clojure, 40 39 bajtów

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

-1 bajt poprzez zmianę flagi z -sna/s , co pozwoliło mi pozbyć się miejsca.

Zasadniczo odpowiedź Java.

Testowanie tego było zabawne. System Windows zdecydował się na aktualizację oprogramowania układowego na moim urządzeniu Surface przy drugim zamykaniu. Oczywiście.

(defn shutdown []
  (.exec (Runtime/getRuntime) "shutdown -s"))
Carcigenicate
źródło
2

Node.js, 39 bajtów

Linux

require('child_process').exec('init 0')
Tomek
źródło
2

AHK, 19 15 bajtów

Run,Shutdown -s

Działa tylko w systemie Windows.

Gurupad Mamadapur
źródło
2

C ++, 48 47 (Windows) 46 45 (Linux) bajtów

Usunięto 1 bajt dzięki Bałwanowi

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

To powinno zamknąć system Windows

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

To powinno zamknąć system Linux

Fəˈnɛtɪk
źródło
potrzebujesz ;?
RaisingAgent
1
@LliwTelracs Dość pewności, że jest to „shutdown / p”, a nie „-p”, a miejsce nie jest potrzebne.
P. Ktinos
Średnik jest wymagany do poprawnej składni c ++, użycie ukośnika pozwala na krótszą odpowiedź dla systemu Windows, ale nie działa już w systemie Linux. Chociaż dodałem niewłaściwy znak do zamykania, który jest wspólny dla systemu Windows i Linux
fəˈnɛtɪk
@LliwTelracs Chociaż możesz robić, co chcesz, sugeruję nadużywanie drugiej reguły i nie dbanie o funkcjonalność Linuksa, ponieważ jest to gra w golfa kodowego, a mała ilość bajtów jest lepsza.
P. Ktinos
1
#include<cstdlib>zgoli bajt.