# Very Simple Grid Marks

Write a program or function that takes in three positive integers, W, H, and N. Print or return a W×H grid of .'s where every Nth . in normal English reading order is replaced with an X.

For example, given W = 7, H = 3, N = 3, the grid is 7 characters wide and 3 high, and every third character reading from the top left is an X:

..X..X.
.X..X..
X..X..X


Similarly, if the input is W = 10, H = 4, N = 5, the output would be:

....X....X
....X....X
....X....X
....X....X


### Notes

• "Normal English reading order" means going left to right on each line, from the top line to the bottom.
• When N is 1 then all the .'s will become X's.
• You may use any two distinct printable ASCII characters in place of . and X.
• If you use space ( ) then trailing spaces are not required when the result would be visually the same. (Empty lines are still required.)
• You may not using something else in place of the newlines that shape the grid.
• The exact input format and order of W, H, and N is not super important. Things like [H,W,N] or N\nW,H are alright.
• A trailing newline in the output is fine.
• The shortest code in bytes wins!

# Examples

W = 5, H = 3, N = 1
XXXXX
XXXXX
XXXXX

W = 5, H = 3, N = 2
.X.X.
X.X.X
.X.X.

W = 5, H = 3, N = 3
..X..
X..X.
.X..X

W = 5, H = 3, N = 4
...X.
..X..
.X...

W = 5, H = 3, N = 5
....X
....X
....X

W = 5, H = 3, N = 6
.....
X....
.X...

W = 5, H = 3, N = 7
.....
.X...
...X.

W = 5, H = 3, N = 15
.....
.....
....X

W = 5, H = 3, N = 16 (or more)
.....
.....
.....

W = 1, H = 1, N = 1
X

W = 1, H = 1, N = 2 (or more)
.

W = 8, H = 6, N = 2
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X

W = 8, H = 6, N = 3
..X..X..
X..X..X.
.X..X..X
..X..X..
X..X..X.
.X..X..X

W = 8, H = 6, N = 4
...X...X
...X...X
...X...X
...X...X
...X...X
...X...X

W = 8, H = 6, N = 7
......X.
.....X..
....X...
...X....
..X.....
.X......

W = 8, H = 6, N = 16
........
.......X
........
.......X
........
.......X

W = 37, H = 1, N = 4
...X...X...X...X...X...X...X...X...X.

W = 1, H = 10, N = 8
.
.
.
.
.
.
.
X
.
.
• Am I correct to assume that the restriction "You may not using something else in place of the newlines that shape the grid" includes "You may not return an array ["..X..X.", ".X..X..", "X..X..X"] as the grid"? – Peter Taylor Nov 29 '15 at 8:32
• @PeterTaylor Correct – Calvin's Hobbies Nov 29 '15 at 12:36

# J, 9 5 bytes

$":&1  Uses spaces and 1's and expects input in the form H W f N Explanation: $":&1
&1 bonds the fixed right argument 1 to ":
":   formats the right argument number (1) to take up left argument (N) number of cells
padding with spaces, resulting  in "  1"
$reshape to H-by-W with repeating the string if necessary  Usage:  3 7 ($":&1) 3
1  1
1  1
1  1  1

• Does it also truncate the array if W*H is less than N? – Martin Ender Nov 29 '15 at 10:26
• @MartinBüttner Yes. – randomra Nov 29 '15 at 11:13
• If the argument is ($":&1), wouldn't that count as 7 bytes? – Reto Koradi Nov 29 '15 at 14:55 • No, the () aren't part of the function; you could write f =.$":&1 and then 3 7 f 3. – Lynn Nov 29 '15 at 15:51

# Python 2, 60 bytes

w,h,n=input()
s='%%%dd'%n%0*w*h
exec"print s[:w];s=s[w:];"*h


This prints space and 0 in place of . and X. Input is taken as a tuple in the form of w,h,n.

• That's a clever string format. – xnor Nov 29 '15 at 4:03

## J, 12 bytes

$'X'_1}#&'.'  This is a dyadic function that takes the array H W as its left argument and N as its right argument. Usage:  f =:$'X'_1}#&'.'
3 5 f 3
..X..
X..X.
.X..X


### Explanation

$'X'_1}#&'.' '.' The character '.' #& repeated N times _1} with the last character 'X' replaced by 'X'$             reshaped into an HxW array

• Right tool for the job? – Addison Crump Nov 29 '15 at 2:48
• Is the use of X. really shortest? – lirtosiast Nov 29 '15 at 4:02
• @ThomasKwa I believe so. I tried to use the numbers 0 and 1 instead, but then I had to surround the one next to _1 with parentheses, and format away the spaces between columns, and it ended up being longer. – Zgarb Nov 29 '15 at 4:17

