Is this number triangular?

33

Challenge

Given a positive integer, determine whether it is a triangular number, and accordingly output one of any two constant, distinct values.

Definition

A triangular number is a number that can be expressed as the sum of consecutive positive integers, starting at 1. They can also be expressed with the formula n(n + 1) / 2, where n is some positive integer.

Test cases

Truthy:

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

Falsy:

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

Rules

  • Your entry may be a function or a program.
  • You may assume that the input is a positive integer under 106.
  • You must pick two constant, distinct outputs to distinguish the two categories.

This is , so the shortest code in bytes in each language wins.

ETHproductions

Posted 2017-05-22T20:26:19.473

Reputation: 47 880

1Related, related. – ETHproductions – 2017-05-22T20:27:21.657

Related OEIS sequence – ovs – 2017-05-22T21:14:39.560

Related – Shaggy – 2017-05-22T21:28:46.867

Why didn't you include zero? – Neil – 2017-05-22T21:40:17.377

1@Neil I wanted to minimize the number of possible edge cases, and handling zero is one of them that I felt wasn't too important. Do you think it would have been better if zero needed to be handled? (The Jelly answer currently fails on zero, for instance) – ETHproductions – 2017-05-22T21:44:45.203

Bah, I would have thought programmers would have learned how to count starting at zero by now. – Neil – 2017-05-22T23:05:44.197

So, would an integer which is truthy in our language not count? – Rohan Jhunjhunwala – 2017-05-23T02:24:06.940

@RohanJhunjhunwala There is no requirement that your output values be truthy or falsy, but you can only have two of them. – Ørjan Johansen – 2017-05-23T04:46:16.287

Related – alephalpha – 2017-05-25T02:58:53.987

Related – programmer5000 – 2017-07-19T01:12:02.550

Would this be a valid output for non-triangular numbers? – Oliver – 2018-12-06T19:01:32.723

Answers

22

Haskell, 23 bytes

EDIT:

  • -1 byte: @xnor got rid of parentheses with a $.

An anonymous function taking an Int and returning a Char.

Output is '1' for triangular numbers and '0' for others.

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

Try it online!

  • Use as ((!!)$show.(10^)=<<[0..]) 998991.
  • Generates the numbers 1, 10, 100, 1000, ..., converts those to strings, and concatenates them. Then indexes into the resulting infinite string

    "1101001000100001000001000000...
    

Ørjan Johansen

Posted 2017-05-22T20:26:19.473

Reputation: 6 914

6An imaginative method! You can save a byte with (!!)$show.(10^)=<<[0..]. – xnor – 2017-05-23T06:07:56.803

21

Python, 24 bytes

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

Try it online!

Outputs False for triangular numbers, True for the rest. Checks if 8*n+1 is a perfect square. Python's float precision for square roots easily suffices for the challenge limits of n up to a million, first giving a false positive on n=6896076976160002 as found by Deadcode.

xnor

Posted 2017-05-22T20:26:19.473

Reputation: 115 687

3(1<<10000)**.5: OverflowError: int too large to convert to float – isaacg – 2017-05-23T03:42:36.737

@isaacg The challenge doesn't require inputs that large: "You may assume that the input is a positive integer under 10^6" – trichoplax – 2017-07-29T12:34:16.720

1@trichoplax I think I was disputing xnor's claim in the text. The submission is fine, I agree. – isaacg – 2017-07-29T19:03:08.773

1Python does not do arbitrary-precision exponentiation with ** unless both operands are integer. Otherwise it uses IEEE 374. This function reports both 6896076976160001 and its successor, 6896076976160002, as being triangular (that is the smallest number with which it fails). – Deadcode – 2020-01-20T20:23:55.407

2@Deadcode Thanks, I stand corrected. I edited the post. – xnor – 2020-01-20T20:27:14.023

13

Jelly, 4 bytes

R+\ċ

Try it online!

How?

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

Jonathan Allan

Posted 2017-05-22T20:26:19.473

Reputation: 67 804

I'm surprised cumulative reduce doesn't automatically make a range. Is there a design choice behind this? – ETHproductions – 2017-05-22T20:45:17.523

I am not 100% sure, but I think it would (at least currently) need to by the dyadic operation being reduced over that would cause a range to be made. – Jonathan Allan – 2017-05-22T20:52:58.300

...actually even that does not seem to apply (e.g. this vs this. It seems the quicklink implementation overrides such that the iterable does not make a range even if the dyadic operation defines it to do so for an argument. Pinged Dennis to field this one :)

– Jonathan Allan – 2017-05-22T20:59:38.080

@ETHproductions / and \ probably were among the first five quicks to be implemented, predating the idea to cast integer arguments to range. – Dennis – 2017-05-22T21:43:04.843

13

Retina, 10 bytes

(^1|1\1)+$

Input is in unary. Output is 0 or 1.

Try it online! (As a test suite that does decimal-to-unary conversion for convenience.)

Explanation

