আমার বার গ্রাফ আঁকুন


24

আপনাকে এমন একটি প্রোগ্রাম তৈরি করতে বেছে নেওয়া হয়েছে যা কিছু সুন্দর এএসসিআইআই বার চার্ট তৈরি করে । ইনপুট ফর্ম্যাটটি এখানে:

[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 এর অনুমতি দেওয়া হয়েছে, আমি এটি উদাহরণ হিসাবে রাখি নি কারণ এটি এত বড় হবে।
জে আতকিন

প্রতিটি লাইনে পিছনে স্থান থাকতে পারে? অর্থাৎ আউটপুটটি আয়তক্ষেত্রাকার করুন?
স্টিভি গ্রিফিন

হ্যাঁ, চলার স্থানগুলি অনুমোদিত
জে আটকিন

1
ইতিহাসে দেখুন, @ ডুরকনব এটি সরিয়ে দিয়েছেন, কেন তা নিশ্চিত নয় ...
জে আটকিন

উত্তর:


15

sh + awk + tac, 173

বেশিরভাগই একটি 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

তাক লাইনের বিপরীত

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

8

জাভাস্ক্রিপ্ট (ES6), 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)। সম্ভবত যে ব্যবহার হতে পারে?
কনর ওব্রায়ান

'আনকাড রেফারেন্স এরিয়ার: অ্যাসাইনমেন্টে অবৈধ বাম-হাত', এর পরে কয়েকটি 'অব্যাহত রেফারেন্স এরর: পরীক্ষা সংজ্ঞায়িত করা হয়নি' কারণ প্রথম ত্রুটি পরীক্ষার ঘোষণাকে
আটকা দিয়েছে

নিবন্ধন করুন কি এই ব্রাউজারটি ব্যবহার করছেন? ES6 Chrome এ সম্পূর্ণরূপে সমর্থিত নয় এবং MSIE এর বেশিরভাগ সংস্করণে সম্পূর্ণরূপে অসমর্থিত
edc65

এই থিমনামেবাটারবিউটি উপলভ্য, এই ক্ষেত্রে সমস্যাটি হ'ল ক্রোম সমর্থন করছে না destructuring assignment: বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / । ফায়ারফক্সের মতো আরও ভাল ব্রাউজার চেষ্টা করুন
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) জন্য সঠিক আউটপুট দেয় না । আমার পাইথন সংস্করণটি পাইথন ২.7.১০।
নিমি

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]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.