The matriks Pauli adalah seperangkat 2x2 matriks yang muncul sangat umum di fisika kuantum (tidak ada, Anda tidak perlu tahu apa fisika kuantum untuk tantangan ini). Jika kita memasukkan identitas dalam set, empat matriks adalah:
σ0 = σ1 = σ2 = σ3 =
[1 0] [0 1] [0 -i] [1 0]
[0 1] [1 0] [i 0] [0 -1]
Mengalikan dua ini akan selalu memberikan matriks Pauli lain, meskipun mungkin dikalikan dengan salah satu tahapan yang kompleks 1
, i
, -1
, -i
. Misalnya ,.σ1σ3 = -iσ2
Tugas Anda adalah melipatgandakan sejumlah matriks Pauli dan mengembalikan matriks dan fase yang dihasilkan. Masukan akan diberikan sebagai string yang tidak kosong digit 0
untuk 3
mewakili matriks untuk . Output harus berupa string yang berisi satu digit untuk matriks yang dihasilkan, secara opsional didahului oleh , atau untuk menunjukkan fase ( untuk ).σ0
σ3
i
-
-i
-
-1
Anda dapat menulis suatu program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter fungsi (keluar).
Anda tidak boleh menggunakan fitur bawaan (atau pihak ketiga) yang terkait dengan matriks Pauli.
Ini kode golf, jawaban terpendek (dalam byte) menang.
Uji Kasus
1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1
sumber
Jawaban:
Pyth, 47 byte
Saya kira ini masih golf. Tapi itu mengalahkan CJam banyak.
Cobalah online: Demonstrasi atau Test Suite
Penjelasan
Menentukan jenis matriks yang dihasilkan cukup dengan memasukkan semua angka.
Sementara mengalikan 2 matriks
A*B
, fase berubah, jika bukan dari matriks adalahσ0
danA != B
.sumber
Python 2,
108898786 byte(Terima kasih kepada @grc dan @xnor untuk bantuannya)
Penjelasan
Mari kita pisahkan koefisien dan matriks dasar. Jika kita fokus pada matriks dasar saja, kita mendapatkan tabel perkalian ini (misalnya
13
adalah-i2
, sehingga kami menempatkan2
):yang kebetulan sama dengan melakukan bitwise xor.
Sekarang mari kita fokus pada koefisien. Jika kita membiarkan masing-masing
0123
menunjukkan1,i,-1,-i
, kita mendapatkan:Untuk ini, pertama-tama kita memeriksa apakah salah satu angka 0 dengan melakukan
m*y
, menjaga kolom kiri dan baris atas. Menambahkan(m-y)%3
kemudian memberi:yang dekat, kecuali bahwa kita memiliki
2
bukan3
. Kami memperhitungkan ini dengan melakukan*3/2
.Untuk pengindeksan, kami perhatikan bahwa jika kami mengambil string
"--i"
dan memilih setiap karakter kedua mulai dari indeks yang0123
kami dapatkan"-i","-","i",""
.sumber
3-n%4
seperti~n%4
. Saya menduga Anda dapat mengekspresikanm*y and(m-y)%3*3/2
lebih pendek dalam string sihir, tetapi upaya pertama saya877449216>>2*m+8*y
hanya terikat. Ada juga formula aljabar yang cantik, kalauY=m^y
ungkapannya begitu(m-y)*(y-Y)*(Y-m)/2
, tapi itu panjang.~
, bagus - off-by-one itu mengganggu saya: / Saya cukup yakinm*y and(m-y)%3*3/2
bisa dipersingkat juga, tapi saya menghabiskan sepanjang malam dan tidak mendapatkan tempat ... Saya akan kembali ke sana jika saya punya waktu. Mungkin fakta bahwa saya memiliki kebebasan mod 4 mungkin membantu.Retina , 77 byte
Saya pikir saya akan menggunakan kesempatan ini untuk memamerkan fitur Retina baru: loop multi-tahap. Ini harus mempersingkat banyak tugas (terutama penggantian bersyarat).
Retina adalah bahasa pemrograman berbasis regex saya sendiri. Kode sumber dapat dikelompokkan menjadi beberapa tahap: setiap tahap terdiri dari dua baris di mana yang pertama berisi regex (dan berpotensi beberapa konfigurasi) dan baris kedua adalah string pengganti. Tahapan-tahapan tersebut kemudian diterapkan pada STDIN secara berurutan dan hasil akhirnya dicetak ke STDOUT.
Anda dapat menggunakan di atas secara langsung sebagai file sumber dengan
-s
saklar baris perintah. Namun, saya tidak menghitung tombolnya, karena Anda juga bisa meletakkan setiap baris dalam file yang terpisah (maka Anda kehilangan 15 byte untuk baris baru, tetapi tambahkan +15 untuk file tambahan).Penjelasan
Hal baru tentang solusi ini adalah
)
pada tahap kedua dari belakang. Ini menutup loop multi-tahap. Tidak ada yang cocok(
, yang berarti bahwa loop secara implisit dimulai pada tahap pertama. Oleh karena itu, 7 tahap pertama diulangi sampai lulus penuh semua 7 dari mereka berhenti mengubah hasilnya. 7 tahap ini hanya melakukan berbagai transformasi yang secara bertahap mengurangi jumlah matriks dalam string dan menggabungkan fase. Setelah kami mencapai hasil akhir, tidak ada dari tujuh pola yang cocok lagi dan loop berakhir. Setelah itu, kami menambahkan 0 jika belum ada angka di hasilnya (karena tahap di atas cukup lepaskan semua identitas, termasuk hasilnya).Inilah yang dilakukan masing-masing tahapan:
Menggabungkan semua pasangan
i
ke dalam-
untuk mengurangi karakter fase.Sekarang jika ada dua karakter identik berturut-turut yang tersisa, itu salah satu
--
atau dua matriks identik. Dalam kedua kasus itu, mengalikannya memberi identitas. Tapi kami tidak membutuhkan identitas, jadi kami hanya menghapus semuanya, dan identitas eksplisit0
juga. Tahap ini diulang dengan sendirinya+
sampai hasilnya berhenti berubah. Ini memastikan bahwa hal-hal seperti123321
diselesaikan sepenuhnya, sehingga langkah selanjutnya dapat mengasumsikan bahwa semua pasangan digit berbeda.Ini sebenarnya dua transformasi terpisah dalam satu (untuk golfitude). Perhatikan bahwa jika alternatif pertama cocok,
$2
dan$3
kosong, dan jika yang kedua cocok,$1
kosong. Jadi ini dapat diuraikan menjadi dua langkah ini:Ini hanya menukar semua pasangan digit dan menambahkan tanda minus. Karena kita dihapus semua
0
dan semua pasangan identik, ini hanya akan cocok12
,23
,31
,21
,32
,13
. Langkah ini mungkin tampak aneh, tetapi ini memungkinkan saya untuk hanya memeriksa setengah dari kasus-kasus ini nanti, karena yang saya tidak bisa proses kemudian akan ditukar di sini di iterasi berikutnya.Bagian lain dari tahap di atas adalah:
Ini secara bertahap memindahkan
-
tanda-tanda sampai ke kiri (satu posisi per iterasi). Saya melakukan ini sehingga pada akhirnya mereka semua bersebelahan dan diselesaikan pada langkah sebelumnya.Tiga tahap ini sekarang hanya menyelesaikan tiga pasang produk. Seperti yang saya katakan di atas, ini hanya akan menangkap setengah dari kasus yang relevan, tetapi setengah lainnya akan diurus dalam iterasi berikutnya, setelah langkah sebelumnya bertukar semua pasangan.
Ini adalah tahap terakhir dari loop. Ini mirip dengan yang bergeser
-
ke kiri, kecuali untuki
. Perbedaan utama adalah bahwa inii
hanya bertukar dengan angka. Jika saya menggunakan(.)i
maka dalam kasus di mana saya mendapatkan-i
ataui-
keduanya akan ditukar tanpa batas waktu dan program tidak akan berakhir. Jadi ini hanya menukar mereka ke kanan-
tanda. Ini cukup - selama semua-
dani
muncul bersama di beberapa titik, mereka dapat diselesaikan dengan benar.Langkah terakhir (di luar loop). Ingat bahwa kami selalu menghapus semua identitas, jadi jika hasilnya sebenarnya adalah identitas (kali fase), maka kami tidak akan memiliki angka yang diperlukan dalam output lagi, jadi kami menambahkannya kembali.
Sebagai contoh, berikut adalah semua bentuk peralihan
0223202330203313021301011023230323
(melewatkan tahapan yang tidak melakukan perubahan apa pun):sumber
CJam,
5856 byteSaya yakin ini bisa banyak bermain golf, tapi begini saja:
Cobalah online di sini atau jalankan suite lengkap di sini
sumber