Logaritma integer

12

Bilangan bulat yang diberikan N , P > 1, temukan bilangan bulat terbesar Msehingga P ^ M ≤ N.

I / O:

Input diberikan sebagai 2 bilangan bulat Ndan P. Outputnya adalah integer M.

Contoh:

4, 5 -> 0
33, 5 -> 2
40, 20 -> 1
242, 3 -> 4 
243, 3 -> 5 
400, 2 -> 8
1000, 10 -> 3

Catatan:

Input akan selalu valid, yaitu selalu lebih besar dari 1.

Kredit:

Kredit untuk nama tersebut masuk ke @cairdcoinheringaahing. 3 contoh terakhir adalah oleh @Nitrodon dan kredit untuk meningkatkan deskripsi pergi ke @Giuseppe.

Muhammad Salman
sumber
3
Saya tahu kita (komunitas PPCG) tampaknya bisa terlalu memilih hal-hal yang sangat kecil, tetapi komentar seperti milik saya benar-benar dimaksudkan, dengan itikad baik, untuk membuat tantangan lebih baik! Sekarang setelah diselesaikan, saya dengan senang hati memilih, dan menghapus komentar saya sebelumnya.
Giuseppe
9
Itulah alasan lain mengapa kami menyarankan memposting tantangan ke The Sandbox terlebih dahulu, sehingga Anda dapat menerima umpan balik yang bermanfaat, memposting tantangan besar, dan mendapatkan banyak jawaban berkualitas tinggi, dengan lebih sedikit keributan (seperti suara dekat dan turun). :)
Giuseppe
2
Anda selalu dapat memposting ke Ruang Obrolan PPCG umum meminta umpan balik tentang tantangan kotak pasir Anda untuk mendapatkan mereka sedikit lebih banyak perhatian.
Giuseppe
12
Hampir semua jawaban saat ini berdasarkan matematika titik-mengambang menghasilkan hasil yang salah bahkan untuk kasus-kasus sederhana seperti (1000, 10) karena kesalahan pembulatan, jadi saya menambahkan test case lain.
nwellnhof
3
@ MPW semua respons dihapus, dan saran yang saya buat diedit ke dalam pos, sehingga tidak lagi relevan.
Giuseppe

Jawaban:

8

Brain-Flak , 74 byte

(({}<>)[()])({()<(({})<({([{}]()({}))([{}]({}))}{})>){<>({}[()])}{}>}[()])

Cobalah online!

Ini menggunakan konsep yang sama dengan algoritma pembagian integer positif Brain-Flak standar.

# Push P and P-1 on other stack
(({}<>)[()])

# Count iterations until N reaches zero:
({()<

  # While keeping the current value (P-1)*(P^M) on the stack:
  (({})<

    # Multiply it by P for the next iteration
    ({([{}]()({}))([{}]({}))}{})

  >)

  # Subtract 1 from N and this (P-1)*(P^M) until one of these is zero
  {<>({}[()])}{}

# If (P-1)*(P^M) became zero, there is a nonzero value below it on the stack
>}

# Subtract 1 from number of iterations
[()])
Nitrodon
sumber
7

JavaScript (ES6), 22 byte

Disimpan 8 byte berkat @Neil

Mengambil input dalam sintaks currying (p)(n).

p=>g=n=>p<=n&&1+g(n/p)

Cobalah online!

Arnauld
sumber
6

Excel, 18 byte

=TRUNC(LOG(A1,A2))

Mengambil input "n" di A1, dan input "p" di A2.

qoou
sumber
Saya pikir Anda dapat menggunakan INTfungsi alih-alih TRUNCmenyimpan 2 byte.
pajonk
4

Jelly , 3 byte

bḊL

Ini tidak menggunakan aritmatika floating-point, jadi tidak ada masalah presisi.

Cobalah online!

Bagaimana itu bekerja

bḊL  Main link. Left argument: n. Right argument: p

b    Convert n to base p.
 Ḋ   Dequeue; remove the first base-p digit.
  L  Take the length.
Dennis
sumber
3

Retina 0.8.2 , 35 byte

.+
$*
+r`1*(\2)+¶(1+)$
#$#1$*1¶$2
#

Cobalah online! Penjelasan:

.+
$*

Konversikan argumen menjadi unary.

+r`1*(\2)+¶(1+)$
#$#1$*1¶$2

