Pozwolić n
i b
być dodatnimi liczbami całkowitymi większymi niż 1
.
Podaj odległość od n
do następnej mocy b
.
Dla n=5
i b=3
następną potęgą 3
from 5
jest 9
( 3^2 = 9
), więc wynikiem jest 9 - 5 = 4
.
Dla n=8
i b=2
następną potęgą 2
from 8
jest 16
( 2^4 = 16
), więc wynikiem jest 16 - 8 = 8
. Zauważ, że n
jest to moc 2
tego przykładu.
Przypadki testowe:
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
To jest golf golfowy . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .
code-golf
arithmetic
Leaky Nun
źródło
źródło
;)æċ
!” zamiast „oww to jest takie trudne…”æċ_⁸
Zestaw x86-64 ( Konwencja wywoływania Windows x64 ),
1413 bajtówNieefektywne (ale svelte!) Iteracyjne podejście (z inspiracją dla @Neil):
Powyższa funkcja przyjmuje dwa parametry całkowite
n
(przekazane doECX
rejestru) ib
(przekazane doEDX
rejestru) i zwraca wynik z pojedynczej liczby całkowitej (wEAX
rejestrze). Aby wywołać go z C, użyłbyś następującego prototypu:Jest to ograniczone do zakresu 32-bitowej liczby całkowitej. Można go łatwo zmodyfikować, aby obsługiwał 64-bitowe liczby całkowite za pomocą pełnych długich rejestrów, ale kodowanie tych instrukcji kosztuje więcej bajtów. :-)
źródło
push 1
+pop rax
tylko w 3 bajtach. Ale… wtedy nie musiałbyś pomijać mnożenia, więc nadal byłoby to rozsądną oszczędnością, ponieważ możesz porzucićjmp
.C (gcc) ,
3935 bajtówNowe niezdefiniowane zachowanie dzięki Erikowi
Wypróbuj online!
źródło
f(n,b,i){for(i=b;b<n;b*=i);n=b-n;}
zapisuje 5 bajtów i jest obsługiwany przez gccb-=n
?b-=n
jeśli zamienisz kolejnośćb
in
?Dyalog APL, 10 bajtów
2 bajty zapisane dzięki @ZacharyT
Wypróbuj online!
Przyjmuje
n
jako prawy argument ib
lewy argument.Oblicza .
b⌊logbn + 1⌋ - n
źródło
⊣-⍨⊢*1+∘⌊⍟⍨
.⊢-⍨⊣*1+∘⌊⍟
10 bajtów, ale z podmienionymi argumentami, więcn
jest to właściwy argument ib
lewy argument. Wykorzystałem sztuczkę ZacharyT,1+∘⌊
żeby zejść tak daleko.R ,
3834 bajtówFunkcja anonimowa. Przechowuje wszystkie wartości b do potęgi wszystkiego w zakresie [0, n], odejmuje n od każdego, podzbiór na wartości dodatnie i zwraca min.
TIO ma wersję inną niż pryr, zwaną as
f(n,b)
; ta wersja musi być nazywana jakof(b,n)
.Zaoszczędził 4 bajty dzięki Jarko Dubbeldamowi, który następnie mnie obezwładnił.
Wypróbuj online!
źródło
pryr::f({a=b^(0:n)-n;min(a[a>0])})
jest kilka bajtów krótszy.pryr::f
gdy definiowałem nową zmienną w funkcji; wygląda na to, że tutaj działa.sapply(x, sum)
lub coś, co dodajesum
argumentów.Cubix ,
2420 bajtów-4 bajty dzięki MickyT
Odczytuje na wejściu jak
n,b
Pasuje do kostki 2x2x2:
Wyjaśnienie:
I|I0
: odczytać dane wejściowe, przesunąć 0 (licznik) na stos^w
umieszcza adres IP we właściwym miejscu dla pętli:Pp-
: obliczb^(counter)
, przejdźn
na szczyt stosu, obliczb^(counter) - n
?
: skręć w lewo, jeśli ujemne, prosto, jeśli 0, w prawo, jeśli pozytywneO@
wyjście z góry stosu (odległość) i wyjście.|?
postępuj tak, jakby wierzchołek stosu wynosił zero<;qu;)
: skieruj adres IP we właściwym kierunku, pop na górze stosu (liczba ujemna / zerowa), przejdźn
na dół stosu, zawracaj, pop na górze stosu (b^(counter)
) i zwiększ licznik^w
i program jest kontynuowany.Obejrzyj online!
Wypróbuj online!
źródło
Pwp.I|-.;)^0@O?|uq;<
Haskell , 20 bajtów
Wypróbuj online!
until
ratuje dzieńźródło
05AB1E ,
98 bajtówWypróbuj online!
Wyjaśnienie
źródło
ć
instead of¬
.n
implicitly, both in the filter comparison and the absolute difference calculation.Java (OpenJDK 8), 42 bytes
Based on @GovindParmar's C answer.
Try it online!
źródło
MATL,
109 bytesTry it online!
Explanation
Consider inputs
694
and3
as an example.źródło
JavaScript (ES6), 29 bytes
Very similar to Rick's approach but posted with his permission (and some help saving a byte).
Try it
źródło
Mathematica, 24 bytes
thanks Martin
I/O
źródło
1/Log@##
or#2~Log~#
. Or even better swap the order of the inputs and useLog@##
.#^Floor[...]#
is shorter than#^(Floor[...]+1)
. And there's the Unicode operators forFloor
as well.Log@##
! Actually, if you swap the argument order,#^⌊Log@##⌋#-#2&
should be possible for -5 bytes (I think)!C,
4240 bytesThanks to commenter @Steadybox for the tip
źródło
for
instead ofwhile
saves two bytes:o;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}
n/b
instead ofn>=b
R, 30 bytes
Evaluates to the function
Which takes the first power greater or equal than
n
, and then substractsn
from that value.Changed
ceiling(power)
tofloor(power+1)
to ensure that ifn
is a power ofb
, we take the next power.źródło
JavaScript (ES6), 31 bytes
Test cases:
Show code snippet
źródło
n
andb
or justn
), because that saves you from having to passn
recursively.n=>g=(b,p=b)=>p>n?p-n:g(b,p*b)
andn=>b=>(g=p=>p>n?p-n:g(p*b))(b)
.f=(n,i)=>g=(b=i)=>b>n?b-n:g(b*i)
work for 30 bytes? It would need to be called like so:f(324,5)()
. EDIT: Ah, @Neil beat me to it.Octave, 32 bytes
Try it online!
źródło
Octave, 26 bytes
Verify all test cases!
źródło
Ruby, 38 bytes
Two different approaches:
Try it online!
Try it online!
źródło
Haskell, 31 bytes
Try it online!
źródło
Perl 6,
31 3029 bytesTest it (31)
Test it (30)
Test it (29)
Test it (29)
źródło
PARI/GP,
2624 bytesźródło
Japt, 9 bytes
Test it online!
Explanation
źródło
Python,
4241 bytesA recursive function which, starting with
v=1
, repeatedly multiplies byb
until it strictly exceedsa
and then returns the difference.Try it online!
Note: The result will never be zero so
a>=v and f(a,b,v*b)or v-a
may be replaced with(a<v)*(v-a)or f(a,b,v*b)
without causing recursion errors.Python 3, 37 bytes?
Using an idea of rici's...
which uses floating point arithmetic (hence results may stray from their true distance),
try that here.
źródło
b-n
never being zero at the same time asn<b
is true).Brachylog, 7 bytes
Try it online!
Takes input as a list
[b, n]
.źródło
PHP>=7.1, 46 bytes
PHP Sandbox Online
źródło
Lua,
7473 ByteA straight forward solution, I'm using 10 bytes to ensure that the arguments are treated as numbers, and not strings. Outputs to STDIN.
Edit: forgot to remove the space in
w=1 n=n+0
, saves one byteExplained
Try it online!
źródło
1
andend
needed?1end
would start to be interpreted as the number1e
then throw an error because1en
isn't a valid hexadecimal value. This only occure when the letter following the number is[abcdef]
as other letters can't be interpreted as hexadecimal value ->w=1while
doesn't throw an error.QBIC, 23 bytes
Takes parameter
b
first, thenn
.Explanation
źródło
Python 2,
4841 bytesFull program without recursion or bit twiddling:
Try it online!
Input format:
n, b
.źródło
Python 3,
5048 bytesThanks to EriktheOutgolfer for saving 2 bytes!
Try it online!
Python doesn't have any fancy log or ceiling builtins, so I just went with the obvious approach with a little bit of golfing flair.
źródło
import math;lambda n,b:b**-~int(math.log(n,b))-n
saves two bytes and is allowed per meta consensus.ceil
would not work.ceil
because it doesn't work for powers ofb
, but as @Uriel pointed out importing before still saves a byte.import
after the lambda, and addf=
in the header.Common Lisp, 73 bytes
Try it online!
źródło