Minimalkan Mereka Yang [ditutup]

12

Tugas Anda adalah membangun nomor alami menggunakan jumlah yang paling sedikit dan hanya operator +atau -. Misalnya, nomor tujuh dapat ditulis 1+1+1+1+1+1+1=7, tetapi juga dapat ditulis sebagai 11-1-1-1-1=7. Yang pertama menggunakan 7yang, sedangkan yang terakhir hanya menggunakan 6. Tugas Anda adalah mengembalikan jumlah minimum yang dapat digunakan mengingat input dari beberapa nomor alami n,.

Ini adalah kode golf, jadi kode terpendek yang valid dalam byte menang.

Uji kasus

Input => Output

0 => 2 (since 1-1=0)
7 => 6
121 => 6
72 => 15
1000 => 7
2016 => 21
codeputer
sumber
Tantangan pertama yang bagus. Saya sarankan memasukkan lebih banyak kasus uji. Apakah "VALID OUTPUTS" kesalahan, mengingat bahwa ada satu output? Juga, apakah 0 input yang valid, dan jika demikian, apa yang harus menjadi output?
xnor
Ini tantangan yang menarik. Anda mungkin ingin menambahkan penjelasan untuk output, ubah VALID OUTPUTS. Itu pilihan Anda, tetapi umumnya orang lebih suka huruf tebal atau miring daripada SURAT MODAL (mereka membuatnya tampak seperti berteriak, bukannya menekankan). Berani adalah **bold text**, dan huruf miring adalah *italics text*. Anda juga dapat menggunakan ### Textuntuk teks tebal. Bagaimanapun, selamat datang di PPCG!
NoOneIsHere
Anda harus membuat tabel atau daftar kasus uji yang dapat dibaca komputer tempat orang dapat menjalankan kode mereka. Lihat tip ini .
xnor
6
Saya memberikan suara untuk menutup pertanyaan ini karena pertanyaan ini merupakan duplikat dari tantangan golf saat ini (aktif !!) di codefights.com/challenges . Bahkan jika OP juga penulis tantangan orisinal tentang perkelahian kode (yang saya ragu), pertanyaan harus ditutup sampai tantangan tentang perkelahian kode tidak aktif lagi.
Jakube
1
@ Jakube tautan langsung bisa membantu, tapi saya setuju. Saya akan memilih untuk menutup.
NoOneIsHere

Jawaban:

3

JavaScript (ES6), 127 126 87 byte

f=(n,z=2,m=n*9+'',r=m.replace(/./g,1))=>n?m.length+(m<'55'?f(n- --r/10,0)-1:f(r-n,0)):z
Input: <input type="number" oninput="result.textContent=f(this.value)"> Result: <span id="result"></span>

Harus bekerja sekitar 10 14 15 saat Anda mulai berlari ke batas integer JavaScript. Penjelasan:

f=(                             Recursive function
 n,                             Parameter
 z=2,                           Zero workaround
 m=n*9+'',                      Magic
 r=m.replace(/./g,1)            Find repunit not less than than n
)=>n?                           Nothing to do if n is zero
 m.length+                      Assume subtracting from repunit
 (m<'55'?                       Should we subtract from repunit?
  f(n- --r/10,0)                No, so subtract previous repuint
   -1:                          Which is one 1 shorter
  f(r-n,0)):                    Subtract from repunit
 z                              Return special case if n is zero

Ini menggunakan n*9sihir dua kali; pertama, itu memberi saya panjang dari repunit berikutnya, kedua, jika dua digit pertama n*9adalah 55atau lebih tinggi, maka kita perlu mengurangi ndari repunit berikutnya, jika tidak kita perlu mengurangi repunit sebelumnya (yang dihitung dengan mengurangi 1 dan membaginya dengan 10). Ini harus bekerja hingga 10 15 .

Neil
sumber
2

Pyth, 19 16 byte

ffqQvs+R1Y^c3"+-

Suite uji

Algoritma brute force. String yang diperlukan dihasilkan dengan mengambil semua daftar yang unsur-unsurnya ['+', '-', '']panjang sama dengan jumlah 1 yang diuji, menambahkan 1 untuk masing-masing, dan menyatukan ke string tunggal. String ini kemudian dievaluasi dan dibandingkan dengan input. Ini diulangi hingga string yang berhasil ditemukan.

Beberapa string dengan pemimpin +atau -diuji, tetapi ini bukan masalah. Akan tetapi jika inputnya negatif.

Itu bisa berjalan hingga panjang 9 sebelum menjadi terlalu lambat.

Penjelasan:

ffqQvs+R1Y^c3"+-
ffqQvs+R1Y^c3"+-"T    Implicit variable introduction
                      Q = eval(input())
f                     Starting with T = 1 and counting upwards, repeat until true.
                      The value of T where the result is first true is output.
           c3"+-"     Chop "+-" into thirds, giving ['+', '-', '']
          ^      T    Form every list with those elements of length T.
 f                    Filter over those lists, lambda var Y.
      +R1Y            Append a 1 to each element of the list.
     s                Concatenate.
    v                 Eval.
  qQ                  Compare for equality with the input.
                      The inner filter will let through the successful cases.
                      The outer filter will stop when there is a successful case.
isaacg
sumber
2

JavaScript (ES6), 92 byte

f=(n,i=3)=>eval([...s=i.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n?f(n,i+1):s.length-1
n = <input type="number" oninput="R.textContent=f(this.value)" /><pre id="R"></pre>

Penjelasan

Fungsi rekursif. Ini menghasilkan semua permutasi yang mungkin 1s dipisahkan oleh +, -atau tidak sama sekali. Ini dilakukan dengan menambah basa-3, mengubahnya menjadi array angka, mengubah setiap digit 0menjadi -, 1menjadi +dan 2menjadi string kosong, kemudian menyatukannya dengan 1s. String yang dihasilkan adalah evald sebagai pernyataan JavaScript yang mengembalikan hasil persamaan.

Karena operator digabungkan dengan 1s di antara (seperti +1+1+1+), ada length - 1 1s. Operator pertama diabaikan (karena +1= 1, <nothing>1= 1dan itu nomor sehingga tidak akan pernah ada terkemuka 0untuk -) dan operator akhir juga diabaikan (dengan menambahkan .0persamaan).

Versi Output Lebih Tinggi, 96 byte

Versi lain tidak dapat mengembalikan output lebih tinggi dari ~ 10 karena batas tumpukan panggilan rekursi. Versi ini menggunakan loop untuk alih-alih rekursi, sehingga dapat mengembalikan output hingga ~ 33. Jumlah waktu yang dibutuhkan meningkat secara eksponensial, jadi saya tidak merekomendasikan untuk mengujinya.

n=>eval('for(a=3;eval([...s=a.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n;)a++;s.length-1')
pengguna81655
sumber
Ini terdengar rumit, saya suka itu.
Bálint