Đây có phải là số tam giác?


33

Thử thách

Cho một số nguyên dương, xác định xem đó có phải là số tam giác hay không, và theo đó xuất ra một trong hai giá trị bất biến, không đổi.

Định nghĩa

Một số tam giác là một số có thể được thể hiện dưới dạng tổng của các số nguyên dương liên tiếp, bắt đầu từ 1. Họ cũng có thể được biểu diễn bằng công thức n(n + 1) / 2, nơi nlà một số nguyên dương.

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

Sự thật:

1
3
6
10
15
21
55
276
1540
2701
5050
7626
18915
71253
173166
222111
303031
307720
500500
998991

Giả mạo:

2
4
5
7
8
9
11
16
32
50
290
555
4576
31988
187394
501500
999999

Quy tắc

  • Mục nhập của bạn có thể là một chức năng hoặc một chương trình.
  • Bạn có thể cho rằng đầu vào là số nguyên dương dưới 10 6 .
  • Bạn phải chọn hai đầu ra không đổi, riêng biệt để phân biệt hai loại.

Đây là , vì vậy mã ngắn nhất tính theo byte trong mỗi ngôn ngữ sẽ thắng.





Tại sao bạn không bao gồm số không?
Neil

1
@Neil Tôi muốn giảm thiểu số lượng các trường hợp cạnh có thể và xử lý số 0 là một trong số đó tôi cảm thấy không quá quan trọng. Bạn có nghĩ rằng nó sẽ tốt hơn nếu không cần phải xử lý không? (Ví dụ, câu trả lời Jelly không thành công bằng 0)
ETHproductions

Câu trả lời:


21

Haskell , 23 byte

CHỈNH SỬA:

  • -1 byte: @xnor đã loại bỏ dấu ngoặc đơn với a $.

Một hàm ẩn danh lấy Intvà trả về a Char.

Đầu ra là '1'cho số tam giác và '0'cho những người khác.

(!!)$show.(10^)=<<[0..]

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

  • Sử dụng như ((!!)$show.(10^)=<<[0..]) 998991.
  • Tạo các số 1, 10, 100, 1000, ..., chuyển đổi các số đó thành chuỗi và nối chúng. Sau đó lập chỉ mục vào chuỗi vô hạn kết quả

    "1101001000100001000001000000...

6
Một phương pháp giàu trí tưởng tượng! Bạn có thể lưu một byte với (!!)$show.(10^)=<<[0..].
xnor

20

Python , 24 byte

lambda n:(8*n+1)**.5%1>0

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

Đầu ra False cho số tam giác, Truecho phần còn lại. Kiểm tra nếu 8*n+1là một hình vuông hoàn hảo. Python sẽ lấy các ô vuông hoàn hảo cho các số nguyên chính xác cho dù lớn đến đâu, do đó không có vấn đề về dấu phẩy động.


3
(1<<10000)**.5: OverflowError: int quá lớn để chuyển đổi thành float
isaacg

@isaacg Thử thách không yêu cầu đầu vào quá lớn: "Bạn có thể cho rằng đầu vào là số nguyên dương dưới 10 ^ 6"
trichoplax

1
@trichoplax Tôi nghĩ rằng tôi đang tranh chấp yêu cầu của xnor trong văn bản. Trình là tốt, tôi đồng ý.
isaacg

13

Thạch , 4 byte

R+\ċ

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

Làm sao?

R+\ċ - Main link: n
R    - range(n)   -> [1,2,3,...,N]
  \  - cumulative reduce by:
 +   -   addition -> [1,3,6,...,T(N)]
   ċ - count occurrences of right (n) in left -> 1 if triangular, 0 otherwise

Tôi ngạc nhiên giảm tích lũy không tự động tạo ra một phạm vi. Có một sự lựa chọn thiết kế đằng sau này?
Sản phẩm ETH

