টারজানের অলিম্পিক ভাইন-সুইং রুটিন স্কোর করুন


32

অলিম্পিকের দ্রাক্ষালতাগণ স্ট্যান্ডার্ড গাছগুলিতে তাদের রুটিনগুলি সম্পাদন করে। বিশেষ করে, স্ট্যান্ডার্ড বৃক্ষ nজন্য কোণ রয়েছে 0মাধ্যমে আপ n-1এবং প্রতিটি অশূন্য প্রান্তবিন্দু লিঙ্ক প্রান্ত aপ্রান্তবিন্দু করতে n % aনীচের। সুতরাং, উদাহরণস্বরূপ, স্ট্যান্ডার্ড ট্রি 5 এর মতো দেখাচ্ছে:

3
|
2   4
 \ /
  1
  |
  0

কারণ 5 যখন 3 দ্বারা বিভাজিত হয় তখন 2 হয় 2, যখন 5 টি 2 বা 4 দ্বারা বিভাজিত হয় তখন 1 হয়, এবং অবশিষ্ট 5 যখন 1 দ্বারা বিভাজিত হয় 0 হয়।

এই বছর, টারজান নতুন রুটিন দিয়ে তার সোনার প্রতিরক্ষা করবে, যার প্রত্যেকটিই শীর্ষে শুরু হবে, শীর্ষবিন্দুতে n - 1দুলতে থাকবে n - 2, শীর্ষে থাকবে n - 3, ইত্যাদি, অবশেষে সেটি ভার্টেক্সে প্রত্যাখ্যান করবে 0

একটি রুটিনের জন্য স্কোর হ'ল প্রতিটি সুইংয়ের স্কোরগুলির সমষ্টি (বরখাস্ত সহ), এবং একটি দোলের জন্য স্কোর গাছের মধ্যে তার শুরু এবং শেষ পয়েন্টগুলির মধ্যে দূরত্ব। সুতরাং, স্ট্যান্ডার্ড ট্রি 5 এ টারজানের রুটিনটির স্কোর 6:

  • থেকে একটি সুইং 4করতে 3স্কোর তিন পয়েন্ট (নিচে, আপ, আপ),
  • থেকে একটি সুইং 3করতে 2স্কোর এক পয়েন্ট (নিচে),
  • থেকে একটি সুইং 2করতে 1স্কোর এক পয়েন্ট (নিচে), এবং
  • থেকে একটি অবতরণ করান 1করার 0স্কোর এক পয়েন্ট (নিচে)।

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা একটি ধনাত্মক পূর্ণসংখ্যার nসাহায্যে স্ট্যান্ডার্ড ট্রি তে টারজানের রুটিনের স্কোরকে গণনা করে n। নমুনা ইনপুট এবং আউটপুট:

 1 ->  0
 2 ->  1
 3 ->  2
 4 ->  6
 5 ->  6
 6 -> 12
 7 -> 12
 8 -> 18
 9 -> 22
10 -> 32
11 -> 24
12 -> 34
13 -> 34
14 -> 36
15 -> 44
16 -> 58
17 -> 50
18 -> 64
19 -> 60
20 -> 66
21 -> 78
22 -> 88
23 -> 68
24 -> 82

নিয়ম এবং কোড স্কোরিং জন্য যথারীতি ।


9
আমি এই ক্রমটি OEIS এ খুঁজে পেতে ব্যর্থ। দুর্দান্ত প্রশ্ন।
লিকি নুন

8
দুর্দান্ত অনুমান!
xnor

1
পছন্দ করুন এটি একটি খুব মূল ক্রম! (এমনকি ব্যাকস্টোরি ছাড়াই)
ড্যানথম্যান

উত্তর:


12

সি, 98 97 বাইট

F(i){int c[i],t=i-2,n=0,p;for(;++n<i;)for(p=c[n]=n;p=i%p;c[p]=n)t+=c[p]<n-1;return i>2?t*2:i-1;}

নিম্নলিখিত সূত্রের সাথে এটি প্রতিটি জোড় পয়েন্টের মধ্যকার দূরত্ব গণনা করে:

  • মূল থেকে নোড এ পর্যন্ত দূরত্ব যুক্ত করুন
  • মূল থেকে নোড বি পর্যন্ত দূরত্ব যুক্ত করুন
  • 2 এবং A এর সাধারণ মূলের দৈর্ঘ্য বিয়োগ করুন

