Kredit ke @ Agawa001 untuk pertanyaan ini.
Penjelasan
"Keybore" baru saya hanya memiliki 2 tombol, yaitu +dan -.
Nomor dalam memori dimulai pada 0.
Setiap penekanan berurutan +atau -akan menambah / mengurangi memori untuk berapa kali telah ditekan secara berurutan.
Karena itu, jika Anda menekan +4 kali, pertama kali menambahkan 1, kedua kali menambahkan 2, ketiga kali menambahkan 3, keempat kali menambahkan 4, memberi Anda 10(sepuluh).
Sekarang, jika Anda menekan -3 kali, pertama kali mengurangi 1, kedua 2, ketiga 3, meninggalkan Anda dengan 4(empat).
TL; DR
Diberikan string + dan -, bagilah di setiap perubahan karakter. Kemudian setiap string +simbol m yang dihasilkan menambahkan angka segitiga m-th, dan setiap string -simbol n mengurangi angka segitiga n-th.
Walk-through
Sekarang, jika Anda masih tidak mengerti, saya akan menunjukkan kepada Anda bagaimana cara +++--+--membuatnya 1.
Program | Counter | Memory
----------------------------
| 0 | 0
+ | +1 | 1
++ | +2 | 3
+++ | +3 | 6
+++- | -1 | 5
+++-- | -2 | 3
+++--+ | +1 | 4
+++--+- | -1 | 3
+++--+-- | -2 | 1
Tugas
- Anda akan mengambil bilangan bulat positif sebagai input, baik sebagai argumen fungsional atau dari STDIN.
- Kemudian, Anda akan menampilkan / mencetak jumlah penekanan tombol minimum yang diperlukan untuk membuat angka itu menggunakan metode di atas.
Testcases
Karena menata ulang +atau -menjalankan memberikan nomor yang sama, untuk masing-masing kelompok tersebut hanya urutan paling leksikografis yang terdaftar.
Input | Output | Possible corresponding sequences
-------------------------------------------------
4 | 5 | -+++-
6 | 3 | +++
9 | 5 | ++++-
11 | 7 | +++-+++
12 | 7 | +++++--, ++++-++
19 | 8 | -++++++-
39 | 12 | +++++++++---
40 | 13 | +++++++++---+, ++++++++-+++-
45 | 9 | +++++++++
97 | 20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
361 | 34 | ++++++++++++++++++++++++++-+++-+++
Sumber daya tambahan
- Bukti bahwa nomor apa pun dapat dibuat : pada dasarnya, dengan mengulangi
++-, Anda dapat memperoleh nomor genap. Untuk mendapatkan angka ganjil, cukup cantumkan+di bagian akhir. - Cara umum lain untuk mendapatkan nomor berapa pun. Misalnya, untuk menghasilkan
50, caranya adalah dengan menekan+50 kali, dan kemudian tekan-49 kali. - Solusi dari 50 angka pertama .
- JSFiddle wajib .
Mencetak gol
Ini adalah kode-golf . Solusi terpendek dalam byte menang.
+++++--juga merupakan alternatif, tapi saya dihapus ++-++++karena itu setara dengan ++++-++). Saya masih punya satu kasus lagi yang ingin saya tambahkan nanti kalau-kalau ada yang datang dengan solusi yang efisien, jika saya berhasil menghasilkannya.
++-++++dihapus. Juga, ini adalah edit SAYA, bukan ANDA.
+++++--(atau, setara, --+++++), itulah sebabnya saya merasa perlu mengedit sejak awal.