Ganzzahlige Logarithmen

12

N , P > 1Finden Sie bei gegebenen Ganzzahlen die größte Ganzzahl Mso, dass P ^ M ≤ N.

I / O:

Die Eingabe erfolgt als 2 Ganzzahlen Nund P. Die Ausgabe ist die Ganzzahl M.

Beispiele:

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

Anmerkungen:

Die Eingabe ist immer gültig, dh es sind immer ganze Zahlen größer als 1.

Credits:

Der Name geht an @cairdcoinheringaahing. Die letzten 3 Beispiele stammen von @Nitrodon und die Beschreibung wurde an @Giuseppe weitergeleitet.

Muhammad Salman
quelle
3
Ich weiß, dass wir (die PPCG-Community) in Bezug auf wirklich kleine Dinge zu wählerisch erscheinen können, aber Kommentare wie meine sind wirklich in gutem Glauben dazu gedacht, die Herausforderung besser zu machen! Jetzt, da das geklärt ist, habe ich glücklich abgestimmt und meine vorherigen Kommentare gelöscht.
Giuseppe
9
Dies ist ein weiterer Grund, warum wir vorschlagen, Herausforderungen zuerst in The Sandbox zu veröffentlichen , damit Sie hilfreiche Rückmeldungen erhalten, eine große Herausforderung posten und viele qualitativ hochwertige Antworten mit viel weniger Aufwand (wie Schluss- und Schlussabstimmungen) erhalten können. :)
Giuseppe
2
Sie können jederzeit im allgemeinen PPCG-Chatroom nach Feedback zu Ihren Sandbox-Herausforderungen fragen, um ihnen ein wenig mehr Aufmerksamkeit zu verschaffen .
Giuseppe
12
Fast alle aktuellen Antworten, die auf Gleitkomma-Berechnungen basieren, liefern aufgrund von Rundungsfehlern falsche Ergebnisse, auch für einfache Fälle wie (1000, 10). Deshalb habe ich einen weiteren Testfall hinzugefügt.
Nwellnhof
3
@MPW Alle Antworten wurden gelöscht, und die Vorschläge, die ich gemacht habe, wurden in den Beitrag eingefügt, sodass sie nicht mehr relevant waren.
Giuseppe

Antworten:

8

Brain-Flak , 74 Bytes

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

Probieren Sie es online!

Dies verwendet dasselbe Konzept wie der Standardalgorithmus für die positive Ganzzahlteilung nach Brain-Flak.

# 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
quelle
7

JavaScript (ES6), 22 Byte

8 Bytes dank @Neil gespeichert

Übernimmt Eingaben in der Currying-Syntax (p)(n).

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

Probieren Sie es online!

Arnauld
quelle
6

Excel, 18 Bytes

=TRUNC(LOG(A1,A2))

Nimmt an A1 die Eingabe "n" und an A2 die Eingabe "p".

qoou
quelle
Ich denke, Sie können die INTFunktion verwenden TRUNC, um 2 Bytes zu sparen.
Pajonk
4

Gelee , 3 Bytes

bḊL

Dies verwendet keine Gleitkomma-Arithmetik, daher gibt es keine Genauigkeitsprobleme.

Probieren Sie es online!

Wie es funktioniert

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
quelle
3

Retina 0.8.2 , 35 Bytes

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

Probieren Sie es online! Erläuterung:

.+
$*

Konvertieren Sie die Argumente in unary.

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

Wenn das zweite Argument das erste trennt, ersetzen Sie das erste Argument durch ein #Pluszeichen und verwerfen Sie den Rest. Wiederholen Sie diesen Vorgang, bis das erste Argument kleiner als das zweite ist.

#

Zählen Sie, wie oft die Schleife ausgeführt wurde.

Neil
quelle
3

Japt, 8 Bytes

@<Vp°X}a

Versuch es

Zottelig
quelle
Das ist wirklich ordentlich, ich habe noch keine gute Verwendung für die Funktionsmethoden in Japt gesehen, dies ist ein gutes Beispiel.
Nit
@Nein, es hat eine Weile gedauert, bis ich sie auch in den Griff bekommen habe - ich habe erst kürzlich angefangen herauszufinden, wofür sie verwendet werden F.g()-, aber sie sind unglaublich nützlich.
Shaggy
3

Haskell , 30 Bytes

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

Probieren Sie es online!

Roman Czyborra
quelle
1
Entweder until((>n).(p^))(1+)0-1oder until(\x->p^x*p>n)(1+)0bringt Sie auf 27 Bytes.
Lynn
3

Perl 6 , 13 Bytes

&floor∘&log

Probieren Sie es online!

Die Verkettung, die Protokoll und Floor zusammensetzt, hat implizit 2 Argumente, da das erste Funktionsprotokoll 2 erwartet. Ergebnis ist eine Funktion.

Phil H
quelle
3
Für Argumente gibt 1000, 10dies 2 zurück.
Sean
@ Sean: Huh, interessantes Präzisionsproblem dort
Phil H
3

