Buat matriks kotak-kotak

26

Ambil bilangan bulat positif n sebagai input, dan hasilkan matriks kotak - kotak n-oleh-n yang terdiri dari 1 dan 0 .

Digit kiri atas harus selalu 1 .

Kasus uji:

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

Format input dan output adalah opsional. Mengeluarkan matriks sebagai daftar daftar diterima.

Stewie Griffin
sumber
Apakah daftar string oke?
xnor
Ya itu tidak masalah.
Stewie Griffin
1
Terkait .
Gelas kimia
2
Contoh Anda menunjukkan spasi di antara angka-angka pada baris yang sama, apakah itu diperlukan, agar lebih terlihat seperti kotak?
BradC
@BradC tidak diperlukan. Pendekatan pertama di sini valid.
Stewie Griffin

Jawaban:

12

Jelly , 4 byte

52 detik!

+€ḶḂ

Cobalah online!

Biarawati Bocor
sumber
7
"52 detik!" seperti saya tidak terbiasa ...
Erik the Outgolfer
5
Apakah Anda akan memiliki, seperti, pager, yang Anda pakai 24/7 untuk tantangan PPCG baru?
Magic Gurita Guci
@carusocomputing Mereka yang memiliki koneksi internet lebih cepat biasanya yang beruntung yang akan menang.
Erik the Outgolfer
9

MATL , 5 byte

:otYT

Cobalah di MATL online!

Penjelasan

Pertimbangkan input 4sebagai contoh.

:    % 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]
Luis Mendo
sumber
7

Japt , 6 byte

ÆÇ+X v

Uji secara online! (Menggunakan -Qbendera untuk memudahkan visualisasi)

Penjelasan

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

Suatu hal yang menarik untuk dicatat adalah bahwa vitu bukan built-in "habis dibagi 2". Alih-alih, ini built-in "habis dibagi X". Namun, tidak seperti kebanyakan bahasa golf, fungsi Japt tidak memiliki arity tetap (mereka dapat menerima sejumlah argumen kanan). Ketika diberi 0 argumen kanan, vanggap Anda inginkan 2, dan bertindaklah persis seperti itu diberikan, 2bukan apa-apa.

Produksi ETH
sumber
7

V , 16 , 15 byte

Ài10À­ñÙxñÎÀlD

Cobalah online!

Hexdump:

00000000: c069 3130 1bc0 adf1 d978 f1ce c06c 44    .i10.....x...lD
DJMcMayhem
sumber
7

Haskell , 50 41 39 38 byte

Terima kasih kepada nimi dan xnor karena telah membantu mengurangi total 9 10 byte

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

Bergantian, untuk satu byte lagi:

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

atau:

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

Mungkin suboptimal, tetapi pendekatan yang bersih dan langsung.

Julian Wolf
sumber
concat.repeatadalah cycle: n!l=take n$cycle l. Jika Anda pergi pointfree menghemat satu lagi byte: (!)=(.cycle).take.
nimi
Menyenangkan! Saya tahu ada builtin untuk itu, tetapi tidak bisa mengingat nama untuk kehidupan saya
Julian Wolf
Saya akan menyarankan f n|r<-take n.cycle=r[r"10",r"01"]atau serupa. tapi Haskell tampaknya menyimpulkan tipe yang salah r? Ini bekerja dengan mengetik secara eksplisit f n|r<-take n.cycle::[a]->[a]=r[r"10",r"01"].
xnor
1
@JulianWolf Haskell tampaknya memiliki masalah dalam menyimpulkan tipe polimorfik
xnor
1
@ zbw Saya pikir ini masalahnya tetapi menggunakan NoMonomorphismRestrictiontidak membantu. Tidak juga Rank2Typesatau RankNTypes. Apakah Anda tahu apa yang terjadi di sana?
xnor
5

APL (Dyalog) , 8 byte

~2|⍳∘.+⍳

Cobalah online!

Penjelasan

Mari kita sebut argumennya n.

⍳∘.+⍳

Ini menciptakan sebuah matriks

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

Kemudian 2|ambil modulo 2 dari matriks (itu vectorises) setelah yang ~mengambil TIDAK hasil.

Kritixi Lithos
sumber
4

Mathematica, 25 byte

