Đây có phải là một số tam giác cắt ngắn?


20

Trình tự OEIS liên quan: A008867

Số tam giác cắt ngắn

Một tính chất chung của số tam giác là chúng có thể được sắp xếp theo hình tam giác. Chẳng hạn, lấy 21 và sắp xếp thành một tam giác os:

     o 
    oo
   ooo
  ồ
 ooooo
oooooo

Chúng ta hãy định nghĩa một "cắt ngắn:" cắt các hình tam giác có cùng kích thước từ mỗi góc. Một cách để cắt ngắn 21 như sau:

     . 
    . .
   ooo
  ồ
 . ooo.
. . oo. .

(Các hình tam giác .được cắt từ bản gốc).

Có 12 ogiây còn lại, vì vậy 12 là số tam giác cắt ngắn.

Bài tập

Công việc của bạn là viết một chương trình hoặc một hàm (hoặc tương đương) lấy một số nguyên và trả về (hoặc sử dụng bất kỳ phương thức đầu ra tiêu chuẩn nào) cho dù một số có phải là số tam giác cắt ngắn hay không.

Quy tắc

  • Không có sơ hở tiêu chuẩn.
  • Đầu vào là một số nguyên không âm.
  • Một vết cắt không thể có chiều dài cạnh vượt quá một nửa so với tam giác ban đầu (nghĩa là vết cắt không thể trùng nhau)
  • Một vết cắt có thể có chiều dài bên không.

Các trường hợp thử nghiệm

Sự thật:

0
1
3
6
7
10
12
15
18
19

Giả mạo:

2
4
5
8
9
11
13
14
16
17
20

Các trường hợp thử nghiệm cho tất cả các số nguyên lên tới 50: Liên kết TIO

Đây là , vì vậy những bài nộp có số byte ngắn nhất trong mỗi ngôn ngữ sẽ giành chiến thắng!

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
Chúng ta có đầu ra trung thực và đầu ra giả hay là hai giá trị nhất quán ok?
Phù thủy lúa mì

@WheatWizard hai giá trị nhất quán được chấp nhận.
JungHwan Min

Tuy nhiên, phần cắt ngắn chồng lên nhau, kết quả tương đương với một hình tam giác nhỏ hơn với phần cắt nhỏ hơn (nếu phần cắt có thể có độ dài cạnh 0).
Asone Tuhid

Câu trả lời:



7

Haskell , 46 byte

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

Hãy thử trực tuyến!

Sau khi ném một loạt lý thuyết số vào vấn đề (cảm ơn @flawr), tôi đã tìm thấy đặc điểm này:

n là một số tam giác cắt ngắn chính xác nếu trong hệ số nguyên tố của 4n-1 , bất kỳ số nguyên tố nào có dạng 5 mod 12 hoặc 7 mod 12 đều xuất hiện một số chẵn.

Ví dụ, điều này có nghĩa là 4n-1 có thể không chia hết cho 5 trừ khi nó chia hết cho 5 2 = 25 và tổng số 5 yếu tố là số chẵn.

Haskell không có tích hợp nhân tố, nhưng chúng ta có thể ứng biến. Nếu chúng ta làm việc với các yếu tố thành các số nguyên tố như 12 = 3 * 4 , chúng ta có thể sử dụng câu lệnh tương đương:

n là một số tam giác cắt ngắn chính xác nếu hệ số 4n-1 thành các số nguyên tố không có các điều khoản của mẫu 5 mod 12 hoặc 7 mod 12 .

Chúng ta có thể trích xuất sức mạnh của một nguyên tố p xuất hiện trong kgcd(p^k)k. Sau đó chúng tôi kiểm tra xem kết quả r không phải là 5 hay 7 modulo 12 như mod(r-5)12>2. Lưu ý rằng r là số lẻ. Chúng tôi cũng kiểm tra vật liệu tổng hợp là p , thiếu một cách để nói với họ từ các số nguyên tố, nhưng kiểm tra sẽ vượt qua miễn là các yếu tố của nó làm.

