créer une barre de progression ascii


12

eh bien, c'est quelque chose de similaire à cette question mais avec quelques petites différences. vous devez écrire un programme pour demander la largeur de la barre de progression et la quantité de travail effectuée. puis dessinez une barre de progression avec les fonctionnalités suivantes:

  • La largeur indique le nombre de caractères à utiliser pour dessiner la barre de progression

  • la progression est donnée via une valeur à virgule flottante entre 0..1.

  • le premier et le dernier caractère de la barre de progression doivent être différents de tous les autres caractères, par exemple "[" et "]"

  • votre programme doit utiliser deux caractères différents pour savoir combien de progrès sont passés depuis le début

  • vous devez écrire combien de travail est effectué en plein milieu de la barre de progression, en utilisant un nombre décimal + signe "%".

point bonus pour la gestion des intrants extrêmes, tels que 150% ou -5% de travail effectué.

marquant le nombre de caractères * (1 sans bonus ou 0,75 largeur bonus)

quelques exemples de sorties valides

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

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

39 -0.12
[                 -12%                 ]

25 7.6
[##########760%#########]

Comment les contributions sont-elles prises? Ligne de commande? Stdin? Tout ce qui précède?
lochok

@lochok Je suppose que stdin serait un meilleur choix.
Ali1S232

Réponses:


3

PHP 84 x 0,75 = 63

Edit: Une version moins 'jolie', mais elle devrait être valide selon les règles:

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

Production:

$ 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),~ü,~ß)?>]

Production:

$ 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%###########]

Je me demande comment puis-je exécuter votre code.
Ali1S232

Enregistrez-le en tant que fichier php. Envoyez-lui les deux paramètres sous la forme d'une chaîne séparée par des espaces au format STDIN. Par exemple: [invite de commande windows / linux] echo 79 0.15 | php progress-bar.php Vous devrez avoir installé php-cli (interface de ligne de commande). La plupart des programmes d'installation php pour Windows devraient l'inclure (ou facultatif), linux avec apt-get install php5-cli
primo

J'ai choisi cette réponse car pour autant que je l'ai testée, celle-ci a toujours fonctionné comme prévu, tandis que celle fournie par l'éphémère n'imprime pas toujours le nombre exactement au milieu.
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% ||||||||||]   

(Les nombres négatifs dans J sont préfixés par _, non -. Heureusement, dyadic ".peut analyser les deux formats.)


Cela exclut-il l'espace pris par le pourcentage lorsqu'il calcule le nombre de barres à afficher? Parce qu'il semble obtenir des résultats différents des miens.
grc

@grc Avec 100 colonnes, chaque pourcentage est une seule barre (même s'il est masqué par d'autres éléments tels que les crochets ou le nombre / pourcentage).
éphémère

D'accord, je comprends maintenant. Bon travail :)
grc

@ephemient maintenant j'ai remarqué que dans le cas -0.12, vous imprimez 18 espaces à gauche et 16 à droite. cela signifie _12%n'est pas exactement au milieu.
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

C'est selon les règles traditionnelles du golf Perl ( #!ligne non comptée, sauf pour les -commutateurs et le cas échéant).

écho $ 79 0,15 | perl test.pl
[||||||||||| 15%]
écho $ 25 0,76 | perl test.pl
[|||||||||| 76% ||||| ]
écho $ 39 -0,12 | perl test.pl
[-12%]
$ echo 25 7,6 | perl test.pl
[||||||||| 760% ||||||||||]

2

Ruby - score 93 (124 caractères)

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}]"

Encore une autre implémentation rubis. Lit l'entrée de STDIN sous la forme décrite ci-dessus. Vous pouvez échanger des caractères '#', ' 'et '[', ']'directement dans le code.

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

60 1.22
[###########################122%###########################]

c'est toujours deux caractères trop larges
Patrick Oscity

@padde Pourquoi pensez-vous que c'est deux caractères trop larges? Il y a un -2 dans la première ligne.
Howard

2

Python - 158 155 148 143 138 caractères (score 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]+"]"

Il pourrait être plus court de 30 caractères si l'entrée était séparée par une virgule.


pourquoi n'avez-vous pas utilisé r=p.length()?
Ali1S232

Que voulez-vous dire?
grc

rien de mal, j'ai juste mal compris votre code.
Ali1S232

mais votre code ne semble pas gérer le cas de -12%.
Ali1S232

Que faut-il faire? Pour le moment, il imprime simplement une barre vide avec le pourcentage.
grc

1

Q, 90 caractères, pas de bonus

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

usage

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

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+("% ")))

non golfé:

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

J'ai décidé, pour plus de lisibilité, vous avez vraiment besoin d'un espace autour du numéro de progression:

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

1

C, 145 caractères, score = 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);}

bien que j'aie vraiment aimé votre idée de sprintf, mais cela génère un problème mineur, vérifiez votre programme avec des 20 1entrées, il générera une sortie de [#######100%######]dans ce cas, il y a 7 objets tranchants à gauche du nombre et 5 objets tranchants à droite, donc le nombre imprimé n'est pas exactement dans le milieu.
Ali1S232

1

node.js: 135chars, * 0,75 pour les points bonus, donc 101,25chars.

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('')+']');

non 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 ]

production:

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

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("]");}

Production:

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

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


80
-0.12
[                                      -12%                                     ]

p devrait être une valeur à virgule flottante, entre 0..1
Ali1S232

@Gajet merci d'avoir signalé. A été rectifié :)
l0n3sh4rk

0

Javascript 127 125, pas de bonus

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%++-]

Utilisation: modification l=9avec une autre longueur et / ou modification p="0.99"avec un autre pourcentage

Remarque: terminez par zéro 0.X0au lieu de0.X


0

MATL , score 35,25 (47 * 0,75)

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

Essayez-le en ligne!

Explication:

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

0

Excel VBA, 108 * 0,75 = 81 octets

Une fonction qui accepte une entrée à partir de [A1]et [B1]et délivre en sortie à la console

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

Production

avec entrée [A1]=25et[B1]=.76

76%

Avec entrée [A1:B1].Resize(1,2)=Split("32 -.5")

-50%

Avec entrée [A1:B1].Resize(1,2)=Split("40 10.01")

1001%
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.