Crear una matriz de tablero de ajedrez


26

Tome un entero positivo n como entrada y genere una matriz de tablero de ajedrez n por n que consta de 1 y 0 .

El dígito superior izquierdo siempre debe ser 1 .

Casos de prueba:

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

Los formatos de entrada y salida son opcionales. Se acepta la salida de la matriz como una lista de listas.


¿Está bien una lista de cadenas?
xnor

Si, esta bien.
Stewie Griffin


2
Sus ejemplos muestran espacios entre números en la misma fila, ¿es eso necesario para parecerse más a un cuadrado?
BradC

@BradC no es obligatorio. El primer enfoque aquí es válido.
Stewie Griffin

Respuestas:



9

MATL , 5 bytes

:otYT

¡Pruébelo en MATL en línea!

Explicación

Considere la entrada 4como un ejemplo.

:    % 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]

7

Japt , 6 bytes

ÆÇ+X v

¡Pruébalo en línea! (Utiliza la -Qbandera para una visualización más fácil)

Explicación

 Æ   Ç   +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

Una cosa interesante a tener en cuenta es que nov es un "divisible por 2" incorporado. En cambio, es un "divisible por X" incorporado. Sin embargo, a diferencia de la mayoría de los lenguajes de golf, las funciones de Japt no tienen aridad fija (pueden aceptar cualquier número de argumentos correctos). Cuando se le dan 0 argumentos correctos, se supone que desea , y por lo tanto actúa exactamente como se dio en lugar de nada.v22



7

Haskell , 50 41 39 38 bytes

Gracias a nimi y xnor por ayudarnos a recortar un total de 9 10 bytes

f n=r[r"10",r"01"]where r=take n.cycle

Alternativamente, para un byte más:

(!)=(.cycle).take
f n=n![n!"10",n!"01"]

o:

r=flip take.cycle
f n=r[r"10"n,r"01"n]n

Probablemente subóptimo, pero un enfoque limpio y directo.


concat.repeates cycle: n!l=take n$cycle l. Si vas pointfree se ahorra una más bytes: (!)=(.cycle).take.
nimi

¡Encantador! Sabía que había algo para eso, pero no podía recordar el nombre de mi vida
Julian Wolf el

Iba a sugerir f n|r<-take n.cycle=r[r"10",r"01"]o similar. pero Haskell parece inferir el tipo incorrecto para r? Funciona con tipeo explícito f n|r<-take n.cycle::[a]->[a]=r[r"10",r"01"].
xnor

1
@JulianWolf Haskell parece tener problemas para inferir tipos polimórficos
xnor

1
@zbw Pensé que este era el caso, pero usarlo NoMonomorphismRestrictionno ayudó. Tampoco Rank2Typeso RankNTypes. ¿Sabes lo que está pasando allí?
xnor

5

APL (Dyalog) , 8 bytes

~2|⍳∘.+⍳

Pruébalo en línea!

Explicación

Llamemos al argumento n.

⍳∘.+⍳

Esto crea una matriz

1+1 1+2 1+2 .. 1+n
2+1 2+2 2+3 .. 2+n
...
n+1 n+2 n+3 .. n+n

Luego 2|toma el módulo 2 de la matriz (se vectoriza) después de lo cual ~toma el NOT del resultado.



4

JavaScript ES6, 55 54 51 46 bytes

Guardado 1 byte gracias a @Neil

Guardado 2 bytes gracias a @Arnauld

n=>[...Array(n)].map((_,i,a)=>a.map(_=>++i&1))

Pruébalo en línea!

Esto se genera como una matriz de matrices. Los rangos de JavaScript son bastante extraños, pero yo uso los [...Array(n)]que generan una variedad de tamañosn


Todavía es un byte más corto para usar los parámetros de índice:n=>[...Array(n)].map((_,i,a)=>a.map((_,j)=>(i+j+1)%2))
Neil

@Neil eh, nunca pensé en usar el tercer parámetro en el mapa, ¡gracias!
Downgoat

@Arnauld gracias! eso me inspiró a ahorrar 5 bytes más!
Downgoat

4

Retina , 33 30 bytes

.+
$*
1
$_¶
11
10
T`10`01`¶.+¶

Pruébalo en línea! Explicación: La primera etapa convierte la entrada a unaria usando 1s (¡convenientemente!) Mientras que la segunda etapa convierte el valor en un cuadrado. La tercera etapa invierte bits alternativos en cada fila, mientras que la última etapa invierte bits en filas alternativas. Editar: Guardado 3 bytes gracias a @MartinEnder.


$`1$'es justo $_.
Martin Ender

@MartinEnder Ah, no estoy familiarizado $_, ¡gracias!
Neil

3

MATL , 7 bytes

:t!+2\~

Pruébalo en línea!

Explicación:

         % 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]

Nota: Comencé a resolver esto en MATL después de publicar el desafío.


Equivalente y más corto::&+o~
Luis Mendo

1
Todavía estoy aprendiendo :-) Actualizaré mañana. También me gustó tu otro enfoque :-)
Stewie Griffin

1
Esto es lo que se me ocurrió también. Y oye, solo usas el conjunto de instrucciones MATL puro , no esas molestas Yinstrucciones modificadas que usa @LuisMendo.
Sanchises

@Sanchises Pesky, ¿ eh ? :-P
Luis Mendo

3

Brachylog , 15 bytes

^₂⟦₁%₂ᵐ;?ḍ₎pᵐ.\

Pruébalo en línea!

Explicación

Example Input: 4

^₂               Square:                            16
  ⟦₁             1-indexed Range:                   [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
    %₂ᵐ          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]]
           pᵐ.   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]]