1-Plus~Array~{#,#}~Mod~2&
Martin Ender
sumber
4

JavaScript ES6, 55 54 51 46 byte

Disimpan 1 byte berkat @Neil

Disimpan 2 byte berkat @Arnauld

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

Cobalah online!

Output ini sebagai array array. Rentang JavaScript sangat tidak biasa tapi saya menggunakan [...Array(n)]yang menghasilkan array ukurann

Downgoat
sumber
Ini masih satu byte lebih pendek untuk menggunakan parameter indeks:n=>[...Array(n)].map((_,i,a)=>a.map((_,j)=>(i+j+1)%2))
Neil
@Neil ya, saya tidak pernah berpikir untuk menggunakan parameter ketiga di peta, terima kasih!
Downgoat
@Arnauld terima kasih! yang menginspirasi saya untuk menghemat 5 byte lebih banyak!
Downgoat
4

Retina , 33 30 byte

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

Cobalah online! Penjelasan: Tahap pertama mengubah input menjadi unary menggunakan 1s (dengan mudah!) Sedangkan tahap kedua mengubah nilai menjadi kotak. Tahap ketiga membalikkan bit-bit alternatif pada setiap baris, sedangkan stage terakhir membalikkan bit-bit pada baris-baris alternatif. Sunting: Disimpan 3 byte berkat @MartinEnder.

Neil
sumber
$`1$'hanya $_.
Martin Ender
@ MartinEnder Ah, saya tidak terbiasa dengan $_, terima kasih!
Neil
3

MATL , 7 byte

:t!+2\~

Cobalah online!

Penjelasan:

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

Catatan: Saya mulai memecahkan ini di MATL setelah saya memposting tantangan.

Stewie Griffin
sumber
Setara, dan lebih pendek::&+o~
Luis Mendo
1
Masih belajar :-) Saya akan memperbarui besok. Saya juga menyukai pendekatan Anda yang lain :-)
Stewie Griffin
1
Inilah yang saya hasilkan juga. Dan hei, Anda hanya menggunakan set instruksi MATL murni , bukan Yinstruksi yang dimodifikasi sial yang digunakan oleh @LuisMendo.
Sanchises
@Sanchises Pesky, ya ? :-P
Luis Mendo
3

Brachylog , 15 byte

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

Cobalah online!

Penjelasan

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]]
Fatalisasi
sumber
3

Clojure, 36 byte

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

Yay, alat yang tepat untuk pekerjaan itu.

NikoNyrh
sumber
3

05AB1E , 9 7 byte

-2 byte terima kasih kepada Emigna

LDÈD_‚è

Cobalah online!

Penjelasan

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
kalsowerus
sumber
Anda dapat memotong »output sebagai daftar daftar tidak apa-apa dan Anda juga dapat menghapus s.
Emigna
@Emigna Yap, terima kasih!
kalsowerus
Penjelasannya agak tidak relevan.
Erik the Outgolfer
3

Java (OpenJDK 8) , 80 77 byte

-3 byte terima kasih kepada 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;}

Cobalah online!

Oh, lihat, jawaban java yang setengah masuk akal, dengan banyak operator yang menyenangkan.

lambda yang mengambil int dan mengembalikan sebuah String. Bekerja dengan menggunakan nomor baris dan nomor kolom menggunakan / dan% untuk menentukan nilai yang seharusnya, mod 2;

Tidak Disatukan:

j->{
    String s="1";
    for(int i=1; i<j*j; s+= i++/j + i%j&1 )
        s+= 1>i%j ? "\n" : "";
    return s;
}
PunPun1000
sumber
Anda dapat menghapus ruang untuk menyimpan byte. Tantangannya menyatakan format output fleksibel. Oh, dan Anda dapat menyimpan dua byte lagi dengan mengubah (i++/j+i%j)%2ke i++/j+i%j&1sehingga Anda tidak perlu kurung tersebut. Yang membuat total 1 byte lebih pendek dari solusi nested for-loop saya ( n->{String r="";for(int i=0,j;i++<n;r+="\n")for(j=0;j<n;r+=j+++i&1);return r;}), jadi +1 dari saya. :)
Kevin Cruijssen
@KevinCruijssen Ya saya masih menunggu tanggapan di ruang. Saya tidak memikirkan & memiliki prioritas lebih tinggi dari% dan & 1 ==% 2
PunPun1000
2

Arang, 8 byte

UON10¶01

Cobalah online! Penjelasan: Ini diterjemahkan secara kasar ke kode verbose berikut (sayangnya deverbosifier saat ini menambahkan pemisah yang tidak perlu):

Oblong(InputNumber(), "10\n01");
Neil
sumber
2

Pyth , 9 byte

VQm%+hdN2

Coba ini!

solusi 9 byte lainnya:

mm%+hdk2Q

Cobalah!

KarlKastor
sumber
2

Mathematica, 23 byte

ToeplitzMatrix@#~Mod~2&
alephalpha
sumber
2

R , 38 37 byte

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

Cobalah online!

-1 byte terima kasih kepada Giuseppe

Mengambil keuntungan dari aturan daur ulang R, pertama saat membuat matriks, dan kedua saat menambahkan 0: (n-1) ke matriks itu.

pengguna2390246
sumber
Anda dapat menjatuhkan byte dengan menyingkirkan tdan bukannya membangun matriks dengan byrow=T, yaitu,(matrix(1:n,n,n,T)+1:n-1)%%2
Giuseppe
1
outer(1:n,1:n-1,"+")%%2lebih pendek beberapa byte :)
JAD
2

Swi-Prolog, 142 byte.

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

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

Ini menghasilkan daftar bersarang, jadi aturannya mengatakan:

  • t() adalah toggle, itu membuat 0 -> 1 dan 1 -> 0.
  • r() berhasil untuk baris individual, yang merupakan pemeriksaan rekursif ke baris yang merupakan baris pengganti dan nol saja.
  • f()secara rekursif memeriksa semua baris, bahwa mereka adalah panjang yang tepat, bahwa mereka adalah baris yang valid dengan r()dan bahwa setiap baris dimulai dengan 0/1 yang berbeda.
  • c(N,C) mengatakan bahwa C adalah kotak-kotak yang valid dari ukuran N jika jumlah baris (daftar bersarang) adalah N, dan helper f berhasil.

Kasus uji: masukkan deskripsi gambar di sini

TessellatingHeckler
sumber
2

C, 69 67 63 byte

Terima kasih kepada @Kevin Cruijssen karena telah menghemat dua byte dan @ceilingcat karena telah menghemat empat byte!

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

Cobalah online!

Steadybox
sumber
Anda dapat menghapus spasi di printf("%d ", karena itu metode output yang valid.
Conor O'Brien
@ ConorO'Brien Ya, terima kasih.
Steadybox
Anda dapat menyimpan dua byte dengan mengubah (j+++i)%2ke j+++i&1untuk menghapus tanda kurung tersebut.
Kevin Cruijssen
@ceilingcat Terima kasih!
Steadybox
1

QBIC , 19 byte

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

Penjelasan

[:|         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.
steenbergh
sumber
1

PHP , 56 byte

Keluaran sebagai string

for(;$i<$argn**2;)echo++$i%2^$n&1,$i%$argn?"":"
".!++$n;

Cobalah online!

PHP , 66 byte

Output sebagai array 2 D

for(;$i<$argn**2;$i%$argn?:++$n)$r[+$n][]=++$i%2^$n&1;print_r($r);

Cobalah online!

Jörg Hülsermann
sumber
1

CJam , 17 byte

{_[__AAb*<_:!]*<}

Cobalah online!

Mengembalikan daftar (tautan TIO telah diformat keluaran).

Erik the Outgolfer
sumber
out-golfed
Esolanging Buah
@ Challenger5 Maaf, Anda tidak dapat mengungguli dengan jawaban yang dihapus.
Erik the Outgolfer
1

/// , 87 byte + input

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

Cobalah online! (masukan untuk 4)

Input unary dalam 1s, 95 byte + input

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

Cobalah online! (masukan untuk 8)

Bagaimana cara kerjanya?

  • Vdan Duntuk golf \/dan //masing - masing.

  • /*/k#/dan /&1/k#&//&|//pisahkan input menjadi setara dengan'k#'*len(input())

  • /#k//k#//&k/k&//\/k/k\//pindahkan semua kke /r/S/blok

  • Ss hanya digunakan untuk membuat instance dari mana ksetelahnya /sehingga mereka tidak dipindahkan ke tempat lain, dan Skemudian dihapus

  • #s kemudian diubah menjadi r\ns

  • String ks berubah menjadi 1010...string bergantian

  • The r\ns berubah menjadi 1010...\ns

  • Setiap pasangan 1010...\n1010\ndiubah menjadi1010...\01010...;\n

  • Baik 0;atau 1;dipangkas (karena 01010...string terlalu panjang 1)

boboquack
sumber
1

Mathematica, 28 byte

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

Fungsi murni mengambil bilangan bulat positif sebagai input dan mengembalikan array 2D. Menggunakan fungsi periodik cos² (πx / 2) untuk menghasilkan 1s dan 0s.

Untuk sedikit lebih menyenangkan, bagaimana dengan solusi 32-byte

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

yang menggunakan lokasi nol sepele dari fungsi Riemann zeta.

Greg Martin
sumber