Utwórz macierz szachownicy


26

Weź jako liczbę całkowitą dodatnią n i wyślij macierz szachownicy n-na-n składającą się z 1 i 0 .

Lewa górna cyfra powinna zawsze wynosić 1 .

Przypadki testowe:

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

Formaty wejściowe i wyjściowe są opcjonalne. Wyprowadzanie macierzy jako listy list jest akceptowane.


Czy lista ciągów jest OK?
xnor

Tak, w porządku.
Stewie Griffin,


2
Twoje przykłady pokazują spacje między liczbami w tym samym rzędzie, czy jest to wymagane, aby wyglądać bardziej jak kwadrat?
BradC

@BradC nie jest wymagane. Pierwsze podejście tutaj jest poprawne.
Stewie Griffin,

Odpowiedzi:



9

MATL , 5 bajtów

:otYT

Wypróbuj w MATL online!

Wyjaśnienie

Rozważ dane wejściowe 4jako przykład.

:    % 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 bajtów

ÆÇ+X v

Przetestuj online! (Wykorzystuje -Qflagę do łatwiejszej wizualizacji)

Wyjaśnienie

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

Interesującą rzeczą do odnotowania jest to, że niev jest to wbudowane „podzielne przez 2”. Zamiast tego jest to funkcja „podzielna przez X”. Jednak w przeciwieństwie do większości języków golfowych, funkcje Japt nie mają ustalonej arity (mogą przyjmować dowolną liczbę poprawnych argumentów). Gdy podano 0 poprawnych argumentów, vzakłada się, że chciałeś 2, i działa dokładnie tak, jak podano, 2zamiast niczego.



7

Haskell , 50 41 39 38 bajtów

Podziękowania dla nich i xnor za pomoc w goleniu w sumie 9 10 bajtów

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

Alternatywnie, dla jednego bajtu więcej:

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

lub:

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

Prawdopodobnie nieoptymalne, ale czyste, proste podejście.


concat.repeatjest cycle: n!l=take n$cycle l. Jeśli pójdziesz pointfree oszczędza jeszcze jeden bajt: (!)=(.cycle).take.
nimi

Śliczny! Wiedziałem, że jest do tego wbudowany, ale nie pamiętałem nazwy mojego życia
Julian Wolf,

Chciałem zasugerować f n|r<-take n.cycle=r[r"10",r"01"]lub coś podobnego. ale Haskell wydaje się wnioskować niewłaściwy typ r? Działa z wyraźnym pisaniem f n|r<-take n.cycle::[a]->[a]=r[r"10",r"01"].
xnor

1
@JulianWolf Haskell wydaje się mieć problem z
wnioskiem o

1
@zbw Myślałem, że tak jest, ale używanie NoMonomorphismRestrictionnie pomogło. Ani nie Rank2Typeslub RankNTypes. Czy wiesz co się tam dzieje?
xnor

5

APL (Dyalog) , 8 bajtów

~2|⍳∘.+⍳

Wypróbuj online!

Wyjaśnienie

Nazwijmy argument n.

⍳∘.+⍳

To tworzy matrycę

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

Następnie 2|pobiera moduł 2 macierzy (wektoryzuje), po czym ~przyjmuje NOT wyniku.



4

JavaScript ES6, 55 54 51 46 bajtów

Zapisano 1 bajt dzięki @Neil

Zaoszczędzono 2 bajty dzięki @Arnauld

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

Wypróbuj online!

Dane wyjściowe są tablicą tablic. Zakresy JavaScript są dość niewygodne, ale używam, [...Array(n)]który generuje tablicę rozmiarówn


Ciągle krótszy jest bajt, aby użyć parametrów indeksu:n=>[...Array(n)].map((_,i,a)=>a.map((_,j)=>(i+j+1)%2))
Neil

@Neil huh, nigdy nie myślałem o użyciu trzeciego parametru na mapie, dzięki!
Downgoat

@Arnauld dzięki! zainspirowało mnie to do zaoszczędzenia 5 kolejnych bajtów!
Downgoat

4

Siatkówka , 33 30 bajtów

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

Wypróbuj online! Objaśnienie: Pierwszy stopień przekształca dane wejściowe w jednoargumentowe za pomocą 1s (wygodnie!), Podczas gdy drugi stopień przekształca wartość w kwadrat. Trzeci stopień odwraca bity w każdym rzędzie, podczas gdy ostatni stopień odwraca bity w naprzemiennych rzędach. Edycja: Zapisano 3 bajty dzięki @MartinEnder.


