n-th term of the rise & reset sequence

37

2

(Challenge taken from a multiplayer game (clash of code) at codingame.com)

The challenge

Find the n-th term of the following sequence: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4... or, to make it more obvious, {1}, {1,2}, {1,2,3}, {1,2,3,4}...

The sequence is made up from concatenated ranges from 1 to x, starting from 1, all the way up to infinity.

Rules / IO

Input and output can be in any format, as long as it's distinguishable. Input can be taken from any appropriate source: STDIN, file, etc...

The input can be 0- or 1-indexed, and the selected indexing must be mentioned in the post.

You will have to handle at least up to a result of 255 inclusive (meaning the 0-indexed maximum input is 32640). Anything over that has to be handled, if your language supports it.

This is code-golf so the shortest byte count wins!

Test cases (0-based indexing)

0 -> 1
1 -> 1
5 -> 3
10 -> 1
59 -> 5
100 -> 10
1001 -> 12

Yytsi

Posted 2017-01-22T14:32:36.433

Reputation: 3 582

11OEIS – Gurupad Mamadapur – 2017-01-22T14:44:23.440

4You should probably add a few more larger test cases (59, 100, etc) – FlipTack – 2017-01-22T16:07:56.677

It's the challenge in reverse. The best answers from that challenge work in a way that couldn't be reversed. @JarkoDubbeldam – devRicher – 2017-01-23T12:45:47.430

@devRicher I know, just putting it out there and it wasn't meant negatively. My own answer there actually was reversable. Related != duplicate. – JAD – 2017-01-23T14:27:53.223

How many terms do we have to support? Is it guaranteed that the input will not overflow our languages' integer types? – FlipTack – 2017-02-01T07:40:51.550

@FlipTack Each language has to handle a result at least up to 255 inclusive (meaning the input is higher than 255). Anything over that needs to be handled if your language supports it. I'll edit that in. – Yytsi – 2017-02-01T08:03:24.297

What do you mean "the input is higher"? Don't you mean lower or equal to? – FlipTack – 2017-02-01T09:09:33.310

@FlipTack No. To arrive at a result of 255, the 0-indexed input has to be 32640. – Yytsi – 2017-02-01T09:57:23.283

Answers

5

05AB1E, 5 bytes

The program is 0-indexed, code:

ÌLL¹è

Explanation:

Ì       # Double increment the input
 LL     # List of list on the input
   ¹è   # Get nth element

Uses the CP-1252 encoding. Try it online!

Adnan

Posted 2017-01-22T14:32:36.433

Reputation: 41 965

GNG¹¾¼QiN is an iterative approach, but that was smarter. – Magic Octopus Urn – 2017-01-23T17:44:42.423

13

Haskell, 27 26 bytes

([z|k<-[1..],z<-[1..k]]!!)

Try it online!

Thanks @DanD. for -1 byte!

This is an anonymous function, creating the infinite sequence an just returning the n-th element thereof: [[1..k]| k<-[1..]] produces an infinite list of list: [[1],[1,2],[1,2,3],[1,2,3,4],...]. To concatenate these we can write [z|k<-[1..],z<-[1..k]] which results in [1,1,2,1,2,3,1,2,3,4,...] and finally (...!!) accepts the input n (pointless notation) and returns the n-th term (0-based).

flawr

Posted 2017-01-22T14:32:36.433

Reputation: 40 560

Replacing concat with more comprehension only saves 1 byte: ([z|k<-[1..],z<-[1..k]]!!). – Dan D. – 2017-01-23T03:40:50.103

12

JavaScript, 29 28 bytes

-1 byte thanks to Arnauld!

f=(n,m)=>n++<m?n:f(n+~m,-~m)

Uses the 0-indexed recursive formula found on OEIS.

When called with 1 argument as expected, the default value of the second, m, will be undefined. However, -~undefined, returns 1, which allows us to get the recursion rolling without an explicit m = 1 in the argument list (thanks @Arnauld!)

Test snippet:

f=(n,m)=>n++<m?n:f(n+~m,-~m)

let examples = [0, 1, 5, 10, 15, 1000];

examples.forEach(function log(x) {
    console.log(x, " => ", f(x))
});

Alternatively, for the same byte count, we can have a curried function like so:

f=n=>m=>n++<m?n:f(n+~m)(-~m)

You can call this with f(5)() - it returns a function, which when called, returns the result, as described in this meta post.

FlipTack

Posted 2017-01-22T14:32:36.433

Reputation: 13 242

9

Jelly, 5 bytes, 1-indexed

RRF³ị

Try it online!

Explanation:

                                      (Assume N = 4 for the examples)