এটির সুবিধাটি হ'ল যখন সমস্ত জোড় প্রয়োগ করা হয় তবে এটি একই রকম:

  • প্রতিটি নোডের মূল থেকে 2 * দূরত্ব যুক্ত করুন
  • প্রতিটি নোড জুটির সাধারণ মূলের দৈর্ঘ্য 2 টি বিয়োগ করুন
  • মূল থেকে প্রথম নোডের দূরত্ব বিয়োগ করুন
  • মূল থেকে শেষ নোডের দূরত্ব বিয়োগ করুন

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

                    n+1 % n = 1  for all n > 1
and:                  n % 1 = 0  for all n >= 0
therefore:  n % (n % (n-1)) = 0  for all n > 2

এর অর্থ আমাদের কয়েকটি বিশেষ কেস রয়েছে (এন <2) তবে আমরা সহজেই এগুলির জন্য অ্যাকাউন্ট করতে পারি।

ভাঙ্গন:

F(i){                               // Types default to int
    int c[i],                       // Buffer for storing paths
        t=i-2,                      // Running total score
        n=0,                        // Loop index
        p;                          // Inner loop variable
    for(;++n<i;)                    // Loop through all node pairs (n-1, n)
        for(p=c[n]=n;p=i%p;c[p]=n)  //  Recurse from current node (n) to root
            t+=c[p]<n-1;            //   Increase total unless this is a common
                                    //   node with the previous path
    return i>2?   :i-1;             // Account for special cases at 1 and 2
               t*2                  // For non-special cases, multiply total by 2
}

ধন্যবাদ 1 ফেয়ারস 1 বাইট সংরক্ষণের জন্য


বোনাস: গাছ!

এই গাছগুলি দেখতে কেমন তা দেখার জন্য আমি একটি দ্রুত এবং নোংরা প্রোগ্রাম লিখেছিলাম। এখানে কিছু ফলাফল রয়েছে:

6:

5 4  
| |  
1 2 3
 \|/ 
  0  

8:

  5      
  |      
7 3   6  
|  \ /   
1   2   4
'--\|/--'
    0    

13:

   08              
    |              
11 05   10 09 07   
 |   \ /    |  |   
02   03    04 06 12
 '-----\  /---'--' 
        01         
         |         
        00         

19:

   12                       
    |                       
   07   14                  
     \ /                    
     05    15 11            
       \  /    |            
17      04    08 16 13 10   
 |       '-\  /--'   |  |   
02          03      06 09 18
 '---------\ |/-----'--'--' 
            01              
             |              
            00              

49:

                         31                                                    
                          |                                                    
           30            18   36                                               
            |              \ /                                                 
           19   38 27      13    39 29    32                                   
             \ /    |        \  /    |     |                                   
   26        11    22 44      10    20 40 17   34                              
    |         '-\  /--'        '-\  /--'    \ /                                
47 23   46       05               09        15    45 43 41 37 33 25    35 28   
 |   \ /          '--------------\ |/-------'-----'   |  |  |  |  |     |  |   
02   03                           04                 06 08 12 16 24 48 14 21 42
 '----'--------------------------\ |/----------------'--'--'--'--'--'    \ |/  
                                  01                                      07   
                                   '-----------------\  /-----------------'    
                                                      00                       

রিটার্নের স্টেটমেন্টে কিছু অতিরিক্ত অতিরিক্ত বন্ধনী রয়েছে।
20:30

@ ফেয়ারসাম ডি'ওহ! তারা সবসময় অতিরিক্ত অতিরিক্ত ছিল না, তবে তারপরে আমি বিশেষ কেস হ্যান্ডলিংয়ে পরিবর্তন করেছি। ধন্যবাদ!
ডেভ

3
ভিজ্যুয়ালাইজেশন পছন্দ!
এডওয়ার্ড

7

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

def f(a,i=1):h=lambda n:n and{n}|h(a%n)or{0};return i<a and len(h(i)^h(i-1))+f(a,i+1)

7

