แสดงเปอร์เซ็นต์แบตเตอรี่ที่เหลืออยู่


26

แสดงประจุแบตเตอรี่ที่เหลืออยู่เป็นเปอร์เซ็นต์ของการชาร์จสูงสุด

จำไว้ว่าถ้าคุณไม่สามารถเรียกใช้รหัสของคุณบนโทรศัพท์เครื่องคิดเลข ฯลฯ คุณอาจติดตั้งสภาพแวดล้อมของคุณบนแล็ปท็อปอย่างน้อย หากคุณไม่สามารถทำงานบนอุปกรณ์ที่มีแบตเตอรีได้อย่างน่าเสียดายภาษาของคุณจะไม่มีสิทธิ์เนื่องจากคุณไม่มีคุณค่าในการพิมพ์

คุณต้องแสดงผลลัพธ์บนหน้าจอ ในทางทฤษฎีแล้วมันควรจะเป็นเครื่องมือที่มีประโยชน์สำหรับผู้ใช้ในการตรวจสอบแบตเตอรี่ เปอร์เซ็นต์การเขียนแบตเตอรีลงในไฟล์เป็น clunky เกินไปทำให้ผู้ใช้ต้องตรวจสอบไฟล์ การแสดงบนหน้าจอเป็นส่วนหนึ่งของข้อกำหนดที่ไม่สามารถแทนที่ได้โดยค่าเริ่มต้น IO ที่กล่าวมาคุณสามารถสมมติว่าไม่มีสิ่งใดที่ทำให้ STDOUT ไม่สามารถแสดงบนหน้าจอได้ตามปกติ

หากเปอร์เซ็นต์แบตเตอรี่จะแสดงบนหน้าจอตลอดเวลาโดยระบบปฏิบัติการเช่นบนโทรศัพท์หลายเครื่องนั่นไม่ได้หมายความว่าคุณจะมีวิธีแก้ปัญหาแบบศูนย์ไบต์ คุณต้องสมมติว่าไม่มีจอแสดงผลในตัวและแสดงเปอร์เซ็นต์แบตเตอรี่อีกครั้ง

แก้ไข: กำลังเปิดรูปแบบเอาต์พุต คุณมีอิสระที่จะแสดงเพียงแค่ตัวเลขของเปอร์เซ็นต์หรือตัวเลขที่มีเอาต์พุตพิเศษบางส่วนเช่นกัน

แก้ไข 2: ตัวเลขที่แสดงถึงเปอร์เซ็นต์จะต้องปรากฏในตำแหน่งที่ทราบภายในเอาต์พุตไม่เกิน 50 บรรทัดจากจุดสิ้นสุดของเอาต์พุตและตำแหน่งนั้นไม่ควรเปลี่ยนระหว่างการเรียกใช้ ตัวเลขที่แสดงถึงเปอร์เซ็นต์จะต้องแยกออกจากเอาต์พุตอื่นอย่างน้อยหนึ่งตัวที่ไม่ใช่ตัวเลขในแต่ละด้าน

สำหรับการอ้างอิงนี่คือรูปแบบผลลัพธ์เก่าจากก่อนการเปลี่ยนแปลง:

Remaining battery is ddd% หรือ Remaining battery is ddd percent


11
นี่เป็นความท้าทายที่ไม่เหมือนใครเพราะภาษาที่เลือกขึ้นอยู่กับสภาพแวดล้อมส่วนใหญ่และสนามกอล์ฟที่ดีที่สุดจะต้องพึ่งพา API ที่นำเสนอในสภาพแวดล้อมนั้นเป็นอย่างมาก ไม่แน่ใจว่าดีหรือไม่ดีฮา
โผล่

4
เปอร์เซ็นต์ของแบตเตอรี่หมายถึงอะไร? ฉันไม่คุ้นเคยกับวิธีการทำงานของฮาร์ดแวร์ แต่ฉันมักจะรู้สึกว่าเปอร์เซ็นต์ของแบตเตอรี่เป็นสิ่งที่น่าสงสัยในแง่ของการใช้งานที่คาดการณ์ไว้
ข้าวสาลี Wizard

3
เหตุใดรูปแบบผลลัพธ์จึงเข้มงวดมาก
Okx

1
@WW ฉันคิดว่าฉันได้ยินเสียงโทรศัพท์แสดงเป็น 'เปอร์เซ็นต์' แน่นอนว่าพวกเขาไม่ควรทำเช่นนั้นเป็นเพียงการเข้าใจผิดและการยอมรับผู้ใช้ แต่ขาดการขอให้ผู้คนขับอุปกรณ์ฮาร์ดแวร์ระดับใหม่ฉันยินดีที่จะยอมรับ% ใดก็ตามที่ OS หรือ API ระดับระบบให้
Jared K

