Sei n
und b
sei positive ganze Zahlen größer als 1
.
Geben Sie die Entfernung von n
zur nächsten Potenz von aus b
.
Für n=5
und b=3
von dem nächsten Einschalten 3
von 5
ist 9
( 3^2 = 9
), so ist der Ausgang 9 - 5 = 4
.
Für n=8
und b=2
von dem nächsten Einschalten 2
von 8
ist 16
( 2^4 = 16
), so ist der Ausgang 16 - 8 = 8
. Beachten Sie, dass dies in diesem Beispiel n
eine Potenz von ist 2
.
Testfälle:
n b output
212 2 44
563 5 62
491 5 134
424 3 305
469 8 43
343 7 2058
592 7 1809
289 5 336
694 3 35
324 5 301
2 5 3
Das ist Code-Golf . Kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken .
code-golf
arithmetic
Undichte Nonne
quelle
quelle
;)æċ
!" anstelle von "oww das ist sooo schwer ..."æċ_⁸
x86-64-Assembly ( Windows x64-Aufrufkonvention ),
14 bis13 ByteEin ineffizienter (aber schlanker!) Iterativer Ansatz (mit Dank an @Neil für Inspiration):
Die obige Funktion akzeptiert zwei ganzzahlige Parameter
n
(imECX
Register übergeben) undb
(imEDX
Register übergeben) und gibt ein einzelnes ganzzahliges Ergebnis (imEAX
Register) zurück. Um es von C aufzurufen, würden Sie den folgenden Prototyp verwenden:Dies ist auf den Bereich einer 32-Bit-Ganzzahl beschränkt. Es kann leicht modifiziert werden, um 64-Bit-Ganzzahlen zu unterstützen, indem die vollständigen langen Register verwendet werden. Die Codierung dieser Befehle würde jedoch mehr Byte kosten. :-)
quelle
push 1
+pop rax
. Aber… dann müssten Sie die Multiplikation nicht überspringen, sodass dies immer noch eine sinnvolle Ersparnis wäre, da Sie die fallen lassen könntenjmp
.C (gcc) ,
39-35BytesNeues undefiniertes Verhalten dank Erik
Probieren Sie es online!
quelle
f(n,b,i){for(i=b;b<n;b*=i);n=b-n;}
spart 5 Bytes und wird von gccb-=n
?b-=n
wenn Sie die Reihenfolge vonb
und tauschenn
?Dyalog APL, 10 Bytes
2 Bytes gespart dank @ZacharyT
Probieren Sie es online!
Nimmt
n
als rechtes Argument undb
als linkes Argument.Berechnet .
b⌊logbn + 1⌋ - n
quelle
⊣-⍨⊢*1+∘⌊⍟⍨
.⊢-⍨⊣*1+∘⌊⍟
für 10 Bytes aber mit vertauschten Argumenten, so dassn
das richtige Argument undb
das linke Argument ist. Ich habe ZacharyTs Trick benutzt1+∘⌊
, um es so weit zu bringen.R ,
3834 BytesAnonyme Funktion. Speichert alle Werte von b hoch aller Werte im Bereich [0, n], subtrahiert n von jedem Wert, setzt positive Werte unter und gibt die min zurück.
TIO hat eine Nicht-Pryr-Version namens
f(n,b)
; Diese Version muss als aufgerufen werdenf(b,n)
.4 Bytes gespart dank Jarko Dubbeldam, der mich dann übertroffen hat.
Probieren Sie es online!
quelle
pryr::f({a=b^(0:n)-n;min(a[a>0])})
ist ein paar Bytes kürzer.pryr::f
als ich eine neue Variable in der Funktion definierte. sieht aus wie es hier funktioniert.sapply(x, sum)
oder was auch immer, dass essum
zu den Argumenten beiträgt.Cubix ,
2420 Bytes-4 Bytes dank MickyT
Liest in Eingabe wie
n,b
Passt auf einen 2x2x2 Würfel:
Erläuterung:
I|I0
: Eingabe lesen, 0 (Zähler) auf den Stapel schieben^w
Setzt die IP an die richtige Stelle für die Schleife:Pp-
: berechnenb^(counter)
,n
an die Spitze des Stapels verschieben, berechnenb^(counter) - n
?
: links abbiegen, wenn negativ, gerade, wenn 0, rechts, wenn positivO@
:: Stapel oben ausgeben (Abstand) und beenden.|?
:: Gehen Sie so vor, als ob die Oberseite des Stapels Null wäre<;qu;)
: Richten Sie die IP-Adresse in die richtige Richtung, legen Sie den oberenn
Rand des Stapels ab (negative / Null-Zahl), bewegen Sie sich zum unteren Rand des Stapels, drehen Sie sich um, legen Sie den oberen Rand des Stapels ab (b^(counter)
) und erhöhen Sie den Zähler^w
und das Programm wird fortgesetzt.Schau es dir online an!
Probieren Sie es online!
quelle
Pwp.I|-.;)^0@O?|uq;<
Haskell , 20 Bytes
Probieren Sie es online!
until
rettet den Tagquelle
05AB1E ,
98 BytesProbieren Sie es online!
Erläuterung
quelle
ć
stattdessen verwendet¬
.n
implizit wiederverwenden kann , sowohl beim Filtervergleich als auch bei der Berechnung der absoluten Differenz.Java (OpenJDK 8) , 42 Byte
Basierend auf der C-Antwort von @ GovindParmar .
Probieren Sie es online!
quelle
MATL ,
109 BytesProbieren Sie es online!
Erläuterung
Betrachten Sie Eingaben
694
und3
als Beispiel.quelle
JavaScript (ES6), 29 Byte
Sehr ähnlich wie Ricks Ansatz, aber mit seiner Erlaubnis gepostet (und etwas Hilfe beim Speichern eines Bytes).
Versuch es
quelle
Mathematica, 24 Bytes
Danke Martin
I / O
quelle
1/Log@##
oder verwenden#2~Log~#
. Oder noch besser die Reihenfolge der Eingaben vertauschen und verwendenLog@##
.#^Floor[...]#
kürzer als#^(Floor[...]+1)
. Und es gibt auch die Unicode-OperatorenFloor
.Log@##
! Eigentlich, wenn man die Argumentreihenfolge vertauscht,#^⌊Log@##⌋#-#2&
sollte das für -5 Bytes möglich sein (glaube ich)!C,
42 bis40 BytesVielen Dank an Kommentator @Steadybox für den Tipp
quelle
for
stattwhile
spart zwei Bytes:o;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}
n/b
stattdessen vorn>=b
R, 30 Bytes
Wertet die Funktion aus
n
Wobei die erste Potenz größer oder gleich ist und dann subtrahiertn
von diesem Wert .Geändert
ceiling(power)
,floor(power+1)
um sicherzustellen, dass, wennn
eine Kraft von istb
, wir die nächste Kraft nehmen.quelle
JavaScript (ES6), 31 Byte
Testfälle:
Code-Snippet anzeigen
quelle
n
undb
nurn
das Curren ausgeführt habe), da Sie dadurch nichtn
rekursiv übergeben müssen.n=>g=(b,p=b)=>p>n?p-n:g(b,p*b)
undn=>b=>(g=p=>p>n?p-n:g(p*b))(b)
.f=(n,i)=>g=(b=i)=>b>n?b-n:g(b*i)
für 30 Bytes arbeiten? Es müßte wie so genannt werden:f(324,5)()
. EDIT: Ah, @Neil hat mich geschlagen.Oktave , 32 Bytes
Probieren Sie es online!
quelle
Oktave, 26 Bytes
Überprüfen Sie alle Testfälle!
quelle
Ruby , 38 Bytes
Zwei verschiedene Ansätze:
Probieren Sie es online!
Probieren Sie es online!
quelle
Haskell , 31 Bytes
Probieren Sie es online!
quelle
Perl 6 ,
31 3029 BytesTesten Sie es (31)
Testen Sie es (30)
Testen Sie es (29)
Testen Sie es (29)
quelle
PARI / GP ,
2624 Bytesquelle
Japt , 9 Bytes
Online testen!
Erläuterung
quelle
Python ,
4241 BytesEine rekursive Funktion, die beginnend mit
v=1
wiederholt multipliziert wird,b
bis siea
die Differenz streng überschreitet, und dann die Differenz zurückgibt.Probieren Sie es online!
Hinweis: Das Ergebnis wird niemals Null sein und
a>=v and f(a,b,v*b)or v-a
kann durch ersetzt werden,(a<v)*(v-a)or f(a,b,v*b)
ohne dass es zu Rekursionsfehlern kommt.Python 3, 37 Bytes?
Mit einer Idee von Rici's ...
Versuchen Sie dies hier , wenn Sie Fließkomma-Arithmetik verwenden (daher können die Ergebnisse von der tatsächlichen Entfernung abweichen) .
quelle
b-n
niemals zur gleichen Zeit nulln<b
ist, wie es wahr ist).Brachylog , 7 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Liste
[b, n]
.quelle
PHP> = 7.1, 46 Bytes
PHP Sandbox Online
quelle
Lua,
7473 ByteAls einfache Lösung verwende ich 10 Bytes, um sicherzustellen, dass die Argumente als Zahlen und nicht als Zeichenfolgen behandelt werden. Ausgänge zu STDIN.
Bearbeiten: habe vergessen, den Platz in zu entfernen
w=1 n=n+0
, spart ein ByteErklärt
Probieren Sie es online!
quelle
1
undend
nötig?1end
beginnen, als Zahl interpretiert werden und1e
dann einen Fehler auslösen, da1en
es sich nicht um einen gültigen Hexadezimalwert handelt. Dies ist nur dann der Fall, wenn der Buchstabe nach der Zahl[abcdef]
nicht als Hexadezimalwert interpretiert werden kann ->w=1while
es wird kein Fehler ausgegeben .QBIC , 23 Bytes
Übernimmt dann
b
zuerst den Parametern
.Erläuterung
quelle
Python 2 ,
4841 BytesVolles Programm ohne Rekursion oder Bit-Twiddling:
Probieren Sie es online!
Eingabeformat:
n, b
.quelle
Python 3 ,
5048 BytesDanke an EriktheOutgolfer für das Speichern von 2 Bytes!
Probieren Sie es online!
Python hat keine ausgefallenen Log- oder Deckenelemente, deshalb habe ich mich für den offensichtlichen Ansatz mit ein bisschen Golf-Flair entschieden.
quelle
import math;lambda n,b:b**-~int(math.log(n,b))-n
Spart zwei Bytes und ist per Metakonsens erlaubt.ceil
würde nicht funktionieren.ceil
weil es für Potenzen von nicht funktioniertb
, aber als @Uriel darauf hinwies, dass das Importieren vorher noch ein Byte speichert.import
nach dem Lambda, und fügen Sief=
in der Überschrift hinzu.Common Lisp, 73 Bytes
Probieren Sie es online!
quelle