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.
sumber
+++++--
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.Jawaban:
Python 2, 119 byte
Pendekatan brute-force sangat lambat. Baris ketiga menghitung skor string
x
; baris lain mengulangi semua string biner yang mungkin sampai satu yang nilainya sama dengan argumen ditemukan.@ Leaky menyimpan tiga byte!
sumber
s/x==n and len/(x==n)*len/
s
dan hanya menggunakan pembagian berulang, seperti ini:def f(n): \n while n>0:print n%2;n/=2
Pyth, 25 byte
Cobalah online.
Ini sangat tidak efisien, dan kehabisan memori untuk
f(n)
≥ 11. Menghitungf(22)
= 10 dalam waktu sekitar 10 detik pada laptop saya.Penjelasan
T
. (f
)T
. (./T
).pM
)s
){
) Langkah ini bisa dihapus, tetapi itu membuat kode lebih cepat.f
)d
partisi (*R
) dengan sendirinya ditambah satu (hd
). Ini memberi dua kali lipat angka untuk menambah / mengurangi hasil.c
...2
)-M
).a
) Jika hasilnya negatif, menukar penambahan dan pengurangan mendapat hasil positif.qyQ
) Dalam hal ini permutasi partisi sudah benar, kembalikan.T
. Kembali dan cetakT
.sumber
MATL ,
4329 byteIni adalah memori dan waktu yang tidak efisien. Kompilator online dapat menangani hingga input
45
saja.Cobalah online!
Berikut ini adalah versi yang dimodifikasi dengan semua test case hingga
40
(butuh hampir satu menit dalam kompiler online).Penjelasan
Ini menguji semua urutan penekanan tombol yang mungkin dari setiap panjang, dalam urutan peningkatan panjang, sampai urutan yang valid ditemukan.
sumber
Python,
105100 byteMenggunakan pencarian pertama yang tidak efisien.
h
adalah daftar yang digunakan sebagai antrianm
adalah nilai urutan di bagian atas daftart
adalah nomor terakhir yang ditambahkan kem
l
adalah panjang urutan yang dihasilkanm
o
adalah +/- 1, tandanya berlawanan dengan tanda darit
Sunting: Leaky Nun mencukur lima byte.
sumber
s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
s/while m!=n/while m-n/