পার্ল, 65 59 55 54 বাইট
জন্য +2 অন্তর্ভুক্ত -ap
STDIN এ গাছের আকার দিয়ে চালান:
for i in `seq 24`; do echo -n "$i: "; vines.pl <<< $i; echo; done
vines.pl
:
#!/usr/bin/perl -ap
$_=map{${"-@F"%$_}|=$_=$$_|$"x$p++.1;/.\b/g}1-$_..-1
ব্যাখ্যা
আপনি যদি আবার গাছটি লিখেন
3
|
2 4
\ /
1
|
0
প্রতিটি নোডে তার সমস্ত পূর্বপুরুষের সেট থাকে এবং সে নিজেই:
{3}
|
{2,3} {4}
\ /
\ /
{1,2,3,4}
|
{0,1,2,3,4}
তারপরে আমরা 4 থেকে 3 পর্যন্ত সমস্ত নোডের পথটি বর্ণনা করতে পারি:
- সমস্ত নোড যা 3 রয়েছে তবে 4 নয় (3 থেকে নীচে যাচ্ছে)
- সমস্ত নোড যা 4 থাকে তবে 3 নয় (4 থেকে নীচে নামছে)
- 3 এবং 4 উভয় সমন্বিত সর্বোচ্চ নোড (যোগদান)
প্রান্তের সংখ্যা নোডের সংখ্যার চেয়ে কম একটি তাই আমরা জোড় বিন্দুটি উপেক্ষা করতে এটি ব্যবহার করতে পারি, সুতরাং 4 থেকে 3 পর্যন্ত পথে প্রান্তের সংখ্যা 3 কারণ:
- নোডের সংখ্যা যা 3 থাকে তবে 4: 2 নোড থাকে না
- নোডের সংখ্যা যা 4 রয়েছে তবে 3: 1 নোড নয়
লক্ষ্য করুন যে এটি সরাসরি এমন লক্ষ্যে চলে যাওয়ার পথেও কাজ করে, উদাহরণস্বরূপ পাথের জন্য 3 থেকে 2 পর্যন্ত প্রান্তের সংখ্যা 1 কারণ:
- নোডের সংখ্যা যা 2 রয়েছে তবে 3: 0 নোড নেই
- নোডের সংখ্যা যা 3 রয়েছে তবে 2: 1 নোড নয়
তারপরে আমরা এই সমস্ত সংমিশ্রণের উপর সমষ্টি করতে পারি।
আপনি যদি পরিবর্তে কেবল কোনও নোডের দিকে লক্ষ্য করেন তবে পূর্বপুরুষের সেট সহ নোড 2 {2,3}
। এই নোডটি পথটি প্রক্রিয়া করার সময় একবার অবদান রাখতে চলেছে 2 to 1
কারণ এতে 2 রয়েছে তবে 1 টি নয় 1 3 to 2
কারণ এটি পাথের জন্য কোনও অবদান রাখবে না কারণ এতে 2 এবং 3 উভয়ই রয়েছে, তবে পথটি প্রক্রিয়া করার সময় এটি একবার অবদান রাখবে 4 to 3
কারণ 3 টি রয়েছে তবে নং ৪. সাধারণভাবে কোনও নোডের পূর্বপুরুষের সংখ্যার প্রতিটি প্রতিবেশীর জন্য একটি অংশ অবদান রাখবে (উচ্চতর একের নীচে) যা সেটে নেই। সর্বাধিক উপাদান ব্যতীত (এই ক্ষেত্রে 4) কোনও পথ না থাকায় কেবল নিম্ন প্রতিবেশী 3 এর জন্য অবদান রাখে5 to 4
। সিমুলার 0 টি একতরফা, তবে যেহেতু 0 টি সর্বদা গাছের গোড়ায় থাকে এবং এতে সমস্ত সংখ্যা থাকে (এটি চূড়ান্ত যোগদান এবং আমরা যোগদানের গণনা করি না) 0 থেকে কোনও অবদান নেই তাই কেবল নোড 0 ছেড়ে যাওয়া সবচেয়ে সহজ to পুরোপুরি বাইরে।
সুতরাং আমরা প্রতিটি নোডের জন্য পূর্বপুরুষের সেটটি দেখে, সমস্যার অবদান এবং সমস্ত নোডের যোগফল গণনা করেও সমস্যার সমাধান করতে পারি।
প্রতিবেশীদের সহজেই প্রক্রিয়া করার জন্য আমি পূর্বপুরুষের সেটগুলিকে শূন্যস্থান এবং 1 এর স্ট্রিং হিসাবে প্রতিনিধিত্ব করতে যাচ্ছি যেখানে পজিশনের প্রতি 1 জন n-1-p উপস্থাপনা করে। সুতরাং উদাহরণস্বরূপ আমাদের n=5
1 পজিশনে 0 ইঙ্গিত করে যে 4 পূর্বপুরুষ। আমি চলার জায়গাগুলি ছেড়ে দেব। সুতরাং আমি যে গাছটি তৈরি করব তার প্রকৃত উপস্থাপনা হ'ল:
" 1"
|
" 11" "1"
\ /
\ /
"1111"
লক্ষ্য করুন যে আমি নোড 0 রেখেছি যা প্রতিনিধিত্ব করবে "11111"
কারণ আমি নোড 0 উপেক্ষা করছি (এটি কখনই অবদান রাখে না)।
নীচের প্রতিবেশী নয় এমন পূর্বপুরুষদের এখন 1 এর ক্রমের শেষে প্রতিনিধিত্ব করা হয়। উচ্চতর প্রতিবেশী না হয়ে পূর্বপুরুষদের এখন 1 এর অনুক্রমের সূচনা দ্বারা প্রতিনিধিত্ব করা হয়, তবে স্ট্রিংয়ের শুরুতে আমাদের কোনও ক্রমের কোনও সূচনা উপেক্ষা করা উচিত কারণ এটি সেই পথটিকে উপস্থাপন করে 5 to 4
যা বিদ্যমান নেই। এই সংমিশ্রণটি হুবহু মিলে গেছে রেজেক্সের সাথে /.\b/
।
পূর্বপুরুষের স্ট্রিংগুলি ক্রমানুসারে সমস্ত নোডগুলি প্রক্রিয়াজাতকরণ দ্বারা সম্পন্ন হয় n-1 .. 1
এবং নোডের নিজের অবস্থানে এবং 1 বা "বংশধর" এর মধ্যে একটি 1 সেট করে।
প্রোগ্রামটি যে এত সহজে বোঝা যায় তার সাথে:
-ap read STDIN into $_ and @F
map{ }1-$_..-1 Process from n-1 to 1,
but use the negative
values so we can use a
perl sequence.
I will keep the current
ancestor for node $i in
global ${-$i} (another
reason to use negative
values since $1, $2 etc.
are read-only
$$_|$"x$p++.1 "Or" the current node
position into its ancestor
accumulator
$_= Assign the ancestor string
to $_. This will overwrite
the current counter value
but that has no influence
on the following counter
values
${"-@F"%$_}|= Merge the current node
ancestor string into the
successor
Notice that because this
is an |= the index
calculation was done
before the assignment
to $_ so $_ is still -i.
-n % -i = - (n % i), so
this is indeed the proper
index
/.\b/g As explained above this
gives the list of missing
higher and lower neighbours
but skips the start
$_= A map in scalar context
counts the number of
elements, so this assigns
the grand total to $_.
The -p implicitly prints
লক্ষ্য করুন যে পরিবর্তে প্রতিস্থাপন /.\b/
করা /\b/
এই সমস্যার রাউন্ডট্রিপ সংস্করণ সমাধান করে যেখানে টারজানও পথ গ্রহণ করে0 to n-1
পূর্বপুরুষের স্ট্রিংগুলি কীভাবে দেখায় তার কয়েকটি উদাহরণ (ক্রমে দেওয়া n-1 .. 1
):
n=23:
1
1
1
1
1
1
1
1
1
1
1
11
1 1
1 1
1 1
11 11
1 1
11 1 1 11
1 1
1111 11 11 1111
111111111 111111111
1111111111111111111111
edges=68
n=24:
1
1
1
1
1
1
1
1
1
1
1
1
1 1
1 1
1 1
1 1
1 1
1 1 1 1
1 1
11 1 1 11
1 1 1 1
1 1 1 1
1 1
edges=82