显示剩余电量百分比


26

显示电池剩余电量,以最大电量的百分比表示

请记住,如果您无法在手机,计算器等上运行代码,则可能至少可以在笔记本电脑上安装环境。如果您绝对不能在装有电池的设备上运行,那么很遗憾,您的语言不符合要求,因为您没有打印有用的价值。

您必须在屏幕上显示结果。从理论上讲,这对于用户检查电池是一种方便的工具。将电池电量百分比写入文件太笨拙,需要用户随后检查文件。因此,在屏幕上显示是规范的一部分,默认IO不能覆盖它。就是说,您可以认为没有什么可以阻止STDOUT之类的东西以通常的方式显示在屏幕上。

如果操作系统已经一直在屏幕上显示电池电量百分比,就像在许多手机上一样,这并不意味着您有一个零字节的解决方案。您必须假定不存在内置显示器,然后在其他位置再次显示电池电量百分比。

编辑:正在打开输出格式。您可以自由显示仅显示百分比的数字,也可以显示带有一些额外输出的数字。

Edit2:代表百分比的数字必须出现在输出中的已知位置,距离输出末端不超过50行,并且该位置在两次调用之间不应更改。代表百分比的数字必须与其他输出分开,每边至少要有一个非数字字符。

供参考的是更改之前的旧输出格式:

Remaining battery is ddd% 要么 Remaining battery is ddd percent


11
这是一个独特的挑战,因为选择的语言在很大程度上取决于环境,而最好的高尔夫将极大地依赖于该环境中提供的api。不确定是好是坏,哈

4
电池百分比定义为什么?我不太熟悉硬件的工作原理,但始终给人一种印象,即就预测的使用而言,电池电量百分比有点过激。
小麦巫师

3
为什么输出格式如此严格?
Okx

1
@WW我想我听说过电话将其显示为“百分比”。当然,他们不应该只是对用户造成误导和屈尊。但是,除了要求人们使用新的硬件级设备驱动程序外,我愿意接受操作系统或系统级API所提供的任何收益。
Jared K

2
@ user202729,electronics.SE的答案是关于内部测量的,但是,暴露给用户的通常是篡改的数字-锂离子电池的电荷越多,其消耗的电量就越快(或者相反),但是该设备(通常)对此进行调整,以显示电池百分比的线性变化,因为这对我们用户而言更可预测。
sundar-恢复莫妮卡

Answers:


43

Bash,70 67 50 46 43 16字节

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

输出: <battery 0-100>: command not found

读取文件/sys/class/power_supply/BAT1/capacity

已在LENOVO ideapad 500上使用Ubuntu 18.04进行了测试。

需要一段时间(因为它搜索整个文件系统)-但是它节省了一个字节!

旧答案:

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

38
需要一段时间(因为它搜索整个文件系统)-但是它节省了一个字节!-这就是您的高尔夫代码!
Stewie Griffin '18年

11
嗯,我不确定是否可以保证没有名为的文件/so/apes/yadayada/Brunch/calamity
暴民埃里克(Erik the Outgolfer)'18年

4
@EriktheOutgolfer我被告知可以重新安装。
Okx

11
@EriktheOutgolfer很高兴早午餐在世界终结之前送达。
mbomb007 '18

1
@algmyr那时我也可以这样做echo {0.100}
Okx

13

JavaScript(浏览器),78 77 50个字节

