Exibir porcentagem de bateria restante


26

Exibe a carga restante da bateria, como uma porcentagem da carga máxima

Lembre-se, se você não pode executar seu código em um telefone, calculadora, etc, provavelmente pode instalar seu ambiente em pelo menos um laptop. Se você absolutamente não pode rodar em um dispositivo com bateria, infelizmente seu idioma não é elegível, pois você não tem um valor útil para imprimir.

Você deve exibir os resultados na tela. Teoricamente, é suposto ser um utilitário útil para o usuário verificar a bateria. Gravar a porcentagem da bateria em um arquivo é muito complicado, exigindo que o usuário verifique o arquivo. A exibição na tela é, portanto, parte da especificação que não pode ser substituída pelo IO padrão. Dito isso, você pode assumir que nada impede que coisas como STDOUT sejam exibidas na tela da maneira usual.

Se a porcentagem da bateria já estiver sendo exibida na tela o tempo todo pelo sistema operacional, como em muitos telefones, isso não significa que você tenha uma solução de zero byte. Você deve assumir que a tela embutida não existe e exibir a porcentagem da bateria novamente em outro lugar.

Edit: O formato de saída está sendo aberto. Você é livre para exibir apenas apenas os dígitos da porcentagem ou os dígitos com alguma saída extra também.

Edit2: Os dígitos que representam a porcentagem devem aparecer em um local conhecido na saída, a não mais de 50 linhas do final da saída, e esse local não deve mudar entre as chamadas. Os dígitos que representam a porcentagem devem ser separados de outras saídas por pelo menos um caractere não dígito de cada lado.

Para referência, aqui está o antigo formato de saída anterior à alteração:

Remaining battery is ddd% ou Remaining battery is ddd percent


11
Esse é um desafio único, porque o idioma escolhido depende muito do ambiente e o melhor golfe depende muito da API apresentada nesse ambiente. Não tenho certeza se isso é bom ou ruim, ha #
007 Poke

4
Qual é a porcentagem de bateria definida como? Não estou realmente familiarizado com o funcionamento do hardware, mas sempre tive a impressão de que a porcentagem de bateria era algum tipo de huerística em termos de uso previsto.
Assistente de trigo

3
Por que o formato de saída é tão rigoroso?
Okx 30/07/19

1
@WW Acho que ouvi falar de telefones exibindo isso como o 'percentual'. Obviamente, eles não devem ser enganosos e condescendentes com o usuário. Mas, sem pedir às pessoas para jogarem um novo driver de dispositivo no nível do hardware, estou disposto a aceitar qualquer% que o SO ou a API no nível do sistema fornecer.
Jared K

2
@ user202729 Essa resposta eletrônica.SE é sobre a medição interna, mas o que é exposto ao usuário geralmente é um número medicado - as baterias de íon de lítio drenam mais rapidamente quanto mais carga eles têm (ou é o contrário?), mas o dispositivo (geralmente) se ajusta para que isso mostre uma alteração linear na porcentagem da bateria, pois isso parece mais previsível para os usuários.
sundar - Restabelece Monica

Respostas:


43

Bash, 70 67 50 46 43 16 bytes

`</*/*/*/B*/c*y`

Saídas: <battery 0-100>: command not found

Lê o arquivo /sys/class/power_supply/BAT1/capacity.

Testado usando o Ubuntu 18.04 em um ideapad 500 do LENOVO.

Demora um pouco (já que pesquisa todo o sistema de arquivos) - mas salva um byte!

Resposta antiga:

echo Remaining battery is `</*/*/*/B*/c*y`%

38
Demora um pouco (já que pesquisa todo o sistema de arquivos) - mas salva um byte! - isso é código de golfe para você!
Stewie Griffin

11
Hum, não tenho certeza se é garantido que não haja um arquivo chamado /so/apes/yadayada/Brunch/calamity.
Erik the Outgolfer

4
@EriktheOutgolfer Me disseram que posso assumir uma nova instalação.
Okx 31/07

