Berapa banyak desimal yang ada sebelum saya perlu menambahkan 1 ketika membulatkan?

10

Ketika Anda membulatkan angka, jika digit berikutnya >= 5Anda tambahkan 1. Misalnya:

3.1415926535 rounded to 1dp is 3.1
3.1415926535 rounded to 4dp is 3.1416    <-- Note the 5 changed to 6
3.1415926535 rounded to 5dp is 3.14159

3.1415926535 rounded to 9dp is 3.141592654  <-- Note the 3 changed to 4

Anda tantangan adalah menerima bilangan bulat sebagai input dan output jumlah tempat desimal sebelum yang Anda harus membulatkan akar kuadrat dari angka - yaitu jumlah tempat desimal sebelum angka angka yang >= 5terjadi.

Bilangan bulat akan berada di antara 0 dan 100.000 termasuk jadi untuk kasus tepi 59752 Anda harus mendukung 17 titik desimal (untuk memeriksa ke-17).

Jika bahasa pemrograman Anda tidak dapat mengubah jumlah titik desimal, Anda dapat menampilkan "?" pesan ke pengguna.

Contoh:

Input    Root                     Output

    5 -> 2.23 606797749979     -> 2
   41 -> 6.40312423 743284     -> 8      (Largest gap under 100)
  596 -> 24.4131112314 674     -> 10     (Largest gap under 1000)
59752 -> 244.44222221212112029 -> 16     (Largest gap under 100000)

Lakukan apa yang Anda inginkan pada kotak yang sempurna.

Ini adalah sehingga kode terpendek menang.


Bagi siapa pun yang tertarik, angka 310.617 adalah yang terbesar di bawah 1.000.000 dan memiliki 18 sebelum Anda mencapai angka >= 5.

Tim
sumber
Berapa banyak tempat desimal yang perlu kita dukung secara maksimal? - Tidak ada bahasa yang menyimpan hingga ketelitian tak terbatas.
Biru
Tidak yakin mengapa, tapi saya mendapatkan 17 digit untuk SQRT (59752) (dalam dua bahasa berbeda). Hasil lainnya keluar dengan benar.
Jonathan Leech-Pepin
@ JonathanLeech-Pepin apakah Anda termasuk digit terakhir karena suatu alasan? atau apakah program Anda tidak mendukung tempat desimal yang cukup.
Tim
Tidak pernah memiliki digit lebih besar dari 5. Program saya misalnya akan keluar dengan -1
Biru
@uddyfish tidak apa-apa.
Tim

Jawaban:

2

Pyth, 13 byte

f<5e@=*QC\d2Z

Suite uji

Mulai dengan Qsama dengan input. Pada setiap langkah waktu, kalikan Qdengan 100, dihitung sebagai chr('d'). Ambil akar kuadratnya. Ambil mod ini 10. Jika hasilnya lebih besar dari 5, akhiri. Cetak jumlah iterasi yang diperlukan untuk mengakhiri, diindeks 0.

Secara terperinci:

f<5e@=*QC\d2Z
                   Q = eval(input())
f           Z      Filter for the first truthy result over the infinite sequence
                   starting at Z (= 0)
     =*Q           Q *=
        C\d             chr('d') (= 100)
                   ---------------------
    @  Q   2          Q ^ (1/2)
   e                            % 10
 <5               5 <
isaacg
sumber
1

CJam, 29 26 28 byte

rimqs_'.+'.#)>{'5<}%0#]W'?er

Cobalah secara Online.

Menempatkan "?" jika angka tidak muncul yang dapat dibulatkan (kuadrat sempurna atau terlalu panjang).

geokavel
sumber
1

Pyth, 22 byte

J`%@Q2 1x.e<\4@Jbr2lJ1

Penjelasan

                       - Autoassign Q to evaluated input
   @Q2                 - Get the square root of Q
J`%    1               - Get the stuff after the decimal point and put it in a string. Store in J
         .e      r2lJ  - Create a range between 2 and the length of the string (forget about the 0. bit) and enumerate over it
              @Jb      - Get the current decimal place
           <\4         - Is it bigger than 4
        x            1 - Find the position of the first True value

Saya sangat yakin ini bisa golf. Jika input tidak memiliki angka lebih tinggi dari 4, itu akan mencetak -1. Mendukung 17dp.

Biru
sumber
1

Javascript, 59 byte

f=a=>(a=/\.(.*?)[5-9]/.exec(Math.sqrt(a)),a?a[1].length:'?')

Kembali ?untuk 59752 karena JavaScript hanya menggunakan presisi ganda.

Neil
sumber
1

Linux shell, 52 byte

dc -e'34k?vp'|cut -d. -f2|sed 's/.[5-9\s].*//'|wc -m

Saya mencoba untuk dcsolusi murni , tetapi gagal. Presisi dapat disesuaikan (angka pertama).

Karena OP dengan baik hati menyatakan bahwa "Anda dapat melakukan apa yang Anda inginkan pada kuadrat sempurna", dalam hal ini solusi ini menghasilkan presisi +1, dalam hal ini 35.

Félix Saparelli
sumber
1

Mathematica 60 byte

(Position[Drop@@RealDigits[N[Sqrt@#,99]],x_/;x>4][[1,1]]-1)&

Contoh

(Position[Drop@@RealDigits[N[Sqrt@#, 99]], x_ /; x > 4][[1, 1]] - 1) &[59752]

16

DavidC
sumber
Anda dapat menghapus spasi putih di sekitar Apply.
LegionMammal978
Terima kasih. Jumlah byte tetap sama karena saya belum menghitung spasi tersebut.
DavidC
-2

Ruby, 46 Bytes

Ini mungkin tidak valid, karena hanya muat 16 digit.

p (gets.to_i**0.5).to_s.split('.')[1]=~/[5-9]/
MegaTom
sumber
Apa output pada 59752?
Tim
nil, karena tidak ada digit melewati 4 berada di seluruh string. Ini mungkin tergantung pada versi ruby.
MegaTom
Perlu mendukung 59752 - jadi perlu 17 dps
Tim