একটি অ্যারে থেকে একটি গাছ অঙ্কন


24

সম্ভবত নেস্টেড, একক-অঙ্কের ধনাত্মক পূর্ণসংখ্যার অ-খালি অ্যারে দেওয়া (অনন্য গ্যারান্টিযুক্ত নয়), বক্স-অঙ্কন অক্ষরগুলি ব্যবহার করে ASCII- শিল্প উপস্থাপনাটিকে গাছ হিসাবে আউটপুট করুন ┌ ┴ ┐ ─ │ ┬ ┼। (কোড পৃষ্ঠা 437 থেকে এগুলি অনুলিপি করা হয়েছিল, তবে আপনি কোনও সমতুল্য উপস্থাপনা ব্যবহার করতে পারেন)।

অ্যারের প্রতিটি পূর্ণসংখ্যার গাছের পাতা হওয়া উচিত। অ্যারেতে একই স্তরের গভীর উপাদানগুলি গাছের একই স্তরে উপস্থিত থাকতে হবে। সমস্ত উপাদান পৃথক করার জন্য পর্যাপ্ত পরিমাণের স্পেসস্পেস দ্বারা পৃথক করা উচিত (কতটা প্রশস্ত, এক স্থানের মধ্যে ন্যূনতম কত তা নির্ধারণ করা আপনার উপর নির্ভর করে)।

উদাহরণস্বরূপ, অ্যারে প্রদত্ত [[1, [2]], [3, [4, 5]]], নিম্নলিখিত ট্রিটিকে আউটপুট করুন

 ┌─┴─┐
┌┴┐ ┌┴─┐
1 │ 3 ┌┴┐
  2   4 5

অ্যারে [1, 2, 3]জন্য গাছ দেখতে দেখতে পারে

┌─┼─┐
1 2 3

কিন্তু অ্যারে দেখতে [[1, 2, 3]]হবে

  │
┌─┼─┐
1 2 3

অ্যারের [1, [1, [1, [1]]]]মতো দেখতে পারে

 ┌─┴┐
 1 ┌┴─┐
   1 ┌┴┐
     1 │
       1

আরও জটিল উদাহরণ হিসাবে, [1, [[[2, 3], 4], 5]]হতে পারে

┌┴───┐
1  ┌─┴┐
 ┌─┴┐ 5
┌┴┐ 4
2 3

বা অন্যান্য বিভিন্ন প্রকারের।


  • ইনপুট এবং আউটপুট যে কোনও সুবিধাজনক পদ্ধতি দ্বারা দেওয়া যেতে পারে ।
  • আপনি এটি STDOUT এ মুদ্রণ করতে পারেন বা কোনও ফাংশন ফলাফল হিসাবে এটি ফিরিয়ে দিতে পারেন।
  • হয় একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন গ্রহণযোগ্য।
  • অক্ষরের যথাযথভাবে সীমাবদ্ধ থাকাকালীন যে কোনও পরিমাণ বহিরাগত শ্বেত স্পেস গ্রহণযোগ্য।
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।
  • এটি তাই সাধারণ গল্ফিংয়ের সমস্ত নিয়ম প্রয়োগ হয় এবং সংক্ষিপ্ততম কোড (বাইটে) জয়ী হয়।

[1,[[[2,3],4],5]]এটি একটি আকর্ষণীয় পরীক্ষার কেস হতে পারে যেহেতু এটির মূলটি কৃত্রিমভাবে প্রসারিত করা দরকার যাতে ডান সাবট্রিটি বাম সাবট্রির সাথে সংঘর্ষ না ঘটে।
পোকে

@ পোকে উদাহরণ হিসাবে যুক্ত হয়েছে। সেই পরীক্ষার ক্ষেত্রে বিভিন্ন সম্ভাব্য প্রকরণ রয়েছে।
অ্যাডমবর্কবার্ক

2
সেই পরীক্ষার ক্ষেত্রে প্রথম উদাহরণটি সঠিক হতে পারে না। যে বলে যে দ্বিতীয় উপাদান গুলি পাশে 13 আইটেম একটি অ্যারে হল: [2,3], 4, এবং 5। তবে 4 এবং 5 সংলগ্ন নয়।
ড্রাকো

