Hiển thị phần trăm pin còn lại


26

Hiển thị mức sạc pin còn lại, tính theo phần trăm mức sạc tối đa

Hãy nhớ rằng nếu bạn không thể chạy mã của mình trên điện thoại, máy tính, v.v., bạn có thể ít nhất có thể cài đặt môi trường của mình trên máy tính xách tay. Nếu bạn hoàn toàn không thể chạy trên thiết bị có pin, thì thật không may, ngôn ngữ của bạn không đủ điều kiện vì bạn không có giá trị hữu ích để in.

Bạn phải hiển thị kết quả trên màn hình. Đây là lý thuyết được cho là một tiện ích tiện dụng cho người dùng kiểm tra pin. Việc ghi phần trăm pin vào một tệp quá khó, đòi hỏi người dùng phải kiểm tra tệp. Do đó, hiển thị trên màn hình là một phần của thông số kỹ thuật không thể bị ghi đè bởi IO mặc định. Điều đó nói rằng, bạn có thể cho rằng không có gì ngăn cản những thứ như STDOUT hiển thị trên màn hình theo cách thông thường.

Nếu phần trăm pin đã được HĐH hiển thị trên màn hình mọi lúc, như trên nhiều điện thoại, điều đó không có nghĩa là bạn đã có giải pháp không byte. Bạn phải cho rằng màn hình tích hợp không tồn tại và hiển thị lại phần trăm pin ở một nơi khác.

Chỉnh sửa: Định dạng đầu ra đang được mở ra. Bạn có thể tự do hiển thị chỉ là các chữ số của phần trăm hoặc các chữ số có đầu ra thêm.

Chỉnh sửa2: Các chữ số biểu thị phần trăm phải xuất hiện ở một vị trí đã biết trong đầu ra, không quá 50 dòng từ cuối đầu ra và vị trí đó không nên thay đổi giữa các lần gọi. Các chữ số đại diện cho phần trăm phải được tách biệt với đầu ra khác bằng ít nhất một ký tự không phải chữ số ở mỗi bên.

Để tham khảo ở đây là định dạng đầu ra cũ từ trước khi thay đổi:

Remaining battery is ddd% hoặc là Remaining battery is ddd percent


11
Đây là một thách thức độc đáo bởi vì ngôn ngữ được lựa chọn phụ thuộc phần lớn vào môi trường và môn golf tốt nhất sẽ phụ thuộc rất nhiều vào api được trình bày trong môi trường đó. Không chắc là tốt hay xấu, ha
Chọc

4
Phần trăm pin được định nghĩa là gì? Tôi không thực sự quen thuộc với cách thức hoạt động của phần cứng nhưng tôi luôn có ấn tượng rằng tỷ lệ phần trăm pin là một loại công cụ chuyên sâu về mặt sử dụng được dự đoán.
Phù thủy lúa mì

3
Tại sao định dạng đầu ra rất nghiêm ngặt?
Okx

1
@WW Tôi nghĩ rằng tôi đã nghe nói về điện thoại hiển thị đó là 'phần trăm'. Tất nhiên, họ không nên chỉ gây hiểu lầm và hạ thấp người dùng. Nhưng không yêu cầu mọi người chơi golf một trình điều khiển thiết bị cấp phần cứng mới, tôi sẵn sàng chấp nhận bất kỳ% nào mà API cấp hệ điều hành hoặc hệ thống đưa ra.
Jared K

2
@ user202729 Đó là thiết bị điện tử. Câu trả lời của E là về phép đo bên trong, nhưng những gì tiếp xúc với người dùng thường là một số được chứng minh - Pin Li-ion tiêu hao nhanh hơn khi họ sạc nhiều hơn (hoặc là cách khác?), nhưng thiết bị (thường) điều chỉnh cho điều đó để hiển thị một phần thay đổi tuyến tính về tỷ lệ phần trăm pin do người dùng chúng tôi cảm thấy dễ dự đoán hơn.
- Phục hồi Monica

Câu trả lời:


43

Bash, 70 67 50 46 43 16 byte

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