This is the most basic exercise in forward-references. Most people are familiar with backreferences in regex, e.g. (.)\1 to match a repeated character. However, some of the more advanced flavours allow you to use a backreference before or inside the group it's referring to. In that case, it's usually called a forward-reference. This can make sense if the reference is repeated. It might not be well defined on the first iteration, but on subsequent iterations, the later or surrounding group has captured something and can be reused.

This is most commonly used to implement recurrent patterns on unary strings. In this case, we try to match the input as the sum of consecutive integers:

(        # 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.

Martin Ender

Posted 2017-05-22T20:26:19.473

Reputation: 184 808

1Why doesn't (^|1\1)+$ work? – Leaky Nun – 2017-05-23T02:39:13.630

3@LeakyNun regex engines have an optimisation that they stop repeating a group if it was empty n times where n is the minimum of the quantifier you're using (in your case 1; if the minimum was 0, it would be tried once anyway). If you change the + to {2,}, it should work. This optimisation prevents infinite loops but it's also the only thing that keeps .NET regex from being Turing-complete on its own. – Martin Ender – 2017-05-23T04:53:30.620

This just saved me 70 bytes: https://codegolf.stackexchange.com/a/118387

– Neil – 2017-05-23T13:59:25.443

Make that 74 bytes, thanks to \G! – Neil – 2017-06-08T11:39:46.653

8

Python 2, 25 bytes

Checks if (8x+1) is a square number.

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

Try it online!

Adnan

Posted 2017-05-22T20:26:19.473

Reputation: 41 965

8

Mathematica, 16 bytes

OddQ@Sqrt[1+8#]&

Essentially a port of xnor's Python solution. Outputs True for triangular numbers, False otherwise.

ngenisis

Posted 2017-05-22T20:26:19.473

Reputation: 4 600

7

JavaScript (ES6), 30 27 bytes

Saved 2 bytes thanks to kamoroso94

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

Test cases

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

console.log('Testing truthy test cases');
console.log(f(1))
console.log(f(3))
console.log(f(6))
console.log(f(10))
console.log(f(15))
console.log(f(21))
console.log(f(55))
console.log(f(276))
console.log(f(1540))
console.log(f(2701))
console.log(f(5050))
console.log(f(7626))
console.log(f(18915))
console.log(f(71253))
console.log(f(173166))
console.log(f(222111))
console.log(f(303031))
console.log(f(307720))
console.log(f(500500))
console.log(f(998991))

console.log('Testing falsy test cases');
console.log(f(2))
console.log(f(4))
console.log(f(5))
console.log(f(7))
console.log(f(8))
console.log(f(9))
console.log(f(11))
console.log(f(16))
console.log(f(32))
console.log(f(50))
console.log(f(290))
console.log(f(555))
console.log(f(4576))
console.log(f(31988))
console.log(f(187394))
console.log(f(501500))
console.log(f(999999))

Non-recursive version (ES7), 19 bytes

Port of Adnan's answer.

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

Arnauld

Posted 2017-05-22T20:26:19.473

Reputation: 111 334

Only seeing now that you edited the 19 byte solution into your answer a few minutes before I posted mine. Should I delete mine? What's the generally accepted etiquette on that?

– Shaggy – 2017-05-23T10:34:46.207

1@Shaggy I don't think it's a real problem here. My 'main' answer really is the recursive one. – Arnauld – 2017-05-23T10:43:57.977

Reduce to 28 bytes with f=(n,k=1)=>n>0?f(n-k,k+1):!n? – kamoroso94 – 2017-05-23T12:20:20.123

1@kamoroso94 Thanks! Updated. And a third byte was saved by omitting the initialization of k. – Arnauld – 2017-05-23T12:35:53.733

Elegant use of bitwise NOT as an incrementor for an initially-undefined value; your edit was a pleasure to read after I independently arrived at your prior solution. – apsillers – 2017-05-23T16:15:46.500

The second answer is sort of useless since its neither a program nor a function. Maybe if it were f=(x)=>... that adds 4 bytes. – Octopus – 2017-05-23T23:02:21.323

@Octopus The 2nd answer is an arrow function. The usual practice is to omit f= (or whatever function name) unless it's referenced in the function itself, like in the first answer which is a recursive one. – Arnauld – 2017-05-23T23:07:18.980

I know what an arrow function is, but I don't understand your reasoning. If you can omit the f= then why not also omit the x=>. You still get the gist and it is still useless code. Don't you have to be able to use it as-is? – Octopus – 2017-05-23T23:10:41.213

@Octopus Using unnamed functions is allowed (please see this meta answer). Omitting parameters is not. Or to put it in other words: the name of the function doesn't matter (you may even call it without naming it: (x=>(8*x+1)**.5%1==0)(15)) whereas the name of the parameters does matter (even if we can guess that it's x in a simple case like this one).

– Arnauld – 2017-05-23T23:29:31.437

Okay, just trying to understand the rules. I was looking in meta for an answer. – Octopus – 2017-05-23T23:33:11.570

@Octopus The rule as I've always understood is: if the challenge requires input, the submission must contain a mechanism for accepting input. this can either be done via arguments for a function submission or, if you choose not to use a function, by some explicit input mechanism like prompt (for JavaScript). What you can't do is say "assume this variable x has already been defined with the input..." -- it must either be that x is a formal argument whose value is provided when the function is called, or x must get its value explicitly in the code of the submission via user input. – apsillers – 2017-05-24T14:19:35.937

6

CJam, 11 bytes

ri2*_mQ_)*=

