Criar uma matriz quadriculado


26

Pegue um número inteiro positivo n como entrada e produza uma matriz quadriculado n por n que consiste em 1 e 0 .

O dígito superior esquerdo deve sempre ser 1 .

Casos de teste:

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

Os formatos de entrada e saída são opcionais. A saída da matriz como uma lista de listas é aceita.


Uma lista de strings está OK?
xnor

Sim, está bem.
Stewie Griffin


2
Seus exemplos mostram espaços entre números na mesma linha, isso é necessário, para parecer mais um quadrado?
BradC

@BradC não é necessário. A primeira abordagem aqui é válida.
Stewie Griffin

Respostas:



9

MATL , 5 bytes

:otYT

Experimente no MATL online!

Explicação

Considere a entrada 4como um exemplo.

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

Japonês , 6 bytes

ÆÇ+X v

Teste online! (Usa -Qsinalizador para facilitar a visualização)

Explicação

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

Uma coisa interessante a notar é que nãov é um "divisível por 2" embutido. Em vez disso, é um "divisível por X" embutido. No entanto, diferentemente da maioria dos idiomas do golfe, as funções de Japt não têm aridade fixa (elas podem aceitar qualquer número de argumentos corretos). Quando recebe 0 argumentos corretos, assume que você deseja e age exatamente como foi dado em vez de nada.v22



7

Haskell , 50 41 39 38 bytes

Agradecimentos a nimi e xnor por ajudar a remover um total de 9 10 bytes

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

Como alternativa, por mais um byte:

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

ou:

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

Provavelmente abaixo do ideal, mas uma abordagem limpa e direta.


concat.repeaté cycle: n!l=take n$cycle l. Se você vai pointfree ele economiza mais um byte: (!)=(.cycle).take.
N

Encantador! Eu sabia que havia uma base para isso, mas não conseguia lembrar o nome para a minha vida
Julian Wolf

Eu ia sugerir f n|r<-take n.cycle=r[r"10",r"01"]ou algo parecido. mas Haskell parece inferir o tipo errado para r? Funciona com digitação explícita f n|r<-take n.cycle::[a]->[a]=r[r"10",r"01"].
Xnor

1
@JulianWolf Haskell parece ter dificuldade para inferir tipos polimórficos
xnor

1
@ zbw Eu pensei que era esse o caso, mas o uso NoMonomorphismRestrictionnão ajudou. Nem fez Rank2Typesou RankNTypes. Você sabe o que está acontecendo lá?
xnor

5

APL (Dyalog) , 8 bytes

~2|⍳∘.+⍳

Experimente online!

Explicação

Vamos chamar o argumento n.

⍳∘.+⍳

Isso cria uma 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

Então 2|pega o módulo 2 da matriz (vetoriza) e depois ~pega o NOT do resultado.



4

JavaScript ES6, 55 54 51 46 bytes

Guardado 1 byte graças a @Neil

Guardado 2 bytes graças a @Arnauld

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

Experimente online!

Isso gera como uma matriz de matrizes. Os intervalos de JavaScript são bastante indecisos, mas eu uso o [...Array(n)]que gera uma matriz de tamanhon


Ainda é um byte mais curto para usar os parâmetros do índice:n=>[...Array(n)].map((_,i,a)=>a.map((_,j)=>(i+j+1)%2))
Neil

@ Neil huh, eu nunca pensei em usar o terceiro parâmetro no mapa, obrigado!
Downgoat

@Arnauld thanks! que me inspirou a economizar mais 5 bytes!
Downgoat

4

Retina , 33 30 bytes

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

Experimente online! Explicação: O primeiro estágio converte a entrada em unário usando 1s (convenientemente!) Enquanto o segundo estágio transforma o valor em um quadrado. O terceiro estágio inverte bits alternativos em cada linha, enquanto o último estágio inverte bits em linhas alternativas. Editar: salvou 3 bytes graças a @MartinEnder.


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

@MartinEnder Ah, não estou familiarizado $_, obrigado!
Neil

3

MATL , 7 bytes

:t!+2\~

Experimente online!

Explicação:

         % 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: comecei a resolver isso no MATL depois de postar o desafio.


Equivalente e mais curto::&+o~
Luis Mendo

1
Ainda aprendendo :-) Vou atualizar amanhã. Gostei da sua outra abordagem também :-)
Stewie Griffin

1
Também foi o que eu criei. E ei, você só usa o conjunto de instruções MATL puro , não aquelas Yinstruções modestas e modestas que o @LuisMendo usa.
Sanchises

@Sanchises Pesky, hein ? :-P
Luis Mendo

3

Braquilog , 15 bytes

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

Experimente online!

Explicação

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

Sim, ferramenta certa para o trabalho.


