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.


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

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!


6

Excel, 18 bajtów

=TRUNC(LOG(A1,A2))

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


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.

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.


3

Japt, 8 bajtów

@<Vp°X}a

Spróbuj


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

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ą.


3
Dla argumentów 1000, 10zwraca 2.
Sean

@Sean: Huh, ciekawy problem z precyzją
Phil H


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!


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

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!





2

05AB1E , 6 bajtów

Lm¹›_O

Wypróbuj online!


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)


@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.
ბიმო





1

Wolfram Language (Mathematica) 15 10 bajtów

Floor@*Log 

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

Oryginalne zgłoszenie

⌊#2~Log~#⌋&

⌊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

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.


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).


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!


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



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.