मेरा बार ग्राफ ड्रा करें


24

आपको एक प्रोग्राम बनाने के लिए चुना गया है जो कुछ सुंदर ASCII बार चार्ट बनाता है । यहाँ इनपुट प्रारूप है:

[List of words (they can have spaces)] [an integer >= 0]
Bar 3
This is so cool 4
IDK-Why 6

इस प्रारूप में इनपुट में कई लाइनें होंगी, हर एक ग्राफ में एक बार का प्रतिनिधित्व करेगा। एक ग्राफ का आउटपुट स्वरूप इस प्रकार होगा:

 _ _ _ _
|_|_|_|_|
 | | | |
 | | | + [name of 4th bar]
 | | + [name of 3rd bar]
 | + [name of 2nd bar]
 + [name of 1st bar]

यहाँ कुछ उदाहरण हैं:

In:
Cool 4
Kool 6

Out:
   _
  | |
 _| |
| | |
| | |
| | |
|_|_|
 | |
 | + Kool
 + Cool

In:
Graph 5
Bar 3

Out:
 _
| |
| |_
| | | 
| | |
|_|_|
 | |
 | + Bar
 + Graph

In:
Very 4
Large 5
Bar 3
Graph 5

Out:
   _   _
 _| | | | 
| | |_| |
| | | | |
| | | | |
|_|_|_|_|
 | | | |
 | | | + Graph
 | | + Bar
 | + Large
 + Very

