Logarytmy całkowite

12

Biorąc pod uwagę liczby całkowite N , P > 1, znajdź największą liczbę całkowitą Mtaką, że P ^ M ≤ N.

I / O:

Dane wejściowe podano jako 2 liczby całkowite Ni P. Wyjście będzie liczbą całkowitą M.

Przykłady:

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

Uwagi:

Dane wejściowe zawsze będą prawidłowe, tzn. Zawsze będą liczbami całkowitymi większymi niż 1.

Kredyty:

Nazwa pochodzi od @cairdcoinheringaahing. Ostatnie 3 przykłady pochodzą od @Nitrodon, a zasługą za ulepszenie opisu jest @Giuseppe.

Muhammad Salman
źródło
3
Wiem, że my (społeczność PPCG) możemy wydawać się zbyt wybredni w kwestii naprawdę małych rzeczy, ale komentarze takie jak moje mają w dobrej wierze naprawdę służyć poprawie wyzwania! Teraz, gdy zostało to rozwiązane, z radością głosowałem i usunąłem moje poprzednie komentarze.
Giuseppe,
9
To kolejny powód, dla którego sugerujemy najpierw opublikowanie wyzwań w The Sandbox , abyś mógł otrzymać pomocne opinie, zamieścić wielkie wyzwanie i uzyskać wiele wysokiej jakości odpowiedzi, przy znacznie mniejszym zamieszaniu (np. Głosowanie w zbliżeniu i w dół). :)
Giuseppe,
2
Zawsze możesz wysyłać posty do ogólnego pokoju rozmów PPCG z prośbą o opinię na temat wyzwań związanych z piaskownicą, aby uzyskać nieco więcej uwagi.
Giuseppe,
12
Prawie wszystkie obecne odpowiedzi oparte na matematyce zmiennoprzecinkowej dają błędne wyniki nawet dla prostych przypadków, takich jak (1000, 10) z powodu błędu zaokrąglenia, więc dodałem kolejny przypadek testowy.
nwellnhof,
3
@MPW wszystkie odpowiedzi zostały usunięte, a moje sugestie zostały edytowane w poście, więc nie były już istotne.
Giuseppe,

Odpowiedzi:

8

Brain-Flak , 74 bajty

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

Wypróbuj online!

Wykorzystuje to tę samą koncepcję, co standardowy algorytm dodatniej liczby całkowitej Brain-Flaka.

# 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
źródło
7

JavaScript (ES6), 22 bajty

Zaoszczędź 8 bajtów dzięki @Neil

Pobiera dane wejściowe w składni curry (p)(n).

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

Wypróbuj online!

Arnauld
źródło
6

Excel, 18 bajtów

=TRUNC(LOG(A1,A2))

Przyjmuje wejście „n” w A1, a wejście „p” w A2.

qoou
źródło
Myślę, że możesz użyć INTfunkcji zamiast TRUNCzaoszczędzić 2 bajty.
pajonk
4

Galaretka , 3 bajty

bḊL

To nie używa arytmetyki zmiennoprzecinkowej, więc nie ma problemów z precyzją.

Wypróbuj online!

Jak to działa

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
źródło
3

Retina 0.8.2 , 35 bajtów

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

Wypróbuj online! Wyjaśnienie:

.+
$*

Konwertuj argumenty na jednoargumentowe.

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

Jeśli drugi argument dzieli pierwszy, zastąp pierwszy argument wynikiem #plus liczby całkowitej, odrzucając resztę. Powtarzaj to, aż pierwszy argument będzie mniejszy niż drugi.

#

Policz liczbę uruchomień pętli.

Neil
źródło
3

Japt, 8 bajtów

@<Vp°X}a

Spróbuj

Kudłaty
źródło
To jest naprawdę fajne, jeszcze nie widziałem dobrego zastosowania metod funkcji w Japt, to dobry przykład.
Nit
@Nit, zajęło mi to również trochę czasu, aby się z nimi poradzić - dopiero niedawno zacząłem rozróżniać zastosowania F.g()- ale są one niezwykle przydatne.
Kudłaty
3

Haskell , 30 bajtów

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

Wypróbuj online!

Roman Czyborra
źródło
1
Albo until((>n).(p^))(1+)0-1albo until(\x->p^x*p>n)(1+)0obniży cię do 27 bajtów.
Lynn
3

Perl 6 , 13 bajtów

&floor∘&log

Wypróbuj online!

Łączenie składające się z dziennika i podłogi, domyślnie zawiera 2 argumenty, ponieważ dziennik pierwszej funkcji oczekuje 2. Wynik jest funkcją.

Phil H.
źródło
3
Dla argumentów 1000, 10zwraca 2.
Sean
@Sean: Huh, ciekawy problem z precyzją
Phil H
3

Haskell , 16 bajtów

(floor.).logBase

Wypróbuj online!

Haskell został zaprojektowany przez matematyków, więc ma ładny zestaw funkcji matematycznych w Preludium.

