14
\$\begingroup\$

Consider the following sequence:

1, 0, 1, 2, 4, 1, 6, 8, 0, 1, 2, 4, 6, 8, 1, 0, 2, 4, 6, 8, 1, 0, 2, 4, 6, 8, 0, 1, ... 

The even digits start from 0 and are grouped into runs of increasing length. They are arranged cyclically, meaning that they are sorted in ascending order until 8 is reached, and then cycled back from 0. 1 separates the runs of even digits, and it also starts the sequence. Let's visualize how this sequence is formed:

 1, 0, 1, 2, 4, 1, 6, 8, 0, 1, 2, 4, 6, 8, 1, 0, 2, 4, 6, 8, 1, ... - ---- ------- ---------- ------------- run length: 1 2 3 4 5 ... position of 1: X X X X X X ... even sequence: 0, 2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8 ... 

Acceptable Input and Output methods:

  • Receive an integer N as input and output the Nth term of this sequence.

  • Receive an integer N as input and output the first N terms of this sequence.

  • Print the sequence indefinitely.

You can choose either 0 or 1-indexing for the first two methods.

You can compete in any programming language, while using the standard input and output methods. Standard loopholes are forbidden. This is , so the shortest code in each language wins.

\$\endgroup\$
1
  • \$\begingroup\$ This challenge has been sandboxed. \$\endgroup\$ Commented Nov 10, 2017 at 13:50

24 Answers 24

8
\$\begingroup\$

Haskell, 50 46 bytes

1#cycle[0,2..8] n#r=1:take n r++(n+1)#drop n r 

Try it online!

1#cycle[0,2..8] returns the sequence as infinite list.

-4 bytes thanks to Ørjan Johansen!

\$\endgroup\$
1
  • 1
    \$\begingroup\$ You can save four bytes by making the first argument of # just a number. Try it online! \$\endgroup\$ Commented Nov 11, 2017 at 0:36
7
\$\begingroup\$

Jelly, 10 bytes

5ḶḤṁR€1pFḣ 

Returns the first n items of the sequence.

Try it online!

How it works

5ḶḤṁR€1pFḣ Main libk. Argument: n 5 Set the return value to 5. Ḷ Unlength; yield [0, 1, 2, 3, 4]. Ḥ Unhalve; yield [0, 2, 4, 6, 8]. R€ Range each; yield [[1], [1, 2], [1, 2, 3], ..., [1, ..., n]]. ṁ Mold; in the result to the left, replace [1] with [0], [1, 2] with [2, 4], [1, 2, 3] with [6, 8, 0], and so forth. 1p Take the Cartesian product of [1] and the result. F Flatten the result. ḣ Head; take the first n items of the result. 
\$\endgroup\$
2
  • 2
    \$\begingroup\$ ಠ_ಠ Unhalve... Isn't that just Double? \$\endgroup\$ Commented Nov 10, 2017 at 14:21
  • 4
    \$\begingroup\$ It's just a mnemonic. H is halve, so is unhalve. ÆA is arccosine, so ÆẠ is unarccosine. \$\endgroup\$ Commented Nov 10, 2017 at 14:25
7
\$\begingroup\$

Husk, 12 11 10 bytes

ṁ:1CN¢mDŀ5 

Try it online!

Prints the sequence indefinitely.

Alternatively:

J1CΘN¢mDŀ5 

Try it online!

Explanation

 ŀ5 Start from [0, 1, 2, 3, 4] mD Double each value to get [0, 2, 4, 6, 8] ¢ Repeat this list indefinitely, [0, 2, 4, 6, 8, 0, 2, ...] CN Cut it into chunks of increasing lengths, [[0], [2, 4], [6, 8, 0], ...] ṁ:1 Prepend 1 to each sublist and concate the resulting lists. 

For the alternative solution:

 ¢mDŀ5 Again, get [0, 2, 4, 6, 8, 0, 2, ...]. CΘN This time we prepend a zero to the natural numbers, which prepends an empty list to the resulting chunks. J1 Join all the sublists with 1. 

