Marcas de cuadrícula muy simples

29

Escriba un programa o función que tome tres enteros positivos, W, H y N. Imprima o devuelva una cuadrícula de W × H .donde cada Nth .en el orden normal de lectura en inglés se reemplaza con un X.

Por ejemplo, dado W = 7, H = 3, N = 3, la cuadrícula tiene 7 caracteres de ancho y 3 de alto, y la lectura de cada tercer carácter desde la parte superior izquierda es un X:

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

Del mismo modo, si la entrada es W = 10, H = 4, N = 5, la salida sería:

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

Notas

  • "Orden de lectura en inglés normal" significa ir de izquierda a derecha en cada línea, desde la línea superior hasta la inferior.
  • Cuando N es 1, entonces todas las .'s se convertirán en X' s.
  • Puede usar dos caracteres ASCII imprimibles distintos en lugar de .y X.
    • Si usa space ( ), no se requieren espacios finales cuando el resultado sería visualmente el mismo. (Todavía se requieren líneas vacías).
    • No puede usar otra cosa en lugar de las nuevas líneas que dan forma a la cuadrícula.
  • El formato de entrada exacto y el orden de W, H y N no es súper importante. Cosas como [H,W,N]o N\nW,Hestán bien.
  • Una nueva línea final en la salida está bien.
  • ¡El código más corto en bytes gana!

Ejemplos

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
.
.
Pasatiempos de Calvin
fuente
1
¿Estoy en lo cierto al suponer que la restricción " No puede usar otra cosa en lugar de las nuevas líneas que dan forma a la cuadrícula " incluye " No puede devolver una matriz ["..X..X.", ".X..X..", "X..X..X"]como la cuadrícula "?
Peter Taylor
@PeterTaylor Correcto
Aficiones de Calvin

Respuestas:

13

J, 9 5 bytes

$":&1

Usa espacios y 1'sy espera entrada en el formularioH W f N

Explicación:

$":&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 

Uso:

   3 7 ($":&1) 3
  1  1 
 1  1  
1  1  1

Pruébelo en línea aquí.

randomra
fuente
¿También trunca la matriz si W * H es menor que N?
Martin Ender
@ MartinBüttner Sí.
randomra
Si el argumento es ($":&1), ¿no contaría eso como 7 bytes?
Reto Koradi
1
No, ()no son parte de la función; podrías escribir f =. $":&1y luego 3 7 f 3.
Lynn
11

Python 2, 60 bytes

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

Esto imprime espacio y 0en lugar de .y X. La entrada se toma como una tupla en forma de w,h,n.

xsot
fuente
44
Ese es un formato de cadena inteligente.
xnor
7

J, 12 bytes

$'X'_1}#&'.'

Esta es una función diádica que toma la matriz H Wcomo argumento izquierdo y Ncomo argumento derecho. Uso:

  f =: $'X'_1}#&'.'
  3 5 f 3
..X..
X..X.
.X..X

Explicación

$'X'_1}#&'.'
         '.'  The character '.'
       #&     repeated N times
    _1}       with the last character
 'X'          replaced by 'X'
$             reshaped into an HxW array
Zgarb
fuente
¿Herramienta adecuada para el trabajo ?
Addison Crump
¿Es el uso de X.realmente más corto?
lirtosiast
@ThomasKwa, creo que sí. Intenté usar los números 0 y 1 en su lugar, pero luego tuve que rodear el que estaba al lado _1con paréntesis, y formatear los espacios entre columnas, y terminó siendo más largo.
Zgarb
5

BBC Basic, 67 caracteres ASCII, tamaño de archivo tokenizado 43 bytes

Descargue el intérprete en http://www.bbcbasic.co.uk/bbcwin/download.html

INPUTw,h,n:WIDTHw:PRINTLEFT$(STRING$(w*h,STRING$(n-1,".")+"X"),w*h)

BBC basic tiene un comando útil para limitar el ancho del campo. Usamos STRING$para hacer w*hcopias de la cadena de n-1períodos seguidos de una X. Luego usamos IZQUIERDA $ para truncar esto a los w*hcaracteres.

Level River St
fuente
4

