Це усічене трикутне число?


20

Пов'язана OEIS послідовність: A008867

Урізане трикутне число

Загальною властивістю трикутних чисел є те, що вони можуть бути розташовані в трикутнику. Наприклад, візьміть 21 і розташуйте в трикутник os:

     о 
    оо
   ооо
  оооо
 ooooo
oooooo

Давайте визначимо "усікання": вирізання трикутників однакового розміру з кожного кута. Один із способів урізання 21 полягає в наступному:

     . 
    . .
   ооо
  оооо
 . ооо.
. . оо. .

(Трикутники .відрізані від оригіналу).

Залишилося 12 os, тому 12 - це усічений номер трикутника.

Завдання

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

Правила

  • Немає стандартних лазівки
  • Вхід - це невід'ємне ціле число.
  • Розріз не може мати довжину сторони, що перевищує половину довжини початкового трикутника (тобто надрізи не можуть перетинатися)
  • Розріз може мати нульову сторону довжиною.

Тестові кейси

Truthy:

0
1
3
6
7
10
12
15
18
19

Фальсі:

2
4
5
8
9
11
13
14
16
17
20

Тестові приклади для всіх цілих чисел до 50: TIO Link

Це , тому подання з найменшими підрахунками байтів на кожній мові виграють!

code-golf  math  decision-problem  number-theory  integer  code-golf  number  decision-problem  functional-programming  code-golf  array-manipulation  matrix  code-golf  string  classification  string  code-challenge  binary  compression  decode  code-golf  string  string  code-challenge  balanced-string  encode  code-golf  number-theory  integer  base-conversion  code-golf  math  number-theory  geometry  abstract-algebra  code-golf  array-manipulation  sorting  optimization  code-golf  math  geometry  image-processing  generation  code-golf  string  cops-and-robbers  repeated-transformation  grammars  cops-and-robbers  repeated-transformation  grammars  code-challenge  restricted-source  tips  source-layout  javascript  code-challenge  kolmogorov-complexity  restricted-source  code-golf  combinatorics  counting  math  fastest-code  linear-algebra  code-golf  math  permutations  matrix  linear-algebra  code-golf  string  decision-problem  restricted-source  code-golf  number  array-manipulation  subsequence  code-golf  number  array-manipulation  matrix  code-golf  brainfuck  code-golf  color  code-golf  quine  source-layout  code-golf  subsequence  code-golf  string  ascii-art  code-golf  string  ascii-art  alphabet  code-golf  decision-problem  interpreter  hexagonal-grid  halting-problem  code-golf  string  polynomials  calculus  code-golf  math  decision-problem  matrix  complex-numbers  code-golf  random  code-golf  number  arithmetic 

1
Ми маємо виводити правдиві та хибні результати або це два послідовних значення?
Пшеничний майстер

@WheatWizard прийнятні два послідовних значення.
JungHwan Min

Хоча скільки усікання перетинаються, результат рівносильний меншому трикутнику з меншими усіченнями (якщо усічення можуть мати довжину сторони 0).
Асона Тухід

Відповіді:



7

Haskell , 46 байт

f n=or[mod(gcd(p^n)(4*n-1)-5)12<3|p<-[1..4*n]]

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

Я кинув купу теорії чисел на проблему (спасибі @flawr), я знайшов цю характеристику:

n - усічене трикутне число точно, якщо в простій факторизації 4n-1 будь-яка простим числом форми 5 mod 12 або 7 mod 12 з'являється парне число разів.

Це означає, наприклад, що 4n-1 може бути не ділиться на 5, якщо він не ділиться на 5 2 = 25 і загальну кількість 5 факторів є парною.

У Haskell немає вбудованої факторизації, але ми можемо імпровізувати. Якщо ми працюємо з факторизацією на сили праймес, як 12 = 3 * 4 , ми можемо використовувати еквівалентний оператор:

n - усічене трикутне число точно, якщо факторизація 4n-1 на прості потужності не має умов форми 5 mod 12 або 7 mod 12 .

Ми можемо отримати силу простого p, що з'являється в k as gcd(p^k)k. Потім перевіряємо, що результат r не дорівнює 5 або 7 по модулю 12, як mod(r-5)12>2. Зауважимо, що r непарне. Ми також перевіряємо композити як p , не маючи способу сказати їх від прайметів, але перевірка пройде до тих пір, поки це зробить її чинник.

Нарешті, відмова >2від <3вимикання та переключення True/ Falseвиведення економить байт, дозволяючи нам використовувати orзамість цього and.


Пов'язана характеристика полягає у тому, що дільники 4n-1 взяті за модулем 12, мають більше 1 і 11, ніж 5 і 7.

53 байти

f n=sum[abs(mod k 12-6)-3|k<-[1..4*n],mod(4*n)k==1]<0

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


Дійсно приємне пояснення!
Амфібологічний

6

Python 2 , 52 байти

f=lambda n,b=1:b>n+1or(8*n-2+3*b*b)**.5%1>0<f(n,b+1)

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

Виходи True/ Falseперевернуті. Використовує цю характеристику:

н є усіченим трикутне число точно , якщо 8n-2 має вигляд 2 -3b 2 для деяких цілих а, б .

Ми перевіряємо, чи будь- 8*n-2+3*b*bякий ідеальний квадрат для будь-якого bз 1до n+1. Ми цього уникаємо, b=0оскільки він дає помилку для квадратного кореня від’ємника коли n==0, але це не може зашкодити, оскільки bможе працювати лише непарне .

Зроблено нерекурсивно:

Python 2 , 53 байти

lambda n:0in[(8*n-2+3*b*b)**.5%1for b in range(~n,0)]

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


Чи рекурсивні та нерекурсивні рішення зазвичай такі конкурентоспроможні між собою в пітоні?
boboquack

