Відображення залишку залишку акумулятора


26

Відобразити залишок заряду акумулятора у відсотках від максимального заряду

Пам'ятайте, що якщо ви не можете запустити свій код на телефоні, калькуляторі тощо, ви, ймовірно, можете встановити своє оточення на ноутбук принаймні. Якщо ви абсолютно не можете працювати на пристрої, що має акумулятор, то, на жаль, ваша мова не відповідає, оскільки ви не маєте корисного значення для друку.

Ви повинні відобразити результати на екрані. Це теоретично повинно бути зручною утилітою для користувача, щоб перевірити акумулятор. Запис відсотків акумуляторної батареї у файл занадто незграбний, тому вимагає, щоб користувач перевірив файл. Таким чином, відображення на екрані є частиною специфікації, яку не можна перекрити за замовчуванням IO. Однак, ви можете припустити, що ніщо не заважає звичайним чином відображатись на екрані такі речі, як STDOUT.

Якщо відсоток заряду акумулятора вже постійно відображається на екрані ОС, як на багатьох телефонах, це не означає, що ви отримали нульовий байт. Ви повинні припустити, що вбудованого дисплея не існує, і відобразити відсоток акумулятора знову десь в іншому місці.

Редагувати: відкривається вихідний формат. Ви можете вільно відображати лише цифри відсотків або цифри з додатковим результатом.

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

Для довідки тут - старий вихідний формат до зміни:

Remaining battery is ddd% або Remaining battery is ddd percent


11
Це унікальне завдання, оскільки обрана мова значною мірою залежить від навколишнього середовища, і найкращий гольф буде сильно покладатися на api, представлений у цьому середовищі. Не впевнений, добре це чи погано, га
Poke

4
Що таке відсоток акумулятора? Я не дуже знайомий з тим, як працює апаратне забезпечення, але я завжди мав враження, що відсоток акумуляторних батарей - це якийсь гуеристичний з точки зору передбаченого використання.
Пшеничний майстер

3
Чому формат виводу такий строгий?
Okx

1
@WW Я думаю, що я чув про телефони, які показують це як "відсоток". Вони, звичайно, не повинні це просто вводити в оману та поблажливо до користувача. Але не вимагаючи від людей нового гойдальника апаратного рівня, я готовий прийняти будь-який%, який дає ОС або системний API.
Джаред К

2
@ user202729 Ця відповідь electronics.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`%

38
Займає деякий час (оскільки він шукає всю файлову систему) - але це економить байт! - це код для вас гольф!
Стюі Гріффін

11
Гм, я не впевнений, чи можна гарантувати, що файл не називається /so/apes/yadayada/Brunch/calamity.
Ерік Аутгольфер

4
@EriktheOutgolfer Мені сказали, що я можу припустити нову установку.
Okx

11
@EriktheOutgolfer Я так рада, що Бранч подається до кінця світу.
mbomb007

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 байт, повертаючи обіцянку

(Запропоновано Shaggy , потрібні колонтитул та колонтитул)

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


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

Приклад на Android (старий вихідний формат):

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

Приклад на ноутбуці Windows (старий вихідний формат):

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


Ви можете зберегти один байт за допомогою шаблонів рядків ES6:`Remaining battery is ${b.level*100}%`
Бенуа Еснард

@ Бенуа Еснард: Гарна ідея! Дякую ...
Ніч2

2
Я ніколи не розумів, що ви можете отримати рівень акумулятора користувача на веб-сторінці. Я не можу подумати, коли ця функція буде корисною для користувача, хоча.
numbermaniac

2
@numbermaniac Ще в ті часи PoC демонстрував веб-сайти, які включали режим низької енергії на основі рівня заряду акумулятора пристрою. Шкода, що вони не думали, що все це також може бути використане для відстеження вас без необхідності використання файлів cookie.
Олексій Факс

4
@numbermaniac: Одне із звичаїв - це автоматичне збереження форми, коли акумулятор користувача майже не працює. Але може бути багато зловживань щодо цього, і саме тому FireFox видалив його.
Ніч2

12

PowerShell , 28 байт

-26 (!) Завдяки AdmBorkBork. Попередня версія -3 завдяки colsw.

((gwmi win32_battery)|% e*g)

enter image description here

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

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%

Не запитуйте мене, чому набір працює так, але це так.


На чому ви це тестували? Ubuntu чи подібне я здогадуюсь? Наприклад, це не працює на Mac.
numbermaniac

Працює на Fedora, але це сильно залежить від синтаксису виводу (що це за mac для довідки? @ Numbermaniac)?
Вільф

Я припускаю, що це доступний для більшості дистрибутивів Linux. Чи відрізняється формат виводу acpi на mac (можливо, він доступний навіть там)?
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()повертається None.

Для цього потрібна Python 3.6 для інтерполяції рядків .


1
Idk. Він включений у TIO. Я включу посилання на модуль.
mbomb007

Я заглянув у 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);}

Зловживає API win32, дозволяючи GetSystemPowerStatus()писати "десь" на стеку, цікавий член знаходиться в третьому байті, згідно SYSTEM_POWER_STATUSStru .

На жаль, #includeначебто, це потрібно, мабуть, через прийняття конвенцій.

Приклад виводу:

> bat.exe
90

Відображається 255в системах без акумулятора.


Що станеться, якщо пропустити включення?
Руслан

1
@Ruslan лінкер не знаходить символ у kernel32.dll. Ось чому я вважаю, що це умовна умова виклику, функції Win32 API не використовують "стандарт" cdecl. Тож навіть якби я міг якось обдурити лінкер, код, ймовірно, не працював би.
Фелікс Палмен

Ви намагалися компілювати з /Gz(за замовчуванням __stdcall)?
Ніл

@Neil ні, чи має 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.
користувач253751

@immibis це стосується різниці між версіями - якщо ви використовуєте 64-бітну установку Office, то виклик просто змінюєтьсяDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Тейлор Скотт,

Не можете використовувати байтовий масив замість структури?
Ніл

@Neil - на жаль, ні, виклик Lib призначає f покажчику _SYSTEM_POWER_STATUSструктури , який містить значення байтів і dword, тобто, у цьому випадку структуру потрібно емулювати зсередини vba, і байтовий масив не можна використовувати .
Тейлор Скотт

Якщо ви не можете використовувати масив, чи не можете ви принаймні використовувати двобайтовий тип як підкладку замість двох одиничних байтів?
Ніл

3

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

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

Екран коду

Екран виводу

The +"%" не суворо необхідно, оскільки він у будь-якому разі використовує новіший гнучкіший формат виводу, але це дає дещо приємніший вихід лише у 4 байти.


[ 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.



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 ось приблизний варіант цієї самої відповіді в 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}
Чарівний восьминога Урн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.