Minkolang 0.14 , 34 30 28 22 bytes

n2-D1n$zn[z[1Rd6ZO]lO]

Marque un caso aquí y marque todos los casos de prueba aquí. Espera entrada como N W H.

Explicación

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

Como la caja de códigos de Minkolang es toroidal, esto terminará hasta el principio. Como todos ntomarán ahora -1, esto finalmente se bloquea con un error y no hay más resultados, lo que está permitido.

El'endia Starman
fuente
Entonces es fácil para usted comparar. (Tenga en cuenta que no es exactamente el mismo código).
El'endia Starman
¡Delante tuyo! : P :)
El'endia Starman
4

CJam (16 bytes)

{1$*,:)@f%:!/N*}

Toma la entrada en la pila en el orden N W H, devuelve la cadena usando caracteres 0y 1. Demostración en línea

Disección

{        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
}
Peter Taylor
fuente
; -; Tu me golpeaste ;-; pero buen trabajo! : D
anOKsquirrel
4

APL, 13 bytes

{⍪,/⍕¨⍺⍴⍵=⍳⍵}

Esto toma H Wcomo argumento izquierdo y Ncomo argumento derecho.

Explicación:

{⍪,/⍕¨⍺⍴⍵=⍳⍵}     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

Pruébelo en línea: primeros casos de prueba , último caso de prueba . Tenga en cuenta que aunque esto muestra resultados en recuadro, mi copia de Dyalog no.