Outputs 1 for triangular, 0 otherwise.

Try it online!

Explanation

Consider input 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

Luis Mendo

Posted 2017-05-22T20:26:19.473

Reputation: 87 464

6

Jelly, 5 bytes

×8‘Ʋ

Try it online!

Background

Let n be the input. If n is the kth triangular number, we have

$$ n = \frac{k(k+1)}{2} \iff k^2+k-2n = 0 \iff k = \frac12 (-1 \pm \sqrt{1+8n}), $$

which means there will be a natural solution if and only if 1 + 8n is an odd, perfect square. Clearly, checking the parity of 1 + 8n is not required.

How it works

×8‘Ʋ  Main link. Argument: n

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

Dennis

Posted 2017-05-22T20:26:19.473

Reputation: 196 637

6

Brain-Flak, 40 bytes

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

Wheat Wizard and I had a duel over this question. When we decided to post our solutions we were tied at 42 bytes, but I found a 2 byte golf of his solution. We decided that would count as the tie breaker (my solution is below).

Try it online!

Explanation:

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

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

For a full explanation please see Wheat Wizard's answer.


Brain-Flak, 42 bytes

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

Outputs 0\n (literal newline) for truthy, and the empty string for falsy.

The idea is to subtract 1 then 2 then 3 all the way up to the input. If you hit 0, then you know this is a triangular number, so you can stop there.

Try it online! (truthy)
Try it online! (falsy)

# 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
}

Here's a 46 byte solution that I found interesting.

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

Outputs 0\n (literal newline) for truthy, the empty string for falsy.

The idea is to count down from input by consecutive numbers, 1 at a time. E.g. input - (1) - (1,1) - (1,1,1). Each time we subtract, if we aren't at 0 yet, we leave an extra value on the stack. That way, if we are at 0 and are still subtracting when we pop we remove the last value on the stack. If the input was a triangular number, we will end exactly at 0, and wont pop the 0.

Try it online! truthy
Try it online! falsy

# 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.
}

Riley

Posted 2017-05-22T20:26:19.473

Reputation: 11 345

5

Cubix, 23 24 25 bytes

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

0 for truthy and nothing 0 for falsey. Brutes forces by incrementing counter, adding to cumulative sum and comparing to input. Now to try and fit it on a 2x2x2 cube. Did it!

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

Try it online!

  • / Reflect to to face.
  • I10\ get integer input, push 1 (counter), push 0 (sum) and reflect
  • +s;p- loop body. Add sum and counter, drop previous sum, raise input and subtract
  • ? Test the result of the subtraction
    • For 0 result carrying on straight ahead \.uO@ reflect to bottom face, no-op, U-turn, output and halt.
    • For positive result turn right onto bottom face and @ halt
    • For negative result turn left ;qWs)/su drop subtraction, put input to bottom, shift left, swap counter and sum, increment counter, reflect, swap sum and counter, U-turn onto main loop body.

MickyT

Posted 2017-05-22T20:26:19.473

Reputation: 11 735

So tantalizingly close... that last byte is going to take a lot of effort and cleverness though. – ETHproductions – 2017-05-22T23:44:44.393

Yep, thought I had it but is being elusive – MickyT – 2017-05-22T23:48:06.023

1@ETHproductions found the byte – MickyT – 2017-05-23T00:15:45.483

Your code and your unfolded cube appear to be different, the lower right corner is a . on the cube but a 1 in your code. – Post Rock Garf Hunter – 2017-06-13T13:39:23.693

@WheatWizard Thanks for that, bad editing on my part – MickyT – 2017-06-14T18:31:06.247

5

Brain-Flak, 42 bytes

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

Try it online!

Explanation

The goal of this program is to create a state on two stacks and perform constant operation on both stacks until one of them zeros, we can then output depending on which stack we are on. This is similar to programs that determine the sign of a number. These programs put n on one stack and -n on the other and add one and switch stacks until one of the stacks is zero. If the number was negative in the first place the first stack will hit zero, if the number was positive the other stack will hit zero.

Here we create two stacks one that subtracts consecutive numbers from the input and one that just subtracts one. The one that subtracts consecutive numbers will only terminate if the number is triangular, (other wise it will just pass zero and keep going into the negatives). The other one will always terminate for any positive number, but will always do so slower than the first, thus non-triangular numbers will terminate on that stack.

So how do we set up stacks so that the same operation subtracts consecutive numbers on one and subtracts one on the other? On each stack we have the input on top so that in can be checked, below that we have the difference and below that we have the difference of the difference. Each time we run we add the "difference of the difference" to the regular "difference" and subtract that from the input. For the stack that checks for triangularity we set our double difference to be 1 so that we get consecutive integers each time we run, for the other stack we set it to 0 so that we never change the difference, that is it always stays 1. Here is how the stack is set up at the beginning, where n is the input:

-n  -n
 0   1
 1   0

When we finally do terminate we can use these differences to check which stack we are on we pop the top two values and we get 1 for a triangular number and 0 for a non-triangular number.


Annotated code

(([{}](<((())<>)>))<>) 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

Here's a 50 byte solution I like as well.

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

Try it online!

Post Rock Garf Hunter

Posted 2017-05-22T20:26:19.473

Reputation: 55 382

5

PowerShell, 31 30 bytes

"$args"-in(1..1e6|%{($s+=$_)})

Try it online!

Nice and slow brute force method. Make an array of every sum of 1 through 106, and see if the argument is in there.

briantist

Posted 2017-05-22T20:26:19.473

Reputation: 3 110

4

Japt, 10 7 bytes

Saved 3 bytes thanks to @Luke and @ETHproductions

*8Ä ¬v1

Try it online!

Explanation:

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

õ å+ øU

Explanation:

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

Try it online!

Oliver

Posted 2017-05-22T20:26:19.473

Reputation: 7 160

The question asks for two constant distinct ouputs. – xnor – 2017-05-22T20:54:59.440

*8Ä ¬u1 c for 9B (outputs 0 if input is triangular, 1 otherwise) – Luke – 2017-05-22T21:33:09.380

@Luke You could change u1 c to v1, I believe (switching the outputs) – ETHproductions – 2017-05-22T22:21:54.653

7 bytes? Nice! Somehow missed this while posting my own, similar solution late last might. Let me know if you'd like me to delete it. – Shaggy – 2017-05-23T10:36:05.980

4

Perl 6, 17 bytes

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

Just checks whether $_, the input to the function, is equal to any of the elements of the triangular addition reduction (1, 1+2, ..., 1+2+...+$_).

Sean

Posted 2017-05-22T20:26:19.473

Reputation: 4 136

4

Alice, 38 22 bytes

A lot of bytes saved thanks to Martin and Leo

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

There is a trailing newline. Outputs 1 for triangular, 0 otherwise.

Try it online!

Explanation

This uses the same approach as my CJam answer, only clumsier. In linearized form, the program becomes

i2*.2RE.h*-no@

where the i and o are actually in ordinal mode.

Consider input 21 as an example.

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

Luis Mendo

Posted 2017-05-22T20:26:19.473

Reputation: 87 464

My first Alice answer – Luis Mendo – 2017-05-22T21:47:26.997

1I have a feeling this could be roughly halved with one of Martin's fancy control structures... – ETHproductions – 2017-05-22T21:58:22.457

So do I ... :-) – Luis Mendo – 2017-05-22T22:02:01.440

My first Alice golf: Same code, 23 bytes

– Nitrodon – 2017-05-23T03:05:30.090

A more "standard" layout for this kind of program would be this. That said, you could get rid of the 1 on the stack, and simply output the logical negation of the subtraction (i.e. ...h*-no@)

– Leo – 2017-05-23T08:21:28.243

The simplest way to golf your current version by a lot is to move the o into the first line (simply write ...t/ o @). That already shortens it to 25. Doing the same for the i saves one more byte. (Of course, Leo's suggestion is still a fair bit shorter than that.) – Martin Ender – 2017-05-23T09:01:05.443

@MartinEnder Thanks! If only characters had a square shape... :-) – Luis Mendo – 2017-05-23T09:27:36.613

@LuisMendo You can get 18 by using Leo's layout. – Martin Ender – 2017-05-23T09:34:50.883

@Nitrodon You should post that as your answer :-) – Luis Mendo – 2017-05-23T09:34:51.363

@MartinEnder I think I'll leave that to him, as it's a significant change – Luis Mendo – 2017-05-23T09:36:06.797

@Leo Thanks for the tips. I'm not changing the layout, as it's a significant change. Feel free to post it yourself! – Luis Mendo – 2017-05-23T09:36:42.903

4

05AB1E, 7 6 bytes

EDIT: Thanks to @Dennis: Saved a byte because I forgot about the increment operator

8*>t.ï

Try it online!

n is triangular if sqrt(8n + 1) is an integer

How it works

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

Neil A.

Posted 2017-05-22T20:26:19.473

Reputation: 2 038

Probably wasn't available yet at the time, but t.ï can be Ų these days, which is a builtin to check if a number is a square. – Kevin Cruijssen – 2019-02-14T09:19:41.867

4

R, 23 19 bytes

Similar approach as other answers. Checks to see if 8x+1 is a perfect square.
-4 bytes thanks Giuseppe and MickyT.

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

Try it online!

Robert S.

Posted 2017-05-22T20:26:19.473

Reputation: 1 253

2you can use ! instead of ==0 – Giuseppe – 2018-12-06T19:18:39.437

This is extra nice since it's vectorized, too! – Giuseppe – 2018-12-06T19:19:11.063