Đầu ra: <battery 0-100>: command not found

Đọc tập tin /sys/class/power_supply/BAT1/capacity.

Đã thử nghiệm bằng Ubuntu 18.04 trên ideapad 500 LENOVO.

Mất một lúc (vì nó tìm kiếm toàn bộ hệ thống tập tin) - nhưng nó tiết kiệm được một byte!

Câu trả lời cũ:

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

38
Mất một lúc (vì nó tìm kiếm toàn bộ hệ thống tập tin) - nhưng nó tiết kiệm được một byte! - đó là mã golf cho bạn!
Stewie Griffin

11
Hừm, tôi không chắc có thể đảm bảo rằng không có tệp nào được gọi hay không /so/apes/yadayada/Brunch/calamity.
Erik the Outgolfer 31/07/18

4
@EriktheOutgolfer Tôi đã nói rằng tôi có thể giả sử cài đặt mới.
Okx

11
@EriktheOutgolfer Tôi rất vui khi Brunch được phục vụ trước khi thế giới kết thúc.
mbomb007

1
@ achmyr Vào thời điểm đó tôi cũng có thể làm như vậyecho {0.100}
Okx

13

JavaScript (trình duyệt), 78 77 50 byte

(-1 byte nhờ Benoit Esnard )

(-27 byte kể từ khi định dạng đầu ra linh hoạt)

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

JavaScript (trình duyệt), 46 byte, bằng cách trả lại một lời hứa

(Được đề xuất bởi Shaggy , yêu cầu một tiêu đề và chân trang)

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


Lưu ý: Chỉ hoạt động trên Google Chrome> = 38 (máy tính để bàn và Android) hoặc bất kỳ trình duyệt nào khác hỗ trợ API Pin . FireFox đã xóa API này do những lo ngại về quyền riêng tư.

Ví dụ trên Android (định dạng đầu ra cũ):

nhập mô tả hình ảnh ở đây

Ví dụ trên máy tính xách tay Windows (định dạng đầu ra cũ):

nhập mô tả hình ảnh ở đây


Bạn có thể lưu một byte bằng cách sử dụng các mẫu chuỗi ES6:`Remaining battery is ${b.level*100}%`
Benoit Esnard

@Benoit Esnard: Ý kiến ​​hay đấy! Cảm ơn ...
Đêm2

2
Tôi không bao giờ nhận ra bạn có thể nhận được mức pin của người dùng trong một trang web. Tôi không thể nghĩ đến khi nào tính năng đó thực sự hữu ích cho người dùng.
numbermaniac

2
@numbermaniac Trước đây, PoC có các trang web bao gồm chế độ năng lượng thấp dựa trên mức pin của thiết bị. Quá tệ, họ không nghĩ rằng tất cả những thứ này cũng có thể được sử dụng để theo dõi bạn mà không cần cookie.
Alexis Facques

4
@numbermaniac: Một trong những cách sử dụng là tự động lưu biểu mẫu khi pin của người dùng yếu. Nhưng có thể có nhiều lạm dụng cho nó và đó là lý do tại sao FireFox đã loại bỏ nó.
Đêm2

12

PowerShell , 28 byte

-26 (!) Cảm ơn admBorkBork. Phiên bản trước -3 nhờ colsw.

((gwmi win32_battery)|% e*g)

nhập mô tả hình ảnh ở đây

gwmi là viết tắt của Get-WmiObject

|%lấy mẫu e*gvà tìm thuộc tính duy nhất phù hợp;estimatedChargeRemaining


1
Sử dụng mẹo này , bạn có thể đánh xuống tên thuộc tính dài - ((gwmi win32_battery)|% e*g).
admBorkBork

@AdmBorkBork Cảm ơn bạn một lần nữa. Như bạn có thể nói, tôi không phải là người chơi gôn Powershell (hoặc thậm chí là người dùng). Chỉ cần sử dụng một chút Google-fu từ
Adám

Nếu thiết bị có nhiều pin, nó sẽ hiển thị giống nhưRemaining battery is 98 96%
Vasily Alexeev