lirtosiast
fuente
¿Son realmente solo cuadros, o la aplicación SE no muestra los caracteres correctamente?
Carcigenicate
@Carcigenicate No son cajas. Los caracteres deben aparecer bien en el enlace en línea, ya que tiene una fuente diferente.
lirtosiast
Ahh, cierto. Me lo perdí. ¿Tienes un teclado especial o eres un masoquista?
Carcigenicate
@Carcigenicate En tryapl (y en la edición para estudiantes de Dyalog) puede escribir caracteres APL usando teclas de retroceso. `a se convierte en ⍺, por ejemplo.
lirtosiast
2

CJam, 20 bytes

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

Toma entrada como HW N.

anOKsquirrel
fuente
whoops, inválido
anOKsquirrel
corregido: D: D: D: D
anOKsquirrel
Todavía mucho más tiempo que algunas de las soluciones en otros idiomas, pero llegué a 18 bytes con CJam:, q~_@*,@(S*'X+f=/N*con entrada en orden NH W.
Reto Koradi
1
@RetoKoradi Quítese otro reemplazándolo 'Xcon 0, y eso será 17
Sp3000
2

MATLAB, 61 55 54 bytes

function c=g(d,n);b=ones(d);b(n:n:end)=0;c=[b'+45,''];

Wow, pensé que MATLAB sería competitivo en este caso, ¡pero qué equivocado estaba!

La función crea una matriz de 1 de las dimensiones correctas y luego establece que cada enésimo elemento sea 0 (MATLAB maneja implícitamente el ajuste alrededor de los índices en 2D). Luego agregamos 45 ('-') a este número y lo convertimos en una matriz de caracteres para devolver.

Las preguntas permiten que se usen dos caracteres ASCII distintos para la cuadrícula, estoy usando '-' en lugar de 'x' para guardar algunos bytes. El formato de entrada tampoco es fijo, por lo que debe proporcionarse como [w h],n- es decir, una matriz de ancho y alto, y luego n como segundo parámetro.


Esto también funciona con Octave y puede probarse en línea aquí . La función ya está configurada en el espacio de trabajo vinculado, por lo que simplemente puede llamar, por ejemplo:

g([4,5],3)

Qué salidas:

..-.
.-..
-..-
..-.
.-..
Tom Carpenter
fuente
Ahorre un byte:c=[b'+45,''];
Stewie Griffin
@StewieGriffin Gracias :). Por alguna razón cuando intenté que no creía que hubiera guardado ningún byte, ¡debo haber contado mal!
Tom Carpenter
2

Procesamiento, 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":""));}}

La razón por la que utilicé Processing en lugar de Java es que no necesita acceder al puntero dando propinas System.outporque se puede acceder directamente a una variable local. Gané 11 bytes con esto. La función no devuelve el resultado pero lo imprime.

6 infinito 8
fuente
2
Puede guardar otro moviendo el incremento (como i++%a...), y parece que también dejó un repuesto }al final que no necesita.
Geobits
2

Japt , 33 32 27 25 bytes

SpW-1 +Q p-~U*V/W f'.pU)·

Toma entrada en formato W H N. Usos  y "en lugar de .y X, respectivamente. Pruébalo en línea!

Sin golfos y explicación

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

Sugerencias bienvenidas!

ETHproducciones
fuente
2

Vitsy , 25 23 22 21 19 Bytes

¡Gracias a @ Sp3000 por señalar que no necesito un duplicado y ahorrarme 2 bytes!

Toma entrada como N W H. Pruébalo en línea!

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.
Addison Crump
fuente
1

K, 21 19 18 14 bytes

Toma argumentos como (H W;N):

{".X"x#y=1+!y}

En acción:

  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")
 ("....."
  "....."
  "....."))
JohnE
fuente
1

Pyth - 19 18 17 bytes

Espero jugar más al golf. Toma entrada como N\n[W, H].

jc.[k+*dtvzN*FQhQ

Test Suite .

Maltysen
fuente
1

R, 66 bytes

function(w,h,n){x=rep(".",a<-w*h);x[1:a%%n<1]="X";matrix(x,h,w,T)}

Esta es una función que acepta tres enteros y devuelve una matriz de valores de caracteres. Para llamarlo, asígnelo a una variable.

Sin golf:

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)
}
Alex A.
fuente
1

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

Explicación

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

Prueba

usuario81655
fuente
1

Mathematica, 85 bytes

""<>(#<>"
"&/@ReplacePart["."~Table~{t=# #2},List/@Range[#3,t,#3]->"X"]~Partition~#)&

Al igual que con muchas otras soluciones, esto crea una sola fila y luego la divide.

LegionMammal978
fuente
1

JavaScript (ES6), 55 bytes

(w,h,n)=>(f=i=>i++<w*h?+!(i%n)+(i%w?"":`
`)+f(i):"")(0)

Utiliza el IIFE f para recorrer para guardar una declaración de devolución.

Salida para w = 5, h = 3, n = 7:

00000
01000
00010
codificador intrépido
fuente
1

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();}}}

Para una lectura más legible:

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();
     }
  }
}

Uso:

new x().a(7, 3, 3);
Julio Murta
fuente
0

Julia, 50 bytes

f(w,h,n)=reshape([i%n<1?"X":"." for i=1:w*h],w,h)'

Esto crea una función fque acepta tres enteros y devuelve una matriz bidimensional de cadenas.

Sin golf:

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
Alex A.
fuente
0

Ruby, 67 56 bytes

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

Imprimir una matriz ya que se acepta.

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

Sin golf:

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

Uso:

->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]]
Vasu Adari
fuente
0

MATLAB, 44 bytes

Nota: Enfoque muy diferente al utilizado por Tom Carpenter.

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

Define una función anónima que acepta entradas como [W,H],N. Abordé este problema usando not-the-modulo-of- N para una matriz 1: W * H y luego simplemente reestructurando la solución a una matriz bidimensional, que luego se convierte en una matriz de caracteres.

Ejemplo de salida para [5,3],7:

.....
./...
.../.
slvrbld
fuente
0

Lisp común, SBCL, 94 bytes

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

Explicación

~:[.~;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) se ve bastante tonto (porque es muy similar pero no sé si se puede resolver, ahorrando bytes

Yo uso en (1+ i)lugar de iporque dotimescomienza desde i=0y quiero comenzar desde 1. También es útil porque puedo usar en (* a b)lugar de(1+(* a b))


fuente
-1

Java, 185 183 bytes

¡Gracias Thomas Kwa, por salvarme 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":""));}}

Sin golf (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" : ""
      ));
  }
}

Uso:

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

Quizás Java gane algún día: P

Phinet
fuente
Creo que puedes usar en >0lugar de !=0, y en <1lugar de ==0.
lirtosiast