Afficher le pourcentage de batterie restante

26

Afficher la charge restante de la batterie, en pourcentage de la charge maximale

N'oubliez pas que si vous ne pouvez pas exécuter votre code sur un téléphone, une calculatrice, etc., vous pouvez probablement installer votre environnement sur un ordinateur portable au moins. Si vous ne pouvez absolument pas utiliser un appareil doté d'une batterie, votre langue n'est malheureusement pas éligible car vous n'avez aucune valeur utile à imprimer.

Vous devez afficher les résultats à l'écran. Ceci est théoriquement censé être un utilitaire pratique pour l'utilisateur pour vérifier la batterie. L'écriture du pourcentage de batterie dans un fichier est trop maladroite, ce qui oblige l'utilisateur à vérifier le fichier. L'affichage à l'écran fait donc partie de la spécification qui ne peut pas être remplacée par IO par défaut. Cela dit, vous pouvez supposer que rien n'empêche des choses comme STDOUT d'être affichées à l'écran de la manière habituelle.

Si le pourcentage de batterie est déjà affiché à l'écran en permanence par le système d'exploitation, comme sur de nombreux téléphones, cela ne signifie pas que vous avez une solution à zéro octet. Vous devez supposer que l'affichage intégré n'existe pas et afficher à nouveau le pourcentage de batterie ailleurs.

Modifier: le format de sortie est en cours d'ouverture. Vous êtes libre d'afficher aussi peu que les chiffres du pourcentage, ou les chiffres avec une sortie supplémentaire également.

Edit2: Les chiffres représentant le pourcentage doivent apparaître à un emplacement connu dans la sortie, pas plus de 50 lignes à partir de la fin de la sortie, et cet emplacement ne doit pas changer entre les invocations. Les chiffres représentant le pourcentage doivent être séparés des autres sorties par au moins un caractère non numérique de chaque côté.

Pour référence, voici l'ancien format de sortie d'avant le changement:

Remaining battery is ddd% ou Remaining battery is ddd percent

Jared K
la source
11
C'est un défi unique car la langue choisie dépend en grande partie de l'environnement et le meilleur golf va dépendre grandement de l'api présenté dans cet environnement. Je ne sais pas si c'est bon ou mauvais, ha
Poke
4
Quel est le pourcentage de batterie défini? Je ne suis pas vraiment familier avec le fonctionnement du matériel, mais j'ai toujours eu l'impression que le pourcentage de batterie était une sorte d'hueristique en termes d'utilisation prévue.
Wheat Wizard
3
Pourquoi le format de sortie est-il si strict?
Okx
1
@WW Je pense avoir entendu parler de téléphones affichant ce pourcentage. Bien sûr, cela ne devrait pas être trompeur et condescendant pour l'utilisateur. Mais à moins de demander aux gens de jouer à un nouveau pilote de périphérique au niveau matériel, je suis prêt à accepter tout% que le système d'exploitation ou l'API au niveau du système donne.
Jared K
2
@ user202729 Cette réponse electronics.SE concerne la mesure interne, mais ce qui est exposé à l'utilisateur est souvent un nombre trafiqué - les batteries Li-ion se déchargent plus vite plus elles sont chargées (ou est-ce l'inverse?), mais l'appareil (généralement) s'ajuste pour que cela montre un changement quelque peu linéaire du pourcentage de batterie car cela semble plus prévisible pour nous, utilisateurs.
sundar

Réponses:

43

Bash, 70 67 50 46 43 16 octets

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

Les sorties: <battery 0-100>: command not found

Lit le fichier /sys/class/power_supply/BAT1/capacity.

Testé avec Ubuntu 18.04 sur un ideapad 500 LENOVO.