całkowicie ludzki
źródło
6
Nie działa dla (1000, 10) z powodu błędu zaokrąglania.
nwellnhof
3

R , 25 bajtów

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

Wypróbuj online!

Weź dziennik Pbazy Ni dokonaj podziału liczb całkowitych 1, ponieważ jest on krótszy niż floor(). Trochę to cierpi z powodu precyzji numerycznej, więc przedstawiam również poniższą odpowiedź, która nie powinna, oprócz ewentualnego przepełnienia liczb całkowitych.

R , 31 bajtów

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

Wypróbuj online!

Giuseppe
źródło
1
Nie wiem, jak surowe wyzwanie wymaga od nas zaokrąglenia błędu, ale na przykład f (243,3) jest równe 4, gdy prawdopodobnie jest to wymagane 5.
JDL
@JDL to uczciwa kwestia; Uważam, że idealnie precyzyjna odpowiedź to ~ 31 bajtów.
Giuseppe,
1
Myślę, że możesz zastąpić podpowiedź p+.1w 25 bajtach i nadal będziesz w porządku, za 28 bajtów
JDL
Kolejne 28-bajtowe rozwiązanie bez problemów z dokładnością numeryczną.
Robin Ryder
2

Python 2 , 39 bajtów

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

Wypróbuj online!

FlipTack
źródło
3
1000,10 jako dane wejściowe daje 2 jako dane wyjściowe.
Floris,
2

Rubinowy , 31 bajtów

OK, więc wszystkie te podejścia oparte na logach są podatne na błędy zaokrąglania, więc oto inna metoda, która działa z liczbami całkowitymi i jest wolna od tych problemów:

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

Wypróbuj online!

Ale wracając do logarytmów, chociaż nie jest jasne, do jakiej precyzji musimy wesprzeć dane wejściowe, myślę jednak, że ta mała sztuczka rozwiązałaby problem zaokrąglania dla wszystkich mniej lub bardziej „realistycznych” liczb:

Ruby , 29 bajtów

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

Wypróbuj online!

Kirill L.
źródło
2

C (gcc) + -lm, 24 bajty

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

Wypróbuj online!

betseg
źródło
Wiem o long longczym, ale co to jest bytes bytes? : P
totalnie ludzki,
Również flagi nie dodają już więcej do twojej liczby bajtów, więc edytowałem je, aby to odzwierciedlić.
całkowicie ludzki,
5
Nie działa dla (1000, 10) z powodu błędu zaokrąglania.
nwellnhof
f(n,m){n=(float)log(n)/log(m);}wydaje się działać @ 31 bajtów
GPS
2

05AB1E , 6 bajtów

Lm¹›_O

Wypróbuj online!

Emigna
źródło
wydaje się to niesprawiedliwe dla wszystkich innych
Floris
1
Konkursy @Floris odbywają się między zgłoszeniami w każdym języku, a nie między językami, prawda?
user202729
@ user202729 tak i nie. Moim zdaniem „najkrótszy kod wygrywa”. Ale zauważyłem, że w dalszej części było rozwiązanie 2-bajtowe ... Te języki golfa oszalały.
Floris,
1
@Floris „Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach innych niż kodowanie. Spróbuj znaleźć możliwie najkrótszą odpowiedź na„ dowolny ”język programowania.”
user202729
1
@Floris Również ... nawet Excel może to zrobić w 2 wbudowanych wersjach . Języki gry w golfa mogą to zrobić również w 2 wbudowanych, tylko wbudowane nazwy są krótsze. Nic dziwnego.
user202729
2

Pari / GP, 6 bajtów

logint

(wbudowany dodany w wersji 2.7, marzec 2014. Bierze dwa argumenty, z opcjonalnym trzecim odniesieniem, które, jeśli jest obecne, jest ustawione na podstawę podniesioną do wyniku)

DanaJ
źródło
@StewieGriffin logint (x, y) zarówno z Pari / GP, jak i Perl / ntheory daje prawidłowe wyniki dla 7 pokazanych obecnie przykładów, w tym „3” dla 1000,10.
DanaJ
+1, ale liczyłbym to jako 6 bajtów.
Charles
2
Nie wolno używać wejść zakodowanych na stałe, więc musi to być funkcja (np. Jako lambda lub definicja). Jednak możesz po prostu użyć tego, logintco jest prawidłowe i liczy 5 bajtów mniej.
ბიმო
2

Python 2, 3, 46 bajtów

-1 dzięki jonathan

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

Python 1, 47 bajtów

def A(a,b,i=1):
 while b**i<=a:i=i+1
 return~-i
Wedant Kandoi
źródło
n~-ijest o jeden bajt krótszy niż n i-1.
Jonathan Frech,
Proszę również podać wersję swojego Pythona.
Jonathan Frech,
Będzie działać w dowolnej wersji, prawda?
Vedant Kandoi,
Nie zadziała w Pythonie 1.
Jonathan Frech,
2

JavaScript (Node.js) , 22 bajty

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

