Kalan pil miktarını görüntüle


26

Kalan pil şarjını, maksimum şarjın yüzdesi olarak görüntüleme

Kodunuzu bir telefonda, hesap makinesinde vb. Çalıştıramazsanız, ortamınızı muhtemelen en azından bir dizüstü bilgisayara yükleyebileceğinizi unutmayın. Pili olan bir cihazda kesinlikle çalışamıyorsanız, ne yazık ki diliniz uygun değil çünkü yazdırmanız için uygun bir değeriniz yok.

Sonuçları ekranda göstermelisiniz. Bu teorik olarak kullanıcının pili kontrol etmesi için kullanışlı bir yardımcı program olduğu varsayılmaktadır. Pil yüzdesini bir dosyaya yazmak çok tıkalı olup, kullanıcının dosyayı kontrol etmesini gerektirir. Bu nedenle, ekranda görüntülenmesi, varsayılan IO olarak geçersiz kılınamayan özelliklerin bir parçasıdır. Bununla birlikte, hiçbir şeyin STDOUT gibi şeylerin ekranda her zamanki gibi görünmesini engellemediğini varsayabilirsiniz.

Pil yüzdesi zaten OS tarafından her zaman ekranda görüntüleniyorsa, birçok telefonda olduğu gibi, bu sıfır baytlık bir çözüme sahip olduğunuz anlamına gelmez. Yerleşik ekranın mevcut olmadığını varsaymalı ve pil yüzdesini tekrar başka bir yerde göstermelisiniz.

Düzenleme: Çıktı formatı açılıyor. Sadece yüzde haneleri veya bazı ekstra çıkışlara sahip haneleri kadar az göstermekte serbestsiniz.

Düzen2: Yüzdeyi temsil eden rakamlar, çıktının sonundan itibaren en fazla 50 satır olacak şekilde çıktının içinde bilinen bir konumda görünmeli ve bu konum, çağrılar arasında değişmemelidir. Yüzdeyi temsil eden rakamlar, her bir tarafta en az bir rakam olmayan karakter ile diğer çıkışlardan ayrılmalıdır.

Buradaki referans, değişiklikten önceki eski çıktı formatıdır:

Remaining battery is ddd% veya Remaining battery is ddd percent


11
Bu benzersiz bir meydan okumadır, çünkü seçilen dil büyük ölçüde çevreye bağlıdır ve en iyi golf o ortamda sunulan API'ye büyük ölçüde güvenecektir. Değil emin iyi ya da kötü, ha eğer
Poke

4
Pil yüzdesi olarak tanımlanan nedir? Donanımın nasıl çalıştığını gerçekten bilmiyorum ama akü yüzdesinin öngörülen kullanım açısından bir tür hueristik olduğu izlenimindeydim.
Buğday Sihirbazı,

3
Çıktı formatı neden bu kadar katı?
Okx,

1
@WW Sanırım bunu 'yüzde' olarak gösteren telefonları duydum. Tabii ki, bu sadece kullanıcı için yanıltıcı ve küçümseyici olmamalıdır. Ancak insanlardan yeni bir donanım düzeyinde aygıt sürücüsünü golf oynamasını istemek yerine, işletim sistemi veya sistem düzeyinde API'nin verdiği% 'leri kabul etmeye hazırım.
Jared K,

2
@ user202729 Bu elektronik.SE cevap iç ölçümle ilgili, ancak kullanıcıya maruz kalan şey genellikle doktorlu bir sayı - Li-ion piller sahip oldukları şarj miktarını daha hızlı tüketiyor (veya bunun tersi mi?), ancak cihaz (genellikle) bunun, batarya yüzdesinde bir miktar doğrusal değişim göstermesi için ayarlar, çünkü bu, kullanıcılar için daha öngörülebilirdir.
sundar - Monica'yı yeniden

Yanıtlar:


43

Bash, 70 67 50 46 43 16 bayt

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

Çıktılar: <battery 0-100>: command not found

Dosyayı okur /sys/class/power_supply/BAT1/capacity.

LENOVO ideapad 500'de Ubuntu 18.04 kullanılarak test edilmiştir.

Biraz zaman alıyor (tüm dosya sistemini aradığından beri) - fakat bir bayt kazandırıyor!

Eski cevap:

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

38
Biraz zaman alıyor (tüm dosya sistemini aradığından beri) - fakat bir bayt kazandırıyor! - bu senin için golf kodu!
Stewie Griffin

11
Hm, bir dosya bulunmadığından emin olup olmadığından emin değilim /so/apes/yadayada/Brunch/calamity.
Outgolfer Erik,

4
@EriktheOutgolfer Bana yeni bir yükleme yapabileceğimi söyledim.
Okx,

11
@EriktheOutgolfer Dünya sona ermeden önce Brunch servis edildiğinden çok memnunum.
mbomb007

1
@algmyr O noktada da yapabilirimecho {0.100}
Okx

13

JavaScript (tarayıcı), 78 77 50 bayt

( Benoit Esnard sayesinde -1 bayt )