Prend un certain temps (car il recherche l'ensemble du système de fichiers) - mais il enregistre un octet!

Ancienne réponse:

echo Remaining battery is `</*/*/*/B*/c*y`%
Okx
la source
38
Prend un certain temps (car il recherche l'ensemble du système de fichiers) - mais il enregistre un octet! - c'est le golf de code pour vous!
Stewie Griffin
11
Hm, je ne sais pas s'il peut être garanti qu'il n'y a pas de fichier appelé /so/apes/yadayada/Brunch/calamity.
Erik the Outgolfer le
4
@EriktheOutgolfer On me dit que je peux supposer une nouvelle installation.
2018
11
@EriktheOutgolfer Je suis tellement content que le brunch soit servi avant la fin du monde.
mbomb007
1
@algmyr À ce stade, je ferais aussi bienecho {0.100}
Okx
13

JavaScript (navigateur), 78 77 50 octets

(-1 octet merci à Benoit Esnard )

(-27 octets car le format de sortie est désormais flexible)

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

JavaScript (navigateur), 46 octets, en renvoyant une promesse

(Suggéré par Shaggy , nécessite un en-tête et un pied de page)

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


Remarque: ne fonctionne que sur Google Chrome> = 38 (ordinateur de bureau et Android) ou tout autre navigateur prenant en charge l' API de batterie . FireFox a supprimé cette API en raison de problèmes de confidentialité.

Exemple sur Android (ancien format de sortie):

entrez la description de l'image ici

Exemple sur un ordinateur portable Windows (ancien format de sortie):

entrez la description de l'image ici

Nuit2
la source
Vous pouvez enregistrer un octet en utilisant des modèles de chaîne ES6:`Remaining battery is ${b.level*100}%`
Benoit Esnard
@Benoit Esnard: Bonne idée! Merci ...
Night2
2
Je n'ai jamais réalisé que vous pouvez obtenir le niveau de batterie d'un utilisateur dans une page Web. Je ne peux pas penser quand cette fonctionnalité serait réellement utile à un utilisateur.
numbermaniac
2
@numbermaniac À l'époque, PoC proposait des sites Web qui incluaient un mode basse consommation basé sur le niveau de batterie de l'appareil. Dommage qu'ils ne pensent pas que tout cela puisse également être utilisé pour vous suivre sans avoir besoin de cookies.
Alexis Facques
4
@numbermaniac: L'une des utilisations consiste à enregistrer automatiquement un formulaire lorsque la batterie de l'utilisateur est faible. Mais il peut y avoir de nombreuses utilisations abusives et c'est pourquoi FireFox l'a supprimé.
Night2
12

PowerShell , 28 octets

-26 (!) Grâce à AdmBorkBork. Version précédente -3 grâce à colsw.

((gwmi win32_battery)|% e*g)

entrez la description de l'image ici

gwmi est l'abréviation de Get-WmiObject

|%prend le modèle e*get trouve la seule propriété correspondante;estimatedChargeRemaining

Adam
la source
1
En utilisant cette astuce , vous pouvez jouer au golf sur le long nom de la propriété - ((gwmi win32_battery)|% e*g).
AdmBorkBork
@AdmBorkBork Merci encore. Comme vous pouvez le constater, je ne suis pas un golfeur Powershell (ni même un utilisateur). Je viens d'utiliser un peu de Google-fu…
Adám
Si l'appareil a plus d'une batterie, il affiche quelque chose commeRemaining battery is 98 96%
Vasily Alexeev
@VasilyAlexeev OP donne l'impression que nous pouvons choisir un appareil approprié.
Adám
Passez "abc"+(def)+"ghi"à "abc$(def)ghi"pour en enregistrer davantage.
colsw
10

Bash + acpi, 43 4 octets

Nouvelles règles

acpi

sortie sur formulaire

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

vous ne savez pas si le changement de règle rend les choses plus intéressantes, ne pourriez-vous pas vider un texte contenant toutes les chaînes 0 à 100 qui serait une sortie valide? Semble perdre l'intention d'origine si c'est le cas.

Anciennes règles

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

sortie sur formulaire

Remaining battery is 92%

Ne me demandez pas pourquoi le jeu fonctionne comme ça, mais c'est le cas.

algmyr
la source
Sur quoi avez-vous testé cela? Ubuntu ou similaire, je suppose? Cela ne fonctionne pas sur Mac, par exemple.
numbermaniac
Fonctionne sur fedora, mais cela dépend fortement de la syntaxe de la sortie (qu'est-ce que c'est sur mac pour référence? @Numbermaniac)?
Wilf
Je suppose que c'est celui disponible pour la plupart des distributions Linux. Le format de sortie acpi est-il peut-être différent sur mac (l'acpi y est-il même disponible)?
algmyr
@Wilf acpin'est tout simplement pas là sur Mac, semble-t-il.
numbermaniac
Il peut être installé séparément sur certaines distributions Linux, Mac a probablement ses propres pilotes et commandes équivalents intégrés.
Wilf
6

Python 3.6 + psutil, 80 octets

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

Essayez-le en ligne!

Si la machine n'a pas de batterie (comme sur TIO), le programme lancera une erreur, car psutil.sensors_battery()revient None.

Cela nécessite Python 3.6 pour l' interpolation de chaînes .

mbomb007
la source
1
Idk. Il est inclus sur TIO. Je vais inclure un lien vers le module.
mbomb007
J'ai recherché sur Google et trouvé la même bibliothèque, mais ma réponse Python 2 n'était pas aussi intelligente que la vôtre avec une interpolation de chaînes. Note à soi-même: doit entrer dans Python 3.6 et répondre plus rapidement. +1
ElPedro
5

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

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

Abuse l'API win32 en laissant GetSystemPowerStatus()écrire "quelque part" sur la pile, le membre intéressant est dans le troisième octet, selon la SYSTEM_POWER_STATUSstructure .

Malheureusement, cela #includesemble nécessaire, probablement à cause des conventions d'appel.

Exemple de sortie:

> bat.exe
90

S'affiche 255sur les systèmes sans batterie.

Felix Palmen
la source
Que se passe-t-il si vous omettez l'inclusion?
Ruslan
1
@Ruslan l'éditeur de liens ne trouve pas le symbole kernel32.dll. C'est pourquoi je pense que c'est la convention d'appel, les fonctions de l'API win32 n'utilisent pas le "standard" cdecl. Donc, même si je pouvais tromper l'éditeur de liens d'une manière ou d'une autre, le code ne fonctionnerait probablement pas de toute façon.
Felix Palmen
Avez-vous essayé de compiler avec /Gz(par défaut __stdcall)?
Neil
@Neil non, gcc / mingw a-t-il une option similaire ou dois-je utiliser msvc pour cela? Et cela ne briserait-il pas le printf()sans prototype?
Felix Palmen
Désolé, je n'avais pas lu votre en-tête assez attentivement. Je pense que la version mingw est -mrtd, mais je ne sais pas ce qui arriverait printf(); il y a peut-être une inclusion plus courte pour cela?
Neil
4

Excel VBA, 150 octets

Limité aux installations Windows 32 bits du bureau, car l'appel Windows Kernel32 n'est pas sûr pour le pointeur 64 bits.

Sorties dans la cellule A1de l'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 octets grâce à une sortie flexible

-7 octets grâce à @Neil pour avoir utilisé un Int au lieu de 2 octets

Taylor Scott
la source
2
Pas un pointeur 64 bits sûr? Quelle? C'est ridicule, Microsoft.
user253751
@immibis, cela a à voir avec une différence entre les versions - si vous utilisez une installation 64 bits d'Office, l'appel change simplement pour êtreDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott
Ne pouvez-vous pas utiliser un tableau d'octets au lieu d'une structure?
Neil
@Neil - malheureusement non, l'appel Lib assigne f à un pointeur de la _SYSTEM_POWER_STATUSstructure , qui contient à la fois des valeurs d'octet et de dword, ce qui signifie que, dans ce cas, la structure doit être émulée à partir de vba, et un tableau d'octets ne peut pas être utilisé .
Taylor Scott
Si vous ne pouvez pas utiliser un tableau, ne pouvez-vous pas au moins utiliser un type à deux octets comme remplissage au lieu de deux octets simples?
Neil
3

QPython pour Android , 133 octets

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

Écran de code

Écran de sortie

Le +"%"n'est pas strictement nécessaire car il utilise de toute façon le nouveau format de sortie plus flexible, mais il rend la sortie légèrement plus agréable à seulement +4 octets.

Sundar - Rétablir Monica
la source
[ d.notify(créer une alerte de notification) aurait été beaucoup plus court que de créer et d'afficher la boîte de dialogue, mais pour une raison quelconque, cela ne fonctionne pas, du moins sur mon appareil (peut-être, il n'a pas été mis à jour pour les nouvelles API Android).]
Sundar - Rétablir Monica
Cela fonctionne pour 130 octets.
ovs
2

