buat bilah kemajuan ascii


12

baik, itu mirip dengan pertanyaan ini tetapi dengan sedikit perbedaan. Anda harus menulis sebuah program untuk menanyakan lebar bilah kemajuan dan berapa banyak pekerjaan yang dilakukan. dan kemudian menggambar progress bar dengan fitur-fitur berikut:

  • lebar menunjukkan berapa banyak karakter yang harus Anda gunakan untuk menggambar progress bar

  • progres diberikan melalui nilai floating point antara 0..1.

  • karakter pertama dan terakhir dalam progress bar harus sesuatu yang berbeda dari semua karakter lain, misalnya "[" dan "]"

  • program Anda harus menggunakan dua karakter berbeda untuk berapa banyak kemajuan yang telah berlalu sejak awal

  • Anda harus menulis berapa banyak pekerjaan yang dilakukan tepat di tengah bilah kemajuan, menggunakan tanda angka desimal + "%".

poin bonus untuk menangani input ekstrem, seperti 150% atau -5% pekerjaan selesai.

mencetak jumlah karakter * (1 tanpa bonus atau bonus 0,75 lebar)

beberapa contoh output yang valid

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

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

39 -0.12
[                 -12%                 ]

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

Bagaimana input diambil? Garis komando? Stdin? Ada yang di atas?
lochok

@lochok kurasa stdin akan menjadi pilihan yang lebih baik.
Ali1S232

Jawaban:


3

PHP 84 x 0,75 = 63

Sunting: Versi yang kurang 'cantik', tetapi harus valid sesuai aturan:

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

Keluaran:

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


Asli (98 x 0,75 = 73,5)

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

Keluaran:

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

Saya bertanya-tanya bagaimana saya bisa menjalankan kode Anda.
Ali1S232

Simpan sebagai file php. Kirim dua paramaters sebagai string yang dipisahkan spasi sebagai STDIN. Sebagai contoh: [windows / linux command prompt] echo 79 0.15 | php progress-bar.php Anda perlu menginstal php-cli (antarmuka baris perintah). Kebanyakan installer php untuk windows harus menyertakan (atau opsional), linux dengan apt-get install php5-cli
primo

Saya telah memilih jawaban ini karena sejauh saya menguji jawaban ini selalu berfungsi seperti yang diharapkan, sementara jawaban yang diberikan sesekali tidak mencetak angka persis di tengah.
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% |||||||||   

(Angka negatif dalam J diawali oleh _, bukan -. Untungnya, diad ".dapat menguraikan kedua format.)


Apakah ini mengecualikan ruang yang diambil oleh persentase ketika menghitung jumlah bilah untuk ditampilkan? Karena sepertinya mendapat hasil berbeda dari saya.
grc

@grc Dengan 100 kolom, masing-masing persen adalah bilah tunggal (walaupun disembunyikan oleh elemen lain seperti tanda kurung atau angka / persen).
ephemient

Oke saya mengerti sekarang.
Kerja

@ephemient sekarang saya perhatikan dalam kasus -0,12, Anda mencetak 18 spasi di bagian kiri dan 16 di bagian kanan. artinya _12%tidak persis di tengah.
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

Itu menurut aturan golf Perl tradisional ( #!garis tidak dihitung, kecuali untuk -dan beralih jika ada).

$ 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 - skor 93 (124 karakter)

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

Namun implementasi ruby ​​lain. Membaca input dari STDIN dalam formulir yang dijelaskan di atas. Anda dapat bertukar karakter '#', ' 'dan '[', ']'langsung dalam kode.

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

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

ini hampir dua
char

@ Padde Mengapa menurut Anda dua karakter terlalu lebar? Ada -2 di baris pertama.
Howard

2

Python - 158 155 148 143 138 karakter (skor 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]+"]"

Bisa lebih pendek 30 karakter jika input dipisahkan dengan koma.


kenapa kamu tidak menggunakan r=p.length()?
Ali1S232

apa maksudmu?
grc

tidak ada yang buruk, saya hanya salah mengerti kode Anda.
Ali1S232

tetapi kode Anda tampaknya tidak menangani kasus -12%.
Ali1S232

Apa yang harus dilakukan? Saat ini hanya mencetak bilah kosong dengan persentase.
grc

1

Q, 90 karakter, tidak ada bonus

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

pemakaian

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

Saya memutuskan, untuk keterbacaan, Anda benar-benar membutuhkan ruang di sekitar angka kemajuan:

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

1

C, 145 karakter, skor = 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);}

meskipun saya benar-benar menyukai ide Anda tentang sprintf, tetapi menghasilkan masalah kecil, periksa program Anda dengan 20 1input itu akan menghasilkan output [#######100%######]dalam hal ini ada 7 benda tajam yang tersisa dari angka dan 5 benda tajam di kanan, sehingga angka yang dicetak tidak tepat di Tengah.
Ali1S232

1

node.js: 135chars, * 0.75 untuk poin bonus, jadi 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('')+']');

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 ]

keluaran:

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

Keluaran:

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

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


80
-0.12
[                                      -12%                                     ]

p harus menjadi nilai floating point, antara
0..1

@Gajet terima kasih telah memberi tahu. Telah diperbaiki :)
l0n3sh4rk

0

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

Penggunaan: Ubah l=9dengan panjang lain dan / atau ubah p="0.99"dengan persen lainnya

Catatan: akhiri dengan nol 0.X0alih-alih0.X


0

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

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

Cobalah online!

Penjelasan:

         % 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

Fungsi yang mengambil input dari [A1]dan [B1]dan output ke konsol

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

Keluaran

dengan input [A1]=25dan[B1]=.76

76%

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

-50%

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

1001%
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.