$`1$'jest po prostu $_.
Martin Ender

@MartinEnder Ah, nie jestem zaznajomiony $_, dzięki!
Neil

3

MATL , 7 bajtów

:t!+2\~

Wypróbuj online!

Wyjaśnienie:

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

Uwaga: zacząłem rozwiązywać to w MATL po opublikowaniu wyzwania.


Odpowiednik i krótszy::&+o~
Luis Mendo

1
Wciąż się uczę :-) Zaktualizuję jutro. Podobało mi się również twoje inne podejście :-)
Stewie Griffin

1
Z tym też wymyśliłem. I hej, używasz tylko czystego zestawu instrukcji MATL, a nie tych nieznośnych Yinstrukcji zmodyfikowanych, których używa @LuisMendo.
Sanchises

@Sanchises Pesky, co ? :-P
Luis Mendo

3

Brachylog , 15 bajtów

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

Wypróbuj online!

Wyjaśnienie

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 bajtów

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

Tak, odpowiednie narzędzie do pracy.


3

05AB1E , 9 7 bajtów

-2 bajty dzięki Emignie

LDÈD_‚è

Wypróbuj online!

Wyjaśnienie

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

Możesz wyciąć, »ponieważ dane wyjściowe listy list są w porządku, a także możesz je usunąć s.
Emigna

@Emigna Tak, dzięki!
kalsowerus

Wyjaśnienie jest nieco nieistotne.
Erik the Outgolfer,

3

Java (OpenJDK 8) , 80 77 bajtów

-3 bajty dzięki 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;}

Wypróbuj online!

Och, spójrz, odpowiedź w rozsądnej długości, z dużą ilością zabawnych operatorów.

lambda, która przyjmuje int i zwraca String. Działa przy użyciu numeru wiersza i numeru kolumny przy użyciu / i% w celu ustalenia, która wartość powinna być, mod 2;

Nie golfowany:

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

Możesz usunąć miejsce, aby zapisać bajt. Wyzwanie stwierdza, że ​​format wyjściowy jest elastyczny. Aha, możesz zaoszczędzić jeszcze dwa bajty, zmieniając (i++/j+i%j)%2na, i++/j+i%j&1więc nie będziesz potrzebować tych nawiasów. Co sprawia, że ​​całkowity 1 bajt jest krótszy niż moje zagnieżdżone rozwiązanie for-loop ( n->{String r="";for(int i=0,j;i++<n;r+="\n")for(j=0;j<n;r+=j+++i&1);return r;}), więc daje +1 ode mnie. :)
Kevin Cruijssen

@KevinCruijssen Tak, wciąż czekałem na odpowiedź w kosmosie. Nie myślałem o wyższym priorytecie niż% i & 1 ==% 2
PunPun1000

2

Węgiel drzewny, 8 bajtów

UON10¶01

Wypróbuj online! Objaśnienie: To z grubsza przekłada się na następujący pełny kod (niestety deverbosifier obecnie dołącza niepotrzebny separator):

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





2

R , 38 37 bajtów

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

Wypróbuj online!

-1 bajt dzięki Giuseppe

Korzysta z reguł recyklingu R, po pierwsze, podczas tworzenia macierzy, a po drugie, dodając 0: (n-1) do tej macierzy.


Możesz usunąć bajt, pozbywając się ti zamiast tego konstruując macierz byrow=T, tj.(matrix(1:n,n,n,T)+1:n-1)%%2
Giuseppe

1
outer(1:n,1:n-1,"+")%%2jest o kilka bajtów krótszy :)
JAD

2

Swi-Prolog, 142 bajty.

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

Wypróbuj online - http://swish.swi-prolog.org/p/BuabBPrw.pl

Wyświetla listę zagnieżdżoną, więc reguły mówią:

  • t() jest przełącznikiem, powoduje, że 0 -> 1 i 1 -> 0.
  • r() udaje się dla pojedynczego wiersza, który jest rekurencyjnym sprawdzaniem w dół wiersza, że ​​jest to tylko jeden zera i zera.
  • f()rekurencyjnie sprawdza wszystkie wiersze, czy mają odpowiednią długość, czy są poprawnymi wierszami r()i czy każdy wiersz zaczyna się od różnej wartości 0/1.
  • c(N,C) mówi, że C jest prawidłową szachownicą o rozmiarze N, jeśli liczba wierszy (list zagnieżdżonych) wynosi N, a pomocnik f się powiedzie.

Przypadki testowe: wprowadź opis zdjęcia tutaj


2

C 69 69 63 bajtów

Dzięki @Kevin Cruijssen za uratowanie dwóch bajtów i @ceilingcat za uratowanie czterech bajtów!

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

Wypróbuj online!


Możesz usunąć to miejsce printf("%d ", ponieważ jest to kolejna poprawna metoda wyniku.
Conor O'Brien

@ ConorO'Brien Tak, dziękuję.
Steadybox

Można zapisać dwa bajty, zmieniając (j+++i)%2się j+++i&1w celu usunięcia tych nawiasów.
Kevin Cruijssen

@ceilingcat Thanks!
Steadybox

1

QBIC , 19 bajtów

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

Wyjaśnienie

[:|         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 bajtów + wejście

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

Wypróbuj online! (wejście dla 4)

Jednostkowe wejście ws 1, 95 bajtów + wejście

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

Wypróbuj online! (wejście dla 8)

Jak to działa?

  • Vi Dsą do gry w golfa \/i //odpowiednio.

  • /*/k#/i /&1/k#&//&|//rozdziel dane wejściowe na odpowiednik'k#'*len(input())

  • /#k//k#//&k/k&//\/k/k\//przesuń wszystkie ks do /r/S/bloku

  • Ss są po prostu używane do wypełniania instancji, po których następuje kpo /s, aby nie zostały przeniesione gdzie indziej, a Snastępnie są usuwane

  • #s są następnie przekształcane w r\ns

  • Ciąg ks jest zamieniany na naprzemienny 1010...ciąg

  • Do r\ns zamieniają się 1010...\ns

  • Każda para 1010...\n1010\nzamienia się w1010...\01010...;\n

  • Albo 0;albo 1;są obcięte (ponieważ 01010...łańcuch jest za długi o 1)


1

Mathematica, 28 bajtów

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

Czysta funkcja przyjmująca dodatnią liczbę całkowitą jako dane wejściowe i zwracająca tablicę 2D. Używa funkcji okresowej cos² (πx / 2) do generowania 1 i 0.

Dla trochę więcej zabawy, a może 32-bajtowe rozwiązanie

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

który używa lokalizacji trywialnych zer funkcji zeta Riemanna.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.