Наскільки далеко n до наступної сили b?


32

Нехай nі bбудуть натуральними числами більше, ніж 1.

Виведіть відстань від nнаступної потужності b.

Для n=5і b=3, наступна потужність 3від 5- 9( 3^2 = 9), тому вихід є 9 - 5 = 4.

Для n=8і b=2, наступна потужність 2від 8- 16( 2^4 = 16), тому вихід є 16 - 8 = 8. Зауважте, що nце сила 2цього прикладу.

Тести:

  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

Це . Найкоротша відповідь у байтах виграє. Застосовуються стандартні лазівки .

Відповіді:


16

Желе ,  4  3 байти

ạæċ

Діадичне посилання nзліва і bсправа і повернення результату.

Спробуйте в Інтернеті!

Як?

ạæċ - Link: number n, number b | n,b ∈ ℕ
 æċ - ceiling n to the next power of b
ạ   - absolute difference between n and that

4
Закреслено 4 все ще регулярно 4; (
Уріель

2
@Uriel But  ;)
HyperNeutrino

tfw ваша спочатку початкова думка - "о, це æċ!" замість "заборювати це так складно ..."
Ерік Позашляховик

О, це може не існувати в історії, але я змінився з 4-х байт. Це булоæċ_⁸
Джонатан Аллан

@JonathanAllan Оскільки цього не було в історії, це не мало сенсу, і тому я це редагував.
Ерік Аутгольфер

8

x86-64 Асамблея ( Windows x64 Call Convention ), 14 13 байт

Неефективний (але повний!) Ітеративний підхід (з повагою @Neil для натхнення):

               HowFarAway PROC
6A 01             push   1
58                pop    rax         ; temp = 1
               Loop:
0F AF C2          imul   eax, edx    ; temp *= b
39 C8             cmp    eax, ecx
72 F9             jb     Loop        ; keep looping (jump) if temp < n
29 C8             sub    eax, ecx    ; temp -= n
C3                ret                ; return temp
               HowFarAway ENDP

Вищевказана функція приймає два цілих параметри n(передані в ECXрегістр) і b(передані в EDXрегістр), і повертає єдиний цілий результат (в EAXрегістр). Щоб викликати його з C, ви використовуєте такий прототип:

unsigned HowFarAway(unsigned n, unsigned b);

Це обмежено діапазоном 32-бітного цілого числа. Його можна легко модифікувати для підтримки 64-бітових цілих чисел за допомогою повних довгих регістрів, але для кодування цих інструкцій коштуватиме більше байтів. :-)


Отже, ви не можете встановити eax на 1 менше, ніж 4 байти?
Ніл

Хм… Ні в якому з звичайних способів, який використовував би здоровий програміст, але ви могли push 1+ pop raxлише в 3 байти. Але ... тоді вам не доведеться пропускати множення, так що це все-таки розумна економія, тому що ви можете скинути це jmp.
Коді Грей

Ах, я знав, що там повинен був бути шлях для гольфу на байті!
Ніл

Ви можете зробити те ж саме з умовами виклику SysV в Linux, з демонстрацією TIO .
Цифрова травма

Звичайно, ви можете. Ви можете зробити це за допомогою будь-якого режиму виклику, який передає принаймні перші два цілих параметри в регістри. System V, Win x64, Win32 __fastcall тощо. Реєстри просто змінюються, і мені довелося вибрати один. Монета придумала "Вікна".
Коді Грей

6

C (gcc) , 39 35 байт

Нова невизначена поведінка завдяки Еріку

f(n,b,i){for(i=b;b<=n;b*=i);n=b-n;}

Спробуйте в Інтернеті!


f(n,b,i){for(i=b;b<n;b*=i);n=b-n;}економить 5 байтів, і підтримується gcc
Ерік Позашляховик

@EriktheOutgolfer чому б і ні b-=n?
Лина монашка

@LeakyNun Оскільки це перший аргумент, для якого потрібно зберегти повернене значення.
Ерік Аутгольфер