Wypróbuj online!

Cururs funkcja rekurencyjna. Użyj jako g(P)(N). Mniej podatny na błędy zmiennoprzecinkowe niż używanieMath.log i (uważam) kod podaje poprawne wartości, o ile oba wejścia są bezpiecznymi liczbami całkowitymi (poniżej 2**52).

Bubbler
źródło
1

Wolfram Language (Mathematica) 15 10 bajtów

Floor@*Log 

(wymaga odwróconej kolejności na wejściu)

Oryginalne zgłoszenie

⌊#2~Log~#⌋&
Kelly Lowder
źródło
⌊Log@##⌋&jest o jeden bajt krótszy
Lukas Lang,
@ Mathe172, to jeden znak krótszy, ale liczę na to 13 bajtów. Lewa podłoga i prawa podłoga liczą się jako 3 bajty w UTF-8.
Kelly Lowder,
@StewieGriffin% [10,1000] daje 3. Dane wejściowe są traktowane raczej jako liczby całkowite niż liczby maszynowe, chyba że po nich wstawisz miejsce dziesiętne.
Kelly Lowder,
1

Dalej (gforth) , 35 bajtów

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

Wypróbuj online!

Można zapisać 5 bajtów poprzez zamianę oczekiwanych parametrów wejściowych, ale pytanie określa, że ​​N musi być pierwsze (można argumentować, że w języku postfiksowym „Pierwszy” oznacza górę stosu, ale pozostanę przy literze reguł dla teraz)

Wyjaśnienie

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
źródło
1

Pyth, 6 4 bajty

s.lF

Zaoszczędź 2 bajty dzięki Mmenomic
Wypróbuj online

Jak to działa

.lto log B (A)
Szczerze mówiąc, nie mam pojęcia, jak to Fdziała. Ale jeśli to działa, to działa.
sobcina liczbę zmiennoprzecinkową do liczby całkowitej, aby dać nam najwyższą liczbę całkowitą M.

fortraan
źródło
2
1000,10 jako dane wejściowe daje 2 jako dane wyjściowe
Stewie Griffin
Innym podobnym rozwiązaniem jest/FlM
RK.
1

Cud , 9 bajtów

|_.sS log

Przykładowe użycie:

(|_.sS log)[1000 10]

Wyjaśnienie

Pełna wersja:

floor . sS log

Jest to napisane bezsensownie. sSprzekazuje elementy listy jako argumenty do funkcji (w tym przypadku, log).

Mama Fun Roll
źródło
1

Gforth , 31 bajtów

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

Stosowanie

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

Wypróbuj online!

Wyjaśnienie

Niestety FORTH używa dedykowanego stosu zmiennoprzecinkowego. W tym celu muszę SWAP(wymienić) wartości wejściowe, aby dotarły do ​​stosu zmiennoprzecinkowego w odpowiedniej kolejności. Muszę także przenieść wartości na ten stos S>F. Podczas przenoszenia wyniku zmiennoprzecinkowego z powrotem na liczbę całkowitą (F>S ), mam tę zaletę, że otrzymuję obcięcie za darmo.

Krótsza wersja

Rozciągając wymagania i wprowadzając dane w formacie zmiennoprzecinkowym oraz we właściwej kolejności, istnieje krótsza wersja z 24 bajtami.

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

Wypróbuj online!

Kitana
źródło
Zasadniczo w przypadku odpowiedzi CodeGolf fragmenty są niedozwolone (o ile nie wskazano inaczej w wyzwaniu). Ta odpowiedź powinna być albo opakowana funkcją (Word in Forth), : f .... ;albo przekonwertowana na program, który pobiera dane wejściowe przy użyciu KEYlubACCEPT
reffu
@reffu Co to jest fragment? Moim zdaniem niewielka część kodu pokazuje coś, co jednak nie ma dla siebie żadnego znaczenia. Z drugiej strony kod, który podałem, działa bez zmian w „Wypróbuj online!”. Czy powinniśmy iść na meta?
Kitana
W tym szczególnym przypadku kod, który opublikowałeś, spowoduje w rzeczywistości niedopełnienie stosu, chyba że umieścisz parametry przed nim. Kodowe odpowiedzi na golfa powinny zasadniczo być samodzielnym programem lub funkcją, która przyniesie później oczekiwany rezultat. Jeśli podążysz za linkiem do meta postu w moim poprzednim komentarzu, wyraźnie wspominasz, że standardem jest odpowiedź na program lub funkcję, z których Twoja nie jest żadna. Aby to naprawić wymagałoby to tylko 4 kolejnych bajtów
reffu
1

Japt , 5 bajtów

ìV ÊÉ

Wypróbuj online!


8 bajtów

N£MlXÃäz

Wypróbuj online!

Oliver
źródło
1
Miałem zamiar opublikować to samo za pomocą ìzamiast sjak snie powiedzie się, jeśli V>36.
Kudłaty
@Shaggy Good call on V>36.
Oliver,