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.