У нас 40 палочек одинаковой ширины, но разной высоты. Сколько можно расположить аранжировок рядом друг с другом, чтобы, когда мы смотрим справа, мы видели 10 палочек, а когда мы смотрим слева, мы снова видели ровно 10 палочек?
Например, такой порядок:
Черные палочки спрятаны, красные палочки - это те, которые вы можете видеть, когда смотрите слева, синие палочки - те, которые вы можете видеть, когда смотрите справа, и пурпурная (т.е. самая длинная) - та, которую можно увидеть, если смотреть. с обеих сторон.
Как тестовые случаи:
- Если бы у нас было 3 палки, количество заказов, чтобы увидеть 2 слева и 2 справа, равно 2
- Если у нас было 5 стиков, количество заказов, чтобы увидеть 3 слева и 3 справа, равно 6
- Если бы у нас было 10 стиков, количество заказов, чтобы увидеть 4 слева и 4 справа, составляет 90720
code-golf
combinatorics
permutations
дружище
источник
источник
10!/40 = 90720
... это совпадение?Ответы:
PARI / GP, 80
Количество видимых палочек также называют числами небоскребов после игры карандашом / сеткой. Этот код основан на (только слегка измененной) формуле из OEIS A218531 . Я не знаю много PARI, но я действительно не думаю, что есть много для игры в гольф здесь.
Все тестовые примеры показаны на ideone.com . Результат для
f(40,10)
:источник
v
видимыми слева палочками - число Стирлингаs(n,v)
. Если самый высокий стержень находится в положенииk
, то видимые слева - это этот стержень, а видимые слева - в подперестановке слева отk-1
значений слева от положенияk
. Таким образом, чтобы иметьv
видимые слева палочки и видимыеv
справа палочки, у вас естьs(k,v-1)
выбор переставить левую половину,s(n-k-1,v-1)
переставить правую половину, иbinomial(n-1,k)
варианты разделить палочки на две половины.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 один раз, а не три раза.Python 3, 259 байт
Не очень доволен этим.
Пример ввода и вывода:
Он генерирует все возможные комбинации предоставленного диапазона, а затем просматривает их, проверяя каждое число в них, чтобы увидеть, равно ли оно максимуму предыдущих чисел. Затем он делает то же самое в обратном направлении, и если счет вперед (t) = счет назад (d) = заданный номер представления (k), то он действителен. Это добавляет это к счетчику (c) и печатает это в конце.
источник
R, 104
Немного де-гольф:
источник
Pyth -
3836 байтВ основном порт ответа R. Довольно медленно, даже не могу завершить
10, 4
онлайн.Единственное, чего нет у Pyth, - это cummax и
==
избыточные векторы, но для их реализации потребовалось всего несколько байтов.Объяснение и дальнейшая игра в гольф в ближайшее время.
Попробуйте здесь онлайн .
источник