11
@EriktheOutgolfer Estou tão feliz que Brunch é servido antes que o mundo acabe.
mbomb007

1
@algmyr Nesse ponto eu poderia muito bem fazerecho {0.100}
Okx

13

JavaScript (navegador), 78 77 50 bytes

(-1 byte graças a Benoit Esnard )

(-27 bytes, já que o formato de saída é flexível agora)

navigator.getBattery().then(b=>alert(b.level*100))

JavaScript (navegador), 46 bytes, retornando uma promessa

(Sugerido por Shaggy , requer cabeçalho e rodapé)

f=
_=>navigator.getBattery().then(b=>b.level*100)
f().then(alert)


Nota: Funciona apenas no Google Chrome> = 38 (computador e Android) ou em qualquer outro navegador compatível com a API da bateria . O FireFox removeu esta API devido a questões de privacidade.

Exemplo no Android (formato de saída antigo):

insira a descrição da imagem aqui

Exemplo em um laptop Windows (formato de saída antigo):

insira a descrição da imagem aqui


Você pode salvar um byte usando modelos de seqüência de caracteres ES6:`Remaining battery is ${b.level*100}%`
Benoit Esnard

@Benoit Esnard: Boa ideia! Obrigado ...
night2

2
Eu nunca percebi que você pode obter o nível da bateria do usuário em uma página da web. Não consigo pensar em quando esse recurso seria realmente útil para um usuário.
numbermaniac

2
@numbermaniac Naquela época, o PoC apresentava sites que incluíam um modo de baixo consumo de energia com base no nível da bateria do dispositivo. Pena que eles não pensaram que tudo isso também poderia ser usado para rastrear você sem a necessidade de cookies.
Alexis Facques

4
@numbermaniac: um dos usos é salvar automaticamente um formulário quando a bateria do usuário estiver fraca. Mas pode haver muitos usos indevidos e é por isso que o FireFox o removeu.
night2

12

PowerShell , 28 bytes

-26 (!) Graças ao AdmBorkBork. Versão anterior -3 graças ao colsw.

((gwmi win32_battery)|% e*g)

insira a descrição da imagem aqui

gwmi é curto para Get-WmiObject

|%pega o padrão e*ge encontra a única propriedade correspondente;estimatedChargeRemaining


1
Usando esta dica , você pode jogar golfe pelo longo nome da propriedade - ((gwmi win32_battery)|% e*g).
AdmBorkBork 30/07/2018

@AdmBorkBork Obrigado novamente. Como você pode ver, eu não sou um jogador de Powershell (ou mesmo usuário). Apenas usei um pouco de Google-fu…
Adám 30/07/19

Se o dispositivo tiver mais de uma bateria, ele exibirá algo comoRemaining battery is 98 96%
Vasily Alexeev

O @VasilyAlexeev OP parece que podemos escolher um dispositivo apropriado.
Adám 31/07/19

Mude "abc"+(def)+"ghi"para "abc$(def)ghi"para economizar um pouco mais.
colsw

10

Bash + acpi, 43 4 bytes

Novas regras

acpi

saída no formulário

Battery 0: Charging, 92%, 00:05:37 until charged

não tenho certeza se a alteração da regra torna as coisas mais interessantes, você não poderia despejar qualquer texto que contenha todas as seqüências de 0 a 100 que seria uma saída válida? Parece perder a intenção original, se assim for.

Regras antigas

set `acpi`;echo Remaining battery is ${4%,}

saída no formulário

Remaining battery is 92%

Não me pergunte por que o set funciona assim, mas funciona.


Em que você testou isso? Ubuntu ou similar, eu acho? Não funciona no Mac, por exemplo.
Numbermaniac

Funciona no fedora, mas depende muito da sintaxe da saída (o que está no mac para referência? @Numbermaniac)?
Wilf

Eu suponho que é o único disponível para a maioria das distribuições Linux. O formato de saída ACPI é diferente no Mac, talvez (o ACPI está disponível lá)?
algmyr