# BBC Basic, 67 ASCII characters, tokenised filesize 43 bytes

INPUTw,h,n:WIDTHw:PRINTLEFT$(STRING$(w*h,STRING$(n-1,".")+"X"),w*h)  BBC basic has a handy command for limiting the field width. We use STRING$ to make w*h copies of the string of n-1 periods followed by an X. Then we use LEFT$to truncate this to w*h characters. ## Minkolang 0.14, 343028 22 bytes n2-D1n$zn[z[1Rd6ZO]lO]


Check one case here and check all test cases here. Expects input like N W H.

### Explanation

n                 Take number from input (N)
2-               Subtract 2
D              Duplicate the top of stack (which is 0 because it's empty) N-2 times
1             Push a 1 onto the stack
n                 Take number from input (W)
$z Store W in the register (z) n Take number from input (H) [ Open a for loop that repeats H times z[ Open a for loop that repeats W times 1R Rotate 1 step to the right d Duplicate top of stack 6Z Convert number to string O Output as character ] Close for loop lO Output a newline ] Close for loop  As Minkolang's codebox is toroidal, this will wrap around to the beginning. As every n will now take in -1, this eventually crashes with an error and no further output, which is allowed. • So it's easy for you to compare. (Note that it's not quite the exact same code.) – El'endia Starman Nov 29 '15 at 2:20 • Ahead of you! :P :) – El'endia Starman Nov 29 '15 at 2:23 ## CJam (16 bytes) {1$*,:)@f%:!/N*}


Takes input on the stack in the order N W H, returns string using characters 0 and 1. Online demo

### Dissection

{        e# Anonymous function. Stack: N W H
1$*, e# Stack: N W [0 1 ... W*H-1] :) e# Stack: N W [1 2 ... W*H] @f% e# Stack: W [1%N 2%N ... W*H%N] :! e# Map Boolean not, taking 0 to 1 and anything else to 0 / e# Split into W-sized chunks (i.e. the lines of the grid) N* e# Join the lines with newlines }  • ;-; you beat me ;-; but good job! :D – anOKsquirrel Nov 29 '15 at 13:30 ## APL, 13 bytes {⍪,/⍕¨⍺⍴⍵=⍳⍵}  This takes H W as the left argument and N as the right argument. Explanation: {⍪,/⍕¨⍺⍴⍵=⍳⍵} Dyadic function (args are ⍺ on left, ⍵ on right): ⍵=⍳⍵ ⍵ = (1 2 3...⍵); this is ⍵-1 0s followed by a 1 ⍺⍴ Shape by the left argument; e.g. 5 3 gives a 5x3 array ⍕¨ Stringify each entry ,/ Join the strings in each row ⍪ Make column vector of strings  Try it online: first test cases, last test case. Note that although this shows boxed output, my copy of Dyalog doesn't. • Are those actually just boxes, or is the SE app not displaying the characters properly? – Carcigenicate Nov 29 '15 at 18:22 • @Carcigenicate They're not boxes. The characters should display fine on the online link, because it has a different font. – lirtosiast Nov 29 '15 at 18:45 • Ahh, right. I missed that. Do you have a special keyboard or are you a masochist? – Carcigenicate Nov 29 '15 at 18:47 • @Carcigenicate On tryapl (and Dyalog student edition) you can type APL characters using backticks. a turns into ⍺, for example. – lirtosiast Nov 29 '15 at 18:51 # CJam, 20 Bytes q~:Z;_@*,:){Z%!}%/N*  Takes input as H W N. • whoops, invalid – anOKsquirrel Nov 29 '15 at 2:03 • fixed :D :D :D :D – anOKsquirrel Nov 29 '15 at 2:08 • Still much longer than some of the solutions in other languages, but I got it to 18 bytes with CJam: q~_@*,@(S*'X+f=/N*, with input in order N H W. – Reto Koradi Nov 29 '15 at 4:53 • @RetoKoradi Take another one off by replacing 'X with 0, and that'll be 17 – Sp3000 Nov 29 '15 at 5:08 # MATLAB, 61 55 54 bytes function c=g(d,n);b=ones(d);b(n:n:end)=0;c=[b'+45,''];  Wow, I thought MATLAB would be competitive in this one, but how wrong I was! The function creates an array of 1's of the correct dimensions, and then sets every n'th element to be 0 (MATLAB implicitly handles wrapping around the indices into 2D). We then add on 45 ('-') to this number and converted to a char array to be returned. The questions allows any distinct two ASCII characters to be used for the grid, I am using '-' in place of 'x' to save some bytes. The input format is also not fixed, so it should be supplied as [w h],n - i.e. an array of width and height, and then n as a second parameter. This also works with Octave and can be tried online here. The function is already set up in the linked workspace, so you can simply call for example: g([4,5],3)  Which outputs: ..-. .-.. -..- ..-. .-..  • Save one byte: c=[b'+45,'']; – Stewie Griffin Nov 29 '15 at 9:21 • @StewieGriffin Thanks :). For some reason when I'd tried that I didn't think it saved any bytes, I must have miscounted! – Tom Carpenter Nov 29 '15 at 13:43 ## Processing, 93 bytes (Java, 104 bytes) void f(int a,int b,int c){for(int i=0;i<a*b;i++)print((i%c>c-2?"X":".")+(i%a>a-2?"\n":""));}}  The reason I used Processing instead of Java is that you don't need to acces the pointer by tiping System.out because a local variable is directly accessible. I earned 11 bytes with this. The function doesn't return the result but prints it. • You can save another by moving the increment (like i++%a...), and it looks like you left a spare } at the end you don't need, also. – Geobits Dec 7 '15 at 14:28 # Japt, 333227 25 bytes SpW-1 +Q p-~U*V/W f'.pU)·  Takes input in format W H N. Uses   and " in place of . and X, respectively. Try it online! ### Ungolfed and explanation SpW-1 +Q p-~U*V/W f'.pU)·qR // Implicit: U = width, V = height, W = interval SpW-1 +Q // Create a string of W - 1 spaces, plus a quotation mark. p-~U*V/W // Repeat this string ceil(U*V/W) times. f'.pU) // Split the resulting string into groups of U characters. qR // Join with newlines. // Implicit: output last expression  Suggestions welcome! # Vitsy, 25232221 19 Bytes Thanks to @Sp3000 for pointing out that I don't need a duplicate and saving me 2 bytes! Takes input as N W H. Try it online! 1}\0XrV\[V\[{DN]aO] 1 Push 1 to the stack. } Push the backmost to the front and subtract 2. \0X Duplicate the 0 temp variable times. r Reverse the stack. V Save as final global variable. \[ ] Repeat top item times. V\[ ] Repeat global variable times. {DO Duplicate, output, then shift over an item. aO Output a newline. # K, 211918 14 bytes Takes arguments as (H W;N): {".X"x#y=1+!y}  In action:  f:{".X"x#y=1+!y}; f.'((3 5;1);(3 5;2);(3 7;3);(4 10;5);(3 5;16)) (("XXXXX" "XXXXX" "XXXXX") (".X.X." "X.X.X" ".X.X.") ("..X..X." ".X..X.." "X..X..X") ("....X....X" "....X....X" "....X....X" "....X....X") ("....." "....." "....."))  # Pyth - 1918 17 bytes Hope to golf it more. Takes input as N\n[W, H]. jc.[k+*dtvzN*FQhQ  # R, 66 bytes function(w,h,n){x=rep(".",a<-w*h);x[1:a%%n<1]="X";matrix(x,h,w,T)}  This is a function that accepts three integers and returns a matrix of character values. To call it, assign it to a variable. Ungolfed: f <- function(w, h, n) { # Get the area of the square a <- w*h # Construct a vector of dots x <- rep(".", a) # Replace every nth entry with X x[1:a %% n == 0] <- "X" # Return a matrix constructed by row matrix(x, nrow = h, ncol = w, byrow = TRUE) }  # JavaScript (ES6), 65 60 bytes (w,h,n)=>eval('for(i=r=;i++<w*h;i%w?0:r+=\n)r+=i%n?0:1')  ## Explanation (w,h,n)=>eval(' // use eval to remove need for return keyword for( i= // i = current grid index r=; // r = result i++<w*h; // iterate for each index of the grid i%w?0:r+=\n // if we are at the end of a line, print a newline character // note: we need to escape the newline character inside the template ) // string because this is already inside a string for the eval r+=i%n?0:1 // add a 0 for . or 1 for X to the result // implicit: return r ')  ## Test W = <input type="number" id="W" value="7" /><br /> H = <input type="number" id="H" value="3" /><br /> N = <input type="number" id="N" value="3" /><br /> <button onclick="result.innerHTML=( (w,h,n)=>eval('for(i=r=;i++<w*h;i%w?0:r+=\n)r+=i%n?0:1') )(+W.value,+H.value,+N.value)">Go</button> <pre id="result"></pre> ## Mathematica, 85 bytes ""<>(#<>" "&/@ReplacePart["."~Table~{t=# #2},List/@Range[#3,t,#3]->"X"]~Partition~#)&  As with many other solutions, this creates a single row, then partitions it. # JavaScript (ES6), 55 bytes (w,h,n)=>(f=i=>i++<w*h?+!(i%n)+(i%w?"": )+f(i):"")(0)  Uses the IIFE f to loop to save a return statement. Output for w=5, h=3, n=7: 00000 01000 00010  C#, 185 bytes using System;class x{void a(int w,int h,int n){int c=1;for(int i=0;i<h;i++){for(int j=1;j<=w;j++){if(c%n==0){Console.Write("x");}else{Console.Write(".");}c++;}Console.WriteLine();}}}  For a more readable Reading: using System; class x { void a(int w, int h, int n) { int c = 1; for (int i = 0; i < h; i++) { for (int j = 1; j <= w; j++) { if (c % n == 0) { Console.Write("x"); } else { Console.Write("."); } c++; } Console.WriteLine(); } } }  Usage: new x().a(7, 3, 3);  # Julia, 50 bytes f(w,h,n)=reshape([i%n<1?"X":"." for i=1:w*h],w,h)'  This creates a function f that accepts three integers and returns a 2-dimensional array of strings. Ungolfed: function f(w::Integer, h::Integer, n::Integer) # Construct an array of strings in reading order a = [i % n == 0 ? "X" : "." for i = 1:w*h] # Reshape this columnwise into a w×h array r = reshape(a, w, h) # Return the transpose return transpose(r) end  # Ruby, 67 56 bytes ->w,h,n{(1..h).map{(1..w).map{o,$.=$.%n<1?1:0,$.+=1;o}}}


Printing an array since it is accepted.

67 bytes

->w,h,n{i=1;puts (1..h).map{(1..w).map{o,i=i%n<1?1:0,i+=1;o}.join}}


Ungolfed:

-> w, h, n {
(1..h).map {
(1..w).map {
o, $. =$.%n < 1 ? 1 : 0, $.+ = 1 o } } }  Usage: ->w,h,n{(1..h).map{(1..w).map{o,$.=$.%n<1?1:0,$.+=1;o}}}[8,6,7]
=> [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]]


## MATLAB, 44 bytes

Note: Very different approach than the one used by Tom Carpenter.

@(x,y)char(reshape(~mod(1:prod(x),y),x)'+46)


Defines an anonymous function that accepts inputs as [W,H],N. I approached this problem using not-the-modulo-of-N for an array 1:W*H and then simply reshaping the solution to a two-dimensional array, which is then converted to a character array.

Example output for [5,3],7:

.....
./...
.../.


# Common Lisp, SBCL, 94 bytes

(lambda(a b c)(dotimes(i(* a b))(format t"~:[.~;X~]~@[~%~]"(=(mod(1+ i)c)0)(=(mod(1+ i)a)0))))


### Explanation

~:[.~;X~] <-- takes argument - if argument is true write ., if false write X
~@[~%~] <-- takes argument - if argument is true write newline, if not treat argument as if it was not used


(=(mod(1+ i)c)0)(=(mod(1+ i)a)0) looks pretty silly (because it's so similiar but I don't know if it can be solved, saving bytes

I use (1+ i) instead of i because dotimes starts from i=0 and I want to start from 1. It is also helpful because I can use (* a b) instead of (1+(* a b))

# Japt-R, 9 bytes

Takes input as [W,H],N and uses spaces instead of .s & "s instead of Xs.

×îQùV)òUÎ


Try it

# Java, 185 183 bytes

Thanks Thomas Kwa, for saving me 2 bytes!

interface B{static void main(String[] a){int w = Byte.parseByte(a[0]);for(int i=0;i++<w*Byte.parseByte(a[1]);)System.out.print((i%Byte.parseByte(a[2])>0?".":"X")+(i%w<1?"\n":""));}}


Ungolfed (ish):

interface A {
static void main(String[] a) {
int w = Byte.parseByte(a[0]);
for(
int i = 0;
i++ < w*Byte.parseByte(a[1]);
)
System.out.print((
i%Byte.parseByte(a[2]) > 0 ? "." : "X"
)+(
i%w < 1 ? "\n" : ""
));
}
}


Usage:

\$ java B 5 3 7
.....
.X...
...X.


Maybe java will win one day :P

• I think you can use >0 instead of !=0, and <1 instead of ==0`. – lirtosiast Nov 30 '15 at 0:44