বাইনারি ট্রি ফ্র্যাকটাল


25

আজকের চ্যালেঞ্জ হ'ল এই উদাহরণের মতো সুন্দর গাছের মতো বাইনারি গাছ আঁকুন :

                               /\
                              /  \
                             /    \
                            /      \
                           /        \
                          /          \
                         /            \
                        /              \
                       /                \
                      /                  \
                     /                    \
                    /                      \
                   /                        \
                  /                          \
                 /                            \
                /                              \
               /\                              /\
              /  \                            /  \
             /    \                          /    \
            /      \                        /      \
           /        \                      /        \
          /          \                    /          \
         /            \                  /            \
        /              \                /              \
       /\              /\              /\              /\
      /  \            /  \            /  \            /  \
     /    \          /    \          /    \          /    \
    /      \        /      \        /      \        /      \
   /\      /\      /\      /\      /\      /\      /\      /\
  /  \    /  \    /  \    /  \    /  \    /  \    /  \    /  \
 /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

ইনপুট হিসাবে আপনাকে ইতিবাচক পূর্ণসংখ্যা দেওয়া হবে। এই ইনপুটটি গাছের উচ্চতা । উপরের উদাহরণটির উচ্চতা ছয়টি।

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

প্রতিটি লাইনে ট্রেলিং স্পেসের অনুমতি রয়েছে।

এখানে ইনপুট এবং তার সাথে সম্পর্কিত আউটপুটগুলির কয়েকটি উদাহরণ রয়েছে:

1:
/\

2:
 /\
/\/\

3:
   /\
  /  \
 /\  /\
/\/\/\/\

4:
       /\
      /  \
     /    \
    /      \
   /\      /\
  /  \    /  \
 /\  /\  /\  /\
/\/\/\/\/\/\/\/\

5:
               /\
              /  \
             /    \
            /      \
           /        \
          /          \
         /            \
        /              \
       /\              /\
      /  \            /  \
     /    \          /    \
    /      \        /      \
   /\      /\      /\      /\
  /  \    /  \    /  \    /  \
 /\  /\  /\  /\  /\  /\  /\  /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

দুর্ভাগ্যক্রমে, আউটপুট তাত্পর্যপূর্ণভাবে বৃদ্ধি পায়, তাই বড় উদাহরণগুলি প্রদর্শন করা শক্ত। 8 এর জন্য আউটপুটটির একটি লিঙ্ক এখানে

যথারীতি এটি একটি চ্যালেঞ্জ, সুতরাং মানক লুফোলগুলি প্রয়োগ হয় এবং আপনি যে ভাষা চয়ন করুন তাতে সংক্ষিপ্ততম প্রোগ্রামটি লেখার চেষ্টা করুন।

শুভ গল্ফিং!


সমস্ত লাইন একই দৈর্ঘ্য করতে ট্রেলিং স্পেস থাকতে পারে?
xnor

@ এক্সনর হ্যাঁ, এটা ঠিক আছে।
DJMcMayhem

উত্তর:


5

পাইথন 2, 77 বাইট

S=s=i=2**input()
while s:print S/s*('/'+' '*(s-i)+'\\').center(s);i-=2;s/=s/i

পিছনের স্থান সহ প্রিন্ট করুন, ত্রুটি সহ শেষ হচ্ছে।

আমি আমার কোডটি জমা দেওয়া থেকে অ্যানার্কি গল্ফের প্রতি যে চ্যালেঞ্জ উত্থাপন করেছি , তার সাথে সাথে এক্সসোটের দ্বারা পাওয়া একটি বাইটের উন্নতি নিয়েছিলাম। 128 এর হার্ডকোডযুক্ত মানটি পরিবর্তিত হয়েছিল 2**input()

ধারণাটি হ'ল আউটপুটটির প্রতিটি সারিটি এক বা একাধিক বার অনুলিপি করা বিভাগ। ইনপুট বিভক্ত হওয়ার অর্ধেকটিতে প্রতিটি বিভাগের একটি করে অনুলিপি থাকে, পরের বিভাজনের পরে চতুর্থাংশের দুটি কপি থাকে, এবং আরও অনেকগুলি বিভাগের সাথে শেষ লাইন পর্যন্ত /\