4
[1, [[[2, 3]], [4], 5]]আমার মত দেখতে ।
নিল

এই বিকল্প ইনপুট ফর্ম্যাটগুলির মধ্যে কোনটি (যদি থাকে) গ্রহণযোগ্য হবে?
Οurous

উত্তর:


12

পাইথন 3 , 400 393 390 বাইট

L=len
S,*K=' ┴┼│123456789'
def T(x):
 try:return[str(x+0)]
 except:
  z=[*map(T,x)];q=max(map(L,z))
  for p in z:p+=[S*L(p[0])]*(q-L(p))
  b=[S.join(a)for a in zip(*z)];t=b[0];l=L(t);s=0;e=L(z);r=[S]*l
  if e<2:return['│'.center(l),*b]
  for i in range(l):
   if t[i]in K:s+=1;r[i]='┬┌┐'[(s<e)-(s>1)]
   elif 0<s<e:r[i]='─'
  c=l//2;r[c]=K[r[c]=='┬'];return[''.join(r),*b]

উপর থেকে নীচে স্ট্রিংয়ের একটি তালিকা ফেরত দেয়।

সম্পাদনা 1: ┴┼(2 বাইটের নেট সেভ) ডুপ্লিকেশন এড়ানো , এক স্ট্রিং থেকে 0 টি কেটে, অঙ্কন অক্ষরগুলি কীভাবে নির্বাচিত হয় ┬┌┐( <পরিবর্তে ব্যবহার করুন ==) এর পরিবর্তে এবং L(z)মিস করা একটি প্রতিস্থাপন করে 7 বাইট ছাঁটাইe

সম্পাদনা 2: -২ বাইট ওভসকে ধন্যবাদ এবং -1 বাইট কেভিন ক্রুইজসেনকে ধন্যবাদ

এটি অনলাইন চেষ্টা করুন!

Ungolfed

def layer(item):
    if isinstance(item, int):
        return [str(item)]
    else:
        subs = [layer(sub) for sub in item]
        longest = max(map(len, subs))
        for sub in subs:
            sub += [' ' * len(sub[0])] * (longest - len(sub))
        below = [' '.join(l) for l in zip(*subs)]
        top = below[0]
        l = len(top)
        if len(subs) == 1:
            return ['│'.center(l), *below]
        seen = 0
        expected = len(subs)
        builder = [' '] * l
        for i in range(l):
            c = top[i]
            if c in '┴┼│123456789':
                seen += 1
                if seen == 1:
                    builder[i] = '┌'
                elif seen == expected:
                    builder[i] = '┐'
                else:
                    builder[i] = '┬'
            elif 0 < seen < expected:
                builder[i] = '─'
        center = l // 2
        if builder[center] == '┬':
            builder[center] = '┼'
        else:
            builder[center] = '┴'
        return [''.join(builder), *below]

পাতা থেকে একবারে একটি স্তর তৈরি করে।


2
আমি আপনার টিআইও লিঙ্কে টেস্ট-কেসগুলি যুক্ত করেছি এটি অনলাইনে চেষ্টা করুন!
পিজ্জাপ্যান্টস 184

চমৎকার উত্তর! আপনি ভালো একটি পরিবর্তনশীল স্থান বরাদ্দ করে দুই বাইট দ্বারা এই কমান পারেন: S,*K=' ┴┼│123456789'
ovs

1
e==1e<2একটি বাইট সংরক্ষণ করা যেতে পারে (আমি মনে করি না এটি কখনই 0 হতে পারে, যেহেতু চ্যালেঞ্জটি বলে যে ইনপুটটি খালি নয় - এবং খালি ইনপুটগুলি ইতিমধ্যে max(map(L,z))যে কোনও ক্ষেত্রে ইতিমধ্যে ব্যর্থ হত ।)
কেভিন ক্রুইজসেন

3

পরিষ্কার , 544 506 বাইট

এসকেপগুলি এসই / টিআইও-তে অবৈধ ইউটিএফ -8 এড়াতে ব্যবহৃত হয় তবে তারা বৈধ আক্ষরিক হিসাবে এক বাইট হিসাবে গণ্য হয়