1I think you can get rid of the exterior brackets as well !(8*scan()+1)^.5%%1 – MickyT – 2018-12-06T19:21:13.347

3

PHP, 30 Bytes

Prints 1 for true and nothing for false

<?=fmod(sqrt(8*$argn+1),2)==1;

Try it online!

fmod

PHP, 37 Bytes

Prints 1 for true and nothing for false

<?=($x=sqrt($q=2*$argn)^0)*$x+$x==$q;

Try it online!

Jörg Hülsermann

Posted 2017-05-22T20:26:19.473

Reputation: 13 026

3

MATL, 5 bytes

t:Ysm

Try it online!

Explanation:

t       % Duplicate input
 :      % Range(1, input)
  Ys    % Cumulative sum. This will push the first *n* triangular numbers
    m   % ismember. Pushes true if the input is contained within the array we just pushed

James

Posted 2017-05-22T20:26:19.473

Reputation: 54 537

I was going to post t:Ys=a. Forgot about m :-) – Luis Mendo – 2017-05-22T20:38:02.980

1

@LuisMendo I didn't know about m until I saw this answer. Funny how the two answer are almost identical :D

– James – 2017-05-23T17:40:40.433

3

Mathematica, 28 bytes

!Accumulate@Range@#~FreeQ~#&

J42161217

Posted 2017-05-22T20:26:19.473

Reputation: 15 931

I recommend replacing 7! by #. First, it's shorter; more importantly, the current solution is not correct, as it artificially imposes a limit on the size of the input it works on. – Greg Martin – 2017-05-23T00:35:28.850

1OP says: "You may assume that the input is a positive integer under 10^6".But I like your idea and I will take it ,although mine gives the right result for every case using a list of 5040 elements but yours worst case needs a list of 999999 elements.Thanks for the tip! – J42161217 – 2017-05-23T01:03:28.783

1Oops sorry, didn't see the OP's comment! Yes, there are some "perverse" incentives in code golfing: that 1-byte savings is more important in a code-golf question than all the efficiency in the world :) – Greg Martin – 2017-05-23T02:44:54.390

3

Batch, 72 bytes

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

Outputs 1 on success, nothing on failure. Works for zero too, although not requested by the question for some reason.

Neil

Posted 2017-05-22T20:26:19.473

Reputation: 95 035

3

JavaScript (ES7), 19 18 bytes

From my answer to a related question.

Outputs false for triangular numbers or true for non-triangular, as permitted by the OP.

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

Try It

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

Shaggy

Posted 2017-05-22T20:26:19.473

Reputation: 24 623

I think you could save a byte with n=>(8*n+1)**.5%1>0 (which would reverse the outputs) – ETHproductions – 2017-05-22T21:41:22.297

@ETHproductions: OK, as long as you're allowing it. Is doing so normally permitted, though? – Shaggy – 2017-05-22T22:15:42.460

1It qualifies as "two constant, distinct outputs", so yes. Other decision-problem challenges may require truthy/falsy though. – ETHproductions – 2017-05-22T22:20:48.437

3

Pari/GP, 18 bytes

n->issquare(8*n+1)

Try it online!


There is a built-in to test if a number is a polygonal number, but it is one byte longer.

Pari/GP, 19 bytes

n->ispolygonal(n,3)

Try it online!

alephalpha

Posted 2017-05-22T20:26:19.473

Reputation: 23 988

3

Excel, 31 22 bytes

9 bytes saved thanks to Octopus

Outputs TRUE for triangular numbers. Else FALSE. Checks if 8*n+1 is a perfect square.

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

Wernisch

Posted 2017-05-22T20:26:19.473

Reputation: 2 534

1=MOD(SQRT(8*A1+1),1)=0 saves a few bytes – Octopus – 2017-05-23T23:39:41.107

2

TI-BASIC, 10 7 bytes

-3 thanks to @lirtosiast

