Отображение процента оставшегося заряда батареи

26

Отображение оставшегося заряда батареи в процентах от максимального заряда

Помните, что если вы не можете запустить свой код на телефоне, калькуляторе и т. Д., Вы, вероятно, сможете установить свою среду как минимум на ноутбук. Если вы абсолютно не можете работать на устройстве с батареей, то, к сожалению, ваш язык не подходит, так как у вас нет полезного значения для печати.

Вы должны отобразить результаты на экране. Теоретически это удобная утилита для проверки батареи пользователем. Запись процента заряда батареи в файл слишком громоздка, поэтому пользователю необходимо проверить файл. Поэтому отображение на экране является частью спецификации, которая не может быть переопределена по умолчанию IO. Тем не менее, вы можете предположить, что ничто не мешает таким вещам, как STDOUT, отображаться на экране обычным способом.

Если процент заряда батареи уже отображается на экране операционной системой все время, как на многих телефонах, это не означает, что у вас есть решение с нулевым байтом. Вы должны предположить, что встроенный дисплей не существует, и снова отобразить процент заряда батареи где-нибудь еще.

Редактировать: выходной формат открывается. Вы можете отображать только цифры процента или цифры с дополнительным выводом.

Edit2: цифры, представляющие проценты, должны появляться в известном месте на выходе, не более чем на 50 строк от конца вывода, и это расположение не должно меняться между вызовами. Цифры, представляющие проценты, должны быть отделены от других выходных данных хотя бы одним нецифровым символом на каждой стороне.

Для справки вот старый формат вывода до изменения:

Remaining battery is ddd% или Remaining battery is ddd percent

Джаред К
источник
11
Это уникальная задача, потому что выбранный язык во многом зависит от окружающей среды, и лучший гольф будет во многом зависеть от API, представленного в этой среде. Не уверен, хорошо это или плохо, ха
тыкай
4
Какой процент батареи определяется как? Я не очень знаком с тем, как работает аппаратное обеспечение, но у меня всегда было впечатление, что процент заряда батареи был чем-то необычным с точки зрения прогнозируемого использования.
Пшеничный волшебник
3
Почему формат вывода такой строгий?
Okx
1
@WW Я думаю, что слышал о телефонах, отображающих это как «процент». Они не должны, конечно, это просто вводить в заблуждение и снисходить к пользователю. Но если не попросить людей попробовать новый драйвер для аппаратного уровня, я готов принять любой процент, который дает ОС или API системного уровня.
Джаред К
2
@ user202729 Этот электроники.SE ответ о внутреннем измерении, но то, что подвергается пользователю, часто является подделанным числом - литий-ионные батареи разряжаются быстрее, чем больше у них заряда (или это наоборот?), но устройство (обычно) настраивается таким образом, чтобы показывать несколько линейное изменение процента заряда батареи, поскольку это кажется более предсказуемым для нас, пользователей.
sundar - Восстановить Монику

Ответы:

43

Баш, 70 67 50 46 43 16 байт

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

Выходы: <battery 0-100>: command not found

Читает файл /sys/class/power_supply/BAT1/capacity.

Протестировано с использованием Ubuntu 18.04 на LENOVO ideapad 500.

Занимает некоторое время (так как он ищет всю файловую систему) - но сохраняет байт!

Старый ответ:

echo Remaining battery is `</*/*/*/B*/c*y`%
Okx
источник
38
Занимает некоторое время (так как он ищет всю файловую систему) - но сохраняет байт! - это код для вас!
Стьюи Гриффин
11
Хм, я не уверен, можно ли гарантировать, что нет файла с именем /so/apes/yadayada/Brunch/calamity.
Эрик Outgolfer
4
@ EriktheOutgolfer Мне сказали, что я могу взять новую установку.
Okx
11
@EriktheOutgolfer Я так рад, что Бранч подан до того, как наступит конец света.
mbomb007
1
@algmyr В этот момент я тоже могу это сделатьecho {0.100}
Okx
13

JavaScript (браузер), 78 77 50 байт

(-1 байт благодаря Бенуа Эснарду )

(-27 байт, поскольку формат вывода теперь гибкий)

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

JavaScript (браузер), 46 байт, возвращая обещание

(Предложено Shaggy , требуется верхний и нижний колонтитулы)

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


Примечание. Работает только в Google Chrome> = 38 (для ПК и Android) или в любом другом браузере, который поддерживает Battery API . FireFox удалил этот API из-за проблем конфиденциальности.

Пример на Android (старый формат вывода):

введите описание изображения здесь

Пример на ноутбуке с Windows (старый формат вывода):

введите описание изображения здесь

night2
источник
Вы можете сохранить один байт с помощью шаблонов строк ES6:`Remaining battery is ${b.level*100}%`
Бенуа Эснард,
@ Бенуа Эснард: Отличная идея! Спасибо ...
Night2
2
Я никогда не понимал, что вы можете получить уровень заряда батареи пользователя на веб-странице. Хотя я не могу понять, когда эта функция будет полезна для пользователя.
Числовой маньяк
2
@numbermaniac Когда-то в PoC использовались веб-сайты, которые включали режим низкого энергопотребления в зависимости от уровня заряда батареи устройства. Жаль, что они не думали, что все это также может быть использовано для отслеживания вас без необходимости использования файлов cookie.
Алексис Факес
4
@numbermaniac: Одним из способов является автоматическое сохранение формы, когда батарея пользователя разряжена. Но для этого может быть много злоупотреблений, и именно поэтому FireFox удалил его.
Night2
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 (или даже пользователь). Просто использовал немного Google-фу ...
Adám
Если в устройстве более одной батареи, оно отображает что-то вродеRemaining battery is 98 96%
Василий Алексеев,
@VasilyAlexeev OP звучит так, как будто мы можем выбрать подходящее устройство.
Адам
Перейдите "abc"+(def)+"ghi"на, "abc$(def)ghi"чтобы сохранить еще немного.
Colsw
10