(Çıktı formatı şu anda esnek olduğundan -27 bayt)

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

JavaScript (tarayıcı), 46 bayt, bir söz vererek

( Shaggy tarafından önerilmiştir , bir başlık ve altbilgi gerektirir)

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


Not: Yalnızca Google Chrome> = 38 (masaüstü ve Android) veya Battery API'yi destekleyen başka bir tarayıcıda çalışır . FireFox bu API’yı gizlilik kaygıları nedeniyle kaldırmıştır.

Android'de örnek (eski çıktı formatı):

enter image description here

Windows dizüstü bilgisayarda örnek (eski çıktı biçimi):

enter image description here


ES6 string şablonlarını kullanarak bir bayttan tasarruf edebilirsiniz:`Remaining battery is ${b.level*100}%`
Benoit Esnard

@ Benit Esnard: Güzel fikir! Thanks ...
Night2

2
Bir kullanıcının pil seviyesini bir web sayfasında bulabileceğinizi hiç anlamadım. Bu özelliğin ne zaman bir kullanıcı için ne zaman faydalı olacağını düşünemiyorum.
numbermaniac

2
@numbermaniac PoC, günlerde, cihazın pil seviyesine bağlı olarak düşük güç modu içeren web sitelerini içeriyordu. Ne yazık ki tüm bunların , çerezlere ihtiyaç duymadan sizi izlemek için kullanılabileceğini düşünmediler.
Alexis Facques

4
@ sayı_maniac: Kullanımlardan biri, kullanıcının pili zayıf olduğunda bir formu otomatik olarak kaydetmektir. Ancak bunun için birçok suiistimal olabilir ve bu yüzden FireFox onu kaldırdı.
Gece2

12

PowerShell , 28 bayt

-26 (!) AdmBorkBork'a teşekkürler. Önceki sürüm -3, colsw sayesinde.

((gwmi win32_battery)|% e*g)

enter image description here

gwmi İçin Kısa Get-WmiObject

|%kalıbı alır e*gve eşleşen tek özelliği bulur;estimatedChargeRemaining


1
Bu ipucunu kullanarak , uzun mülk adını - ((gwmi win32_battery)|% e*g).
AdmBorkBork

@AdmBorkBork Tekrar teşekkürler. Söyleyebileceğiniz gibi, Powershell golfçü (ya da hatta kullanıcı) değilim. Sadece biraz Google-fu kullandım…
Adám

Cihazın birden fazla bataryası varsa, Remaining battery is 98 96%
şuna

@VasilyAlexeev OP uygun bir cihaz seçebiliriz gibi geliyor.
Adám

Biraz daha tasarruf "abc"+(def)+"ghi"etmek "abc$(def)ghi"için olarak değiştirin .
colsw

10

Bash + acpi, 43 4 bayt

Yeni kurallar

acpi

formdaki çıktı

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

kural değişikliğinin işleri daha ilginç hale getirip getirmediğinden emin değil, 0'dan 100'e kadar olan tüm dizeleri içeren bir metni dökemez misiniz? Eğer öyleyse orijinal niyetini kaybetmiş gibi görünüyor.

Eski kurallar

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

formdaki çıktı

Remaining battery is 92%

Bana neden setin böyle çalıştığını sorma, ama işe yarıyor.


Bunu ne üzerinde test ettiniz? Ubuntu veya benzeri sanırım? Örneğin Mac'te çalışmıyor.
numbermaniac