:not(fPart(√(8Ans+1

Takes input on X. Checks if √(8X+1) is a whole number

Scott Milner

Posted 2017-05-22T20:26:19.473

Reputation: 1 806

Why not not(fPart(√(8Ans+1? – lirtosiast – 2017-08-25T00:48:47.523

@lirtosiast That'll work, thanks! – Scott Milner – 2017-08-25T02:59:54.410

2

Brachylog, 5 bytes

≥ℕ⟦+?

Try it online!

Explanation

≥ℕ⟦+?
≥ℕ     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

user62131

Posted 2017-05-22T20:26:19.473

Reputation:

2

Fourier, 26 bytes

I~X1(&N^*N/2{X}{1~O}N=X)Oo

Try it online!

Beta Decay

Posted 2017-05-22T20:26:19.473

Reputation: 21 478

2

Python - 52 bytes

Note: I know that the other two Python answers are much shorter, but this is the old-school way, more of a by-hand algorithm

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

Mr. Xcoder

Posted 2017-05-22T20:26:19.473

Reputation: 39 774

2

APL (Dyalog), 6 bytes

⊢∊+\∘⍳

Try it online!

Explanation

⊢∊+\∘⍳
      ⍳                 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

Outputs 0 for false and 1 for true.

user41805

Posted 2017-05-22T20:26:19.473

Reputation: 16 320

2

05AB1E (legacy), 4 bytes

ÅTs¢

Try it online!

Explanation:

ÅT     //push all triangle numbers <= (implicit) input
  s    //push input onto stack
   ¢   //count occurrences of input in triangle numbers (i.e. 1 if triangle, 0 if not)

I'm using 05AB1E (legacy) since it pre-dates this challenge, but it works in current 05AB1E as well

Cowabunghole

Posted 2017-05-22T20:26:19.473

Reputation: 1 590

2

Gol><>, 12 bytes

I8*P12,X1%zh

6 bytes golfed off, courtesy of JoKing! A codebreakdown will be coming soon!

Try it online!

First version, 18 bytes

I8*P12,X1}:S(-Zh0h

I found a pretty simple formula for solving this, which helped golf this, since we are only looking to see if the number is triangular, rather than calculate it.

Link to wiki where I found the formula!

Triangular Number Formula

Code Breakdown!

I8*P              //Multiply the output by eight
    12,X          //Get the square root
        1}        //Push a value for truthy output and put it on the bottom
          :S(-    //Check to see if it is a perfect squareroot, no floating point
              Zh0h//If the difference is zero(perfect squareroot) output truthy, otherwise, push a falsey and output!

There is a way to remove 2 bytes, but it outputs the input plus one for truthy, which I don't think is to the specification of "You must pick two constant, distinct outputs to distinguish the two categories".

Try it online!

KrystosTheOverlord

Posted 2017-05-22T20:26:19.473

Reputation: 681

You can replace 1}:S(-Zh0h with 1%zh – Jo King – 2019-02-14T04:45:23.720

A tip: You don't need to use conditionals like ?ZqQ for value checking. Just transform the values directly into 1 or 0 using comparison operators – Jo King – 2019-02-14T05:07:07.457

@JoKing Thank you very much, I have made the changes and it has popped off 6 bytes! – KrystosTheOverlord – 2019-02-14T12:10:42.797

2

Alchemist, 80 bytes

_->In_n+s
f+b->f+a
f+0b->a
0f+n+a->b
0f+0a+n->n+f
0n+a+s->Out_n
0n+0a+s->Out_"1"

Try it online!

Test cases

Subtracts increasing numbers from the input until it reaches 0, and checks if the counter is zero.

Jo King

Posted 2017-05-22T20:26:19.473

Reputation: 38 234

1

Brain-Flak, 62 bytes

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

Try it online!

Explanation

Effectively, this code starts with n and subtracts 1, 2, 3, ... n. If an intermediate result is 0, this is marked by decreasing the size of the left stack.

   (({}))                         duplicate input n
 ([      ])                       push -n as accumulator
(          <>)                    push -n on other stack as counter

{                            }    while counter is nonzero
  ({}())                          increment counter
        <>{}                      add to accumulator
            ({})                  add stored copy of n (effectively, this adds a counter that starts at 1 instead of -n)
 (              )                 push as new accumulator value
                 {(<><>)}{}       If accumulator is zero, shrink the stack by one
                           <>     switch back to right stack

<>                                move to left stack
   [[]]()()()                     3 minus height of left stack (which is 2 if n is triangular and 3 otherwise)
             <>{}                 move back to right stack and pop zero from loop
  (              )                push answer

Nitrodon

Posted 2017-05-22T20:26:19.473

Reputation: 9 181

1I ctrl-F'd for "><>"... Oh, there's already- no wait, that's Brain-Flak? – Esolanging Fruit – 2017-05-23T06:14:48.867

1

><>, 30 28 bytes

-2 bytes thanks to lanlock4

Assumes input is on the stack. Outputs either a 1 or 0.

0v
1<~v!?(}:{:,2*+1::+
n={<;

This was fun. I'm new to ><>, and I'd welcome any suggestions for golfing.

This starts with n=1, then continually increments n while n(n-1)/2 is less than the input number. Once the loop terminates, it prints 1 if n(n-1)/2 is equal to the input number, 0 otherwise.

Esolanging Fruit

Posted 2017-05-22T20:26:19.473

Reputation: 13 542

If you move the +1 to the left of the < on the second line and start at n=0 instead of n=1, you can get rid of both of the spaces, like this.

– Not a tree – 2017-05-23T09:27:21.710

1

2Col, 8 bytes [non-competing]

*8
+1
Sq

Try it on 2Collide

Braingolf got boring so now I'm making a new language. Link leads to the current 2Col interpreter in TIO, with the above code already inserted. 3rd argument is input.

2Col is a language where each line is a 2 character expression of some form. It's what I like to call an "Accumulator-based" language. It works like Stack-based languages, except the "stack" can only contain a single item.

Explanation:

        Implicit input to Cell
*8      Multiply Cell by 8
+1      Add 1 to Cell
Sq      Return true if Cell is square number
        Implicit: Print final line's return value

Skidsdev

Posted 2017-05-22T20:26:19.473

Reputation: 9 656

1

CJam, 10

ri8*)_mQ%!

Try it online

It checks if 8*n+1 is divisible by its integer square root.

aditsu quit because SE is EVIL

Posted 2017-05-22T20:26:19.473

Reputation: 22 326

Interesting variant of the 8*n+1 method. In general this divisibility check tells if a number is of the form k^2, k^2+k or k^2+2*k, but a number of the form 8*n+1 can only be the first case. – Ørjan Johansen – 2017-10-26T19:30:02.213

1

Pyt, 5 bytes

←Đř△∈

Explanation:

←                 get input
 Đ                duplicate input (on stack twice)
  ř               push [1,...,input] onto stack
   △              calculate the kth triangle number for each element k in the array
    ∈             check if input is in array of triangle numbers


Longer but faster way, 9 bytes

←Đ2*√⌈ř△∈

Explanation:

←                     get input
 Đ                    duplicate input (on stack twice)
  2*                  double input
    √⌈                ceiling of the square root
      ř               push [1,...,value from previous step] onto stack
       △              calculate the kth triangle number for each element k in the array
        ∈             check if input is in array of triangle numbers

mudkip201

Posted 2017-05-22T20:26:19.473

Reputation: 833

1

cQuents, 4 bytes

?Z+$

Try it online!

Explanation

?Z+$
        Given input n,
?       Mode query: output true if n is in sequence, false if n is not in sequence
        Each term in the sequence equals
 Z      Previous term
  +                   +
   $                    current index (1-indexed)

Stephen

Posted 2017-05-22T20:26:19.473

Reputation: 12 293

1

PowerShell, 36 bytes

for(;$args-gt$s){$s+=++$i}$s-in$args

Try it online!

This script is 6 bytes longer than the briantist's solution. The script works with any [long] (except for 0) and calculates only what is needed.

mazzy

Posted 2017-05-22T20:26:19.473

Reputation: 4 832

0

QBIC, 21 19 bytes

[:|p=p+a~p=b|_x1}?0

Explanation

[ |     FOR a = 1 to
 :        b (read from the cmd line)
p=p+a   increment p by a (+1, +2, ...) (p is 0 at QBIC start)
~p=b|   IF p == b ; we've hit a triangular number!
_x1     THEN QUIT, printing 1
}       Close the IF and the FOR
?0      We didn't quit early, so print 0

steenbergh

Posted 2017-05-22T20:26:19.473

Reputation: 7 772

The 8x+1 trick is actually longer: b=sqr(8*:+1)?b=int(b) – steenbergh – 2017-05-23T09:25:03.010

0

Clojure, 54 bytes

#(and(some #{%}(reductions +(rest(range(max % 3)))))1)

I wish various truthy values were allowed so I didn't need to coerce them all to 1 with a penalty of 6 bytes.

Without caring about edge cases of 0 or 1, and allowing any truthy value this would have been just 35 bytes:

#(some #{%}(reductions +(range %)))

NikoNyrh

Posted 2017-05-22T20:26:19.473

Reputation: 2 361

0

Japt, 11 9 7 bytes

Port of my JS answer. Outputs 1 for triangular numbers or 0 otherwise.

*8Ä ¬v1

Try it online

Shaggy

Posted 2017-05-22T20:26:19.473

Reputation: 24 623

0

C (gcc), 47 bytes

a,i;f(n){for(a=i=0;i++<n+3;)a|=i*i==8*n+1;a=a;}

Try it online!

Undefined behaviour?

Leaky Nun

Posted 2017-05-22T20:26:19.473

Reputation: 45 011

0

Java 8, 58 48 23 bytes

n->Math.sqrt(8*n+1)%1>0

Port of @xnor's amazing Python answer.

-25 bytes by using a Java 8 lambda instead of Java 7 method (and Math.sqrt(...) instead of Math.pow(...,.5)).

Try it here.

Kevin Cruijssen

Posted 2017-05-22T20:26:19.473

Reputation: 67 575

3Why Math.pow instead of Math.sqrt? – JollyJoker – 2017-05-23T13:26:32.543

0

Neim, 6 bytes

Γ)

Explanation:

       Inclusive range; [1 .. input]
 Γ      For each...
         Inclusive range; [1 .. element]
         Sum
    )   End for each
       Check that the input is in the list

Try it!

Okx

Posted 2017-05-22T20:26:19.473

Reputation: 15 025

0

VB.NET, 65

Sub T(n,j)
j=Math.Sqrt(8*n+1)
Console.Write(CInt(j)=j)
End Sub

Like other answers, determines if 8n + 1 is an integer or not.

Explanation:

Sub T(n,j)                     ' start the method, use n as the triangle number to check
                               ' declare j here as well for use later, saving 4 bytes over a "dim j" call

j=Math.Sqrt(8*n+1)             ' get the square root

Console.Write(                 ' write out the answer, either "True" or "False"
                               ' it saves two bytes to do "Sub/End Sub" with "Console.Write()"
                               ' over "Function/End Function" with "return "

              CInt(j)          ' round to the nearest integer (cast to int, but VB rounds instead of truncating)

                     =j)       ' compare against the sqrt

Brian J

Posted 2017-05-22T20:26:19.473

Reputation: 653

I tried to create a TIO, but I couldn't figure out how to get function arguments to pass it within 5 minutes of trying. I'll try to add one later when I have more time. – Brian J – 2017-05-23T13:31:47.150

0

Octave, 23 bytes

@(n)sum(1:sqrt(2*n))==n

This is an anonyous function that returns true (displayed as 1) for triangular numbers and false (0) otherwise.

Try it online!

Luis Mendo

Posted 2017-05-22T20:26:19.473

Reputation: 87 464

0

C, 45 bytes

a,i;f(n){while(i<=n&&(a=i*i+i++!=2*n));a=!a;}

Try it online.

Explanation:

a,i; - data definition with no type or storage class is allowed in C (gives a warning). Doesn't work in C++ though.
f(n) - This behavior(parameter without type - by default assigned an integer type) is to provide backwards compatibility with older K&R version of C.
while() - loop is self explanatory
a=!a; - the return value of the function should be in "eax" register, but it is often also used as scratch register by calee. So we do a negation operation to store the answer in the eax which gets returned. 

Soumik Mukhopadhyay

Posted 2017-05-22T20:26:19.473

Reputation: 1

0

Whitespace, 95 bytes

Visible representation:

SSNSNSTNTTNSSSNSSSTNTSSSSNSSNSSSSTNTSSSTSSNSSSTSNTSTSSSNTTTTSSTSNSNTSNNTTSNSSSTNTNSTNSSNSSNTNST

Reads the number from stdin. If it is triangular, it outputs 0 to stdout. Otherwise, it outputs 10.

Disassembly:

    push 0
     dup
      inum
loop:
     push 1
      add
     dup
      dup
       push 1
        add
       mul
      push 2
       div
      push 0
       get
       sub
      dup
       jz match
      jn loop
     push 1
      pnum
match:
     push 0
      pnum

The used technique is a simple brute force search through all possible triangular numbers, but for the given limits that is plenty. Using my own whitespace JIT compiler it takes 0.6 milliseconds to prove that 106 is not a triangular number and about 20 seconds to prove that 1018 is not a triangular number.

CensoredUsername

Posted 2017-05-22T20:26:19.473

Reputation: 951

0

cQuents, 7 6 bytes

?b$
;$

Try it online!

Explanation

?b$     First program. Checks if the input is triangular.
?       Mode: query. Returns true if the input is in the sequence, and false otherwise.
 b$     Each item in the sequence is the secondary program, passed the current (1-based) index.

;$      Secondary program. Generates triangular numbers.
;       Mode: series. Calculates the sum of the sequence up to the input.
 $      Each item in the sequence is the current (1-based) index.

Stephen

Posted 2017-05-22T20:26:19.473

Reputation: 12 293

0

JavaScript (ES8), 21 bytes

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

user75200

Posted 2017-05-22T20:26:19.473

Reputation: 141

0

J, 10 9 Bytes

Triangular number of bytes as well :)

-1 Byte thanks to @FrownyFrog

0=1|2!inv

Explanation:

    2!       | n choose 2
      inv    | Inverse
0=1|         | Test if it's an integer

Could have been 7 bytes if the truthy/falsy values didn't have to be constant.

Works since n choose 2 is n!/2!(n-2)! = n*(n-1)/2

I don't know of any shorter ways to test for integers, previously I had been using (=<.)

Bolce Bussiere

Posted 2017-05-22T20:26:19.473

Reputation: 970

0=1|2!inv does something like this. 0=1|2&!inv for a proper function. – FrownyFrog – 2018-01-11T04:39:45.787

@FrownyFrog Cool! That's real clever – Bolce Bussiere – 2018-01-11T05:20:08.167

0

APL(NARS) 12 chars, 24 bytes

{0=1∣√1+8×⍵}

It is done seen(copy) some other solution... it seems {1∣⍵} it is 0 when ⍵ is one int decimal with 0 digits afther the "." test:

  f←{0=1∣√1+8×⍵}
  {⍞←{1=f ⍵:' ',⍵⋄⍬}⍵⋄⍬}¨0..200
 0  1  3  6  10  15  21  28  36  45  55  66  78  91  105  120  136  153  171  190  

but i remember i wrote the solution to this a little +long, some time ago...

RosLuP

Posted 2017-05-22T20:26:19.473

Reputation: 3 036

0

05AB1E, 4 bytes

ÅTI¢

Try it online!

Explanation:

ÅT     Get list of triangle numbers less than or equal to the implicit input
  I¢   Count occurrences of input in list

rev

Posted 2017-05-22T20:26:19.473

Reputation: 39

In this case the count will give exactly the same output, but just a FYI: there is also a contains builtin: å. :) (PS: There is already an 05AB1E answer using the same approach.)

– Kevin Cruijssen – 2019-03-13T11:54:08.843