Здогад фон Коха


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

Це це найкоротша відповідь у виграші байтів!

Примітка. Це сильніше, ніж гіпотеза Рінгеля-Котцига , яка стверджує, що кожне дерево має витончене маркування. Оскільки в гіпотезі Коха не можна пропустити цілі числа для маркування, що суперечить витонченому маркуванню в гіпотезі Рінгеля-Котцига. Витончена маркування була запропонована до тут .


Чи буде більше 26 вузлів?
Лина монашка

@LeakyNun Після 17 вузлів вже важко жорстоко змусити ^^

@WheatWizard Це абсолютно не те саме, що гіпотеза фон Коха, оскільки в цій темі ви можете пропускати цілі числа. Вся суть припущення робить можливе маркування без пропускання

Відповіді:


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 байт

функція lamba, приймає масив двоелементних масивів, що містять ребра (де кожен край виражається у вигляді пари чисел, що відповідають відповідним приміткам.)

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

Ungolfed в тестовій програмі

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зупиняє функцію після того , як перший один знайдений.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.