Mostrar porcentaje de batería restante

26

Muestra la carga restante de la batería, como porcentaje de la carga máxima

Recuerde que si no puede ejecutar su código en un teléfono, calculadora, etc., probablemente pueda instalar su entorno en una computadora portátil al menos. Si no puede ejecutar absolutamente en un dispositivo que tiene una batería, desafortunadamente su idioma no es elegible ya que no tiene un valor útil para imprimir.

Debe mostrar los resultados en la pantalla. En teoría, se supone que es una utilidad útil para que el usuario verifique la batería. Escribir el porcentaje de batería en un archivo es demasiado torpe, lo que requiere que el usuario compruebe el archivo. Por lo tanto, la visualización en pantalla es una parte de la especificación que no se puede anular por defecto IO. Dicho esto, puede suponer que nada impide que cosas como STDOUT se muestren en la pantalla de la manera habitual.

Si el sistema operativo ya muestra el porcentaje de batería todo el tiempo, como en muchos teléfonos, eso no significa que tenga una solución de cero bytes. Debe suponer que la pantalla integrada no existe y mostrar el porcentaje de batería nuevamente en otro lugar.

Editar: el formato de salida se está abriendo. Usted es libre de mostrar tan solo los dígitos del porcentaje, o los dígitos con alguna salida adicional también.

Edit2: los dígitos que representan el porcentaje deben aparecer en una ubicación conocida dentro de la salida, no más de 50 líneas desde el final de la salida, y esa ubicación no debe cambiar entre invocaciones. Los dígitos que representan el porcentaje deben estar separados de otra salida por al menos un carácter que no sea un dígito en cada lado.

Como referencia, aquí está el formato de salida anterior al cambio:

Remaining battery is ddd% o Remaining battery is ddd percent

Jared K
fuente
11
Este es un desafío único porque el idioma elegido depende en gran medida del entorno y el mejor golf dependerá en gran medida de la API presentada en ese entorno. No estoy seguro de si eso es bueno o malo, ja
Poke
44
¿Cómo se define el porcentaje de batería? No estoy realmente familiarizado con el funcionamiento del hardware, pero siempre tuve la impresión de que el porcentaje de batería era algún tipo de huerística en términos de uso previsto.
Wheat Wizard
3
¿Por qué el formato de salida es tan estricto?
Okx
1
@WW Creo que he oído hablar de teléfonos que muestran eso como el 'porcentaje'. No deberían, por supuesto, eso es solo engañoso y condescendiente para el usuario. Pero antes de pedirle a la gente que desarrolle un nuevo controlador de dispositivo a nivel de hardware, estoy dispuesto a aceptar cualquier porcentaje que el SO o API de nivel de sistema proporcione.
Jared K
2
@ user202729 Esa electrónica. La respuesta de SE es sobre la medición interna, pero lo que está expuesto al usuario a menudo es un número alterado: las baterías de iones de litio se agotan más rápido cuanto más carga tienen (¿o es al revés?), pero el dispositivo (por lo general) se ajusta para que muestre un cambio algo lineal en el porcentaje de batería, ya que eso nos parece más predecible para los usuarios.
sundar - Restablecer Monica

Respuestas:

43

Bash, 70 67 50 46 43 16 bytes

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

Salidas: <battery 0-100>: command not found

Lee el archivo /sys/class/power_supply/BAT1/capacity.

Probado con Ubuntu 18.04 en un LENOVO ideapad 500.

Lleva un tiempo (ya que busca en todo el sistema de archivos), ¡pero ahorra un byte!

Vieja respuesta:

echo Remaining battery is `</*/*/*/B*/c*y`%
Okx
fuente
38
Lleva un tiempo (ya que busca en todo el sistema de archivos), ¡pero ahorra un byte! - ¡ese es el código golf para ti!
Stewie Griffin
11
Hm, no estoy seguro de si se puede garantizar que no se llame un archivo /so/apes/yadayada/Brunch/calamity.
Erik the Outgolfer
44
@EriktheOutgolfer Me han dicho que puedo asumir una nueva instalación.
Okx
11
@EriktheOutgolfer Estoy muy contento de que se sirva Brunch antes de que termine el mundo.
mbomb007
1
@algmyr En ese momento también podría hacerloecho {0.100}
Okx
13

JavaScript (navegador), 78 77 50 bytes

(-1 byte gracias a Benoit Esnard )

(-27 bytes ya que el formato de salida es flexible ahora)

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

JavaScript (navegador), 46 bytes, al devolver una promesa

(Sugerido por Shaggy , requiere un encabezado y pie de página)

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


