ভন কোচ অনুমান


10

আপনি গণিতবিদ ভন কোচকে তাঁর বিখ্যাত স্নোফ্লেকের মাধ্যমে জানেন। তবে তার আস্তিনে কম্পিউটার বিজ্ঞানের আরও আকর্ষণীয় সমস্যা রয়েছে। প্রকৃতপক্ষে, এই অনুমানটি একবার দেখে নেওয়া যাক:

nনোড (এই n-1প্রান্ত) সহ একটি গাছ দেওয়া হয়েছে । থেকে নোড গনা একটি উপায় খুঁজুন 1করতে nএবং সেই অনুযায়ী, থেকে প্রান্ত 1থেকে n-1এমনভাবে, প্রতিটি প্রান্ত জন্য kতার নোড সংখ্যার পার্থক্য থেকে সমান k। অনুমান যে এটি সর্বদা সম্ভব।

এটি পুরোপুরি পরিষ্কার করার জন্য এখানে একটি উদাহরণ রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

তোমার কাজ

আপনার কোডটি একটি গাছকে ইনপুট হিসাবে গ্রহণ করবে, আপনি যে ফর্ম্যাটটি চান তা নিতে পারেন তবে পরীক্ষার ক্ষেত্রে আমি গাছটি তাদের আর্ক এবং তাদের নোডের তালিকা দিয়ে দেব।

উদাহরণস্বরূপ, ছবিতে গাছটির জন্য এটি ইনপুট:

[a,b,c,d,e,f,g]
d -> a
a -> b
a -> g
b -> c
b -> e
e -> f

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

[a7,b3,c6,d1,e5,f4,g2]
d -> a 6
a -> b 4
a -> g 5
b -> c 3
b -> e 2
e -> f 1

পরীক্ষার কেস

[a,b,c,d,e,f,g]             [a7,b3,c6,d1,e5,f4,g2]
d -> a                      d -> a 6
a -> b                      a -> b 4
a -> g             =>       a -> g 5
b -> c                      b -> c 3
b -> e                      b -> e 2
e -> f                      e -> f 1


[a,b,c,d]                   [a4,b1,c3,d2]
a -> b                      a -> b 3
b -> c            =>        b -> c 2
b -> d                      b -> d 1


[a,b,c,d,e]                [a2,b3,c1,d4,e5]
a -> b                      a -> b 1
b -> c                      b -> c 2
c -> d             =>       c -> d 3
c -> e                      c -> e 4

এটি এটি বাইট জয়ের স্বল্পতম উত্তর!

দ্রষ্টব্য: এটি রিংগেল-কোটজিগ অনুমানের চেয়েও শক্তিশালী , যাতে প্রতিটি গাছের কাছে একটি সুন্দর লেবেল রয়েছে states যেহেতু কোচ অনুমানের ক্ষেত্রে রিঞ্জেল-কোটজিগ অনুমানের সুদৃ .় লেবেলিংয়ের বিপরীতে লেবেলিংয়ের জন্য পূর্ণসংখ্যাগুলি এড়ানো সম্ভব নয়। গ্রেফুল লেবেলিং এখানে আগে জিজ্ঞাসা করা হয়েছে


26 টিরও বেশি নোড থাকবে?
লিকি নুন

@LakakyNun 17 নোডের পরে জোর করে শক্ত করা ইতিমধ্যে শক্ত ^^

@ ওয়েট উইজার্ড এটি ভন কোচ অনুমানের মতো একেবারে সমান নয়, যেহেতু এই থ্রেডে আপনাকে পূর্ণসংখ্যা এড়িয়ে যাওয়ার অনুমতি দেওয়া হয়েছে। অনুমানের পুরো পয়েন্টটি এড়িয়ে যাওয়া ছাড়াই

উত্তর:


3

জেলি , 30 বাইট

JŒ!³,$€
ǵy⁴VIAµ€Q⁼$€TðḢịø³JŒ!

এটি অনলাইন চেষ্টা করুন! ( GṄ³çGআউটপুট প্রাক্টিয়ের করতে ফুটার হিসাবে ব্যবহার করুন ))

উদাহরণ অনুরূপ ইনপুট, যেমন abcdefএবং[d,a],[a,b],[a,g],[b,c],[b,e],[e,f]

a,b,c,d,e,fক্রম হিসাবে তালিকা আউটপুট ।