প্রতিটি বিভাগের মাঝখানে ফাঁকা জায়গা এবং সেইসাথে বাইরের দিকে ডান দৈর্ঘ্যে প্যাড দেওয়ার জন্য একটি /এবং ছিল \। বাইরের প্যাডিং দিয়ে করা হয় center

চলক sপ্রতিটি বিভাগের সাথে বর্তমানটিকে ট্র্যাক করে এবং সেগমেন্টের সংখ্যাটি S/sযাতে মোট প্রস্থটি গাছের প্রস্থ S। লাইন নম্বরটি i2 এর দ্বারা নিচে গণনা করা হয় এবং যখনই মান sএর অর্ধেক হয় তখন একটি বিভাজন ঘটে এবং সেগমেন্টের প্রস্থ অর্ধেক হয়ে যায়। এটি এক্সপ্রেশন মাধ্যমে সম্পন্ন হয় s/=s/iiপৌঁছে গেলে 0এটি একটি ত্রুটি দেয় যা প্রোগ্রামটি শেষ করে।

যেহেতু অ্যানগল্ফ কেবল প্রোগ্রাম জমা দেওয়ার অনুমতি দেয়, তাই আমি পুনরাবৃত্তির ক্রিয়াকলাপের সম্ভাবনাটি ঘুরে দেখিনি, যা আমার মনে হয় সম্ভবত সংক্ষিপ্ত।




3

হাস্কেল , 140 138 135 বাইট

e n=[1..n]>>" "
n!f=(e n++).(++e n)<$>f
f 0=[]
f n=1!f(n-1)++['/':e(2*n-2)++"\\"]
b n|n<2=f 1|t<-b$n-1,m<-2^(n-2)=m!f m++zipWith(++)t t

এটি অনলাইন চেষ্টা করুন! সাথে কল করুন b 5, স্ট্রিংগুলির একটি তালিকা প্রদান করে।

সুন্দর মুদ্রণের ব্যবহার:

*Main> putStr . unlines $ b 5
               /\
              /  \
             /    \
            /      \
           /        \
          /          \
         /            \
        /              \
       /\              /\
      /  \            /  \
     /    \          /    \
    /      \        /      \
   /\      /\      /\      /\
  /  \    /  \    /  \    /  \
 /\  /\  /\  /\  /\  /\  /\  /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

(কিছু) ব্যাখ্যা:

  • e nnস্পেসের একটি স্ট্রিং উত্পন্ন করে
  • n!fবাম এবং ডান ফাঁকা স্থানগুলি fসহ স্ট্রিংয়ের তালিকায় প্রতিটি স্ট্রিং প্যাড করেn
  • f nআয়তক্ষেত্র nদ্বারা একটি "শীর্ষ" 2nআঁকুন
  • b n দুটি ছোট গাছকে সংশ্লেষ করে বাইনারি গাছ আঁকুন এবং তাদের উপরে একটি নতুন শীর্ষকে কেন্দ্র করে

সম্পাদনা করুন: -3 বাইট জাগরবকে ধন্যবাদ!


আমি মনে করি 1!f(n-1)এবং m!f mকয়েকটা বাইট সংরক্ষণ করা উচিত।
জগারব

@ জগারব এই বিষয়টিকে নির্দেশ করার জন্য ধন্যবাদ, এই অগ্রাধিকার নিয়মগুলি কখনও কখনও বিভ্রান্ত হয়।
লাইকনি

2

জে , 49 43 42 বাইট

' /\'{~(|.,-)"1@(=@i.@#,-)^:(<:`(,:@,&*-))

এটি এমন একটি ক্রিয়াটির মূল্যায়ন করে যা একটি সংখ্যা নেয় এবং 2D অক্ষরের অ্যারে প্রদান করে। এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