Nota: Solo funciona en Google Chrome> = 38 (computadora de escritorio y Android) o en cualquier otro navegador que admita Battery API . Firefox ha eliminado esta API debido a problemas de privacidad.

Ejemplo en Android (formato de salida anterior):

ingrese la descripción de la imagen aquí

Ejemplo en una computadora portátil con Windows (formato de salida anterior):

ingrese la descripción de la imagen aquí

Noche2
fuente
Puede guardar un byte utilizando plantillas de cadena ES6:`Remaining battery is ${b.level*100}%`
Benoit Esnard
@Benoit Esnard: ¡Buena idea! Gracias ...
Noche2
2
Nunca me di cuenta de que puede obtener el nivel de batería de un usuario en una página web. Sin embargo, no puedo pensar en cuándo esa característica realmente sería útil para un usuario.
numbermaniac
2
@numbermaniac Antiguamente, PoC presentaba sitios web que incluían un modo de bajo consumo de energía basado en el nivel de batería del dispositivo. Lástima que no pensaran que todo esto también podría usarse para rastrearlo sin la necesidad de cookies.
Alexis Facques
44
@numbermaniac: Uno de los usos es guardar automáticamente un formulario cuando la batería del usuario está baja. Pero puede haber muchos usos indebidos y por eso FireFox lo ha eliminado.
Noche2
12

PowerShell , 28 bytes

-26 (!) Gracias a AdmBorkBork. Versión anterior -3 gracias a colsw.

((gwmi win32_battery)|% e*g)

ingrese la descripción de la imagen aquí

gwmi es la abreviatura de Get-WmiObject

|%toma el patrón e*gy encuentra la única propiedad coincidente;estimatedChargeRemaining

Adán
fuente
1
Con esta sugerencia , puede bajar el largo nombre de la propiedad - ((gwmi win32_battery)|% e*g).
AdmBorkBork
@AdmBorkBork Gracias de nuevo. Como puede ver, no soy un golfista Powershell (ni siquiera un usuario). Acabo de usar un poco de Google-fu ...
Adám
Si el dispositivo tiene más de una batería, muestra algo comoRemaining battery is 98 96%
Vasily Alexeev el
@VasilyAlexeev OP parece que podemos elegir un dispositivo apropiado.
Adám
Cambie "abc"+(def)+"ghi"a "abc$(def)ghi"para guardar un poco más.
colsw
10

Bash + acpi, 43 4 bytes

Nuevas reglas

acpi

salida en forma

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

No estoy seguro de si el cambio de regla hace las cosas más interesantes, ¿no podría volcar cualquier texto que contenga todas las cadenas de 0 a 100 que serían resultados válidos? Parece perder la intención original si es así.

Viejas reglas

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

salida en forma

Remaining battery is 92%

No me preguntes por qué set funciona así, pero lo hace.

algmyr
fuente
¿En qué probaste esto? ¿Ubuntu o similar, supongo? No funciona en Mac, por ejemplo.
numbermaniac
Funciona en fedora, pero depende en gran medida de la sintaxis de la salida (¿qué es en mac para referencia? @Numbermaniac)?
Wilf
Supongo que es el disponible para la mayoría de las distribuciones de Linux. ¿Acaso el formato de salida de acpi es diferente en mac (¿está incluso disponible acpi allí?)
algmyr
Parece acpique @Wilf simplemente no está allí en Mac.
numbermaniac
Se puede instalar por separado en algunas distribuciones de Linux, Mac probablemente tiene sus propios controladores y comandos equivalentes.
Wilf
6

Python 3.6 + psutil, 80 bytes

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

Pruébalo en línea!

Si la máquina no tiene batería (como en TIO), el programa arrojará un error, porque psutil.sensors_battery()regresa None.

Esto requiere Python 3.6 para la interpolación de cadenas .

mbomb007
fuente
1
Idk Está incluido en TIO. Incluiré un enlace al módulo.
mbomb007
Busqué en Google y encontré la misma biblioteca, pero mi respuesta de Python 2 no fue tan inteligente como la suya con la interpolación de cadenas. Nota personal: debe ingresar a Python 3.6 y responder más rápido. +1
ElPedro
5

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

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

Abusa de la API win32 al dejar GetSystemPowerStatus()escribir "en algún lugar" en la pila, el miembro interesante está en el tercer byte, de acuerdo con la SYSTEM_POWER_STATUSestructura .

Desafortunadamente, #includeparece ser necesario, probablemente debido a la convocatoria de convenciones.

Salida de ejemplo:

> bat.exe
90

Se muestra 255en sistemas sin batería.

