バッテリー残量の表示


26

バッテリー残量を最大充電の割合として表示します

電話、電卓などでコードを実行できない場合は、少なくともラップトップに環境をインストールできることを忘れないでください。バッテリーを搭載したデバイスで絶対に実行できない場合、残念なことに、印刷するための有用な値がないため、言語は対象外です。

結果を画面に表示する必要があります。これは、理論的には、ユーザーがバッテリーをチェックするための便利なユーティリティであると想定されています。バッテリーの割合をファイルに書き込むのはあまりにも不格好で、ユーザーがファイルをチェックする必要があります。したがって、画面上に表示することは、デフォルトのIOでオーバーライドできない仕様の一部です。そうは言っても、STDOUTのようなものが通常の方法で画面に表示されるのを妨げるものは何もないと想定できます。

多くの携帯電話のように、OSによって常にバッテリーの割合が画面にすでに表示されている場合でも、ゼロバイトのソリューションがあるというわけではありません。組み込みのディスプレイが存在しないと仮定し、バッテリーパーセントを別の場所に再度表示する必要があります。

編集:出力形式が開かれています。パーセントの数字だけを表示することも、追加の出力を含む数字を表示することもできます。

Edit2:パーセントを表す数字は、出力内の既知の場所(出力の最後から50行以内)に表示​​される必要があり、その場所は呼び出し間で変化してはなりません。パーセントを表す数字は、各側に少なくとも1つの非数字文字で他の出力から分離する必要があります。

参考のため、変更前の古い出力形式を次に示します。

Remaining battery is ddd% または Remaining battery is ddd percent


11
選択された言語は環境に大きく依存し、最高のゴルフはその環境で提供されるAPIに大きく依存するため、これはユニークな課題です。それが良いか悪いかわからない、ヘクタール
ポケ

4
バッテリーパーセンテージとは何ですか?私はハードウェアがどのように機能するかについてあまり詳しくはありませんが、バッテリー使用率は予測される使用に関しては色相のようなものであるという印象を常に受け​​ていました。
小麦ウィザード

3
なぜ出力形式がそれほど厳しいのですか?
Okx

1
@WW電話が「パーセント」として表示されていると聞いたことがあります。もちろん、それはユーザーを誤解させ、見下しているだけではいけません。しかし、新しいハードウェアレベルのデバイスドライバーをゴルフに頼むのではなく、OSまたはシステムレベルのAPIが提供するすべての%を受け入れます。
ジャレッドK

2
@ user202729そのelectronics.SEの答えは内部測定に関するものですが、ユーザーにさらされるのは多くの場合医師の数字です-リチウムイオン電池は充電量が多いほど速く消耗します(または逆ですか?) (通常)バッテリーパーセンテージがやや直線的な変化を示すように調整します。これはユーザーにとってより予測しやすいためです。
スンダ

回答:


43

Bash、70 67 50 46 43 16バイト

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

出力: <battery 0-100>: command not found

ファイルを読み取ります/sys/class/power_supply/BAT1/capacity

LENOVO ideapad 500でUbuntu 18.04を使用してテストしました。

少し時間がかかります(ファイルシステム全体を検索するため)-しかし、バイトを節約します!

古い答え:

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

38
少し時間がかかります(ファイルシステム全体を検索するため)-しかし、バイトを節約します!-それはあなたのためのコードゴルフです!
スチューイーグリフィン

11
うーん、というファイルが存在しないことが保証できるかどうかわかりません/so/apes/yadayada/Brunch/calamity
エリックアウトゴルファー

4
@EriktheOutgolfer新規インストールを想定できると言われています。
Okx

11
@EriktheOutgolfer世界が終わる前にブランチが提供されてとてもうれしいです。
mbomb007

1
@algmyrその時点で私もするかもしれませんecho {0.100}
Okx

13

JavaScript(ブラウザ)、78 77 50バイト

Benoit Esnardのおかげで1バイト)

(出力形式が柔軟になったため、-27バイト)

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

JavaScript(ブラウザ)、46バイト、promiseを返すことにより

シャギーが提案し、ヘッダーとフッターが必要です)

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


注: Google Chrome> = 38(デスクトップおよびAndroid)またはBattery APIをサポートするその他のブラウザーでのみ機能します。FireFoxは、プライバシーの問題からこのAPIを削除しました。

Androidの例(古い出力形式):

ここに画像の説明を入力してください

Windowsラップトップの例(古い出力形式):

ここに画像の説明を入力してください


あなたはES6の文字列テンプレートを使って、1つのバイトを保存することができます:`Remaining battery is ${b.level*100}%`
ブノワEsnard

@Benoit Esnard:いいね!ありがとう
...-Night2

2
Webページでユーザーのバッテリーレベルを取得できることに気づきませんでした。しかし、その機能がユーザーにとって実際にいつ役立つのかは考えられません。
numbermaniac

2
@numbermaniacかつて、PoCはデバイスのバッテリーレベルに基づいた低電力モードを含むWebサイトを特集していました。残念なことに、Cookieを使用せずにこのすべてを追跡に使用できるとは考えていませんでした。
アレクシスジャック

4
@numbermaniac:使用方法の1つは、ユーザーのバッテリーが少なくなったときにフォームを自動保存することです。しかし、多くの誤用が存在する可能性があるため、FireFoxはそれを削除しました。
Night2

