ascii ilerleme çubuğu oluştur


12

bu soruya benzer bir şey ama küçük farklılıklar var. ilerleme çubuğunun genişliğini ve ne kadar iş yapıldığını sormak için bir program yazmanız gerekir. ve ardından aşağıdaki özelliklere sahip bir ilerleme çubuğu çizin:

  • genişlik, ilerleme çubuğu çizmek için kaç karakter kullanmanız gerektiğini belirtir

  • ilerleme 0,1 arasında bir kayan nokta değeri ile verilir.

  • ilerleme çubuğundaki ilk ve son karakter diğer tüm karakterlerden farklı olmalıdır, örneğin "[" ve ​​"]"

  • programınız başlangıçtan bu yana ne kadar ilerleme kaydedildiğini öğrenmek için iki farklı karakter kullanmalıdır

  • ilerleme çubuğunun tam ortasına ne kadar iş yapıldığını, ondalık sayı + "%" işaretini kullanarak yazmanız gerekir.

% 150 veya% -5 iş gibi aşırı girdileri işlemek için bonus puan .

puanlama karakter sayısı * (1 bonus olmadan veya 0.75 genişlik bonusu)

geçerli çıktıların bazı örnekleri

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

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

39 -0.12
[                 -12%                 ]

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

Girdi nasıl alınır? Komut satırı? Stdin? Yukarıdakilerden herhangi biri?
lochok

@lochok Sanırım stdin daha iyi bir seçim olurdu.
Ali1S232

Yanıtlar:


3

PHP 84 x 0.75 = 63

Düzenleme: Daha az 'güzel' bir sürüm, ancak kurallara göre geçerli olmalıdır:

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

Çıktı:

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


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

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

Çıktı:

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

Kodunuzu nasıl çalıştıracağımı merak ediyorum.
Ali1S232

Bir php dosyası olarak kaydedin. İki paramateri STDIN olarak boşlukla ayrılmış bir dize olarak gönderin. Örneğin: [windows / linux komut istemi] echo 79 0.15 | php progress-bar.php php-cli (komut satırı arabirimi) kurulu olmalıdır. Windows için çoğu php yükleyici dahil olmalıdır (veya isteğe bağlı), apt-get install ile linux php5-cli
primo

Bu cevabı test ettiğimden beri seçtim, her zaman beklendiği gibi çalıştı, sağlanan geçici bir soru bazen tam olarak ortada yazdırmıyor.
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'deki negatif sayıların önüne gelir _, değil -. Neyse ki, ikili ".her iki biçimi de ayrıştırabilir.)


Bu, görüntülenecek çubuk sayısını hesaplarken yüzde tarafından alınan alanı hariç tutar mı? Çünkü benimkinden farklı sonuçlar alıyor gibi görünüyor.
grc

@grc 100 sütunda, her yüzde tek bir çubuktur (parantez veya sayı / yüzde gibi diğer öğeler tarafından gizlenmiş olsa bile).
ephemient

Tamam, şimdi anladım. İyi iş :)
grc

@ephemient Şimdi -0.12 durumunda fark ettim, sol kısımda 18 boşluk ve sağ kısımda 16 baskı yapıyorsunuz. bu _12%tam ortada değil demektir .
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

Bu geleneksel Perl golf kurallarına göre ( eğer varsa ve anahtarları #!hariç hat sayılmaz -).

echo 79 0,15 TL | 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}]"

Yine başka bir yakut uygulaması. STDIN'den girişi yukarıda açıklanan biçimde okur. Karakter alışverişi yapabilirsiniz'#' , ' 've '[', ']'doğrudan kodda.

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

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

bu alway iki karakter çok geniş
Patrick Oscity

@padde Sizce neden iki karakter çok geniş? İlk satırda -2 vardır.
Howard

2

Python - 158 155 148 143 138 karakter (103.5 puan)

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

Giriş virgülle ayrılırsa 30 karakter daha kısa olabilir.


Neden kullanmıyordu r=p.length()?
Ali1S232

ne demek istiyorsun?
grc

hiçbir şey benim kötü, sadece kod yanlış anladım.
Ali1S232

ancak kodunuz% -12 büyük / küçük harf işlenmiyor gibi görünüyor.
Ali1S232

Ne yapmak gerekiyor? Şu anda yüzde ile boş bir çubuk yazdırıyor.
grc

1

Q, 90 karakter, bonus yok

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

kullanım

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

Okunabilirlik için ilerleme sayısı çevresinde gerçekten bir boşluğa ihtiyacınız olduğuna karar verdim:

(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, puan = 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 fikrinizi gerçekten sevdim, ancak küçük bir sorun yaratıyor, programınızı 20 1çıktı üretecek girişlerle kontrol edin [#######100%######], bu durumda 7 sayı solunda ve sağda 5 keskinlik vardır, bu yüzden yazdırılan sayı tam olarak değil orta.
Ali1S232

1

node.js: 135chars, bonus puanlar için * 0.75, yani 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 ]

çıktı:

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

Çıktı:

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

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


80
-0.12
[                                      -12%                                     ]

p,
0,1

@Gajet fark ettiğiniz için teşekkürler. Rektifiye edilmiştir :)
l0n3sh4rk

0

JavaScript 127 125, bonus yok

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

Kullanım:l=9 diğer uzunluk ile değiştirmek ve / veya p="0.99"diğer yüzde ile değiştirmek

Not:0.X0 yerine sıfırla bitir0.X


0

MATL , puan 35.25 (47 * 0.75)

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

Çevrimiçi deneyin!

Açıklama:

         % 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 bayt

Girdi alan bir fonksiyon [A1]ve [B1]konsola ve çıkışlar

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

Çıktı

girişli [A1]=25ve[B1]=.76

76%

Giriş ile [A1:B1].Resize(1,2)=Split("32 -.5")

-50%

Giriş ile [A1:B1].Resize(1,2)=Split("40 10.01")

1001%
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.