Tôi không chắc chắn 100%, nhưng tôi nghĩ rằng (ít nhất là hiện tại) sẽ cần bởi hoạt động dyadic bị giảm đi sẽ khiến cho một phạm vi được thực hiện.
Jonathan Allan

... thực sự thậm chí điều đó dường như không được áp dụng (ví dụ như điều này so với điều này . Có vẻ như việc triển khai liên kết nhanh ghi đè sao cho iterable không tạo ra một phạm vi ngay cả khi hoạt động dyadic xác định nó để làm như vậy cho một đối số. cái này :)
Jonathan Allan

@ETHproductions /\có lẽ là một trong năm cách nhanh chóng đầu tiên được triển khai, dự đoán ý tưởng đưa ra các đối số nguyên cho phạm vi.
Dennis

13

Võng mạc , 10 byte

(^1|1\1)+$

Đầu vào là đơn nhất. Đầu ra là 0hoặc 1.

Hãy thử trực tuyến! (Là một bộ thử nghiệm thực hiện chuyển đổi thập phân sang đơn nhất để thuận tiện.)

Giải trình

Đây là bài tập cơ bản nhất trong các tài liệu tham khảo về phía trước. Hầu hết mọi người đều quen thuộc với phản hồi trong regex, vd(.)\1 để khớp với một ký tự lặp lại. Tuy nhiên, một số hương vị cao cấp hơn cho phép bạn sử dụng phản hồi trước hoặc trong nhóm mà nó đề cập đến. Trong trường hợp đó, nó thường được gọi là tham chiếu chuyển tiếp. Điều này có thể có ý nghĩa nếu tham chiếu được lặp đi lặp lại. Nó có thể không được xác định rõ trong lần lặp đầu tiên, nhưng ở các lần lặp tiếp theo, nhóm sau hoặc nhóm xung quanh đã nắm bắt được một cái gì đó và có thể được sử dụng lại.

Điều này thường được sử dụng để thực hiện các mẫu lặp lại trên các chuỗi đơn nguyên. Trong trường hợp này, chúng tôi cố gắng khớp đầu vào dưới dạng tổng của các số nguyên liên tiếp:

(        # This is group 1, which we'll repeat 1 or more times.
  ^1     #   Group 1 either matches a single 1 at the beginning of the string.
|        # or
  1\1    #   It matches whatever the previous iteration matched, plus another
         #   1, thereby incrementing our counter.
         # Note that the first alternative only works on the first iteration
         # due to the anchor, and the second alternative only works *after*
         # the first iteration, because only then the reference is valid.
)+
$        # Finally, we make sure that we can exactly hit the end of the
         # string with this process.

1
Tại sao không (^|1\1)+$làm việc?
Nữ tu bị rò rỉ

3
Các công cụ regex @LeakyNun có tối ưu hóa rằng chúng sẽ lặp lại một nhóm nếu nó trống n lần trong đó n là mức tối thiểu của bộ định lượng bạn đang sử dụng (trong trường hợp của bạn là 1, nếu tối thiểu là 0, dù sao thì nó cũng sẽ được thử một lần) . Nếu bạn thay đổi +thành {2,}, nó sẽ hoạt động. Tối ưu hóa này ngăn chặn các vòng lặp vô hạn nhưng đó cũng là điều duy nhất giữ cho regex .NET không bị Turing hoàn thành.
Martin Ender

Điều này chỉ giúp tôi tiết kiệm 70 byte: codegolf.stackexchange.com/a/118387
Neil

Tạo 74 byte, nhờ \G!
Neil


8

Toán học, 16 byte