import StdEnv,Data.List;::T=I Int|L[T];$l#m= @l#k=map maxList(transpose m)=flatlines[[last[' ':[(\_|v<0|w<[j]|q>hd w|q<last w|any((==)q)w|q==j='\305'='\302'|q==j='\301'='\304'='\277'='\332'='\263'=toChar v+'0')0\\[v,r,j:w]<-m|r/2==p&&q>=hd w&&q<=last w]]\\q<-[0..k!!3]]\\p<-[0..k!!1]];@(L l)#p=twice(\p=[[v,r+1:[e+sum([2\\[v:_]<-i|0<=v]++zipWith(\c j=j!!2-c!!3)t(takeWhile(\[z:_]=v+z< -1)(tl t)))-x!!1\\e<-x]]\\i<-inits p&t<-tails p&[v,r:x]<-p])(concatMap@l)#g=[g\\[_,2,g:_]<-p]=[[-1,0,(hd g+last g)/2:g]:p];@(I i)=[[i,0,0,0]];

এটি অনলাইন চেষ্টা করুন!

ফর্ম্যাটে ইনপুট নেয় L[I 3, L[I 4, I 5], I 2]..

নীচে থেকে বাম থেকে ডানে গাছগুলিকে সংযুক্ত করে, তারপরে ডান থেকে বামে দূরত্বে সামঞ্জস্য করে।

প্রশংসিত, সাজানোর:

import StdEnv, Data.List;
:: T = I Int | L [T];
$ l
    #m = @l
    #k = map maxList (transpose m)
    = flatlines [
        [
            last[
                ' ':
                [
                    if(v < 0)
                        if(w < [j])
                            if(q > hd w)
                                if(q < last w)
                                    if(any ((==) q) w)
                                        (
                                            if(q == j)
                                                '\305'
                                                '\302'
                                        )(
                                            if(q == j)
                                                '\301'
                                                '\304'
                                        )
                                    '\277'
                                '\332'
                            '\263'
                        (toChar v + '0')
                    \\ [v, r, j: w] <- m
                    | r/2 == p && q >= hd w && q <= last w
                ]
            ]
            \\ q <- [0..k!!3]
        ]
        \\p<-[0..k!!1]
    ];
@ (L l)
    #p = twice
        ( \p
            = [
                [
                    v, r + 1:
                    map
                        (
                            (+)
                            (
                                sum [2 \\ [v: _] <- i| 0 <= v]
                                + sum (
                                    zipWith
                                        (
                                            \[_, _, _, c: _] [_, _, j: _] = j - c
                                        )
                                        t
                                        (
                                            takeWhile (\[v: _] = v < 0) (tl t)
                                        )
                                ) * (1 - sign (v + 1))
                                - x!!1
                            )
                        )
                        x
                ]
            \\ i <- inits p
            &  t <- tails p
            &  [v, r: x] <- p
            ]
        )
        (concatMap @ l)
    #g = [g \\ [_, 2, g: _] <- p]
    =[[-1, 0, (hd g + last g)/2: g]: p];
@ (I i) = [[i, 0, 0, 0]];

3

কাঠকয়লা , 127 123 বাইট

↶≔⟦⟦θ⟧⟧ηFη«≔⊟ιζ¿⁼Iζ⪫⟦ζ⟧ω⊞υ⊞OιζFLζ⊞η⁺ι⟦⊖Lζκ§ζκ⟧»Wυ«≔⌊υι≔Φυ¬⁼κιυJ±⊗Lυ⊘⊖LιI⊟ιWι«≔⊟ιζ¿ζ«←§┐┬‹ζ⊟ιW⁼KKψ←─≔⁰ι»¿⊟ι┌¶┴¦│

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

আমরা ডানদিকে কিছু আঁকিনা তাই ডিফল্ট অঙ্কন দিকটি উপরে আপ করুন।

≔⟦⟦θ⟧⟧η

প্রথম পদক্ষেপ একটি সূচক প্রতিনিধিত্ব যা ইনপুট জন্য subarrays, যেমন সূচকের সঙ্গে একসঙ্গে সমস্ত এন্ট্রি একটি তালিকা রয়েছে মধ্যে নেস্টেড অ্যারের উপস্থাপনা রূপান্তর হয় হয় এবং সেইজন্য তালিকা আমরা চাই । আমরা প্রক্রিয়াতে একটি একক প্রবেশ দিয়ে শুরু করি যা বর্তমান সূচকগুলির তালিকা (যেমন এখন পর্যন্ত কোনওটি নয়) এবং মূল ইনপুট যুক্ত একটি তালিকা।q=[1, [[[2, 3]], [4], 5]]5q[1][2]1, 2