দ্রষ্টব্য: আমার প্রোগ্রামটি পরীক্ষার কেসের চেয়ে আলাদা মান উত্পন্ন করে কারণ সেখানে বেশ কয়েকটি সম্ভাবনা রয়েছে যা সমস্ত বৈধ।

ব্যাখ্যা

JŒ!³,$€                - helper function, generates all possible numberings, input is e.g. 'abcd'
J                      - range(len(input)). e.g. [1,2,3,4]
 Œ!                    - all permutations of the range.
   ³,$                 - pair the input with ... 
      €                - each permutation. Sample element e.g. ['abcd',[3,1,2,4]]

ǵy⁴VIAµ€Q⁼$€TðḢịø³JŒ! - main dyadic link, input is e.g. 'abcd' and '[a,b],[b,c],[b,d]'
 µy                    - use a numbering as an element-wise mapping e.g. 'abcd'->[3,1,2,4]
   ⁴                   - apply this to the list of edges. e.g. '[3,1],[1,2],[1,4]'
    V                  - turn this into an internal list.
     IAµ€              - find absolute difference on each edge
         Q⁼            - Is this invariant under deduplication? Returns 1 if the numbering is valid; 0 otherwise.
Ç          $€          - apply this to all possible numberings
             Tð        - return the indices of all valid numberings
               Ḣ       - choose the first one and
                ị      - get the element corresponding to its index in 
                 ø³JŒ! - all possible numberings 

সমস্ত সম্ভাব্য সমাধান দেখিয়ে 1 বাইট সংরক্ষণ করুন:

JŒ!³,$€
ǵy⁴VIAµ€Q⁼$€Tðịø³JŒ!

এটি অনলাইন চেষ্টা করুন! ( GṄ³çG⁷³Gআউটপুট প্রিটিয়ার করতে ফুটার হিসাবে ব্যবহার করুন )

পরীক্ষার কেসটিকে ইনপুট তালিকায় কপি-পেস্ট করতে রূপান্তরকারী ব্যবহার করুন।


1

রুবি, 108 বাইট

লাম্বা ফাংশন, প্রান্তগুলি সহ 2-উপাদান অ্যারেগুলির অ্যারে গ্রহণ করে (যেখানে প্রতিটি প্রান্তটি প্রাসঙ্গিক নোটের সাথে সংখ্যার জোড় হিসাবে প্রকাশ করা হয়))

->a{[*1..1+n=a.size].permutation.map{|i|k=a.map{|j|(i[j[0]-1]-i[j[1]-1]).abs}
(k&k).size==n&&(return[i,k])}}

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ

f=->a{                                    #Accept an array of n tuples (where n is the number of EDGES in this case)
  [*1..1+n=a.size].permutation.map{|i|    #Generate a range 1..n+1 to label the nodes, convert to array, make an array of all permutations and iterate through it.
    k=a.map{|j|(i[j[0]-1]-i[j[1]-1]).abs} #Iterate through a, build an array k of differences between nodes per current permutation, as a trial edge labelling.
    (k&k).size==n&&(return[i,k])          #Intersect k with itself to remove duplicates. If all elements are unique the size will still equal n so
  }                                       #return a 2 element array [list of nodes, list of edges]
}

p f[[[4,1],[1,2],[1,7],[2,3],[2,5],[5,6]]]

p f[[[1,2],[2,3],[2,4]]]

p f[[[1,2],[2,3],[3,4],[2,5]]]

আউটপুট

আউটপুট হ'ল একটি 2 উপাদান অ্যারে, সমেত:

নতুন নোড নম্বর

প্রান্ত নম্বর।

উদাহরণস্বরূপ, প্রথম উদাহরণের প্রথম প্রান্তটি [4,1]নোড 6 এবং 1 এর মধ্যে নতুন নোড সংখ্যার অধীনে এবং তাই 6-1 = 5 প্রান্ত।

[[1, 5, 2, 6, 3, 4, 7], [5, 4, 6, 3, 2, 1]]
[[1, 4, 2, 3], [3, 2, 1]]
[[1, 5, 3, 4, 2], [4, 2, 1, 3]]

প্রতিটি পরীক্ষার ক্ষেত্রে একাধিক দ্রাবক রয়েছে। returnফাংশন স্টপ একবার প্রথম এক পাওয়া যায়।

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