Haskell , 16 Bytes

(floor.).logBase

Probieren Sie es online!

Haskell wurde von Mathematikern entwickelt, sodass es in Prelude eine Reihe nützlicher mathematischer Funktionen enthält.

total menschlich
quelle
6
Funktioniert nicht für (1000, 10) wegen Rundungsfehlers.
Nwellnhof
3

R , 25 Bytes

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

Probieren Sie es online!

Nehmen Sie das Protokoll der PBasis Nund teilen Sie die Ganzzahl mit 1, da es kürzer als ist floor(). Dies leidet ein wenig unter der numerischen Genauigkeit, daher präsentiere ich auch die folgende Antwort, die, abgesehen von einem möglicherweise ganzzahligen Überlauf, nicht erfolgen sollte.

R , 31 Bytes

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

Probieren Sie es online!

Giuseppe
quelle
1
Ich weiß nicht, wie streng die Anforderung ist, dass wir auf Rundungsfehler sind, aber zum Beispiel ist f (243,3) gleich 4, wenn es wahrscheinlich 5 sein muss.
JDL
@ JDL das ist ein fairer Punkt; Ich glaube eine absolut präzise Antwort wäre ~ 31 Bytes.
Giuseppe
1
Ich denke, Sie können pdurch p+.1in der 25-Byte-Antwort ersetzen und Sie werden immer noch in Ordnung sein, für 28 Bytes
JDL
Eine weitere 28-Byte-Lösung ohne numerische Genauigkeitsprobleme.
Robin Ryder
2

Ruby , 31 Bytes

OK, all diese logbasierten Ansätze neigen zu Rundungsfehlern. Hier ist eine andere Methode, die mit ganzen Zahlen funktioniert und frei von diesen Problemen ist:

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

Probieren Sie es online!

Zurück zu den Logarithmen, obwohl nicht klar ist, bis zu welcher Genauigkeit wir die Eingabe unterstützen müssen, würde dieser kleine Trick meiner Meinung nach das Rundungsproblem für alle mehr oder weniger "realistischen" Zahlen lösen:

Ruby , 29 Bytes

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

Probieren Sie es online!

Kirill L.
quelle
2

C (gcc) + -lm24 Bytes

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

Probieren Sie es online!

betseg
quelle
Ich weiß, long longaber was ist bytes bytes? : P
totalhuman
Auch Flags werden nicht mehr zu Ihrer Byteanzahl hinzugefügt, daher habe ich sie bearbeitet, um dies zu berücksichtigen.
Totalhuman
5
Funktioniert nicht für (1000, 10) wegen Rundungsfehlers.
Nwellnhof
f(n,m){n=(float)log(n)/log(m);}scheint @ 31 Bytes zu arbeiten
GPS
2

05AB1E , 6 Bytes

Lm¹›_O

Probieren Sie es online!

Emigna
quelle
Dies scheint nur für alle anderen unfair
Floris
1
@ Floris Wettbewerbe finden zwischen Einsendungen in jeder Sprache statt, nicht zwischen Sprachen, oder?
user202729
@ user202729 ja und nein. Meiner Meinung nach gewinnt am Ende "kürzester Code". Aber ich bemerkte, dass es weiter unten eine 2-Byte-Lösung gab ... Diese Golfsprachen haben mich umgehauen.
Floris
1
@Floris "Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für 'jede' Programmiersprache eine möglichst kurze Antwort zu finden."
User202729
1
@ Floris Auch ... sogar Excel kann es in 2 eingebauten tun . Golf-Sprachen können dies auch in 2 eingebauten Sprachen tun, nur die eingebauten Namen sind kürzer. Nichts zu überraschen.
user202729
2

Pari / GP, 6 Bytes

logint

(Eingebaut in Version 2.7, März 2014. Ergibt zwei Argumente mit einem optionalen dritten Verweis, der, falls vorhanden, auf die Basis gesetzt wird, die auf das Ergebnis angehoben wird.)

DanaJ
quelle
@StewieGriffin-Logint (x, y) von Pari / GP und Perl / ntheory liefert die korrekten Ergebnisse für die derzeit gezeigten 7 Beispiele, einschließlich '3' für 1000,10.
DanaJ
+1, aber ich würde dies als 6 Bytes zählen.
Charles
2
Sie dürfen keine fest codierten Eingaben verwenden, daher muss dies eine Funktion sein (z. B. als Lambda oder Definition). Sie können jedoch nur verwenden, logintwas gültig ist und 5 Bytes weniger zählt.
ბიმო
2

Python 2, 3, 46 Bytes

-1 danke an jonathan

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

Python 1, 47 Bytes

def A(a,b,i=1):
 while b**i<=a:i=i+1
 return~-i
