31
\$\begingroup\$

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
.
.
\$\endgroup\$
2
  • 1
    \$\begingroup\$ 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"? \$\endgroup\$ Nov 29, 2015 at 8:32
  • \$\begingroup\$ @PeterTaylor Correct \$\endgroup\$ Nov 29, 2015 at 12:36

29 Answers 29

13
\$\begingroup\$

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

Try it online here.

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

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.

\$\endgroup\$
1
  • 4
    \$\begingroup\$ That's a clever string format. \$\endgroup\$
    – xnor
    Nov 29, 2015 at 4:03
7
\$\begingroup\$

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
\$\endgroup\$
3
  • \$\begingroup\$ Right tool for the job? \$\endgroup\$ Nov 29, 2015 at 2:48
  • \$\begingroup\$ Is the use of X. really shortest? \$\endgroup\$
    – lirtosiast
    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 _1 with parentheses, and format away the spaces between columns, and it ended up being longer. \$\endgroup\$
    – Zgarb
    Nov 29, 2015 at 4:17
5
\$\begingroup\$

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.

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

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.

\$\endgroup\$
2
  • \$\begingroup\$ So it's easy for you to compare. (Note that it's not quite the exact same code.) \$\endgroup\$ Nov 29, 2015 at 2:20
  • \$\begingroup\$ Ahead of you! :P :) \$\endgroup\$ Nov 29, 2015 at 2:23
4
\$\begingroup\$

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
}
\$\endgroup\$
1
  • \$\begingroup\$ ;-; you beat me ;-; but good job! :D \$\endgroup\$ Nov 29, 2015 at 13:30
4
\$\begingroup\$

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.

\$\endgroup\$
4
  • \$\begingroup\$ Are those actually just boxes, or is the SE app not displaying the characters properly? \$\endgroup\$ 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
    Nov 29, 2015 at 18:45
  • \$\begingroup\$ Ahh, right. I missed that. Do you have a special keyboard or are you a masochist? \$\endgroup\$ 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
    Nov 29, 2015 at 18:51
2
\$\begingroup\$

CJam, 20 Bytes

q~:Z;_@*,:){Z%!}%/N*

Takes input as H W N.

\$\endgroup\$
4
  • \$\begingroup\$ whoops, invalid \$\endgroup\$ Nov 29, 2015 at 2:03
  • \$\begingroup\$ fixed :D :D :D :D \$\endgroup\$ 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\$ Nov 29, 2015 at 4:53
  • 1
    \$\begingroup\$ @RetoKoradi Take another one off by replacing 'X with 0, and that'll be 17 \$\endgroup\$
    – Sp3000
    Nov 29, 2015 at 5:08
2
\$\begingroup\$

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")
 ("....."
  "....."
  "....."))
\$\endgroup\$
2
\$\begingroup\$

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:

..-.
.-..
-..-
..-.
.-..
\$\endgroup\$
2
  • \$\begingroup\$ Save one byte: c=[b'+45,'']; \$\endgroup\$ 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\$ Nov 29, 2015 at 13:43
2
\$\begingroup\$

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.

\$\endgroup\$
1
  • 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
    Dec 7, 2015 at 14:28
2
\$\begingroup\$

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!

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

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}\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.
\$\endgroup\$
2
\$\begingroup\$

K (ngn/k), 10 bytes

{y#|x$"X"}

Try it online!

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
\$\endgroup\$
1
\$\begingroup\$

Pyth - 19 18 17 bytes

Hope to golf it more. Takes input as N\n[W, H].

jc.[k+*dtvzN*FQhQ

Test Suite.

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

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)
}
\$\endgroup\$
1
\$\begingroup\$

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>

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

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.

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

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
\$\endgroup\$
1
\$\begingroup\$

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);
\$\endgroup\$
1
\$\begingroup\$

Vyxal 3 jR, 8 bytes

×ƛ?Ḋ]¹Ẇ“

input as W,H,N Try it Online!

×ƛ?Ḋ]¹Ẇ“­⁡​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢‏⁠⁠‎⁡⁠⁢⁡‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁣‏⁠‎⁡⁠⁤‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁢⁢‏⁠‎⁡⁠⁢⁣‏⁠‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁤​‎‏​⁢⁠⁡‌­
×ƛ  ]     # ‎⁡Map over the range H x W
  ?Ḋ      # ‎⁢Divisible by N?
     ¹Ẇ“  # ‎⁣Split into chunks of length W and join on nothing
# ‎⁤j flag joins on newlines
💎

Created with the help of Luminespire.

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

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
\$\endgroup\$
0
\$\begingroup\$

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]]
\$\endgroup\$
0
\$\begingroup\$

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:

.....
./...
.../.
\$\endgroup\$
0
\$\begingroup\$

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))

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

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

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

Uiua, 17 bytes

↯⇌⊟⊙⊙(⇌⊂@X↯:@.-1)

Test pad

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

Perl 5 -a, 44 bytes

print$_%$F[1]&&1,$/x!($_%"@F")for 1.."@F"*<>

Try it online!

Input format is:

W N
H

Output uses 1 for the spacer and 0 for the character.

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

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

\$\endgroup\$
2
  • \$\begingroup\$ I think you can use >0 instead of !=0, and <1 instead of ==0. \$\endgroup\$
    – lirtosiast
    Nov 30, 2015 at 0:44
  • \$\begingroup\$ You can remove useless whitespace after String[] and around = to get -3 bytes down \$\endgroup\$
    – Joao-3
    Jan 31 at 15:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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