12

PowerShell、28バイト

-26(!)AdmBorkBorkに感謝します。colswのおかげで以前のバージョン-3。

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

setがこのように機能する理由を聞かないでください。


これを何でテストしましたか?Ubuntuまたは類似の推測ですか?たとえば、Macでは機能しません。
numbermaniac

fedoraで動作しますが、出力の構文に大きく依存します(参照用のMacでは何ですか?@numbermaniac)?
ウィルフ

ほとんどのLinuxディストリビューションで利用できるものだと思います。Macではacpiの出力形式はおそらく異なりますか(acpiでも利用可能ですか)
アルグミー

@Wilf acpiはMacには存在しないようです。
numbermaniac

一部のLinuxディストリビューションに個別にインストールできますが、Macには同等のドライバーとコマンドが組み込まれている可能性があります。
ウィルフ

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

私はグーグルで検索して同じライブラリを見つけましたが、Python 2の答えは、文字列の補間に関してはあなたのものほど賢くありませんでした。自己への注意:Python 3.6に入り、より速く答えなければなりません。+1
エルペドロ

5

C(win32、gcc i686-w64-mingw32)、78バイト

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

structGetSystemPowerStatus()によると、スタックの「どこかに」を書き込むことでwin32 APIを悪用し、興味深いメンバーは3バイト目にあります。SYSTEM_POWER_STATUS

残念ながら、#includeおそらく呼び出し規約のために、が必要と思われます。

出力例:

> bat.exe
90

255バッテリーなしのシステムで表示します。


インクルードを省略するとどうなりますか?
ルスラン

1
@Ruslanリンカはでシンボルを見つけられませんkernel32.dll。それが、呼び出し規約だと思う理由です。win32API関数は「標準」を使用しませんcdecl。そのため、どうにかしてリンカをだますことができたとしても、コードはおそらく動作しません。
フェリックスパルメン

コンパイルしようとしましたか/Gz(デフォルトは__stdcall)?
ニール

@Neilいいえ、gcc / mingwには同様のオプションがありますか、それともmsvcを使用する必要がありますか?そして、それはprintf()プロトタイプなしで壊れないでしょうか?
フェリックスパルメン

申し訳ありませんが、ヘッダーを十分に読んでいませんでした。mingw版はそうだと思いますが-mrtd、どうなるかわかりませんprintf()。たぶんそれのための短いインクルードがありますか?
ニール

4

Excel VBA、150バイト

Windows Kernel32呼び出しは64ビットポインターセーフではないため、オフィスの32ビットWindowsインストールに制限されています。

A1ActiveSheet のセルに出力します。

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バイト

2バイトの代わりにIntを使用した@Neilのおかげで、-7 バイト


2
64ビットポインターセーフではありませんか?何?それはばかげている、マイクロソフト。
user253751

@immibisはバージョン間の違いと関係があります-64ビット版のOfficeを使用している場合、呼び出しは次のように変わりますDeclare PtrSafe Sub GetSystemPowerStatus Lib"kernel32"(f As t)
Taylor Scott

構造の代わりにバイト配列を使用できませんか?
ニール

残念ながら、のポインタにFのLibコール割り当て- @Neil _SYSTEM_POWER_STATUS構造、この場合、構造は、VBA内でエミュレートする必要があり、バイト配列を使用することができない、つまりバイトおよびDWORD値の両方を保持し、 。
テイラースコット

配列を使用できない場合、少なくとも2つの単一バイトの代わりに2バイト型をパディングとして使用することはできませんか?
ニール

3

QPython for Android、133バイト

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

コード画面

出力画面

+"%"それはとにかく新しい、より柔軟な出力形式を使用していますので、厳密には必要ではないが、それはちょうど4バイトで少しよりよい出力になります。


[ d.notify(通知アラートを作成)ダイアログを作成し、表示するよりもはるかに短いだったでしょうが、それは仕事をしません何らかの理由で、少なくとも私のデバイス上で(おそらく、それは新しいAndroidのAPIの更新されていません)。]
スンダ-復活モニカ

これは130バイトで機能します。
-ovs

2

Emacs Lisp、9バイト

(battery)

下部のミニバッファー(またはを使用している場合は標準出力--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でそれが可能かどうかを確認したいと思いました。


そのような外部コマンドを呼び出し、ファイルから外部コマンドの結果を読み取る必要があります...そしてパーセンテージを自分で計算する必要があります。そしてとても冗長です。私はそれが大好きです。人々がこれらのことを不適切な言語で試してくれてうれしいです。とても楽しいです。+1
ジャレッドK

1
@JaredK私はJavaの「ゴルフ」を楽しんでいますが、「ああ、なんてバカなJavaでこれを試してみませんか?意味がありません」と人々が考える質問でのみです。皮肉な感じ。
魔法のタコUr

Javaは、JavascriptをゴルフするためにJaptがどのように作られたかのようなゴルフバージョンを取得すべきだと思うことがあります。
ジャレッドK

@JaredKはGroovyまたはClojureを調べます。おそらく、私が一生懸命やってみたら、これを100バイトのグルーヴィーな答えに変えることができるでしょう。
魔法のタコUr

@JaredKここでグルーヴィーで、この同じ答えの近似値だ:{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}
マジックタコ壺
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.