3

05AB1E , 9 7 bytes

-2 bytes graças a Emigna

LDÈD_‚è

Experimente online!

Explicação

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

Você pode cortar a »saída conforme a lista de listas estiver correta e também pode remover s.
Emigna

@Emigna Sim, obrigado!
kalsowerus

A explicação é um pouco irrelevante.
Erik the Outgolfer

3

Java (OpenJDK 8) , 80 77 bytes

-3 bytes graças 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;}

Experimente online!

Oh, olha, uma resposta java de comprimento semi-razoável, com muitos operadores divertidos.

lambda que recebe um int e retorna uma String. Funciona usando o número da linha e o número da coluna usando / e% para determinar qual valor deve ser, mod 2;

Ungolfed:

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

Você pode remover o espaço para salvar um byte. O desafio afirma que o formato de saída é flexível. Ah, e você pode salvar mais dois bytes alterando (i++/j+i%j)%2para, i++/j+i%j&1para não precisar desses parênteses. O que torna o total de 1 byte menor que minha solução aninhada para loop ( n->{String r="";for(int i=0,j;i++<n;r+="\n")for(j=0;j<n;r+=j+++i&1);return r;}), ficando com +1 de mim. :)
Kevin Cruijssen

@KevinCruijssen Sim, eu ainda estava esperando uma resposta no espaço. Eu não pensava em & ter precedência maior do que% e & 1 ==% 2
PunPun1000

2

Carvão, 8 bytes

UON10¶01

Experimente online! Explicação: Isso se traduz aproximadamente no código detalhado a seguir (infelizmente, atualmente o deverbosifier está anexando um separador desnecessário):

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





2

R , 38 bytes 37

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

Experimente online!

-1 byte graças a Giuseppe

Aproveita as regras de reciclagem de R, primeiro ao criar a matriz e depois ao adicionar 0: (n-1) a essa matriz.


Você pode eliminar um byte, livrando-se do te construindo a matriz com byrow=T, ou seja, (matrix(1:n,n,n,T)+1:n-1)%%2
Giuseppe

1
outer(1:n,1:n-1,"+")%%2é bastante alguns bytes mais curto :)
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).

Experimente online - http://swish.swi-prolog.org/p/BuabBPrw.pl

Como gera uma lista aninhada, as regras dizem:

  • t() é uma alternância, cria 0 -> 1 e 1 -> 0.
  • r() obtém êxito em uma linha individual, que é uma verificação recursiva em uma linha, indicando que são apenas zeros e uns alternativos.
  • f()verifica recursivamente todas as linhas, se têm o comprimento certo, se são linhas válidas r()e se cada linha começa com um 0/1 diferente.
  • c(N,C) diz que C é um tabuleiro de damas válido do tamanho N se o número de linhas (listas aninhadas) for N e o ajudante f tiver êxito.

Casos de teste: insira a descrição da imagem aqui


2

C, 69 67 63 bytes

Agradecemos a @Kevin Cruijssen por salvar dois bytes e @ceilingcat por salvar quatro bytes!

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

Experimente online!


Você pode remover o espaço printf("%d ", pois esse é outro método válido de saída.
Conor O'Brien

@ ConorO'Brien Sim, obrigado.
Steadybox

Você pode salvar dois bytes alterando (j+++i)%2para j+++i&1para remover esses parênteses.
Kevin Cruijssen

@ceilingcat Thanks!
Steadybox

1

QBIC , 19 bytes

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

Explicação

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

Experimente online! (entrada para 4)

Entrada unária em 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]|

Experimente online! (entrada para 8)

Como é que isso funciona?

  • Ve Dsão para o golfe \/e, //respectivamente.

  • /*/k#/e /&1/k#&//&|//separar a entrada no equivalente a'k#'*len(input())

  • /#k//k#//&k/k&//\/k/k\//mover todos os ks para o /r/S/bloco

  • Ss são usados ​​apenas para proteger instâncias em que ks vêm depois de /s para que não sejam movidos para outro lugar e os Ss são removidos

  • #s são então transformados em r\ns

  • A sequência de ks é transformada em uma 1010...sequência alternada

  • Os r\ns são transformados em 1010...\ns

  • Cada par de 1010...\n1010\né transformado em1010...\01010...;\n

  • Quer 0;ou 1;são cortados fora (porque a 01010...cadeia é muito longa por 1)


1

Mathematica, 28 bytes

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

Função pura, recebendo um número inteiro positivo como entrada e retornando uma matriz 2D. Usa a função periódica cos² (πx / 2) para gerar os 1s e 0s.

Para um pouco mais de diversão, que tal a solução de 32 bytes

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

que usa os locais dos zeros triviais da função Riemann zeta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.