Cuối cùng, phủ nhận >2đến <3và chuyển đổi True/ Falsesản lượng tiết kiệm một byte bằng cách cho phép chúng ta sử dụng orthay vì and.


Một đặc điểm có liên quan là các ước của 4n-1 lấy modulo 12 có tổng số 1 và 11 hơn 5 và 7.

53 byte

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

Hãy thử trực tuyến!


Giải thích thực sự tốt đẹp!
Lưỡng cư

6

Python 2 , 52 byte

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

Hãy thử trực tuyến!

Đầu ra True/ Falselật. Sử dụng đặc tính này:

n là một số tam giác cắt ngắn chính xác nếu 8N-2 có hình một 2 -3b 2 đối với một số nguyên a, b .

Chúng tôi kiểm tra xem bất kỳ 8*n-2+3*b*blà một hình vuông hoàn hảo cho bất kỳ btừ 1đến n+1. Chúng tôi tránh b=0vì nó gây ra lỗi cho căn bậc hai của âm khi n==0, nhưng điều này không thể làm tổn thương vì chỉ có lẻ mới bcó thể hoạt động.

Thực hiện không đệ quy:

Python 2 , 53 byte

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

Hãy thử trực tuyến!


Các giải pháp đệ quy và không đệ quy thường cạnh tranh với nhau trong python?
boboquack

@boboquack Thông thường, giải pháp đệ quy sẽ thắng một vài byte range. Ở đây nó gần bởi vì b>n+1một trường hợp cơ sở dài và 0inngắn.
xnor

5

R , 45 43 byte

-2 byte nhờ Vlo

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

Hãy thử trực tuyến!

Tôi khá chắc chắn rằng chúng ta chỉ cần kiểm tra các nsố tam giác đầu tiên cho việc này; kiểm tra lực lượng vũ phu nếu nlà trong sự khác biệt theo cặp của số tam giác và bộ ba của chúng.


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

@Vlo facepalm Tôi có thói quen sử dụng các chức năng ở mọi nơi ...
Giuseppe

Và tôi đã có thói quen sử dụng <- gán thay vì (n = scan ()) ... tsk tsk
Vlo

5

Thạch , 10 byte

0r+\ð_÷3f⁸

Một liên kết đơn âm chấp nhận một số nguyên và trả về một giá trị trung thực (danh sách không trống) hoặc giá trị falsey (danh sách trống).

Hãy thử trực tuyến! (chân trang thực hiện biểu diễn Python để hiển thị[0]kết quả như hiện tại)
... hoặc xem bộ phần mềm thử nghiệm (chạy từ 0 đến 20)

Làm sao?

Cho N, tạo thành các số tam giác N đầu tiên, trừ N từ mỗi số, chia mỗi kết quả cho 3 và giữ bất kỳ kết quả nào là một trong các số tam giác N đầu tiê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

Pyt , 10 byte

Đř△Đ3*ɐ-Ƒ∈

Hãy thử trực tuyến!

Giải trình:

        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

Bạn cũng đánh bại tôi, +1 GG
FantaC

@tfbninja Tôi ước tôi có một lời giải thích tốt hơn cho những gì ɐ-không
Mudkip201

1
đã thêm, bạn có thể quay lại nếu bạn muốn
FantaC


3

J , 22 byte

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

Hãy thử trực tuyến!

Cách tiếp cận đơn giản và hơi kém.

Giải trình

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.,]có lẽ
FrownyFrog

3

MATL , 12 byte

tQ:qYst!3*-m

Đầu ra 1cho sự thật, 0cho sự giả dối .

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động, ví dụ

Xem xét đầu vào 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 byte

ÅT3*+8*>ŲZ

Hãy thử trực tuyến!

Giải trình

Å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

Điều này dựa trên thực tế là một số T là hình tam giác nếu 8T+1là một hình vuông hoàn hảo kỳ lạ.
Chúng tôi bắt đầu vào danh sách các hình tam giác mà chúng tôi có thể cắt bớt, tính toán các hình tam giác lớn hơn có thể dựa trên chúng và kiểm tra xem trên thực tế nó có phải là hình tam giác không.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.