Wyświetl procent pozostałej baterii


26

Wyświetl pozostały poziom naładowania baterii jako procent maksymalnego naładowania

Pamiętaj, że jeśli nie możesz uruchomić kodu na telefonie, kalkulatorze itp., Prawdopodobnie możesz zainstalować swoje środowisko przynajmniej na laptopie. Jeśli absolutnie nie możesz działać na urządzeniu wyposażonym w baterię, to niestety twój język nie jest odpowiedni, ponieważ nie masz przydatnej wartości do wydrukowania.

Musisz wyświetlić wyniki na ekranie. Teoretycznie ma to być przydatne narzędzie do sprawdzania baterii. Zapisywanie procentu baterii w pliku jest zbyt skomplikowane, co wymaga od użytkownika sprawdzenia pliku. Wyświetlanie na ekranie jest zatem częścią specyfikacji, której nie można zastąpić domyślnie we / wy. To powiedziawszy, możesz założyć, że nic nie stoi na przeszkodzie, aby takie rzeczy jak STDOUT były wyświetlane na ekranie w zwykły sposób.

Jeśli procent baterii jest już wyświetlany na ekranie przez cały czas przez system operacyjny, jak w wielu telefonach, nie oznacza to, że masz rozwiązanie zero-bajtowe. Musisz założyć, że wbudowany wyświetlacz nie istnieje, i ponownie wyświetlić procent baterii w innym miejscu.

Edycja: format wyjściowy jest otwierany. Możesz wyświetlać tylko cyfry procentu lub cyfry z dodatkowymi danymi wyjściowymi.

Edycja2: Cyfry reprezentujące procent muszą pojawiać się w znanym miejscu na wyjściu, nie więcej niż 50 linii od końca wyjścia, i to miejsce nie powinno zmieniać się między wywołaniami. Cyfry reprezentujące procent muszą być oddzielone od innych danych wyjściowych co najmniej jednym niecyfrowym znakiem z każdej strony.

W celach informacyjnych znajduje się stary format wyjściowy sprzed zmiany:

Remaining battery is ddd% lub Remaining battery is ddd percent


11
Jest to wyjątkowe wyzwanie, ponieważ wybrany język zależy w dużej mierze od środowiska, a najlepszy golf będzie polegał w dużej mierze na interfejsach API prezentowanych w tym środowisku. Nie jestem pewien, czy to dobrze, czy źle, ha
Poke

4
Jak zdefiniowano procent baterii? Nie jestem do końca zaznajomiony z tym, jak działa sprzęt, ale zawsze miałem wrażenie, że procent baterii był pewnego rodzaju hueristyczny pod względem przewidywanego użycia.
Wheat Wizard

3
Dlaczego format wyjściowy jest tak ścisły?
Okx,

1
@WW Myślę, że słyszałem o telefonach wyświetlających to jako „procent”. Nie powinny one oczywiście wprowadzać użytkownika w błąd i protekcjonalne. Ale nie pytając ludzi o grę w nowy sterownik urządzenia na poziomie sprzętowym, jestem gotów zaakceptować każdy procent, jaki daje system operacyjny lub interfejs API na poziomie systemu.
Jared K

2
@ user202729 Ta odpowiedź na elektronikę.SE dotyczy pomiaru wewnętrznego, ale to, co jest narażone na działanie użytkownika, to często udokumentowana liczba - akumulatory litowo-jonowe rozładowują się szybciej, im więcej mają ładunków (czy jest na odwrót?), ale urządzenie (zwykle) dostosowuje się do tego, aby pokazać nieco liniową zmianę procentu baterii, ponieważ jest to bardziej przewidywalne dla nas użytkowników.
sundar - Przywróć Monikę

Odpowiedzi:


43

Bash, 70 67 50 46 43 16 bajtów

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

Wyjścia: <battery 0-100>: command not found

Czyta plik /sys/class/power_supply/BAT1/capacity.

Testowane przy użyciu Ubuntu 18.04 na LENOVO ideapad 500.

Zajmuje trochę czasu (ponieważ przeszukuje cały system plików) - ale oszczędza bajt!

Stara odpowiedź:

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

38
Zajmuje trochę czasu (ponieważ przeszukuje cały system plików) - ale oszczędza bajt! - to dla ciebie kod golfowy!
Stewie Griffin

11
Hm, nie jestem pewien, czy można zagwarantować, że nie ma pliku o nazwie /so/apes/yadayada/Brunch/calamity.
Erik the Outgolfer

4
@EriktheOutgolfer Powiedziano mi, że mogę założyć nową instalację.
Okx,

11
@EriktheOutgolfer Cieszę się, że Brunch jest serwowany przed końcem świata.
mbomb007

1
@algmyr W tym momencie równie dobrze mogę zrobićecho {0.100}
Okx

13

JavaScript (przeglądarka), 78 77 50 bajtów

(-1 bajt dzięki Benoit Esnard )

(-27 bajtów, ponieważ format wyjściowy jest teraz elastyczny)

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

JavaScript (przeglądarka), 46 bajtów, zwracając obietnicę

