নোড সহ সমস্ত বাইনারি গাছ গণনা করুন


10

একটি পূর্ণসংখ্যা এন দেওয়া হয়েছে, n অভ্যন্তরীণ নোড সহ সমস্ত সম্ভাব্য পূর্ণ বাইনারি গাছগুলি গণনা করুন। (সম্পূর্ণ বাইনারি গাছের প্রতিটি অভ্যন্তরীণ নোডে হুবহু 2 বাচ্চা থাকে)। গাছের কাঠামোটি একটি অভ্যন্তরীণ নোডের প্রতিনিধিত্ব করে 1 এবং গাছের প্রার-অর্ডার ট্রভারসাল হিসাবে আউটপুট হওয়া উচিত এবং 0 বহিরাগত নোড (নাল) উপস্থাপন করে।

এখানে প্রথম কয়েকটি এন এর উদাহরণ রয়েছে:

0:
0

1:
100

2:
11000
10100

3:
1110000
1101000
1100100
1011000
1010100

এটি একটি কোড গল্ফ যা পুরষ্কারটি স্বল্পতম চরিত্রগুলিতে চলে। স্টাডআউটে গাছগুলি প্রতি লাইন এক আউটপুট হওয়া উচিত। প্রোগ্রামটি কমান্ডলাইন বা স্টিডিন থেকে এন পড়তে হবে।


আমি যখন এই সমস্যাটি নিয়ে ভাবছিলাম তখন যখন আমি একটি গোলকধাঁধার মতো লেখার ব্যবস্থা করার চেষ্টা করছিলাম
মিং-টাং

সমাধান ঘোষণার আগে মানক সময়সীমাটি কী?
কাইল বাট

আউটপুট অর্ডার করার, এবং স্ট্রিমিংয়ের দরকার হওয়া এই সমস্যার সামান্য প্রকরণে কি কোনও আগ্রহ থাকবে?
কাইল বাট

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

উত্তর:


3

পার্ল - 125 79 টি চর

গণনায় -lnবিকল্পগুলির জন্য 4 টি অক্ষর অন্তর্ভুক্ত রয়েছে । স্টিডিন থেকে এন নেয়।

নতুন গঠনমূলক পদ্ধতির:

@a=0;map{%a=();map{$a{"$`100$'"}=1while/0/g;}@a;@a=keys%a}1..$_;print for@a

প্রতিটি পাতার ("0") জন্য একটি নতুন অভ্যন্তরীণ নোড ("100") প্রতিস্থাপন করে এন -1 এর সমাধান থেকে প্রতিটি গাছে সমাধান করে এন এর জন্য সমাধান তৈরি করুন।

(অন্যের সমাধানের জন্য আমি এই ধারণার thatণী যা ক্রমানুসারে উত্পন্ন স্ট্রিং যাচাইয়ের জন্য পাতায় [100-> 0] বিকল্প ব্যবহার করে এবং আমি বিশ্বাস করি যে আমি দেখেছি - সেই ধারণার উপর ভিত্তি করে আমার উত্তর লেখার পরে - এই একই 0- > কারও মধ্যবর্তী সম্পাদনায় 100 টি নির্মাণের পদ্ধতি))

পূর্ববর্তী পুনরাবৃত্তি পদ্ধতির:

sub t{my$n=shift;if($n){--$n;for$R(0..$n){for$r(t($R)){for$l(t($n-$R)){push@_,"1$l$r"}}}}else{push@_,"0"}@_}print for t$_

পুনরাবৃত্তিমুক্ত:

sub tree {
  my ($n) = @_;
  my @result = ();
  if ( $n ) {
    for $right_count ( 0 .. $n-1 ) {
      for $right ( tree( $right_count ) ) {
        for $left ( tree( ($n-1) - $right_count ) ) {
          push @result, "1$left$right";
        }
      }
    }
  }
  else {
    push @result, "0";
  }
  return @result;
}
foreach $tree ( tree($_) ) {
  print $tree;
}

2

পিএইচপি (142) (138) (134) (113)

কমান্ড লাইন থেকে চালিত হয়, যেমন "php golf.php 1" আউটপুট "100"।

সম্পাদনা: বিকল্প পদ্ধতিতে 4 টি অক্ষর কেটে, 0 থেকে স্ট্রিংগুলি 0 থেকে পুনরুত্থানের পরিবর্তে তৈরি করে $ সংক্ষিপ্ত টার্নারি অপারেটরের জন্য পিএইচপি 5.3 ব্যবহার করে; অন্যথায়, আরও 2 টি অক্ষরের প্রয়োজন।

সম্পাদনা 2: লুপগুলিতে কিছু পরিবর্তন সহ আরও 4 টি অক্ষর সংরক্ষণ করা হয়েছে।

সম্পাদনা 3: আমি একটি ভিন্ন পদ্ধতির চেষ্টা করছিলাম এবং অবশেষে আমি এটি পুরানো পদ্ধতির নীচে পেয়েছি।