Гм, ви не оновили код.
Ерік Атголфер

Чи можете ви зробити це, b-=nякщо поміняти порядок bі n?
Zacharý

6

Діалог APL, 10 байт

2 байти збережено завдяки @ZacharyT

⊢-⍨⊣*1+∘⌊⍟

Спробуйте в Інтернеті!

Приймається nяк правий аргумент і bяк лівий аргумент.

Розраховує .b⌊logbn + 1⌋ - n


Приємно, я щойно збирався опублікувати це точне рішення
Kritixi Lithos

@KritixiLithos Мені було важко з підлогою. ти думаєш, що це можна було б перетворити на поїзд?
Уріель

Так, він може: ⊣-⍨⊢*1+∘⌊⍟⍨.
Zacharý

@ZacharyT приємний!
Уріель

Я отримую ⊢-⍨⊣*1+∘⌊⍟10 байт, але з заміненими аргументами, так що nце правильний аргумент і bлівий аргумент. Я використав фокус ZacharyT, 1+∘⌊щоб опустити це далеко.
Kritixi Lithos

6

R , 38 34 байт

pryr::f({a=b^(0:n)-n;min(a[a>0])})

Анонімна функція. Зберігає всі значення b до сили всього в діапазоні [0, n], віднімає n від кожного, підмножини на позитивні значення і повертає хв.

TIO має версію non-pryr, яку називають як f(n,b); цю версію потрібно назвати як f(b,n).

Збережено 4 байти завдяки Ярко Дуббелдам, який потім перевершив мене.

Спробуйте в Інтернеті!


Хороший спосіб, коротший за рекурсію, яку я мав на увазі.
JAD

pryr::f({a=b^(0:n)-n;min(a[a>0])})на кілька байт коротше.
JAD

Спасибі. Мені пощастило використовувати, pryr::fколи я визначав нову змінну у функції; виглядає, що це працює тут.
BLT

2
Гм, це завжди варто перевірити :) Що мене дратує, якщо у вас є щось на кшталт sapply(x, sum)чи що завгодно, що це додає sumдо аргументів.
JAD

4

Cubix , 24 20 байт

-4 байти завдяки MickyT

Pwp.I|-.;)^0@O?|uq;<

Читається як вхід n,b

Підходить для куба 2x2x2:

    P w
    p .
I | - . ; ) ^ 0
@ O ? | u q ; <
    . .
    . .

Пояснення:

I|I0 : прочитайте вхід, натисніть 0 (лічильник) до стеку

^w ставить IP в потрібне місце для циклу:

  • Pp-: обчислити b^(counter), перемістити nдо вершини стека, обчислитиb^(counter) - n
  • ? : повернути ліворуч, якщо негативно, прямо якщо 0, праворуч якщо позитивно
    • Позитивний:: O@вихідна верхня частина стека (відстань) та вихід.
    • Негативний:: |?продовжуйте так, ніби верхня частина стека дорівнювала нулю
  • <;qu;): вкажіть IP в потрібному напрямку, просуньте верхню частину стека (від’ємне / нульове число), перейдіть nдо нижньої частини стека, поверніть, поверніть верхню частину стека ( b^(counter)) та посиліть лічильник
  • IP є, ^wі програма продовжується.

Дивіться його в Інтернеті!

Спробуйте в Інтернеті!


1
Використовуючи ту саму процедуру, просто інший шляхPwp.I|-.;)^0@O?|uq;<
MickyT

@MickyT геній! Я відчуваю, що кожного разу, коли я надсилаю відповідь на кубікс, ти заходиш і голиш чотири чи п’ять байтів ...
Джузеппе,


2

05AB1E , 9 8 байт

sLmʒ‹}α¬

Спробуйте в Інтернеті!

Пояснення

s         # swap order of the inputs
 L        # range [1 ... n]
  m       # raise b to each power
   ʒ‹}    # filter, keep only the elements greater than n
      α   # calculate absolute difference with n for each
       ¬  # get the first (smallest)