Fη«

অ্যারেগুলি প্রক্রিয়া করার সাথে সাথে লুপ করুন। (স্বাচ্ছন্দ্যে কাঠকয়লা পুনরুক্তির সময় আপনি যদি কোনও তালিকার দিকে এটি চালিয়ে যান তবে এটি পুনরুক্ত হতে থাকবে)

≔⊟ιζ

প্রক্রিয়াটির জন্য পরবর্তী অ্যারে পান।

¿⁼Iζ⪫⟦ζ⟧ω

এটি আসলে অ্যারের পরিবর্তে কোনও স্কেলার?

⊞υ⊞Oιζ

যদি তা হয় তবে আমাদের তালিকাগুলি আসলে সূচকগুলির তালিকার চূড়ান্ত তালিকার অন্তর্ভুক্ত।

FLζ

অন্যথায়, এই অ্যারের প্রতিটি উপাদান উপর লুপ ...

⊞η⁺ι⟦⊖Lζκ§ζκ⟧»

... এবং আরও প্রক্রিয়াজাতকরণের জন্য এটির নতুন সূচী তালিকার সাহায্যে এটিকে সংরক্ষণ করুন। অ্যারের সর্বাধিক সূচকটিও সংরক্ষণ করা হয় যা অ্যারের শেষ উপাদানটির ক্ষেত্রে বিশেষ ব্যবহৃত হয়।

Wυ«

আমরা এখন সূচকের তালিকার তালিকাটি লুপ করতে প্রস্তুত। তবে তালিকাটি অভিধানিক ক্রমে নেই, তাই আমরা এটিকে সরাসরি পুনরাবৃত্তি করতে পারি না।

≔⌊υι

ডিক্সোগ্রাফিকাল ক্রমে পরবর্তী উপাদানটি সন্ধান করুন।

≔Φυ¬⁼κιυ

এটি তালিকা থেকে সরান।

J±⊗Lυ⊘⊖Lι

আউটপুটে স্কেলারের অবস্থানে যান। আমরা প্রদত্ত এটিকে গণনা করতে পারি যে আমরা আউটপুট দিয়ে স্কেলারের সংখ্যা গণনা রাখতে পারি এবং এর সূচী তালিকায় আমরা প্রবেশের সংখ্যাটিও জানি।

I⊟ι

আসলে স্কেলারটি মুদ্রণ করুন।

Wι«

সূচী তালিকার এন্ট্রিগুলি লুপ করুন। আবার, এটি সাধারণ পুনরাবৃত্তি নয়, কারণ এন্ট্রিগুলি জোড়ায় আসে এবং আমাদের লুপটিও ভেঙে ফেলতে সক্ষম হতে হবে।

≔⊟ιζ

তালিকা থেকে পরবর্তী সূচকটি বের করুন।

¿ζ«

এটি যদি তালিকার প্রথম উপাদান না হয় ...

←§┐┬‹ζ⊟ι

... তারপরে মুদ্রণ করুন বা তালিকার শেষ উপাদানটি কিনা তার উপর নির্ভর করে ...

W⁼KKψ←─

... এবং এই স্তরে পূর্বের এন্ট্রি পূরণ করার জন্য পর্যাপ্ত পরিমাণে মুদ্রণ করুন ...

≔⁰ι»

... এবং লুপটি ভেঙে দেওয়ার জন্য ভেরিয়েবলটি সাফ করুন যেহেতু আমরা এখানে করেছি।

¿⊟ι┌¶┴

অন্যথায় যদি এটি একাধিক উপাদানগুলির তালিকার (প্রথম উপাদান) হয় তবে এই স্তরের পিতামাতার সাথে ডিল করার জন্য ┌┴কার্সারটিকে উপরে রেখে মুদ্রণ করুন

¦│

অন্যথায় যদি এটি 1-উপাদান তালিকা থাকে তবে কেবলমাত্র একটি মুদ্রণ করুন এবং এই স্তরের পিতামাতার সাথে ডিল করার জন্য একটি লাইন সরান।

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