Tampilan persen sisa baterai


26

Tampilkan sisa daya baterai, sebagai persentase dari daya maksimum

Ingatlah jika Anda tidak dapat menjalankan kode Anda di telepon, kalkulator, dll, Anda mungkin dapat menginstal lingkungan Anda di laptop setidaknya. Jika Anda benar-benar tidak dapat berjalan pada perangkat yang memiliki baterai, maka sayangnya bahasa Anda tidak memenuhi syarat karena Anda tidak memiliki nilai berguna untuk dicetak.

Anda harus menampilkan hasilnya di layar. Ini secara teoritis seharusnya menjadi utilitas praktis bagi pengguna untuk memeriksa baterai. Menulis persen baterai ke file terlalu kikuk, mengharuskan pengguna untuk memeriksa file. Oleh karena itu, tampilan di layar adalah bagian dari spesifikasi yang tidak dapat ditimpa secara default oleh IO. Yang mengatakan, Anda dapat menganggap tidak ada yang mencegah hal-hal seperti STDOUT ditampilkan di layar dengan cara biasa.

Jika persen baterai sudah ditampilkan di layar setiap saat oleh OS, seperti pada banyak ponsel, itu tidak berarti Anda mendapatkan solusi nol-byte. Anda harus mengasumsikan bahwa tampilan bawaan tidak ada, dan menampilkan persen baterai lagi di tempat lain.

Sunting: Format keluaran sedang dibuka. Anda bebas untuk menampilkan sesedikit hanya digit persen, atau digit dengan beberapa output tambahan juga.

Sunting2: Digit yang mewakili persen harus muncul di lokasi yang diketahui dalam output, tidak lebih dari 50 baris dari akhir output, dan lokasi itu tidak boleh berubah di antara permintaan. Digit yang mewakili persen harus dipisahkan dari output lain oleh setidaknya satu karakter non-digit di setiap sisi.

Untuk referensi di sini adalah format keluaran lama dari sebelum perubahan:

Remaining battery is ddd% atau Remaining battery is ddd percent


11
Ini adalah tantangan yang unik karena bahasa yang dipilih sangat tergantung pada lingkungan dan golf terbaik akan sangat bergantung pada api yang disajikan di lingkungan itu. Tidak yakin apakah itu baik atau buruk, ha
Poke

4
Berapa persentase baterai yang didefinisikan? Saya tidak terlalu terbiasa dengan cara kerja perangkat keras tetapi saya selalu mendapat kesan bahwa persentase baterai adalah semacam hueristik dalam hal perkiraan penggunaan.
Wheat Wizard

3
Mengapa format output sangat ketat?
Okx

1
@WW Saya pikir saya pernah mendengar tentang ponsel yang menampilkannya sebagai 'persen'. Mereka seharusnya tidak, tentu saja, itu hanya menyesatkan dan merendahkan pengguna. Tapi singkatnya meminta orang untuk golf driver perangkat tingkat perangkat keras baru, saya bersedia menerima% yang diberikan OS atau API tingkat sistem.
Jared K

2
@ user202729 Jawaban electronics.SE itu adalah tentang pengukuran internal, tetapi apa yang terpapar kepada pengguna sering kali berupa angka yang telah diolah - baterai Li-ion menguras lebih cepat semakin banyak muatan yang mereka miliki (atau apakah sebaliknya?), tetapi perangkat tersebut (biasanya) menyesuaikan untuk itu untuk menunjukkan perubahan persentase baterai yang agak linier karena hal itu terasa lebih dapat diprediksi oleh pengguna kami.
sundar - Reinstate Monica

Jawaban:


43

Bash, 70 67 50 46 43 16 byte

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

Output: <battery 0-100>: command not found

Membaca file /sys/class/power_supply/BAT1/capacity.

Diuji menggunakan Ubuntu 18.04 pada LENOVO ideapad 500.

Butuh beberapa saat (karena mencari seluruh sistem file) - tetapi menghemat satu byte!

Jawaban lama:

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

38
Butuh beberapa saat (karena mencari seluruh sistem file) - tetapi menghemat satu byte! - itulah kode golf untukmu!
Stewie Griffin

11
Hm, saya tidak yakin apakah bisa dijamin tidak ada file yang dipanggil /so/apes/yadayada/Brunch/calamity.
Erik the Outgolfer

4
@EriktheOutgolfer Saya diberitahu saya dapat menganggap instalasi baru.
Okx

11
@EriktheOutgolfer Saya sangat senang Brunch disajikan sebelum dunia berakhir.
mbomb007

1
@ algmyr Pada titik itu saya mungkin juga melakukanecho {0.100}
Okx

13

JavaScript (browser), 78 77 50 byte

(-1 byte terima kasih kepada Benoit Esnard )

(-27 byte karena format output fleksibel sekarang)

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

JavaScript (browser), 46 byte, dengan mengembalikan janji