OddQ@Sqrt[1+8#]&

Về cơ bản là một cổng của giải pháp Python của xnor . Đầu ra Truecho số tam giác, Falsenếu không.


7

JavaScript (ES6), 30 27 byte

Đã lưu 2 byte nhờ kamoroso94

f=(n,k)=>n>0?f(n+~k,-~k):!n

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

Phiên bản không đệ quy (ES7), 19 byte

Câu trả lời của cảng Adnan .

x=>(8*x+1)**.5%1==0

Chỉ thấy bây giờ bạn đã chỉnh sửa giải pháp 19 byte vào câu trả lời của bạn một vài phút trước khi tôi đăng bài của tôi . Tôi có nên xóa của tôi? Những nghi thức thường được chấp nhận trên đó là gì?
Xù xì

1
@Shaggy Tôi không nghĩ đó là một vấn đề thực sự ở đây. Câu trả lời 'chính' của tôi thực sự là câu trả lời.
Arnauld

Giảm xuống còn 28 byte với f=(n,k=1)=>n>0?f(n-k,k+1):!n?
kamoroso94

1
@ kamoroso94 Cảm ơn! Cập nhật. Và một byte thứ ba đã được lưu bằng cách bỏ qua việc khởi tạo k.
Arnauld

Sử dụng tao nhã bitwise KHÔNG làm undefinedgiá trị gia tăng cho giá trị ban đầu ; chỉnh sửa của bạn là một niềm vui để đọc sau khi tôi độc lập đến giải pháp trước đó của bạn.
apsillers

6

CJam , 11 byte

ri2*_mQ_)*=

Đầu ra 1cho hình tam giác, 0nếu không.

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

Giải trình

Xem xét đầu vào 21.

ri               e# Input integer.             STACK: 21
  2*             e# Multiply by 2.             STACK: 42
    _            e# Duplicate.                 STACK: 42, 42
     mQ          e# Integer square root.       STACK: 42, 6
       _)        e# Duplicate, increment.      STACK: 42, 6, 7
         *       e# Multiply.                  STACK: 42, 42
          =      e# Equal?                     STACK: 1

6

Brain-Flak , 40 byte

(([{}](((()))<>))<>){<>({}({}({})))}{}{}

Wheat Wizard và tôi đã đấu tay đôi với câu hỏi này. Khi chúng tôi quyết định đăng các giải pháp của mình, chúng tôi đã bị ràng buộc ở mức 42 byte, nhưng tôi đã tìm thấy một giải pháp golf 2 byte. Chúng tôi quyết định rằng sẽ được tính là bộ ngắt kết nối (giải pháp của tôi là bên dưới).

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

Giải trình:

# Set up the stacks like this:  -input
                                     1     -input
                                     1          1
(([{}](((()))<>))<>)                 ^

# Output 1 for triangular and 0 for non-triangular 
{<>({}({}({})))}{}{}

Để được giải thích đầy đủ, vui lòng xem câu trả lời của Wheat Wizard .


Brain-Flak , 42 byte

(([({})])<>){(({}())<>{}({})){((<>))}{}{}}

Đầu ra 0\n(dòng mới theo nghĩa đen) cho sự thật và chuỗi trống cho giả.

Ý tưởng là trừ 1 rồi 2 rồi 3 cho đến đầu vào. Nếu bạn nhấn 0, thì bạn biết đây là số tam giác, vì vậy bạn có thể dừng ở đó.

Hãy thử trực tuyến! (sự thật)
Hãy thử trực tuyến! (giả)

# Push -input on both stacks. One is a counter and the other is a running total
(([({})])<>)

# Count up from -input to 0
{
  # Push the new total which is: (counter += 1) + total (popped) + input (not popped)
  # This effectively adds 1, then 2, then 3 and so on to the running total
  (({}())<>{}({}))
  # If not 0
  {
    # Push to 0s and switch stacks to "protect" the other values
    ((<>))
  # End if
  }
  # Pop the two 0s, or empty the stack if we hit 0
  {}{}
# End loop
}

Đây là một giải pháp 46 byte mà tôi thấy thú vị.

{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}

Đầu ra 0\n(dòng chữ mới) cho sự thật, chuỗi trống cho giả.