Jika argumen kedua membagi yang pertama, ganti argumen pertama dengan hasil #plus bilangan bulat, buang sisanya. Ulangi ini sampai argumen pertama kurang dari yang kedua.

#

Hitung berapa kali loop berjalan.

Neil
sumber
3

Japt, 8 byte

@<Vp°X}a

Cobalah

Shaggy
sumber
Ini benar-benar rapi, saya belum benar-benar melihat penggunaan yang baik untuk metode fungsi di Japt, ini adalah contoh yang baik.
Nit
@Nit, saya butuh waktu yang lama untuk memahami mereka juga - hanya baru-baru ini mulai mencari tahu untuk F.g()- tapi mereka sangat berguna.
Shaggy
3

Haskell , 30 byte

n!p=until((>n).(p^).(1+))(1+)0

Cobalah online!

Roman Czyborra
sumber
1
Entah until((>n).(p^))(1+)0-1atau until(\x->p^x*p>n)(1+)0membuat Anda ke 27 byte.
Lynn
3

Perl 6 , 13 byte

&floor∘&log

Cobalah online!

Rangkaian penyusun log dan lantai, secara implisit memiliki 2 argumen karena fungsi pertama log mengharapkan 2. Hasil adalah fungsi.

Phil H
sumber
3
Untuk argumen 1000, 10ini mengembalikan 2.
Sean
@Sean: Huh, masalah presisi yang menarik di sana
Phil H
3

Haskell , 16 byte

(floor.).logBase

Cobalah online!

Haskell dirancang oleh ahli matematika sehingga memiliki seperangkat fungsi terkait matematika yang bagus di Prelude.

benar-benar manusiawi
sumber
6
Tidak berfungsi untuk (1000, 10) karena kesalahan pembulatan.
nwellnhof
3

R , 25 byte

function(p,n)log(p,n)%/%1

Cobalah online!

Ambil log Pbasis Ndan lakukan pembagian integer 1, karena lebih pendek dari floor(). Ini sedikit menderita dari ketepatan numerik, jadi saya menyajikan jawaban di bawah ini juga, yang seharusnya tidak, terlepas dari kemungkinan integer overflow.

R , 31 byte

function(p,n)(x=p:0)[n^x<=p][1]

Cobalah online!

Giuseppe
sumber
1
Saya tidak tahu seberapa ketat tantangannya mengharuskan kami untuk melakukan kesalahan pembulatan tetapi misalnya, f (243,3) sama dengan 4 ketika mungkin diperlukan untuk menjadi 5.
JDL
@JDL itu poin yang adil; Saya percaya jawaban yang sangat tepat adalah ~ 31 byte.
Giuseppe
1
Saya pikir Anda dapat menggantinya pdengan p+.1jawaban 25 byte dan Anda akan tetap baik-baik saja, untuk 28 byte
JDL
Solusi 28 byte lainnya tanpa masalah ketelitian numerik.
Robin Ryder
2

Python 2 , 39 byte

lambda a,b:math.log(a,b)//1
import math

Cobalah online!

FlipTack
sumber
3
1000,10 sebagai input memberi 2 sebagai output.
Floris
2

Ruby , 31 byte

OK, jadi semua pendekatan berbasis log itu rentan terhadap kesalahan pembulatan, jadi di sini adalah metode lain yang bekerja dengan bilangan bulat dan bebas dari masalah itu:

->n,p{(0..n).find{|i|p**i>n}-1}

Cobalah online!

Tetapi kembali ke logaritma, meskipun tidak jelas sampai ketepatan apa kita harus mendukung input, tapi saya pikir trik kecil ini akan menyelesaikan masalah pembulatan untuk semua lebih atau kurang angka "realistis":

Ruby , 29 byte

->n,p{Math.log(n+0.1,p).to_i}

Cobalah online!

Kirill L.
sumber
2

C (gcc) + -lm, 24 byte

f(n,m){n=log(n)/log(m);}

Cobalah online!

betseg
sumber
Saya tahu long longtapi apa itu bytes bytes? : P
totallyhuman
Bendera juga tidak menambah jumlah byte Anda lagi, jadi saya diedit untuk mencerminkan ini.
manusiawi
5
Tidak berfungsi untuk (1000, 10) karena kesalahan pembulatan.
nwellnhof
f(n,m){n=(float)log(n)/log(m);}tampaknya berfungsi @ 31 byte
GPS
2