Vedant Kandoi
quelle
n~-iist ein Byte kürzer als n i-1.
Jonathan Frech
Bitte geben Sie auch Ihre Python-Version an.
Jonathan Frech
Funktioniert in jeder Version, nicht wahr?
Vedant Kandoi
In Python 1 funktioniert das nicht.
Jonathan Frech
2

JavaScript (Node.js) , 22 Byte

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

Probieren Sie es online!

Curry-rekursive Funktion. Verwenden Sie als g(P)(N). Es ist weniger anfällig für Gleitkommafehler als die VerwendungMath.log , und (glaube ich) der Code gibt korrekte Werte an, solange beide Eingaben sichere Ganzzahlen (unter 2**52) sind.

Bubbler
quelle
1

Wolfram-Sprache (Mathematica) 15 10 Bytes

Floor@*Log 

(erfordert umgekehrte Reihenfolge bei der Eingabe)

Ursprüngliche Vorlage

⌊#2~Log~#⌋&
Kelly Lowder
quelle
⌊Log@##⌋&ist ein Byte kürzer
Lukas Lang
@ Mathe172, das ist ein Zeichen kürzer, aber ich zähle 13 Bytes. Die linke und rechte Etage zählen in UTF-8 jeweils 3 Byte.
Kelly Lowder
@StewieGriffin% [10,1000] ergibt 3. Die Eingaben werden als Ganzzahlen und nicht als Maschinennummern behandelt, es sei denn, Sie setzen eine Dezimalstelle nach ihnen.
Kelly Lowder
1

Viertens (viertens) , 35 Bytes

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

Probieren Sie es online!

Konnte 5 Bytes einsparen, indem die erwarteten Eingabeparameter ausgetauscht wurden, aber die Frage gibt an, dass N an erster Stelle stehen muss (ein Argument könnte lauten, dass "First" in einer Postfix-Sprache "Top-of-Stack" bedeutet, aber ich halte mich an den Buchstaben der Regeln für jetzt)

Erläuterung

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
quelle
1

Pyth, 6 4 Bytes

s.lF

Dank Mmenomic 2 Bytes gespart
Probieren Sie es online aus

Wie es funktioniert

.list log B (A)
Um ehrlich zu sein, ich habe keine Ahnung, wie das Ffunktioniert. Aber wenn es funktioniert, funktioniert es.
sschneidet ein Float auf ein Int ab, um die höchste Ganzzahl für zu erhalten M.

fortraan
quelle
2
1000,10 als Eingänge gibt 2 als Ausgang
Stewie Griffin
Eine andere ähnliche Lösung ist/FlM
RK.
1

Wunder , 9 Bytes

|_.sS log

Beispielverwendung:

(|_.sS log)[1000 10]

Erläuterung

Ausführliche Version:

floor . sS log

Dies ist pointfree Stil geschrieben. sSÜbergibt Listenelemente als Argumente an eine Funktion (in diesem Fall log).

Mama Fun Roll
quelle
1

Gforth , 31 Bytes

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

Verwendung

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

Probieren Sie es online!

Erläuterung

Leider verwendet FORTH einen dedizierten Gleitkommastapel. Dafür muss ich SWAPdie Eingabewerte austauschen, damit sie in der richtigen Reihenfolge zum Gleitkommastapel gelangen. Ich muss auch die Werte zu diesem Stapel mit verschieben S>F. Beim Verschieben des Gleitkommaergebnisses zurück auf Ganzzahl (F>S ich ) verschiebe, habe ich den Vorteil, dass ich die Kürzung kostenlos bekomme.

Kürzere Version

Ausgehend von den Anforderungen und der Bereitstellung der Eingabe im Float-Format und in der richtigen Reihenfolge gibt es eine kürzere Version mit 24 Bytes.

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

Probieren Sie es online!

Kitana
quelle
Bei CodeGolf-Antworten sind Snippets im Allgemeinen nicht zulässig (sofern in der Challenge nicht anders angegeben). Diese Antwort sollte entweder mit einer Funktion (Word in Forth) umbrochen : f .... ;oder in ein Programm konvertiert werden, das Eingaben mithilfe von KEYorACCEPT
reffu am
@treffu Was ist ein Schnipsel? Meiner Meinung nach soll ein kleiner Codeteil etwas zeigen, was aber nichts für sich aussagt. Andererseits funktioniert der von mir bereitgestellte Code ohne Änderungen bei "Online ausprobieren!". Sollen wir Meta gehen?
Kitana
In diesem speziellen Fall wird der von Ihnen veröffentlichte Code tatsächlich einen Stapelunterlauf auslösen, es sei denn, Sie stellen die Parameter davor. Code Golf Antworten sollten im Allgemeinen ein eigenständiges Programm oder eine eigenständige Funktion sein, die das erwartete Ergebnis liefert, wenn sie später aufgerufen werden. Wenn Sie dem Link zum Metapost in meinem vorherigen Kommentar folgen, wird explizit erwähnt, dass der Standard darin besteht, dass Antworten ein Programm oder eine Funktion sind, von denen Ihre keine sind. Um das
Problem