Herausforderung:
Fahren Sie in der Programmiersprache Ihrer Wahl den Computer herunter, auf dem Ihr Code ausgeführt wurde.
Regeln
- Kein Herunterfahren durch Erschöpfung der Ressourcen (zB: Gabelbombe, um das Herunterfahren zu erzwingen)
- Wenn Sie möchten, können Sie Code schreiben, der nur in einer bestimmten Umgebung / einem bestimmten Betriebssystem funktioniert.
- Standardlücken sind verboten
Dies ist Code-Golf , daher gewinnt die niedrigste Anzahl von Bytes!
code-golf
interactive
P. Ktinos
quelle
quelle
`whatever`;
Bash / Perl / PHP / Ruby / etc zu stoppen . Dummköpfe.shatdown: past tense of the verb shutdown
Antworten:
Assembly (x86 / x64, Linux, as) ,
222119 ByteMuss als root ausgeführt werden.
Dies entspricht dem Drücken des Netzschalters und ist keine sichere Methode zum Ausschalten des PCs. Stellen Sie sicher, dass Sie alle geöffneten Anwendungen schließen und ausführen
sync
, um alle Dateisystempuffer zu leeren, bevor Sie dieses Programm ausführen, um das Risiko einer Dateibeschädigung zumindest zu minimieren.Testlauf
Gefolgt von Dunkelheit.
Wie es funktioniert
int $0x80
ruft einen Software-Interrupt auf. Es funktioniert sowohl auf x86 als auch auf x64, ist jedoch seit über einem Jahrzehnt veraltet und sollte nicht im Produktionscode verwendet werden.syscall
Stattdessen sollte x64-Code verwendet werden. x86 sollte verwendensysenter
, aber es ist zu umständlich für Code-Golf.Die sich aus dem Systemaufruf ergebende Aktion hängt von den Registern EAX - EDX, ESI und EDI ab. Die Linux-Syscall-Referenz zeigt alle Syscalls, die über verfügbar sind
int $0x80
.Wenn EAX 0x58 (88) enthält , wird ein Neustart aufgerufen, mit dem der Computer ausgeschaltet, in den Energiesparmodus versetzt oder in den Ruhezustand versetzt sowie der Kernel gewechselt und die Tastenkombination Strg - Alt - Entf deaktiviert oder aktiviert werden kann .
Zu Beginn des Programms - und indem wir mit
as
oder kompilierengcc -nostdlib
, können wir sicherstellen, dass wir tatsächlich am Anfang des Programms sind - werden die meisten Register auf 0 gesetzt . Dies schließt EAX ein, sodass wirmov $0x58, %al
die unteren 8 Bits von EAX auf 0x58 setzen können , wodurch EAX selbst auf 0x58 gesetzt wird . Dies spart zwei Bytes beim manuellen Nullsetzen des Registersxor %eax, %eax
und eines weiteren Bytes beim geraden Weiterleitenmov $0x58, %eax
, das 0x58 in 32 Bits codiert .Die ersten beiden Argumente für einen Neustart sind magische Zahlen, vermutlich, um versehentliche Neustarts zu verhindern. Sie werden aus den Registern EBX und ECX gelesen. Wenn diese Zahlen nicht bestimmten Konstanten entsprechen, wird beim Neustart keine Aktion ausgeführt.
Die erste magische Zahl muss gleich 0xfee1dead ( sich tot fühlen ) sein und bezieht sich wahrscheinlich auf das Ausschalten / den Tod des PCs.
Die zweite magische Zahl kann vier verschiedenen Konstanten entsprechen, obwohl die letzten drei in alten Linux-Versionen nicht funktionierten. Alle scheinen sich auf das spätere Einschalten / Aufkommen des PCs zu beziehen.
0x28121969 repräsentiert Linus Torvalds Geburtstag (28. Dezember 1969).
0x05121996 repräsentiert Patricia Torvalds Geburtstag (5. Dezember 1996).
0x16041998 repräsentiert Daniela Torvalds Geburtstag (16. April 1998).
0x20112000 repräsentiert Celeste Torvalds Geburtstag (20. November 2000).
Patricia, Daniela und Celeste Torvalds sind die drei Töchter von Linus Torvalds.
Das EDX-Register wählt die Art des gewünschten "Neustarts" aus. 0x4321fedc ist RB_POWER_OFF , fährt den PC herunter und schaltet ihn aus.
Schließlich wird der Wert des ESI-Registers für RB_POWER_OFF ignoriert ; Der Wert des EDI-Registers wird beim Neustart vollständig ignoriert .
Alternative Version, nur x64, 19 Byte
Auf x64 können wir einen richtigen Syscall für die gleiche Bytezahl verwenden.
Die einzigen Unterschiede liegen in der Anweisung (
syscall
vsint $0x80
), dem Wert von __NR_REBOOT ( 0xa9 vs 0x58 ) und den beteiligten Registern.quelle
fee1
sodead
gerade jetzt.PowerShell, 13 Byte
Ziemlich selbsterklärend? Funktioniert nicht mit PowerShell Core, daher nicht mit PowerShell für Linux / MacOS (bereits mit TIO :-D getestet).
Bonus Garbage Submission, 12 Bytes
In meinen Tests funktioniert dies unter Windows 2003 mit PowerShell 2.0. Bei den meisten neueren Versionen funktioniert es nicht und je nachdem, welche Module installiert sind, funktioniert es möglicherweise nicht. Es ist ziemlich schrecklich!
Dadurch wird die Befehlsliste nach allen Befehlen mit dem Muster durchsucht
s*r
und anschließend alle ausgeführt! Um klar zu sein, das ist gefährlich, tu das nicht!Der Trick besteht natürlich darin, eine Liste von Befehlen abzurufen, für die keine obligatorischen Parameter angegeben sind. Andernfalls fordert PowerShell zur Eingabe eines Werts auf.
Auf meinem 2003-Computer lauten die 3 zurückgegebenen Befehle:
Ja, der Laufschrift-Bildschirmschoner wird gestartet, aber nein, er wartet nicht, bis der Vorgang abgeschlossen ist, bevor er gestartet wird
Stop-Computer
.Dieser Ansatz funktioniert auch auf neueren Computern, je nachdem, welche Module installiert sind. Das Beste, was ich unter Windows 2012 und 2016 tun konnte, waren 14 Byte :
(Und ja, sicher, die Winbatch-Übermittlung funktioniert in PowerShell und ist kürzer, aber das macht keinen Spaß.)
quelle
gcm *p-c*|iex
- und es gibt auch nur das eine Ergebnis!Stop-Computer
, was das letzte Ergebnis ist).Batch, 10 Bytes
Bei Windows würde dies ausreichen
Dies führt in einer Minute zu einer Abschaltung.
Alternativ, wie @flashbang betont:
Dadurch wird der Computer sofort heruntergefahren.
quelle
Press the big button on the front of your computer
= 0 Bytesx86-Maschinencode, Lenovo Z510, DOS COM oder Bootloader, 7 Byte
Zusammengebaut in
B8 00 3C BA 04 18 EF
Ich nutze " Sie dürfen Code schreiben, der nur in einer bestimmten Umgebung / einem bestimmten Betriebssystem funktioniert, wenn Sie dies wünschen " für das ultimative Level: Dies funktioniert nur auf Lenovo Z510 1 .
Dies schreibt
SLP_TYPa << 10 | SLP_EN
in dasPM1a_CNT
ACPI-Register. Ich habe diese Werte vor Monaten aus den ACPI-Tabellen ausgegeben, um eine Antwort zum Herunterfahren zu erhalten (wobei ich dem obigen Code ein wenig Kontext gebe).Dies kann entweder unter DOS als COM (einfach die Binärdaten in eine Datei schreiben und die Erweiterung auf "com" ändern) oder als Bootloader ausgeführt werden.
Für letztere schreiben Sie die Standardsignatur und achten Sie auf die Probleme mit moderner Firmware .
1 Nicht unbedingt zutreffend, jedes System mit der gleichen ACPI-Konfiguration wird ebenfalls heruntergefahren.
quelle
GRUB-Shell , 4 Bytes
Golf gespielt
Bonus
Hier ist ein Beweis dafür , dass GRUB - Shell in der Tat Tur ist n ing-complete (siehe Kommentare):
quelle
built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives
und unterstützt Variablen, bedingte Konstrukte, Funktionen und mehr , so offensichtlich, es ist Turning-complete, in jeder Hinsicht.65C02 Maschinencode, 1 Byte
STP-Anweisung (0xDB):
STP stoppt den Takteingang des 65C02 und schaltet den 65C02 effektiv aus, bis ein Hardware-Reset auftritt (dh der RES-Pin geht auf LOW). Dies versetzt den 65C02 in einen Energiesparmodus. Dies ist nützlich für Anwendungen (Schaltkreise), die einen geringen Stromverbrauch erfordern, aber STP wird selten anders gesehen.
(Quelle: http://www.6502.org/tutorials/65c02opcodes.html )
xxd dump:
quelle
Matlab, 21 Bytes
Ich habe dies nicht ausprobiert (das Schließen aller Programme, um mitten am Tag einen Neustart durchzuführen, ist nicht wirklich verlockend), aber es sollte funktionieren.. Das funktioniert...Ich werde später eine kurze Erklärung hinzufügen, mein Laptop ist derzeit ausgeschaltet.
quelle
uptime
allerdingsshutdown -s
als Shell einzureichen ?MATLAB, 11 Bytes
Etwas ähnlich wie bei Stewie Griffin . MATLAB bietet jedoch viel kürzere Möglichkeiten zum Aufrufen von Systembefehlen. in diesem Fall
!
wird verwendet. Windows benötigt keine.exe
Befehlsnamen, so dass auch diese weggelassen werden. Die/
Option wird weiterhin unterstützt (unter Windows 10) und macht den Speicherplatz überflüssig. Alternativen sind:quelle
SmileBASIC,
14116 BytesLöst einen Absturz aus, bei dem der 3DS neu gestartet wird. Ich hoffe das zählt.
Funktioniert in der neuesten Version.
quelle
REBOOT
von SBv2 als gültige Antwort gezählt.Bash,
76 BytesAngenommen, das Programm wird als root ausgeführt.
quelle
poweroff
ist ein einzelnes Wort, wenn auch etwas mehr Buchstaben.Java,
101986242 BytesWie @Snowman betonte, wurde in der Frage nicht angegeben, ob ein vollständiges Programm benötigt wird, daher sollte dies weiterhin akzeptabel sein.
quelle
class
durch ist kürzer,interface
da Sie aufpublic
main verzichten können.void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}
()->{Runtime.getRuntime().exec("init 0");}
oder vorläufig()->Runtime.getRuntime().exec("init 0")
(kann im Moment nicht überprüfen). Es ist ein Lambda, der eine benutzerdefinierte Schnittstelle implementiert, die keine Argumente wirft.Python 2, 29 Bytes
Funktioniert auf Linux-Systemen und benötigt Root-Rechte.
Für Windows 33 Bytes
Dies könnte der am wenigsten interessante oder hilfreiche Code sein, den ich jemals geschrieben habe.
quelle
Commodore 64, 11 Bytes
Dies ist von der BASIC-Eingabeaufforderung. Oder...
Commodore 64, 6502 Assembly, 3 Bytes (zusammengesetzt), 16 Bytes (Quelle)
quelle
sys64738
verwenden Null - Bytes , da es kein Programm oder irgendetwas anderes zu speichern ist; Sie verwenden Bildschirm-RAM, aber dieser RAM wird bereits mit Leerzeichen gefüllt, sodass Sie diese Leerzeichen nur durch Text ersetzen.0
undsys64738
, Sie können dassys
durch das Verknüpfungsformular ersetzensY
, und ich zähle den abschließenden Zeilenumbruch in der Programmlänge nicht. Ich glaube jedoch nicht, dass Ihr Code die Anforderungen erfüllt: Der Code bei 64738 führt einen Soft-Reset durch, kein Ausschalten.TI-Nspire CX CAS, 3 Byte
Summieren von zwei leeren Zeichenfolgen.
Bei einer älteren Version des Rechners würde dies das Gerät zum Absturz bringen und einen Neustart verursachen (es gibt keine Möglichkeit, ein Gerät herunterzufahren, ohne einen Neustart durchzuführen, abgesehen von physischen Tastenkombinationen).
Video von Adriweb
quelle
C ++,
51 bis40 Bytes-11 Bytes dank Ingve !
Funktioniert nur in IncludeOS (v0.10.0-rc.1)
Prüfung:
quelle
void Service::start
,int main
funktioniert auch in IncludeOS .AppleScript, 30 Byte
Tut genau das, was es sagt: Weist Finder an, den Computer auszuschalten.
quelle
AutoHotkey,
1110 BytesDank Gurupad Mamadapur wurde ein Byte gespeichert
AHK unterstützt standardmäßig einen Befehl zum Herunterfahren. Das
9
ist eine Flagge, bestehend ausShutdown=1
+PowerDown=8
.quelle
AHK
ist mysteriös.,
wird nicht benötigt. Versuchen Sie es mit einer anderen Flagge. Ich dachte, dies würde den Computer nicht sofort herunterfahren und in mein Hauptskript einfügen, das beim Start geladen wird: D Jetzt muss ich im abgesicherten Modus laden und das Problem lösen. Seufzer.Maschinencode (x86, Bootloader) 18 Byte
Demontage:
Sie können es im Bochs-Debugger mit den folgenden Befehlen testen (nach dem Start der Simulation, wenn ein Laufwerk eingerichtet ist):
Derselbe Maschinencode funktioniert auch als ausführbare DOS-Datei (
*.COM
).quelle
C #
79,5453 BytesDies funktioniert unter Windows.
79 Bytes :
53 Bytes dank TheLethalCoder:
quelle
Action<int>
und tun_=>System.Diagnostics.Process.Start("shutdown", "/s");
für 54 Byte.AutoIt, 11 Bytes
Die Abschaltfunktion erhält eine Kombination der folgenden Codes
Zum Herunterfahren und Ausschalten wäre der Code beispielsweise 9 (Herunterfahren + Ausschalten = 1 + 8 = 9).
quelle
0
(Abmelden) ist hier ein Sonderfall; Es lässt sich nicht implizit mit Standby oder Ruhezustand kombinieren.0 + 32 = 32
Windows - NativeAPI, 212 Byte
Ok das ist nicht wirklich die kürzeste Version. Aber für manche vielleicht interessant. Dies wird nicht auf dem Win32-Subsystem ausgeführt. Es wird jedoch ausgeführt, wenn es im Kontext der nativen API ausgeführt wird (wie dies bei autochk.exe der Fall ist).
Code
Bauen
Um dies zu erstellen, verwenden Sie entweder das WinDDK -
build.exe
Tool (mit einer entsprechendensource
Datei fürNMAKE
).Oder verwenden Sie diese Befehle zum Kompilieren und Verknüpfen:
Hinweis: Dadurch wird eine native x86-Programmdatei erstellt. Ändern Sie die entsprechenden Bits, wenn Sie dies für eine andere Architektur erstellen möchten.
Prüfung
Um eine native ausführbare Datei zu testen, müssen Sie sie ausführen, bevor das win32-Subsystem geladen wird. Eine gebräuchliche Methode ist das Anhängen der ausführbaren Datei im folgenden Registrierungsschlüssel:
Warnung
In diesem Fall benötigen Sie jedoch eine Option, um die Registrierungsstruktur des Zielbetriebssystems von einem anderen Betriebssystem aus zu bearbeiten. Da Sie das Ziel-Betriebssystem nicht mehr booten können!
Ich tat es auf einer VM, in der ich zu einem vorhergehenden Schnappschuss leicht zurückkehren könnte!
quelle
Groovy, 23 Bytes
quelle
Die meisten Linux-Shells, 15 Bytes
Es könnte 11 Bytes lang sein, wenn Sie sich zufällig im
/proc
Verzeichnis befinden:Dies ist sehr einfach (hat keine Nebenwirkungen wie das Abmelden von Dateisystemen oder das Beenden von Prozessen) und eher brutal.
quelle
bash
) auf meinem Computer getestet :-)echo o>/p*/*ger
Android-Shell, 9 Bytes
quelle
AppleScript, 44 Byte
Ich weiß nicht, wie die AppleScript-Syntax funktioniert oder was auch immer. Wenn also jemand weiß, wie man dies verkürzt, sagen Sie es bitte.
Außerdem mache ich das auf meinem Handy in der Schule ("Hacking"), also kann ich es nicht testen.
Mit 14 Bytes weniger (dank kindall) kann man sagen
quelle
tell app "Finder" to shut down
sollte funktionieren, glaube ich (obwohl die Zusammenstellung "app" durch "application" ersetzen kann).J, 14 Bytes
Funktioniert auf Linux-Systemen.
2!:0
Führt den String in aus/bin/sh
.quelle
Clojure,
4039 Bytes-1 Byte durch Ändern des Flags von
-s
nach/s
, wodurch ich den Raum loswerden konnte.Grundsätzlich die Java-Antwort.
Das zu testen hat Spaß gemacht. Windows hat beschlossen, ein Firmware-Update auf meinem Surface durchzuführen, sobald es heruntergefahren wird. Na sicher.
quelle
Node.js, 39 Bytes
Linux
quelle
AHK,
19-15BytesFunktioniert nur unter Windows.
quelle
C ++,
4847 (Windows)4645 (Linux) Bytes1 Byte dank Schneemann entfernt
Dies sollte das System für Windows herunterfahren
Dies sollte das System für Linux herunterfahren
quelle
;
?#include<cstdlib>
wird ein Byte rasieren.