(Disarankan oleh Shaggy , membutuhkan header dan footer)

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


Catatan: Hanya berfungsi di Google Chrome> = 38 (desktop dan Android) atau browser lain yang mendukung API Baterai . FireFox telah menghapus API ini karena masalah privasi.

Contoh di Android (format output lama):

masukkan deskripsi gambar di sini

Contoh pada laptop Windows (format output lama):

masukkan deskripsi gambar di sini


Anda dapat menyimpan satu byte dengan menggunakan templat string ES6:`Remaining battery is ${b.level*100}%`
Benoit Esnard

@ Beneno Esnard: Ide bagus! Terima kasih ...
Night2

2
Saya tidak pernah menyadari Anda bisa mendapatkan level baterai pengguna di halaman web. Saya tidak bisa memikirkan kapan fitur itu benar-benar bermanfaat bagi pengguna.
numbermaniac

2
@numbermaniac Kembali ke masa lalu, PoC menampilkan situs web yang menyertakan mode berdaya rendah berdasarkan tingkat baterai perangkat. Sayang sekali mereka tidak berpikir semua ini juga dapat digunakan untuk melacak Anda tanpa perlu cookie.
Alexis Facques

4
@numbermaniac: Salah satu penggunaannya adalah menyimpan formulir secara otomatis saat baterai pengguna hampir habis. Tetapi bisa ada banyak penyalahgunaan untuk itu dan itulah mengapa FireFox telah menghapusnya.
Night2

12

PowerShell , 28 byte

-26 (!) Terima kasih kepada AdmBorkBork. Versi sebelumnya -3 terima kasih kepada colsw.

((gwmi win32_battery)|% e*g)

masukkan deskripsi gambar di sini

gwmi kependekan dari Get-WmiObject

|%mengambil polanya e*gdan menemukan satu-satunya properti yang cocok;estimatedChargeRemaining


1
Dengan menggunakan tip ini , Anda dapat menggunakan nama properti yang panjang - ((gwmi win32_battery)|% e*g).
AdmBorkBork

@ AdmBorkBork Terima kasih lagi. Seperti yang Anda tahu, saya bukan pegolf Powershell (atau bahkan pengguna). Hanya menggunakan sedikit Google-fu ...
Adám

Jika perangkat memiliki lebih dari satu baterai, ini akan menampilkan sesuatu sepertiRemaining battery is 98 96%
Vasily Alexeev

@VasilyAlexeev OP terdengar seperti kita dapat memilih perangkat yang sesuai.
Adám

Ubah "abc"+(def)+"ghi"untuk "abc$(def)ghi"menyimpan lebih banyak.
colsw

10

Bash + acpi, 43 4 byte

Aturan baru

acpi

output pada formulir

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

tidak yakin jika perubahan aturan membuat hal-hal lebih menarik, tidak bisakah Anda membuang teks yang berisi semua string 0 hingga 100 yang akan menjadi output yang valid? Tampaknya kehilangan niat awal jika demikian.

Aturan lama

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

output pada formulir

Remaining battery is 92%

Jangan tanya saya mengapa set berfungsi seperti ini, tetapi ya.


Anda menguji ini pada apa? Ubuntu atau sejenisnya saya duga? Tidak berfungsi di Mac, misalnya.
numbermaniac

Bekerja pada fedora, tetapi sangat bergantung pada sintaks output (ada apa di mac untuk referensi? @Numbermaniac)?
Wilf

Saya menganggap itu yang tersedia untuk sebagian besar distro linux. Apakah format output acpi berbeda pada mac mungkin (apakah acpi bahkan tersedia di sana)?
algmyr

@ Will tampaknya acpitidak ada di Mac.
numbermaniac

Dapat diinstal secara terpisah pada beberapa distro linux, mac kemungkinan memiliki driver dan perintah yang setara.
Wilf

6

Python 3,6 + psutil, 80 byte

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

Cobalah online!

Jika mesin tidak memiliki baterai (seperti pada TIO), program akan melempar kesalahan, karena psutil.sensors_battery()kembali None.

Ini membutuhkan Python 3.6 untuk interpolasi string .


1
Idk. Sudah termasuk dalam TIO. Saya akan menyertakan tautan ke modul.
mbomb007

Saya mencari di Google dan menemukan perpustakaan yang sama tetapi jawaban Python 2 saya tidak sepandai milik Anda dengan interpolasi string. Catatan untuk diri sendiri: harus masuk ke Python 3.6 dan menjawab lebih cepat. +1
ElPedro

5

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

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

Menyalahgunakan win32 API dengan membiarkan GetSystemPowerStatus()menulis "di suatu tempat" di stack, anggota yang menarik berada di byte ketiga, menurut SYSTEM_POWER_STATUSstruct .

Sayangnya, #includesepertinya diperlukan, mungkin karena mengadakan konvensi.