Emacs Lisp, 9 octets

(battery)

Indique l' état actuel de la batterie dans le mini-tampon au fond (ou stdout lors de l' utilisation --batch) en format tels que: Power N/A, battery Unknown (99.1% load, remaining time N/A).

Devrait fonctionner sous Windows, OSX, BSD et Linux.

Winny
la source
1

Japt , 60 octets

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

Essaye-le

Hirsute
la source
1

Java, 546 octets (Windows XP ou supérieur)

L'utilitaire powercfg est entré en jeu pour Windows XP, je n'ai aucune idée des utilitaires disponibles avant cela. Je dois également être exécuté en tant qu'administrateur. C'est horrible et je n'ai pas fait de tentative de golf extrême ...

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

Formaté / commenté ...

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 %.
    }
}

Honnêtement, j'étais plus intéressé à voir si c'était même possible en Java.

Urne de poulpe magique
la source
Devoir appeler une commande externe comme ça, puis lire les résultats de la commande externe à partir d'un fichier ... puis devoir calculer le pourcentage vous-même. Et si bavard. C'est horrible, j'adore ça. Je suis content que les gens essaient ces choses dans des langues mal adaptées, c'est tellement amusant. +1
Jared K
1
@JaredK J'aime Java "jouer au golf", mais seulement sur des questions où les gens pensent, "oh mon dieu non, quel crétin essaierait jamais cela à Java? Cela n'aurait tout simplement pas de sens." Une sorte d'ironie.
Urne de poulpe magique
Parfois, je pense que Java devrait obtenir une version golf comme la façon dont Japt a été conçu pour jouer au Javascript.
Jared K
@JaredK se pencher sur Groovy ou Clojure, pourrait probablement transformer cela en une réponse groovy de 100 octets si j'essayais super dur.
Urne de poulpe magique
@JaredK voici une approximation de cette même réponse dans 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