Pertanyaan
Kami ditangkap oleh robot tentara di stasiun ruang angkasa mereka. Pilot kapal ruang angkasa kami ada di penjara yang ada di level 1. Hanya ada satu cara bagaimana melarikan diri dan menyelamatkan pilot kapal ruang angkasa Anda. Itu berarti bergerak dari level N ke level 1. Namun karena sangat berisiko Anda harus pergi ke penjara dengan jumlah langkah seminimal mungkin.
Kondisi
Ada 4 cara bagaimana memindahkan:
- Pindah dari level N ke level N - 1
e.g. from 12 to 11
- Pindah dari level N ke level N +1
e.g. from 12 to 13
- Gunakan teleportasi dari level 2k ke level k
e.g. from 12 to 6
- Gunakan teleportasi dari level 3k ke level k
e.g. from 12 to 4
- Pindah dari level N ke level N - 1
Teleport hanya satu arah (Anda bisa mendapatkan dari 12 hingga 4 tetapi tidak mungkin untuk mendapatkan dari 4 hingga 12)
- Setiap tindakan mengambil satu langkah
Memasukkan
Masukan harus dibaca dari STDIN, atau alternatif terdekat dalam bahasa pemrograman Anda. Input terdiri dari bilangan bulat di n
mana 1 <= n <= 10^8
.
Keluaran
Output harus menjadi jumlah minimum langkah yang diperlukan untuk pergi dari n
ke level 1.
Contohnya
Level Minimum number of steps
1 0
8 3
10 3
267 7
100,000,000 25
Cobalah kode program yang akan membantu kita menyelamatkan pilot kapal ruang angkasa kita dari penjara dalam waktu singkat dan kembali ke rumah!
Kode terpendek akan menang!
Jawaban:
Pyth, 32 byte
Cobalah online: Demonstrasi atau Test Suite
Penjelasan:
Saya mengubah masalah sedikit. Saya mendefinisikan 4 operasi baru, yang menggantikan 4 operasi pertanyaan.
level / 2
(dihitung sebagai(level % 2) + 1
langkah - langkah, karena Anda mungkin perlu memindahkan level ke bawah terlebih dahulu untuk berteleportasi)(level + 1) / 2
(dihitung sebagai(level % 2) + 1
langkah)level / 3
(dihitung sebagai(level % 3) + 1
langkah)(level + 1) / 3
(dihitung sebagai(-level % 3) + 1
langkah)Dengan desain operasi ini dapat diterapkan untuk setiap nomor, jika nomor tersebut adalah
0 mod 2
,1 mod 2
,0 mod 3
,1 mod 3
atau2 mod 3
.Anda dapat dengan mudah memikirkan, mengapa ini berhasil. Gagasan utamanya adalah, bahwa setidaknya ada satu solusi optimal, yang tidak memiliki dua gerakan (bergerak ke bawah) atau dua gerakan (bergerak ke atas) secara berurutan. Bukti: Jika Anda memiliki solusi, yang memiliki dua gerakan seperti itu secara berurutan, daripada Anda dapat menggantinya dan membuat solusi lebih kecil atau sama panjang. Misalnya Anda bisa mengganti (pindah ke atas, pindah ke atas, teleportasi dari 2k ke k) dengan (teleportasi dari 2k ke k, pindah ke atas) dan serupa dalam semua kasus lainnya.
Fungsi
y
menggunakan memoisasi secara implisit dan oleh karena itu runtime tidak meledak.sumber
Python, 176 byte
Brute force sepanjang jalan; daftar semua angka
1 to 100,000,000
pada komputer 64bit adalah ~ 800Mb memori.Indeks daftar mewakili angka, nilai mewakili jarak dari 1 dalam langkah penyelamatan yang diizinkan.
1
)0,2,2,3
)Runtime lebih dari 10 menit. * ahem *.
Komentar kode
Lain
sumber
Python 2 ... 1050
ditulis dengan buruk, tidak disunat, tidak optimal.
Membaca level awal pada stdin, mencetak jumlah langkah minimum pada stdout.
sumber
Kode mesin x86 32-bit, 59 byte
Dalam hex:
Bahasa mesin sendiri tidak memiliki konsep input standar. Karena tantangannya adalah komputasi murni, saya memilih untuk menulis fungsi dengan mengambil parameter input
EAX
dan mengembalikan hasilnyaAL
.Matematika di balik kode dijelaskan dengan baik oleh @Jakube: pencarian dilakukan hanya di antara jalur yang memiliki teleport diselingi dengan tidak lebih dari satu gerakan satu tingkat. Kinerja adalah sekitar 12000 kasus uji per detik di ujung bawah kisaran input dan 50 kasus per detik di ujung atas. Konsumsi memori adalah 12 byte ruang stack per tingkat rekursi.
sumber