@VasilyAlexeev OP có vẻ như chúng ta có thể chọn một thiết bị phù hợp.
Adám

Thay đổi "abc"+(def)+"ghi"để "abc$(def)ghi"tiết kiệm hơn.
colsw

10

Bash + acpi, 43 4 byte

Luật mới

acpi

đầu ra trên mẫu

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

không chắc chắn nếu thay đổi quy tắc làm cho mọi thứ thú vị hơn, bạn không thể kết xuất bất kỳ văn bản nào có chứa tất cả các chuỗi từ 0 đến 100 sẽ là đầu ra hợp lệ? Có vẻ mất ý định ban đầu nếu vậy.

Quy tắc cũ

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

đầu ra trên mẫu

Remaining battery is 92%

Đừng hỏi tôi tại sao thiết lập hoạt động như thế này, nhưng nó làm.


Bạn đã kiểm tra cái này trên cái gì? Ubuntu hoặc tương tự tôi đoán? Nó không hoạt động trên Mac, ví dụ.
numbermaniac

Hoạt động trên fedora, nhưng nó phụ thuộc rất nhiều vào cú pháp của đầu ra (nó là gì trên mac để tham khảo? @Numbermaniac)?
Wilf

Tôi giả sử nó là cái có sẵn cho hầu hết các bản phân phối linux. Định dạng đầu ra acpi có khác nhau trên mac không (acpi thậm chí còn khả dụng ở đó)?
algmyr

@Wilf acpiđơn giản là không có trên Mac.
numbermaniac

Nó có thể được cài đặt riêng trên một số distro linux, mac có khả năng được tích hợp sẵn các trình điều khiển và lệnh tương đương.
Wilf

6

Python 3.6 + psutil, 80 byte

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

Hãy thử trực tuyến!

Nếu máy không có pin (như trên TIO), chương trình sẽ báo lỗi, vì psutil.sensors_battery()trả về None.

Điều này đòi hỏi Python 3.6 cho phép nội suy chuỗi .


1
Idk. Nó được bao gồm trên TIO. Tôi sẽ bao gồm một liên kết đến các mô-đun.
mbomb007

Tôi đã tìm kiếm và tìm thấy cùng một thư viện nhưng câu trả lời Python 2 của tôi không thông minh như của bạn với phép nội suy chuỗi. Lưu ý đến bản thân: phải vào Python 3.6 và trả lời nhanh hơn. +1
ElPedro

5

C (win32, gcc i686-w64-mingw32), 78 byte

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

Lạm dụng API win32 bằng cách GetSystemPowerStatus()viết "ở đâu đó" trên ngăn xếp, thành viên thú vị nằm trong byte thứ ba, theo SYSTEM_POWER_STATUScấu trúc .

Thật không may, #includedường như là cần thiết, có thể là do các quy ước gọi.

Ví dụ đầu ra:

> bat.exe
90

Hiển thị 255trên các hệ thống không có pin.


Điều gì xảy ra nếu bạn bỏ qua bao gồm?
Ruslan

1
@Ruslan trình liên kết không tìm thấy biểu tượng trong kernel32.dll. Đó là lý do tại sao tôi nghĩ đó là quy ước gọi, các hàm win32 API không sử dụng "tiêu chuẩn" cdecl. Vì vậy, ngay cả khi tôi có thể lừa được trình liên kết bằng cách nào đó, mã có thể sẽ không hoạt động.
Felix Palmen

Bạn đã thử biên dịch với /Gz(mặc định là __stdcall) chưa?
Neil

@ Không có, gcc / mingw có một tùy chọn tương tự hay tôi phải sử dụng msvc cho điều đó? Và sẽ không phá vỡ printf()mà không có một nguyên mẫu?
Felix Palmen

Xin lỗi, tôi đã không đọc tiêu đề của bạn đủ cẩn thận. Tôi nghĩ phiên bản mingw là -mrtd, nhưng tôi không biết điều gì sẽ xảy ra printf(); có lẽ có một ngắn hơn bao gồm cho nó?
Neil

4

VBA Excel, 150 byte