1
Ти бив мене хвилиною. Саме це я написав, але використовував ćзамість цього ¬.
Райлі

@Riley: Також працює з фільтром, але, на жаль, не зберігає жодних байтів.
Емінья

1
@Emigna, на жаль, не економить жодних байтів * економить байт (и) *
Erik the Outgolfer

@EriktheOutgolfer: Так, добре. Це була додаткова зміна, використовуючи дивні способи неявного введення, які врятували байт :)
Emigna,

1
@carusocomputing: Так. Це фактично економить байт, щоб вони були у "неправильному" порядку, оскільки я можу nнеявно використовувати їх як у порівнянні фільтрів, так і в обчисленні абсолютної різниці.
Емінья,


2

MATL , 10 9 байт

yy:YAn^w-

Спробуйте в Інтернеті!

Пояснення

Розглянемо вхідні дані 694та 3як приклад.

y    % Implicitly take two inputs. Duplicate from below
     % STACK: 694, 3, 694
y    % Duplicate from below
     % STACK: 694, 3, 694, 3
:    % Range
     % STACK: 694, 3, 694, [1 2 3]
YA   % Base conversion (of 694 with "digits" given by [1 2 3]
     % STACK: 694, 3, [3 3 2 3 1 2]
n    % Number of elements
     % STACK: 694, 3, 6
^    % Power
     % 694, 729
w    % Swap
     % STACK: 729, 694
-    % Subtract. Implicitly display
^    % 35

2

JavaScript (ES6), 29 байт

Дуже схожий на підхід Ріка, але розміщений з його дозволу (а деякі допомагають зберегти байт).

n=>b=>g=(x=b)=>x>n?x-n:g(x*b)

Спробуй це

f=
n=>b=>g=(x=b)=>x>n?x-n:g(x*b)
oninput=_=>o.value=f(+i.value)(+j.value)()
o.value=f(i.value=324)(j.value=5)()
*{font-family:sans-serif;}
input{margin:0 5px 0 0;width:50px;}
<label for=i>n: </label><input id=i type=number><label for=j>b: </label><input id=j type=number><label for=o>= </label><input id=o>


2

Математика, 24 байти

#2^⌊1/#~Log~#2⌋#2-#&

дякую Мартіне

I / O

[343, 7]

2058 рік


Ви можете використовувати 1/Log@##або #2~Log~#. Або ще краще поміняти порядок введення та використання Log@##.
Мартін Ендер

І тоді #^Floor[...]#коротше, ніж #^(Floor[...]+1). А ще є оператори Unicode Floor.
Мартін Ендер

так, так, звичайно. Я працюю над усім цим. Ви швидко!
J42161217

Не забувайте Log@##! Насправді, якщо ви поміняєте порядок аргументів, #^⌊Log@##⌋#-#2&має бути можливим -5 байт (я думаю)!
CalculatorFeline

2

C, 42 40 байт

Дякуємо коментатору @Steadybox за пораду

o;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}

2
Використання forзамість whileекономії двох байтів:o;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}
Steadybox

Запропонувати n/bзамістьn>=b
roofcat

2

R, 30 байт

pryr::f(b^floor(log(n,b)+1)-n)

Оцінює до функції

function (b, n) 
b^floor(log(n, b) + 1) - n

Котрий приймає спочатку потужність більше або дорівнює n, а потім віднімає nвід цього значення.

Змінено, ceiling(power)щоб floor(power+1)переконатися, що якщо nце сила b, ми беремо наступну владу.


1

JavaScript (ES6), 31 байт

f=(n,b,i=b)=>b>n?b-n:f(n,b*i,i)

Тестові приклади:


Ви можете зберегти байт за допомогою currying (неважливо, я намагався currying nі bабо, і тільки n), тому що це позбавить вас від необхідності проходити nрекурсивно.
Ніл

Дякую @Neil, але у мене виникають труднощі з'ясувати, як це зробити (?)
Рік Хічкок

Дві версії, які я придумав, були n=>g=(b,p=b)=>p>n?p-n:g(b,p*b)і були n=>b=>(g=p=>p>n?p-n:g(p*b))(b).
Ніл