(-1字节,感谢Benoit Esnard

(-27字节,因为输出格式现在很灵活)

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

JavaScript(浏览器),46字节,通过返回promise

(由Shaggy建议,需要页眉和页脚)

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


注意:仅在> = 38的Google Chrome(台式机和Android)或支持Battery API的任何其他浏览器上工作。出于隐私方面的考虑,FireFox删除了此API。

Android上的示例(旧的输出格式):

在此处输入图片说明

Windows笔记本电脑(旧的输出格式)上的示例:

在此处输入图片说明


您可以使用ES6字符串模板保存一个字节:`Remaining battery is ${b.level*100}%`
Benoit Esnard '18

@Benoit Esnard:好主意!谢谢...
Night2

2
我从未意识到您可以在网页中获得用户的电池电量。我无法想到该功能何时对用户真正有用。
numbermaniac

2
@numbermaniac过去,PoC的特色网站包括基于设备电池电量的低功耗模式。太可惜了,他们没有想到所有这些都可以用来跟踪您而不需要cookie。
亚历克西斯·费克

4
@numbermaniac:一种用法是在用户电池电量不足时自动保存表格。但这可能会有许多误用,这就是FireFox删除它的原因。
2

12

PowerShell,28字节

-26(!)感谢AdmBorkBork。以前的版本-3感谢colsw。

((gwmi win32_battery)|% e*g)

在此处输入图片说明

gwmi 是短的 Get-WmiObject

|%采用模式e*g并找到唯一匹配的属性;estimatedChargeRemaining


1
使用此技巧,您可以打起冗长的属性名称- ((gwmi win32_battery)|% e*g)
AdmBorkBork

@AdmBorkBork再次感谢您。如您所知,我不是Powershell高尔夫球手(甚至不是用户)。只是用了一下谷歌福...
亚当

如果设备有多个电池,则显示类似Remaining battery is 98 96%
Vasily Alexeev '18

@VasilyAlexeev OP听起来像我们可以选择一个适当的设备。
亚当

更改"abc"+(def)+"ghi""abc$(def)ghi"保存更多内容。
colsw

10

Bash + acpi,43个 4字节

新规则

acpi

表格输出

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

不知道规则更改是否会使事情变得更有趣,您是否不能转储包含所有字符串0到100的有效输出的文本?如果这样,似乎会失去最初的意图。

旧规则

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

表格输出

Remaining battery is 92%

不要问我为什么set这样工作,但是确实如此。


您对此做了什么测试?我猜是Ubuntu还是类似的?例如,它在Mac上不起作用。
numbermaniac '18年

在fedora上有效,但是在很大程度上取决于输出的语法(在mac上供参考的是什么?@numbermaniac)?
威尔夫

我认为这是大多数Linux发行版都可以使用的版本。Mac上的acpi输出格式是否可能不同(acpi甚至在那里可用)?
algmyr

似乎@Wilf acpi根本不在Mac上。
numbermaniac

它可以单独安装在某些Linux发行版上,mac可能具有自己的内置等效驱动程序和命令。
威尔夫

6

Python 3.6 + psutil,80字节

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

在线尝试!

如果机器没有电池(例如TIO上的电池),则程序将引发错误,因为psutil.sensors_battery()return None

这需要Python 3.6进行字符串插值


1
Idk。它包含在TIO中。我将包含指向该模块的链接。
mbomb007 '18

我用Google搜索并找到了相同的库,但是我的Python 2答案在字符串插值方面不如您的聪明。自我注意:必须进入Python 3.6并更快地回答。+1
ElPedro

5

C(win32,gcc i686-w64-mingw32),78字节

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

GetSystemPowerStatus()根据SYSTEM_POWER_STATUSstruct,通过在堆栈上写入“ somewhere”来滥用win32 API ,有趣的成员位于第三个字节中。

不幸的是,#include似乎有必要这样做,可能是因为调用约定。

输出示例:

> bat.exe
90

255在没有电池的系统上显示。


如果您忽略包含,会发生什么?
罗斯兰'18

1
链接器未在@Ruslan中找到符号kernel32.dll。这就是为什么我认为这是调用约定的原因,win32 API函数不使用“ standard” cdecl。因此,即使我可以以某种方式欺骗链接器,代码也可能无法正常工作。
菲利克斯·帕尔姆

您是否尝试使用/Gz(默认为__stdcall)进行编译?
尼尔,

@Neil不,gcc / mingw是否具有类似的选项,或者我是否必须使用msvc?printf()没有原型,这不会打破吗?
菲利克斯·帕尔姆

抱歉,我没有足够仔细地阅读您的标题。我认为mingw版本是-mrtd,但是我不知道会发生什么printf(); 也许有一个较短的包含?
尼尔

4

Excel VBA,150字节

限于32位Windows安装的Office,因为Windows Kernel32调用不是64位指针安全的。

输出到A1ActiveSheet上的单元格。

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字节归功于灵活的输出

-7个字节,感谢@Neil使用Int而不是2个字节


2
64位指针不安全吗?什么?微软,这太荒谬了。
user253751 '18

@immibis与版本之间的差异有关-如果您使用的是64位Office安装,则呼叫将更改为Declare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott

不能使用字节数组代替结构吗?
尼尔,

@Neil-不幸的是,不幸的是,Lib调用将f分配给_SYSTEM_POWER_STATUS结构的指针,该指针同时包含字节和dword值,这意味着在这种情况下,必须从vba内部模拟该结构,并且不能使用字节数组。
泰勒·斯科特

如果您不能使用数组,您是否不能至少使用两字节类型而不是两个单字节作为填充?
尼尔,

3

适用于Android的QPython,133个字节

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

代码画面

输出画面

+"%"因为它采用了新的更灵活的输出格式,反正不是绝对必要的,但它仅为+4个字节为使略微更好的输出。


[ d.notify(创建通知警报)比创建和显示对话框要短得多,但由于某种原因,它至少在我的设备上不起作用(可能未针对较新的Android API进行过更新。)
sundar-恢复莫妮卡

适用于130个字节。
ovs '18年

2

Emacs Lisp,9个字节

(battery)

在底部的迷你缓冲区中显示当前电池状态(使用时显示为stdout --batch),格式为:Power N/A, battery Unknown (99.1% load, remaining time N/A)

应该可以在Windows,OSX,BSD和Linux上运行。



1

Java,546字节(Windows XP或更高版本)

powercfg实用程序已在WindowsXP中发挥作用,我不知道在此之前可以使用哪些实用程序。我还必须以管理员身份运行。这真是令人敬畏,我没有做过极端的高尔夫尝试...

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

格式化/已注释...

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

老实说,我更感兴趣的是看看Java是否有可能。


必须调用这样的外部命令,然后从文件中读取外部命令的结果...然后自己计算百分比。如此冗长。我爱它太可怕了。我很高兴人们用不合适的语言尝试这些事情,这很有趣。+1
Jared K

1
@JaredK我喜欢Java的“高尔夫”功能,但是只有在人们认为“噢,天哪,白痴会在Java中尝试这种方式吗?这根本没有道理”的问题上。有点讽刺。
魔术章

有时,我认为Java应该获得类似于Japt的Java高尔夫版本。
贾里德K

@JaredK查看Groovy或Clojure,如果我尝试超级努力的话,可能会将其转换为100字节的Groovy答案。
魔术章鱼缸

@JaredK这是在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}
魔术
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.