Ý tưởng là đếm ngược từ đầu vào bằng các số liên tiếp, 1 lần. Ví dụ input - (1) - (1,1) - (1,1,1). Mỗi lần chúng tôi trừ đi, nếu chúng tôi chưa về 0, chúng tôi sẽ để lại một giá trị bổ sung trên ngăn xếp. Theo cách đó, nếu chúng tôi ở mức 0 và vẫn bị trừ khi bật, chúng tôi sẽ xóa giá trị cuối cùng trên ngăn xếp. Nếu đầu vào là một số tam giác, chúng ta sẽ kết thúc chính xác ở 0 và sẽ không bật 0.

Hãy thử trực tuyến! sự thật
Hãy thử trực tuyến! giả

# Implicit input (call it I)

# Until we reach 0, or the stack is empty
{
  # Add 1 to the other stack and push it twice. This is our counter.
  <>(({}()))
  # While counter != 0
  {
    # counter -= 1
    ({}[()]
    # if I != 0 
    <>{
      # I -= 1, and push 0 to escape the if
      (<({}[()])>)
    # End if
    }
    # Pop from the stack with I. This is either the 0 from the if, or I
    {}
    # Get ready for next loop End while
    <>)
  # End While
  }
  # Pop the counter that we were subtracting from
  {}<>
# End Until we reach 0, or the stack is empty.
}

6

Thạch , 5 byte

×8‘Ʋ

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

Lý lịch

Gọi n là đầu vào. Nếu n là số tam giác thứ k , ta có

n= =k(k+1)2k2+k-2n= =0k= =12(-1±1+số 8n),

có nghĩa là sẽ có một giải pháp tự nhiên nếu và chỉ khi 1 + 8n là một hình vuông kỳ lạ, hoàn hảo. Rõ ràng, không cần kiểm tra tính chẵn lẻ của 1 + 8n .

Làm thế nào nó hoạt động

×8‘Ʋ  Main link. Argument: n

×8     Yield 8n.
  ‘    Increment, yielding 8n + 1.
   Ʋ  Test if the result is a perfect square.


5

Brain-Flak , 42 byte

(([{}](<((())<>)>))<>){<>({}({}({})))}{}{}

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

Giải trình

Mục tiêu của chương trình này là tạo trạng thái trên hai ngăn xếp và thực hiện hoạt động liên tục trên cả hai ngăn xếp cho đến khi một trong số chúng không, sau đó chúng ta có thể xuất ra tùy thuộc vào ngăn xếp nào chúng ta đang ở. Điều này tương tự như các chương trình xác định dấu của một số. Các chương trình này đặt ntrên một ngăn xếp và chồng -nlên nhau và thêm một và chuyển đổi ngăn xếp cho đến khi một trong các ngăn xếp bằng không. Nếu số đó là số âm ở vị trí đầu tiên, ngăn xếp đầu tiên sẽ về 0, nếu số đó là số dương thì ngăn xếp khác sẽ về không.

Ở đây chúng ta tạo hai ngăn xếp một trừ các số liên tiếp từ đầu vào và một ngăn chỉ trừ một. Số trừ các số liên tiếp sẽ chỉ chấm dứt nếu số đó là hình tam giác, (thông minh khác, nó sẽ chỉ vượt qua 0 và tiếp tục đi vào phủ định). Số còn lại sẽ luôn chấm dứt cho bất kỳ số dương nào, nhưng sẽ luôn làm chậm hơn số đầu tiên, do đó các số không phải là tam giác sẽ chấm dứt trên ngăn xếp đó.

Vậy làm thế nào để chúng ta thiết lập các ngăn xếp sao cho cùng một thao tác trừ các số liên tiếp trên một và trừ đi một số khác? Trên mỗi ngăn xếp, chúng ta có đầu vào ở trên để có thể kiểm tra, bên dưới chúng ta có sự khác biệt và bên dưới chúng ta có sự khác biệt của sự khác biệt. Mỗi lần chạy, chúng tôi thêm "chênh lệch chênh lệch" vào "chênh lệch" thông thường và trừ đi từ đầu vào. Đối với ngăn xếp kiểm tra độ tam giác, chúng tôi đặt chênh lệch gấp đôi của chúng tôi để 1chúng tôi nhận được các số nguyên liên tiếp mỗi lần chạy, đối với ngăn xếp khác chúng tôi đặt nó để 0chúng tôi không bao giờ thay đổi chênh lệch, đó là luôn giữ nguyên 1. Đây là Làm thế nào ngăn xếp được thiết lập ở đầu, nđầu vào ở đâu:

