Bilah Kemajuan Uptime

13

Tulis program yang mem-parsing output uptimedan menghasilkan progress bar yang secara anatomis sugestif (seperti yang ditunjukkan) dengan panjang yang sama dengan uptime saat ini dalam beberapa hari:

$ uptime
23:01  up 34 days,  7:30, 5 users, load averages: 0.23 0.27 0.24
$ uptime|<command>
8==================================D

(34 hari = 34 tanda sama dengan)

Jawaban terpendek menang.

Magnus Holm
sumber
@ dmckee: Terima kasih atas hasil editnya. Namun, ada kesalahan ejaan kecil: 'secara anotomik' harus membaca 'secara anatomis'.
Joey Adams
@ Joey: Dan saya salah mengeja "anatomi" juga. Terima kasih.
dmckee --- ex-moderator kitten
5
Hmm, hanya nitpick, "progress bar" untuk sesuatu yang tidak diketahui ujungnya (jadi, Anda tidak bisa mengukur kemajuannya) terdengar aneh. Mungkin "bar" saja sudah cukup?
houbysoft
2
Waktu aktif saya adalah 27 menit :(
steenslag
1
@userunknown Ada relevansi di versi pertama dari pertanyaan ini. Lihatlah hasil edit ...
Gareth

Jawaban:

6

Ruby, 39

Tidak diperlukan input (dengan cara keluar):

`w`=~/up (\d*)/;puts '8'+'='*$1.to_i+'D'

Atau dari stdin (40 karakter):

gets=~/up (\d*)/;puts '8'+'='*$1.to_i+'D'
david4dev
sumber
Kurangi 2 karakter dengan menggunakan interpolasi string dan literal karakter:gets=~/up (\d*)/;puts "8#{?=*$1.to_i}D"
Michael Kohl
Hitungan karakter sama persis menggunakan interpolasi dan penggabungan dalam kasus ini.
david4dev
Bukan, salin tempelkan ke editor Anda: twitpic.com/49413j
Michael Kohl
'gets=~/up (\d*)/;puts "8#{"="*$1.to_i}D"'.length=="gets=~/up (\d*)/;puts '8'+'='*$1.to_i+'D'".length#true
david4dev
Simpan beberapa karakter di baris terakhir: $> <<? 8 +? = * $ 1.to_i +? D
steenslag
5

Bash, 71 karakter

a=`uptime` a=${a#*p } a=${a%% *};while((a--));do p==$p;done;echo I${p}I

Saya tidak terlalu banyak mengekspos gen saya di internet, jadi saya menggambar pagar sebagai gantinya. Ini jumlah karakter yang sama. Pikirkan mengatur ulang di pantara panggilan.

Bash murni, 71 karakter termasuk uptime.

$ uptime
 23:35:12 up 159 days,  4:15, 15 users,  load average: 1.07, 0.63, 0.38

Well, well, well ... punyaku lebih besar dari milikmu.

JB
sumber
Jika tidak jelas: Anda dapat keluar ke bahasa favorit Anda jika Anda mau (tidak perlu bash murni). Haruskah saya mengklarifikasi pertanyaan?
Magnus Holm
5

Perl - 26 24 karakter

/p (\d+)/;say+8,"="x$1,D

Berlari seperti itu:

$ uptime
 04:52:39 up 17 days, 11:27,  3 users,  load average: 0.21, 0.07, 0.02
$ uptime | perl -nE '/p (\d+)/;say+8,"="x$1,D'
8=================D

sunting : Tidak mengutip final 'D' - terima kasih JB

jho
sumber
Anda dapat tanda kutip D.
JB
4

Haskell, 88 karakter

Seperti yang sering terjadi, Haskell tidak menawarkan golfabilitas paling ekstrim dari beberapa bahasa lain, tetapi memungkinkan ekspresi elegan dari struktur matematika yang mendasari masalah. Membangun kerja mani mereka di bidang ini, saya bertujuan untuk memperkenalkan implementasi Haskell dari operator Pendekatan Holkins-Krahulik . Secara singkat, operator mengabaikan input dan mengembalikan fungsi pencetakan lingga yang diparameterisasi berdasarkan panjang poros.

_⁑≈≈≈⊃_=(\n->concat["8",take n$repeat '=',"D"])
main=interact$(0⁑≈≈≈⊃1).read.(!!2).words

sumber
4

Perl, 17 karakter
Sekarang dengan mengatakan:

say+8,"="x$F[2],D

Hasil

uptime | perl -naE 'say+8,"="x$F[2],D'

dulu:

print"8"."="x$F[2]."D"

Hasil

]# uptime | perl -anle 'print"8"."="x$F[2]."D"'
8=========================D

(Aku tidak bisa "mengatakan", dengan sedih)

Chris Kaufmann
sumber
3

57 karakter

python -c "print'8'+'='*int(raw_input().split()[2])+'D'"
Keith Randall
sumber
3

35 karakter

awk '{printf"#%"$3"sp",p}'|tr \  \*

begitu,

uptime
12:27μμ  up 111 days,  2:36, 1 user, load averages: 0,07 0,03 0,00
uptime | awk '{printf"#%"$3"sp",p}'|tr ' ' '*'

#***************************************************************************************************************p

Edit : tadinya

printf "#%`awk '{print $3}'`sp"|tr ' ' '*'

Sunting 2 : Komentar JB (gunakan \sebagai ganti '')

Eelvex
sumber
1
Melarikan diri dari ruang dan tanda bintang dengan garis miring terbalik alih-alih mengutip untuk 2 karakter.
JB
3

Windows PowerShell, 28

"8$('='*(-split$input)[2])D"

Setidaknya

echo 23:01  up 34 days,  7:30, 5 users, load averages: 0.23 0.27 0.24|powershell -file uptime.ps1 

menghasilkan output yang benar, sehingga harus mampu menangani uptimeoutput. Saya tidak dapat menguji, karena GNUWin32 menyertakan pecahan uptimeyang mencoba membaca dari file yang tidak ada (Catatan untuk orang yang mem-porting alat Unix: Jangan mencoba untuk berasumsi bahwa Windows adalah Unix dan mematuhi prinsip atau konvensi yang sama; ada tidak ada file yang berisi waktu boot di Windows).

Joey
sumber
3

Gangguan Umum, 84 karakter

(defun p(s)(write 8)(loop repeat(read-from-string(subseq s 9))do(write'=))(write'D))

Ini mengambil string uptime sebagai input. Sepertinya harus ada solusi yang lebih pendek memetakan # 'tulis di daftar, tetapi jika demikian saya tidak bisa datang dengan itu.

Dr. Pain
sumber
+1 Anda jarang melihat Common Lisp digunakan di sini.
Metode Pembantu
3

GolfScript (24 karakter)

' '/{(;}3*(\;~'='*8\'D'

Haskell (73 karakter)

main=getLine>>=putStr.('8':).(++"D").(`take`repeat '=').read.(!!2).words

C (131 karakter)

#define r(a);read(0,x,a),
#define p ;putchar(
x[9];main(i){for(r(1)i<3;i+=*x==32)r(9)0
p'8');for(i=atoi((int)x+2);i--p'='))p'D');}
marinus
sumber
Golfscript Anda adalah 23 karakter, bukan 24. Selain itu, Anda dapat mempersingkatnya menjadi 16, menggunakan pilihan dengan indeks (tanda sama dengan):' '/3=~8\'='*'D'
Cristian Lupascu
2

PHP, 62 karakter

<?$d=split(" ",`uptime`);echo 8;while($d[3]--)echo"=";echo"D";

Tidak diperlukan input, itu keluar.

Kevin Brown
sumber
2

Python (42)

print('8'+int(input().split()[2])*"="+'D')

Catatan: Python 3 digunakan untuk mengurangi jumlah karakter total.

aviraldg
sumber
2

Python, 65 Bytes

import sys
print '8'+'='*int(sys.stdin.readline().split()[2])+'D'

uji:

echo '23:01  up 34 days,  7:30, 5 users, load averages: 0.23 0.27 0.24'|./time.py
8==================================D
0b1t
sumber
1

PHP, 61

<?$n=split(' ',$argv[1]);$v=8;while($n[2]--)$v.'=';echo"$vD";
l0n3sh4rk
sumber
1

Gangguan Umum, 57 karakter

(tidak termasuk implementasi / shebang khusus OS)

#!/opt/local/bin/sbcl --script
(do()((eql(read-char)#\p)(format t"8~v,,,'=<~>D"(read))))

Berdasarkan upaya untuk memuaskan jawaban Dr. Pain harapan cara yang lebih singkat untuk menulis karakter yang berulang. Yang ini dapat digunakan dalam pipa seperti yang ditunjukkan dalam pertanyaan.

(Format string menentukan untuk membenarkan kanan string kosong (antara ~<dan ~>), dalam bidang lebar yang ditentukan oleh argumen, diisi menggunakan =karakter.)

Kevin Reid
sumber
1

K, 35

-1"8",(("I"$(" "\:0:0)@3)#"="),"D";

.

$ uptime
17:21:47 up 242 days,  7:22, 35 users,  load average: 0.33, 0.34, 0.44
$ uptime | q t.k
8============================================================================ ...
tmartin
sumber
0

Bash 67 karakter

read t u d w
echo -e '\t'|expand -t $d|sed 's/^/8/;s/ /=/g;s/$/B/;'

doa surat penugasan:

uptime | ./cg1570uptime-bar.sh

Jauh lebih pendek

hanya 54 karakter:

dengan variasi ini:

echo -e '\t'|expand -t $3|sed 's/^/8/;s/ /=/g;s/$/B/;'

doa, tidak 100% sesuai dengan aturan:

./cg1570uptime-bar.sh $(uptime)

output di kedua kali:

uptime && uptime | ./cg1570uptime-bar.sh 
06:29:53 up 16 days, 21:03, 10 users,  load average: 1.29, 1.34, 1.23
8================B

Trik non-sehari-hari:

 read t u d w

berbunyi 06: 29: 53 = t, naik = u, 16 = d istirahat ... = w
tanpa w, semuanya sampai akhir akan dimasukkan ke dalam $ d.

expand biasanya digunakan untuk menerjemahkan tab ke dalam jumlah yang kosong dan mengambil parameter jika Anda tidak suka 8.

Mengambil parameter ke-3 dengan $ 3 echo -e '\t'|expand -t $3|sed 's/ /=/g'bahkan lebih pendek, tetapi membutuhkan doa, tidak sesuai dengan kata-kata aturan.

Pengguna tidak diketahui
sumber
0

bash / zenity 38 versi pendek, 68 versi lebih panjang

read c o d e
zenity --scale --value=$d --max-value=497 --text=uptime

Versi singkat berakhir setelah $ d, semakin lama memperhitungkan bahwa kita tahu nilai maksimum dan ingin memiliki teks bermanfaat:

Tangkapan layar zenity sebagai tampilan uptime

Pengguna tidak diketahui
sumber
0

Gema , 24 karakter

<D> d=8@repeat{$1;=}D;?=

Contoh dijalankan:

bash-4.4$ uptime
 18:35:31 up 13 days,  7:53, 16 users,  load average: 0.31, 0.85, 1.24

bash-4.4$ uptime | gema '<D> d=8@repeat{$1;=}D;?='
8=============D
manatwork
sumber
0

AutoHotkey , 39 byte

d:=A_TickCount//=8.64e+7
Send 8{= %d%}D

Tidak ada input Hasilnya dikirim ke jendela aktif.
Built-in A_TickCountadalah jumlah milidetik sejak komputer di-boot ulang.

Toast insinyur
sumber