Codegolf — Бесцентровые Многоугольники

  • Автор темы Mixa 14
  • Обновлено
  • 22, Oct 2024
  • #1

А центрированное многоугольное число — положительное целое число, определяемое количеством вершин, когда точка окружена многоугольниками (все большего размера) с одинаковым количеством сторон, как показано ниже. Например, \$p_5(3) = 1 + 5 + 10 + 15 = 31\$ — это центрированное пятиугольное число, образованное путем взятия вершины и добавления трех слоев пятиугольников:

codegolf — бесцентровые многоугольники


Однако этот вопрос касается центраменьше многоугольные числа. В частности, мы хотим знать, сколькими способами мы можем записать \$n\$ как разность двух \$k\$-угольных чисел с \$k \geq 3\$ — то есть центрированного многоугольника с центром удаленный.

Например, \$35\$ можно записать как разность двух \$k\$-угольных чисел пятью способами:

  • \$p_5(4) - p_5(2) = 51 - 16\$,
  • \$p_5(7) - p_5(6) = 141 - 106\$,
  • \$p_7(3) - p_7(1) = 43 - 8\$,
  • \$p_7(5) - p_7(4) = 106 - 71\$, и
  • \$p_{35}(1) – p_{35}(0) = 36 – 1\$,

первые четыре из них показаны ниже: codegolf — бесцентровые многоугольники

codegolf — бесцентровые многоугольники

codegolf — бесцентровые многоугольники

codegolf — бесцентровые многоугольники

Вызов

В этом задании вам предстоит написать сценарий, принимающий положительное целое число.

 0, 0, 1, 1, 1, 2, 1, 2, 3, 2, 1, 5, 1, 2, 5, 3, 1, 6, 1, 5, 5, 2, 1, 8, 3, 2, 6, 5, 1, 10, 1, 4, 5, 2, 5, 12, 1, 2, 5, 8, 1, 10, 1, 5, 12, 2, 1, 11, 3, 6, 5, 5, 1, 12, 5, 8, 5, 2, 1, 19, 1, 2, 12, 5, 5, 10, 1, 5, 5, 10, 1, 18, 1, 2, 12, 5, 5, 10, 1, 11, 10, 2
 
and outputs the number of ways to write \$n\$ as a centerменьше многоугольное число.

Поскольку это сложная задача, побеждает самый короткий код.

Последовательность начинается:

n

Сейчас это находится в OEIS как А339010.

#код-гольф #код-гольф #последовательность #геометрия #комбинаторика

Mixa 14


Рег
25 Oct, 2007

Тем
75

Постов
181

Баллов
596
  • 26, Oct 2024
  • #2

Хаскелл, 42 байта

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 {+/∊(⊢(|⍨<2|⊢)1+⍳)¨⍵(⊢∩∨)⍳1+⌊⍵÷3}

⍳1+⌊⍵÷3 ⍝ Range to n//3 + 1

⍵(⊢∩∨)       ⍝ Keep divisors of n

¨              ⍝ For each divisor

∊(⊢(|⍨<2|⊢)1+⍳)               ⍝ A train to find odd divisors of the divisor, not sure how it works exactly

1+⍳)               ⍝ Make a range from 2 to the divisor+1