-n  -n
 0   1
 1   0

Cuối cùng khi chúng ta chấm dứt, chúng ta có thể sử dụng các khác biệt này để kiểm tra ngăn xếp nào chúng ta đang ở trên chúng ta bật hai giá trị hàng đầu và chúng ta nhận được 1cho một số tam giác và 0cho một số không phải là tam giác.


Mã chú thích

(([{}](<((())<>)>))<>) Set up the stack
{                      While
 <>                    Switch stacks
 ({}({}({})))          Add bottom to second to bottom, add second to bottom to top
}                      End while
{}{}                   Pop the top two values

Đây là một giải pháp 50 byte tôi cũng thích.

{(({}[()]))}(([[]])<>){({}{}())<>}({}{()<><{}>}{})

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


5

Hình khối , 23 24 25 byte

I1Wq/)s.;0..s;p-?\.+O@u

0 cho sự thật và không có gì 0 cho falsey. Tạo lực bằng cách tăng bộ đếm, thêm vào tổng tích lũy và so sánh với đầu vào. Bây giờ để thử và lắp nó vào khối lập phương 2x2x2. Đã làm nó!

    I 1
    W q
/ ) s . ; 0 . .
s ; p - ? \ . +
    O @
    u .

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

  • / Phản ánh để đối mặt.
  • I10\ nhận đầu vào số nguyên, đẩy 1 (bộ đếm), đẩy 0 (tổng) và phản ánh
  • +s;p-thân vòng lặp. Thêm tổng và bộ đếm, bỏ tổng trước đó, tăng đầu vào và trừ
  • ? Kiểm tra kết quả của phép trừ
    • Cho 0 kết quả thực hiện thẳng về phía trước \.uO@ phản ánh đến mặt dưới, không-op, quay đầu, đầu ra và dừng lại.
    • Để có kết quả tích cực, rẽ phải vào mặt dưới và @ dừng lại
    • Đối với kết quả âm ;qWs)/su, trừ phép trừ trái , đặt đầu vào xuống dưới, dịch chuyển sang trái, bộ đếm trao đổi và tổng, bộ đếm tăng, phản xạ, tổng số trao đổi và bộ đếm, quay đầu vào thân vòng lặp chính.

Rất gần gũi ... rằng byte cuối cùng sẽ mất rất nhiều nỗ lực và thông minh.
Sản xuất ETH

Đúng, nghĩ rằng tôi đã có nó nhưng đang khó nắm bắt
MickyT

1
@ETHproductions tìm thấy byte
MickyT

Mã của bạn và khối lập phương chưa được mở của bạn có vẻ khác nhau, góc dưới bên phải là một .khối nhưng là 1mã của bạn.
Phù thủy lúa mì

@WheatWizard Cảm ơn vì điều đó, phần chỉnh sửa không tốt của tôi
MickyT

4

05AB1E , 7 6 byte

EDIT : Cảm ơn @Dennis: Đã lưu một byte vì tôi quên mất toán tử gia tăng

8*>t.ï

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

nlà tam giác nếu sqrt(8n + 1)là một số nguyên

Làm thế nào nó hoạt động

8* # multiply implicit input by 8
  > # add one
   t # sqrt
    .ï # is integer

Có lẽ chưa có sẵn tại thời điểm đó, nhưng t.ïcó thể là Ųnhững ngày này, đó là một nội dung để kiểm tra xem một số có phải là một hình vuông hay không.
Kevin Cruijssen

4

Perl 6 , 17 byte