(Sugerowane przez Shaggy , wymaga nagłówka i stopki)

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


Uwaga: działa tylko w przeglądarce Google Chrome> = 38 (komputer i Android) lub dowolnej innej przeglądarce obsługującej interfejs API baterii . FireFox usunął ten interfejs API z powodu obaw o prywatność.

Przykład na Androida (stary format wyjściowy):

wprowadź opis zdjęcia tutaj

Przykład na laptopie z systemem Windows (stary format wyjściowy):

wprowadź opis zdjęcia tutaj


Możesz zapisać jeden bajt, korzystając z szablonów ciągów ES6:`Remaining battery is ${b.level*100}%`
Benoit Esnard,

@Benoit Esnard: Fajny pomysł! Dzięki ...
Noc 2

2
Nigdy nie zdawałem sobie sprawy, że możesz uzyskać poziom naładowania baterii użytkownika na stronie internetowej. Nie mogę jednak wymyślić, kiedy ta funkcja byłaby przydatna dla użytkownika.
numbermaniac

2
@numbermaniac W tamtych czasach PoC przedstawiało strony internetowe, które zawierały tryb niskiego zużycia energii oparty na poziomie naładowania baterii urządzenia. Szkoda, że ​​nie sądzili, że wszystko to można również wykorzystać do śledzenia Cię bez potrzeby plików cookie.
Alexis Facques

4
@numbermaniac: Jednym z zastosowań jest automatyczne zapisywanie formularza, gdy bateria użytkownika jest rozładowana. Ale może być wiele nadużyć i dlatego FireFox go usunął.
Night2

12

PowerShell , 28 bajtów

-26 (!) Dzięki AdmBorkBork. Poprzednia wersja -3 dzięki colsw.

((gwmi win32_battery)|% e*g)

wprowadź opis zdjęcia tutaj

gwmi jest skrótem od Get-WmiObject

|%pobiera wzorzec e*gi znajduje jedyną pasującą właściwość;estimatedChargeRemaining


1
Korzystając z tej wskazówki , możesz zagrać w długą nazwę właściwości - ((gwmi win32_battery)|% e*g).
AdmBorkBork

@AdmBorkBork Jeszcze raz dziękuję. Jak widać, nie jestem golfistą Powershell (ani nawet użytkownikiem). Właśnie użyłem trochę Google-fu…
Adám

Jeśli urządzenie ma więcej niż jedną baterię, wyświetla coś w styluRemaining battery is 98 96%
Vasily Alexeev

@VasilyAlexeev OP brzmi, jakbyśmy mogli wybrać odpowiednie urządzenie.
Adám

Zmień, "abc"+(def)+"ghi"aby "abc$(def)ghi"zaoszczędzić trochę więcej.
colsw

10

Bash + acpi, 43 4 bajty

Nowe zasady

acpi

dane wyjściowe w formularzu

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

nie jestem pewien, czy zmiana reguły sprawia, że ​​rzeczy są bardziej interesujące, czy nie można zrzucić żadnego tekstu zawierającego wszystkie ciągi od 0 do 100, które byłyby prawidłowymi danymi wyjściowymi? Jeśli tak, wydaje się, że straci pierwotny zamiar.

Stare zasady

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

dane wyjściowe w formularzu

Remaining battery is 92%

Nie pytaj mnie, dlaczego zestaw tak działa, ale działa.


Na czym to przetestowałeś? Ubuntu lub podobny zgaduję? Na przykład nie działa na komputerze Mac.
numbermaniac

Działa na Fedorze, ale zależy w dużej mierze od składni wyniku (co to jest na Macu w celach informacyjnych? @Numbermaniac)?
Wilf

Zakładam, że jest dostępny dla większości dystrybucji Linuksa. Czy format wyjściowy acpi może być inny na Macu (czy acpi jest tam nawet dostępny)?
algmyr

@ Wilf acpipo prostu nie ma na komputerze Mac.
numbermaniac

Może być zainstalowany osobno na niektórych dystrybucjach Linuksa, Mac prawdopodobnie ma własne wbudowane równoważne sterowniki i polecenia.
Wilf

6

Python 3.6 + psutil, 80 bajtów

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

Wypróbuj online!

Jeśli urządzenie nie ma baterii (jak w TIO), program zgłosi błąd, ponieważ psutil.sensors_battery()powraca None.

Wymaga to Pythona 3.6 do interpolacji ciągów .


1
Idk. Jest zawarty w TIO. Dołączę link do modułu.
mbomb007

Poszukałem Google'a i znalazłem tę samą bibliotekę, ale moja odpowiedź w języku Python 2 nie była tak inteligentna jak twoja z interpolacją ciągów. Uwaga do siebie: musi dostać się do Pythona 3.6 i odpowiedzieć szybciej. +1
ElPedro

5

C (win32, gcc i686-w64-mingw32), 78 bajtów

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

Nadużywa API win32, pozwalając GetSystemPowerStatus()pisać „gdzieś” na stosie, interesujący element znajduje się w trzecim bajcie, zgodnie z SYSTEM_POWER_STATUSstruct .