We could also do ...ΘCN..., because Θ does "prepend default element", which prepends a zero for lists of integers and an empty list for lists of lists.

\$\endgroup\$
4
\$\begingroup\$

Python 3, 52 bytes

def f(n):t=(8*n+1)**.5+1;return 0==t%1or(n-t//2)%5*2 

Takes a 1-based index and returns True or an integral float.

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Python 2, 51 bytes

k=n=0 while 1:print 1;k+=1;exec'print n%10;n+=2;'*k 

Prints the whole sequence.

Try it online!

\$\endgroup\$
2
\$\begingroup\$

APL, 25 bytes

Returns nth term.

1,(⌽n↑⌽(+/⍳n←⎕)⍴0,2×⍳4),1 

Explanation

n←⎕ Prompts for screen input of integer +/⍳ Creates a vector of integers of 1 to n and sums ⍴0,2×⍳4 Creates a vector by replicating 0 2 4 6 8 to the length of sum ⌽n↑⌽ Rotates the vector, selects first n elements and rotates result (selects last n elements} 1,...,1 Concatenates 1s in front and behind result 
\$\endgroup\$
2
\$\begingroup\$

APL (Dyalog Unicode), 52 59 56 bytes

r←c k r←~n←0 :For j :In ⍳k n+←j-1 r,←1,⍨j⍴n⌽0,2×⍳4 :End r←k⍴r 

Try it online!

This is a tradfn (traditional function) taking one argument k and returning the first k items of the sequence.

Thanks to @GalenIvanov for pointing out an error in the function. Thanks to @Adám for 3 bytes.

How it works:

r←c k ⍝ The function c takes the argument k and results in r r n←1 0 ⍝ Initializing the variables r and n, and setting them to 1 and 0, respectively. :For j :In ⍳k ⍝ For loop. ⍳k yields [1, 2, 3, ..., k], and j is the control variable. n+←j-1 ⍝ Accumulates j-1 into n, so it follows the progression (0, 1, 3, 6, 10, 15...) r,←1,⍨j⍴n⌽0,2×⍳4 ⍝ This line is explained below. :End ⍝ Ends the loop r←k⍴r ⍝ return the first k items of r. ⍝ ⍴ actually reshapes the vector r to the shape of k; ⍝ since k is a scalar, ⍴ reshapes r to a vector with k items. 2×⍳4 ⍝ APL is 1-indexed by default, so this yields the vector 2 4 6 8 0, ⍝ Prepend a 0 to it. We now have 0 2 4 6 8 n⌽ ⍝ Rotate the vector n times to the left. j⍴ ⍝ Reshape it to have j items, which cycles the vector. 1,⍨ ⍝ Append a 1, then r,← ⍝ Append everything to r. 

Below are a Dfn(direct function) and a tacit function that also solve the challenge, both kindly provided by @Adám.

  • Dfn: {⍵⍴1,∊1,⍨¨j⍴¨(+\¯1+j←⍳⍵)⌽¨⊂0,2×⍳4} Try it online!
  • Tacit: ⊢⍴1,∘∊1,⍨¨⍳⍴¨(⊂0,2×⍳4)⌽⍨¨(+\¯1+⍳) Try it online!
\$\endgroup\$
4
  • \$\begingroup\$ I'm interested in the explanation of the tacit vesrion. Thanks! \$\endgroup\$ Commented Nov 10, 2017 at 20:23
  • \$\begingroup\$ @GalenIvanov I'll add one later today. \$\endgroup\$ Commented Nov 10, 2017 at 20:53
  • \$\begingroup\$ I noticed that the 3 functions yield incorrect answers - the subsequences always start from 0 after 1 - they should continue from the last even digit of the previous subsequence. \$\endgroup\$ Commented Nov 13, 2017 at 7:14
  • \$\begingroup\$ @GalenIvanov You're right. I'll see if I can fix it and add the explanations today. \$\endgroup\$ Commented Nov 13, 2017 at 12:13
1
\$\begingroup\$

JavaScript (ES6), 62 54 52 bytes

Returns the Nth term of the sequence, 0-indexed.

n=>(g=e=>n--?g(e+=k++<l?2:k=!++l):k<l?e%10:1)(k=l=0) 

Demo

let f = n=>(g=e=>n--?g(e+=k++<l?2:k=!++l):k<l?e%10:1)(k=l=0) for(n = 0; n < 30; n++) { console.log('a(' + n + ') = ' + f(n)) }

\$\endgroup\$
1
\$\begingroup\$

C (gcc), 84 bytes

i;j;f(){for(i=1;;i++){printf("%d ",1);for(j=0;j<i;)printf("%d ",(2*j+++i*i-i)%10);}} 

Try it online!

A function (f()) that prints the sequence infinitely, separated by spaces.

i is the length of the current even-run.

j is the index in the current even-run

(2*j+++i*i-i)%10 gives the correct even number, given i and j (and increments j), equivalent to ((j+Tr(i))%5)*2, where Tr(x) is the xth triangular number (which is the number of even numbers that have been printed before the current even run;

\$\endgroup\$
1
  • \$\begingroup\$ 77 bytes \$\endgroup\$ Commented Oct 28, 2019 at 16:12
1
\$\begingroup\$

Java 8, 96 bytes

v->{for(int i=0,j=-2,k;;i++,System.out.println(1))for(k=0;k++<i;System.out.println(j%=10))j+=2;} 

Prints indefinitely, each number on a new line.

Explanation:

Try it here.

v->{ // Method with empty unused parameter and no return-type for(int i=0, // Index integer, starting at 1 j=-2, // Even index integer, starting at -2 k; // Inner index integer ; // Loop (1) indefinitely // After every iteration: i++, // Increase index `i` by 1 System.out.println(1)) // And print a 1 for(k=0; // Reset index `k` to 0 k++<i; // Inner loop (2) from 0 to `i` // After every iteration: System.out.println(j%=10)) // Set `j` to `j` modulo-10, and print it j+=2; // Increase `j` by 2 // End of inner loop (2) (implicit / single-line body) // End of loop (1) (implicit / single-line body) } // End of method 
\$\endgroup\$
1
\$\begingroup\$

Batch, 85 bytes

@set/an=%2+1,t=n*-~n/2 @if %t% lss %1 %0 %1 %n% @cmd/cset/a(%1-n)%%5*2*!!(t-=%1)+!t 

Outputs the Nth term of the sequence. Works by calculating the next triangular number.

\$\endgroup\$
1
\$\begingroup\$

Perl 5, 44 bytes

do{say 1;map{say(($r+=2)%10)}0..$i++}while 1 

Try it online!

Infinite output

\$\endgroup\$
1
  • \$\begingroup\$ -4 bytes {...;redo} instead of do{...}while 1 \$\endgroup\$ Commented Nov 13, 2017 at 10:39
1
\$\begingroup\$

J, 46 42 40 bytes

-6 bytes thanks to cole

{.({.[:;[:#:&.>2^i.);@(1,&.><;.1)10|2*i. 

Outputs the first N terms of this sequence.

How it works:

10|[:+:i. - generates a list of length N of 0 2 4 6 8 0 2 4... It simply takes mod 10 of the doubled items of a list of integers starting at 0.

[:;[:#:&.>2^i. - generates a bit mask for cutting the above list.

(1 means start): 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 ... It finds 2 to the power of the consecutive non-negative integers, converts them into binary, flattens the list and takes only the first N items, so that the length of the both lists is the same.

;@(1,&.><;.1) - splits (cuts) the list of the even digits into sublistsaccording to the map of ones and zeroes, appends the sublist to 1 and finally flattens the resulting list

]{. - takes only the first N items, getting rid of the additional numbers in the list due to the added 1s.

Try it online!

\$\endgroup\$
3
  • 1
    \$\begingroup\$ 42 bytes: {.({.[:;[:#:&.>2^i.);@(1,&.><;.1)(10|2*i.). The changes I did were to use hooks and refactor the right tine of the fork to take advantage of how forks work. I like the 2^i. trick. I'm trying to work on the left tine of the fork now. \$\endgroup\$ Commented Nov 11, 2017 at 2:15
  • \$\begingroup\$ @cole Thanks, I need to learn to use forks better. Apparently the fork 2*i. is better then than the capped hook [:+:i. \$\endgroup\$ Commented Nov 11, 2017 at 8:32
  • 1
    \$\begingroup\$ You can also drop the parens on the right tine (10|2*i.) ->10|2*i. \$\endgroup\$ Commented Nov 11, 2017 at 17:04
1
\$\begingroup\$

Common Lisp, 74 bytes

(do((b 1(1+ b))(k -2))(())(print 1)(dotimes(m b)(print(mod(incf k 2)10)))) 

Try it online!

Prints the sequence indefinitely.

\$\endgroup\$
1
\$\begingroup\$

Perl 5, 35 bytes

{say$i--?$r++%5*2:($i=++$j)>0;redo} 

try it online

\$\endgroup\$
1
\$\begingroup\$

Pip, 15 bytes

W P1L UiP2*Uv%t 

Prints indefinitely. Attempt This Online!

Explanation

W While this expression is truthy-- P1 print 1 (evaluates to 1, which is truthy) --loop: Ui Increment i (initially 0) L and loop that many times: Uv Increment v (initially -1) 2* Multiply by 2 %t Mod 10 P Print 
\$\endgroup\$
0
\$\begingroup\$

Jelly, 17 bytes

9Ḷm2ẋ⁸ṁJR$$j1 1;ḣ 

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Proton, 55 bytes

i=0 j=-2while1{for k:0..i print(j=(j+2)%10)print(1)i++} 

Try it online!

Prints the sequence indefinitely

\$\endgroup\$
2
  • \$\begingroup\$ ಠ_ಠ What is that, new syntax? :p i=0 j=-2while1{... \$\endgroup\$ Commented Nov 10, 2017 at 14:15
  • \$\begingroup\$ @Mr.Xcoder :P -2while is just like Python and while1 is because I made identifiers not able to be a keyword followed by a number \$\endgroup\$ Commented Nov 10, 2017 at 14:21
0
\$\begingroup\$

Java (OpenJDK 8), 107 bytes

i->{String b="";for(int l=i,r=0,z=0;i>0;b+=l-i--==r?(l=i)<1+r++*0?"1":"1":"02468".charAt(z++%5));return b;} 

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Mathematica, 68 bytes

Returns the Nth term

Insert[Join@@Table[{0,2,4,6,8},#^2],1,Array[{(2-#+#^2)/2}&,#]][[#]]& 

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Wolfram Language (Mathematica), 61 bytes

Flatten[TakeList[2Mod[r=0~Range~#,5],UpTo/@r]~Riffle~1][[#]]& 

Try it online!

\$\endgroup\$
0
\$\begingroup\$

JavaScript, 45 bytes

1 indexed:

f=(x,t=0,p=0)=>p<x?f(x-1,t+1,p+t):x-p?x%5*2:1 

0 indexed:

g=(x,p=0)=>p<x?g(x-1,p?++t+p:t=1):x-p?x%5*2:1 

 f=(x,t=0,p=0)=>p<x?f(x-1,t+1,p+t):x-p?x%5*2:1 g=(x,p=0)=>p<x?g(x-1,p?++t+p:t=1):x-p?x%5*2:1 a.value=[...Array(100)].map((_,i)=>f(i+1)) b.value=[...Array(100)].map((_,i)=>g(i))
<output id=a></output> <output id=b></output>

\$\endgroup\$
0
\$\begingroup\$

Ruby, 48 46 bytes

a=b=c=0;loop{a>b&&(p 2*b%10;b+=1)||a+=c+=p(1)} 

Try it online!

Print the sequence indefinitely

\$\endgroup\$
0
\$\begingroup\$

bash, 42 bytes

for((;;)){ echo $[i--?r++%5*2:(i=++j)>0];} 

or 34 if valid

echo $[i--?r++%5*2:(i=++j)>0];. $0 

try it online

\$\endgroup\$

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.