সমস্ত গাছ 4 ^ n (বা 0, যখন n = 0) এবং 2 * 4 between n এর মধ্যে পূর্ণসংখ্যার বাইনারি উপস্থাপনা হিসাবে বিবেচিত হতে পারে। এই ফাংশনটি এই ব্যাপ্তির মধ্য দিয়ে যায় এবং প্রতিটি সংখ্যার বাইনারি স্ট্রিং পায়, তারপরে "100" এর পরিবর্তে "0" এর পরিবর্তে বার বার এটি হ্রাস করে। যদি চূড়ান্ত স্ট্রিংটি "0" হয়, তবে এটি একটি বৈধ ট্রি, সুতরাং এটি আউটপুট করুন।

for($i=$p=pow(4,$argv[1])-1;$i<=2*$p;){$s=$d=decbin($i++);while($o!=$s=str_replace(100,0,$o=$s));echo$s?:"$d\n";}

2

রুবি, 99 94 92 89 87 টি অক্ষর

(n=4**gets.to_i).times{|i|s=(n+i-1).to_s 2;t=s*1;0while s.sub!'100',?0;puts t if s==?0}

স্ট্যান্ডিন থেকে ইনপুটটি পড়া হয় is

> echo 2 | ruby binary_trees.rb
10100
11000

সম্পাদনা 1: পরিবর্তিত আইও (লোজ্যাকারের মন্তব্য দেখুন)

b=->n{n==0?[?0]:(k=[];n.times{|z|b[z].product(b[n-1-z]){|l|k<<=?1+l*''}};k)}
puts b[gets.to_i]

সম্পাদনা 2: পরিবর্তিত অ্যালগরিদম।

b=->n{n==0?[?0]:(k=[];b[n-1].map{|s|s.gsub(/0/){k<<=$`+'100'+$'}};k.uniq)}
puts b[gets.to_i]

সম্পাদনা 3: সংস্করণটি এখন তৃতীয় পদ্ধতি গ্রহণ করে (মাইগিমারু ধারণাটি ব্যবহার করে)।

সম্পাদনা 4: আবার দুটি অক্ষর। মাইগিমারু আপনাকে ধন্যবাদ।


স্টিডিনের ইনপুট গ্রহণ করা এটি একটি চরিত্রের চেয়ে ছোট হবে।
লোজ্যাকার

এছাড়াও, আপনার দরকার নেই *?\n, কারণ putsঅ্যারের প্রতিটি উপাদান নিজস্ব লাইনে মুদ্রণ করে।
লোজ্যাকার

@ লাউজ্যাকার আপনাকে ধন্যবাদ
হাওয়ার্ড

আমি কেবল রুবিকে শেখার চেষ্টা শুরু করেছি, তবে আমি মনে করি আপনি you instead এর পরিবর্তে 0 সময় ব্যবহার করে একটি চরিত্র সংরক্ষণ করতে পারবেন। কমপক্ষে এটি নেটবিজে কাজ করে।
মাইগিমারু

এছাড়াও, সাব! gsub এর পরিবর্তে এখানে যথেষ্ট !, যাতে আপনি সংরক্ষণ করতে পারেন এমন অন্য একটি চরিত্র।
মাইগিমারু

1

রুবি 1.9 (80) (79)

ডিসচারনেস দ্বারা ব্যবহৃত নন-রিকারসিভ, গঠনমূলক পদ্ধতির ব্যবহার।

সম্পাদনা: 1 টি অক্ষর সংরক্ষণ করা হয়েছে।

s=*?0;gets.to_i.times{s.map!{|x|x.gsub(?0).map{$`+'100'+$'}}.flatten!}
puts s&s

0

হাস্কেল 122 টি চর

main=do n<-readLn;mapM putStrLn$g n n
g 0 0=[['0']]
g u r|r<u||u<0=[]
g u r=do s<-[1,0];map((toEnum$s+48):)$g(u-s)(r-1+s)

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

module BinTreeEnum where

import Data.List
import Data.Monoid

data TStruct = NonEmpty | Empty deriving (Enum, Show)
type TreeDef = [TStruct]

printTStruct :: TStruct -> Char
printTStruct NonEmpty = '1'
printTStruct Empty = '0'

printTreeDef :: TreeDef -> String
printTreeDef = map printTStruct

enumBinTrees :: Int -> [TreeDef]
enumBinTrees n = enumBinTrees' n n where
  enumBinTrees' ups rights | rights < ups = mempty
  enumBinTrees' 0   rights = return (replicate (rights+1) Empty)
  enumBinTrees' ups rights = do
    step <- enumFrom (toEnum 0)
    let suffixes =
          case step of
            NonEmpty -> enumBinTrees' (ups - 1) rights
            Empty -> enumBinTrees' ups (rights - 1)
    suffix <- suffixes
    return (step:suffix)

mainExample = do
  print $ map printTreeDef $ enumBinTrees 4

মনে রাখবেন যে আমি এটিকে উত্তর হিসাবে গ্রহণ করার ইচ্ছা করি না, কেবল ভেবেছিলাম আমি আমার এখানে টস করব।
কাইল বাট

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