Niestety #includewydaje się to być potrzebne, prawdopodobnie z powodu zwoływania konwencji.

Przykładowe dane wyjściowe:

> bat.exe
90

Wyświetla się 255w systemach bez baterii.


Co się stanie, jeśli pominiesz dołączenie?
Ruslan

1
@ Ruslan linker nie znajduje symbolu kernel32.dll. Dlatego myślę, że to konwencja wywoływania, funkcje API win32 nie używają „standardu” cdecl. Więc nawet gdybym mógł jakoś oszukać linker, kod prawdopodobnie i tak by nie działał.
Felix Palmen

Czy próbowałeś skompilować /Gz(domyślnie __stdcall)?
Neil,

@Neil nie, czy gcc / mingw ma podobną opcję, czy muszę do tego użyć msvc? I czy to nie złamie printf()bez prototypu?
Felix Palmen,

Przepraszam, nie przeczytałem twojego nagłówka wystarczająco uważnie. Myślę, że ta wersja jest -mrtd, ale nie wiem, co by się stało printf(); może jest do tego krótsza wersja?
Neil,

4

Excel VBA, 150 bajtów

Ograniczony do 32-bitowych instalacji systemu Windows w biurze, ponieważ wywołanie jądra systemu Windows nie jest bezpieczne dla 64-bitowego wskaźnika.

Dane wyjściowe do komórki A1w arkuszu 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 bajtów dzięki elastycznej wydajności

-7 bajtów dzięki @Neil za użycie Int zamiast 2 bajtów


2
Czy wskaźnik 64-bitowy nie jest bezpieczny? Co? To niedorzeczne, Microsoft.
user253751,

@immibis ma to związek z różnicą między wersjami - jeśli używasz 64-bitowej instalacji pakietu Office, wówczas połączenie zmienia się naDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott

Czy nie możesz użyć tablicy bajtów zamiast struktury?
Neil,

@Neil - niestety nie, wywołanie Lib przypisuje f do wskaźnika _SYSTEM_POWER_STATUSstruktury , który przechowuje zarówno wartości bajtów, jak i dwordów, co oznacza, że ​​w tym przypadku struktura musi być emulowana z poziomu vba i nie można użyć tablicy bajtów .
Taylor Scott,

Jeśli nie możesz użyć tablicy, to czy nie możesz użyć przynajmniej dwóch bajtów jako wypełnienia zamiast dwóch pojedynczych bajtów?
Neil,

3

QPython dla Androida , 133 bajty

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

Ekran kodu

Ekran wyjściowy

Nie +"%"jest to absolutnie konieczne, ponieważ i tak używa nowszego, bardziej elastycznego formatu wyjściowego, ale zapewnia nieco ładniejszy wynik przy zaledwie +4 bajtach.


[ d.notify(Utwórz powiadomienie o powiadomieniu) byłoby znacznie krótsze niż tworzenie i wyświetlanie okna dialogowego, ale z jakiegoś powodu nie działa, przynajmniej na moim urządzeniu (być może nie zostało zaktualizowane dla nowszych interfejsów API Androida).]
sundar - Przywróć Monikę

To działa na 130 bajtów.
ovs

2

Emacs Lisp, 9 bajtów

(battery)

Pokazuje aktualny stan baterii w mini-buffer na dole (lub na stdout przy użyciu --batch) w formacie takim jak: Power N/A, battery Unknown (99.1% load, remaining time N/A).

Powinien działać w systemach Windows, OSX, BSD i Linux.



1

Java, 546 bajtów (Windows XP lub wyższy)

Narzędzie powercfg weszło w grę dla WindowsXP, nie mam pojęcia, jakie narzędzia były wcześniej dostępne. Muszę też być administratorem. To jest okropne i nie podjąłem ekstremalnej próby golfa ...

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

Sformatowane / skomentowane ...

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

Szczerze mówiąc, bardziej interesowało mnie, czy jest to możliwe w Javie.


Konieczność wywołania takiego polecenia zewnętrznego, a następnie odczytania wyników polecenia zewnętrznego z pliku ... a następnie samodzielnego obliczenia procentu. I tak gadatliwy. To okropne, że to kocham. Cieszę się, że ludzie próbują tych rzeczy w nieodpowiednich językach, jest to tak zabawne. +1
Jared K

1
@JaredK Lubię grę w golfa w Javie, ale tylko na pytania, w których ludzie myślą: „O Boże, jaki kretyn kiedykolwiek spróbowałby tego w Javie? To po prostu nie miałoby sensu”. Coś ironicznego.
Magic Octopus Urn

Czasami myślę, że Java powinna otrzymać wersję do gry w golfa, taką jak Japt został stworzony do gry w Javascript.
Jared K

@JaredK zajrzyj do Groovy lub Clojure, prawdopodobnie mógłbym zamienić to w 100-bajtową groovy odpowiedź, gdybym bardzo się starał.
Magic Octopus Urn

@JaredK oto przybliżenie tej samej odpowiedzi w 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.