Terinspirasi oleh pertanyaan ini
Cara lain untuk membuka gulungan gambar 2D menjadi string 1D adalah dengan menggunakan Hilbert Curve.
Ada banyak versi kurva ini, tergantung pada jumlah iterasi yang digunakan saat menghitungnya. Berikut ini contoh Curves Hilbert dari urutan pertama hingga urutan kelima.
Cara menghitung kurva ini adalah sebagai berikut. Pertama kita mendefinisikan urutan pertama Hilbert Curve sebagai yang ditunjukkan pada gambar (satu untuk n = 1), sehingga cocok dalam 1x1 kotak. Kami kemudian membuat empat salinan kurva ini, menempatkannya dalam bujur sangkar 4x4, sehingga semuanya menyajikan "cekungan" ke arah sisi kiri. Kami kemudian membalik dua kurva urutan paling kiri 1, sehingga bagian atas cekung menghadap ke atas, sedangkan bagian bawah menghadap ke bawah. Kami akhirnya menghubungkan sudut-sudut Kurva Hilbert yang berdekatan. Jika ingin mendapatkan Kurva orde (n +1), kita hanya perlu mengulangi proses dengan empat Kurva n-order. Kita dapat melihat visualisasi proses di sini (saya juga akan menambahkan gambar yang merinci prosesnya segera)
Tugas Anda dalam tantangan ini adalah membuka gulungan matriks bilangan bulat di sepanjang urutan terendah Hilbert Curve untuk matriks itu.
Demi kesederhanaan, kita akan memiliki kurva mulai dari sudut kiri atas matriks.
Anda dapat menerima input baik sebagai daftar daftar bilangan bulat, di mana setiap sub-daftar mewakili baris matriks.
Anda dapat mengasumsikan bahwa input akan berupa matriks kuadrat (n * n).
Sebagai contoh:
Memasukkan:
[[ 1, 2,]
[ 3, 4 ]]
Keluaran:
[ 1, 2, 4, 3 ]
Karena kita menggunakan urutan pertama Hilbert Curve yang ditunjukkan pada gambar
Memasukkan:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Keluaran:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Menggunakan urutan kedua Hilbert Curve
Seperti biasa, celah standar tidak diizinkan.
Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang.
sumber
Jawaban:
MATL ,
8685 byteSolusi ini didasarkan pada entri File Exchange Jonas Lundgren yang menggunakan bilangan kompleks untuk menghasilkan kurva Hilbert. Bilangan kompleks ini kemudian dikonversi ke nilai indeks untuk mengambil elemen matriks yang berada di sepanjang kurva.
Cobalah online!
Penjelasan
sumber
APL (Dyalog Unicode) , 41 byte SBCS
Disimpan 30 byte (!) Dengan berkonsultasi dengan kebijaksanaan APL Orchard, terutama @ngn dan @ Sherlock9.
Cobalah online!
Penjelasan sebagai berikut:
Lebih detail tentang " pemindaian transpose monadik ".
Dokumentasi Dyalog tentang penjaga kesalahan .
sumber
Mathcad, 302 byte
Program Mathcad di bawah ini didasarkan pada program @ Sherlock9 Python. Ini berbeda dengan melengkung matriks persegi panjang dengan mengabaikan bagian-bagian dari Kurva Hilbert yang terletak di luar batas matriks. Perhatikan bahwa karena Mathcad memiliki penanganan string yang relatif buruk, saya telah memetakan simbol Lindenmayer ke integer dalam fungsi Hilbert.
Mathcad bekerja melalui antarmuka 2D yang memungkinkan pengguna untuk menempatkan (dan secara bebas mencampur) ekspresi matematika, plot, teks, input dan output. Saya telah menyamakan satu byte ke operasi setara keyboard pengguna minimum untuk membuat simbol (misalnya, operator definisi (: =) dimasukkan dengan hanya mengetik:.
sumber
Python 3,
327289275271239234 byteIni adalah solusi yang saya modifikasi dari jawaban saya untuk pertanyaan kurva Hilbert lain di sini . Setiap kiat bermain golf dihargai.
Sunting: Mengubah cara
g
bertambah dan dikurangi. Sekarang menggunakaneval()
danstr.translate
. Tidak lagi menggunakanl=len(s)
.Tidak Disatukan:
sumber
Wolfram - 233
Berdasarkan representasi sebagai sistem Lindenmayer :
sumber
Ruby,
224221216 byteJawaban ini didasarkan pada jawaban Python saya .
Tidak melakukan pelanggaran:
sumber
CJam, 60
Cobalah online
Penjelasan:
Saya sedang membangun fraktal sebagai serangkaian arah gerakan: 0 = kanan, 1 = bawah, 2 = kiri, 3 = atas.
sumber