Працює f=(n,i)=>g=(b=i)=>b>n?b-n:g(b*i)на 30 байт? Він повинен був би називатися так: f(324,5)(). EDIT: Ах, @Neil побив мене до цього.
Кудлатий

@Neil, thanks, I need more practice with currying.
Rick Hitchcock







1

Japt, 9 bytes

_q}a@nVpX

Test it online!

Explanation

_  q}a@  nVpX
Z{Zq}aX{UnVpX}  // Ungolfed
                // Implicit: U, V = input integers
     aX{     }  // For each integer X in [0...1e9), take
          VpX   //   V to the power of X
        Un      //   minus U,
Z{  }           // and return the first one Z where
  Zq            //   Math.sqrt(Z) is truthy.
                //   Math.sqrt returns NaN for negative inputs, and 0 is falsy, so this is
                //   truthy iff Z is positive. Therefore, this returns the first positive
                //   value of V**X - U.
                // Implicit: output result of last expression

1
... Wait. What?
Shaggy

@Shaggy I've added an explanation, hopefully this helps.
ETHproductions

1

Python,  42  41 bytes

f=lambda a,b,v=1:(a<v)*(v-a)or f(a,b,v*b)

A recursive function which, starting with v=1, repeatedly multiplies by b until it strictly exceeds a 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...

f=lambda n,b:(n<b)*(b-n)or b*f(n/b,b)

which uses floating point arithmetic (hence results may stray from their true distance),
try that here.


tio.run/… is a bit shorter but having to output the result with format "%.0f" is probably cheating.
rici

@rici Nice, I think it may be OK to use floating point arithmetic. I'll add it as an alternative (another byte may be saved by switching forms due to b-n never being zero at the same time as n<b is true).
Jonathan Allan



0

Lua, 74 73 Byte

A 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 byte

n,b=...b=b+0p=b w=1n=n+0while p<=n do p=math.pow(b,w)w=w+1 end print(p-n)

Explained

Try it online!

n,b=...           -- unpack the argument into the variable n and b
b=b+0             -- set b's type to number
n=n+0             -- set n's type to number
p=b               -- set a variable to track the current value of the powered b
w=1               -- set the nth power
while p<=n        -- iterate untill the current power is greater or equals to n
do
  p=math.pow(b,w) -- raise b to the power w
  w=w+1           -- increment w
end
print(p-n)        -- outputs p minus the following power of b

I don't know Lua that well, but is the space between 1 and end needed?
Zacharý

@ZacharyT In Lua, hexadecimal numbers can be inlined if they start with a number, 1end would start to be interpreted as the number 1e then throw an error because 1en 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.
Katenkyo

Welcome back to PPCG!
Leaky Nun

0

QBIC, 23 bytes

{p=:^q~p>:|_xp-b|\q=q+1

Takes parameter b first, then n.

Explanation

{       DO
p=:^q   SET p to input b (read as 'a' by QBIC fromt he cmd line) ** q (starts as 1)
~p>:    IF p exceeds 'n' (read as 'b' by QBIC fromt he cmd line)
|_xp-b| THEN QUIT, printing p minus b
\q=q+1  ELSE increase q, re-run


0

Python 3, 50 48 bytes

Thanks to EriktheOutgolfer for saving 2 bytes!

lambda n,b:b**-~int(math.log(n,b))-n
import math

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.


import math;lambda n,b:b**-~int(math.log(n,b))-n saves two bytes and is allowed per meta consensus.
Erik the Outgolfer

@EriktheOutgolfer ceil would not work.
Leaky Nun

@EriktheOutgolfer I wasn't using ceil because it doesn't work for powers of b, but as @Uriel pointed out importing before still saves a byte.
notjagan

You can reformat it to be completely fine: Try it online!. Just place the import after the lambda, and add f= in the header.
Mr. Xcoder

@Mr.Xcoder Ah, you are correct! I don't know why that didn't occur to me.
notjagan

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.