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.
-
\$\begingroup\$ Is a list of strings OK? \$\endgroup\$xnor– xnor2017年06月15日 17:52:45 +00:00Commented Jun 15, 2017 at 17:52
-
\$\begingroup\$ Yes, that's OK. \$\endgroup\$Stewie Griffin– Stewie Griffin2017年06月15日 17:53:49 +00:00Commented Jun 15, 2017 at 17:53
-
1\$\begingroup\$ Related. \$\endgroup\$beaker– beaker2017年06月15日 18:51:31 +00:00Commented Jun 15, 2017 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– BradC2017年06月15日 19:09:09 +00:00Commented Jun 15, 2017 at 19:09
-
\$\begingroup\$ @BradC it's not required. The first approach here is valid. \$\endgroup\$Stewie Griffin– Stewie Griffin2017年06月15日 20:19:29 +00:00Commented Jun 15, 2017 at 20:19
64 Answers 64
-
8\$\begingroup\$ "52 seconds!" like I'm not used to it... \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年06月15日 17:35:43 +00:00Commented Jun 15, 2017 at 17:35
-
8\$\begingroup\$ Do ya'll have, like, a beeper, you wear 24/7 for new PPCG challenges? \$\endgroup\$Magic Octopus Urn– Magic Octopus Urn2017年06月16日 20:43:24 +00:00Commented Jun 16, 2017 at 20:43
-
\$\begingroup\$ @carusocomputing Those who have a faster internet connection are usually the lucky ones that will win. \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年06月17日 14:16:00 +00:00Commented Jun 17, 2017 at 14:16
MATL, 5 bytes
:otYT
Try it at MATL online!
Explanation
Consider input 4
as an example.
: % Implicit input, n. Push range [1 2 ... n]
% STACK: [1 2 3 4]
o % Parity, element-wise
% STACK: [1 0 1 0]
t % Duplicate
% STACK: [1 0 1 0], [1 0 1 0]
YT % Toeplitz matrix with two inputs. Implicit display
% STACK: [1 0 1 0;
% 0 1 0 1;
% 1 0 1 0;
5 0 1 0 1]
Haskell, (削除) 50 (削除ここまで) (削除) 41 (削除ここまで) (削除) 39 (削除ここまで) 38 bytes
Thanks to nimi and xnor for helping to shave off a total of (削除) 9 (削除ここまで) 10 bytes
f n=r[r"10",r"01"]where r=take n.cycle
Alternately, for one byte more:
(!)=(.cycle).take
f n=n![n!"10",n!"01"]
or:
r=flip take.cycle
f n=r[r"10"n,r"01"n]n
Probably suboptimal, but a clean, straightforward approach.
-
\$\begingroup\$
concat.repeat
iscycle
:n!l=take n$cycle l
. If you go pointfree it saves one more byte:(!)=(.cycle).take
. \$\endgroup\$nimi– nimi2017年06月15日 18:26:41 +00:00Commented Jun 15, 2017 at 18:26 -
\$\begingroup\$ Lovely! I knew there was a builtin for that, but couldn't remember the name for the life of me \$\endgroup\$Julian Wolf– Julian Wolf2017年06月15日 18:31:10 +00:00Commented Jun 15, 2017 at 18:31
-
\$\begingroup\$ I was going to suggest
f n|r<-take n.cycle=r[r"10",r"01"]
or similar. but Haskell seems to infer the wrong type forr
? It works with explicit typingf n|r<-take n.cycle::[a]->[a]=r[r"10",r"01"]
. \$\endgroup\$xnor– xnor2017年06月15日 18:59:54 +00:00Commented Jun 15, 2017 at 18:59 -
1\$\begingroup\$ @JulianWolf Haskell seems to have trouble inferring polymorphic types \$\endgroup\$xnor– xnor2017年06月15日 19:43:32 +00:00Commented Jun 15, 2017 at 19:43
-
1\$\begingroup\$ @zbw I thought this was the case but using
NoMonomorphismRestriction
didn't help. Nor didRank2Types
orRankNTypes
. Do you know what's going on there? \$\endgroup\$xnor– xnor2017年06月16日 04:59:03 +00:00Commented Jun 16, 2017 at 4:59
Japt, 6 bytes
ÆÇ+X v
Test it online! (Uses -Q
flag for easier visualisation)
Explanation
Æ Ç +X v
UoX{UoZ{Z+X v}} // Ungolfed
// Implicit: U = input number
UoX{ } // Create the range [0...U), and map each item X to
UoZ{ } // create the range [0...U), and map each item Z to
Z+X // Z + X
v // is divisible by 2.
// Implicit: output result of last expression
An interesting thing to note is that v
is not a "divisible by 2" built-in. Instead, it's a "divisible by X" built-in. However, unlike most golfing languages, Japt's functions do not have fixed arity (they can accept any number of right-arguments). When given 0 right-arguments, v
assumes you wanted 2
, and so acts exactly like it was given 2
instead of nothing.
V, (削除) 16 (削除ここまで), 15 bytes
Ài10ÀñÙxñÎÀlD
Hexdump:
00000000: c069 3130 1bc0 adf1 d978 f1ce c06c 44 .i10.....x...lD
APL (Dyalog), 8 bytes
~2|⍳∘.+⍳
Explanation
Let's call the argument n
.
⍳∘.+⍳
This creates a matrix
1+1 1+2 1+2 .. 1+n
2+1 2+2 2+3 .. 2+n
...
n+1 n+2 n+3 .. n+n
Then 2|
takes modulo 2 of the matrix (it vectorises) after which ~
takes the NOT of the result.
JavaScript ES6, (削除) 55 (削除ここまで) (削除) 54 (削除ここまで) (削除) 51 (削除ここまで) 46 bytes
Saved 1 byte thanks to @Neil
Saved 2 bytes thanks to @Arnauld
n=>[...Array(n)].map((_,i,a)=>a.map(_=>++i&1))
This outputs as an array of arrays. JavaScript ranges are pretty unweildy but I use [...Array(n)]
which generates an array of size n
-
\$\begingroup\$ It's still a byte shorter to use the index parameters:
n=>[...Array(n)].map((_,i,a)=>a.map((_,j)=>(i+j+1)%2))
\$\endgroup\$Neil– Neil2017年06月15日 18:41:59 +00:00Commented Jun 15, 2017 at 18:41 -
\$\begingroup\$ @Neil huh, I never thought to use the third parameter in map, thanks! \$\endgroup\$Downgoat– Downgoat2017年06月15日 18:47:47 +00:00Commented Jun 15, 2017 at 18:47
-
\$\begingroup\$ @Arnauld thanks! that inspired me to save 5 more bytes! \$\endgroup\$Downgoat– Downgoat2017年06月15日 22:55:35 +00:00Commented Jun 15, 2017 at 22:55
05AB1E, (削除) 9 (削除ここまで) 7 bytes
-2 bytes thanks to Emigna
LDÈD_‚è
Explanation
LDÈD_‚sè» Argument n
LD Push list [1 .. n], duplicate
ÈD Map is_uneven, duplicate
_ Negate boolean (0 -> 1, 1 -> 0)
‚ List of top two elements of stack
è For each i in [1 .. n], get element at i in above created list
In 05AB1E the element at index 2 in [0, 1] is 0 again
-
\$\begingroup\$ You can cut the
»
as list-of-lists output is okay and you can also removes
. \$\endgroup\$Emigna– Emigna2017年06月16日 07:27:45 +00:00Commented Jun 16, 2017 at 7:27 -
\$\begingroup\$ Explanation is a bit irrelevant. \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年06月17日 14:14:31 +00:00Commented Jun 17, 2017 at 14:14
Bash + rs, 39
- 3 bytes saved thanks to @roblogic
eval echo \$[~{1..1ドル}+{1..1ドル}\&1]|rs 1ドル
-
1\$\begingroup\$ you can do simply
rs 1ドル
, saving 3 bytes \$\endgroup\$roblogic– roblogic2025年02月16日 07:25:25 +00:00Commented Feb 16 at 7:25
Mathematica, 25 bytes
1-Plus~Array~{#,#}~Mod~2&
Clojure, 36 bytes
#(take %(partition % 1(cycle[1 0])))
Yay, right tool for the job.
Retina, (削除) 33 (削除ここまで) 30 bytes
.+
$*
1
$_¶
11
10
T`10`01`¶.+¶
Try it online! Explanation: The first stage converts the input to unary using 1
s (conveniently!) while the second stage turns the value into a square. The third stage inverts alternate bits on each row while the last stage inverts bits on alternate rows. Edit: Saved 3 bytes thanks to @MartinEnder.
-
\$\begingroup\$
$`1$'
is just$_
. \$\endgroup\$Martin Ender– Martin Ender2017年06月16日 05:27:56 +00:00Commented Jun 16, 2017 at 5:27 -
\$\begingroup\$
01
is justd
. (Post is too old for me to bother editing it.) \$\endgroup\$Neil– Neil2025年03月27日 16:49:25 +00:00Commented Mar 27 at 16:49
Java (OpenJDK 8), (削除) 80 (削除ここまで) 77 bytes
-3 bytes thanks to Kevin Cruijssen
j->{String s="1";for(int i=1;i<j*j;s+=i++/j+i%j&1)s+=1>i%j?"\n":"";return s;}
Oh look, a semi-reasonable length java answer, with lots of fun operators.
lambda which takes an int and returns a String. Works by using the row number and column number using / and % to determine which value it should be, mod 2;
Ungolfed:
j->{
String s="1";
for(int i=1; i<j*j; s+= i++/j + i%j&1 )
s+= 1>i%j ? "\n" : "";
return s;
}
-
\$\begingroup\$ You can remove the space to save a byte. The challenge states the output format is flexible. Oh, and you can save two more bytes by changing
(i++/j+i%j)%2
toi++/j+i%j&1
so you won't need those parenthesis. Which make the total 1 byte shorter than my nested for-loop solution (n->{String r="";for(int i=0,j;i++<n;r+="\n")for(j=0;j<n;r+=j+++i&1);return r;}
), so +1 from me. :) \$\endgroup\$Kevin Cruijssen– Kevin Cruijssen2017年06月16日 07:26:16 +00:00Commented Jun 16, 2017 at 7:26 -
\$\begingroup\$ @KevinCruijssen Yeah I was still waiting on a response on the space. I didn't think about & having higher precedence than % and &1 == %2 \$\endgroup\$PunPun1000– PunPun10002017年06月16日 12:02:15 +00:00Commented Jun 16, 2017 at 12:02
Arturo, (削除) 39 (削除ここまで) (削除) 36 (削除ここまで) 32 bytes
$[n][map n'x->map n'y->%x+y+1 2]
-3 thanks to alephalpha's simpler method
Prettified and rearranged for clarity:
$[n][ ; a function taking an argument n
map n 'x -> ; map over 1..n, assign current elt to x
map n 'y -> ; map over 1..n again, assign current elt to y
(x+y+1)%2 ; what it looks like
] ; end function
MATL, 7 bytes
:t!+2\~
Explanation:
% Implicit input (n)
: % Range from 1-n, [1,2,3]
t % Duplicate, [1,2,3], [1,2,3]
! % Transpose, [1,2,3], [1;2;3]
+ % Add [2,3,4; 3,4,5; 4,5,6]
2 % Push 2 [2,3,4; 3,4,5; 4,5,6], 2
\ % Modulus [0,1,0; 1,0,1; 0,1,0]
~ % Negate [1,0,1; 0,1,0; 1,0,1]
Note: I started solving this in MATL after I posted the challenge.
-
\$\begingroup\$ Equivalent, and shorter:
:&+o~
\$\endgroup\$Luis Mendo– Luis Mendo2017年06月15日 21:25:07 +00:00Commented Jun 15, 2017 at 21:25 -
1\$\begingroup\$ Still learning :-) I'll update tomorrow. I liked your other approach too :-) \$\endgroup\$Stewie Griffin– Stewie Griffin2017年06月15日 21:44:16 +00:00Commented Jun 15, 2017 at 21:44
-
1\$\begingroup\$ This is what I came up with, too. And hey, you only use the pure MATL instruction set, not those pesky
Y
-modified instructions @LuisMendo uses. \$\endgroup\$Sanchises– Sanchises2017年06月16日 21:04:14 +00:00Commented Jun 16, 2017 at 21:04 -
\$\begingroup\$ @Sanchises Pesky, huh? :-P \$\endgroup\$Luis Mendo– Luis Mendo2017年06月16日 21:09:39 +00:00Commented Jun 16, 2017 at 21:09
Charcoal, 8 bytes
UON10¶01
Try it online! Explanation: This roughly translates to the following verbose code (unfortunately the deverbosifier is currently appending an unnecessary separator):
Oblong(InputNumber(), "10\n01");
Brachylog, 15 bytes
^2⟦1%2m;?ḍ)pm.\
Explanation
Example Input: 4
^2 Square: 16
⟦1 1-indexed Range: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
%2m Map Mod 2: [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]
;?ḍ) Input-Chotomize: [[1,0,1,0],[0,1,0,1],[1,0,1,0],[0,1,0,1]]
pm. Map permute such that..
.\ ..the output is its own transpose: [[1,0,1,0],[0,1,0,1],[1,0,1,0],[0,1,0,1]]
///, 87 bytes + input
/V/\\\///D/VV//*/k#D#k/k#D&k/k&DVk/k\D/SD/#/r
DSkk/10DSk/1D&/V#rV#0r;VV0;VVV1;V\D/r/S/&[unary input in asterisks]
Try it online! (input for 4)
Unary input in 1
s, 95 bytes + input
/V/\\\///D/VV//&1/k#&D&|D/#k/k#D&k/k&DVk/k\D/SD/#/r
DSkk/10DSk/1D&/V#rV#0r;VV0;VVV1;V\D/r/S/&&[unary input in ones]|
Try it online! (input for 8)
How does this work?
V
andD
are to golf\/
and//
respectively./*/k#/
and/&1/k#&//&|//
separate the input into the equivalent of'k#'*len(input())
/#k//k#//&k/k&//\/k/k\//
move all thek
s to the/r/S/
blockS
s are just used to pad instances wherek
s come after/
s so that they don't get moved elsewhere, and theS
s are then removed#
s are then turned intor\n
sThe string of
k
s is turned into an alternating1010...
stringThe
r\n
s are turned into1010...\n
sEvery pair of
1010...\n1010\n
is turned into1010...01010円...;\n
Either
0;
or1;
are trimmed off (because the01010...
string is too long by 1)
Swi-Prolog, 142 bytes.
t(0,1).
t(1,0).
r([],_).
r([H|T],H):-t(H,I),r(T,I).
f([],_,_).
f([H|T],N,B):-length(H,N),r(H,B),t(B,D),f(T,N,D).
c(N,C):-length(C,N),f(C,N,1).
Try online - http://swish.swi-prolog.org/p/BuabBPrw.pl
It outputs a nested list, so the rules say:
t()
is a toggle, it makes the 0 -> 1 and 1 -> 0.r()
succeeds for an individual row, which is a recursive check down a row that it is alternate ones and zeros only.f()
recursively checks all the rows, that they are the right length, that they are valid rows withr()
and that each row starts with a differing 0/1.c(N,C)
says that C is a valid checkerboard of size N if the number of rows (nested lists) is N, and the helper f succeeds.
Test Cases: enter image description here
-
\$\begingroup\$ Can't you strip off all newlines? \$\endgroup\$Joao-3– Joao-32023年03月29日 21:50:54 +00:00Commented Mar 29, 2023 at 21:50
Nekomata, 5 bytes
o+→2%
o+→2%
o+ Create an (input x input) matrix where the element at (i,j) is i+j
→ Increment
2% Mod 2
QBIC, 19 bytes
[:|?[b|?(a+c+1)%2';
Explanation
[:| FOR a = 1 to b (b is read from cmd line)
? PRINT - linsert a linebreak in the output
[b| FOR c = 1 to b
?(a+c+1)%2 PRINT a=c=1 modulo 2 (giving us the 1's and 0's
'; PRINT is followed b a literal semi-colon, suppressing newlines and
tabs. Printing numbers in QBasic adds one space automatically.
-
\$\begingroup\$ out-golfed \$\endgroup\$Esolanging Fruit– Esolanging Fruit2017年06月15日 21:10:04 +00:00Commented Jun 15, 2017 at 21:10
-
\$\begingroup\$ @Challenger5 Sorry you can't outgolf with deleted answer. \$\endgroup\$Erik the Outgolfer– Erik the Outgolfer2017年06月16日 08:19:04 +00:00Commented Jun 16, 2017 at 8:19
Mathematica, 23 bytes
ToeplitzMatrix@#~Mod~2&
Mathematica, 28 bytes
Cos[+##/2Pi]^2&~Array~{#,#}&
Pure function taking a positive integer as input and returning a 2D array. Uses the periodic function cos2(πx/2) to generate the 1s and 0s.
For a little more fun, how about the 32-byte solution
Sign@Zeta[1-+##]^2&~Array~{#,#}&
which uses the locations of the trivial zeros of the Riemann zeta function.