Von Koch varsayımı


10

Matematikçi von Koch'u ünlü kar tanesiyle tanıyor olabilirsiniz. Ancak daha ilginç bilgisayar bilimi sorunları var. Gerçekten, bu varsayımlara bir göz atalım:

nDüğümleri olan bir ağaç verilir (böylece n-1kenarlar). Düğümler numaralandırmak için bir yol bulmak 1için nve, buna bağlı olarak, gelen kenarları 1için n-1öyle bir şekilde, her bir kenar için kolan düğüm sayıları farkı eşittir k. Tahmin, bunun her zaman mümkün olduğudur.

İşte mükemmel bir şekilde açıklamak için bir örnek:

resim açıklamasını buraya girin

SENİN GÖREVİN

Kodunuz bir ağaç girişi olarak alacaktır, istediğiniz formatı alabilirsiniz, ancak test senaryoları için ağacı yayları ve düğümlerinin listesi ile vereceğim.

Örneğin, resimdeki ağaç için giriş budur:

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

Kodunuz ağacı düğümler ve kenarlar numaralandırılmış olarak döndürmelidir. Daha grafiksel bir çıktı döndürebilirsiniz, ancak test senaryoları için bu tür çıktılar sağlayacağım:

[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

TEST DAVALARI

[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

Bu bu bayt kazanmak en kısa cevap!

Not: Bu, her ağacın zarif bir etikete sahip olduğunu belirten Ringel-Kotzig varsayımından daha güçlüdür . Koch varsayımında Ringel-Kotzig varsayımındaki zarif etiketlemenin aksine etiketleme için tam sayıları atlamak mümkün değildir. Daha önce burada zarif etiketleme istenmiştir .


26'dan fazla düğüm olacak mı?
Leaky Nun

@LeakyNun 17 düğümden sonra kuvveti yakmak zaten zordur ^^

@WheatWizard Bu, von Koch varsayımı ile kesinlikle aynı değildir, çünkü bu iş parçacığında tamsayıları atlamanıza izin verilir. Bu varsayımın tamamı etiketlemeyi atlamadan mümkün

Yanıtlar:


3

Jöle , 30 bayt

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

Çevrimiçi deneyin! ( GṄ³çGÇıktıyı daha güzel hale getirmek için altbilgi olarak kullanın .)

Örneğe benzer girişler, ör. abcdefVe[d,a],[a,b],[a,g],[b,c],[b,e],[e,f]

Listeyi örneğin a,b,c,d,e,fsırayla çıkarır.

Not: Programım, hepsi geçerli olan birkaç olasılık olduğu için test senaryolarından farklı değerler üretir.

açıklama

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 

Tüm olası çözümleri göstererek 1 bayt tasarruf edin:

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

Çevrimiçi deneyin! ( GṄ³çG⁷³GÇıktıyı daha güzel hale getirmek için altbilgi olarak kullanın )

Test senaryosunu bir giriş listesine kopyalamak için dönüştürücüyü kullanın .


1

Ruby, 108 bayt

lamba fonksiyonu, kenarları içeren 2 elemanlı diziler dizisini kabul eder (burada her kenar ilgili notalara karşılık gelen bir çift sayı olarak ifade edilir.)

->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])}}

Test programında yönlendirilmemiş

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]]]

Çıktı

output, aşağıdakileri içeren 2 elemanlı bir dizidir:

yeni düğüm numaralandırma

kenar numaralandırma.

Örneğin, ilk örneğin birinci kenarı [4,1], yeni düğüm numaralandırmasının altındaki düğüm 6 ve 1 arasındadır ve bu nedenle kenar 6-1 = 5'tir.

[[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]]

Aslında her test durumu için birden çok çözüm vardır. returnİlki bulunduğunda işlevini durdurur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.