{$_∈[\+] 1..$_}

Chỉ cần kiểm tra xem $_, đầu vào của hàm, có bằng bất kỳ phần tử nào của phép giảm cộng tam giác hay không (1, 1+2, ..., 1+2+...+$_).


4

Alice , 38 22 byte

Rất nhiều byte được lưu nhờ Martin và Leo

/ i \ 2 * .2RE.h * -n / o @

Có một dòng mới. Đầu ra 1cho hình tam giác, 0nếu không.

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

Giải trình

Điều này sử dụng cách tiếp cận tương tự như câu trả lời của tôi , chỉ vụng về. Ở dạng tuyến tính, chương trình trở thành

i2*.2RE.h*-no@

trong đó iothực sự ở chế độ thứ tự.

Hãy xem xét đầu vào 21là một ví dụ.

i         Input integer                       STACK: 21
2*        Multiply by 2                       STACK: 42
.         Duplicate                           STACK: 42, 42
2RE       Integer square root                 STACK: 42, 6
.         Duplicate                           STACK: 42, 6, 6
h         Increment                           STACK: 42, 6, 7
*         Multiply                            STACK: 42, 42
-         Subtract                            STACK: 0
n         Logical negation                    STACK: 1
o         Output integer                      STACK:
@         End program

Câu trả lời Alice đầu tiên của tôi
Luis Mendo

1
Tôi có cảm giác điều này có thể giảm đi một nửa với một trong những cấu trúc điều khiển lạ mắt của Martin ...
Sản phẩm ETH

Tôi cũng vậy ... :-)
Luis Mendo

Alice golf đầu tiên của tôi: Cùng mã, 23 byte
Nitrodon

Một bố cục "chuẩn" hơn cho loại chương trình này sẽ là thế này . Điều đó nói rằng, bạn có thể thoát khỏi số 1 trên ngăn xếp và chỉ cần đưa ra phủ định logic của phép trừ (tức là ...h*-no@)
Leo

4

Japt , 10 7 byte

Đã lưu 3 byte nhờ @Luke và @ETHproductions

*8Ä ¬v1

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

Giải trình:

*8Ä ¬v1
    ¬    // Square root of:
*8       //   Input * 8
  Ä      //   +1
     v1  // Return 1 if divisible by 1; Else, return 0

õ å+ øU

Giải trình:

õ å+ øU
õ           // Create a range from [1...Input]
  å+        // Cumulative reduce by addition
     øU     // Does it contain the input?

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


Câu hỏi yêu cầu hai thông số khác nhau không đổi.
xnor

*8Ä ¬u1 ccho 9B (đầu ra 0 nếu đầu vào là hình tam giác, 1 nếu không)
Luke

@Luke Bạn có thể thay đổi u1 cthành v1, tôi tin rằng (chuyển đổi đầu ra)
ETHproductions

7 byte? Tốt đẹp! Bằng cách nào đó đã bỏ lỡ điều này trong khi đăng bài của riêng tôi, giải pháp tương tự cuối cùng có thể. Hãy cho tôi biết nếu bạn muốn tôi xóa nó.
Xù xì

4

R , 23 19 byte

Cách tiếp cận tương tự như các câu trả lời khác. Kiểm tra xem nếu 8x+1là một hình vuông hoàn hảo.
-4 byte cảm ơn Giuseppe và MickyT.

!(8*scan()+1)^.5%%1

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


2
bạn có thể sử dụng !thay vì==0
Giuseppe

Điều này cũng cực kỳ tốt vì nó cũng được vector hóa!
Giuseppe

1
Tôi nghĩ bạn cũng có thể thoát khỏi các dấu ngoặc bên ngoài!(8*scan()+1)^.5%%1
MickyT


3

Mẻ, 72 byte

@set/aj=i=0
:l
@if %1% gtr %j% set/aj+=i+=1&goto l
@if %1==%j% echo 1

