ASCII 진행률 표시 줄 만들기


12

글쎄, 그것은 이 질문 과 비슷 하지만 약간의 차이점이 있습니다. 당신은 진행 표시 줄의 폭과 얼마나 많은 작업을 요청하는 프로그램을 작성해야합니다. 다음과 같은 기능으로 진행률 표시 줄을 그립니다.

  • 너비는 진행률 표시 줄을 그리는 데 사용해야하는 문자 수를 나타냅니다.

  • 진행률은 0..1 사이의 부동 소수점 값을 통해 제공됩니다.

  • 진행률 표시 줄의 첫 번째 문자와 마지막 문자는 다른 문자 (예 : "["및 "]")와 달라야합니다.

  • 프로그램은 시작 이후로 얼마나 많은 진전이 있었는지에 대해 두 개의 다른 문자를 사용해야합니다

  • 진행률 표시 줄의 중간에 10 진수 + "%"기호를 사용하여 얼마나 많은 작업을 수행해야하는지 작성해야합니다.

150 % 또는 -5 % 작업 완료와 같은 극단적 인 입력을 처리하기위한 보너스 포인트 .

득점 문자 수 * (1 보너스 또는 0.75 너비 보너스 없음)

유효한 출력의 몇 가지 예

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

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

39 -0.12
[                 -12%                 ]

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

입력은 어떻게 이루어 집니까? 명령 줄? Stdin? 위의 어느 것?
lochok April

@ 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를 설치, 그것은 포함 (또는 선택)해야 apt-get을 PHP5-CLI 설치와 리눅스
프리모

이 답변을 테스트 한 한 항상 예상대로 작동했기 때문에이 답변을 선택했습니다. 반면 ephemient가 제공 한 것은 때로는 중간에 숫자를 정확하게 인쇄하지 않습니다.
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 % ||||| ]   
$ 에코 -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

펄, 96 × ¾ = 72

#!/usr/bin/perl -ap
formline'[@'.'|'x($F[0]-3).']',100*$F[1].'%';
$_=$^A;s# |(.)#$1//($-[0]<$F[0]*$F[1]?'|':$&)#eg

그것은 전통적인 Perl 골프 규칙에 의한 #!것입니다 ( -및 스위치가있는 경우를 제외하고는 계산되지 않습니다 ).

$ 에코 79 0.15 | 펄 test.pl
[||||||||||| 15 %]
$ 에코 25 0.76 | 펄 test.pl
[|||||||||| 76 % ||||| ]
$ 에코 39 -0.12 | 펄 test.pl
[-12 %]
$ 에코 25 7.6 | 펄 test.pl
[||||||||| 760 % ||||||||||]

2

루비-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

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

언 골프 :

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 : 135 자, 보너스 포인트 * 0.75, 101.25 자

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

언 골프 :

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

자바 스크립트 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으로 끝나십시오 .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.