tạo một thanh tiến trình ascii


12

tốt, nó tương tự như câu hỏi này nhưng có một chút khác biệt. bạn phải viết một chương trình để yêu cầu chiều rộng của thanh tiến trình và bao nhiêu công việc được thực hiện. và sau đó vẽ một thanh tiến trình với các tính năng sau:

  • chiều rộng cho biết bạn phải sử dụng bao nhiêu ký tự để vẽ thanh tiến trình

  • tiến trình được đưa ra thông qua một giá trị dấu phẩy động giữa 0..1.

  • ký tự đầu tiên và cuối cùng trong thanh tiến trình phải là một cái gì đó khác với tất cả các ký tự khác, ví dụ "[" và "]"

  • chương trình của bạn nên sử dụng hai nhân vật khác nhau để biết bao nhiêu tiến bộ kể từ khi bắt đầu

  • bạn phải viết bao nhiêu công việc được thực hiện ngay giữa thanh tiến trình, sử dụng số thập phân + "%".

điểm thưởng để xử lý các đầu vào cực đoan, chẳng hạn như 150% hoặc -5% công việc được thực hiện.

số điểm của các ký tự * (1 không có tiền thưởng hoặc 0,75 chiều rộng)

một số ví dụ về đầu ra hợp lệ

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

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

39 -0.12
[                 -12%                 ]

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

Làm thế nào là đầu vào được thực hiện? Dòng lệnh? Stdin? Bất kỳ ở trên?
lochok

@lochok Tôi đoán stdin sẽ là lựa chọn tốt hơn.
Ali1S232

Câu trả lời:


3

PHP 84 x 0,75 = 63

Chỉnh sửa: Một phiên bản ít 'đẹp' hơn, nhưng nó phải hợp lệ theo các quy tắc:

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

Đầu ra:

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


Bản gốc (98 x 0,75 = 73,5)

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

Đầu ra:

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

Tôi đang tự hỏi làm thế nào tôi có thể chạy mã của bạn.
Ali1S 232

Lưu nó dưới dạng tệp php. Gửi cho nó hai tham số dưới dạng một chuỗi phân tách không gian dưới dạng STDIN. Ví dụ: [dấu nhắc lệnh windows / linux] echo 79 0.15 | php process-bar.php Bạn sẽ cần cài đặt php-cli (giao diện dòng lệnh). Hầu hết các trình cài đặt php cho windows nên có nó (hoặc tùy chọn), linux với apt-get install php5-cli
primo

Tôi đã chọn câu trả lời này kể từ khi tôi kiểm tra câu trả lời này luôn hoạt động như mong đợi, trong khi câu trả lời được cung cấp đôi khi không in số chính xác ở giữa.
Ali1S 232

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 | kiểm tra jconsole.ijs
[| | | | | | 15%]
$ echo -n 25 0,76 | kiểm tra jconsole.ijs
[|||||||||| 76% | | ]   
$ echo -n 39 -0,12
[_12%]
$ echo -n 25 7.6 | kiểm tra jconsole.ijs
[||||||||| 760% | |   

(Số âm trong J được tiền tố bởi _, không -. May mắn thay, dyadic ".có thể phân tích cả hai định dạng.)


Điều này có loại trừ không gian được tính theo tỷ lệ phần trăm khi tính toán số lượng thanh hiển thị không? Vì nó dường như nhận được kết quả khác nhau từ tôi.
grc

@grc Với 100 cột, mỗi phần trăm là một thanh duy nhất (ngay cả khi bị ẩn bởi các yếu tố khác như dấu ngoặc hoặc số / phần trăm).
ephemient

Được rồi tôi hiểu rồi. Làm tốt lắm :)
grc

@ephemient bây giờ tôi đã nhận thấy trong trường hợp -0.12, bạn đang in 18 khoảng trống ở phần bên trái và 16 ở phần bên phải. nó có nghĩa _12%là không chính xác ở giữa.
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

Đó là theo quy tắc golf Perl truyền thống ( #!dòng không được tính, ngoại trừ -và chuyển đổi nếu có).

$ vang 79 0,15 | perl test.pl
[| | | | | | 15%]
$ vang 25 0,76 | perl test.pl
[| | | | | ]
$ vang 39 -0,12 | perl test.pl
[-12%]
$ vang 25 7.6 | perl test.pl
[||||||||| 760% | |

2

Ruby - điểm 93 (124 ký tự)

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

Một thực hiện ruby ​​khác. Đọc đầu vào từ STDIN theo mẫu được mô tả ở trên. Bạn có thể trao đổi ký tự '#', ' ''[', ']'trực tiếp trong các mã.

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

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

đây là hai ký tự quá rộng
Patrick Oscarity

@padde Tại sao bạn nghĩ rằng đó là hai ký tự quá rộng? Có một -2 trong dòng đầu tiên.
Howard

2

Python - 158 155 148 143 138 ký tự (điểm 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]+"]"

Nó có thể ngắn hơn 30 ký tự nếu đầu vào được phân tách bằng dấu phẩy.


tại sao bạn không sử dụng r=p.length()?
Ali1S232

Ý anh là gì?
grc

Không có gì xấu, tôi chỉ hiểu nhầm mã của bạn.
Ali1S232

nhưng mã của bạn dường như không xử lý trường hợp -12%.
Ali1S232

Nó có nghĩa là gì? Hiện tại nó chỉ in một thanh trống với tỷ lệ phần trăm.
grc

1

Q, 90 ký tự, không có tiền thưởng

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

sử dụng

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

vô dụng:

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

Tôi quyết định, để dễ đọc, bạn thực sự cần một khoảng trống xung quanh số tiến trình:

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

1

C, 145 ký tự, điểm = 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);}

Mặc dù tôi thực sự thích ý tưởng chạy nước rút của bạn, nhưng nó tạo ra một vấn đề nhỏ, hãy kiểm tra chương trình của bạn với 20 1đầu vào, nó sẽ tạo ra đầu ra [#######100%######]trong trường hợp này có 7 sắc nét còn lại của số và 5 sắc nét ở bên phải, vì vậy số được in không chính xác giữa.
Ali1S232

1

node.js: 135chars, * 0,75 cho điểm thưởng, vì vậy 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('')+']');

vô dụng:

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 ]

đầu ra:

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

Đầu ra:

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

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


80
-0.12
[                                      -12%                                     ]

p phải là một giá trị dấu phẩy động, trong khoảng từ 0..1
Ali1S232

@Gajet cảm ơn vì đã đưa ra thông báo. Đã được chỉnh sửa :)
l0n3sh4rk

0

JavaScript 127 125, không có tiền thưởng

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

Cách sử dụng: Thay đổi l=9theo độ dài khác và / hoặc thay đổi p="0.99"theo phần trăm khác

Lưu ý: kết thúc bằng 0 0.X0thay vì0.X


0

MATL , điểm 35,25 (47 * 0,75)

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

Hãy thử trực tuyến!

Giải trình:

         % 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

VBA Excel, 108 * .75 = 81 byte

Một chức năng mà có đầu vào từ [A1][B1]và kết quả đầu ra để giao diện điều khiển

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

Đầu ra

với đầu vào [A1]=25[B1]=.76

76%

Với đầu vào [A1:B1].Resize(1,2)=Split("32 -.5")

-50%

Với đầu vào [A1:B1].Resize(1,2)=Split("40 10.01")

1001%
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.