Làm thế nào xa n đến sức mạnh tiếp theo của b?


32

Hãy nbđược nguyên dương lớn hơn 1.

Xuất khoảng cách từ nđến sức mạnh tiếp theo của b.

Cho n=5b=3, công suất tiếp theo của 3from 59( 3^2 = 9), vì vậy đầu ra là 9 - 5 = 4.

Cho n=8b=2, công suất tiếp theo của 2from 816( 2^4 = 16), vì vậy đầu ra là 16 - 8 = 8. Lưu ý rằng đó nlà một sức mạnh 2trong ví dụ này.

Testcase:

  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

Đây là . Câu trả lời ngắn nhất trong byte thắng. Tiêu chuẩn áp dụng.

Câu trả lời:


16

Thạch ,  4  3 byte

ạæċ

Một liên kết dyadic lấy nbên trái và bbên phải và trả về kết quả.

Hãy thử trực tuyến!

Làm sao?

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

4
Crossed out 4 vẫn là 4 thông thường; (
Uriel

2
@Uriel Nhưng  ;)
HyperNeutrino

tfw suy nghĩ ban đầu của bạn là "oh it æċ!" thay vì "oww this is sooo hard ..."
Erik the Outgolfer

Ồ, nó có thể không tồn tại trong lịch sử, nhưng tôi đã thay đổi từ 4 byter. Đó làæċ_⁸
Jonathan Allan

@Jonathan ALLan Vì nó không có trong lịch sử nên nó không có ý nghĩa và đó là lý do tại sao tôi chỉnh sửa nó.
Erik the Outgolfer

8

Hội x86-64 ( Hội nghị gọi Windows x64 ), 14 13 byte

Một cách tiếp cận lặp lại không hiệu quả (nhưng mảnh dẻ!) (Có tín dụng cho @Neil để lấy cảm hứng):

               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

Hàm trên có hai tham số nguyên, n(được truyền trong thanh ECXghi) và b(được truyền trong thanh EDXghi) và trả về một kết quả số nguyên duy nhất (trong thanh EAXghi). Để gọi nó từ C, bạn sẽ sử dụng nguyên mẫu sau:

unsigned HowFarAway(unsigned n, unsigned b);

Điều này được giới hạn trong phạm vi của số nguyên 32 bit. Nó có thể dễ dàng sửa đổi để hỗ trợ các số nguyên 64 bit bằng cách sử dụng các thanh ghi dài đầy đủ, nhưng sẽ tốn nhiều byte hơn để mã hóa các hướng dẫn đó. :-)


Vì vậy, bạn không thể đặt eax thành 1 trong ít hơn 4 byte?
Neil

Không có bất kỳ cách thông thường nào mà một lập trình viên lành mạnh sẽ sử dụng, nhưng bạn có thể push 1+ pop raxchỉ trong 3 byte. Nhưng khi đó, bạn sẽ không phải bỏ qua phép nhân, vì vậy đó vẫn sẽ là một khoản tiết kiệm hợp lý vì bạn có thể bỏ qua jmp.
Cody Grey

Ah, tôi biết rằng phải có một cách để chơi golf một byte!
Neil

Bạn có thể làm tương tự với quy ước gọi SysV trên Linux, với bản demo TIO .
Chấn thương kỹ thuật số

Tất nhiên bạn có thể. Bạn có thể làm điều đó với bất kỳ quy ước gọi nào vượt qua ít nhất hai tham số nguyên đầu tiên trong các thanh ghi. Hệ thống V, Win x64, Win32 __fastcall, v.v ... Các thanh ghi chỉ thay đổi và tôi phải chọn một. Coin đã đưa ra "Windows".
Cody Grey

6

C (gcc) , 39 35 byte

Hành vi mới không xác định nhờ Erik

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

Hãy thử trực tuyến!


f(n,b,i){for(i=b;b<n;b*=i);n=b-n;}tiết kiệm 5 byte và được hỗ trợ bởi gcc
Erik the Outgolfer