Felix Palmen
fuente
¿Qué sucede si omite la inclusión?
Ruslan
1
@Ruslan el enlazador no encuentra el símbolo en kernel32.dll. Es por eso que creo que es la convención de llamadas, las funciones de la API win32 no usan el "estándar" cdecl. Entonces, incluso si pudiera engañar al enlazador de alguna manera, el código probablemente no funcionaría de todos modos.
Felix Palmen
¿Intentaste compilar con /Gz(predeterminado a __stdcall)?
Neil
@Neil no, ¿gcc / mingw tiene una opción similar o tengo que usar msvc para eso? ¿Y eso no se rompería printf()sin un prototipo?
Felix Palmen
Lo siento, no había leído tu encabezado con suficiente cuidado. Creo que la versión mingw es -mrtd, pero no sé qué pasaría printf(); tal vez hay una inclusión más corta para ello?
Neil
4

Excel VBA, 150 bytes

Restringido a las instalaciones de Office de Windows de 32 bits, porque la llamada Kernel32 de Windows no es segura para punteros de 64 bits.

Salidas a la celda A1en la 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 gracias a la salida flexible

-7 bytes gracias a @Neil por usar un Int en lugar de 2 bytes

Taylor Scott
fuente
2
¿No es seguro el puntero de 64 bits? ¿Qué? Eso es ridículo, Microsoft.
user253751
@immibis tiene que ver con una diferencia entre las versiones: si está utilizando una instalación de Office de 64 bits, entonces la llamada simplemente cambia para serDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott
¿No puedes usar una matriz de bytes en lugar de una estructura?
Neil
@Neil: desafortunadamente no, la llamada Lib asigna f a un puntero de la _SYSTEM_POWER_STATUSestructura , que contiene valores de byte y dword, lo que significa que, en este caso, la estructura debe emularse desde vba, y no se puede usar una matriz de bytes .
Taylor Scott
Si no puede usar una matriz, ¿no puede usar al menos un tipo de dos bytes como relleno en lugar de dos bytes individuales?
Neil
3

QPython para Android , 133 bytes

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

Pantalla de código

Pantalla de salida

No +"%"es estrictamente necesario ya que de todos modos usa el formato de salida más nuevo y flexible, pero ofrece una salida ligeramente más agradable con solo +4 bytes.

sundar - Restablecer a Monica
fuente
[ d.notify(crear alerta de notificación) hubiera sido mucho más corto que crear y mostrar el diálogo, pero por alguna razón no funciona, al menos en mi dispositivo (posiblemente, no se ha actualizado para las API de Android más recientes).]
sundar - Restablecer Monica
Esto funciona para 130 bytes.
ovs
2

Emacs Lisp, 9 bytes

(battery)

Muestra el estado actual de la batería en el mini-buffer en la parte inferior (o en la salida estándar cuando se usa --batch) en formato tales como: Power N/A, battery Unknown (99.1% load, remaining time N/A).

Debería funcionar en Windows, OSX, BSD y Linux.

Winny
fuente
1

Japt , 60 bytes

Ox`nàÀÓ&.getBÂjry().È(x=>O.q("Rà@°á ßMy  "+L*x.¤vel+"%"))

Pruébalo

Lanudo
fuente
1

Java, 546 bytes (Windows XP o superior)

La utilidad powercfg entró en juego para Windows XP, no tengo idea de qué utilidades estaban disponibles antes de esto. También debo ser ejecutado como administrador. Esto es horrible y no hice un intento extremo de golf ...

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);}}

Formateado / 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, estaba más interesado en ver si era posible en Java.

Urna de pulpo mágico
fuente
Tener que llamar a un comando externo como ese, luego leer los resultados del comando externo de un archivo ... luego tener que calcular el porcentaje usted mismo. Y tan detallado. Es horrible, me encanta. Me alegra que la gente pruebe estas cosas en idiomas inadecuados, es muy divertido. +1
Jared K
1
@JaredK Disfruto el "golf" de Java, pero solo en las preguntas en las que la gente piensa: "oh, Dios, no, ¿qué idiota intentaría esto en Java? Simplemente no tendría sentido". Algo irónico.
Urna mágica del pulpo
A veces pienso que Java debería tener una versión de golf como Japt para el Javascript de golf.
Jared K
Mirar @JaredK en Groovy o Clojure, probablemente podría convertir esto en una respuesta maravillosa de 100 bytes si lo intentara muy duro.
Urna mágica del pulpo
@JaredK aquí hay una aproximación de esta misma respuesta en 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}
Magic Octopus Urn