สร้างแถบความคืบหน้าของ ASCII


12

มันคล้ายกับคำถามนี้แต่มีความแตกต่างเล็กน้อย คุณต้องเขียนโปรแกรมเพื่อขอความกว้างของแถบความคืบหน้าและทำงานเป็นจำนวนเท่าใด และจากนั้นวาดแถบความคืบหน้าด้วยคุณสมบัติดังต่อไปนี้:

  • width ระบุจำนวนตัวอักษรที่คุณต้องใช้ในการวาดแถบความคืบหน้า

  • ความคืบหน้าจะได้รับผ่านค่าทศนิยมระหว่าง 0..1

  • อักขระตัวแรกและตัวสุดท้ายในแถบความคืบหน้าควรเป็นสิ่งที่แตกต่างจากตัวละครอื่น ๆ ทั้งหมดเช่น "[" และ "]"

  • โปรแกรมของคุณควรใช้อักขระสองตัวที่แตกต่างกันเพื่อประเมินความก้าวหน้าที่ผ่านไปนับตั้งแต่เริ่มต้น

  • คุณต้องเขียนจำนวนงานที่ทำตรงกลางแถบความคืบหน้าโดยใช้เครื่องหมายทศนิยม + "%"

จุดโบนัสสำหรับการจัดการอินพุตที่มากเช่นงานที่ทำเสร็จ 150% หรือ -5%

จำนวนตัวอักษรที่ให้คะแนน * (1 ที่ไม่มีโบนัสหรือโบนัสความกว้าง 0.75)

ตัวอย่างบางส่วนของผลลัพธ์ที่ถูกต้อง

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

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

39 -0.12
[                 -12%                 ]

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

อินพุตถูกนำมาใช้อย่างไร? บรรทัดคำสั่ง? stdin? ข้อใดข้อหนึ่งข้างต้น
354 lochok

@lochok ฉันคิดว่า stdin จะเป็นทางเลือกที่ดีกว่า
Ali1S232

คำตอบ:


3

PHP 84 x 0.75 = 63

แก้ไข: เวอร์ชัน 'สวยน้อย' แต่ควรใช้ได้ตามกฎ:

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

เอาท์พุท:

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


ดั้งเดิม (98 x 0.75 = 73.5)

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

เอาท์พุท:

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

ฉันสงสัยว่าฉันจะเรียกใช้รหัสของคุณได้อย่างไร
Ali1S232

บันทึกเป็นไฟล์ php ส่งพารามิเตอร์สองตัวเป็นสตริงคั่นด้วยช่องว่างเป็น STDIN ตัวอย่างเช่น: [พร้อมท์คำสั่ง windows / linux] echo 79 0.15 | php progress-bar.php คุณจะต้องติดตั้ง php-cli (อินเตอร์เฟสบรรทัดคำสั่ง) โปรแกรมติดตั้ง php ส่วนใหญ่สำหรับ windows ควรรวมไว้ (หรือเป็นทางเลือก), linux พร้อมกับ apt-get install php5-cli
primo

ฉันเลือกคำตอบนี้ตั้งแต่ที่ฉันทดสอบข้อนี้ทำงานได้ตามปกติในขณะที่คำตอบที่บางครั้งอาจไม่ได้พิมพ์ตรงกลาง
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% ||||||||||]   

(ตัวเลขติดลบใน J นำหน้าด้วย_ไม่ใช่ไม่ใช่-โชคดีที่ dyadic ".สามารถแยกวิเคราะห์ทั้งสองรูปแบบได้)


สิ่งนี้ยกเว้นพื้นที่ที่ใช้เป็นเปอร์เซ็นต์เมื่อคำนวณจำนวนแท่งที่จะแสดงหรือไม่ ดูเหมือนว่าจะได้รับผลลัพธ์ที่แตกต่างจากของฉัน
grc

@grc ด้วย 100 คอลัมน์แต่ละเปอร์เซ็นต์จะเป็นแถบเดียว (แม้ว่าจะถูกซ่อนโดยองค์ประกอบอื่น ๆ เช่นวงเล็บหรือตัวเลข / เปอร์เซ็นต์)
ephemient

โอเคฉันเข้าใจแล้วตอนนี้ เป็นงานที่ดี :)
grc

@ephemient ตอนนี้ฉันสังเกตเห็นในกรณี -0.12 คุณกำลังพิมพ์ 18 ช่องทางด้านซ้ายและ 16 ทางด้านขวา มันหมายถึง_12%ไม่ตรงกลาง
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