@EriktheOutgolfer tại sao không b-=n?
Rò rỉ Nun

@LeakyNun Bởi vì đó là đối số đầu tiên bạn cần lưu giá trị trả về.
Erik the Outgolfer

Umm, bạn đã không cập nhật mã.
Erik the Outgolfer

Bạn có thể làm gì b-=nnếu bạn trao đổi thứ tự bn?
Zacharý

6

APL Dyalog, 10 byte

2 byte được lưu nhờ @ZacharyT

⊢-⍨⊣*1+∘⌊⍟

Hãy thử trực tuyến!

Đưa ra nnhư là đối số phải và bnhư là đối số trái.

Tính toán .b⌊logbn + 1⌋ - n


Thật tuyệt, tôi vừa định đăng giải pháp chính xác này
Kritixi Lithos

@KritixiLithos Tôi đã có một thời gian khó khăn với các mẹo sàn. Bạn nghĩ rằng nó có thể được thực hiện thành một chuyến tàu?
Uriel

Vâng, nó có thể : ⊣-⍨⊢*1+∘⌊⍟⍨.
Zacharý

@ZacharyT đẹp một!
Uriel

Tôi nhận được ⊢-⍨⊣*1+∘⌊⍟10 byte nhưng với các đối số được hoán đổi để đó nlà đối số bên phải và blà đối số bên trái. Tôi đã sử dụng mánh khóe của ZacharyT 1+∘⌊để đưa nó đi xa đến mức này.
Kritixi Lithos

6

R , 38 34 byte

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

Chức năng ẩn danh. Lưu trữ tất cả các giá trị của b vào sức mạnh của mọi thứ trong phạm vi [0, n], trừ n từ mỗi, tập hợp con trên các giá trị dương và trả về giá trị cực tiểu.

TIO có phiên bản không pryr, được gọi là f(n,b); phiên bản này cần được gọi là f(b,n).

Lưu được 4 byte nhờ Jarko Dubbeldam, người sau đó vượt xa tôi.

Hãy thử trực tuyến!


Đẹp, cách ngắn hơn so với đệ quy tôi có trong tâm trí.
JAD

pryr::f({a=b^(0:n)-n;min(a[a>0])})là một vài byte ngắn hơn.
JAD

Cảm ơn. Tôi đã gặp xui xẻo pryr::fkhi sử dụng một định nghĩa mới trong hàm; có vẻ như nó hoạt động ở đây
BLT

2
Hmm, nó luôn luôn đáng để kiểm tra :) Điều làm tôi khó chịu là nếu bạn có một cái gì đó giống như sapply(x, sum)hoặc bất cứ điều gì, nó làm tăng thêm sumcác đối số.
JAD

4

Hình khối , 24 20 byte

-4 byte nhờ MickyT

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

Đọc trong đầu vào như n,b

Phù hợp với khối lập phương 2x2x2:

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

Giải trình:

I|I0 : đọc đầu vào, đẩy 0 (bộ đếm) vào ngăn xếp

^w đặt IP đến đúng vị trí của vòng lặp:

  • Pp-: tính toán b^(counter), di chuyển nlên đầu ngăn xếp, tính toánb^(counter) - n
  • ? : rẽ trái nếu âm, thẳng nếu 0, phải nếu dương
    • Tích cực :: O@đầu ra của ngăn xếp (khoảng cách) và thoát.
    • Tiêu cực :: |?tiến hành như thể đỉnh của ngăn xếp bằng không
  • <;qu;): trỏ IP theo đúng hướng, bật đỉnh của ngăn xếp (số âm / số không), di chuyển nxuống dưới cùng của ngăn xếp, quay đầu, bật đỉnh của ngăn xếp ( b^(counter)) và tăng bộ đếm
  • IP đang ở ^wvà chương trình tiếp tục.

Xem nó trực tuyến!

Hãy thử trực tuyến!


