Tamsayı logaritmaları


12

Tamsayılar verildiğinde N , P > 1, en büyük tamsayıyı Mbu şekilde bulun P ^ M ≤ N.

I / O:

Giriş 2 tamsayı olarak verilir Nve P. Çıktı tam sayı olacaktır M.

Örnekler:

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

Notlar:

Giriş her zaman geçerli olacaktır, yani her zaman 1'den büyük tamsayılar olacaktır.

Kredi:

İsim için kredi @cairdcoinheringaahing adresine gidiyor. Son 3 örnek @Nitrodon tarafından yapılmıştır ve açıklamanın iyileştirilmesi için kredi @Giuseppe'ye gider.


3
Biliyoruz ki (PPCG topluluğu) gerçekten küçük şeyler hakkında aşırı derecede seçici görünebilir, ancak benimki gibi yorumlar gerçekten iyi niyetle, meydan okumayı daha iyi hale getirmek için tasarlanmıştır! Şimdi bu çözüldü, mutlu bir şekilde oy verdim ve önceki yorumlarımı sildim.
Giuseppe

9
Bu , önce Sandbox'a zorluklar göndermenizi önermemizin bir başka nedeni , böylece çok daha az yaygarayla (yakın ve aşağı oylar gibi) yararlı geri bildirim almak, büyük bir meydan okuma göndermek ve çok sayıda yüksek kaliteli yanıt almak. :)
Giuseppe

2
Her zaman genel PPCG Sohbet Odasına göndererek, sandbox zorluklarınız hakkında biraz daha dikkat çekmek için geri bildirim isteyebilirsiniz .
Giuseppe

12
Kayan nokta matematiğine dayanan mevcut cevapların neredeyse tamamı, yuvarlama hatası nedeniyle (1000, 10) gibi basit durumlarda bile yanlış sonuçlar üretiyor, bu yüzden başka bir test örneği ekledim.
nwellnhof

3
@MPW tüm yanıtlar silindi ve yaptığım öneriler yazıya düzenlendi, dolayısıyla artık alakalı değillerdi.
Giuseppe

Yanıtlar:


8

Brain-Flak , 74 bayt

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

Çevrimiçi deneyin!

Bu, standart Brain-Flak pozitif tamsayı bölme algoritmasıyla aynı kavramı kullanır.

# 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
[()])


6

Excel, 18 bayt

=TRUNC(LOG(A1,A2))

A1'de "n" girişini ve A2'de "p" girişini alır.


Sanırım 2 bayt kaydetmek INTyerine işlevi kullanabilirsiniz TRUNC.
pajonk

4

Jöle , 3 bayt

bḊL

Bu kayan nokta aritmetiği kullanmaz, bu nedenle hassas bir sorun yoktur.

Çevrimiçi deneyin!

Nasıl çalışır

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.

3

Retina 0.8.2 , 35 bayt

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

Çevrimiçi deneyin! Açıklama:

.+
$*

Bağımsız değişkenleri tekli'ye dönüştürün.

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

İkinci bağımsız değişken birinciyi bölerse, ilk bağımsız değişkeni bir #artı tamsayı sonucuyla değiştirin, geri kalanını atın. İlk argüman ikinciden az oluncaya kadar bunu tekrarlayın.

#

Döngünün kaç kez çalıştığını sayın.


3

Japt, 8 bayt

@<Vp°X}a

Dene


Bu gerçekten düzgün, Japt'taki işlev yöntemleri için gerçekten iyi bir kullanım görmedim, bu iyi bir örnek.
Nit

@Nit, onlarla başa çıkmak benim için iyi bir zaman aldı - sadece son zamanlarda kullanımları anlamaya başladı F.g()- ama inanılmaz derecede faydalılar.
Shaggy


3

Perl 6 , 13 bayt

&floor∘&log

Çevrimiçi deneyin!

