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 golf golfowy , więc wygrywa najmniejsza ilość bajtów!
code-golf
interactive
P. Ktinos
źródło
źródło
`whatever`;
Bash / Perl / PHP / Ruby / itp. głupoty.shatdown: past tense of the verb shutdown
Odpowiedzi:
Zestaw (x86 / x64, Linux, as) ,
222119 bajtówMusi być uruchomiony jako root.
Jest to równoważne z naciśnięciem przycisku zasilania i nie jest bezpiecznym sposobem na wyłączenie komputera.
sync
Przed 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
Następnie ciemność.
Jak to działa
int $0x80
wywoł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.syscall
Zamiast 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
as
lubgcc -nostdlib
moż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, %al
aby 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, %eax
i jeszcze jeden na prostym,mov $0x58, %eax
któ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.
Jedyne różnice dotyczą instrukcji (
syscall
vsint $0x80
), wartości __NR_REBOOT ( 0xa9 vs 0x58 ) i zaangażowanych rejestrów.źródło
fee1
takdead
teraz.PowerShell, 13 bajtów
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
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*r
a 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:
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 :
(i tak, oczywiście, przesyłanie winbatch będzie działać w PowerShell i jest krótszy, ale .. to nie jest fajne)
źródło
gcm *p-c*|iex
- i jest tylko jeden wynik!Stop-Computer
, co jest ostatnim wynikiem).Partia, 10 bajtów
W systemie Windows to wystarczy
Spowoduje to zamknięcie za minutę.
Alternatywnie, jak wskazuje @flashbang:
To natychmiast wyłącza komputer.
źródło
Press the big button on the front of your computer
= 0 bajtówkod maszynowy x86, Lenovo Z510, DOS COM lub Bootloader, 7 bajtów
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_EN
to wPM1a_CNT
rejestrze 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.
źródło
Powłoka GRUB , 4 bajty
Grał w golfa
Premia
Tutaj jest dowodem grub rzeczywiście Tur n ie-końca (patrz komentarz)
źródło
built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives
i obsługuje zmienne, konstrukcje warunkowe, funkcje i wiele innych , więc oczywiście jest kompletny pod każdym względem.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:
źródło
Matlab, 21 bajtów
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.
źródło
uptime
shutdown -s
jako powłokę?MATLAB, 11 bajtów
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.exe
nazw 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:źródło
SmileBASIC,
14116 bajtówWywołuje awarię powodującą ponowne uruchomienie 3DS. Mam nadzieję, że to się liczy.
Działa w najnowszej wersji.
źródło
REBOOT
z SBv2 liczył się jako poprawna odpowiedź.Bash,
76 bajtówZakładając, że program jest uruchamiany jako root.
źródło
poweroff
to pojedyncze słowo, choć nieco więcej liter.Java,
101986242 bajtyJak zauważył @Snowman, pytanie nie określało, czy potrzebny jest pełny program, więc powinno to być nadal dopuszczalne.
źródło
class
zinterface
jako że pozwala na pominięciepublic
z głównym.void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}
()->{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.Python 2, 29 bajtów
Działa w systemach Linux i wymaga uprawnień roota.
W systemie Windows 33 bajty
To może być najmniej interesujący lub pomocny kod, jaki kiedykolwiek napisałem.
źródło
Commodore 64, 11 bajtów
Pochodzi z monitu BASIC. Lub...
Commodore 64, zestaw 6502, 3 bajty (zmontowane), 16 bajtów (źródło)
źródło
sys64738
bę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.0
isys64738
, możesz zastąpićsys
je skrótemsY
, 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.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
źródło
C ++,
5140 bajtów-11 bajtów dzięki Ingve !
Działa tylko w IncludeOS (v0.10.0-rc.1)
Test:
źródło
void Service::start
,int main
działa również w IncludeOS .AppleScript, 30 bajtów
Robi dokładnie to, co mówi: każe Finderowi wyłączyć komputer.
źródło
AutoHotkey,
1110 bajtówZapisano bajt dzięki Oszczędność Gurupad Mamadapur
AHK domyślnie obsługuje polecenie Zamknij.
9
Jest flaga, składający się zShutdown=1
+PowerDown=8
.źródło
AHK
jest tajemniczy.,
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.Kod maszynowy (x86, moduł ładujący) 18 bajtów
Demontaż:
Możesz to przetestować w debuggerze Bochsa za pomocą następujących poleceń (po uruchomieniu symulacji, po skonfigurowaniu niektórych napędów dyskowych):
Ten sam kod maszynowy będzie również działał jako plik wykonywalny DOS (
*.COM
).źródło
C #,
795453 bajtówDziała to w systemie Windows.
79 bajtów :
53 bajty , dzięki TheLethalCoder:
źródło
Action<int>
i wykonać_=>System.Diagnostics.Process.Start("shutdown", "/s");
dla 54 bajtów.AutoIt, 11 bajtów
Funkcja wyłączania otrzymuje kombinację następujących kodów
Na przykład, aby wyłączyć i wyłączyć, kod będzie miał wartość 9 (wyłączenie + wyłączenie = 1 + 8 = 9).
źródło
0
(wylogowanie) jest tutaj szczególnym przypadkiem; nie łączy się domyślnie z trybem gotowości lub hibernacji.0 + 32 = 32
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
Budować
Aby to zbudować, użyj
build.exe
narzędzia WinDDK (z odpowiednimsource
plikiem dlaNMAKE
)Lub użyj tych poleceń, aby skompilować i połączyć:
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:
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ę!
źródło
Groovy, 23 bajty
źródło
Większość powłok Linuksa, 15 bajtów
Może mieć długość 11 bajtów, jeśli akurat jesteś w sieci
/proc
katalogu:Jest to bardzo proste (nie ma skutków ubocznych, takich jak odmontowywanie systemów plików lub procesy zabijania) i jest dość brutalne.
źródło
bash
) na moim komputerze :-)echo o>/p*/*ger
Powłoka Androida, 9 bajtów
źródło
AppleScript, 44 bajty
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ć
źródło
tell app "Finder" to shut down
powinien działać, jak sądzę (chociaż kompilacja może zastąpić „aplikację” „aplikacją”).J, 14 bajtów
Działa na systemach Linux.
2!:0
wykonuje ciąg w/bin/sh
.źródło
Clojure,
4039 bajtów-1 bajt poprzez zmianę flagi z
-s
na/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.
źródło
Node.js, 39 bajtów
Linux
źródło
AHK,
1915 bajtówDziała tylko w systemie Windows.
źródło
C ++,
4847 (Windows)4645 (Linux) bajtówUsunięto 1 bajt dzięki Bałwanowi
To powinno zamknąć system Windows
To powinno zamknąć system Linux
źródło
;
?#include<cstdlib>
zgoli bajt.