1
Sử dụng cùng một quy trình của bạn, chỉ là một con đường khácPwp.I|-.;)^0@O?|uq;<
MickyT

@MickyT thiên tài! Tôi cảm thấy như mỗi lần tôi gửi câu trả lời khối, bạn đi cùng và cạo bốn hoặc năm byte ...
Giuseppe


2

05AB1E , 9 8 byte

sLmʒ‹}α¬

Hãy thử trực tuyến!

Giải trình

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
Bạn đánh tôi một phút. Đó chính xác là những gì tôi đã viết, nhưng tôi đã sử dụng ćthay vì ¬.
Riley

@Riley: Cũng hoạt động với bộ lọc, nhưng không may không lưu bất kỳ byte nào.
Emigna

1
@Emigna không may không lưu bất kỳ byte nào * lưu byte (s) *
Erik the Outgolfer

@EriktheOutgolfer: Vâng, tốt. Đó là một thay đổi bổ sung sử dụng cách thức kỳ lạ mà đầu vào ẩn hoạt động đã lưu một byte :)
Emigna

1
@carusocomputing: Vâng. Nó thực sự tiết kiệm một byte để có chúng theo thứ tự "sai" vì tôi có thể sử dụng lại nhoàn toàn, cả trong so sánh bộ lọc và tính toán chênh lệch tuyệt đối.
Emigna


2

MATL , 10 9 byte

yy:YAn^w-

Hãy thử trực tuyến!

Giải trình

Xem xét đầu vào 6943làm ví dụ.

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 byte

Rất giống với cách tiếp cận của Rick nhưng được đăng với sự cho phép của anh ấy (và một số trợ giúp tiết kiệm một byte).

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

Thử nó

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

Toán học, 24 byte

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

cảm ơn Martin

Tôi / O

[343, 7]

2058


Bạn có thể sử dụng 1/Log@##hoặc #2~Log~#. Hoặc thậm chí tốt hơn trao đổi thứ tự của các đầu vào sử dụng Log@##.
Martin Ender

Và sau đó #^Floor[...]#là ngắn hơn #^(Floor[...]+1). Và cũng có các toán tử Unicode Floor.
Martin Ender

vâng, vâng tất nhiên. Tôi đang làm việc trên tất cả những điều này. Bạn nhanh lên!
J42161217

Đừng quên Log@##! Trên thực tế, nếu bạn trao đổi thứ tự đối số, #^⌊Log@##⌋#-#2&nên có thể cho -5 byte (tôi nghĩ)!
Máy

2

C, 42 40 byte

Cảm ơn bình luận viên @Steadybox cho tiền boa

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

2
Sử dụng forthay vì whiletiết kiệm hai byte:o;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}
Steadybox

Đề xuất n/bthay vìn>=b
trần

2

R, 30 byte

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

Đánh giá chức năng

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

Cái nào lấy công suất đầu tiên lớn hơn hoặc bằng n, và sau đó chất nền ntừ giá trị đó.

Thay đổi ceiling(power)để floor(power+1)đảm bảo rằng nếu nlà một sức mạnh của b, chúng tôi có sức mạnh tiếp theo.


1

JavaScript (ES6), 31 byte

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

Các trường hợp thử nghiệm:


Bạn có thể lưu một byte bằng cách currying (không quan trọng tôi đã thử curry cả hai nbchỉ n), vì điều đó giúp bạn không phải vượt qua nđệ quy.
Neil

Cảm ơn @Neil, nhưng tôi gặp khó khăn khi tìm ra cách để làm điều đó (?)
Rick Hitchcock

Hai phiên bản tôi đã đưa ra là 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).
Neil

Sẽ f=(n,i)=>g=(b=i)=>b>n?b-n:g(b*i)làm việc cho 30 byte? Nó sẽ cần phải được gọi như vậy : f(324,5)(). EDIT: Ah, @Neil đánh tôi với nó.
Xù xì

