Kata Kunci Deskriptif (untuk pencarian): Membuat Dua Matriks Setara, Tumpang tindih, Array, Temukan
Tantangan
Santa memiliki sejarah elf mencuri hadiah dari brankasnya di masa lalu, jadi tahun ini dia merancang kunci yang sangat sulit untuk dipecahkan, dan tampaknya telah membuat elf keluar tahun ini. Sayangnya, dia telah kehilangan kombinasinya dan dia juga tidak tahu cara membukanya! Untungnya, dia telah mempekerjakan Anda untuk menulis sebuah program untuk menemukan kombinasi. Itu tidak harus menjadi yang terpendek, tetapi ia harus menemukannya secepat mungkin!
Dia memiliki jadwal yang sangat ketat dan dia tidak bisa menunggu terlalu lama. Skor Anda akan menjadi total run-time program Anda dikalikan dengan jumlah langkah output program Anda untuk input skor. Skor terendah menang.
Spesifikasi
Kunci adalah matriks kuadrat dari 1s dan 0s. Ini diatur ke pengaturan acak 1s dan 0s dan perlu diatur ke kode yang ditentukan. Untungnya, Santa mengingat kode yang diperlukan.
Ada beberapa langkah yang bisa dia lakukan. Setiap langkah dapat dilakukan pada setiap sub-matriks yang berdekatan (yaitu, Anda harus memilih sub-matriks yang sepenuhnya dibatasi oleh sudut kiri atas dan kanan bawah) (ini dapat berupa sub-matriks non-persegi):
- Putar ke kanan 90 derajat *
- Putar ke kiri 90 derajat *
- Putar 180 derajat
- Siklus setiap
n
elemen baris ke kanan atau kiri (membungkus) - Siklus setiap
m
elemen kolom ke atas atau bawah (membungkus) - Balik secara Horizontal
- Balik secara Vertikal
- Balik di Diagonal Utama *
- Balik di Anti-diagonal Utama *
* hanya jika sub-matriksnya persegi
Tentu saja, ia juga dapat melakukan langkah-langkah ini pada seluruh matriks. Karena 1s dan 0s hanya dapat ditukar pada matriks tetapi nilai kuadrat tidak dapat secara langsung diubah, jumlah 1s dan 0s adalah sama untuk konfigurasi awal dan akhir.
Memformat Spesifikasi + Aturan
Anda akan diberikan input sebagai dua matriks persegi (posisi awal dan posisi akhir) dalam format wajar apa pun yang Anda inginkan. Output harus berupa urutan langkah-langkah ini dalam format apa pun yang dapat dibaca. Karena ini bukan kode-golf, harap buat format yang mudah diverifikasi, tetapi itu bukan persyaratan yang ketat. Anda dapat memilih untuk mengambil panjang sisi matriks dalam input jika Anda mau.
Program Anda akan dijalankan di komputer saya (Linux Mint, detail versi yang pasti tersedia atas permintaan jika ada yang peduli: P) dan saya akan menentukan waktu berdasarkan jumlah waktu antara waktu saya menekan "enter" pada baris perintah dan ketika perintah keluar.
Uji Kasus
1 0 0 1 0 0 0 0
0 1 1 0 -> 0 0 0 0
0 1 1 0 -> 1 1 1 1
1 0 0 1 1 1 1 1
- Ambil seluruh matriks. Siklus setiap kolom ke atas 1.
- Ambil dua kolom tengah sebagai sub-matriks. Turunkan setiap kolom 2.
1 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 -> 0 1 1 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0 1 0
- Ambil seluruh matriks. Turunkan setiap kolom ke bawah 1.
- Ambil kolom tengah. Siklus ke bawah 2.
- Ambil 2 baris teratas. Balikkan secara vertikal.
- Ambil 2 elemen paling kanan baris paling atas. Tukar mereka (putar kanan / kiri 1, balik secara horizontal).
- Ambil 2 elemen paling kiri baris paling atas. Tukar mereka.
Mungkin ada metode yang lebih efisien, tetapi itu tidak masalah. Jangan ragu untuk menunjukkannya di komentar jika Anda menemukannya :)
Menilai Kasus Uji
Kasing uji ini akan digunakan untuk menilai kiriman Anda. Jika saya percaya bahwa suatu jawaban khusus untuk kasus uji terlalu banyak, saya memiliki hak untuk mengambil kembali input acak dan menilai kembali semua jawaban dengan kasus baru. Kasing uji dapat ditemukan di sini di mana bagian atas adalah awal dan bagian bawah adalah konfigurasi yang diinginkan.
Jika saya yakin jawaban terlalu khusus, MD5 untuk test case berikutnya adalah 3c1007ebd4ea7f0a2a1f0254af204eed
. (Ini ditulis di sini sekarang untuk membebaskan diri dari tuduhan kecurangan: P)
Celah Standar Berlaku. Tidak ada jawaban yang akan diterima. Selamat coding!
Catatan: Saya mendapat inspirasi untuk seri tantangan ini dari Advent Of Code . Saya tidak memiliki afiliasi dengan situs ini
Anda dapat melihat daftar semua tantangan dalam seri ini dengan melihat bagian 'Tertaut' dari tantangan pertama di sini .
sumber
0
dan 641
, dan ada total256 choose 64 ≈ 1.9 × 10⁶¹
matriks yang dapat dijangkau. (yang sebanding dengan Megaminx, dan lebih besar dari Pembalasan Rubik, meskipun jauh lebih sedikit dari kubus Profesor)Jawaban:
Jawa
Versi hard-coded yang sedikit lebih cepat: Cobalah secara online!
Input adalah integer yang dipisahkan ruang melalui baris perintah. Bilangan bulat pertama adalah lebar dari dua matriks. Bilangan bulat yang tersisa adalah elemen mereka, baris demi baris.
Setiap permutasi dari suatu matriks dapat diperoleh hanya dengan operator flip horizontal dan flip vertikal, jadi saya mengabaikan sisanya kecuali untuk mengganti vFlip dan hFlip berturut-turut di wilayah yang sama dengan rotasi 180 derajat.
Program memindai melalui setiap elemen. Setiap kali kita menemukan elemen yang memiliki bit yang salah, itu melihat lebih jauh ke depan melalui array untuk menemukan tempat yang memiliki bit yang benar. Saya telah membagi wilayah pencarian menjadi dua: area dengan koordinat kolom yang sama atau lebih besar, dan area dengan koordinat kolom yang lebih kecil. Perhatikan bahwa yang terakhir harus memiliki koordinat baris yang lebih besar berdasarkan cara kita melintasi array. Jika kami menemukan bit yang benar di wilayah pencarian pertama, kami hanya dapat memutar 180 derajat sub-matriks yang mencakup dua elemen untuk total satu operasi. Jika berada di wilayah kedua, kita dapat menggunakan flip horizontal untuk memindahkan bit yang benar ke kolom yang sama dengan bit yang salah dan kemudian secara vertikal membalikkan sub-matriks yang membentang keduanya untuk total dua operasi.
Output dari program ini adalah sebuah array yang harus dibagi secara mental menjadi lima kelompok. Setiap kelompok adalah (i, row1, col1, row2, col2) di mana saya adalah 0 untuk no-op, 1 untuk rotasi 180 derajat, 2 untuk flip horizontal, dan 3 untuk flip vertikal. Sisa 4 komponen menggambarkan wilayah pengoperasian. Saya tidak yakin apakah ini format yang bisa dibaca.
Untuk kasus uji yang diberikan, saya mendapatkan 258 operasi dan dua hingga tiga milidetik di komputer saya.
sumber