Contoh output:

> bat.exe
90

Menampilkan 255sistem tanpa baterai.


Apa yang terjadi jika Anda menghilangkan menyertakan?
Ruslan

1
@Ruslan linker tidak menemukan simbol dalam kernel32.dll. Itu sebabnya saya pikir itu adalah konvensi pemanggilan, fungsi win32 API tidak menggunakan "standar" cdecl. Jadi, bahkan jika saya bisa mengelabui linker, kode mungkin tidak akan bekerja.
Felix Palmen

Apakah Anda mencoba mengompilasi /Gz(default ke __stdcall)?
Neil

@Neil no, apakah gcc / mingw memiliki opsi serupa atau apakah saya harus menggunakan msvc untuk itu? Dan bukankah itu akan menghancurkan printf()tanpa prototipe?
Felix Palmen

Maaf, saya belum cukup membaca tajuk Anda. Saya pikir versi mingw adalah -mrtd, tetapi saya tidak tahu apa yang akan terjadi pada printf(); mungkin ada yang lebih pendek termasuk untuk itu?
Neil

4

Excel VBA, 150 byte

Terbatas untuk Pemasangan Windows kantor 32-Bit, karena panggilan windows Kernel32 tidak aman 64-bit.

Output ke sel A1pada 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 berkat output yang fleksibel

-7 byte terima kasih kepada @Neil untuk menggunakan Int, bukan 2 byte


2
Tidak 64-bit pointer aman? Apa? Itu konyol, Microsoft.
user253751

@ Imibis itu ada hubungannya dengan perbedaan antara versi - jika Anda menggunakan 64 bit instal Office maka panggilan hanya berubah menjadiDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott

Bisakah Anda tidak menggunakan array byte alih-alih struktur?
Neil

@ Neil - sayangnya tidak, panggilan Lib memberikan f ke sebuah pointer dari _SYSTEM_POWER_STATUSstruktur , yang memegang nilai byte dan kata, yang berarti bahwa, dalam hal ini, struktur harus ditiru dari dalam vba, dan array byte tidak dapat digunakan .
Taylor Scott

Jika Anda tidak dapat menggunakan array, tidak bisakah Anda setidaknya menggunakan tipe dua byte sebagai padding Anda alih-alih dua byte tunggal?
Neil

3

QPython untuk Android , 133 byte

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

Layar kode

Layar keluaran

Itu +"%"tidak sepenuhnya diperlukan karena menggunakan format output yang lebih fleksibel yang lebih baru, tetapi membuat output yang sedikit lebih bagus hanya dengan +4 byte.


[ d.notify(buat lansiran pemberitahuan) akan jauh lebih pendek daripada membuat dan menampilkan dialog, tetapi untuk beberapa alasan itu tidak berfungsi, setidaknya di perangkat saya (mungkin, itu belum diperbarui untuk API Android yang lebih baru).]
sundar - Reinstate Monica

Ini berfungsi untuk 130 byte.
Ovs

2

Emacs Lisp, 9 byte

(battery)

Menunjukkan status baterai saat ini di mini-penyangga di bagian bawah (atau ke stdout ketika menggunakan --batch) dalam format seperti: Power N/A, battery Unknown (99.1% load, remaining time N/A).

Harus bekerja di Windows, OSX, BSD, dan Linux.



1

Java, 546 byte (Windows XP atau lebih tinggi)

Utilitas powercfg mulai digunakan untuk WindowsXP, saya tidak tahu utilitas apa yang tersedia sebelum ini. Saya juga harus dijalankan sebagai administrator. Ini mengerikan sekali dan saya tidak melakukan upaya golf yang ekstrim ...

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

Diformat / dikomentari ...

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

Jujur saya lebih tertarik untuk melihat apakah itu mungkin di Jawa.


Harus memanggil perintah eksternal seperti itu, kemudian membaca hasil dari perintah eksternal dari file ... kemudian harus menghitung sendiri persentase. Dan begitu verbose. Mengerikan, aku menyukainya. Saya senang orang-orang mencoba hal-hal ini dalam bahasa yang tidak cocok itu sangat menyenangkan. +1
Jared K

1
@JaredK Saya menikmati Java "golf", tetapi hanya pada pertanyaan di mana orang berpikir, "oh Tuhan, tidak ada orang bodoh yang pernah mencoba ini di Jawa? Itu tidak masuk akal." Agak ironis.
Magic Octopus Mm

Terkadang saya berpikir Java harus mendapatkan versi golf seperti bagaimana Japt dibuat untuk bermain golf Javascript.
Jared K

@JaredK melihat ke Groovy atau Clojure, mungkin bisa mengubah ini menjadi jawaban asyik 100 byte jika saya mencoba sangat keras.
Magic Octopus Mm

@JaredK inilah perkiraan dari jawaban yang sama ini di 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 Mm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.