Erstellen Sie einen ASCII-Fortschrittsbalken


12

Nun, es ist etwas Ähnliches wie diese Frage, aber mit kleinen Unterschieden. Sie müssen ein Programm schreiben, um die Breite des Fortschrittsbalkens und den Arbeitsaufwand abzufragen. und zeichnen Sie dann einen Fortschrittsbalken mit folgenden Funktionen:

  • width gibt an, wie viele Zeichen Sie zum Zeichnen des Fortschrittsbalkens verwenden müssen

  • Fortschritt wird über einen Gleitkommawert zwischen 0..1 angegeben.

  • Das erste und letzte Zeichen in der Statusleiste sollte sich von allen anderen Zeichen unterscheiden, z. B. "[" und "]".

  • Ihr Programm sollte zwei verschiedene Zeichen verwenden, um festzustellen, wie viel Fortschritt seit dem Start vergangen ist

  • Sie müssen genau in der Mitte des Fortschrittsbalkens mit einer Dezimalzahl + "%" schreiben, wie viel Arbeit erledigt wird.

Bonuspunkt für den Umgang mit extremen Eingaben wie 150% oder -5% geleisteter Arbeit.

Wertung der Anzahl der Zeichen * (1 ohne Bonus oder 0,75 Breite Bonus)

Einige Beispiele für gültige Ausgaben

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

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

39 -0.12
[                 -12%                 ]

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

Wie erfolgt die Eingabe? Befehlszeile? Stdin? Irgendwelche der oben genannten?
Lochok

@lochok Ich denke, stdin wäre eine bessere Wahl.
Ali1S232

Antworten:


3

PHP 84 x 0,75 = 63

Bearbeiten: Eine weniger "hübsche" Version, aber es sollte nach den Regeln gültig sein:

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

Ausgabe:

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

Ausgabe:

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

Ich frage mich, wie ich Ihren Code ausführen kann.
Ali1S232

Speichern Sie es als PHP-Datei. Senden Sie die beiden Parameter als durch Leerzeichen getrennte Zeichenfolge als STDIN. Beispiel: [Windows / Linux-Eingabeaufforderung] echo 79 0.15 | php progress-bar.php Sie müssen das php-cli (Kommandozeileninterface) installiert haben. Die meisten PHP-Installer für Windows sollten es enthalten haben (oder optional), Linux mit apt-get install php5-cli
primo

Ich habe diese Antwort ausgewählt, da diese, soweit ich sie getestet habe, immer wie erwartet funktioniert hat, während eine, die ephemient bereitgestellt wurde, die Zahl manchmal nicht genau in die Mitte druckt.
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% ||||||||||]   

(Negative Zahlen in J sind mit vorangestellter _, nicht -. Zum Glück dyadic ".beiden Formate analysieren kann.)


Schließt dies den Platz aus, den der Prozentsatz einnimmt, wenn er die Anzahl der anzuzeigenden Balken berechnet? Weil es scheint, dass es andere Ergebnisse als meine gibt.
Grc

@grc Bei 100 Spalten ist jedes Prozent ein einzelner Balken (auch wenn er von anderen Elementen wie eckigen Klammern oder Zahl / Prozent verborgen wird).
ephemient

Okay, ich verstehe es jetzt. Gute Arbeit :)
Grc

@ephemient jetzt habe ich in -0.12 Fall bemerkt, dass Sie 18 Stellen am linken Teil und 16 am rechten Teil drucken. es heißt _12%nicht genau in der mitte.
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

Dies erfolgt nach den traditionellen Perl-Golfregeln ( #!Linie wird mit Ausnahme der -Schalter und, falls vorhanden, nicht gezählt ).

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

2

Ruby - Score 93 (124 Zeichen)

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

Noch eine Ruby-Implementierung. Liest die Eingabe von STDIN in der oben beschriebenen Form. Sie können Zeichen austauschen '#', ' 'und '[', ']'direkt im Code.

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

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

Dies ist immer zwei Zeichen zu breit
Patrick Oscity

@padde Warum denkst du, sind zwei Zeichen zu breit? In der ersten Zeile steht ein -2.
Howard

2

Python - 158 155 148 143 138 Zeichen (103,5 Punkte)

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

Es kann 30 Zeichen kürzer sein, wenn die Eingabe durch ein Komma getrennt ist.


warum hast du nicht verwenden r=p.length()?
Ali1S232

Was meinen Sie?
grc

nichts schlimmes, ich habe dich einfach falsch verstanden.
Ali1S232

Ihr Code scheint jedoch nicht mit -12% Groß- / Kleinschreibung umzugehen.
Ali1S232

Was soll es tun? Momentan wird nur ein leerer Balken mit dem Prozentsatz gedruckt.
grc

1

Q, 90 Zeichen, kein Bonus

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

Verwendung

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

ungolfed:

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

Aus Gründen der Lesbarkeit brauchst du unbedingt ein Leerzeichen um die Fortschrittszahl:

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

1

C, 145 Zeichen, Punktzahl = 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);}

Obwohl mir Ihre Idee von sprintf sehr gut gefallen hat, aber es gibt ein kleines Problem. Überprüfen Sie Ihr Programm mit 20 1Eingaben. [#######100%######]In diesem Fall wird eine Ausgabe von 7 Scharfen links von der Zahl und von 5 Scharfen rechts generiert die Mitte.
Ali1S232

1

node.js: 135 Zeichen, * 0,75 für Bonuspunkte, also 101,25 Zeichen.

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

ungolfed:

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 ]

Ausgabe:

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

Ausgabe:

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

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


80
-0.12
[                                      -12%                                     ]

p sollte ein Gleitkommawert zwischen 0..1
Ali1S232

@Gajet danke, dass du darauf aufmerksam gemacht hast. Wurde behoben :)
l0n3sh4rk

0

JavaScript 127 125, kein 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%++-]

Verbrauch: Ändern Sie l=9mit anderer Länge und / oder ändern Sie p="0.99"mit anderem Prozent

Hinweis: Beenden Sie mit Null 0.X0anstelle von0.X


0

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

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

Probieren Sie es online!

Erläuterung:

         % 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 * .75 = 81 Byte

Eine Funktion , die eine Eingabe von nimmt [A1]und [B1]und gibt an die Konsole

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

Ausgabe

mit eingabe [A1]=25und[B1]=.76

76%

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

-50%

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

1001%
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.