Перевірте трикутник голосування


12

Номер бюлетеня , який ми позначимо B , - це кількість способів упорядкування чисел від 1 до B (B + 1) / 2 в трикутник, таким чином, щоб кожен рядок і стовпець знаходилися в будь-якому порядку, що збільшується. Перші чотири бюлетені:

a(0) = 1
a(1) = 1
a(2) = 1
a(3) = 2

a(3)дорівнює 2, що означає, що існує два способи впорядкування чисел від 1 до 3(3+1)/2 = 6такого трикутника:

1          1
2 3    or  2 4
4 5 6      3 5 6

Для отримання детальної інформації див. Запис послідовності OEIS .

Ваша задача, задана трикутником для голосування, - перевірити її правильність. Якщо він відповідає умовам трикутника виборчого бюлетеня (рядки та стовпці збільшуються), слід вивести, скільки інших способів (виключаючи той, що знаходиться на вході) існує, щоб правильно розташувати трикутник. Якщо вхідний трикутник неправильно побудований, нічого не слід виводити.

Доступні нові рядки дозволені.

Вхідні дані

Трикутник чисел, який може бути або не бути дійсним трикутником для голосування. Наприклад:

1
2 3
4 5 6

1
10 5 
9 8 2
7 6 4 3

1
3 2

9
2 11
14 3 5
12 8 1 7
15 13 10 4 6

1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21

Вихідні дані

Якщо вхід є дійсним трикутником для голосування, що залишилася кількість способів розташування однакових чисел у дійсному трикутнику для голосування. Якщо введення не є дійсним трикутником для голосування, нічого. Наприклад, наведені вище введення дають ці результати ( <nothing>є заповнювачем для фактичного порожнього виводу):

1                     # the same as a(3)-1

<nothing>

<nothing>

<nothing>

33591                 # the same as a(6)-1

Оцінка балів

Це : як завжди, виграє найменший байт. Tiebreaker є найбільш раннім розміщенням.


1
Напевно, ви повинні згадати, що стовпці також в порядку зростання. Це мене бентежило, поки я не шукав визначення OEIS.
ballesta25

Тоді чому не 1/4 5/2 3 6дійсний?
Leaky Nun

Спеціальність виправлена ​​- я неправильно прочитав запис OEIS. @ ballesta25
ArtOfCode

cc @LeakyNun ^
ArtOfCode

Чи можемо ми припустити, що вхід буде містити правильні числа, навіть якщо вони не в правильному порядку?
Денніс

Відповіді:


4

Желе , 20 байт

;Zµ⁼Ṣ€
ẋÇFŒ!ṁ€⁸ÇÐfL’

Для дійсних трикутників для голосування тривалість часу використання та пам’яті становить щонайменше O (n!) , Де n - кількість записів трикутника. Недійсні розпізнаються за збоєм, таким чином нічого не друкуючи.

Спробуйте в Інтернеті!

Тестовий запуск

Місцево мені вдалося переконатися, що (4) розраховано правильно.

$ time jelly eun ';Zµ⁼Ṣ€¶ẋÇFŒ!ṁ€⁸ÇÐfL’' '[1],[2,3],[4,5,6],[7,8,9,10]'
11

real    6m9.829s
user    6m7.930s
sys     0m2.579s

Як це працює

;Zµ⁼Ṣ€         Helper link. Argument: T (triangular array)

 Z             Zip/transpose T.
;              Concatenate the original and the transposed copy.
  µ            Begin a new monadic chain, with the previous result (R) as argument.
    Ṣ€         Sort each array in R.
   ⁼           Test for equality with R.
               This returns 1 if T is a ballot triangle, 0 if not.

ẋÇFŒ!ṁ€⁸ÇÐfL’  Main link. Argument: A (triangular array)

 Ç             Call the helper link with argument A.
ẋ              Repeat A that many times.
               This yields an empty array if A is not a ballot triangle.
  F            Flatten the result.
   Œ!          Generate all permutations of the digits of A.
     ṁ€⁸       Mold each permutation like A, i.e., give it triangular form.
               This crashes if permutation array is empty.
        ÇÐf    Filter; keep permutations for which the helper link returns 1.
           L’  Compute the length and decrement it.

3

Брахілог , 44 байти

{:{o?}a,?z:2a},?ly+yb:3flw
p~c.:laBtybB,.:1&

Спробуйте в Інтернеті!

Це працює в подвійному експоненціальному часі, тому для пробних тестів вам потрібно буде повірити, що теоретично це дає правильний результат для трикутників, довжина яких більша або дорівнює 3.

Ви все ще можете перевірити наявність фальсифікованих вітрин, вони повинні закінчитися досить швидко.


Мені довелося оновити специфікацію - і рядки, і стовпці повинні збільшуватися. Результат мене неправильно прочитав запис OEIS. Вибачте, якщо це визнає недійсною вашу відповідь!
ArtOfCode

@ArtOfCode Ось так я і робив мою відповідь
Leaky Nun

2

JavaScript (ES6), 143 байти

a=>a.some((b,i)=>b.some((c,j)=>c<b[j-1]||i&&c<a[i-1][j]))?'':(f=n=>n<2||n*f(n-1),g=(n,m=f(n*n+n>>1))=>n<2?m:g(--n,m*f(n)/f(n+n+1)),g(a.length))

Шукає трикутник для недійсного запису, а потім використовує рекурсивну формулу формули в OEIS для обчислення результату.


Мені довелося оновити специфікацію - і рядки, і стовпці повинні збільшуватися. Результат мене неправильно прочитав запис OEIS. Вибачте, якщо це визнає недійсною вашу відповідь!
ArtOfCode

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