Sebuah matriks bolak tanda adalah n
dengan n
matriks yang terdiri dari angka -1, 0, 1, sehingga:
- Jumlah setiap baris dan kolom adalah 1
- Entri bukan nol di setiap baris dan kolom bergantian masuk
Matriks-matriks ini menggeneralisasi matriks permutasi, dan jumlah matriks seperti itu untuk suatu waktu tertentu n
menarik. Mereka terjadi secara alami selama metode kondensasi Dodgson menghitung determinan matriks (dinamai Charles Dodgson, lebih dikenal sebagai Lewis Carroll).
Berikut adalah beberapa contoh dari 4 oleh 4 matriks tanda bergantian:
0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0 0 1 -1 1 1 0 -1 1
1 0 0 0 0 1 -1 1 1 -1 1 0 0 1 0 0
0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0
Dan berikut adalah beberapa contoh dari 4 oleh 4 matriks yang tidak bergantian matriks tanda:
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 -1 (last row and last column don't add to 1)
0 0 0 1
1 0 0 0
-1 1 1 0
1 0 0 0 (third row does not alternate correctly)
Program atau fungsi Anda akan diberikan n
oleh n
matriks ( n >= 1
) dari -1s, 0s dan 1s - output nilai yang benar jika matriks yang diberikan adalah matriks tanda bolak-balik, jika tidak output nilai palsu.
Ini adalah kode-golf , jadi tujuannya adalah untuk meminimalkan jumlah byte yang digunakan.
Uji kasus
Kasing uji berikut diberikan dalam format daftar 2D seperti Python.
Benar:
[[1]]
[[1,0],[0,1]]
[[0,1],[1,0]]
[[0,1,0],[0,0,1],[1,0,0]]
[[0,1,0],[1,-1,1],[0,1,0]]
[[0,1,0,0],[0,0,1,0],[1,0,0,0],[0,0,0,1]]
[[1,0,0,0],[0,0,1,0],[0,1,-1,1],[0,0,1,0]]
[[0,0,1,0],[0,1,-1,1],[1,-1,1,0],[0,1,0,0]]
[[0,0,1,0],[1,0,-1,1],[0,1,0,0],[0,0,1,0]]
[[0,0,1,0,0],[0,1,-1,1,0],[1,-1,1,0,0],[0,1,0,-1,1],[0,0,0,1,0]]
[[0,0,1,0,0,0,0,0],[1,0,-1,0,1,0,0,0],[0,0,0,1,-1,0,0,1],[0,0,1,-1,1,0,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,0,0],[0,1,-1,1,0,0,0,0],[0,0,1,0,0,0,0,0]]
[[0,0,0,0,1,0,0,0],[0,0,1,0,-1,1,0,0],[0,0,0,1,0,0,0,0],[1,0,0,-1,1,-1,1,0],[0,1,-1,1,-1,1,0,0],[0,0,0,0,1,0,0,0],[0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1]]
Falsy:
[[0]]
[[-1]]
[[1,0],[0,0]]
[[0,0],[0,1]]
[[-1,1],[1,0]]
[[0,1],[1,-1]]
[[0,0,0],[0,0,0],[0,0,0]]
[[0,1,0],[1,0,1],[0,1,0]]
[[-1,1,1],[1,-1,1],[1,1,-1]]
[[0,0,1],[1,0,0],[0,1,-1]]
[[0,1,0,0],[0,0,0,1],[1,0,0,0],[0,0,1,-1]]
[[0,0,1,0],[0,0,1,0],[1,0,-1,1],[0,1,0,0]]
[[0,0,0,1],[1,0,0,0],[-1,1,1,0],[1,0,0,0]]
[[1,0,1,0,-1],[0,1,0,0,0],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,0,1]]
[[0,0,1,0,0],[0,1,-1,1,0],[1,-1,1,0,0],[0,1,1,-1,0],[0,0,-1,1,1]]
[[0,-1,0,1,1],[1,-1,1,-1,1],[0,1,1,0,-1],[1,1,-1,1,-1],[-1,1,0,0,1]]
[[0,0,1,0,0,0,0,0],[1,0,1,0,1,0,0,0],[0,0,0,1,-1,0,0,1],[0,0,1,-1,1,0,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,0,0],[0,1,-1,1,0,0,0,0],[0,0,1,0,0,0,0,0]]
Jawaban:
Retina ,
62585653 byteHitungan byte mengasumsikan penyandian ISO 8859-1, dan
\t
harus diganti dengan tab aktual (0x09 yang akan diubah menjadi spasi oleh SE sebaliknya).Format input adalah matriks di mana setiap kolom menggunakan tiga karakter rata kanan, misalnya:
Output bisa berupa
0
(falsy) atau1
(benar).Suite uji.(Beberapa baris pertama mengubah format input dan membiarkan Retina menjalankan beberapa test case sekaligus.)
Penjelasan
Untungnya, inputnya adalah matriks persegi: mentransposisi kotak hampir bisa dilakukan di Retina, sedangkan transposisi persegi panjang adalah rasa sakit besar.
Kami mulai dengan menambahkan tab, seluruh input lagi (menggunakan awalan
$`
) dan kemudian linefeed di akhir (menggunakan Retina's alias¶
). Kami menggunakan tab untuk memisahkan dua salinan sehingga kami dapat membedakan di antara mereka ketika kami mentranspos salah satu dari mereka, dan dengan menggunakan karakter spasi putih kami dapat menyimpan beberapa byte nanti.Ini adalah bit yang paling sulit: transpos salinan pertama dari matriks. Idenya adalah untuk mencocokkan sel dalam salinan pertama dan kemudian menyortirnya (secara stabil) dengan posisi horizontal. Kami mencocokkan sel dengan
...
(karena sel selalu tiga karakter) dan kemudian mengukur posisi horizontal dengan(.+)
di dalam tampilan. Kemudian, untuk memastikan bahwa kami hanya memindahkan salinan pertama, kami memeriksa bahwa kami dapat mencapai awal string tanpa bergerak melewati tab.Anda mungkin memperhatikan bahwa ini juga akan cocok dengan beberapa string tiga byte (yang bahkan tidak sejajar dengan sel) di baris pertama dari salinan kedua, karena
.+
dapat melewati tab. Namun, ini bukan masalah karena posisi horizontal dari pertandingan ini benar-benar lebih besar daripada yang ada di dalam salinan pertama, sehingga pertandingan ini tetap di posisi mereka.Sisanya cukup sederhana:
Kami menghapus spasi dan nol dari input.
Dan akhirnya kami memeriksa bahwa seluruh input terdiri dari baris-baris yang diakhiri spasi-putih dari bentuk
1(-11)*
, yaitu urutan bergantian dari1
dan-1
yang dimulai dan diakhiri dengan1
(karena kalau tidak, jumlah itu tidak berarti1
).sumber
Jelly, 15 byte
Cobalah online!
sumber
Pyth, 16 byte
Cobalah online: Demonstrasi atau Test Suite
Penjelasan:
sumber
Jelly , 11 byte
Mengembalikan 1 untuk matriks tanda bergantian, 0 sebaliknya. Cobalah online! atau verifikasi semua kasus uji .
Latar Belakang
Mengabaikan nol, setiap baris dan kolom harus terdiri dari pola (1, -1) * 1 , yaitu kejadian bergantian 1 dan -1 , dimulai dan diakhiri dengan 1 (jadi jumlahnya adalah 1 ).
Untuk memverifikasi hal ini, kami mengambil larik semua baris dan kolom, dan bergabung dengan mereka menggunakan -1 sebagai pemisah. Karena semua titik akhir adalah 1 's, array datar yang dihasilkan memenuhi pola (1, -1) * 1 jika dan hanya jika baris dan kolom lakukan.
Untuk pengujian yang sebenarnya, kami menghitung jumlah kumulatif array. Untuk matriks tanda bolak-balik, hasilnya adalah array 0 dan 1 yang berakhir dengan 1 .
Kami membalikkan jumlah kumulatif dan mendeduplikasinya, menjaga urutan kejadian awal dari semua elemen unik. Untuk input yang benar, hasilnya adalah daftar [1, 0] .
Untuk menghasilkan Boolean yang sesuai, kami mengonversi jumlah kumulatif yang digandakan dari biner ke integer dan menguji apakah hasilnya 2 .
Bagaimana itu bekerja
sumber
MATL,
18161513 byte3 byte disimpan berkat @Luis
Solusi ini menerima array 2D sebagai input dan akan menampilkan array yang benar atau salah . Penting untuk dicatat bahwa dalam MATL, array yang benar terdiri dari semua elemen non-nol sedangkan hasil falsey memiliki setidaknya satu elemen nol. Ini adalah demonstrasi lain dari array yang benar / palsu .
Cobalah secara Online
Versi modifikasi untuk menunjukkan semua kasus uji
Penjelasan
sumber
Julia, 36 byte
Cobalah online!
sumber
JavaScript (ES6),
112100 byteRatakan larik dan transpos ke dalam string, lalu (abaikan
0
s) memeriksa pola1-11...1-11
di setiap string.Sunting: Disimpan 12 byte berkat @PeterTaylor.
sumber
-11-1...-11-1
karena karena entri berganti dan memiliki jumlah positif, pasti ada lebih1
dari satu-1
, sehingga polanya harus1-11...1-11
.Python 2,
6360 byteInput adalah daftar tupel.
Ini diakhiri dengan kode keluar 0 untuk matriks tanda bergantian dan kode keluar 1 sebaliknya. Inilah yang benar dan salah dilakukan, dan - seperti yang ditunjukkan di bagian verifikasi - memang bisa digunakan sebagai kondisi di, misalnya, skrip Bash.
Verifikasi
test-cases.txt
test-suite.sh
Keluaran
Bagaimana itu bekerja
Mengabaikan nol, setiap baris dan kolom harus terdiri dari pola (1, -1) * 1 , yaitu kejadian bergantian 1 dan -1 , dimulai dan diakhiri dengan 1 (jadi jumlahnya adalah 1 ).
Untuk memverifikasi hal ini, kami zip / mengubah matriks input M , menambahkan hasilnya M (sekarang terdiri dari daftar baris dan kolom), dan menambahkan -1 ke setiap baris / kolom.
Misalnya, jika M adalah salah satu dari matriks berikut (valid, tidak valid)
hasilnya
Membaca matriks yang dihasilkan secara bijaksana harus menghasilkan urutan datar dengan pola (-1, 1) * . Untuk memverifikasi hal ini, kami mengambil jumlah kumulatif semua entri, dimulai dengan baris teratas.
Sebagai contoh matriks, ini menghasilkan
Untuk matriks tanda bergantian yang valid, output akan terdiri dari -1 dan 0 dan - karena setiap -1 membatalkan 1 sebelumnya dan sebaliknya - tidak ada nomor lain.
Pada pandangan pertama, ini mungkin tampak gagal memeriksa apakah kolom terakhir berakhir dengan 1 . Namun, untuk matriks n × n yang mengandung k nol, baris yang valid akan berisi n + k . Jika semua kolom kecuali yang terakhir juga valid, akan ada n + k - 1 di kolom, yang tidak mungkin.
Untuk menguji bahwa tidak ada angka lain, kami menyimpan jumlah parsial dalam variabel s dan memperbaruinya untuk setiap entri dengan matriks yang dihasilkan
s+=[n][s]
.Jika s = 0 atau s = -1 , ini setara dengan
s+=n
. Namun, untuk semua nilai lain dari s , itu menyebabkan IndexError , jadi Python segera berakhir dengan kode keluar 1 . Jika ini tidak terjadi pada titik mana pun, program selesai dengan bersih dengan kode keluar 0 .sumber
R, 54 byte
Fungsi anonim, menggunakan logika yang sama dengan jawaban Dennis Python 2, Jelly, dan Julia.
sumber