Emojicode , 49 48 byte

🍇i🚂j🚂➡️🚂🍎➖🐔🔡i j 1🍉

Cobalah online!

betseg
sumber
2

APL (Dyalog Unicode) , 2 byte

⌊⍟

Cobalah online!

Cukup mudah.

Catatan

lantai

J. Sallé
sumber
Buat diad untuk menghemat satu byte:⌊⍟
Adám
Saya sedikit malu Anda sebenarnya harus mengatakan itu kepada saya>.> Terima kasih!
J. Sallé
2

05AB1E , 6 byte

Lm¹›_O

Cobalah online!

Emigna
sumber
ini sepertinya tidak adil bagi semua orang
Floris
1
@Floris Competitions adalah antara pengiriman dalam setiap bahasa, bukan antar bahasa, bukan?
user202729
@ user202729 ya dan tidak. Dalam pikiran saya, pada akhirnya, "kode terpendek menang". Tapi saya perhatikan ada solusi 2-byte lebih jauh ... Bahasa-bahasa golf ini meniup pikiran saya.
Floris
1
@ Floris "Jangan biarkan bahasa kode-golf menghalangi Anda untuk mengirim jawaban dengan bahasa yang bukan kode. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'."
user202729
1
@ Floris Juga ... bahkan Excel dapat melakukannya dalam 2 bawaan . Bahasa golf dapat melakukan ini dalam 2 built-in juga, hanya nama builtin yang lebih pendek. Tidak ada yang mengejutkan.
user202729
2

Pari / GP, 6 byte

logint

(built-in ditambahkan dalam versi 2.7, Mar 2014. Membawa dua argumen, dengan referensi ketiga opsional yang, jika ada, diatur ke pangkalan yang diangkat ke hasil)

DanaJ
sumber
@StewieGriffin logint (x, y) dari Pari / GP dan Perl / nthory memberikan hasil yang benar untuk 7 contoh yang ditampilkan saat ini, termasuk '3' untuk 1000,10.
DanaJ
+1, tapi saya akan menghitung ini sebagai 6 byte.
Charles
2
Anda tidak boleh menggunakan input yang dikodekan dengan keras, jadi ini harus merupakan fungsi (mis. Sebagai lambda atau definisi). Namun Anda hanya dapat menggunakan logintmana yang valid dan kurang dari 5 byte.
ბიმო
2

Python 2, 3, 46 byte

-1 berkat jonathan

def A(a,b,i=1):
 while b**i<=a:i+=1
 return~-i

Python 1, 47 byte

def A(a,b,i=1):
 while b**i<=a:i=i+1
 return~-i
Vedant Kandoi
sumber
n~-ilebih pendek satu byte dari n i-1.
Jonathan Frech
Juga, sebutkan versi Python Anda.
Jonathan Frech
Akan bekerja dalam versi apa pun, bukan?
Vedant Kandoi
Ini tidak akan berfungsi dalam Python 1.
Jonathan Frech
2

JavaScript (Node.js) , 22 byte

m=>f=n=>n<m?0:f(n/m)+1

Cobalah online!

Fungsi rekursif kari. Gunakan sebagai g(P)(N). Kurang rentan terhadap kesalahan floating-point daripada menggunakanMath.log , dan (saya percaya) kode memberikan nilai yang benar selama kedua input adalah integer aman (di bawah 2**52).

Bubbler
sumber
1

Bahasa Wolfram (Mathematica) 15 10 Bytes

Floor@*Log 

(membutuhkan urutan terbalik pada input)

Pengiriman asli

⌊#2~Log~#⌋&
Kelly Lowder
sumber
⌊Log@##⌋&lebih pendek satu byte
Lukas Lang
@ Mathe172, itu satu karakter lebih pendek, tapi saya menghitung 13 byte itu. Lantai kiri dan lantai kanan dihitung masing-masing 3 byte dalam UTF-8.
Kelly Lowder
@StewieGriffin% [10.1000] memberi 3. Input diperlakukan sebagai bilangan bulat daripada nomor mesin kecuali Anda menempatkan tempat desimal setelahnya.
Kelly Lowder
1

Keempat (gforth) , 35 byte