@boboquack Зазвичай рекурсивне рішення виграє на кілька байт range. Тут це близько, тому що b>n+1це довгий базовий корпус і 0inкороткий.
xnor

5

R , 45 43 байт

-2 байти завдяки Вло

(n=scan())%in%outer(T<-cumsum(0:n),3*T,"-")

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

Я досить впевнений, що нам потрібно лише перевірити перші nтрикутні числа; груба сила перевіряє, чи nнемає в парних відмінностях трикутних чисел та їх потрій.


scan() n<-scan();n%in%outer(T<-cumsum(0:n),3*T,"-")
Вло

@Vlo facepalm Я звик користуватися функціями скрізь ...
Джузеппе

І я просто ввійшов у звичку використовувати <- призначення замість (n = scan ()) ... tsk tsk
Вло

5

Желе , 10 байт

0r+\ð_÷3f⁸

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

Спробуйте в Інтернеті! (колонтитул виконує представлення Python, щоб показати[0]результати такими, які вони є)
... або переглянути тестовий набір (працює від 0 до 20 включно)

Як?

Дано N, утворює перші N трикутникових чисел, віднімає N від кожного, ділить кожен результат на 3 і зберігає будь-які результати, які є одним з перших N чисел трикутника.

0r+\ð_÷3f⁸ - Link: integer, N             e.g. 7
0r         - zero inclusive range N            [    0, 1, 2,   3,    4, 5,   6,   7]
  +\       - cumulative reduce with addition   [    0, 1, 3,   6,   10,15,  21,  28]
    ð      - start a new dyadic link with that, t, on the left and N on the right
     _     - t subtract N (vectorises)         [   -7,-6,-3,  -1,    3, 8,  14,  21]
      ÷3   - divivde by three (vectorises)     [-2.33,-2,-1.33,-0.33,1,2.67,4.67, 7]
         ⁸ - chain's left argument, t          [    0, 1, 3,   6,   10,15,  21,  28]
        f  - filter keep                       [                     1             ]
                                               - a non-empty list, so truthy

4

Піт , 10 байт

Đř△Đ3*ɐ-Ƒ∈

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

Пояснення:

        Implicit input
Đ       Duplicate input
ř       Push [1,2,...,input]
△       For each element k in the array, get the kth triangle number
Đ       Duplicate the top of the stack
3*      Multiply by 3
ɐ       ɐ - All possible:
 -                       subtractions between elements of the two arrays  
Ƒ       Flatten the nested array
∈       Is the input in the array

Ви теж мене побили, +1 GG
FantaC

@tfbninja Я хотів би, щоб я мав приємніше пояснення того, що ɐ-робить
mudkip201

1
додано, ви можете
відкатати,


3

J , 22 байти

e.[:,@(-/3*])2![:i.2+]

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

Прямий і дещо поганий підхід для гольфу.

Пояснення

e.[:,@(-/3*])2![:i.2+]
             2![:i.2+]  Range of triangular numbers up to N
      (-/3*])           All possible subtractions of 3T from T 
                        where T is triangular up to the Nth triangular number
    ,@                  Flattened into a single list
e.                      Is N in the list?

e.2,@(!-/3*!)[:i.2+]
FrownyFrog

e.2,@(!-/3*!)1+i.,]можливо
FrownyFrog

3

MATL , 12 байт

tQ:qYst!3*-m

Вихідні дані 1для правди, 0для помилки .

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Як це працює, на прикладі

Розглянемо вхід 6

t      % Implicit input. Duplicate
       % STACK: 6, 6
Q:q    % Increase, range, decrease element-wise. Gives [0 1 ... n]
       % STACK: 6, [0 1 ... 6]
Ys     % Cumulative sum
       % STACK: 6, [0 1 3 6 10 15]
t!     % Duplicate, transpose
       % STACK: 6, [0 1 3 6 10 15], [0;
                                     1;
                                     3;
                                     6;
                                     10;
                                     15]
3*     % Times 3, element-wise
       % STACK: 6, [0 1 3 6 10 15 21 28 36 45 55], [0;
                                                    3;
                                                    9;
                                                    18;
                                                    30;
                                                    45]
-      % Subtract, element-wise with broadcast
       % STACK: 6, [  0   1   3   6  10  15  21;
                     -3  -2   0   3   7  12  18;
                     -9  -8  -6  -3   1   6  12;
                    -18 -17 -15 -12  -8  -3   3;
                    -30 -29 -27 -24 -20 -15  -9;
                    -45 -44 -42 -39 -35 -30 -24;
                     -63 -62 -60 -57 -53 -48 -42]
m      % Ismember. Implicit display
       % STACK: 1



1

05AB1E , 11 байт

ÅT3*+8*>ŲZ

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

Пояснення

ÅT            # get a list of triangle numbers upto input
  3*          # multiply each by 3
    +         # add input to each
     8*       # multiply each by 8
       >      # increment each
        Ų    # check each for squareness
          Z   # max

Це ґрунтується на тому, що число Т є трикутним, якщо 8T+1є непарним досконалим квадратом.
Ми починаємо зі списку трикутників, які ми могли б усікати, обчислюємо можливі більші трикутники на їх основі і перевіряємо, чи він насправді трикутний.


1

Japt , 16 байт

ò å+ d@Zd_-3*X¶U

Спробуйте | Перевірте всі тестові випадки


Пояснення

                     :Implicit input of integer U
ò                    :Range [0,U]
  å+                 :Cumulative reduction by addition
     d@              :Does any X in array Z return true when passed through this function?
       Zd_           :  Does any element in Z return true when passe through this function?
          -3*X       :    Subtract 3*X
              ¶U     :    Check for equality with U

Альтернатива

ò å+ £Zm-3*XÃdøU

Спробуй це


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