26
\$\begingroup\$

Take a positive integer n as input, and output a n-by-n checkerboard matrix consisting of 1 and 0.

The top left digit should always be 1.

Test cases:

n = 1
1

n = 2
1 0
0 1

n = 3
1 0 1
0 1 0
1 0 1

n = 4
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1

Input and output formats are optional. Outputting the matrix as a list of lists is accepted.

\$\endgroup\$
  • \$\begingroup\$ Is a list of strings OK? \$\endgroup\$ – xnor Jun 15 '17 at 17:52
  • \$\begingroup\$ Yes, that's OK. \$\endgroup\$ – Stewie Griffin Jun 15 '17 at 17:53
  • 1
    \$\begingroup\$ Related. \$\endgroup\$ – beaker Jun 15 '17 at 18:51
  • 2
    \$\begingroup\$ Your examples show spaces between numbers on the same row, is that required, so as to look more like a square? \$\endgroup\$ – BradC Jun 15 '17 at 19:09
  • \$\begingroup\$ @BradC it's not required. The first approach here is valid. \$\endgroup\$ – Stewie Griffin Jun 15 '17 at 20:19

47 Answers 47

1 2
1
\$\begingroup\$

braingasm, 21 bytes

;$[$[>+o:<]p[>+<]10.]

Explanation:

;                       Read a number from stdin.
 $[                 ]   That many times...
   $[     ]               That many times...
     >+o:<                  Increase the next cell and print its value modulo 2.
           p[   ]       If the input was even...
             >+<          Increase the next cell once more.
                 10.    Print a newline.
\$\endgroup\$
1
\$\begingroup\$

J, 41 bytes

I know there's a J answer at 9, but I'm pleased to get anything working, even if it's not a tacit programming best possible..

ch=:monad define
2|(2$y)$(1+i.y),(i.y)
)

It takes a number y and generates two lists of numbers 1,2,3,..y and 0,1,2,3,..y-1 to make the offset first and second row, appends them into one long list, reshapes that into a y,y matrix (wrapping around when it runs out), and then does modulo 2 on all the elements to make them a 1 or 0.

   ch 1
1

   ch 2
1 0
0 1

   ch 3
1 0 1
0 1 0
1 0 1

   ch 4
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1

   ch 5
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
\$\endgroup\$
1
\$\begingroup\$

Python, 73 63 62 66 bytes

Saved 4 bytes thanks to officialaimm

r=range(input());print[''.join([`(x+y+1)%2`for x in r])for y in r]
\$\endgroup\$
  • 1
    \$\begingroup\$ Declaring R=range(n) and using R saves 3 bytes. 1 unwanted space between ) and for can be removed as well. \$\endgroup\$ – officialaimm Jun 16 '17 at 7:40
  • 1
    \$\begingroup\$ @officialaimm Sweet, thanks for the tip! I'm new a golfing. I'm thankful for any tips :) \$\endgroup\$ – Daffy Jun 16 '17 at 19:50
  • 1
    \$\begingroup\$ Just noticed your code is just a snippet, not a function or full program which is not a healthy practice. You can use this instead, only 8 bytes more! \$\endgroup\$ – officialaimm Jun 17 '17 at 1:37
  • 1
    \$\begingroup\$ @officialaimm Noted. Still better than my original submission. Thanks a bunch. :) \$\endgroup\$ – Daffy Jun 17 '17 at 1:43
1
\$\begingroup\$

q/kdb+, 37 16 bytes

Solution:

{x#x#'(1 0;0 1)}

Example:

q){x#x#'(1 0;0 1)}1
1
q){x#x#'(1 0;0 1)}2
1 0
0 1
q){x#x#'(1 0;0 1)}3
1 0 1
0 1 0
1 0 1
q){x#x#'(1 0;0 1)}4
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1

Explanation:

2nd version is much simpler, and thus shorter and faster (4x). Create a 2-item list containing 01... and 10... to the length of the input, then take 'x' number of items from this new list.

{              } / lambda function
      (1 0;0 1)  / 2-item list of (0;1) and (1;0)
   x#'           / take 'x' items from each list, if x=3 then (1 0 1;0 1 0)
 x#              / take 'x' items from *this* list

Notes:

I've re-written this twice during this edit, went from 37->25->24->16 bytes. Now it's a little more competitive.

Edits:

  • -21 bytes with complete re-write...
\$\endgroup\$
1
\$\begingroup\$

Haskell, 43 bytes

h=1:0:h
l=h:(0:h):l
s x=take x$map(take x)l

Try it online!

This creates the infinite checkerboard matrix and saves it to l. Then our function s chops off a square.

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

Mathematica, 28 bytes

Table[Mod[i+j+1,2],{i,#},{j,#}]&
\$\endgroup\$
0
\$\begingroup\$

Julia, 38 bytes

n->map(x->x%2,(1:n).+transpose(0:n-1))

The usual approach

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

Actually, 15 bytes

r;╗⌠╜+u⌠2@%⌡M⌡M

Try it online!

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

Python, 43 bytes

lambda n:[('10'*n)[i:i+n]for i in range(n)]

Try it online!

Anonymous function that outputs a list like ['1010', '0101', '1010', '0101'].

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

Python 2, 72 70 61 54 bytes

-7 bytes thanks to Leaky Nun. -1 byte thanks to Wheat Wizard.

lambda n:[[i-~j&1for i in range(n)]for j in range(n)]

Try it online!

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

C#, 145 Bytes

int u=1;int n=int.Parse(b.Text);for(int i=0;i<n;i++){if(i%2==0){u=1;}else{u=0;}for(int j=0;j<n;j++){t.Text+=u.ToString();u=1-u;}t.Text+="\r\n";}[enter link description here][1]

Try it online!

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

Bash & coreutils, 82 bytes

x=$1;yes 10|tr -d \\n|dd bs=1 count=$[x*x*2]|fold -w$[x*2-1]|grep -om$x "^.\{$x\}"

Takes one command-line integer as input. Apparently the spaces between are optional.

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

Common Lisp, SBCL, 81 bytes

version 1:

(#1=dotimes(i(set'a(read)))(#1#(j a)(format t"~:[1~;0~] "(oddp(+ j i))))(terpri))

version 2:

(lambda(n)(#1=dotimes(i n)(#1#(j n)(format t"~:[1~;0~] "(oddp(+ j i))))(terpri)))

Two loops, and inside I print either 1 and space or zero and space based on parity of (+ j i). (terpri) for newline.

It's long, I know:/

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

C# (.NET Core), 88 bytes

n=>{var r=new int[n,n];for(int i=0,j;i<n;i++)for(j=0;j<n;j++)r[i,j]=(i+j+1)%2;return r;}

Try it online!

I can't believe this is the shortest way to initialize a 2D array of integers, there must be another way...

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

tcl, 82

time {set a "";time {set a $a[expr [incr i]%2]} $n;puts $a;if \!($n%2) incr\ i} $n

demo

Still a looser, but I think i can be golfed down a little bit further.

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

Perl 5, 49 bytes

$_=10x(($n=<>)/2).1x($n%2);say&&y/01/10/while$n--

Try it online!

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

C (gcc), 60 59 bytes

i;f(n){for(i=n*n;i--;)printf(i%n?"%d":"%d\n",i%n+i/n+1&1);}

Try it online!

\$\endgroup\$
1 2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.