Barra de progresso do tempo de atividade

13

Escreva um programa que analise a saída uptimee gere uma barra de progresso anatomicamente sugestiva (como mostrado) com um comprimento igual ao tempo de atividade atual em dias:

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

(34 dias = 34 sinais de igual)

A resposta mais curta vence.

Magnus Holm
fonte
@dmckee: Obrigado pela edição. No entanto, há um pequeno erro de ortografia: 'um anotomically' deve ler 'anatomically'.
Joey Adams
@ Joey: E eu escrevi errado "anatomicamente" também. Obrigado.
dmckee --- gatinho ex-moderador
5
Hmm, apenas um nitpick, uma "barra de progresso" para algo que não tem um fim conhecido (então, você não pode medir seu progresso) soa estranho. Talvez apenas "bar" seja suficiente?
houbysoft
2
Meu tempo de atividade é de 27 minutos :(
steenslag 13/03/11
1
@userunknown Teve relevância na primeira versão desta pergunta. Dê uma olhada nas edições ...
Gareth

Respostas:

6

Ruby, 39

Não é necessária nenhuma entrada (por descasque):

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

Ou de stdin (40 caracteres):

gets=~/up (\d*)/;puts '8'+'='*$1.to_i+'D'
david4dev
fonte
Reduza em 2 caracteres usando a interpolação de cadeias e um literal de caractere:gets=~/up (\d*)/;puts "8#{?=*$1.to_i}D"
Michael Kohl
A contagem de caracteres é exatamente a mesma, usando interpolação e concatenação neste caso.
David4dev 13/03
Não é, copie-as e cole-as no seu editor: 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 13/03/11
Salve alguns caracteres na última linha: $> <<? 8 +? = * $ 1.to_i +? D
steenslag
5

Bash, 71 caracteres

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

Eu não sou muito para expor meus gen uptimes na internet, então eu estou desenhando uma cerca em seu lugar. É a mesma contagem de caracteres. Pense em redefinir pentre as chamadas.

Pure bash, 71 caracteres, incluindo uptime.

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

Bem, bem, bem ... o meu é maior que o seu.

JB
fonte
Caso não esteja claro: você pode usar o seu idioma favorito, se quiser (não precisa ser apenas uma festa). Devo esclarecer a pergunta?
Magnus Holm
5

Perl - 26 24 caracteres

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

Funcionou assim:

$ 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

edit : Não citado o final 'D' - obrigado JB

jho
fonte
Você pode desmarcar o D.
JB
4

Haskell, 88 caracteres

Como costuma ser o caso, Haskell não oferece a capacidade de golfe mais extrema de outras línguas, mas permite uma expressão elegante das estruturas matemáticas subjacentes ao problema. Com base no trabalho seminal nesse campo, pretendo introduzir uma implementação Haskell do operador de aproximação Holkins-Krahulik . Resumidamente, o operador ignora ambas as entradas e retorna uma função de impressão de falo parametrizada pelo comprimento do eixo.

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

fonte
4

Perl, 17 caracteres
Agora com dizer:

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

Rendimentos

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

foi:

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

Rendimentos

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

(Eu não posso "dizer", infelizmente)

Chris Kaufmann
fonte
3

57 caracteres

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

35 caracteres

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

assim,

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

Editar : era

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

Editar 2 : comentário de JB (use em \vez de '')

Eelvex
fonte
1
Escape do espaço e do asterisco com uma barra invertida em vez de citar 2 caracteres.
JB
3

Windows PowerShell, 28

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

Finalmente

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

produz a saída correta, por isso deve ser capaz de lidar com uptimea saída. Porém, não posso testar, já que o GNUWin32 inclui um problema uptimeque tenta ler de um arquivo inexistente (Nota para pessoas que portam ferramentas Unix: Não tente assumir que o Windows é um Unix e segue os mesmos princípios ou convenções; (nenhum arquivo contém o tempo de inicialização no Windows).

Joey
fonte
3

Lisp comum, 84 caracteres

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

Isso leva a string de tempo de atividade como entrada. Parece que deveria haver um mapeamento de solução mais curto # 'sobre uma lista, mas, se sim, não consigo.

Dr. Pain
fonte
+1 Você raramente vê o Common Lisp usado aqui.
Método Helper
3

GolfScript (24 caracteres)

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

Haskell (73 caracteres)

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

C (131 caracteres)

#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
fonte
seu Golfscript é de 23 caracteres, e não 24. Além disso, você pode reduzi-lo para 16, usando a seleção por índice (sinal de igual):' '/3=~8\'='*'D'
Cristian Lupascu
2

PHP, 62 caracteres

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

Nenhuma entrada é necessária, ela se destaca.

Kevin Brown
fonte
2

Python (42)

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

Nota: Python 3 usado para reduzir a contagem total de caracteres.

aviraldg
fonte
2

Python, 65 bytes

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

teste:

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

PHP, 61

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

Lisp comum, 57 caracteres

(excluindo implementação / shebang específico do SO)

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

Com base em uma tentativa de satisfazer o desejo da resposta do Dr. Pain de uma maneira mais curta de escrever um personagem repetido. Este pode ser usado em um pipeline, como mostrado na pergunta.

(A string de formato especifica para justificar à direita a string vazia (entre ~<e ~>), em um campo de largura especificado por um argumento, preenchido usando o =caractere.)

Kevin Reid
fonte
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
fonte
0

Bash 67 chars

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

invocação para a letra da tarefa:

uptime | ./cg1570uptime-bar.sh

Muito mais curto

apenas 54 caracteres:

com esta variação:

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

invocação, não 100% de acordo com as regras:

./cg1570uptime-bar.sh $(uptime)

saída nos dois momentos:

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

Truques não diários:

 read t u d w

lê 06: 29: 53 = t, up = u, 16 = d descanso ... = w
sem w, tudo até o fim seria colocado em $ d.

O expand é normalmente usado para converter uma guia em uma quantidade de espaços em branco e usa um parâmetro se você não gostar de 8.

Agarrar o terceiro parâmetro com $ 3 in echo -e '\t'|expand -t $3|sed 's/ /=/g'é ainda mais curto, mas precisa de uma invocação, não se ajustando às palavras das regras.

Usuário desconhecido
fonte
0

bash / zenity 38 versão curta, 68 versão mais longa

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

A versão curta termina após $ d, quanto mais tempo levamos em conta que sabemos um valor máximo e gostamos de receber um texto útil:

Zenity da captura de tela como exibição do tempo de atividade

Usuário desconhecido
fonte
0

Gema , 24 caracteres

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

Exemplo de execução:

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
homem a trabalhar
fonte
0

AutoHotkey , 39 bytes

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

Sem entrada. O resultado é enviado para a janela ativa.
O interno A_TickCounté o número de milissegundos desde que o computador foi reiniciado.

Engenheiro Toast
fonte