@Neil, cảm ơn, tôi cần luyện tập nhiều hơn với cà ri.
Rick Hitchcock







1

Japt , 9 byte

_q}a@nVpX

Kiểm tra nó trực tuyến!

Giải trình

_  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
... Chờ đợi. Gì?
Xù xì

@Shaggy Tôi đã thêm một lời giải thích, hy vọng điều này sẽ giúp.
Sản xuất ETH

1

Python ,  42  41 byte

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

Một hàm đệ quy, bắt đầu bằng v=1, lặp đi lặp lại nhân bcho đến khi nó hoàn toàn vượt quá avà sau đó trả về sự khác biệt.

Hãy thử trực tuyến!

Lưu ý: Kết quả sẽ không bao giờ bằng 0 nên a>=v and f(a,b,v*b)or v-acó thể được thay thế bằng (a<v)*(v-a)or f(a,b,v*b)mà không gây ra lỗi đệ quy.


Python 3, 37 byte?

Sử dụng một ý tưởng về ...

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

trong đó sử dụng số học dấu phẩy động (do đó kết quả có thể đi lạc từ khoảng cách thực của chúng),
hãy thử điều đó tại đây .


tio.run/ Cảnh ngắn hơn một chút nhưng phải xuất kết quả với định dạng "% .0f" có thể là gian lận.
rici

@rici Nice, tôi nghĩ có thể sử dụng số học dấu phẩy động. Tôi sẽ thêm nó dưới dạng thay thế (một byte khác có thể được lưu bằng cách chuyển đổi biểu mẫu do b-nkhông bao giờ bằng 0 cùng lúc với n<bđúng).
Jonathan Allan



0

Lua, 74 73 Byte

Một giải pháp chuyển tiếp thẳng, tôi đang sử dụng 10 byte để đảm bảo rằng các đối số được coi là số chứ không phải chuỗi. Đầu ra cho STDIN.

Chỉnh sửa: quên xóa khoảng trống trong w=1 n=n+0, lưu một 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)

Giải thích

Hãy thử trực tuyến!

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

Tôi không biết rõ về Lua, nhưng là khoảng trống giữa 1endcần thiết?
Zacharý

@ZacharyT Trong Lua, các số thập lục phân có thể được nội tuyến nếu chúng bắt đầu bằng một số, 1endsẽ bắt đầu được hiểu là số 1esau đó đưa ra lỗi vì 1enkhông phải là giá trị thập lục phân hợp lệ. Điều này chỉ xảy ra khi chữ cái theo số là [abcdef]các chữ cái khác không thể được hiểu là giá trị thập lục phân -> w=1whilekhông gây ra lỗi.
Katenkyo

Chào mừng trở lại PPCG!
Rò rỉ Nun

0

QBIC , 23 byte

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

Đưa tham số btrước, sau đón .

Giải trình

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

Cảm ơn EriktheOutgolfer đã lưu 2 byte!

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

Hãy thử trực tuyến!

Python không có bất kỳ bản dựng hoặc trần nhà ưa thích nào, vì vậy tôi chỉ đi theo cách tiếp cận rõ ràng với một chút tinh tế của môn đánh gôn.


import math;lambda n,b:b**-~int(math.log(n,b))-nlưu hai byte và được phép theo sự đồng thuận meta.
Erik the Outgolfer

@EriktheOutgolfer ceilsẽ không hoạt động.
Rò rỉ Nun

@EriktheOutgolfer Tôi không sử dụng ceilvì nó không hoạt động cho quyền hạn của b, nhưng như @Uriel đã chỉ ra việc nhập trước khi vẫn tiết kiệm được một byte.
notjagan

Bạn có thể định dạng lại nó để hoàn toàn ổn: Hãy thử trực tuyến! . Chỉ cần đặt importsau lambda, và thêm f=vào tiêu đề.
Ông Xcoder

@ Mr.Xcoder À, bạn đúng rồi! Tôi không biết tại sao điều đó không xảy ra với tôi.
notjagan

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.