crear una barra de progreso ascii

12

bueno, es algo similar a esta pregunta pero con algunas pequeñas diferencias. tienes que escribir un programa para pedir el ancho de la barra de progreso y cuánto trabajo se realiza. y luego dibuje una barra de progreso con las siguientes características:

  • ancho indica cuántos caracteres tiene que usar para dibujar la barra de progreso

  • El progreso se da a través de un valor de coma flotante entre 0..1.

  • el primer y último carácter en la barra de progreso debe ser algo diferente de todos los demás caracteres, por ejemplo "[" y "]"

  • su programa debe usar dos caracteres diferentes para la cantidad de progreso que pasó desde el inicio

  • tienes que escribir cuánto trabajo se hace justo en el medio de la barra de progreso, usando un número decimal + signo "%".

punto de bonificación por manejar entradas extremas, como 150% o -5% de trabajo realizado.

Número de caracteres de puntuación * (1 sin bonificación o 0,75 de ancho)

algunos ejemplos de salidas válidas

79 0.15
[||||||||||||                         15%                                     ]

25 0.76
[##########76%#####.....]

39 -0.12
[                 -12%                 ]

25 7.6
[##########760%#########]
Ali1S232
fuente
¿Cómo se toma la entrada? ¿Línea de comando? Stdin? ¿Cualquiera de los anteriores?
lochok
@lochok Supongo que stdin sería una mejor opción.
Ali1S232

Respuestas:

3

PHP 84 x 0.75 = 63

Editar: una versión menos 'bonita', pero debe ser válida de acuerdo con las reglas:

[<?=str_pad(!fscanf(STDIN,~Ú›Ú™,$a,$b),$a*min(1,$b),~ß)|str_pad(100*$b.~Ú,$a,_,2)?>]

Salida:

$ echo 79 0.15 | php progress-bar.php
[⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂___________________________15%______________________________________]
$ echo 25 0.76 | php progress-bar.php
[⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂76%⌂⌂⌂⌂⌂______]
$ echo 39 -0.12 | php progress-bar.php
[_________________-12%__________________]
$ echo 25 7.6 | php progress-bar.php
[⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂760%⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂]


Original (98 x 0.75 = 73.5)

[<?=strtr(str_pad(!fscanf(STDIN,~Ú›Ú™,$a,$b),$a*min(1,$b),~ß)|str_pad(100*$b.~Ú,$a,~ü,2),~ü,~ß)?>]

Salida:

$ echo 79 0.15 | php progress-bar.php
[###########                           15%                                      ]
$ echo 25 0.76 | php progress-bar.php
[###########76%#####      ]
$ echo 39 -0.12 | php progress-bar.php
[                 -12%                  ]
$ echo 25 7.6 | php progress-bar.php
[##########760%###########]
primo
fuente
Me pregunto cómo puedo ejecutar su código.
Ali1S232
Guárdelo como un archivo php. Envíele los dos parámetros como una cadena separada por espacios como STDIN. Por ejemplo: [símbolo del sistema de Windows / Linux] echo 79 0.15 | php progress-bar.php Deberá tener instalado php-cli (interfaz de línea de comandos). La mayoría de los instaladores de PHP para Windows deberían tenerlo incluido (u opcional), Linux con apt-get install php5-cli
primo
He seleccionado esta respuesta desde el momento en que probé, esta siempre funcionó como se esperaba, mientras que una que brindó Ephemient a veces no imprime el número exactamente en el medio.
Ali1S232
4

J, 78 × 0,75 = 58,5

'w p'=:_".1!:1]3
1!:2&4('%',~":100*p)(i.@[-<.@-:@-)&#}'[]'0 _1}' |'{~(w*p)>i.w
$ echo -n 79 0,15 | jconsole test.ijs
[||||||||||| 15% ]
$ echo -n 25 0.76 | jconsole test.ijs
[|||||||||| 76% ||||| ]   
$ echo -n 39-0,12
[_12%]
$ echo -n 25 7.6 | jconsole test.ijs
[||||||||| 760% ||||||||||]   

(Los números negativos en J tienen el prefijo _, no -. Afortunadamente, la diádica ".puede analizar ambos formatos).

efímero
fuente
¿Esto excluye el espacio ocupado por el porcentaje cuando calcula el número de barras para mostrar? Porque parece obtener resultados diferentes de los míos.
grc
@grc Con 100 columnas, cada porcentaje es una sola barra (incluso si está oculto por otros elementos como los corchetes o el número / porcentaje).
Ephemient
Está bien lo entiendo ahora. Buen trabajo :)
grc
@ephemient ahora he notado en el caso -0.12, está imprimiendo 18 espacios en la parte izquierda y 16 en la parte derecha. significa _12%que no está exactamente en el medio.
Ali1S232
3

Perl, 96 × ¾ = 72

#!/usr/bin/perl -ap
formline'[@'.'|'x($F[0]-3).']',100*$F[1].'%';
$_=$^A;s# |(.)#$1//($-[0]<$F[0]*$F[1]?'|':$&)#eg

Eso es según las reglas tradicionales de golf de Perl ( #!línea no contada, excepto para los -interruptores y si los hay)

$ echo 79 0.15 | perl test.pl
[||||||||||| 15% ]
$ echo 25 0.76 | perl test.pl
[|||||||||| 76% ||||| ]
$ echo 39 -0,12 | perl test.pl
[-12%]
$ echo 25 7.6 | perl test.pl
[||||||||| 760% ||||||||||]
efímero
fuente
2

Ruby - puntuación 93 (124 caracteres)

w=gets.to_i-2
f=$_[/ .+/].to_f
e=f<0?0:f>1?w:(f*w).to_i
b='#'*e+' '*(w-e)
b[(w-l=(s='%d%'%(100*f)).size)/2,l]=s
puts"[#{b}]"

Otra implementación más de rubí. Lee la entrada de STDIN en la forma descrita anteriormente. Es posible intercambiar los personajes '#', ' 'y '[', ']'directamente en el código.

45 0.88
[####################88%##############      ]

60 1.22
[###########################122%###########################]
Howard
fuente
esto es siempre dos caracteres demasiado amplios
Patrick Oscity
@padde ¿Por qué crees que son dos caracteres demasiado anchos? Hay un -2 en la primera línea.
Howard
2

Python - 158 155 148 143 138 caracteres (puntuación de 103,5)

x,y=raw_input().split()
x=int(x)-2
y=float(y)
p=`int(y*100)`+"%"
b="|"*int(x*y+.5)+" "*x
print"["+b[:(x-len(p))/2]+p+b[(x+len(p))/2:x]+"]"

Podría tener 30 caracteres menos si la entrada se separa con una coma.

grc
fuente
¿Por qué no lo usaste r=p.length()?
Ali1S232
¿Qué quieres decir?
grc
nada mal, solo entendí mal tu código.
Ali1S232
pero su código no parece manejar el caso -12%.
Ali1S232
¿Qué se supone que debe hacer? Por el momento, solo imprime una barra vacía con el porcentaje.
grc
1

Q, 90 caracteres, sin bonificación

{-1 @[x#" ";(1+(!)(_)x*y;0;((_)x%2)+(!)(#)($)a;x-1);:;("|";"[";a:,[;"%"]($)(100*y);"]")];}

uso

q){-1 @[x#" ";(1+(!)(_)x*y;0;((_)x%2)+(!)(#)($)a;x-1);:;("|";"[";a:,[;"%"]($)(100*y);"]")];}[50;0.15]
[|||||||                 15%                     ]

q){-1 @[x#" ";(1+(!)(_)x*y;0;((_)x%2)+(!)(#)($)a;x-1);:;("|";"[";a:,[;"%"]($)(100*y);"]")];}[30;0.35]
[||||||||||    35%           ]

q){-1 @[x#" ";(1+(!)(_)x*y;0;((_)x%2)+(!)(#)($)a;x-1);:;("|";"[";a:,[;"%"]($)(100*y);"]")];}[40;0.85]
[|||||||||||||||||||85%||||||||||||    ]
tmartin
fuente
1

Scala 149:

val w=readInt 
val p=readFloat
println(("["+"|"*(p*w).toInt+" "*((w-p*w).toInt)+"]").replaceAll("(^.{"+(w/2-3)+"}).{5}","$1 "+(p*100).toInt+("% ")))

sin golf:

def progressbar (width: Int, pos: Double) {
  println ((
    "["+
    "|"*(pos*width).toInt+
    " "*((width-pos*width).toInt)+
    "]").
    replaceAll ("(^.{" + (width/2-3) + "}).{5}", "$1 " + (p * 100).toInt + ("% ")))}
}

Decidí que, para facilitar la lectura, realmente necesitas un espacio alrededor del número de progreso:

(44 to 54).map (x => b (100, x/100.0))
[||||||||||||||||||||||||||||||||||||||||||||   44%                                                  ]
[|||||||||||||||||||||||||||||||||||||||||||||  45%                                                  ]
[|||||||||||||||||||||||||||||||||||||||||||||| 46%                                                  ]
[|||||||||||||||||||||||||||||||||||||||||||||| 47%                                                  ]
[|||||||||||||||||||||||||||||||||||||||||||||| 48%                                                  ]
[|||||||||||||||||||||||||||||||||||||||||||||| 49%                                                  ]
[|||||||||||||||||||||||||||||||||||||||||||||| 50%                                                  ]
[|||||||||||||||||||||||||||||||||||||||||||||| 51%                                                  ]
[|||||||||||||||||||||||||||||||||||||||||||||| 52% |                                                ]
[|||||||||||||||||||||||||||||||||||||||||||||| 53% ||                                               ]
[|||||||||||||||||||||||||||||||||||||||||||||| 54% |||                                              ]
usuario desconocido
fuente
1

C, 145 caracteres, puntaje = 108.75

float p;s;m;char x[99];main(){scanf("%d%f",&s,&p);sprintf(x+s/2-1,"%.0f%%",p*100);for(;m<s;)x[++m]||(x[m]=m<p*s?35:32);x[s-1]=93;*x=91;puts(x);}
marinus
fuente
aunque realmente me gustó su idea de sprintf, pero genera un problema menor, verifique su programa con las 20 1entradas que generará la salida de, [#######100%######]en este caso hay 7 objetos punzantes a la izquierda del número y 5 objetos punzantes a la derecha, por lo que el número impreso no está exactamente en la mitad.
Ali1S232
1

node.js: 135 caracteres, * 0.75 para puntos de bonificación, entonces 101.25 caracteres.

a=process.argv,i=a[2],p=a[3],o=i/2|0,f=i-i*p,x=['['];for(;i--;){x.push((i<f?' ':'|')+(i-o?'':p*100+'%'));}console.log(x.join('')+']');

sin golf:

a = process.argv, // console inputs
i = a[2], // input 1 -> width
p = a[3], // input 2 -> percent complete
o = i / 2 | 0, // half of i, without any decimal places
f = i - i * p, // how far along the bar to draw spaces
x = ['[']; // start an array
while(i--){ // while i > 0
    x.push( // add to the array
    (i < f ? ' ' : '|') // a space, or | depending on how far along the bar we are
    + (i - o ? '' : p * 100 + '%')); // and if we're halfway, add the percentage complete
}
console.log(x.join('') + ']'); // then write out the array as a string, with a trailing ]

salida:

D:\mercurial\golf\ascii>node progressBar.js 25 7.6
[|||||||||||||760%||||||||||||]

D:\mercurial\golf\ascii>node progressBar.js 39 -0.12
[                    -12%                   ]

D:\mercurial\golf\ascii>node progressBar.js 79 0.15
[|||||||||||                             15%                                       ]
Ed James
fuente
1

PHP-128x0.75 => 96

<?fscanf(STDIN,'%d%d',$w,$p);$v='[';for($i=1;$i<$w-1;)$v.=($i++==$w/2-1)?$p*($i+=2)/$i.'%':(($i<$w*$p/100)?'|':' ');echo"$v]";?>

<?fscanf(STDIN,'%d%f',$w,$p);$v='[';for($i=1;$i<$w-1;)$v.=($i++==$w/2-1)?$p*100*($i+=2)/$i.'%':(($i<$w*$p)?'|':' ');echo"$v]";?>

C, 149 * 0.75 = 111.75

main(w,i){float p;for(i=printf("[",scanf("%d%f",&w,&p));i<w-1;)(i++==w/2-1)?printf("%.0f%%",p*100*(i+=2)/i):printf("%c",i<=(p*w)?'|':' ');puts("]");}

Salida:

80
0.75
[||||||||||||||||||||||||||||||||||||||75%||||||||||||||||||                   ]

80
7.60
[||||||||||||||||||||||||||||||||||||||760%|||||||||||||||||||||||||||||||||||||]


80
-0.12
[                                      -12%                                     ]
l0n3sh4rk
fuente
p debería ser un valor de coma flotante, entre 0..1
Ali1S232
@Gajet gracias por avisarnos. Ha sido rectificado :)
l0n3sh4rk
0

JavaScript 127 125, sin bonificación

l=9,p="0.99",f=l*p|0,m=l/2|0,x=["]"];for(;l--;)x.unshift(l>=f?"-":"+");x[m++]=p[2],x[m++]=p[3],x[m]="%";alert("["+x.join(""))
//[+++99%++-]

Uso: cambio l=9con otra longitud y / o cambio p="0.99"con otro porcentaje

Nota: termina con cero en 0.X0lugar de0.X

ajax333221
fuente
0

MATL , puntaje 35.25 (47 * 0.75)

qqtl&O61bti*Xl:(HG100*V37hyn2/kyny+q&:(91w93v!c

Pruébalo en línea!

Explicación:

         % implicit input, say w = 79
qq       % decrement input by 2 (to allow brackets on either side)
tl&O     % duplicate and create array with that many zeros
61       % Push '=' character
b        % bubble up w-2 from below
ti*      % duplicate and multiply by second input, say p = 0.15
         %  stack: [[0;0;0;...;0], 61, 77, 11.55]
Xl       % take minimum of (w-2) and (w-2)*p
         %  (used when p > 1, makes eligible for bonus)
:        % create range 1 to that value 
         %  stack: [[0;0;0;...;0], 61, [1 2 3 4 5 ... 11]]
(        % assign into the first array the value 61 ('=') at the 
         %  indices denoted by the third array
HG       % push second input again
100*V    % multiply by 100 and convert to string
37h      % append the '%' symbol to it
yn2/k    % compute half of the length of the output array
yny+q    % copy of that + length of the 'N%' string - 1
         % stack: [[61;61;61;...;0;0;0], '15%', 38, 40]
&:       % make a range from the first to the second (38 to 40)
(        % assign the 'N%' string at those places into the output array
91w93    % surround by '[' (ASCII 91) and ']' (93) characters
v!       % combine into a single array, make it horizontal for display, 
c        % change it to character type (implicitly displayed)
sundar - Restablecer a Monica
fuente
0

Excel VBA, 108 * .75 = 81 bytes

Una función que toma la entrada de [A1]y [B1]y da salida a la consola

s=""&[MID(IFERROR(REPT("",A1*B1),"")&REPT("",A1),2,A1-2)]&"":n=100*[B1]:Mid(s,([A1]-len(n))/2)=n &"%":?s

Salida

con entrada [A1]=25y[B1]=.76

76%

Con entrada [A1:B1].Resize(1,2)=Split("32 -.5")

-50%

Con entrada [A1:B1].Resize(1,2)=Split("40 10.01")

1001%
Taylor Scott
fuente