(⊢                           ⍝ On this side, just give back the divisor

(|⍨<2|⊢)                   ⍝ Checks that the element of the range divides the divisor and that it's odd

(|⍨                        ⍝ The possible divisor mod its divisor

<                       ⍝ Is less than

2|⊢)                   ⍝ 2 mod the divisor's possible divisor

∊                             ⍝ Turn into vector so a single sum is needed

+/                               ⍝ Sum that
 

Попробуйте онлайн!

51 байт

{+/∊(⊢(|⍨<2|⊢)1+⍳)¨⍵(⊢∩∨)⍳1+⌊⍵÷3}

Попробуйте онлайн!

Результатом является количество способов разложить \$n=abc\$ на три положительных фактора, где \$a \geq 3\$, \$b\$ нечетно, а \$c\$ не имеет ограничений.

 

Nilych


Рег
15 Jun, 2005

Тем
85

Постов
186

Баллов
641
  • 26, Oct 2024
  • #3

05AB1E, 17 16 10 байт

3/ # Integer-divide the (implicit) input-integer by 3 ╒ # Pop and push a list in the range [0, input//3] ÷ # Check for each that they evenly divide the (implicit) input # (1 if truthy; 0 if falsey) m # Then map each boolean to, É # using the following three characters as inner code-block: î* # Multiply the boolean by the 1-based map-index ─ # Pop and push a list of its divisors ─ # Flatten this list of list of integers ¥ # Modulo-2 on each Σ # And sum those together # (after which the entire stack joined together is output implicitly)

Попробуйте онлайн! Изменить: сэкономлено 5 байт благодаря @ovs. Объяснение:

3/╒÷mÉî*──¥Σ ||answer||

Дж, 29 байт

n->{ // Method with integer as both parameter and return-type int r=0, // Result-sum, starting at 0 a=2, // Temp-integer `a`, starting at 2 t; // Temp-integer `t`, uninitialized for(;a++<n;) // Loop `a` in the range [1, n]: for(t=a;t<=n; // Inner loop `t` in the range [a, n], t+=2*a) // in increments of 2a if(n%t<1) // If the input is evenly divisible by `t`: r++; // Increase the result-sum by 1 return r;} // And after the loops, return the result-sum

Попробуйте онлайн!

n->{int r=0,a=2,t;for(;a++<n;)for(t=a;t<=n;t+=2*a)if(n%t<1)r++;return r;} ||answer||

Желе, 10 байты

->n{(1..n/3).select{|k|n%k==0}.sum{|o|(1..o).select{|i|o%i==0}.sum{|j|j%2}}}

Монадическая ссылка, принимающая \$n\$, которая возвращает счетчик.

Попробуйте онлайн! Или посмотрите набор тестов.

Как?

a;q;s;f(n){for(s=0,q=a=3;n/q||n/(q=++a);)s+=n%(q-=2*a)<1;n=s;} ||answer||

JavaScript (ES6), 49 байт

Использование метод, описанный @xnor.

M

Попробуйте онлайн!

Прокомментировал

m&`(.(..)*)$(?<=^\1+) ||answer||

Язык Wolfram (Математика), 39 байт

n/3

Попробуйте онлайн!

особая благодарность @att за экономию 20 байт

 

Acrorgake


Рег
14 Apr, 2006

Тем
71

Постов
215

Баллов
620
  • 26, Oct 2024
  • #4

Древесный уголь, 24 байта

&

Попробуйте онлайн! Ссылка на подробную версию кода. Порт ответа @xnor. Объяснение:

!

Вход M!&`(.+)$(?<=^\1{3,}) .

.+ $*

Создание циклов 1 , .+ $* M!&`(.+)$(?<=^\1{3,}) m&`(.(..)*)$(?<=^\1+) и lambda n,R=range:sum(n%q<1for a in R(3,n+1)for q in R(a,n+1,2*a)) ranging from n к I№υθ .

c=l+1

Рассчитать b=2k+1 where a=i+3 , a*b*c and ⊞υ×⁺³ι×⊕⊗κ⊕λ .

n

Посчитайте, во сколько раз это будет равно 0 .

 

Coder


Рег
04 Mar, 2014

Тем
87

Постов
195

Баллов
670
  • 26, Oct 2024
  • #6

Ретина 0.8.2, 49 байт

k

Попробуйте онлайн! Ссылка включает набор тестов, который проверяет все числа из i to the input. Explanation:

FθFθFθ

Преобразовать в унарный.

n

Список ( Nθ ) all ( NθFθFθFθ⊞υ×⁺³ι×⊕⊗κ⊕λI№υθ ) коэффициенты, не превышающие Sum[Boole[(2i j-i)∣#],{i,3,#},{j,#}]& .

f = ( // f is a recursive function taking: n, // n = input d = k = 1 // d = odd divisor, k = other divisor ) => // k <= n && // stop if k is greater than n !( // otherwise: n / ~++k // - increment k % d // - increment the final result if d is a divisor of n / (k + 1) ) + // f( // add the result of a recursive call: n, // - pass n unchanged d > n || // - if d is greater than n, leave k unchanged and reset d to 1 k-- && d + 2 // otherwise, decrement k and add 2 to d ) // end of recursive call

Подсчитайте количество нечетных множителей у всех множителей. ( f=(n,d=k=1)=>k<=n&&!(n/~++k%d)+f(n,d>n||k--&&d+2) is implicit as this is the last stage.)

 

Сергей Фаустов


Рег
22 Oct, 2020

Тем
62

Постов
211

Баллов
551
  • 26, Oct 2024
  • #7

С (ГКК), 79 63 62 байта

Сэкономлено колоссальные 16 байт благодаря овс!!!
Сэкономил байт спасибо самому человеку Арно!!!

:3ḍƇ⁸ÆDFḂS - Link: n 3 - three : - (n) integer divide (3) -> x Ƈ - filter keep those v in [1..x] for which: ḍ - (v) divides: ⁸ - chain's left argument, n ÆD - divisors (of each) F - flatten Ḃ - least significant bit (of each) S - sum

Попробуйте онлайн!

Использование кснорметод из его Хаскелл ответ.

 

Smoney


Рег
20 Mar, 2020

Тем
81

Постов
197

Баллов
622
  • 26, Oct 2024
  • #9

Java 8, 73 байта

[:+/@,[=[+/\\.@(*1+i.)~"+3+i. i. 0…N-1 3+ 3…N+2 "+ for each y in 3…N+2: [ (*1+i.)~ y * 0…N, thus f.e. 5 10 15 20 … for p_5 \\.@ take every possible sublist +/ and sum it [= which sums are equal to N? [:+/@, count the true bits

Порт @Noodle9ответ на Python 3, который использует тот же метод, что и @xnorОтвет на Haskell.

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

Объяснение:

[:+/@,[=[+/\\.@(*1+i.)~"+3+i. ||answer||

МатематикаГольф, 12 байты

3÷L Get a list from `0` to `n//3`. sÑÃ Keep only factors of `n`. ÑÉO Number of odd divisors of each factor. O Output the sum.

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

Объяснение:

3÷ÝsÑÃÑÉOO ||answer||

APL (Диалог Юникод), 40 33 байта (SBCS)

Сэкономлено 7 байт благодаря @барботер!

Порт Нила 05AB1E отвечать.

f n=sum[1|a<-[3..n],b<-[1,3..n],c<-[1..n],a*b*c==n]

Попробуйте онлайн!

f n=sum[0^mod n q|a<-[3..n],q<-[a,3*a..n]]
 

DmitryDeadLine


Рег
26 Oct, 2013

Тем
82

Постов
212

Баллов
652
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно