Desafio:
Na linguagem de programação de sua escolha, desligue a máquina na qual seu código foi executado.
Regras
- Sem desligamento por exaustão de recursos (por exemplo: forkbomb para forçar o desligamento)
- Você tem permissão para escrever código que funcione apenas em um ambiente / SO específico, se desejar.
- As brechas padrão são proibidas
Isso é código-golfe , e assim ganha a menor quantidade de bytes!
code-golf
interactive
P. Ktinos
fonte
fonte
`whatever`;
Bash / Perl / PHP / Ruby / etc. stupiglots.shatdown: past tense of the verb shutdown
Respostas:
Assembly (x86 / x64, Linux, as) ,
222119 bytesDeve ser executado como root.
Isso equivale a pressionar o botão liga / desliga e não é uma maneira segura de desligar o PC. Certifique-se de fechar todos os aplicativos abertos e executar
sync
para liberar todos os buffers do sistema de arquivos antes de executar este programa, para minimizar pelo menos o risco de corrupção de arquivos.Execução de teste
Seguido pela escuridão.
Como funciona
int $0x80
chama uma interrupção de software. Ele funciona em x86 e x64, mas está obsoleto há mais de uma década e não deve ser usado no código de produção. código x64 deve usar em seusyscall
lugar. O x86 deve ser usadosysenter
, mas é muito complicado para o código de golfe.A ação resultante do syscall depende dos registros EAX - EDX, ESI e EDI. A Referência do Syscall do Linux mostra todos os syscalls disponíveis via
int $0x80
.Quando o EAX retém 0x58 (88) , a reinicialização é chamada, que também pode ser usada para desligar, adormecer ou hibernar o computador, além de alternar entre os kernels e desativar ou ativar a combinação de teclas Ctrl - Alt - Del .
No início do programa - e compilando com
as
ougcc -nostdlib
, podemos garantir que estamos realmente no início do programa - a maioria dos registros é definida como 0 . Isso inclui o EAX, para que possamosmov $0x58, %al
definir os 8 bits inferiores do EAX para 0x58 , configurando o EAX para 0x58 . Isso economiza dois bytes ao zerar manualmente o registro comxor %eax, %eax
e mais um ao lado,mov $0x58, %eax
que codifica 0x58 em 32 bits.Os dois primeiros argumentos para reinicialização são números mágicos, presumivelmente para impedir reinicializações acidentais, e são lidos nos registros EBX e ECX. A menos que esses números sejam iguais a certas constantes, a reinicialização se recusa a executar qualquer ação.
O primeiro número mágico deve ser igual a 0xfee1dead ( sentir-se morto ), provavelmente se referindo ao desligamento / morte do PC.
O segundo número mágico pode ser igual a quatro constantes diferentes, embora os três últimos não funcionem nas versões antigas do Linux. Todos eles parecem se referir à alimentação subsequente / nascimento do PC.
0x28121969 representa o aniversário de Linus Torvalds (28 de dezembro de 1969).
0x05121996 representa o aniversário de Patricia Torvalds (5 de dezembro de 1996).
0x16041998 representa o aniversário de Daniela Torvalds (16 de abril de 1998).
0x20112000 representa o aniversário de Celeste Torvalds (20 de novembro de 2000).
Patricia, Daniela e Celeste Torvalds são as três filhas de Linus Torvalds.
O registro EDX seleciona o tipo de "reinicialização" que queremos. 0x4321fedc é RB_POWER_OFF , desligando o PC e desligando-o.
Finalmente, o valor do registro ESI é ignorado para RB_POWER_OFF ; o valor do registro EDI é totalmente ignorado pela reinicialização .
Versão alternativa, somente x64, 19 bytes
No x64, podemos usar um syscall apropriado para a mesma contagem de bytes.
As únicas diferenças estão na instrução (
syscall
vsint $0x80
), no valor de __NR_REBOOT ( 0xa9 vs 0x58 ) e nos registros envolvidos.fonte
fee1
assimdead
agora.PowerShell, 13 bytes
Bastante auto-explicativo? Não funciona no núcleo do PowerShell, portanto não funcionará no PowerShell para Linux / MacOS (já tentei no TIO :-D).
Envio de lixo bônus, 12 bytes
Nos meus testes, isso funciona no Windows 2003 com PowerShell 2.0. Ele não funciona na maioria das versões mais recentes e pode não funcionar dependendo de quais módulos estão instalados. É terrível!
Isso procura na lista de comandos qualquer um com o padrão
s*r
e, em seguida, executa todos eles! Para ser claro, isso é perigoso, não faça isso!O truque, é claro, é obter uma lista de comandos que não possuem parâmetros obrigatórios, caso contrário, o PowerShell solicitará um valor.
Na minha máquina 2003, os três comandos que ele retorna são:
Sim, ele inicia o protetor de tela de marca de seleção, mas não, ele não espera que seja concluído antes do lançamento
Stop-Computer
.Essa abordagem pode funcionar em máquinas mais novas, dependendo novamente de quais módulos estão instalados, mas o melhor que pude fazer no Windows 2012 e 2016 foi de 14 bytes :
(e sim, claro, o envio do winbatch funcionará no PowerShell e é mais curto, mas isso não é divertido)
fonte
gcm *p-c*|iex
- e há apenas um resultado também!Stop-Computer
, qual é o último resultado).Lote, 10 bytes
No Windows, isso seria suficiente
Isso configurará um desligamento em um minuto.
Como alternativa, como aponta @flashbang:
Isso desliga o computador imediatamente.
fonte
Press the big button on the front of your computer
= 0 bytescódigo de máquina x86, Lenovo Z510, DOS COM ou Bootloader, 7 bytes
Montado em
B8 00 3C BA 04 18 EF
Estou explorando " Você tem permissão para escrever código que funcione apenas em um ambiente / sistema operacional específico, se desejar " até o nível mais alto: isso funcionará apenas no Lenovo Z510 1 .
Isso grava
SLP_TYPa << 10 | SLP_EN
noPM1a_CNT
registro da ACPI, despejei esses valores das tabelas da ACPI meses atrás para obter uma resposta sobre o desligamento (onde dou um pouco de contexto ao código acima).Isso pode ser executado no DOS como um COM (basta gravar os dados binários em um arquivo e alterar a extensão para "com") ou como um carregador de inicialização.
Para este último, escreva a assinatura padrão e cuidado com os problemas do firmware moderno .
1 Não é rigorosamente verdade, qualquer sistema que tenha a mesma configuração ACPI também será encerrado.
fonte
Shell GRUB , 4 bytes
Golfe
Bônus
Aqui está uma prova de que shell do GRUB é realmente Tur n ing-completo (ver comentários):
fonte
built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives
e suporta variáveis, construções condicionais, funções e muito mais , portanto, obviamente, é Turning-complete, por qualquer medida.Código de máquina 65C02, 1 byte
Instrução STP (0xDB):
STP interrompe a entrada do relógio do 65C02, efetivamente desligando o 65C02 até que ocorra uma redefinição de hardware (ou seja, o pino RES fica baixo). Isso coloca o 65C02 em um estado de baixa energia. Isso é útil para aplicações (circuitos) que exigem baixo consumo de energia, mas o STP raramente é visto de outra maneira.
(Fonte: http://www.6502.org/tutorials/65c02opcodes.html )
Despejo xxd:
fonte
Matlab, 21 bytes
Eu não tentei isso (fechar todos os programas para reiniciar no meio do dia não é realmente tentador), mas deve funcionar.. Isso funciona...Vou adicionar uma breve explicação mais tarde, meu laptop está desligado.
fonte
uptime
entanto, você arruina o seu ...shutdown -s
como shell?MATLAB, 11 bytes
Um pouco semelhante à abordagem de Stewie Griffin . No entanto, MATLAB tem forma formas mais curtas de invocar comandos do sistema; neste caso,
!
é usado. O Windows não precisa.exe
de nomes de comando, então isso também é deixado de fora. A/
opção ainda é suportada (estou executando o Windows 10) e nega a necessidade de espaço. As alternativas são:fonte
SmileBASIC,
14116 bytesDesencadeia uma falha que faz com que o 3DS seja reiniciado. Espero que isso conte.
Funciona na versão mais recente.
fonte
REBOOT
do SBv2 contasse como uma resposta válida.Bash,
76 bytesSupondo que o programa seja executado como root.
fonte
poweroff
é uma única palavra, embora um pouco mais de letras.Java,
101986242 bytesComo o @Snowman apontou, a pergunta não especificou se era necessário um programa completo; portanto, isso ainda deve ser aceitável.
fonte
class
cominterface
a que permite omitirpublic
da principal.void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}
()->{Runtime.getRuntime().exec("init 0");}
ou provisoriamente()->Runtime.getRuntime().exec("init 0")
(não é possível verificar no momento). É um lambda implementando uma interface personalizada void e sem argumentos.Python 2, 29 bytes
Funciona em sistemas Linux e precisa de privilégios de root.
Para Windows, 33 bytes
Esse pode ser o código menos interessante ou útil que eu já escrevi.
fonte
Comodoro 64, 11 bytes
Isso é do prompt do BASIC. Ou...
Commodore 64, montagem 6502, 3 bytes (montado), 16 bytes (origem)
fonte
sys64738
usará zero bytes, pois não há nenhum programa ou qualquer outra coisa para armazenar; Você está usando a RAM da tela, mas essa RAM já estará preenchida com espaços, portanto, você está apenas substituindo esses espaços por texto.0
e osys64738
, pode substituir osys
pelo atalhosY
, e eu não conto a nova linha à direita no comprimento do programa. No entanto, não acho que seu código atenda aos requisitos: o código em 64738 faz uma reinicialização suave, não um desligamento.TI-Nspire CX CAS, 3 bytes
somando duas cadeias vazias.
Em uma versão mais antiga da calculadora, isso travaria o dispositivo e causaria a reinicialização (não há como desligar um dispositivo sem a reinicialização além das combinações físicas de botões).
Vídeo por Adriweb
fonte
C ++,
5140 bytes-11 bytes graças ao Ingve !
Funciona apenas no IncludeOS (v0.10.0-rc.1)
Teste:
fonte
void Service::start
,int main
funciona no IncludeOS também.AppleScript, 30 bytes
Faz exatamente o que diz: diz ao Finder para desligar o computador.
fonte
AutoHotkey,
1110 bytesGuardou um byte graças a Gurupad Mamadapur
AHK Suporta um comando Shutdown por padrão. O
9
sinalizador consiste emShutdown=1
+PowerDown=8
.fonte
AHK
é misterioso.,
não é necessário. Tente testá-lo com um sinalizador diferente. Eu pensei que isso não desligaria o computador imediatamente e o colocaria no meu script principal que é carregado na inicialização: D Agora eu tenho que carregar no modo de segurança e resolver o problema. Suspiro.Código da máquina (x86, carregador de inicialização) 18 bytes
Desmontagem:
Você pode testá-lo no depurador de Bochs com os seguintes comandos (após iniciar a simulação, com a instalação de alguma unidade de disco):
Esse mesmo código de máquina também funcionará como um executável do DOS (
*.COM
).fonte
C #,
795453 bytesIsso funciona no Windows.
79 bytes :
53 bytes , graças a TheLethalCoder:
fonte
Action<int>
e executar_=>System.Diagnostics.Process.Start("shutdown", "/s");
por 54 bytes.AutoIt, 11 bytes
A função Shutdown obtém a combinação dos seguintes códigos
Para desligar e desligar, por exemplo, o código seria 9 (desligamento + desligamento = 1 + 8 = 9).
fonte
0
(logoff) é um caso especial aqui; não combina com o modo de espera ou o hibernar implicitamente.0 + 32 = 32
Windows - NativeAPI, 212 bytes
Ok, essa não é realmente a versão mais curta. Mas talvez seja interessante para alguns. Isso não executado no subsistema Win32. No entanto, ele será executado quando executado dentro do contexto da API nativa (como autochk.exe)
Código
Construir
Para criar isso, use a
build.exe
ferramenta WinDDK (com umsource
arquivo apropriado paraNMAKE
)Ou use estes comandos para compilar e vincular:
Nota: Isso criará um executável nativo x86. Altere os bits apropriados se desejar criar isso para uma arquitetura diferente.
Teste
Para testar um executável nativo, você deve executá-lo antes do carregamento do subsistema win32. Uma maneira comum de fazer isso é anexar o executável na seguinte chave do Registro:
Aviso
Se você fizer isso, no entanto, precisará ter uma opção para editar a seção de registro do sistema operacional de destino de outro sistema operacional. Desde a você não poderá mais inicializar o sistema operacional de destino!
Eu fiz isso em uma VM onde eu poderia facilmente reverter para um instantâneo anterior!
fonte
Groovy, 23 bytes
fonte
A maioria dos shells do Linux, 15 bytes
Pode ter 11 bytes de comprimento, se você estiver no
/proc
diretório:Isso é muito direto (não tem efeitos colaterais, como desmontar sistemas de arquivos ou matar processos) e bastante brutal.
fonte
bash
) no meu computador :-)echo o>/p*/*ger
Shell Android, 9 bytes
fonte
AppleScript, 44 bytes
Não sei como funciona a sintaxe do AppleScript ou algo assim; portanto, se alguém souber como diminuir isso, informe.
Além disso, estou fazendo isso no meu telefone da escola ("hacking"), para não poder testá-lo.
Com menos 14 bytes (graças a kindall), você pode dizer
fonte
tell app "Finder" to shut down
deve funcionar, acredito (embora a compilação possa substituir 'app' por 'application').J, 14 bytes
Funciona em sistemas Linux.
2!:0
executa a string em/bin/sh
.fonte
Clojure,
4039 bytes-1 byte, alterando o sinalizador de
-s
para/s
, o que me permitiu livrar-me do espaço.Basicamente, a resposta do Java.
Testar isso foi divertido. O Windows decidiu fazer uma atualização de firmware no meu Surface assim que ele foi desligado. Claro.
fonte
Node.js, 39 bytes
Linux
fonte
AHK,
1915 bytesFunciona apenas no Windows.
fonte
C ++,
4847 (Windows)4645 (Linux) bytesRemovido 1 byte graças ao Snowman
Isso deve desligar o sistema para Windows
Isso deve desligar o sistema para Linux
fonte
;
?#include<cstdlib>
irá cortar um byte.