Pengarahan
Anda adalah bot, dalam kisi 2D yang memanjang tanpa batas di keempat arah, utara, selatan, timur, dan barat. Ketika diberi nomor, Anda harus memindahkan bot sehingga Anda mencapai nomor target.
Inilah cara kerja kisi:
Anda dapat bergerak dalam 4 arah: utara, selatan, timur atau barat. Setelah Anda pindah dari sel, Anda tidak diizinkan untuk kembali ke sel itu lagi (begitu efektif, sudah dihapus dari peta).
Ada "penghitung", yang berbunyi 1234567890
(jadi ia beralih dari 1
ke 2
... sampai ke 9
, lalu ke 0
, lalu kembali ke1
lagi), yang berubah setiap kali Anda bergerak.
Anda juga memiliki "nilai", yang dimulai pada 0.
Setelah Anda bergerak ke segala arah, operasi matematika terjadi, tergantung pada arah mana Anda bergerak:
- Utara: Nilai Anda bertambah dengan penghitung (
value += counter
). - Timur: Nilai Anda dikurangi oleh penghitung (
value -= counter
). - Selatan: Nilai Anda dikalikan dengan penghitung (
value *= counter
). - Barat: Nilai Anda dibagi dengan penghitung (
value /= counter
).- Divisi adalah divisi integer, jadi
5/2 -> 2
. - Anda tidak diizinkan membelah
0
.
- Divisi adalah divisi integer, jadi
Contoh:
Jika bot bergerak ke utara 3 kali:
- Gerakan "utara" pertama menambah penghitung
1
, dan menambahkannya ke nilai (yang sekarang1
). - Gerakan "utara" kedua menambah penghitung
2
, dan menambahkannya ke nilai (yang sekarang3
). - Gerakan "utara" ketiga menambah penghitung
3
, dan menambahkannya ke nilai (yang sekarang6
).
Nilai akhirnya adalah 6
.
Bergerak ke utara, lalu ke selatan lagi:
- Gerakan "utara" pertama menambah penghitung
1
, dan menambahkannya ke nilai (yang sekarang1
). - Kesalahan "selatan" pemindahan kedua, karena sel yang bot coba pindahkan dihilangkan (dari langkah pertama).
Tidak ada nilai akhir, karena bot salah.
Tantangan
Tantangan Anda adalah menulis sebuah program ketika, mengingat angka, menghasilkan arahan yang sesuai untuk bot untuk masuk sehingga nilai akhir dari bot sama dengan angka itu.
Jadi, jika angkanya 6
, solusi yang valid untuk itu adalah:
nnn
(Bot bergerak ke utara 3 kali berturut-turut).
Nilai tes Anda adalah:
49445094, 71259604, 78284689, 163586986, 171769219, 211267178, 222235492, 249062828, 252588742, 263068669, 265657839, 328787447, 344081398, 363100288, 363644732, 372642304, 374776630, 377945535, 407245889, 467229432, 480714605, 491955034, 522126455, 532351066, 542740616, 560336635, 563636122, 606291383, 621761054, 648274119, 738259135, 738287367, 748624287, 753996071, 788868538, 801184363, 807723631, 824127368, 824182796, 833123975, 849666906, 854952292, 879834610, 890418072, 917604533, 932425141, 956158605, 957816726, 981534928, 987717553
(Ini adalah 50 angka acak dari 1 hingga 1 miliar.)
Skor Anda adalah jumlah total gerakan yang dilakukan untuk semua 50 angka - semakin sedikit gerakan, semakin baik. Dalam kasus seri, orang yang mengirimkan kode mereka sebelumnya menang.
Spesifikasi
- Anda dijamin menerima bilangan bulat positif untuk input.
value
Variabel Anda tidak boleh pergi di atas2^31-1
atau-2^31
di bawah pada titik mana pun untuk jalur yang Anda buat.- Program akhir Anda harus sesuai dengan jawaban (jadi,
< 30,000
byte). - Anda hanya dapat membuat kode 10 angka.
- Program Anda harus berjalan dalam waktu 5 menit pada laptop yang masuk akal untuk setiap test case.
- Hasilnya HARUS sama setiap kali program dijalankan untuk setiap nomor.
sumber
value
, ya? Setidaknya bagi saya, itu terdengar seperti pembatasan yang dikenakan pada implementasi, bukan algoritma yang sebenarnya.Jawaban:
C ++: skor = 453,324.048
OK, perlu waktu untuk mengerjakan ulang ini, tapi inilah cara saya menyelesaikannya.
Setelah mempelajari ruang solusi, saya memutuskan bahwa strategi saya adalah:
Inilah hasil saya: skor total adalah 453324048
Dan jalannya:
Saya yakin ada cara untuk memperbaiki ini dengan melakukan beberapa gerakan "selatan / barat" golok (membaginya dengan 4 dan mengalikannya dengan 5; misalnya); tetapi mengkodekannya, dan memastikan Anda tidak over lap atau terjebak, itu rumit.
Jalur solusi lain, mungkin mencoba kembali turun dari target, ke nomor "masuk akal", dan kemudian, hanya menemukan jalur ke nomor yang lebih kecil; tetapi Anda harus "mengarahkan" dengan benar, sehingga nomor langkah akan cocok. rumit, tetapi mungkin cara terbaik untuk menyelesaikan ini.
Bagaimanapun, ini kode kode saya:
sumber
Python, Skor = 56068747912
Hanya mencetak
nenenenenenenen...
untuk setiap nomor.Akan menambahkan penjelasan nanti.
sumber
nen
adalah 2Karat , skor = 1758 (optimal di antara jalur tanpa barat)
Berjalan dalam sekitar 7 detik total untuk 50 angka, menggunakan pencarian dua arah .
Cobalah online!
Keluaran
sumber
ns
,sn
,ew
danwe
segera ilegal di samping setiap loop di jalanw
,,ns
dansn
, yang hanya menyisakan jalur hukum dengan mengorbankan mengabaikan jalur hukumw
.PHP, Skor = 1391462099
Upaya cepat, tidak pernah ke barat untuk menyederhanakan pengecekan jalur dan memiliki beberapa aturan untuk memutuskan arah pada setiap langkah.
sumber