Kết quả 1 thành công, không có gì thất bại. Hoạt động cho số không quá, mặc dù không được yêu cầu bởi câu hỏi vì một số lý do.


3

JavaScript (ES7), 19 18 byte

Từ câu trả lời của tôi cho một câu hỏi liên quan .

Đầu ra falsecho số tam giác hoặc truekhông phải hình tam giác, được OP cho phép.

n=>(8*n+1)**.5%1>0

Thử nó

f=
n=>(8*n+1)**.5%1>0
oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


Tôi nghĩ rằng bạn có thể lưu một byte với n=>(8*n+1)**.5%1>0(điều này sẽ đảo ngược kết quả đầu ra)
ETHproductions

@ETHproductions: OK, miễn là bạn cho phép nó. Là làm như vậy thường được cho phép, mặc dù?
Xù xì

1
Nó đủ điều kiện là "hai đầu ra không đổi, khác biệt", vì vậy, có. Những thách thức vấn đề quyết định khác có thể yêu cầu sự thật / giả dối mặc dù.
Sản phẩm ETH


3

Toán học, 28 byte

!Accumulate@Range@#~FreeQ~#&

Tôi khuyên bạn nên thay thế 7!bằng #. Đầu tiên, nó ngắn hơn; quan trọng hơn, giải pháp hiện tại là không chính xác, vì nó áp đặt một cách giới hạn về kích thước của đầu vào mà nó hoạt động.
Greg Martin

1
OP nói: "Bạn có thể cho rằng đầu vào là số nguyên dương dưới 10 ^ 6". Nhưng tôi thích ý tưởng của bạn và tôi sẽ lấy nó, mặc dù tôi cho kết quả đúng cho mọi trường hợp sử dụng danh sách 5040 phần tử nhưng trường hợp xấu nhất của bạn cần một danh sách 999999 yếu tố. Cảm ơn vì tiền boa!
J42161217

1
Rất tiếc, đã không thấy bình luận của OP! Vâng, có một số ưu đãi "đồi trụy" trong việc chơi gôn mã: rằng tiết kiệm 1 byte quan trọng hơn trong câu hỏi về môn đánh gôn so với tất cả hiệu quả trên thế giới :)
Greg Martin


3

Excel, 31 22 byte

9 byte được lưu nhờ Octopus

Đầu ra TRUEcho số tam giác. Khác FALSE. Kiểm tra nếu 8*n+1là một hình vuông hoàn hảo.

=MOD(SQRT(8*B1+1),1)=0

1
=MOD(SQRT(8*A1+1),1)=0lưu một vài byte
Bạch tuộc

2

Brachylog , 5 byte

≥ℕ⟦+?

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

Giải trình

≥ℕ⟦+?
≥ℕ     There is a number from 0 to {the input} inclusive
  ⟦    such that the range from 0 to that number
   +   has a sum
    ?  that equals the input


2

Python - 52 byte

Lưu ý: Tôi biết rằng hai câu trả lời Python khác ngắn hơn nhiều, nhưng đây là cách học cũ, hơn là thuật toán thủ công

n=input();i=s=0
while s<n:s=(i*i+i)/2;i+=1
print s>n

2

APL (Dyalog) , 6 byte

⊢∊+\∘

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

Giải trình

⊢∊+\∘
                       Creates a range from 1 to the right_argument
  +\                    Cumulative sum of this range; 1 1+2 1+2+3 .. 1+2+..+n. These are the triangular numbers
⊢∊                      Does the right argument belong to this list of integers in this cumulative sum

Đầu ra 0cho sai và 1đúng.


2

TI-CƠ BẢN, 10 7 byte

-3 cảm ơn @lirtosiast

:not(fPart(√(8Ans+1

Đưa đầu vào vào X. Kiểm tra nếu √(8X+1)là một số nguyên


Tại sao không not(fPart(√(8Ans+1?
lirtosiast

@lirtosiast Điều đó sẽ hiệu quả, cảm ơn!
Scott Milner
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.