2
@ user202729 คำตอบของอุปกรณ์อิเล็กทรอนิกส์นั้นคำตอบเกี่ยวกับการวัดภายใน แต่สิ่งที่ผู้ใช้สัมผัสมักเป็นตัวเลขที่แพทย์ - แบตเตอรี่ Li-ion จะระบายเร็วกว่ายิ่งมีประจุมากขึ้น (หรือเป็นวิธีอื่น ๆ ) แต่อุปกรณ์ (โดยปกติ) ปรับเพื่อแสดงการเปลี่ยนแปลงเชิงเส้นของเปอร์เซ็นต์แบตเตอรี่เนื่องจากผู้ใช้รู้สึกว่าเราคาดเดาได้มากขึ้น
sundar - Reinstate Monica

คำตอบ:


43

Bash, 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
ใช้เวลาสักครู่ (เพราะมันค้นหาทั้งระบบไฟล์) - แต่มันจะบันทึกไบต์! - นั่นคือรหัสกอล์ฟสำหรับคุณ!
Stewie Griffin

11
/so/apes/yadayada/Brunch/calamityหืมมมผมไม่แน่ใจว่าถ้ามันสามารถรับประกันได้ว่าจะไม่มีไฟล์ที่เรียกว่า
Erik the Outgolfer

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}%`
เบอนัวต์เอสนาร์ด

@Benoit Esnard: เป็นความคิดที่ดี! ขอบคุณ ...
Night2

2
ฉันไม่เคยรู้เลยว่าคุณจะได้รับระดับแบตเตอรี่ของผู้ใช้ในหน้าเว็บ ฉันคิดไม่ออกเลยว่าฟีเจอร์นั้นจะมีประโยชน์กับผู้ใช้จริงหรือไม่
numbermaniac

2
@numbermaniac ย้อนกลับไปในวันนี้ PoC มีเว็บไซต์ที่รวมโหมดประหยัดพลังงานตามระดับแบตเตอรี่ของอุปกรณ์ น่าเสียดายที่พวกเขาไม่คิดว่าทั้งหมดนี้สามารถใช้เพื่อติดตามคุณโดยไม่จำเป็นต้องใช้คุกกี้
Alexis Facques

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-Fu ...
อดัม

หากอุปกรณ์มีแบตเตอรี่มากกว่าหนึ่งก้อนแสดงว่าเป็นอย่างไรRemaining battery is 98 96%
Vasily Alexeev

@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%

อย่าถามฉันว่าทำไมชุดทำงานเช่นนี้ แต่ทำ


คุณทดสอบสิ่งนี้กับอะไร อูบุนตูหรือคล้ายกันฉันคาดเดา มันไม่ทำงานบน Mac ตัวอย่างเช่น
numbermaniac

ใช้งานได้กับ fedora แต่ขึ้นอยู่กับไวยากรณ์ของเอาต์พุตเป็นอย่างมาก (มันคืออะไรบน mac สำหรับการอ้างอิง? @numbermaniac)?
Wilf

ฉันคิดว่ามันใช้ได้สำหรับ Linux distros ส่วนใหญ่ รูปแบบเอาต์พุต acpi อาจแตกต่างกันใน mac (อาจมี acpi ให้ใช้งานด้วย)
algmyr

@ Wilf acpiไม่ได้มีใน Mac ที่ดูเหมือนว่า
numbermaniac

มันสามารถที่จะติดตั้งแยกต่างหากบนลินุกซ์ distros บางเครื่องแม็คน่าจะมีไดรเวอร์และคำสั่งในตัว
วิลฟ์

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

ฉัน Googled และพบห้องสมุดเดียวกัน แต่คำตอบ 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);}

ละเมิดสิทธิมนุษยชน win32 API โดยให้GetSystemPowerStatus()เขียน "บาง" ในกองสมาชิกที่น่าสนใจคือในไบต์ที่สามตามที่structSYSTEM_POWER_STATUS

น่าเสียดายที่#includeดูเหมือนจะมีความจำเป็นอาจเป็นเพราะการเรียกประชุม

ตัวอย่างผลลัพธ์:

> bat.exe
90

แสดง255บนระบบที่ไม่มีแบตเตอรี่


จะเกิดอะไรขึ้นถ้าคุณไม่ใส่รวม
Ruslan

1
@Ruslan kernel32.dllลิงเกอร์ไม่พบสัญลักษณ์ใน นั่นเป็นเหตุผลที่ผมคิดว่ามันเป็นเรื่องการประชุมเรียกฟังก์ชั่น Win32 API ไม่ได้ใช้ cdecl"มาตรฐาน" ดังนั้นแม้ว่าฉันจะหลอก linker อย่างใดรหัสอาจไม่ทำงานเลย
เฟลิกซ์ Palmen

คุณลองรวบรวมด้วย/Gz(ค่าเริ่มต้นเป็น__stdcall)
Neil

@ ไม่มีเลย gcc / mingw มีตัวเลือกที่คล้ายกันหรือฉันต้องใช้ msvc สำหรับสิ่งนั้นหรือไม่? และนั่นจะไม่ทำลายprintf()ต้นแบบที่ไม่มีเหรอ?
เฟลิกซ์ Palmen

ขออภัยฉันอ่านส่วนหัวของคุณไม่ดีพอ ผมคิดว่ารุ่น MinGW เป็น-mrtdแต่ผมไม่ทราบว่าสิ่งที่จะเกิดขึ้นกับprintf(); อาจจะมีขนาดสั้นลงสำหรับมันหรือไม่
Neil

4

Excel VBA 150 ไบต์

จำกัด การติดตั้งที่สำนักงาน Windows 32 บิตเนื่องจากการเรียกใช้ 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 ทำอะไรกับความแตกต่างระหว่างรุ่น - ถ้าคุณใช้การติดตั้ง Office แบบ 64 บิตแล้วการโทรก็เปลี่ยนเป็นDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott

คุณไม่สามารถใช้อาร์เรย์ไบต์แทนโครงสร้างได้หรือไม่?
Neil

@Neil - โชคไม่ดีที่การโทร Lib จะกำหนด f ให้กับตัวชี้ของ_SYSTEM_POWER_STATUSโครงสร้างซึ่งเก็บทั้งค่า byte และ dword ซึ่งหมายความว่าในกรณีนี้โครงสร้างต้องถูกจำลองจากภายใน vba และอาร์เรย์ไบต์ไม่สามารถใช้ได้ .
Taylor Scott

หากคุณไม่สามารถใช้อาร์เรย์ได้อย่างน้อยคุณจะไม่สามารถใช้ชนิดสองไบต์เป็นช่องว่างภายในของคุณแทนที่จะเป็นสองไบต์เดียวได้หรือไม่
Neil

3

QPython สำหรับ Androidขนาด 133 ไบต์

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

หน้าจอรหัส

หน้าจอแสดงผล

+"%"ไม่จำเป็นอย่างเคร่งครัดเพราะใช้รูปแบบการออกความยืดหยุ่นมากขึ้นใหม่อยู่แล้ว แต่ก็จะทำให้ดีกว่าสำหรับการส่งออกเล็กน้อยเพียง 4 ไบต์


[ d.notify(สร้างการแจ้งเตือนการแจ้งเตือน) จะได้รับมากน้อยกว่าการสร้างและแสดงโต้ตอบ แต่ด้วยเหตุผลบางอย่างมันไม่ได้ทำงานอย่างน้อยบนอุปกรณ์ของฉัน (อาจก็ยังไม่ได้รับการปรับปรุงสำหรับ API รุ่นใหม่ Android).]
sundar - Reinstate Monica

ใช้งานได้ 130 ไบต์
ovs

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


ต้องเรียกคำสั่งภายนอกแบบนั้นแล้วอ่านผลลัพธ์ของคำสั่งภายนอกจากไฟล์ ... จากนั้นต้องคำนวณเปอร์เซ็นต์ด้วยตัวคุณเอง และ verbose ดังนั้น มันน่ากลัวฉันรักมัน ฉันดีใจที่ผู้คนลองใช้สิ่งเหล่านี้ในภาษาที่ไม่เหมาะสมมันสนุกมาก +1
Jared K

1
@ JaredK ฉันสนุกกับ Java "การเล่นกอล์ฟ" แต่เฉพาะคำถามที่ผู้คนคิดว่า "โอ้พระเจ้าไม่สิ่งที่คนโง่จะเคยลองใน Java? มันไม่สมเหตุสมผล" เรียงจากแดกดัน
Magic Octopus Urn

บางครั้งฉันคิดว่า Java ควรจะได้รับรุ่นกอล์ฟเช่น Japt ถูกสร้างขึ้นมาเพื่อการเล่น Javascript
Jared K

@ JaredK มองเข้าไปใน Groovy หรือ Clojure อาจทำให้สิ่งนี้กลายเป็นคำตอบที่แรง 100 ไบต์ถ้าฉันพยายามอย่างหนักเป็นพิเศษ
Magic Octopus Urn

@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}
Magic Octopus Urn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.