Fedora üzerinde çalışır, ancak büyük ölçüde çıktının sözdizimine bağlıdır (başvuru için mac'ta nedir? @Numbermaniac)?
Wilf

Sanırım çoğu Linux dağıtımı için uygun olanı. Acpi çıktı biçimi mac'ta farklı olabilir mi (acpi orada da mevcut mu)?
algmyr

@Wilf acpisadece Mac'te görünmüyor.
numbermaniac

Bazı linux dağıtımlarında ayrı olarak kurulabilir, muhtemelen mac kendi eşdeğeri sürücü ve komutlarda yerleşiktir.
Wilf

6

Python 3.6 + psutil, 80 bayt

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

Çevrimiçi deneyin!

Makinenin pili yoksa (TIO'da olduğu gibi), program bir hata atar; çünkü psutil.sensors_battery()geri döner None.

Bu dize enterpolasyonu için Python 3.6 gerektirir .


1
Bilmiyorum. TIO'da dahil edilmiştir. Modüle bir link ekleyeceğim.
mbomb007

Googled ve aynı kütüphaneyi buldum ama Python 2 cevabım sizinkiyle dize enterpolasyonu kadar akıllı değildi. Kendime not: Python 3.6'ya girmeli ve daha hızlı cevap vermelidir. +1
ElPedro

5

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

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

Suistimaller vererek Win32 API GetSystemPowerStatus()yığın yazma "bir yere" ilginç üyesi göre, üçüncü bayt olduğunu SYSTEM_POWER_STATUSyapı .

Maalesef, #includemuhtemelen çağrı sözleşmeleri nedeniyle gerekli gibi görünüyor.

Örnek çıktı:

> bat.exe
90

255Pili olmayan sistemlerde görüntülenir .


İçeriği atlarsanız ne olur?
Ruslan,

1
@ Bağlayıcı, sembolü bulamaz kernel32.dll. Bu yüzden bence çağrı sözleşmesi, win32 API fonksiyonları "standart" kullanmıyor cdecl. Bu yüzden, linker'ı bir şekilde kandırabilsem bile, kod muhtemelen yine de işe yaramaz.
Felix Palmen

Derlemeye çalıştınız mı /Gz(varsayılan olarak __stdcall)?
Neil

@Hayır hayır, gcc / mingw'in benzer bir seçeneği var mı, yoksa bunun için msvc kullanmak zorunda mıyım? Ve bu printf()prototipsiz bir şeyi bozmaz mıydı?
Felix Palmen

Üzgünüm, başlığınızı yeterince dikkatli okumamıştım. Bence mingw versiyonu -mrtd, ama ne olacağını bilmiyorum printf(); belki bunun için daha kısa bir yer var mı?
Neil

4

Excel VBA, 150 bayt

Windows Kernel32 çağrısı 64-bit işaretçi güvenli olmadığından 32-bit Windows Office Office ile sınırlıdır.

A1ActiveSheet'teki hücreye çıktı verir.

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

Esnek çıkış sayesinde -26 bayt

@ 7 bayt yerine 2 bayt yerine bir int kullandığı için -7 bayt


2
64 bit işaretçi güvenli değil mi? Ne? Bu çok saçma, Microsoft.
kullanıcı253751

@ immibis sürümleri arasında bir fark var - Office 64 bit kurulum kullanıyorsanız o zaman çağrı sadece değişirDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott

Yapı yerine bayt dizisi kullanamazsınız?
Neil

@Neil - ne yazık ki değil, Lib çağrısı f'yi hem bayt hem de dword değerlerini içeren _SYSTEM_POWER_STATUSyapının bir göstergesine atar , bu durumda yapının vba içinden taklit edilmesi gerektiği ve bir byte dizisinin kullanılamayacağı anlamına gelir. .
Taylor Scott

Bir diziyi kullanamıyorsanız, en az iki tek bayt yerine dolgunuz olarak iki baytlık bir tür kullanamazsınız?
Neil

3

Android için QPython , 133 bayt

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

Kod ekranı

Çıkış ekranı

+"%"Yine yeni daha esnek çıktı biçimini kullandığından kesinlikle gerekli değildir, ama sadece 4 bayt hafif hoş çıkış için yapar.


[ d.notify(bildirim uyarısı oluştur) iletişim kutusunu oluşturmaktan ve görüntülemekten çok daha kısa olurdu, ancak nedense çalışmadı, en azından cihazımda (muhtemelen, daha yeni Android API'leri için güncellenmemiş).]
sundar - Reinstate Monica

Bu 130 bayt için çalışıyor.
ovs

2

Emacs Lisp, 9 bayt

(battery)

Geçerli pil durumunu, aşağıdaki gibi mini tamponda (veya kullanırken standart olarak --batch) gösterir:Power N/A, battery Unknown (99.1% load, remaining time N/A) .

Windows, OSX, BSD ve Linux üzerinde çalışmalı.



1

Java, 546 bayt (Windows XP veya Daha Yüksek)

Powercfg yardımcı programı WindowsXP için devreye girdi, bundan önce hangi hizmetlerin mevcut olduğunu bilmiyorum. Yönetici olarak da çalıştırılmalıyım. Bu çok korkunç ve aşırı bir golf denemesi yapmadım.

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

Biçimlendirildi / yorumlandı ...

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

Dürüst olmak gerekirse, Java'da mümkün olup olmadığını görmek için daha çok ilgilendim.


Böyle bir harici komut çağırmak zorunda kaldıktan sonra, harici komutun sonuçlarını bir dosyadan okuyun ... ardından yüzdeyi kendiniz hesaplayın. Ve çok ayrıntılı. Onu sevmem çok korkunç. İnsanların bunları uygun olmayan dillerde denemelerine sevindim, çok eğlenceli. +1
Jared K

1
@JaredK Java'yı "golf oynamayı" seviyorum, ancak yalnızca insanların düşündüğü sorulara "ah Tanrım hayır, Java'da hangi moron bunu deneyecek? Bu sadece mantıklı olmaz." Bir çeşit ironik.
Magic Octopus Urn

Bazen Java’nın Javascript’te golf oynamak için Japt’un nasıl yapıldığını bildiği gibi bir golf versiyonuna sahip olması gerektiğini düşünüyorum.
Jared K

@JaredK, Groovy veya Clojure'a baktığımda, süper çaba harcamayı denediysem, muhtemelen bunu 100 baytlık büyük bir cevaba dönüştürebilirdi.
Magic Octopus Urn

@JaredK, groovy'deki bu aynı cevabın bir yaklaşımı:{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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.