@ Wilf acpisimplesmente não existe no Mac, parece.
Numbermaniac

Ele pode ser instalado separadamente em algumas distribuições Linux, o Mac provavelmente possui seus próprios drivers e comandos equivalentes.
Wilf

6

Python 3.6 + psutil, 80 bytes

import psutil
print(f"Remaining battery is {psutil.sensors_battery().percent}%")

Experimente online!

Se a máquina não tiver bateria (como no TIO), o programa lançará um erro, pois psutil.sensors_battery()retorna None.

Isso requer o Python 3.6 para interpolação de strings .


1
Idk. Está incluído no TIO. Vou incluir um link para o módulo.
mbomb007

Pesquisei no Google e encontrei a mesma biblioteca, mas minha resposta do Python 2 não foi tão inteligente quanto a sua com interpolação de strings. Nota para self: deve entrar no Python 3.6 e responder mais rapidamente. +1
ElPedro 31/07

5

C (win32, gcc i686-w64-mingw32), 78 bytes

#include<windows.h>
main(s){GetSystemPowerStatus(&s);printf("%hhu",s>>16);}

Abusa a API do win32 deixando a GetSystemPowerStatus()gravação "em algum lugar" na pilha, o membro interessante está no terceiro byte, de acordo com a SYSTEM_POWER_STATUSestrutura .

Infelizmente, #includeparece ser necessário, provavelmente por causa de convocar convenções.

Exemplo de saída:

> bat.exe
90

Exibe 255em sistemas sem bateria.


O que acontece se você omitir a inclusão?
Ruslan

1
@Ruslan, o vinculador não encontra o símbolo kernel32.dll. É por isso que acho que é a convenção de chamada, as funções da API do win32 não usam o "padrão" cdecl. Portanto, mesmo que eu pudesse enganar o vinculador de alguma forma, o código provavelmente não funcionaria de qualquer maneira.
Felix Palmen

Você tentou compilar com /Gz(padrão para __stdcall)?
Neil

@ Neil não, o gcc / mingw tem uma opção semelhante ou eu tenho que usar o msvc para isso? E isso não quebraria printf()sem um protótipo?
Felix Palmen

Desculpe, eu não tinha lido o seu cabeçalho com atenção suficiente. Eu acho que a versão mingw é -mrtd, mas não sei o que aconteceria printf(); talvez haja uma inclusão mais curta para isso?
Neil

4

Excel VBA, 150 bytes

Restrito ao Windows de 32 bits Instalações do escritório, porque a chamada do Kernel32 do Windows não é um ponteiro de 64 bits seguro.

Saídas para a célula A1no ActiveSheet.

Declare Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Type t
i As Integer
b As Byte
End Type
Sub d
Dim e As t
GetSystemPowerStatus e
[A1]=e.b
End Sub

-26 bytes graças à saída flexível

-7 bytes graças a @Neil por usar um Int em vez de 2 bytes


2
O ponteiro de 64 bits não é seguro? O que? Isso é ridículo, Microsoft.
User253751

@immibis tem faço com uma diferença entre as versões - se você estiver usando um pouco 64 instalar do Office, em seguida, a chamada apenas muda para serDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott

Você não pode usar uma matriz de bytes em vez de uma estrutura?
Neil

@ Neil - infelizmente não, a chamada Lib atribui f a um ponteiro da _SYSTEM_POWER_STATUSestrutura , que contém valores de byte e dword, o que significa que, nesse caso, a estrutura deve ser emulada no vba e uma matriz de bytes não pode ser usada .
Taylor Scott

Se você não pode usar uma matriz, não pode pelo menos usar um tipo de dois bytes como preenchimento em vez de dois bytes únicos?
Neil

3

QPython para Android , 133 bytes

from androidhelper import*
d=Android()
d.batteryStartMonitoring()
d.dialogCreateAlert(str(d.batteryGetLevel()[1])+"%")
d.dialogShow()

Tela de código

Tela de saída