R      Generate a list of 1 to N      [1, 2, 3, 4]
 R     Generate new lists for each item on the previous list, with that item as N
                                      [[1], [1,2], ...]
  F    Flatten that list              [1, 1, 2, 1, 2, 3 ...]
   ³ị  Use the input number (³) as index (ị) on the list. 
       This is one-based:             [1, 1, 2, 1, 2, 3 ...] 
                                                ^

steenbergh

Posted 2017-01-22T14:32:36.433

Reputation: 7 772

8

Octave, 39 bytes

@(z)z-(n=ceil((8*z+1)^.5/2-.5))*(n-1)/2

1- based index

Explanation:

Consider this sequence:

1   1   2   1   2   3   1   2   3   4   1   2   3   4   5

if we count number of element of subsequences we have

1   2        3          4               5         

so using Gauss formula for triangular number we can form a formula for z:

z=n*(n+1)/2

that is a quadratic equation if we solve it for n we have

n=(sqrt(8*z+1)-1)/2

Try It Online!

rahnema1

Posted 2017-01-22T14:32:36.433

Reputation: 5 435

7

Haskell, 25 24 bytes

(!!)$[1..]>>= \x->[1..x]

Usage example: ((!!)$[1..]>>= \x->[1..x]) 10 -> 1. Try it online!.

Maps the anonymous make-a-list-from-1-to-x function \x->[1..x] (the built-in enumFromTo 1 is one byte longer) to the infinite list [1..] and concatenates the resulting lists into a single list. !! picks the nth element.

Thanks to @flawr for one byte.

nimi

Posted 2017-01-22T14:32:36.433

Reputation: 34 639

I think you could shorten it by using (!!)$[1..]>>= \x->[1..x]. Sometimes I really wish there was a shorter pointless way of writing \x->[1..x] :) – flawr – 2017-01-22T16:22:13.547

PS: Why don't you add a Try it online! link?

– flawr – 2017-01-22T16:24:18.830

@flawr: Well spotted, thanks! Try it online uses an old version of ghc (or Prelude) and most of answers use <$> which isn't in scope. Do you know any online Haskell compiler/interpreter that uses the newest version? haskell.org only allows expressions and you cannot create links to code you've entered. – nimi – 2017-01-22T16:33:33.843

1

Ah, let me tell @Dennis to update it, he is the creator of TIO :)

– flawr – 2017-01-22T16:35:51.613

6

Octave, 39 bytes