นั่นเป็นตามกฎกอล์ฟ Perl แบบดั้งเดิม ( #!ไม่นับบรรทัดยกเว้นสำหรับ-และสวิตช์หากมี)

$ echo 79 0.15 | ทดสอบ perl
[||||||||||| 15%]
$ echo 25 0.76 | ทดสอบ perl
[|||||||||| 76% ||||| ]
$ echo 39 -0.12 | ทดสอบ perl
[-12%]
$ echo 25 7.6 | ทดสอบ perl
[||||||||| 760% ||||||||||]

2

Ruby - คะแนน 93 (124 ตัวอักษร)

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

อีกหนึ่งการติดตั้งทับทิม อ่านอินพุตจาก STDIN ในแบบฟอร์มที่อธิบายข้างต้น คุณอาจจะแลกเปลี่ยนตัวละคร'#', ' 'และ'[', ']'โดยตรงในรหัส

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

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

นี่มันกว้างเกินไปสองตัวอักษร
Patrick Oscity

@padde ทำไมคุณถึงคิดว่ามันสองตัวกว้างเกินไป? มี -2 ในบรรทัดแรก
Howard

2

Python - 158 155 148 143 138 ตัวอักษร (คะแนน 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]+"]"

มันอาจจะสั้นกว่า 30 ตัวอักษรถ้าอินพุตถูกคั่นด้วยเครื่องหมายจุลภาค


ทำไมไม่ใช้r=p.length()?
Ali1S232

คุณหมายถึงอะไร
grc

ไม่มีอะไรที่ไม่ดีของฉันฉันเพียงแค่เข้าใจรหัสผิด
Ali1S232

แต่ดูเหมือนว่าโค้ดของคุณจะไม่รองรับขนาด -12%
Ali1S232

มันหมายถึงอะไรที่ต้องทำ? ในขณะนี้มันเพิ่งพิมพ์แถบว่างด้วยเปอร์เซ็นต์
grc

1

Q, 90 ตัวอักษรไม่มีโบนัส

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

การใช้

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

สกาลา 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 + ("% ")))}
}

ฉันตัดสินใจว่าสำหรับการอ่านคุณต้องมีช่องว่างรอบจำนวนความคืบหน้า:

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

1

C, 145 ตัวอักษร, คะแนน = 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);}

แม้ว่าฉันชอบแนวความคิดของคุณเกี่ยวกับ sprintf แต่มันสร้างปัญหาเล็กน้อยให้ตรวจสอบโปรแกรมของคุณด้วย20 1อินพุตมันจะสร้างผลลัพธ์ของ[#######100%######]ในกรณีนี้มี 7 เซียนที่เหลืออยู่ของจำนวนและ 5 เซียนที่ด้านขวาดังนั้นจำนวนที่พิมพ์ไม่ตรง ตรงกลาง.
Ali1S232

1

node.js: 135chars, * 0.75 สำหรับคะแนนโบนัสดังนั้น 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 ]

เอาท์พุท:

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

เอาท์พุท:

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

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


80
-0.12
[                                      -12%                                     ]

p ควรเป็นค่าจุดลอยตัวระหว่าง
0..1

@Gajet ขอบคุณที่แจ้งให้ทราบล่วงหน้า แก้ไขแล้ว :)
l0n3sh4rk

0

JavaScript 127 125 ไม่มีโบนัส

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

การใช้งาน:เปลี่ยนl=9ด้วยความยาวอื่น ๆและ / หรือเปลี่ยนแปลงp="0.99"ด้วยเปอร์เซ็นต์อื่น ๆ

หมายเหตุ:ลงท้ายด้วยศูนย์0.X0แทน0.X


0

MATLคะแนน 35.25 (47 * 0.75)

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

ลองออนไลน์!

คำอธิบาย:

         % 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 ไบต์

ฟังก์ชันที่รับอินพุตจาก[A1]และ[B1]และส่งออกไปยังคอนโซล

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

เอาท์พุต

ด้วยการป้อนข้อมูล[A1]=25และ[B1]=.76

76%

ด้วยอินพุต [A1:B1].Resize(1,2)=Split("32 -.5")

-50%

ด้วยอินพุต [A1:B1].Resize(1,2)=Split("40 10.01")

1001%
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.