পার্ল, 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=51 পজিশনে 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

ওফস, দুঃখিত আমি বুঝতে পারি নি যে আপনার সম্পাদনাটি কয়েক সেকেন্ড পুরানো। যাইহোক, খুব ঝরঝরে পদ্ধতির এবং ব্যাখ্যা!
FryAmTheEggman

@ ফ্রাইআম দ্য এজিগম্যান কোনও সমস্যা নেই, আমরা ঠিক একই লেআউট সমস্যাটি ঠিক করছিলাম। যাইহোক, হ্যাঁ, এই প্রোগ্রামে সমস্ত টুকরোটি কীভাবে একত্রিত হয়েছিল তা নিয়ে আমি বেশ খুশি। আমি বর্তমানে কোনও ফ্যাট কেটে দেখতে পাচ্ছি না ..
টন হসপেল

3

গণিত, 113 103 102 বাইট

(r=Range[a=#-1];Length@Flatten[FindShortestPath[Graph[Thread[r<->Mod[a+1,r]]],#,#2]&@@{#,#-1}&/@r]-a)&

-10 বাইটস @ ফেয়ারসামকে ধন্যবাদ; -১ বাইট @ মার্টিনইেন্ডারকে ধন্যবাদ

নিম্নোক্ত পর্যন্ত (কিন্তু আর দুর্ভাগ্যবশত, এ দ্রুততর 158 বাইট ):

(a=#;If[a<4,Part[-{1,1,1,-6},a],If[EvenQ@a,-2,1]]+a+4Total[Length@Complement[#,#2]&@@#&/@Partition[NestWhileList[Mod[a,#]&,#,#!=0&]&/@Range@Floor[a/2],2,1]])&

আমি বিশ্বাস করি আপনি ব্যবহার না করে জিনিস বরাদ্দ করতে পারেন With। এছাড়াও এটি দেখতে প্রতিটি সময় Rangeব্যবহৃত হয় বলে মনে হচ্ছে , aএটি আর্গুমেন্ট, যাতে এটি সন্ধান করা যেতে পারে।
শুক্রবার

1
r=Range[a=#-1]একটি বাইট সংরক্ষণ করে।
মার্টিন ইন্ডার

2

জে, 37 বাইট

[:+/2(-.+&#-.~)/\|:@(]|~^:(<@>:@[)i.)

ব্যবহার:

   f=.[:+/2(-.+&#-.~)/\|:@(]|~^:(<@>:@[)i.)
   f 10
32
   f every 1+i.20
0 1 2 6 6 12 12 18 22 32 24 34 34 36 44 58 50 64 60 66

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


আমি কীভাবে এটি কাজ করে তার একটি ব্রেকডাউন দেখতে আগ্রহী। এছাড়াও tryj.tk পরিষেবাটি ভাঙ্গা বলে মনে হচ্ছে ("লোকালস্টোরাজ পড়তে ব্যর্থ হয়েছে ..." এবং "$ (…)। অন্তর্বর্তী কোনও ফাংশন নয়")
ডেভ

@ ডেভ সেই সাইটটি আমার পক্ষে ক্রোমে খুব বেশি কাজ করে না, তবে আমি যদি আইই বা এজ ব্যবহার করার চেষ্টা করি তবে তা কাজ করে তবে আমি যদি আপনার আগ্রহী হয় তবে জে ( লিঙ্ক ) ইনস্টল করার প্রস্তাব দিই !
মাইল 23

@ মাইলস অদ্ভুত, আমার জন্য এটি সমস্ত ব্রাউজারগুলির জন্য কাজ করে (এফএফ, ক্রোম, আইই)।
এলোমেলো

এটি ক্রোম ব্যবহার করে আমার পক্ষে কাজ করেছিল, তবে এটি কয়েক মাস আগে কাজ করা বন্ধ করে দিয়ে ডেভের
মাইল

আমি কিছু সময় পেলে অ্যাডওয়ার্ড করণীয়।
এলোমেলো

1

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

n=>[...Array(n)].map(g=(_,i)=>i?[...g(_,n%i),i]:[],r=0).reduce(g=(x,y,i)=>x.map(e=>r+=!y.includes(e))&&i?g(y,x):x)|r

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

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