A +"%"não é estritamente necessário uma vez que utiliza o formato de saída mais flexível mais recente de qualquer maneira, mas faz para a saída um pouco mais agradável em apenas 4 bytes.


[ d.notify(criar alerta de notificação) teria sido muito menor do que criar e exibir a caixa de diálogo, mas por algum motivo ela não funciona, pelo menos no meu dispositivo (possivelmente, não foi atualizada para as APIs Android mais recentes).]
sundar - Restabelece Monica

Isso funciona para 130 bytes.
ovs 01/08/19

2

Emacs Lisp, 9 bytes

(battery)

Mostra o estado de carga actual da bateria em mini-tampão, na parte inferior (ou para a saída padrão quando se utiliza --batch) em formato tal como: Power N/A, battery Unknown (99.1% load, remaining time N/A).

Deve funcionar no Windows, OSX, BSD e Linux.



1

Java, 546 bytes (Windows XP ou superior)

O utilitário powercfg entrou em ação no WindowsXP; não tenho idéia de quais utilitários estavam disponíveis antes disso. Também devo ser executado como administrador. Isso é horrível e eu não fiz uma tentativa extrema de golfe ...

import java.io.*;import java.util.Scanner;public class J {public static void main(String[] args)throws Exception{Process p=Runtime.getRuntime().exec("powercfg energy");p.waitFor();Scanner s=new Scanner(new File("C:\\windows\\system32\\energy-report.html"));String x;double a=0,b=0;while(s.hasNextLine()){x=s.nextLine();if(x.contains("Design Capacity")){s.nextLine();b=Integer.parseInt(s.nextLine().replaceAll("\\D+",""));}else if(x.contains("Last Full Charge")){s.nextLine();a=Integer.parseInt(s.nextLine().replaceAll("\\D+",""));}}System.out.print(a/b*100);}}

Formatado / comentado ...

import java.io.*;
import java.util.Scanner;

public class J {
    public static void main(String[] args) throws Exception {
        Process p = Runtime.getRuntime().exec("powercfg energy"); // Run CMD sys32 app.
        p.waitFor();                                              // Wait for it.
        Scanner s = new Scanner(new File(
                "C:\\windows\\system32\\energy-report.html"));    // Read output.
        String x;
        double a = 0, b = 0;
        while (s.hasNextLine()) {
            x = s.nextLine();
            if (x.contains("Design Capacity")) {                   // Find max capacity.
                s.nextLine();
                b = Integer.parseInt(s.nextLine().replaceAll("\\D+", ""));
            } else if (x.contains("Last Full Charge")) {           // Find current capacity.
                s.nextLine();
                a = Integer.parseInt(s.nextLine().replaceAll("\\D+", ""));
            }
        }
        System.out.print(a / b * 100); // Calculate %.
    }
}

Honestamente, eu estava mais interessado em ver se isso era possível em Java.


Tendo que chamar um comando externo como esse, ler os resultados do comando externo de um arquivo ... e depois calcular você mesmo a porcentagem. E tão detalhado. É horrível eu adoro isso. Fico feliz que as pessoas tentam essas coisas em idiomas inadequados, é tão divertido. +1
Jared K

1
@JaredK Eu gosto de jogar golfe em Java, mas apenas em perguntas em que as pessoas pensam: "Oh Deus, não, que idiota jamais tentaria isso em Java? Isso simplesmente não faria sentido". Meio irônico.
Magic Octopus Urn

Às vezes, acho que o Java deve ter uma versão do golfe, como foi feito o Japt para o Javascript.
Jared K

@JaredK olha para Groovy ou Clojure, provavelmente poderia transformar isso em uma resposta de 100 bytes de groovy se eu tentasse super difícil.
Magic Octopus Urn

@JaredK aqui está uma aproximação desta mesma resposta em Groovy:{Runtime.getRuntime().exec("powercfg energy").waitFor();x=new XMLSlurper(new File("C:\\windows\\system32\\energy-report.html"));x.html.table.tr[#].span[0] as int/x.html.table.tr[#].span[0] as int}
Magia Octopus Urna
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.