Bị hạn chế đối với Windows 32-bit Cài đặt văn phòng, vì lệnh gọi Kernel32 của windows không phải là con trỏ 64-bit an toàn.

Xuất ra ô A1trên 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 byte nhờ đầu ra linh hoạt

-7 byte nhờ @Neil vì đã sử dụng Int thay vì 2 byte


2
Con trỏ 64 bit không an toàn? Gì? Thật nực cười, Microsoft.
dùng253751

@immibis có một sự khác biệt giữa các phiên bản - nếu bạn đang sử dụng bản cài đặt Office 64 bit thì cuộc gọi sẽ thay đổi thànhDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott

Bạn có thể không sử dụng một mảng byte thay vì cấu trúc không?
Neil

@Neil - thật không may, cuộc gọi Lib gán f cho một con trỏ của _SYSTEM_POWER_STATUScấu trúc , chứa cả hai giá trị byte và từ, nghĩa là trong trường hợp này, cấu trúc phải được mô phỏng từ bên trong vba và không thể sử dụng một mảng byte .
Taylor Scott

Nếu bạn không thể sử dụng một mảng, ít nhất bạn có thể sử dụng loại hai byte làm phần đệm thay vì hai byte đơn không?
Neil

3

QPython cho Android , 133 byte

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

Màn hình mã

Màn hình đầu ra

Điều +"%"này không thực sự cần thiết vì dù sao nó cũng sử dụng định dạng đầu ra linh hoạt hơn, nhưng nó làm cho đầu ra đẹp hơn một chút với chỉ 4 byte.


[ d.notify(tạo thông báo thông báo) sẽ ngắn hơn nhiều so với việc tạo và hiển thị hộp thoại, nhưng vì một số lý do, nó không hoạt động, ít nhất là trên thiết bị của tôi (có thể, nó chưa được cập nhật cho API Android mới hơn).]
chủ nhật - Phục hồi lại

Điều này làm việc cho 130 byte.
trứng

2

Emacs Lisp, 9 byte

(battery)

Hiển thị trạng thái pin hiện tại trong bộ đệm mini ở phía dưới (hoặc ở thiết bị xuất chuẩn khi sử dụng --batch) ở định dạng như : Power N/A, battery Unknown (99.1% load, remaining time N/A).

Nên hoạt động trên Windows, OSX, BSD và Linux.



1

Java, 546 byte (Windows XP trở lên)

Tiện ích powercfg ra đời cho WindowsXP, tôi không biết tiện ích nào có sẵn trước đó. Tôi cũng phải được điều hành như một quản trị viên. Điều này thật tuyệt vời và tôi đã không thực hiện một nỗ lực chơi gôn cực độ ...

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

Được định dạng / nhận xét ...

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

Thành thật mà nói, tôi đã quan tâm nhiều hơn để xem liệu nó có khả thi trong Java không.


Phải gọi một lệnh bên ngoài như vậy, sau đó đọc kết quả của lệnh bên ngoài từ một tệp ... sau đó phải tự tính toán tỷ lệ phần trăm. Và thật dài dòng. Thật kinh khủng tôi yêu nó. Tôi rất vui vì mọi người thử những thứ này bằng ngôn ngữ không phù hợp, điều đó thật thú vị. +1
Jared K

1
@JaredK Tôi thích "chơi gôn" Java, nhưng chỉ với những câu hỏi mà mọi người nghĩ, "trời ơi, cái gì sẽ biến thành trò chơi này trong Java? Nó sẽ không có ý nghĩa." Sắp xếp mỉa mai.
Bạch tuộc ma thuật Urn

Đôi khi tôi nghĩ Java nên có một phiên bản chơi gôn như cách Japt được tạo ra để chơi golf Javascript.
Jared K

@JaredK nhìn vào Groovy hoặc Clojure, có lẽ có thể biến câu trả lời này thành câu trả lời hấp dẫn 100 byte nếu tôi đã cố gắng hết sức.
Bạch tuộc ma thuật Urn

@JaredK đây là một xấp xỉ của câu trả lời tương tự này trong 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}
Bạch tuộc ma thuật Urn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.