Uptime Progress Bar


13

Напишите программу, которая анализирует выходные данные uptimeи генерирует анатомически предположительный индикатор выполнения (как показано) с длиной, равной текущему времени безотказной работы в днях:

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

(34 дня = 34 знака равенства)

Кратчайший ответ выигрывает.


@dmckee: Спасибо за редактирование. Однако есть небольшая орфографическая ошибка: «анотомически» следует читать «анатомически».
Джои Адамс

@Joey: И я тоже написал "анатомически" с ошибкой. Благодарю.
dmckee --- котенок экс-модератора

5
Хм, просто придирка, «индикатор прогресса» для чего-то, у кого нет известного конца (так что вы не можете измерить его прогресс), звучит странно. Может быть, просто "бар" будет достаточно?
Houbysoft


1
@userunknown Это имело отношение к первой версии этого вопроса. Посмотрите на правки ...
Гарет

Ответы:


6

Руби, 39

Не требуется ввод (обстрел):

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

Или из стандартного ввода (40 символов):

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

Уменьшите на 2 символа, используя интерполяцию строк и символьный литерал:gets=~/up (\d*)/;puts "8#{?=*$1.to_i}D"
Michael Kohl

В этом случае количество символов точно такое же, используя интерполяцию и конкатенацию.
david4dev

Это не так, скопируйте и вставьте их в свой редактор: twitpic.com/49413j
Майкл Коль

'gets=~/up (\d*)/;puts "8#{"="*$1.to_i}D"'.length=="gets=~/up (\d*)/;puts '8'+'='*$1.to_i+'D'".length#true
david4dev

Сохраните несколько символов в последней строке: $> <<? 8 +? = * $ 1.to_i +? D
steenslag

5

Баш, 71 символов

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

Я не так сильно выставляю свои генераторных uptimes в Интернете, поэтому я рисую забор вместо этого. Это то же количество символов. Подумайте о сбросе pмежду вызовами.

Pure Bash, 71 символов, включая uptime .

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

Ну, хорошо, хорошо ... мой больше, чем твой.


В случае, если неясно: вы можете раскошелиться на ваш любимый язык, если хотите (это не обязательно должен быть чистый bash). Должен ли я уточнить вопрос?
Магнус Холм

5

Perl - 26 24 символа

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

Побежал так:

$ 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

редактировать : без кавычек финал 'D' - спасибо JB


Вы можете удалить цитату из D.
JB

4

Haskell, 88 символов

Как это часто бывает, Haskell не предлагает наиболее экстремальных возможностей игры в гольф из некоторых других языков, но допускает элегантное выражение математических структур, лежащих в основе проблемы. Опираясь на их основополагающую работу в этой области, я намерен представить реализацию Haskell оператора Приближения Холкинса-Крахулика . Вкратце, оператор игнорирует оба своих ввода и возвращает функцию печати фаллосом, параметризованную длиной вала.

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

4

Perl, 17 символов
Теперь скажем:

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

Урожайность

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

было:

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

Урожайность

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

(Я не могу "сказать", к сожалению)



3

35 персонажей

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

так,

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

Изменить : было

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

Редактировать 2 : комментарий JB (используйте \вместо '')


1
Избегайте пробела и звездочки с обратной косой чертой вместо цитирования 2 символов.
JB

3

Windows PowerShell, 28

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

По крайней мере

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

дает правильный вывод, поэтому он должен иметь возможность обрабатывать uptimeвывод. Однако я не могу протестировать, поскольку в GNUWin32 входит сломанный uptimeфайл, который пытается прочитать из несуществующего файла (Примечание для людей, портирующих инструменты Unix: не пытайтесь предположить, что Windows является Unix и придерживается тех же принципов или соглашений; нет файла, содержащего время загрузки в Windows).


3

Common Lisp, 84 персонажа

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

Это принимает строку uptime в качестве входных данных. Кажется, что должно быть более короткое решение, отображающее # ', пишите по списку, но если это так, я не могу придумать его.


+1 Вы редко видите здесь используемый Common Lisp.
вспомогательный метод

3

GolfScript (24 символа)

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

Haskell (73 символа)

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

C (131 символ)

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

ваш Golfscript составляет 23 символа, а не 24. Кроме того, вы можете сократить его до 16, используя выбор по индексу (знак равенства):' '/3=~8\'='*'D'
Кристиан Лупаску

2

PHP, 62 символа

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

Вход не требуется, он выкладывается.


2

Python (42)

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

Примечание: Python 3 используется для уменьшения общего количества символов.


2

Python, 65 байт

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

тестовое задание:

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


1

Common Lisp, 57 символов

(исключая реализацию / специфичный для ОС шебанг)

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

На основании попытки удовлетворить ответ доктора Пэйна на более короткий путь написания повторяющегося символа. Этот можно использовать в конвейере, как показано в вопросе.

(Строка формата указывает выравнивание по правому краю пустой строки (между ~<и ~>) в поле ширины, заданном аргументом, дополненном =символом.)


1

К, 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============================================================================ ...

0

Баш 67 символов

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

Призыв к письму о назначении:

uptime | ./cg1570uptime-bar.sh

Намного короче

всего 54 символа:

с этим вариантом:

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

вызов, не 100% в соответствии с правилами:

./cg1570uptime-bar.sh $(uptime)

вывод в оба раза:

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

Не повседневные трюки:

 read t u d w

читает 06: 29: 53 = t, up = u, 16 = d rest ... = w
без w, все до конца будет помещено в $ d.

Расширение обычно используется для перевода табуляции в количество пробелов и принимает параметр, если вам не нравится 8.

Захват 3-го параметра с $ 3 echo -e '\t'|expand -t $3|sed 's/ /=/g'еще короче, но требует вызова, не подходящего под слова правил.


0

короткая версия bash / zenity 38, более длинная версия 68

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

Короткая версия заканчивается после $ d, тем дольше учитывается, что мы знаем максимальное значение и хотели бы получить полезный текст:

Скриншот zenity как отображение времени работы


0

Гема , 24 персонажа

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

Образец прогона:

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

0

AutoHotkey , 39 байт

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

Нет ввода. Результат отправляется в активное окно.
Встроенная A_TickCount- это количество миллисекунд с момента перезагрузки компьютера.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.