: f swap s>f flog s>f flog f/ f>s ;

Cobalah online!

Bisa menghemat 5 byte dengan menukar parameter input yang diharapkan, tetapi pertanyaan menentukan N harus menjadi yang pertama (argumen dapat dibuat bahwa dalam bahasa postfix "Pertama" berarti top-of-stack, tapi saya akan tetap berpegang pada surat aturan untuk sekarang)

Penjelasan

swap       \ swap the parameters to put N on top of the stack
s>f flog   \ move N to the floating-point stack and take the log(10) of N
s>f flog   \ move P to the floating-point stack and take the log(10) of P
f/         \ divide log10(N) by log10(P)
f>s        \ move the result back to the main (integer) stack, truncating in the process
reffu
sumber
1

Pyth, 6 4 byte

s.lF

Disimpan 2 byte berkat Mmenomic
Cobalah online

Bagaimana itu bekerja

.lis log B (A)
Sejujurnya, saya tidak tahu cara Fkerjanya. Tetapi jika itu berhasil, itu akan berhasil.
smemotong float ke int untuk memberi kita integer tertinggi untuk M.

fortraan
sumber
2
1000,10 sebagai input memberikan 2 sebagai output
Stewie Griffin
Solusi serupa lainnya adalah/FlM
RK.
1

Bertanya-tanya , 9 byte

|_.sS log

Contoh penggunaan:

(|_.sS log)[1000 10]

Penjelasan

Versi verbal:

floor . sS log

Ini adalah gaya pointfree tertulis. sSmeneruskan item daftar sebagai argumen ke fungsi (dalam hal ini, log).

Mama Fun Roll
sumber
1

Gforth , 31 Bytes

SWAP S>F FLOG S>F FLOG F/ F>S .

Pemakaian

242 3 SWAP S>F FLOG S>F FLOG F/ F>S . 4 OK

Cobalah online!

Penjelasan

Sayangnya FORTH menggunakan stack-point-stack khusus. Untuk itu saya harus SWAP(bertukar) nilai input sehingga mereka sampai ke tumpukan floating point dalam urutan yang benar. Saya juga harus memindahkan nilai ke tumpukan itu S>F. Ketika memindahkan hasil floating-point kembali ke integer ( F>S) saya mendapat manfaat untuk mendapatkan pemotongan gratis.

Versi lebih pendek

Membentang persyaratan dan memberikan input dalam format float dan urutan yang tepat, ada versi yang lebih pendek dengan 24 byte.

FLOG FSWAP FLOG F/ F>S .
3e0 242e0 FLOG FSWAP FLOG F/ F>S . 4 OK

Cobalah online!

Kitana
sumber
Umumnya untuk jawaban CodeGolf, cuplikan tidak diizinkan (kecuali dinyatakan lain dalam tantangan). Jawaban ini harus dibungkus dengan fungsi (Word in Forth) : f .... ;atau dikonversi ke program yang mengambil input menggunakan KEYatauACCEPT
reffu
@reffu Apa itu cuplikan? Menurut pendapat saya kode smal bagian untuk menunjukkan sesuatu, yang, bagaimanapun, tidak ada artinya bagi dirinya sendiri. Di sisi lain, kode yang saya berikan tidak berfungsi tanpa perubahan pada "Coba online!". Haruskah kita menggunakan meta?
Kitana
Dalam kasus khusus ini, kode yang Anda poskan sebenarnya akan melempar setumpuk underflow kecuali Anda menempatkan parameter sebelumnya. Kode golf jawaban umumnya harus berupa program mandiri atau fungsi yang menghasilkan hasil yang diharapkan jika dipanggil nanti. Jika Anda mengikuti tautan ke pos meta di komentar saya sebelumnya, secara eksplisit disebutkan bahwa standar adalah untuk jawaban sebagai program atau fungsi, di mana Anda tidak memilikinya. Untuk memperbaikinya hanya akan membutuhkan 4 byte lagi
reffu
1

Japt , 5 byte

ìV ÊÉ

Cobalah online!


8 byte

N£MlXÃäz

Cobalah online!

Oliver
sumber
1
Adalah sekitar untuk memposting hal yang sama menggunakan ìbukan ssebagai sakan gagal jika V>36.
Shaggy
@Shaggy Panggilan bagus aktif V>36.
Oliver