Günlük ve kattan oluşan birleştirme, ilk işlev günlüğü 2'yi beklediğinden dolaylı olarak 2 bağımsız değişkeni vardır. Sonuç bir işlevdir.


3
Tartışmalar için 1000, 10bu 2
Sean

@Sean: Ha, ilginç hassasiyet sorunu
Phil H


3

R , 25 bayt

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

Çevrimiçi deneyin!

PTaban günlüğünü alın ve daha kısa olduğu için Ntamsayı bölünmesi yapın . Bu, sayısal hassasiyetten biraz muzdariptir, bu nedenle, muhtemelen tamsayı taşması dışında aşağıdaki cevabı da sunuyorum.1floor()

R, , 31 bayt

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

Çevrimiçi deneyin!


1
Zorluğun yuvarlama hatası yapmamızı gerektirdiğini bilmiyorum, ancak örneğin 5 olması gerektiğinde f (243,3) 4'e eşittir.
JDL

@JDL bu adil bir nokta; Mükemmel bir cevabın ~ 31 byte olacağına inanıyorum.
Giuseppe

1
Sana yerini alabilir mi ptarafından p+.125 bayt yanıtında ve hala 28 bayt için düzelecek
JDL

Sayısal hassasiyet sorunları olmayan 28 baytlık bir çözüm daha .
Robin Ryder


2

Yakut , 31 bayt

Tamam, bu yüzden tüm bu log tabanlı yaklaşımlar yuvarlama hatalarına yatkındır, bu yüzden tamsayılarla çalışan ve bu sorunlardan arınmış başka bir yöntem:

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

Çevrimiçi deneyin!

Ancak logaritmalara geri dönersek, girdiyi hangi hassasiyetle desteklememiz gerektiği belirsiz olsa da, ancak bu küçük hile, aşağı yukarı "gerçekçi" sayılar için yuvarlama sorununu çözecektir:

Ruby , 29 bayt

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

Çevrimiçi deneyin!


2

C (gcc) + -lm, 24 bayt

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

Çevrimiçi deneyin!


Ben biliyorum long longama ne bytes bytes? : P
totallyhuman

Ayrıca bayraklar artık bayt sayınıza eklenmiyor, bu yüzden bunu yansıtmak için düzenledim.
totallyhuman

5
Yuvarlama hatası nedeniyle (1000, 10) için çalışmıyor.
nwellnhof

f(n,m){n=(float)log(n)/log(m);}31 bayt @ çalışıyor gibi görünüyor
GPS



2

05AB1E , 6 bayt

Lm¹›_O

Çevrimiçi deneyin!


bu sadece herkes için haksızlık gibi görünüyor
Floris

1
@Floris Müsabakaları diller arasında değil, her dilde yapılan sunumlar arasında mı?
user202729

@ user202729 evet ve hayır. Aklımda, sonunda, "en kısa kod kazanır". Ama daha sonra 2 baytlık bir çözüm olduğunu fark ettim ... Bu golf dilleri aklımı başımdan aldı.
Floris

1
@Floris "Kod-golf dillerinin kod-bilmeyen dillerle cevap göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
user202729

1
@Floris Ayrıca ... Excel bile 2 yerleşik bunu yapabilir . Golf dilleri bunu 2 yerleşik olarak da yapabilir, sadece yerleşik isimler daha kısadır. Sürpriz olacak bir şey yok.
user202729


2

Pari / GP, 6 bayt

logint