3

Clojure, 36 bytes

#(take %(partition % 1(cycle[1 0])))

Yay, la herramienta adecuada para el trabajo.


3

05AB1E , 9 7 bytes

-2 bytes gracias a Emigna

LDÈD_‚è

Pruébalo en línea!

Explicación

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

Puede cortar »como la salida de la lista de listas está bien y también puede eliminarla s.
Emigna

@Emigna Sí, gracias!
kalsowerus

La explicación es un poco irrelevante.
Erik the Outgolfer

3

Java (OpenJDK 8) , 80 77 bytes

-3 bytes gracias a 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;}

Pruébalo en línea!

Oh, mira, una respuesta Java de longitud semi razonable, con muchos operadores divertidos.

lambda que toma un int y devuelve una cadena. Funciona usando el número de fila y el número de columna usando / y% para determinar qué valor debería ser, mod 2;

Sin golf:

j->{
    String s="1";
    for(int i=1; i<j*j; s+= i++/j + i%j&1 )
        s+= 1>i%j ? "\n" : "";
    return s;
}

Puede eliminar el espacio para guardar un byte. El desafío establece que el formato de salida es flexible. Ah, y puede guardar dos bytes más cambiando (i++/j+i%j)%2a i++/j+i%j&1para que no necesite esos paréntesis. Lo que hace que el total de 1 byte sea más corto que mi solución for-loop anidada ( n->{String r="";for(int i=0,j;i++<n;r+="\n")for(j=0;j<n;r+=j+++i&1);return r;}), por lo que +1 de mí. :)
Kevin Cruijssen

@KevinCruijssen Sí, todavía estaba esperando una respuesta en el espacio. No pensé en & tener mayor prioridad que% y & 1 ==% 2
PunPun1000

2

Carbón de leña, 8 bytes

UON10¶01

Pruébalo en línea! Explicación: Esto se traduce aproximadamente al siguiente código detallado (desafortunadamente, el desverbosificador está agregando un separador innecesario):

Oblong(InputNumber(), "10\n01");





2

R , 38 37 bytes

n=scan();(matrix(1:n,n,n,T)+1:n-1)%%2

Pruébalo en línea!

-1 byte gracias a Giuseppe

Aprovecha las reglas de reciclaje de R, en primer lugar al crear la matriz, y en segundo lugar al agregar 0: (n-1) a esa matriz.


Puede soltar un byte al deshacerse de él ty, en su lugar, construir la matriz con byrow=T, por ejemplo,(matrix(1:n,n,n,T)+1:n-1)%%2
Giuseppe

1
outer(1:n,1:n-1,"+")%%2es un buen número de bytes más corto :)
JAD

2

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

Pruebe en línea: http://swish.swi-prolog.org/p/BuabBPrw.pl

Produce una lista anidada, por lo que las reglas dicen:

  • t() es una palanca, hace que el 0 -> 1 y 1 -> 0.
  • r() tiene éxito para una fila individual, que es un chequeo recursivo en una fila de que solo son alternativas y ceros.
  • f()verifica recursivamente todas las filas, que tienen la longitud correcta, que son filas válidas r()y que cada fila comienza con un 0/1 diferente.
  • c(N,C) dice que C es un tablero de damas válido de tamaño N si el número de filas (listas anidadas) es N, y el ayudante f tiene éxito.

Casos de prueba: ingrese la descripción de la imagen aquí


2

C, 69 67 63 bytes

¡Gracias a @Kevin Cruijssen por guardar dos bytes y @ceilingcat por guardar cuatro bytes!

i,j;f(n){for(i=n;i--;puts(""))for(j=n;j;)printf("%d",j--+i&1);}

Pruébalo en línea!


Puede eliminar el espacio printf("%d ", ya que ese es otro método válido de salida.
Conor O'Brien

@ ConorO'Brien Sí, gracias.
Steadybox

Puede guardar dos bytes cambiando (j+++i)%2a j+++i&1para eliminar esos paréntesis.
Kevin Cruijssen

@ceilingcat Gracias!
Steadybox

1

QBIC , 19 bytes

[:|?[b|?(a+c+1)%2';

Explicación

[:|         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.






1

/// , 87 bytes + entrada

/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]

Pruébalo en línea! (entrada para 4)

Entrada unaria en 1s, 95 bytes + entrada

/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]|

Pruébalo en línea! (entrada para 8)

¿Como funciona esto?

  • Vy Dson para golf \/y //respectivamente.

  • /*/k#/y /&1/k#&//&|//separe la entrada en el equivalente de'k#'*len(input())

  • /#k//k#//&k/k&//\/k/k\//mover todos los ks al /r/S/bloque

  • Ss solo se utilizan para rellenar instancias donde ks vienen después de /s para que no se muevan a otro lugar, y Sluego se eliminan

  • #s luego se convierten en r\ns

  • La cadena de ks se convierte en una 1010...cadena alterna

  • Los r\ns se convierten en 1010...\ns

  • Cada par de 1010...\n1010\nse convierte en1010...\01010...;\n

  • Ya sea 0;o 1;están recortados (porque la 01010...cadena es demasiado larga en 1)


1

Mathematica, 28 bytes

Cos[+##/2Pi]^2&~Array~{#,#}&

Función pura que toma un entero positivo como entrada y devuelve una matriz 2D. Utiliza la función periódica cos² (πx / 2) para generar los 1s y 0s.

Para un poco más de diversión, ¿qué tal la solución de 32 bytes?

Sign@Zeta[1-+##]^2&~Array~{#,#}&

que utiliza las ubicaciones de los ceros triviales de la función zeta de Riemann.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.