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


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.