(dahili sürüm 2.7, Mart 2014'te eklenmiştir. Varsa, sonuca yükseltilen tabana ayarlanmış isteğe bağlı üçüncü bir referansla iki argüman alır)


Hem Pari / GP hem de Perl / ntheory'den @StewieGriffin logint (x, y), şu anda gösterilen 7 örnek için doğru sonuçları verir; 1000,10 için '3'.
DanaJ

+1, ancak bunu 6 bayt olarak sayabilirim.
Charles

2
Sabit kodlanmış girişleri kullanmanıza izin verilmez, bu nedenle bu bir işlev olmalıdır (örn. Lambda veya tanım olarak). Ancak logint, geçerli olan ve 5 bayt daha az olan sadece kullanabilirsiniz .
ბიმო





1

Wolfram Dili (Mathematica) 15 10 Bayt

Floor@*Log 

(girişte ters sıralamayı gerektirir)

Orijinal gönderim

⌊#2~Log~#⌋&

⌊Log@##⌋& bir bayt daha kısa
Lukas Lang

@ Mathe172, bu bir karakter daha kısa, ama ben bunun üzerinde 13 bayt sayıyorum. Sol kat ve sağ kat UTF-8'de her biri 3 bayt olarak sayılır.
Kelly Lowder

@StewieGriffin% [10,1000] 3 değerini verir. Onlara ondalık basamak koymadığınız sürece girdiler makine sayısı yerine tamsayı olarak kabul edilir.
Kelly Lowder

1

İleri (gforth) , 35 bayt

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

Çevrimiçi deneyin!

Beklenen giriş parametrelerini değiştirerek 5 bayt kaydedilebilir, ancak soru N'nin ilk olması gerektiğini belirtir (bir postfix dilinde "İlk" yığının en üstünde anlamına gelen bir argüman yapılabilir, ancak kuralların harfine bağlı kalacağım şimdi)

açıklama

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

1

Pyth, 6 4 bayt

s.lF

Mmenomic sayesinde 2 bayt kaydedildi
Çevrimiçi deneyin

Nasıl çalışır

.llog B (A)
Dürüst olmak gerekirse, nasıl Fçalıştığı hakkında hiçbir fikrim yok . Ama işe yarıyorsa işe yarıyor.
sbize en yüksek tamsayıyı vermek için şamandırayı bir int'e kısaltır M.


2
1000,10 girdi olarak 2 çıktı verir
Stewie Griffin

Başka bir benzer çözüm/FlM
RK.

1

Harika , 9 bayt

|_.sS log

Örnek kullanım:

(|_.sS log)[1000 10]

açıklama

Ayrıntılı sürüm:

floor . sS log

Bu noktadan bağımsız bir stil yazılmıştır. sSliste öğelerini bir işleve bağımsız değişken olarak geçirir (bu durumda, log).


1

Gforth , 31 Bayt

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

kullanım

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

Çevrimiçi deneyin!

açıklama

Ne yazık ki FORTH özel bir kayan nokta yığını kullanır. Bunun için SWAPonlar doğru sırayla kayan nokta yığını almak giriş değerleri (değişim) zorunda. Ayrıca değerleri bu yığına taşımak zorundaS>F . Kayan nokta sonucunu tamsayıya (F>S ) , kesmeyi ücretsiz olarak elde etme avantajım var.

Daha kısa versiyon

Gereksinimleri genişletmek ve girişi float biçiminde ve doğru sırada sağlamak için 24 baytlık daha kısa bir sürüm var.

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

Çevrimiçi deneyin!


Genellikle CodeGolf cevapları için, snippet'lere izin verilmez ( aksi belirtilmedikçe). Bu yanıt ya bir işlev (Word in Forth) ile : f .... ;ya KEYda veyaACCEPT
reffu

@reffu Parçacık nedir? Bence bir şey göstermek için küçük bir kod parçası, ancak, kendisi için anlamlı bir şey yok. Öte yandan, sağladığım kod "Çevrimiçi deneyin!" Meta gitmeli miyiz?
Kitana

Bu özel durumda, parametreleri kodun önüne yerleştirmedikçe, aslında koyduğunuz kod bir yığın alt akışı atar. Kod golf cevapları genellikle daha sonra çağrılırsa beklenen sonucu üreten bağımsız bir program veya işlev olmalıdır. Önceki yorumumda meta gönderinin bağlantısını takip ederseniz, standardın, cevapların bir program veya bir işlev olması için olduğu belirtilir; Düzeltmek için sadece 4 bayt gerekir
reffu



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.