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.


Apakah daftar string oke?
xnor

Ya itu tidak masalah.
Stewie Griffin


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:



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]

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.



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.


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.



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


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.


$`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.


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

3

Clojure, 36 byte

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

Yay, alat yang tepat untuk pekerjaan itu.


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

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

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");





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.


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


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!


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.






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)


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.