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 becomeX's. - You may use any two distinct printable ASCII characters in place of
.andX.- 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]orN\nW,Hare 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
.
.
30 Answers 30
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
-
\$\begingroup\$ Does it also truncate the array if W*H is less than N? \$\endgroup\$Martin Ender– Martin Ender2015年11月29日 10:26:14 +00:00Commented Nov 29, 2015 at 10:26
-
\$\begingroup\$ @MartinBüttner Yes. \$\endgroup\$randomra– randomra2015年11月29日 11:13:28 +00:00Commented Nov 29, 2015 at 11:13
-
\$\begingroup\$ If the argument is
($":&1), wouldn't that count as 7 bytes? \$\endgroup\$Reto Koradi– Reto Koradi2015年11月29日 14:55:15 +00:00Commented Nov 29, 2015 at 14:55 -
1\$\begingroup\$ No, the
()aren't part of the function; you could writef =. $":&1and then3 7 f 3. \$\endgroup\$lynn– lynn2015年11月29日 15:51:43 +00:00Commented Nov 29, 2015 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.
-
4\$\begingroup\$ That's a clever string format. \$\endgroup\$xnor– xnor2015年11月29日 04:03:53 +00:00Commented Nov 29, 2015 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
-
\$\begingroup\$ Right tool for the job? \$\endgroup\$Addison Crump– Addison Crump2015年11月29日 02:48:03 +00:00Commented Nov 29, 2015 at 2:48
-
\$\begingroup\$ Is the use of
X.really shortest? \$\endgroup\$lirtosiast– lirtosiast2015年11月29日 04:02:07 +00:00Commented Nov 29, 2015 at 4:02 -
\$\begingroup\$ @ThomasKwa I believe so. I tried to use the numbers 0 and 1 instead, but then I had to surround the one next to
_1with parentheses, and format away the spaces between columns, and it ended up being longer. \$\endgroup\$Zgarb– Zgarb2015年11月29日 04:17:55 +00:00Commented Nov 29, 2015 at 4:17
BBC Basic, 67 ASCII characters, tokenised filesize 43 bytes
Download interpreter at http://www.bbcbasic.co.uk/bbcwin/download.html
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, (削除) 34 (削除ここまで) (削除) 30 (削除ここまで) (削除) 28 (削除ここまで) 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.
-
\$\begingroup\$ So it's easy for you to compare. (Note that it's not quite the exact same code.) \$\endgroup\$El'endia Starman– El'endia Starman2015年11月29日 02:20:26 +00:00Commented Nov 29, 2015 at 2:20
-
\$\begingroup\$ Ahead of you! :P :) \$\endgroup\$El'endia Starman– El'endia Starman2015年11月29日 02:23:43 +00:00Commented Nov 29, 2015 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
}
-
\$\begingroup\$ ;-; you beat me ;-; but good job! :D \$\endgroup\$anOKsquirrel– anOKsquirrel2015年11月29日 13:30:41 +00:00Commented Nov 29, 2015 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.
-
\$\begingroup\$ Are those actually just boxes, or is the SE app not displaying the characters properly? \$\endgroup\$Carcigenicate– Carcigenicate2015年11月29日 18:22:59 +00:00Commented Nov 29, 2015 at 18:22
-
\$\begingroup\$ @Carcigenicate They're not boxes. The characters should display fine on the online link, because it has a different font. \$\endgroup\$lirtosiast– lirtosiast2015年11月29日 18:45:13 +00:00Commented Nov 29, 2015 at 18:45
-
\$\begingroup\$ Ahh, right. I missed that. Do you have a special keyboard or are you a masochist? \$\endgroup\$Carcigenicate– Carcigenicate2015年11月29日 18:47:31 +00:00Commented Nov 29, 2015 at 18:47
-
\$\begingroup\$ @Carcigenicate On tryapl (and Dyalog student edition) you can type APL characters using backticks. `a turns into ⍺, for example. \$\endgroup\$lirtosiast– lirtosiast2015年11月29日 18:51:44 +00:00Commented Nov 29, 2015 at 18:51
CJam, 20 Bytes
q~:Z;_@*,:){Z%!}%/N*
Takes input as H W N.
-
\$\begingroup\$ whoops, invalid \$\endgroup\$anOKsquirrel– anOKsquirrel2015年11月29日 02:03:13 +00:00Commented Nov 29, 2015 at 2:03
-
\$\begingroup\$ fixed :D :D :D :D \$\endgroup\$anOKsquirrel– anOKsquirrel2015年11月29日 02:08:45 +00:00Commented Nov 29, 2015 at 2:08
-
\$\begingroup\$ 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. \$\endgroup\$Reto Koradi– Reto Koradi2015年11月29日 04:53:17 +00:00Commented Nov 29, 2015 at 4:53 -
1\$\begingroup\$ @RetoKoradi Take another one off by replacing
'Xwith0, and that'll be 17 \$\endgroup\$Sp3000– Sp30002015年11月29日 05:08:18 +00:00Commented Nov 29, 2015 at 5:08
K, (削除) 21 (削除ここまで) (削除) 19 (削除ここまで) (削除) 18 (削除ここまで) 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")
("....."
"....."
"....."))
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:
..-.
.-..
-..-
..-.
.-..
-
\$\begingroup\$ Save one byte:
c=[b'+45,''];\$\endgroup\$Stewie Griffin– Stewie Griffin2015年11月29日 09:21:42 +00:00Commented Nov 29, 2015 at 9:21 -
\$\begingroup\$ @StewieGriffin Thanks :). For some reason when I'd tried that I didn't think it saved any bytes, I must have miscounted! \$\endgroup\$Tom Carpenter– Tom Carpenter2015年11月29日 13:43:36 +00:00Commented Nov 29, 2015 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.
-
2\$\begingroup\$ 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. \$\endgroup\$Geobits– Geobits2015年12月07日 14:28:58 +00:00Commented Dec 7, 2015 at 14:28
Japt, (削除) 33 (削除ここまで) (削除) 32 (削除ここまで) (削除) 27 (削除ここまで) 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, (削除) 25 (削除ここまで) (削除) 23 (削除ここまで) (削除) 22 (削除ここまで) (削除) 21 (削除ここまで) 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}0円XrV\[V\[{DN]aO]
1 Push 1 to the stack.
} Push the backmost to the front and subtract 2.
0円X 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 (ngn/k), 10 bytes
{y#|x$"X"}
Takes input as two arguments; N as the first/left arg, and (H;W) as the second/right arg. Uses " " and "X" as the output characters.
|x$"X"right pad "X" to the desired length (fills with spaces), and reverse it (to put the "X" at the end)y#reshape the above to the desired dimensions; the above gets repeated over and over until it is long enough
Pyth - (削除) 19 (削除ここまで) (削除) 18 (削除ここまで) 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);
Vyxal 3 Rj, 7 bytes
×ばつv?Ḋ1Ẇ"
input as H, W, N
×ばつƛ ] # Map over the range H x W
?Ḋ # Divisible by N?
1Ẇ" # Split into chunks of length W and join on nothing
# j flag joins on newlines
💎
Created with the help of Luminespire.
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 ×ばつ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))
AWK, 45 bytes
{for(;i++<1ドル*2ドル;)printf(i%3ドル?0:1)(i%1ドル?X:RS)}
Input: 7 3 3
Output:
0010010
0100100
1001001
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
-
\$\begingroup\$ I think you can use
>0instead of!=0, and<1instead of==0. \$\endgroup\$lirtosiast– lirtosiast2015年11月30日 00:44:57 +00:00Commented Nov 30, 2015 at 0:44 -
\$\begingroup\$ You can remove useless whitespace after
String[]and around=to get -3 bytes down \$\endgroup\$Joao-3– Joao-32024年01月31日 15:21:16 +00:00Commented Jan 31, 2024 at 15:21
["..X..X.", ".X..X..", "X..X..X"]as the grid"? \$\endgroup\$