Баш + акпи, 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%

Не спрашивайте меня, почему набор работает так, но это так.

algmyr
источник
На чем вы это тестировали? Ubuntu или подобное я угадал? Это не работает на Mac, например.
Числовой маньяк
Работает на Fedora, но это сильно зависит от синтаксиса вывода (что это на Mac для справки? @Numbermaniac)?
Уилф
Я предполагаю, что это доступно для большинства дистрибутивов Linux. Может быть, формат вывода acpi отличается на Mac (возможно, есть ли там acpi)?
algmyr
@ Уилфа acpiпросто нет на Mac, кажется.
Числовой маньяк
Он может быть установлен отдельно на некоторых дистрибутивах Linux, вероятно, Mac имеет свои собственные встроенные эквивалентные драйверы и команды.
Уилф
6

Python 3.6 + psutil, 80 байт

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

Попробуйте онлайн!

Если на машине нет батареи (как на TIO), программа выдаст ошибку, потому что psutil.sensors_battery()возвращается None.

Это требует Python 3.6 для интерполяции строк .

mbomb007
источник
1
ИДК. Это включено в TIO. Я добавлю ссылку на модуль.
mbomb007
Я гуглил и нашел ту же библиотеку, но мой ответ на 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);}

Злоупотребляет API-интерфейсом win32, позволяя GetSystemPowerStatus()писать «где-то» в стеке, интересный член находится в третьем байте, в соответствии со SYSTEM_POWER_STATUSструктурой .

К сожалению, #include кажется, что это необходимо, вероятно, из-за соглашений о вызовах.

Пример вывода:

> bat.exe
90

Отображается 255в системах без батареи.

Феликс Палмен
источник
Что произойдет, если вы пропустите включение?
Руслан
1
@ Руслан компоновщик не находит символ в kernel32.dll. Вот почему я думаю, что это соглашение о вызовах, функции Win32 API не используют «стандарт» cdecl. Так что даже если бы я мог как-то обмануть компоновщик, код, вероятно, не работал бы в любом случае.
Феликс Пальмен
Вы пробовали компилировать с /Gz(по умолчанию __stdcall)?
Нил
@ Нет, нет, у gcc / mingw есть подобная опция или я должен использовать msvc для этого? И разве это не сломало бы printf()без прототипа?
Феликс Пальмен
Извините, я недостаточно внимательно прочитал ваш заголовок. Я думаю, что версия Mingw есть -mrtd, но я не знаю, что будет с printf(); может быть, есть более короткое включение для этого?
Нил
4

Excel VBA, 150 байт

Ограничено 32-битной Windows. Установка офиса, поскольку вызов Windows Kernel32 не является безопасным для 64-битного указателя.

A1Вывод в ячейку на 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 байт благодаря гибкому выводу

-7 байтов благодаря @Neil за использование Int вместо 2 байтов

Тейлор Скотт
источник
2
Не 64-битный указатель безопасно? Какая? Это смешно, Microsoft.
user253751
@immibis это имеет отношение к разнице между версиями - если вы используете 64-битную установку Office, то вызов просто меняется наDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Тейлор Скотт
Разве вы не можете использовать байтовый массив вместо структуры?
Нил
@Neil - к сожалению, нет, вызов Lib присваивает f указатель _SYSTEM_POWER_STATUSструктуры , который содержит значения как байтов, так и значений двойного слова, что означает, что в этом случае структура должна эмулироваться из vba, а байтовый массив не может использоваться ,
Тейлор Скотт
Если вы не можете использовать массив, можете ли вы по крайней мере использовать двухбайтовый тип в качестве заполнения вместо двух отдельных байтов?
Нил
3

QPython для Android , 133 байта

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

Кодовый экран

Экран вывода

+"%"Не является строго необходимым , поскольку он использует более новый более гибкий формат вывод в любом случае, но это делает немного более хороший выход составляет всего +4 байт.

sundar - Восстановить Монику
источник
[ d.notify(создание уведомлений) было бы намного короче, чем создание и отображение диалогового окна, но по какой-то причине оно не работает, по крайней мере, на моем устройстве (возможно, оно не было обновлено для более новых API Android).]
sundar - Восстановить Монику
Это работает для 130 байтов.
овс
2

Emacs Lisp, 9 байт

(battery)

Показывает текущее состояние батареи в мини-буфере внизу (или в стандартный вывод при использовании --batch) в формате, таком как:Power N/A, battery Unknown (99.1% load, remaining time N/A) .

Должен работать на Windows, OSX, BSD и Linux.

Winny
источник
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
Джаред К
1
@JaredK Мне нравится Java "игра в гольф", но только на вопросы, где люди думают: "О, боже, какой придурок когда-нибудь попробует это на Java? Это просто не имеет смысла". Вроде иронично.
Волшебная Осьминог Урна
Иногда я думаю, что Java должна получить версию для гольфа, например, как Japt создан для игры в гольф Javascript.
Джаред К
@JaredK изучит Groovy или Clojure, возможно, превратит это в 100-байтовый отличный ответ, если я попробую супер.
Волшебная Урна Осьминога
@JaredK вот примерный ответ на этот вопрос:{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}
Волшебный осьминог Urn