@(n){v=1:n,A=triu(v'+0*v),A(A>0)(n)}{3}

Try it online!

This uses an alternative approach.

For e.g. n=1 this A=triu(v'+0*v) creates the matrix

1   1   1   1
0   2   2   2
0   0   3   3
0   0   0   4

When removing all the zero elements and appending the columns by A(A>0) we get the sequence:

1   1  2  1  2  3  1  2  3  4

Then it is just a matter of exctracting the n-th term of that sequence.

flawr

Posted 2017-01-22T14:32:36.433

Reputation: 40 560

5

Python, 39 36 bytes

-3 bytes thanks to Dennis!

A recursive lambda which uses 1-based indexing.

f=lambda n,m=1:n*(n<=m)or f(n-m,m+1)

Try it online!

We keep track of the current "rise" size using m. If n is smaller than or equal to m, it fits within the current "rise", and so we return it. However, if it's larger than m, we take m away from it, than add 1 to m and call the function recursively (moving on to the next rise).

FlipTack

Posted 2017-01-22T14:32:36.433

Reputation: 13 242

5

R, 25 bytes

i=scan();sequence(1:i)[i]

The index is 1-based.

Sven Hohenstein

Posted 2017-01-22T14:32:36.433

Reputation: 2 464

I saw this bumped to the homepage today, wondered if anyone had submitted a sequence answer, and was happy to see this. – Giuseppe – 2017-11-09T14:34:27.997

4

Mathematica, 27 24 bytes

Thanks @MartinEnder for 3 bytes!

((r=Range)@r@#<>1)[[#]]&

1-indexed. This throws errors that are safe to ignore.

Explanation

((r=Range)@r@#<>1)[[#]]&
  r=Range                 (* Store Range function in r *)
           r@#            (* Create list {1..n} *)
 (r      )@               (* For each element, generate {1..n} *)
              <>1         (* Join the lists and append a 1; throws errors *)
(                )[[#]]&  (* Take the nth element *)

JungHwan Min

Posted 2017-01-22T14:32:36.433

Reputation: 13 290

2Join@@ is way too expensive ;) ((r=Range)@r@#<>1)[[#]]& – Martin Ender – 2017-01-22T16:35:35.467

@MartinEnder Woah, abusing the fact that StringJoin is not evaluated... I like it – JungHwan Min – 2017-01-22T18:47:11.413

4

Pyth, 6 5 bytes

1 byte saved thanks to @TheBikingviking!

@s._S

This uses 0-based indexing.

Try it online!

Explanation

@          Index with implicit input into
   ._      all prefixes of
     S     1-based range of implicit input
 s         concatenated into an un-nested list

Luis Mendo

Posted 2017-01-22T14:32:36.433

Reputation: 87 464

Nice! You can replace .n with s. – TheBikingViking – 2017-01-22T18:39:53.750

@TheBikingViking Thanks! – Luis Mendo – 2017-01-22T18:45:38.073

4

brainf*ck, 78 bytes

,>+<[>[->>+>+<<<]>>>[-<<<+>>>]<<+[->->+<<]>[<<->>>[-<<+>>]<[-]]>[-]<<<+<-]>>+.

Takes input (0-based) and outputs as byte values.

You can test it here.

Input requires a \ before decimal numbers (e.g. \10 for 10). If the output is a printable ASCII character, you should see it. Otherwise, hit view memory -> final dump. The value that was printed is in the 3rd cell (cell number 2).

Explanation:

Cell 0 (INPUT): is the input and is decremented my 1 each time through the loop.

Cell 1 (RESET): increments by 1 every time it is equal to TERM. To do this, every time through the loop we add 1 and if they are not equal we subtract 1.

Cell 2 (TERM): increments by 1 every loop and is set to 0 if it matches RESET. To do this, I only copy the value back from HOLD if this cell was not equal to RESET.

Cell 3 (EQUAL): is used to check if RESET and TERM are equal.

Cell 4 (HOLD): is used to copy the values of RESET and TERM back after the equals check.

,>+<              # get input and put a 1 in RESET
[                 # for INPUT to 0
  >[->>+>+<<<]    # copy RESET to EQUAL and HOLD
  >>>[-<<<+>>>]   # copy HOLD back into RESET
  <<+             # add 1 to TERM
  [->->+<<]       # subtract TERM from EQUAL and copy it to HOLD
  >[              # if RESET and TERM were not equal
    <<-           # subtract 1 from RESET
    >>>[-<<+>>]   # copy HOLD back to TERM
    <[-]          # zero out EQUAL
  ]               # end if
  >[-]            # zero out HOLD
  <<<+            # add 1 to RESET (this cancels out the subtraction if
                  #     RESET did not equal TERM)
  <-              # subtract 1 from INPUT
]>>+.             # end for and add 1 because the sequence resets to 1 not 0

Riley

Posted 2017-01-22T14:32:36.433

Reputation: 11 345

Good job! I'll test this and award the bounty right after. Mind adding an explanation? :) – Yytsi – 2017-01-31T19:30:35.523

@TuukkaX I was working on that :) I'll try to add some more when I have time tonight. – Riley – 2017-01-31T19:32:40.727

Seems to work :) Bounty available in 20 hours. – Yytsi – 2017-01-31T19:38:04.740

@TuukkaX Keep in mind that the bounty should be left available for all 7 days to draw attention, then awarded on the last day. – mbomb007 – 2017-01-31T19:55:35.670

@mbomb007 Hmm. I announced that I'll award the bounty to the first to submit a brainf*ck solution, which means the competition for the bounty is over. However, other people are doing the same you mentioned, and it's a good way to compensate for the points that I lost. Thanks :) – Yytsi – 2017-01-31T20:03:51.637

I started thinking of a BF solution as soon as I saw the bounty, but this answer already existed then. Still, it only took me an hour to make my solution. – mbomb007 – 2017-01-31T21:46:32.403

@mbomb007 I think a happened to see the bounty within a few minutes of it being posted. I guess I got lucky. – Riley – 2017-01-31T21:47:31.940

The interpreter you're using is kind of limited. I'd recommend looking at the one I used. – mbomb007 – 2017-01-31T22:12:05.727

@mbomb007 Thanks! I was just using the first one I found. Is there a good way to see the byte value of what was printed? – Riley – 2017-01-31T22:53:21.223

I kind of explain it in my BF answer. Print in a # after every . to get a memory dump for that time. Then look for the cell that is bold, which will be the value where the pointer is, and the value that was printed. You have to turn on the memory dumps option for this to work. – mbomb007 – 2017-02-01T04:46:59.707

3

Pyke, 6 bytes

OmSsQ@

Try it here!

O      -    input+2
 mS    -   map(range(1,i+1), range(^))
   s   -  sum(^)
    Q@ - ^[input]

0-indexed.

Blue

Posted 2017-01-22T14:32:36.433

Reputation: 26 661

3

R, 43 41 bytes

Edit: Found a shorter recursive approach by using A002262 + 1 (0 indexed):

f=function(n,m=1)`if`(n<m,n+1,f(n-m,m+1))

Old version:

n=scan();n-choose(floor((1+sqrt(8*n))/2),2)

1-indexed formula from OEIS.

Billywob

Posted 2017-01-22T14:32:36.433

Reputation: 3 363

Try It Online! It seems to work just fine. :) – R. Kap – 2017-01-23T00:43:30.447

I managed to save a few bytes compared to your solution. See my answer. – JAD – 2017-01-23T09:39:01.477

3

Perl 6, 21 bytes

{map(|^*,^∞)[$_]+1}

0-indexed. Try it online!

How it works:

{                 }  # A lambda.
         ^∞          # Range from 0 to Inf-1. (Same byte count as 0..*, but cooler.)
 map( ^*,  )         # Map each number n to the range 0..(n-1),
     |               # And slip each range into the outer list.
            [$_]     # Index the sequence with the lambda argument.
                +1   # Add 1.

Perl 6, 21 bytes

{[\,](1..*).flat[$_]}

0-indexed. Try it online!

How it works:

{                   }  # A lambda.
      1..*             # Range from 1 to infinity.
 [ ,](    )            # Fold it with the comma operator,
  \                    # and return all intermediate results, e.g. (1), (1,2), (1,2,3)...
           .flat       # Flatten the sequence.
                [$_]   # Index it with the lambda argument.

smls

Posted 2017-01-22T14:32:36.433

Reputation: 4 352

2

Brain-Flak, 46 bytes

Zero indexed

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

Try it online!

Stack Clean, 48 bytes

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

Try it online!

Explanation

This is a modified version of the modulo function. Instead of using a constant number as the divisor it increments the divisor for each time the divisor is subtracted from it (once per outside loop iteration).

Annotated Code

(<>())       # Switch to the opposite stack and push 1 (the initial divisor)
{            # (outside loop) While top of stack is not 0...
  (          # Push...
    ({}())   # Push the divisor plus 1
  [()])      # ...minus one (ie push a copy of the original divisor
  {          # (inner loop) While the top of stack does not equal zero
    ({}[()]) # Decrement the top of the active stack
    <>       # Switch stacks
  }{}        # (inside loop) End loop and pop zero off the top of stack)
}            # (outside loop) End loop
<>           # Switch stacks (to the one with the divisor)
([{}()]{})   # Calculate the result

0 '

Posted 2017-01-22T14:32:36.433

Reputation: 3 439

2

Neither of these solutions is as short as JungHawn Min's, but they're alternate approaches, which is something I guess. Both are unnamed functions taking a (1-indexed) positive integer input and returning a positive integer.

Mathematica, 30 bytes

-#^2-#&@⌈√(2#)-3/2⌉/2+#&

An actual mathematical formula for this function! Made more readable (in part by translating the 3-byte characters , , and ):

# - ((#^2 + #) / 2 &)[Ceiling[Sqrt[2 * #] - 3/2]] &

Ceiling[Sqrt[2 * #] - 1/2] tells us which sublist the input refers to, from which we subtract one to tell us which sublist ends before we get to the input; then ((#^2 + #) / 2 &) computes how many elements occur in all the sublists before the one we care about, which we subtract from the input # to get our answer. (Some will notice the familiar formula (#^2 + #) / 2 for the #th triangular number; Ceiling[Sqrt[2 * #] - 1/2] is essentially the inverse function.)

Mathematica, 32 bytes

If[#2<=#,#2,#0[#+1,#2-#]]&[1,#]&

Recursive solution, basically the same as in Billywob's answer and others.

Greg Martin

Posted 2017-01-22T14:32:36.433

Reputation: 13 940

2

Java 8, 85 73 55 bytes

n->f(n,1)+1int f(int n,int m){return n<m?n:f(n-m,m+1);}

0-indexed recursive approach with the formula provided in the OEIS:

a(n) = 1 + A002262(n).
A002262: a(n)=f(n,1) with f(n,m) = if n<m then n else f(n-m,m+1).

Try it here.


Old answer (85 56 bytes):

n->{int m=~-(int)Math.sqrt(8*n+1)/2;return n-m*-~m/2+1;}

Used the other 0-indexed formula provided in the OEIS:

n-th term is n - m*(m+1)/2 + 1, where m = floor((sqrt(8*n+1) - 1) / 2).

Try it here.

Kevin Cruijssen

Posted 2017-01-22T14:32:36.433

Reputation: 67 575

1

QBIC, 21 bytes, 1-indexed

:[a|[b|~q=a|_Xc\q=q+1

Explanation:

:      Get 'a' from the cmd line
[a|    FOR (b = 1; b <= a; b++) This creates an outer loop from 1 to N
[b|    FOR (c = 1; c <= b; c++) This creates an iteration, yielding the 1, 12, 123 pattern
       'q' stores how many terms we've seen. It starts at 1 b default.
~q=a   if we are at the desired term (q == a)
|_Xc   Then quit, and print 'c' (the current number in the sequence)
\q=q+1 Else, increase 'q' and run again.

Slightly more interesting approach, but 10 bytes longer:

:{~b+q>=a|_xa-b|\b=b+q┘q=q+1

This program continuously calculates the total number of numbers in this bracket and all previous ones (1 at loop 1, 3 at loop 2, 6 at loop 3 ...). When that counter exceeds the sought-after index N, then return X from the current bracket, where X is N minus the previous amount of the counter.

steenbergh

Posted 2017-01-22T14:32:36.433

Reputation: 7 772

1

Perl, 30 bytes

29 bytes of code + -p flag.

map{$\-=$c++if$c<++$\}0..$_}{

Try it online!

Dada

Posted 2017-01-22T14:32:36.433

Reputation: 8 279

1

C, 81 44 bytes

straight iterative method, 0 indexed, and with some gentle massaging;

m=1,c=1;f(n){for(;n--;c=c^m?c+1:!!++m);c=c;}

Try it online!

Ahemone

Posted 2017-01-22T14:32:36.433

Reputation: 608

1Try It Online! It works. :) – R. Kap – 2017-01-23T00:35:19.153

1

MATL, 8 bytes

:"@:]vG)

This solution uses 1-based indexing

Try it at MATL Online

Explanation

        Implicitly grab input (N)
:       Create an array from [1...N]
"       For each element (A) in this array...
  @:    Create an array from [1....A]
]       End for loop
v       Vertically concatenate everything on the stack
G       Explicitly grab the input again
)       And use it to index into the vertically concatenated array
        Implicitly display the result

Suever

Posted 2017-01-22T14:32:36.433

Reputation: 10 257

1Not that it matters a lot, but the code is much faster if you move v after ] – Luis Mendo – 2017-01-22T18:49:59.000

1@LuisMendo Ah good point! I like short and fast! – Suever – 2017-01-22T18:51:48.433

But that's a short-circuited and, of course! :-) – Luis Mendo – 2017-01-22T18:52:29.297

1

dc, 21 bytes, 0-based indexing

?d8*1+v1-2/d1+*2/-1+p

Try the dc program online!

Explanation:

?      Push input number n.
d      Duplicate n at the top of the stack.
8*1+   Replace n at the top of the stack with 8n+1.
v      Replace 8n+1 at the top of the stack with the floor of its square root.
1-2/   Subtract 1, and divide by 2 (ignoring any fractional part).

The top of the stack now holds the index k of the greatest triangular number that is <= n.

d1+*2/ Compute k(k+1)/2, which is the greatest triangular number <= n.
-      Subtract n-(the greatest triangular number <= n). The first n is on the stack in position 2, because the input number n was duplicated at the top of the stack at the very beginning of the program, and only one of the values was popped and used (until now).
1+     Add 1 because the desired sequence starts over again at 1 (not 0) at every triangular number.
p      Print the answer.

This dc program can be converted into a competitively-sized bash script:

Bash + Unix utilities, 28 bytes, 0-based indexing

dc -e"?d8*1+v1-2/d1+*2/-1+p"

Try the bash program online!

Mitchell Spector

Posted 2017-01-22T14:32:36.433

Reputation: 3 392

1

Ruby, 30 bytes

->n{(0..n).find{|x|0>=n-=x}+n}

1-based indexing

G B

Posted 2017-01-22T14:32:36.433

Reputation: 11 099

1

R, 37 bytes

n=scan();for(i in 2:n)T=c(T,1:i);T[n]

Takes input from n, and creates the sequence for the first n sequences. This makes it somewhat inefficient at higher inputs, but it should be fine. It then returns the n-th entry, 1-indexed.

Uses a nice little trick by starting off the sequence with T, which is TRUE or 1 by default.

JAD

Posted 2017-01-22T14:32:36.433

Reputation: 2 898

1

C11, 48 bytes

int f(int x){int q=1;while(x>q)x-=q++;return x;}

Try it online!

Also works in C++ and Java.


An alternative for the same byte count:

int f(int x){int q=0;while(x>++q)x-=q;return x;}

AlexRacer

Posted 2017-01-22T14:32:36.433

Reputation: 979

Umm.. Neither seems to work for most of the test cases.. Try it here

– Kevin Cruijssen – 2017-11-09T14:45:20.137

1

brainfuck, 141 bytes

I know I'm too late for the bounty, but I just wanted to see how many bytes the algorithm I thought of would end up being.

This program is zero-indexed.

,>+<[[->>+>+<<<]>>[-<<+>>]<[->+>>+<<<]>[-<+>]>>+[[-<->>+<]>[-<+>]<<<<]>>[>>>]>[.[<<<]]<<<<<<<[[-]>>>[-<+<<+>>>]<[->+<]<<<<<]>>>[>>>]<<<]>[.>]

Try it online

  • Select Dynamic (infinite) Memory, or it won't work
  • To test input values > 255, change Cell size (Bits) to 16 or 32.
  • The interpreter explains how to give input. For decimal input use \5 for input of 5.
    • The maximum decimal value you can test input with is \999
    • Hex input can go as high the cell-size.

Explanation:

This shows the program broken up by step, showing what happens for input of 5. # are placed in the ideal memory dump locations for the interpreter.

You will probably want to use checkbox Dump Memory at char: # if running this version. This will dump the memory upon hitting #, allowing you to see the value on the tape in the event that it's an unprintable character, or to see what happens at any step you want. The cell that the pointer is on will be in bold.

,>+<                       (5) 1
[[->>+>+<<<]>>[-<<+>>]       5 1 (0) 5
<[->+>>+<<<]>[-<+>]>>+       5 1 0 5 (2)
[[-<->>+<]>[-<+>]<<<<] (0) 0 4 1 0 3 2 0 0
>>[>>>]                      4 1 0 3 2 0 (0) 0
                             1 1 0 (0) 2 0
>[.#[<<<]]<<<<                4 1 0 (3) 2 0 0 0
<<<[[-]>>>[-<+<<+>>>]<[->+<]<<<<<]>>> (3) 1 0 3 2 0 0 0
[>>>]<<<]>[.#>]

Tape structure:
    (cell_1 cell_2 temp), (cell_1 cell_2 temp), ...

Take Input;
If not zero:
  copy last pair to the right and add one to its cell_2
  subtract each cell_2 from each cell_1 (leaving each cell_2 intact)
  move checking from left to right: 
    If cell_1 is zero and cell_2 isn't:
      print cell_2
    Else:
      copy last cell_1 back, overwriting each previous cell_1
Else:
  right one and print result

Try it online

  • Select Dynamic (infinite) Memory, or it won't work
  • Dump Memory at char: #

Notes:

  • To run this on another interpreter that doesn't allow moving to the left of the starting cell (that's why I use Dynamic Memory), put in a bunch of > at the start. The number required may vary depending on the input value, but is O(1).

mbomb007

Posted 2017-01-22T14:32:36.433

Reputation: 21 944

1

tinylisp (repl), 90 bytes (0-indexed)

(d r(q((n j x)(i n(i(e j x)(r(s n 1)1(s x(s 0 1)))(r(s n 1)(s j(s 0 1))x))j
(q((n)(r n 1 1

Or, non-competing (using a feature that was committed after this challenge was posted), 80 bytes:

(d r(q((n j x)(i n(i(e j x)(r(s n 1)1(a x 1))(r(s n 1)(a j 1)x))j
(q((n)(r n 1 1

The first line defines a helper function r, and the second line is an unnamed function that takes n and returns the nth term of the sequence. I've specified this as a repl submission because the repl autocompletes parentheses at the end of every line, not just at the end of the program. With those caveats, here's a version modified to work at Try it online, and here's an ungolfed version run against inputs 0 through 54.

Explanation

I'll use the noncompeting version here. The only difference is that the official version has to implement addition as two subtractions.

(d r           Define r to be:
 (q(           A lambda function (= a list of two elements, quoted to prevent evaluation):
  (n j x)       Arguments n, j (the range counter), and x (the range limit)
  (i n          If n is truthy, i.e. nonzero:
   (i(e j x)     If counter equals limit:
    (r            Call r recursively on:
     (s n 1)       n-1
     1             counter reset to 1
     (a x 1))      limit increased by 1
    (r           Else, call r recursively on:
     (s n 1)       n-1
     (a j 1)       counter increased by 1
     x))           same limit
   j))))        Else, we're done; return the counter value

(q(            Lambda function:
 (n)            Argument n
 (r n 1 1)))    Call r with n, counter = 1, range limit = 1

DLosc

Posted 2017-01-22T14:32:36.433

Reputation: 21 213

1

C, 54 bytes

Not the shortest C solution, but it has the merit of running in constant time (no loops, just math). It uses zero-based indexing:

x;f(n){x=floor(sqrt(8*n+1)-1)/2;return 1+n-x*(x+1)/2;}

Ungolfed:

int f(int n) {
    int x = floor(sqrt(8*n+1)-1)/2; //calculate the number of the current subsequence (zero based)
    return 1+n-x*(x+1)/2;   //x*(x+1)/2 is the zero based index of the `1` starting the subsequence
}

Test with:

#include <math.h>
#include <assert.h>
#include <stdio.h>

x;f(n){x=floor(sqrt(8*n+1)-1)/2;return 1+n-x*(x+1)/2;}

int main(){
    int i;
    for(i = 0; i < 10; i++) printf("%d ", f(i));
    printf("\n");

    assert(f(0) == 1);
    assert(f(1) == 1);
    assert(f(5) == 3);
    assert(f(10) == 1);
    assert(f(59) == 5);
    assert(f(100) == 10);
    assert(f(1001) == 12);
}

cmaster - reinstate monica

Posted 2017-01-22T14:32:36.433

Reputation: 381

1

C, 103 bytes

For a begginer it's okay, I think :).

int main(){int n,c,i,j;scanf("%d",&n);while(c<n){for(i=1;i<=j;i++){c++;if(c==n)printf("%d",i);}j++;}}

or the formatted way

#include <stdio.h>

int main() {
    int n,c,i,j;
    scanf("%d",&n);
    while(c<n) 
    {
        for(i=1;i<=j;i++)
        {
            c++;
            if(c==n) printf("%d",i);
        }
        j++;
    }
}

Mohammad Madkhanah

Posted 2017-01-22T14:32:36.433

Reputation: 11

1If you declare n,c,i,j as globals, it is guaranteed they are initialized to 0, which is not true of locals. – feersum – 2017-02-05T05:17:23.810

I knew it'd contain such unexperienced mistakes. n is the input or the n-th number in the sequence, c is a counter, i and j are loop elements; j will be 1 then 2 then 3 while i will be 1 then 1,2 then 1,2,3 and so on. @Qwerp-Derp – Mohammad Madkhanah – 2017-02-05T15:37:15.887

I'm not sure if I understood exactly what you mean but the initial values will be 0 in this code whether I declared them as globals or locals. Please correct me ıf I'm wrong 0=). @feersum – Mohammad Madkhanah – 2017-02-05T15:50:49.230

No, uninitialized local variables aren't set to 0. http://stackoverflow.com/questions/15268799/uninitialized-variable-in-c

– feersum – 2017-02-05T18:09:04.140

1

Pushy, 11 bytes

1-indexed implementation.

R&:{R;&:{;#

Try it online!

FlipTack

Posted 2017-01-22T14:32:36.433

Reputation: 13 242

0

APL, 9 bytes

{⍵⊃∊⍳¨⍳⍵}

Explanation:

⍵⊃           ⍝ ⍵'th element of
  ∊          ⍝ concatenated elements of
   ⍳         ⍝ each list from 1 to N 
    ¨        ⍝ for each N in 
     ⍳⍵      ⍝ list from 1 to ⍵

marinus

Posted 2017-01-22T14:32:36.433

Reputation: 30 224

0

Batch, 55 bytes

@set/am=%2+1,n=%1-m
@if %n% gtr 0 %0 %n% %m%
@echo %1

1-indexed. Like some of the other recursive answers, this keeps track of which range it's in using a second argument that defaults to the empty string. This means that m equals 1 on the first pass. The loop ends when n falls below 1 in which case the previous value of n is the answer.

Neil

Posted 2017-01-22T14:32:36.433

Reputation: 95 035

0

PHP, 41 bytes

seems like there´s nothing shorter in PHP. Damn the dollars.

for($s=$argv[1];$s>0;$s-=++$i);echo$i+$s;

1-indexed. Run with -r or Try it Online.

Titus

Posted 2017-01-22T14:32:36.433

Reputation: 13 814

Try It Online! In Bash, as it was more convenient and I could not figure out how to use flags on the actual PHP page, but at least it proves that the code works. :) – R. Kap – 2017-01-23T00:51:20.437

@R.Kap The actual PHP page needs no flags. -r tells PHP to run code from the command line instead of from a file. But thanks for the TiO. – Titus – 2017-01-23T09:03:11.427

0

Scala, 45 bytes

(n:Int)=>Stream.from(1)flatMap(1 to _)apply n

0-indexed.

jaxad0127

Posted 2017-01-22T14:32:36.433

Reputation: 281

0

dc, 47 bytes, 0 indexed

?0sb1se[0sble1+se]sf[lb1+dsble=f1-d0!>c]dscxlbp

Try It Online!

Explanation

This explanation assumes that the input is 100.

?                                               # Ask for inout and store it on top of the main stack. 
                                                # Main = [100].
 0sb1se                                         # Store 0 on top of register "b" and 1 on top of register "e" to be referenced later. 
                                                # b = [0], e = [1], Main = [100].
       [0sble1+se]sf                            # Store the macro "0sble1+se" on top of register "f". 
                                                # f = [0sble1+se], b = [0], e = [1], Main = [100].
                    [lb1+dsble=f1-d0!>c]dscx    # Store the macro "lb1+dsble=f1-d0!>c" on top of Main stack, duplicate it, and then store one copy on top of register "c" and then immediately executing the other copy as a dc program. 
                                                # c = [lb1+dsble=f1-d0!>c], f = [0sble1+se], b = [0], e = [1], Main = [100]

================================================================================================================================================================================================================================================

Upon invocation of the macro `lb1+dsble=f1-d0!>c`:

    lb1+dsble            # Load (not pop) the value off of the top of register "b" on top of the main stack, add 1 to it, duplicate the sum, and then push one copy to the top of register "b". 
                         # Then, load the value off of the top of "e" onto the main stack.
                         # b = [0,1], e = [1], Main = [100,1,1].
             le=f        # Now, pop the top 2 values (1 and 1), compare them, and invoke the macro on top of register "f" if both are equal. In this case, it is invoked, since 1==1.
                         # b = [0,1], e = [1], Main = [100].

    ======================================================================================================================================================================================

     If the macro on top of "f" (`0sble1+se`) is invoked:

         0sble1+se # Push 0 to the top of the Main stack. Then, push it to the top of register "b", resetting the sequence, after which the value on top of "e" is loaded onto the main stack.
                   # Then, this value is incremented by 1. This new value os finally pushed to the top of register "e".
                   # b = [0,1,0], e = [1, 2], Main = [100]

    ======================================================================================================================================================================================

                 1-d0!>c # Finally, decrement the value on top of the Main stack (the input) by 1, duplicate this, pop and compare this value with 0, and as long as the `input-1`>=0, keep on executing this macro.
                         # b = [0,1,0], e = [1, 2], Main = [100,99]

================================================================================================================================================================================================================================================

                                            lbp # Finally, once all the iterations of the macros have taken place, load the n'th value of the sequence off of the top of register "b", and then output it.
                                                # At the end, b = [0,1,0,1,2,0,1,2,3,0,1,2,3,4,...] and Main=[100,99,...,0,-1].             

R. Kap

Posted 2017-01-22T14:32:36.433

Reputation: 4 730

0

Bash + BSD utilities (MacOS X, etc.), 28 bytes, 1-based indexing

jot -wjot\ %d $1|sh|sed $1!d

Bash + standard utilities (GNU or BSD), 29 bytes, 1-based indexing

seq $1|xargs -n1 seq|sed $1!d

Try the GNU version online!

BSD's jot is a little golfier than the GNU seq utility, since jot lets you use the %d printing code, whereas seq requires %.f (which is one byte longer) to get a similar effect.

Mitchell Spector

Posted 2017-01-22T14:32:36.433

Reputation: 3 392

0

QBasic, 43 bytes

INPUT a
i=1
WHILE a-i>0
a=a-i:i=i+1
WEND
?a

1-based. Try it online!

steenbergh

Posted 2017-01-22T14:32:36.433

Reputation: 7 772

0

Pyt, 16 bytes

←Đř△⇹Đ↔Đ04Ș<*↑+-

Solution is 1-indexed

Explanation:

Code Explanation (with stack in parentheses) (sample input of 5)

←                              Get input (5)
 Đ                             Duplicate input (5,5)
  ř                            Push [1,2,...,top of stack] (5,[1,2,3,4,5])
   △                           Triangle numbers (5,[1,3,6,10,15])
    ⇹                          Swap top two elements ([1,3,6,10,15],5)
     Đ                         Duplicate top ([1,3,6,10,15],5,5)
      ↔                        Flip stack (5,5,[1,3,6,10,15])
       Đ                       Duplicate top (5,5,[1,3,6,10,15],[1,3,6,10,15])
        0                      Push 0 [this is to allow the next step] (5,5,[1,3,6,10,15],[1,3,6,10,15],0)
         4Ș                    Flip top four elements (5,0,[1,3,6,10,15],[1,3,6,10,15],5)
           <                   Less than (5,0,[1,3,6,10,15],[True,True,False,False,False])
            *                  Multiply (5,0,[1,3,0,0,0])
             ↑                 Get maximum (5,0,3)
              +                Add [this is to get rid of the 0 inserted earlier] (5,3)
               -               Subtract (2)

mudkip201

Posted 2017-01-22T14:32:36.433

Reputation: 833

0

Husk, 4 bytes

!ΣḣN

This uses 1-indexing, try it online! (Or try this which uses 0-indexing)

Explanation

!ΣḣN  -- takes an integer N as argument, for example 5
   N  -- natural numbers: [1,2,3,4,…
  ḣ   -- rangify each: [[1],[1,2],[1,2,3],[1,2,3,4],…
 Σ    -- concatenate: [1,1,2,1,2,3,1,2,3,4,…
!     -- index into that list: 2

ბიმო

Posted 2017-01-22T14:32:36.433

Reputation: 15 345

0

Python 2, 50 bytes

Try it online!

c=1
u=0
n=input()
while u<n:u+=c;c+=1
print(n-u+c)

I have a feeling this can be golfed a lot, but this is what I have so far.

clismique

Posted 2017-01-22T14:32:36.433

Reputation: 6 600

49 bytes – FlipTack – 2017-12-28T10:07:30.863