Desafío:
En el lenguaje de programación que elija, apague la máquina en la que se ejecutó su código.
Reglas
- No se apaga por agotamiento de recursos (por ejemplo: forkbomb para forzar el apagado)
- Si lo desea, puede escribir código que solo funcione en un entorno / SO específico.
- Las lagunas estándar están prohibidas
Este es el código de golf , por lo tanto, gana la menor cantidad de bytes.
code-golf
interactive
P. Ktinos
fuente
fuente
`whatever`;
Bash / Perl / PHP / Ruby / etc. stupiglotsshatdown: past tense of the verb shutdown
Respuestas:
Ensamblaje (x86 / x64, Linux, as) ,
222119 bytesDebe ejecutarse como root.
Esto es equivalente a presionar el botón de encendido y no es una forma segura de apagar su PC. Asegúrese de cerrar todas las aplicaciones abiertas y ejecutar
sync
para vaciar todos los búferes del sistema de archivos antes de ejecutar este programa, para al menos minimizar el riesgo de corrupción de archivos.Prueba de funcionamiento
Seguido por la oscuridad.
Cómo funciona
int $0x80
invoca una interrupción de software. Funciona tanto en x86 como en x64, pero ha quedado en desuso durante más de una década y no debe usarse en el código de producción. el código x64 debería usarsyscall
en su lugar. x86 debería usarsysenter
, pero es demasiado engorroso para el golf de código.La acción resultante de la llamada al sistema depende de los registros EAX - EDX, ESI y EDI. La Referencia de llamadas al sistema Linux muestra todas las llamadas al sistema que están disponibles a través de
int $0x80
.Cuando EAX mantiene 0x58 (88) , se llama reiniciar , que también se puede usar para apagar, poner en suspensión o hibernar la computadora, así como para cambiar los núcleos y deshabilitar o habilitar la combinación de teclas Ctrl - Alt - Supr .
Al comienzo del programa, y compilando con
as
ogcc -nostdlib
, podemos asegurarnos de que estamos realmente al comienzo del programa, la mayoría de los registros se establecen en 0 . Esto incluye EAX, por lo que podemos usarlomov $0x58, %al
para configurar los 8 bits inferiores de EAX en 0x58 , configurando así EAX en 0x58 . Esto ahorra dos bytes sobrexor %eax, %eax
la puesta a cero manual del registro con y uno más sobre el sencillomov $0x58, %eax
que codifica 0x58 en 32 bits.Los primeros dos argumentos para reiniciar son números mágicos, presumiblemente para evitar reinicios accidentales, y se leen de los registros EBX y ECX. A menos que estos números sean iguales a ciertas constantes, reiniciar se niega a realizar cualquier acción.
El primer número mágico debe ser igual a 0xfee1dead ( sentirse muerto ), probablemente refiriéndose a la desconexión / muerte de la PC.
El segundo número mágico puede ser igual a cuatro constantes diferentes, aunque los últimos tres no funcionaron en versiones antiguas de Linux. Todos ellos parecen referirse al encendido / nacimiento posterior de la PC.
0x28121969 representa el cumpleaños de Linus Torvalds (28 de diciembre de 1969).
0x05121996 representa el cumpleaños de Patricia Torvalds (5 de diciembre de 1996).
0x16041998 representa el cumpleaños de Daniela Torvalds (16 de abril de 1998).
0x20112000 representa el cumpleaños de Celeste Torvalds (20 de noviembre de 2000).
Patricia, Daniela y Celeste Torvalds son las tres hijas de Linus Torvalds.
El registro EDX selecciona el tipo de "reinicio" que queremos. 0x4321fedc es RB_POWER_OFF , apaga la PC y la apaga.
Finalmente, el valor del registro ESI se ignora para RB_POWER_OFF ; el reinicio ignora por completo el valor del registro EDI .
Versión alternativa, solo x64, 19 bytes
En x64, podemos usar una llamada al sistema adecuada para el mismo recuento de bytes.
Las únicas diferencias radican en la instrucción (
syscall
vsint $0x80
), el valor de __NR_REBOOT ( 0xa9 vs 0x58 ) y los registros involucrados.fuente
fee1
por lo quedead
en este momento.PowerShell, 13 bytes
Bastante autoexplicativo? No funciona en el núcleo de PowerShell, por lo que no funcionará en PowerShell para Linux / MacOS (ya lo probé en TIO :-D).
Envío de basura extra, 12 bytes
En mis pruebas, esto funciona en Windows 2003 con PowerShell 2.0. No funcionará en la mayoría de las versiones más nuevas, y puede que no funcione dependiendo de qué módulos estén instalados. ¡Es bastante terrible!
¡Esto busca en la lista de comandos cualquiera con el patrón
s*r
y luego los ejecuta a todos! Para ser claros, esto es peligroso, ¡no hagas esto!El truco, por supuesto, es obtener una lista de comandos que no tienen parámetros obligatorios, de lo contrario, PowerShell solicitará un valor.
En mi máquina 2003, los 3 comandos que devuelve son:
Sí, inicia el protector de pantalla de marquesina, pero no, no espera a que se complete antes de iniciarse
Stop-Computer
.Este enfoque puede funcionar en máquinas más nuevas, nuevamente dependiendo de qué módulos estén instalados, pero lo mejor que pude hacer en Windows 2012 y 2016 fue 14 bytes :
(y sí, claro, el envío de winbatch funcionará en PowerShell y es más corto, pero ... eso no es divertido)
fuente
gcm *p-c*|iex
y solo hay un resultado!Stop-Computer
, que es el último resultado).Lote, 10 bytes.
En Windows, esto sería suficiente.
Esto configurará un apagado en un minuto.
Alternativamente, como señala @flashbang:
Esto apaga la computadora de inmediato.
fuente
Press the big button on the front of your computer
= 0 bytesCódigo de máquina x86, Lenovo Z510, DOS COM o Bootloader, 7 bytes
Ensamblado en
B8 00 3C BA 04 18 EF
Estoy explotando " Se le permite escribir código que solo funciona en un entorno / SO específico, si lo desea " al máximo nivel: esto solo funcionará en Lenovo Z510 1 .
Esto escribe
SLP_TYPa << 10 | SLP_EN
en elPM1a_CNT
registro ACPI, volqué estos valores de las tablas ACPI hace meses para obtener una respuesta sobre el apagado (donde doy un poco de contexto al código anterior).Esto se puede ejecutar en DOS como COM (simplemente escriba los datos binarios en un archivo y cambie la extensión a "com") o como un gestor de arranque.
Para este último, escriba la firma estándar y tenga cuidado con los problemas con el firmware moderno .
1 No es estrictamente cierto, cualquier sistema que tenga la misma configuración ACPI también se apagará.
fuente
Shell GRUB , 4 bytes
Golfed
Prima
Aquí está una prueba de que shell de GRUB es de hecho Tur n ing-completa (ver comentarios):
fuente
built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives
y admite variables, construcciones condicionales, funciones y más , por lo que, obviamente, es Turning-complete, en cualquier medida.Código de máquina 65C02, 1 byte
Instrucción STP (0xDB):
STP detiene la entrada del reloj del 65C02, apagando efectivamente el 65C02 hasta que se produce un reinicio del hardware (es decir, el pin RES baja). Esto pone al 65C02 en un estado de baja potencia. Esto es útil para aplicaciones (circuitos) que requieren bajo consumo de energía, pero STP rara vez se ve de otra manera.
(Fuente: http://www.6502.org/tutorials/65c02opcodes.html )
volcado xxd:
fuente
Matlab, 21 bytes
No lo he intentado (cerrar todos los programas para reiniciar a mitad del día no es realmente tentador), pero debería funcionar.. Esto funciona...Agregaré una breve explicación más tarde, mi computadora portátil está actualmente apagada.
fuente
uptime
embargo, arruina tushutdown -s
como shell?MATLAB, 11 bytes
Algo similar al enfoque de Stewie Griffin . Sin embargo, MATLAB tiene formas mucho más cortas de invocar comandos del sistema; En este caso,
!
se utiliza. Windows no necesita.exe
nombres de comandos, por lo que también se omite. La/
opción aún es compatible (estoy ejecutando Windows 10) y niega la necesidad de espacio. Las alternativas son:fuente
SmileBASIC,
14116 bytesActiva un bloqueo que hace que el 3DS se reinicie. Espero que esto cuente.
Funciona en la versión más reciente.
fuente
REBOOT
de SBv2 cuenta como una respuesta válida.Bash,
76 bytesSuponiendo que el programa se ejecute como root.
fuente
poweroff
es una sola palabra, aunque ligeramente más letras.Java,
101986242 bytesComo señaló @Snowman, la pregunta no especificaba si se necesitaba un programa completo, por lo que esto aún debería ser aceptable.
fuente
class
coninterface
lo que le permite omitirpublic
de la principal.void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}
()->{Runtime.getRuntime().exec("init 0");}
o tentativamente()->Runtime.getRuntime().exec("init 0")
(no se puede verificar en este momento). Es una lambda que implementa una interfaz vacía sin argumentos personalizada.Python 2, 29 bytes
Funciona en sistemas Linux y necesita privilegios de root.
Para Windows, 33 bytes.
Este podría ser el código menos interesante o útil que haya escrito.
fuente
Commodore 64, 11 bytes
Esto es del indicador BÁSICO. O...
Commodore 64, ensamblaje 6502, 3 bytes (ensamblado), 16 bytes (fuente)
fuente
sys64738
usará cero bytes ya que no hay ningún programa ni nada más para almacenar; Está utilizando la RAM de la pantalla, pero esa RAM ya estará llena de espacios, por lo que solo está reemplazando esos espacios con texto.0
y elsys64738
, puede reemplazar elsys
con el formulario de acceso directosY
, y no cuento la nueva línea final en la longitud del programa. Sin embargo, no creo que su código cumpla con los requisitos: el código en 64738 hace un restablecimiento parcial, no un apagado.TI-Nspire CX CAS, 3 bytes
sumando dos cadenas vacías.
En una versión anterior de la calculadora, esto bloqueará el dispositivo y provocará que se reinicie (no hay forma de apagar un dispositivo sin reiniciarlo, aparte de las combinaciones de botones físicos).
Video de Adriweb
fuente
C ++,
5140 bytes-11 bytes gracias a Ingve !
Solo funciona en IncludeOS (v0.10.0-rc.1)
Prueba:
fuente
void Service::start
,int main
funciona en IncludeOS también.AppleScript, 30 bytes
Hace exactamente lo que dice: le dice a Finder que apague la computadora.
fuente
AutoHotkey,
1110 bytesSalvó un byte gracias a Gurupad Mamadapur
AHK admite un comando de apagado de forma predeterminada. El
9
es una bandera, que consiste enShutdown=1
+PowerDown=8
.fuente
AHK
es misterioso,
No se necesita espacio después . Intenta probarlo con una bandera diferente. Pensé que esto no apagaba inmediatamente la computadora y la ponía en mi script principal que se carga al inicio: D Ahora tengo que cargar en modo seguro y resolver el problema. Suspiro.Código de máquina (x86, cargador de arranque) 18 bytes
Desmontaje
Puede probarlo en el depurador de Bochs con los siguientes comandos (después de iniciar la simulación, tener configurada alguna unidad de disco):
Este mismo código de máquina también funcionará como un ejecutable de DOS (
*.COM
).fuente
C #,
795453 bytesEsto funciona en Windows.
79 bytes :
53 bytes , gracias a TheLethalCoder:
fuente
Action<int>
y hacer_=>System.Diagnostics.Process.Start("shutdown", "/s");
54 bytes.AutoIt, 11 bytes
La función de apagado obtiene la combinación de los siguientes códigos
Para apagar y apagar, por ejemplo, el código sería 9 (apagado + apagado = 1 + 8 = 9).
fuente
0
(cierre de sesión) es un caso especial aquí; no se combina con Standby o Hibernate implícitamente.0 + 32 = 32
Windows: NativeAPI, 212 bytes
Ok, esta no es realmente la versión más corta. Pero tal vez sea interesante para algunos. Esto no se ejecutará en el subsistema Win32. Sin embargo, se ejecutará cuando se ejecute dentro del contexto de la API nativa (como lo hace autochk.exe)
Código
Construir
Para construir esto, use la
build.exe
herramienta WinDDK (con unsource
archivo apropiado paraNMAKE
)O use estos comandos para compilar y vincular:
Nota: Esto generará un ejecutable nativo x86. Cambie los bits apropiados si desea construir esto para una arquitectura diferente.
Prueba
Para probar un ejecutable nativo, debe ejecutarlo antes de cargar el subsistema win32. Una forma común de hacerlo es agregar el ejecutable en la siguiente clave de registro:
Advertencia
Sin embargo, si hace esto, debe tener una opción para editar la sección de registro del sistema operativo de destino desde otro sistema operativo. ¡Ya no podrás iniciar el sistema operativo de destino!
¡Lo hice en una máquina virtual donde podría volver fácilmente a una instantánea anterior!
fuente
Groovy, 23 bytes
fuente
La mayoría de los shells de Linux, 15 bytes
Podría tener 11 bytes de longitud, si está en el
/proc
directorio:Esto es muy sencillo (no tiene efectos secundarios, como desmontar sistemas de archivos o matar procesos) y bastante brutal.
fuente
bash
) en mi computadora :-)echo o>/p*/*ger
Shell de Android, 9 bytes
fuente
AppleScript, 44 bytes
No sé cómo funciona la sintaxis de AppleScript ni nada, así que si alguien sabe cómo acortar esto, por favor dígalo.
Además, estoy haciendo esto en mi teléfono en la escuela ("pirateo"), por lo que no puedo probarlo.
Con 14 bytes menos (gracias a kindall) puedes decir
fuente
tell app "Finder" to shut down
debería funcionar, creo (aunque la compilación puede reemplazar 'aplicación' con 'aplicación').J, 14 bytes
Funciona en sistemas Linux.
2!:0
ejecuta la cadena en/bin/sh
.fuente
Clojure,
4039 bytes-1 byte cambiando la bandera de
-s
a/s
, lo que me permitió deshacerme del espacio.Básicamente la respuesta de Java.
Probar esto fue divertido. Windows decidió hacer una actualización de firmware en mi Surface en el momento en que se cerró. Por supuesto.
fuente
Node.js, 39 bytes
Linux
fuente
AHK,
1915 bytesFunciona solo en ventanas.
fuente
C ++,
4847 (Windows)4645 (Linux) bytesEliminado 1 byte gracias a Snowman
Esto debería apagar el sistema para Windows
Esto debería apagar el sistema para Linux
fuente
;
?#include<cstdlib>
se afeitará un byte.