In:
Bars can be 0 0
Large-bars_are$nice2 6
average)(@#$ 3
neato 5

Out:
   _
  | |  _
  | | | | 
  | |_| |
  | | | |
  | | | |
 _|_|_|_|
 | | | |
 | | | + neato
 | | + average)(@#$
 | + Large-bars_are$nice2
 + Bars can be 0

कार्य या पूर्ण कार्यक्रम की अनुमति है।


1
क्या पूर्णांक एक एकल अंक है या यह> 9 हो सकता है?
edc65

> 9 की अनुमति है, मैंने इसे एक उदाहरण के रूप में नहीं रखा क्योंकि यह इतना बड़ा होगा।
J Atkin

क्या प्रत्येक रेखा पर अनुगामी स्थान हो सकते हैं? यानी आउटपुट आयताकार बनाते हैं?
स्टीवी ग्रिफिन

हां, अनुगामी रिक्त स्थान की अनुमति है
J Atkin

1
इतिहास में देखें, @ डॉर्कनोब ने इसे हटा दिया, निश्चित नहीं कि क्यों ...
जे एटकिन

जवाबों:


15

sh + awk + tac, १ t३

अधिकतर एक awkस्क्रिप्ट जो ग्राफ को नीचे की ओर प्रिंट करती है जो बाद में उलट जाती है tac

awk '{n[NR]=$NF;$NF="";$0=p" + "$0;p=" |"p}1;END{for(print p;p~/\|/;print p (k>($0=0)?"|":""))for(i=k=p="";i<NR;p=p (j>0||k>0?"|":" ")(!k||$0?"_":" ")){j=k;k=n[++i]--}}'|tac

विवरण

awk, पहला भाग, प्रत्येक इनपुट लाइन के लिए निष्पादित किया गया

{
  n[NR]=$NF;         # store the value, here n[1]=0, n[2]=6, n[3]=3, n[4]=5
  $NF="";            # remove the value from the label
  $0=p" + "$0;       # add a prefix (initially empty) and a " + " in the front
  p=" |"p            # grow the prefix for the next string
}1;                  # implicitly print $0

उत्पादन

 + Bars can be 0 
 | + Large-bars_are$nice2 
 | | + average)(@#$ 
 | | | + neato 

awk, दूसरा भाग, अंत में एक बार निष्पादित

END{
  for(print p;p~/\|/;print p (k>($0=0)?"|":""))
    for(i=k=p="";i<NR;p=p (j>0||k>0?"|":" ")(!k||$0?"_":" "))
      {j=k;k=n[++i]--}}

ungolfed:

END{
  print p;           # print the prefix again
  for(;p~/\|/;)      # for each line, bottom up. no more "|" -> we're done
  {
    p="";            # string to be built
    i=k=0;           # i: bar index, k: heigth of the previous bar
    for(;i<NR;)      # for each bar, left to right
    {
      j=k;           # store the previous bars heigth in j
      k=n[++i]--;    # get the current bars remaining height and decrement it
      p=p (j>0||k>0?"|":" ")(!k||$0?"_":" ");
                     # if the bar to the left or this one have some height
                       remaining, draw a border in between them, else a space
                     # if this bars remaining heigth is exactly 0, draw a top
                     # if $0 is set, draw the bottom
    }
    print p (k>0?"|":"");
                     # draw (or not) the rightmost border, finally print
    $0=0;            # unset $0, only to detect first run
  }
}

उत्पादन

 | | | |             # the prefix
 _|_|_|_|            # the strings built by the nested loops
  | | | |            |
  | | | |            v
  | |_| |
  | | | |
  | |  _
   _                 # no more "|" in the string, we're done

tac लाइनों को उलट देता है

   _    
  | |  _
  | | | |
  | |_| |
  | | | |
  | | | |
 _|_|_|_|
 | | | |
 | | | + neato 
 | | + average)(@#$ 
 | + Large-bars_are$nice2 
 + Bars can be 0 

8

जावास्क्रिप्ट (ईएस 6), 270 262 270 287

बग फिक्स ने 'की एक लापता पंक्ति जोड़ी' सलाखों के नीचे

l=>{t=p=o='';l=l.split`
`.map(r=>([,b,c]=r.match(/(.*) (\d+)/),[' + '+b,+c>t?t=c:c]));for(++t;t--;o+=`
`)l.map(x=>o+=x[1]<t?'y y':x[1]>t?t?'x x':'x_x':'y_y');return o.replace(/(yx)|(xy)|(xx?)/g,'|').replace(/y+/g,' ')+[...l,' '].map(x=>p+x[p+=' |',0]).reverse().join`
`}

फ़ायरफ़ॉक्स में टेस्ट टेस्ट, क्योंकि क्रोम ES6 डिस्ट्रक्ट्यूरिक असाइनमेंट का समर्थन नहीं करता है

F=l=>{
  t=p=o='';l=l.split`\n`.map(r=>([,b,c]=r.match(/(.*) (\d+)/),[' + '+b,+c>t?t=c:c]));
  for(++t;t--;o+=`\n`)l.map(x=>o+=x[1]<t?'y y':x[1]>t?t?'x x':'x_x':'y_y');
  return o.replace(/(yx)|(xy)|(xx?)/g,'|').replace(/y+/g,' ')
  +[...l,' '].map(x=>p+x[p+=' |',0]).reverse().join`\n`
}

function test()
{
  var i=I.value
  O.textContent=F(i)
}  
  
test()
textarea { display:block; width:50%; height:5em}
Input
<textarea id=I>Bars can be 0 0
Large-bars_are$nice2 6
average)(@#$ 3
neato 5</textarea>
<button onclick='test()'>go</button><br>
Output
<pre id=O></pre>


मेरे जोल्फ जवाब में मैं काम कर रहा हूं, मैंने इस्तेमाल किया i.match(/.+ |./g)। शायद यह उपयोग का हो सकता है?
कॉनर ओ'ब्रायन 23

'अनक्रेडेड रेफरेंस एरर: अमान्य लेफ्ट-हैंड साइड असाइनमेंट में', इसके बाद कुछ 'अनक्रेडेड रेफरेंस एरर: टेस्ट डिफाइन नहीं है' क्योंकि पहली एरर ने टेस्ट की घोषणा को रोका ()
x13

@ThisNameBetterBeAvailable किस ब्राउज़र का उपयोग करना? ES6 क्रोम में पूरी तरह से समर्थित नहीं है और MSIE के अधिकांश संस्करणों में पूरी तरह से बिना लाइसेंस के
edc65

इस मामले में @ThisNameBetterBeAvailable, समस्या क्रोम का समर्थन नहीं कर रही है destructuring assignment: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… । फ़ायरफ़ॉक्स जैसे बेहतर ब्राउज़र को आज़माएं
edc65

2

421 बाइट्स - पायथन 2

import sys
l=sys.stdin.read().split('\n')
b=[(' '.join(x[:-1]),int(x[-1])) for x in map(str.split,l[:-1])]
a=len(b)
e=enumerate
m=[' '*(a+1)+'|'*x[1] for i,x in e(b)]+[' '*(len(b)+1)+'|'*b[-1][1]]
h=[' '*i+'+'+'|'*(a-i)+'_'+' '*(x[1]-1)+'_' for i,x in e(b)]
c=m+h
c[::2]=m
c[1::2]=h
c=[''.join(' ' if not x else x for x in l) for l in map(None,*c)]
for i,(n,_) in e(b):
 c[a-i-1]+='\b'*i*2+n
c='\n'.join(c[::-1])
print(c)

टेस्ट

a 1
b 2
c 3
     _
   _| |
 _| | |
|_|_|_|
 | | |
 | | + c
 | + b
 + a

मेरे लिए, यह शून्य ऊंचाइयों (जैसे a 0 b 3) और अवरोही सलाखों (जैसे a 5 b 3 c 0) के लिए सही आउटपुट नहीं देता है । मेरा पायथन संस्करण पायथन 2.7.10 है।
nimi

1

जावा, मुद्रण समारोह के लिए 613

यह संभव हो सकता है कि कुछ सामान्य बाइट्स को "सामान्य" के परिवर्तनों से बचाया for(i=0;i<n;i++)जाए for(;i++<n;), टर्नरी कंडीशंस को सरल बनाया जाए, या "लेबल" और "हाइट्स" के अधिक सुरुचिपूर्ण संगणना के साथ, लेकिन यह एक शुरुआत है।

package stackoverflow.codegolf.barchart;

import static java.util.stream.Stream.of;

import java.util.stream.IntStream;


public class BarChartTest
{
    public static void main(String[] args)
    {
        String input0[] = {
            "Cool 4",
            "Kool 6",
        };
        String input1[] = {
            "Graph 5",
            "Bar 3",
        };
        String input2[] = {
            "Very 4",
            "Large 5",
            "Bar 3",
            "Graph 5",
        };
        String input3[] = {
            "Bars can be 0 0",
            "Large-bars_are$nice2 6",
            "average)(@#$ 3",
            "neato 5",
        };
        runTest(input0);
        runTest(input1);
        runTest(input2);
        runTest(input3);
    }

    private static void runTest(String input[])
    {
        System.out.println("In:");
        for (String string : input)
        {
            System.out.println(string);
        }
        System.out.println("Out:");
        BarChartTest b = new BarChartTest();
        b.print(input);
    }

    void p(String a[]){int h[]=of(a).map(this::s).mapToInt(Integer::parseInt).toArray(),M=IntStream.of(h).max().getAsInt(),C=a.length,r,c,y;Object t[]=of(a).map(this::p).toArray();String s="",p=" + ",w="";char n=10,v='|',i=32,u=95,e;for(r=0;r<=M;r++){e=r==M?'_':' ';y=M-r;for(c=0; c<C; c++){s+=h[c]>y?v:c>0?h[c-1]>y?v:e:r==0?e:i;s+=h[c]==y?u:e;}s+=h[C-1]>y?v:e;s+=n;}for(r=0;r<C;r++){for(c=0;c<C-r;c++){s+=" |";}s+=r>0?p+t[C-r]:w;s+=n;}s+=p+t[0];System.out.println(s);}int b(String s){return s.lastIndexOf(" ");}String p(String s){return s.substring(0,b(s));}String s(String s){return s.substring(b(s)+1,s.length());}
}

1

हास्केल, 323 बाइट्स

f x|(p,q)<-unzip$map((\l->(unwords$init l,(read$last l))).words)$lines x=unlines(reverse$init.(zip((zipWith max=<<tail)$0:q++[0])(q++[0])>>=).(!)<$>[0..maximum q])++v p++'\n':(0#p)
v=(>>" |")
_#[]=""
l#(h:t)=(l+1)#t++v[1..l]++" + "++h++"\n"
0!(0,_)=" _"
0!_="|_"
i!(j,k)|i<j=(i==k)?'|'|1<2=(i==k)?' '
i?c|i=c:"_"|1<2=c:" "

उपयोग उदाहरण:

*Main> putStr $ f "Bars can be 0 0\nLarge-bars_are$nice2 6\naverage)(@#$ 3\nneato 5"
   _     
  | |  _ 
  | | | |
  | |_| |
  | | | |
  | | | |
 _|_|_|_|
 | | | |
 | | | + neato
 | | + average)(@#$
 | + Large-bars_are$nice2
 + Bars can be 0

यह कैसे काम करता है (मोटे तौर पर अवलोकन, विवरण शायद बाद में):

(p,q)<-unzip$map((\l->(unwords$init l,(read$last l))).words)$lines x
           -- breaks the input into a list of labels (-> p), e.g.
           -- ["Bars can be 0","Lagerge-basr_asr$niche",...] and a list of heights
           -- (-> q), e.g. [0,6,3,5]

unlines(reverse$init.(zip((zipWith max=<<tail)$0:q++[0])(q++[0])>>=).(!)<$>[0..maximum q])
           -- builds the bars
v p++"\n"
           -- builds the first row of "|" underneath the zero line
(0#p)
           -- build the label section

पार्सिंग भाग ( (p,q)<-unlines...) बहुत सारे बाइट्स लेता है, हो सकता है कि मैं इसे और नीचे गिरा दूं।


1

पायथन 2, 345 बाइट्स

B,H=zip(*[(a,int(b))for a,b in[x.rsplit(' ',1)for x in input().split('\n')]])
h=max(H)
L=len(B)
b=['|'*H[0]]*(L*2+1)
for i in range(L):b[2+i*2]='|'*max(H[i],H[min(i+1,L-1)]);b[1+i*2]=('_'+' '*(H[i]-1)+'_')[:H[i]+1]
b=[x.ljust(h+1)for x in b]
for l in zip(*b)[::-1]:print ''.join(l)
print' |'*L
for i in range(-1,-L-1,-1):print' |'*(L+i),'+',B[i]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.