আমি প্রথমে সহায়িক ক্রিয়াটি পুনরাবৃত্তি করে -1, 0 এবং 1 মানগুলির একটি ম্যাট্রিক্স তৈরি করি এবং তারপরে অঙ্কগুলি অক্ষর দ্বারা প্রতিস্থাপন করি। সহায়ক ক্রিয়াটি পরবর্তী পুনরাবৃত্তির ডান অর্ধেকটি তৈরি করে, তারপরে বাকীটি উত্পাদন করতে অনুভূমিকভাবে এটি মিরর করে। নিম্নলিখিত ব্যাখ্যায়, ,2D অ্যারেগুলি উল্লম্বভাবে এবং 1D অ্যারেগুলি অনুভূমিকভাবে সংযুক্ত করে।

' /\'{~(|.,-)"1@(=@i.@#,-)^:(<:`(,:@,&*-))  Input is n.
                          ^:(            )  Iterate this verb
                             <:             n-1 times
                               `(       )   starting from
                                    ,&*-    the array 1 -1 (actually sign(n), sign(-n))
                                 ,:@        shaped into a 1x2 matrix:
                                             Previous iteration is y.
                      #                      Take height of y,
                   i.@                       turn into range
                 =@                          and form array of self-equality.
                                             This results in the identity
                                             matrix with same height as y.
                       ,-                    Concatenate with -y, pad with 0s.
       (    )"1@(        )                   Then do to every row:
        |.,-                                 Concatenate reversal to negation.
' /\'{~                                     Finally index entry-wise into string.

1

জাভাস্ক্রিপ্ট (ES6), 105 বাইট

f=n=>n<2?"/\\":" "+f(n-1).split`/`[0].replace(/|/g,"$`$'$'/$`$`\\$'$'$` \n")+f(n-1).replace(/.*/g,"$&$&")

বেস কেস থেকে পুনরাবৃত্তভাবে ফলাফল তৈরি করে কাজ করে /\। নীচের অর্ধেক প্রতিটি লাইন সদৃশ সঙ্গে ঠিক আগের ক্ষেত্রে। উপরের অর্ধেকটি ছিল একটি সামান্য কৌশলযুক্ত; দেখে মনে হচ্ছে আপনি পূর্বের কেসটি নিতে চান এবং কেবল দুটি পক্ষই রাখতে চান তবে আপনার প্রস্থটি দ্বিগুণ করার জন্য স্ট্রিংগুলি প্যাড করার বিষয়েও চিন্তা করতে হবে, সুতরাং পরিবর্তে আমি কিছু রেজেক্স যাদু করি। পূর্ববর্তী কেস থেকে নেতৃস্থানীয় স্পেস নিয়ে এবং প্রতিটি পয়েন্টে বিভক্ত হয়ে আমি সেই বিন্দুটির আগে এবং পরে ফাঁকা স্থানগুলি বিবেচনা করতে পারি। প্রতিটি ম্যাচে ফাঁকা স্থান 1 এর আগে এবং ফাঁকা স্থান 1 পরে হ্রাস; এই অবস্থান /এবং ব্যবহার করতে পারেন\সঠিক জায়গায়। এখানে নতুন লাইন এবং প্যাডিং যুক্ত করা হয়েছে; এটি প্রতিটি পংক্তির পিছনে স্থান এবং প্রথম লাইনের একটি শীর্ষস্থান যা আমাকে নিজেই যুক্ত করতে হবে তা বাদ দিয়ে সমস্ত প্যাডিংয়ের যত্ন নেয়। (পরবর্তী লাইনে শীর্ষস্থানগুলি ম্যাচের স্ট্রিং থেকে আসে)।


1

কাঠকয়লা , 12 বাইট

FN«→↗⌈X²⊖ι‖M

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

 N              Input as a number
F «             Loop over implicit range
   →            Move right (because mirroring moves the cursor)
         ι      Current index
        ⊖       Decremented
      X²        Power of 2
     ⌈          Ceiling
    ↗           Draw diagonal line
          ‖M    Mirror image

রেখার দৈর্ঘ্য 1, 1, 2, 4, 8 ... 2 ^ (এন -২), সুতরাং বিশ্রী গণনা।



0

ব্যাচ, 218 বাইট

@echo off
set/a"n=1<<%1"
set s=set t=
%s%/\
set l=for /l %%i in (2,1,%n%)do call
%l% %s% %%t%% 
%l%:l
:l
echo %t%
set/an-=1,m=n^&n-1
%s%%t: /=/ %
%s%%t:\ = \%
if %m% neq 0 exit/b
%s%%t:/ =/\%
%s%%t: \=/\%

দ্রষ্টব্য: লাইন 6 একটি স্পেসে শেষ হয়। প্রান্ত থেকে 2 এন থাকা সারি বাদে প্রতিবার ডানদিকে ডান এবং ডানগুলি যথাযথভাবে সরানোর মাধ্যমে কাজ করে , সেই ক্ষেত্রে শাখাগুলি পরিবর্তে কাঁটাচামচ হয়ে যায়।


0

হ্যাক্স, 181 বাইট

function g(n):String return(n-=2)==-1?"/\\":[for(y in 0...1<<n)[for(x in 0...4<<n)x+y+1==2<<n?"/":x-y==2<<n?"\\":" "].join("")].concat([for(y in g(n+1).split("\n"))y+y]).join("\n");

বা, কিছু alচ্ছিক সাদা স্থান সহ:

function g(n):String
  return
    (n -= 2) == -1
    ? "/\\"
    : [ for (y in 0...1 << n)
        [ for (x in 0...4 << n)
          x + y + 1 == 2 << n
          ? "/"
          : x - y == 2 << n
            ? "\\"
            : " "
        ].join("")
      ].concat([ for (y in g(n + 1).split("\n"))
        y + y
      ]).join("\n");

আমি এমন একটি সমাধানের জন্য কিছুক্ষণ কাজ করছিলাম যা প্রথমে সঠিক আকারের স্পেস অক্ষরের একটি অ্যারে তৈরি করেছিল, তারপরে পুনরাবৃত্তভাবে কাঁটাযুক্ত পাথগুলিকে নিম্ন এবং নিম্নে (এবং প্রতিটি পুনরাবৃত্তিতে আরও ঘন করে) রেখে দেওয়া হয়। যদিও এটি 230+ বাইট অবধি রয়ে গেছে। @ লাইকোনির হাস্কেল পন্থাটি কী তা এখানে উপস্থিত রয়েছে pretty না থাকার সাথে আমি :Stringপালাতে পারিনি , কারণ হ্যাক্স এতটা স্মার্ট নয় যে সনাক্ত করার জন্য যে রিটার্নের ধরণটি সর্বদা একটি স্ট্রিং থাকবে be

এটি কেবলমাত্র একটি ফাংশন, এটি পরীক্ষা করার জন্য এখানে একটি সম্পূর্ণ প্রোগ্রাম রয়েছে:

class Main {
    public static function main(){
        function g(n):String return(n-=2)==-1?"/\\":[for(y in 0...1<<n)[for(x in 0...4<<n)x+y+1==2<<n?"/":x-y==2<<n?"\\":" "].join("")].concat([for(y in g(n+1).split("\n"))y+y]).join("\n");
        Sys.println(g(Std.parseInt(Sys.args()[0])));
    }
}

উপরেরটি রাখুন Main.hx, সংকলন করুন haxe -main Main.hx -neko frac.nএবং পরীক্ষা করুন neko frac.n 4( 4পছন্দসই ক্রমানুসারে প্রতিস্থাপন করুন )।


0

পিএইচপি, 188 বাইট

অনলাইন সংস্করণ

function f($l,$r=0,$m=1){global$a;for(;$i<$l;$i++)$i<$l/2?$a[$i+$r]=str_repeat(str_pad("/".str_pad("",2*$i)."\\",2*$l," ",2),$m):f($l/2^0,$r+$l/2,2*$m);}f(2**$argv[1]/2);echo join("\n",$a);

সম্প্রসারিত

function f($l,$r=0,$m=1){
global$a;    
for(;$i<$l;$i++)    
$i<$l/2
    ?$a[$i+$r]=str_repeat(str_pad("/".str_pad("",2*$i)."\\",2*$l," ",2),$m)
    :f($l/2^0,$r+$l/2,2*$m);
}
f(2**$argv[1]/2);
echo join("\n",$a);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.