पर्ल, 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 है। यह पथ के लिए कुछ भी योगदान नहीं करेगा 3 to 2
क्योंकि इसमें 2 और 3 दोनों हैं, लेकिन यह एक बार योगदान देगा जब पथ को संसाधित करना होगा 4 to 3
क्योंकि इसमें 3 नहीं है लेकिन नहीं 4. सामान्य रूप से नोड के पूर्वज सेट में एक संख्या प्रत्येक पड़ोसी (उच्चतर के निचले हिस्से) के लिए एक का योगदान करेगी जो सेट में नहीं है। अधिकतम तत्व को छोड़कर (इस मामले में 4) जो केवल कम पड़ोसी 3 के लिए योगदान देता है क्योंकि कोई रास्ता नहीं है5 to 4
। Simular 0 एक तरफा है, लेकिन चूंकि 0 हमेशा पेड़ की जड़ में होता है और इसमें सभी संख्याएँ होती हैं (यह अंतिम जुड़ाव है और हम जुड़ते नहीं हैं) 0 से कोई योगदान कभी नहीं होता है इसलिए नोड 0 को छोड़ना सबसे आसान है। पूरी तरह से।
इसलिए हम प्रत्येक नोड के लिए पूर्वज सेट को देखते हुए, सभी नोड्स पर योगदान और योग की गणना करके समस्या को हल कर सकते हैं।
पड़ोसियों को आसानी से संसाधित करने के लिए, मैं पूर्वजों के रिक्त स्थान की एक स्ट्रिंग के रूप में प्रतिनिधित्व करने जा रहा हूं और जहां स्थिति 1 पर प्रत्येक 1 का प्रतिनिधित्व करता है कि n-1-p एक पूर्वज है। इसलिए उदाहरण के लिए 1 के हमारे मामले में n=5
0 से संकेत मिलता है कि 4 पूर्वज है। मैं अनुगामी स्थानों को छोड़ दूंगा। तो मेरे द्वारा बनाए गए पेड़ का वास्तविक प्रतिनिधित्व होगा:
" 1"
|
" 11" "1"
\ /
\ /
"1111"
ध्यान दें कि मैंने नोड 0 छोड़ दिया है जिसका प्रतिनिधित्व "11111"
इसलिए किया जाएगा क्योंकि मैं नोड 0 को अनदेखा करने जा रहा हूं (यह कभी योगदान नहीं करता है)।
अब 1 के अनुक्रम के अंत में बिना निचले पड़ोसी वाले पूर्वजों का प्रतिनिधित्व किया जाता है। अब किसी भी उच्च पड़ोसी वाले पूर्वजों को 1 के अनुक्रम के प्रारंभ द्वारा प्रस्तुत नहीं किया जाता है, लेकिन हमें एक स्ट्रिंग की शुरुआत में अनुक्रम की किसी भी शुरुआत को अनदेखा करना चाहिए क्योंकि यह उस पथ का प्रतिनिधित्व करता है 5 to 4
जो मौजूद नहीं है। यह संयोजन रेगेक्स द्वारा बिल्कुल मेल खाता है /.\b/
।
पूर्वज तारों का निर्माण क्रम में सभी नोड्स को संसाधित करके किया जाता है n-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