Замовте 40 паличок


15

У нас 40 паличок однакової ширини, але різної висоти. Скільки можливо домовленостей поставити їх поруч, щоб, коли ми дивимось праворуч, ми бачили 10 паличок, а коли ми дивимось зліва, ми знову бачимо рівно 10 паличок?

Наприклад, таке замовлення:Приклад замовлення

Чорні палички приховані, червоні палички - це ті, які ви можете бачити, коли дивитеся зліва, сині палички - це ті, які ви можете бачити, коли дивитесь праворуч, а фіолетовий (тобто найдовший) - це той, який можна побачити видно з обох боків.

Як тестові випадки:

  • Якщо у нас було 3 палички, кількість замовлень побачити 2 зліва, а 2 справа - 2
  • Якщо у нас було 5 паличок, кількість замовлень побачити 3 зліва, а 3 справа - 6
  • Якщо у нас було 10 паличок, кількість замовлень побачити 4 зліва і 4 справа - це 90720

13
Ви можете уникнути запитань із фіксованим результатом, оскільки оптимальна відповідь на код-гольф, ймовірно, просто надрукує результат, не обчислюючи його. Я рекомендую зробити запитання декількома змінними входами, наприклад, N паличок таким чином, що ви бачите K з них зліва / справа, де N і K - цілі числа введення
Sp3000

4
Якщо ви зміните специфікацію, щоб програми брали вхід (я не бачу, чому ні - у вас вже є тестові випадки), ви можете подумати над тим, чи хочете ви встановити обмеження часу на програми.
Sp3000

1
"Необхідно використовувати вашу опубліковану програму для обчислення випадку 40/10", має бути досить хорошим часовим обмеженням.
feersum

1
Я не можу подолати той факт, що 10!/40 = 90720... це збіг?
Тім

1
@Tim Яке значення 90720? Поштовий індекс для Лос-Аламітос, Каліфорнія ?
Цифрова травма

Відповіді:


8

PARI / GP, 80

f(n,v)=abs(sum(k=1,n-1,binomial(n-1,k)*stirling(k,v-1,1)*stirling(n-k-1,v-1,1)))

Кількість видимих ​​паличок називається також « Номери хмарочосів» після гри олівцем / сіткою. Цей код заснований на (лише незначно зміненій) формулі OEIS A218531 . Я не знаю багато PARI, але я дійсно не думаю, що тут багато для гольфу.

Усі тестові приклади показані на ideone.com . Результат для f(40,10):

192999500979320621703647808413866514749680

1
Є приємна причина для формули. Кількість перестановок з vвидимими зліва палицями - це число Стірлінга s(n,v). Якщо найвища палиця знаходиться в положенні k, то видимі ліві палички - це ця палиця, а видима зліва палиця в перестановці зліва від k-1значень зліва від положення k. Отже, щоб мати vвидимі зліва палиці та vправоруч видимі палички, можна s(k,v-1)вибрати перестановку лівої половини, s(n-k-1,v-1)праву половину перестановки та binomial(n-1,k)вибір поділу паличок на дві половини.
xnor

@xnor Вони в основному дають це пояснення у пов'язаному PDF-файлі, але ваше написано набагато краще IMO.
Геобіць

Ви можете заощадити 11 байт: f(n,v,s=stirling)=abs(sum(k=1,n--,binomial(n,k)*s(k,v-1)*s(n-k,v-1))). Це зберігає sterlingзмінну для повторного використання, залишає останній аргумент, оскільки 1 є типовим, і віднімає 1 з n один раз, а не три рази.
Чарльз

1

Python 3, 259 байт

Не дуже задоволений цим.

import itertools as i
x=input().split()
y,k=x
y=int(y)
c=0
x=list(i.permutations(list(range(1,y+1))))
for s in x:
 t=d=0;l=s[::-1]
 for i in range(y):
  if max(s[:i+1])==s[i]:t+=1
 for i in range(y):
  if max(l[:i+1])==l[i]:d+=1
 if t==d==int(k):c+=1
print(c)

Приклад введення та виведення:

10 4
90720

Він генерує всі можливі комбінації наданого діапазону, а потім прокручує їх, перевіряючи кожне число в них, щоб побачити, чи дорівнює він максимуму попередніх чисел. Тоді це робить те саме назад, і якщо підрахунок вперед (t) = відлік назад (d) = заданий номер перегляду (k), це дійсне. Він додає це до лічильника (c) і друкує це наприкінці.


0

R, 104

function(N,K)sum(sapply(combinat::permn(N),function(x)(z=function(i)sum(cummax(i)==i)==K)(x)&z(rev(x))))

Де-гольф трохи:

    function(N,K) {
      all_perm <- combinat::permn(N)
      can_see_K_from_left <- function(i)sum(cummax(i) == i) == K
      can_see_K_from_both <- function(x)can_see_K_from_left(x) &
                                        can_see_K_from_left(rev(x))
      return(sum(sapply(all_perm, can_see_K_from_both)))
    }

0

Pyth - 38 36 байт

В основному порт відповіді R. Досить повільно, навіть не може працювати в 10, 4Інтернеті.

AGHQLlfqhS<bhT@bTUGlf!-,yTy_TH.pr1hG

Єдине, що Pyth не має, це cummax і ==над вектори, але для цього було потрібно лише кілька байтів.

Пояснення та подальше гольф незабаром.

Спробуйте це онлайн .

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