n กำลังต่อไปของ b อยู่ไกลแค่ไหน?


32

ให้nและbจะ integers 1บวกขนาดใหญ่กว่า

ขาออกห่างจากอำนาจต่อไปของnb

สำหรับ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ในตัวอย่างนี้

Testcases:

  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 ไบต์

ạæċ

ลิงค์ dyadic จะ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 (
Uriel

2
@Uriel But  ;)
HyperNeutrino

tfw ความคิดเริ่มแรกของคุณคือ "โอ้æċ!" แทนที่จะ "เป็น
หนี้นี่มันช่างยากเหลือเกิน

โอ้มันอาจไม่มีอยู่ในประวัติศาสตร์ แต่ฉันเปลี่ยนจาก 4 byter มันเป็นæċ_⁸
Jonathan Allan

@JanathanAllan เนื่องจากมันไม่ได้อยู่ในประวัติศาสตร์มันไม่สมเหตุสมผลและนั่นเป็นเหตุผลที่ฉันแก้ไขมันออกมา
Erik the Outgolfer

8

x86-64 ชุดประกอบ ( Windows x64 Calling Convention ), 14 13 ไบต์

วิธีการทำซ้ำ (แต่ svelte!) ที่ไม่มีประสิทธิภาพ (โดยให้เครดิตกับ @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 ไบต์?
Neil

อืม…ไม่ได้อยู่ในวิธีการปกติใด ๆ ที่โปรแกรมเมอร์มีเหตุผลจะใช้ แต่คุณสามารถpush 1+ ได้pop raxใน 3 ไบต์เท่านั้น แต่ ... jmpแล้วคุณจะได้ไม่ต้องข้ามคูณเพื่อที่จะยังคงมีเงินออมที่เหมาะสมเพราะคุณสามารถวาง
โคดี้เกรย์

อ่าฉันรู้ว่าต้องมีวิธีในการตีกอล์ฟด้วยไบท์!
Neil

คุณสามารถทำเช่นเดียวกันกับการเรียกประชุม SysV บน Linux ด้วยการสาธิต TIO
บาดเจ็บทางระบบดิจิตอล

แน่นอนคุณสามารถ. คุณสามารถทำได้ด้วยการเรียกใด ๆ ที่ส่งผ่านพารามิเตอร์จำนวนเต็มสองตัวแรกในการลงทะเบียน ระบบ V, Win x64, Win32 __fastcall เป็นต้นรีจิสเตอร์ก็เปลี่ยนไปและฉันต้องเลือกมัน เหรียญขึ้นมา "Windows"
Cody Grey

6

C (gcc) , 39 35 ไบต์

พฤติกรรมใหม่ที่ไม่ได้กำหนดต้องขอบคุณ Erik

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
Erik the Outgolfer

@EriktheOutgolfer ทำไมb-=nล่ะ
Leun Nun

@LeakyNun เพราะเป็นอาร์กิวเมนต์แรกที่คุณต้องบันทึกค่าส่งคืน
Erik the Outgolfer

อืมคุณไม่ได้อัปเดตรหัส
Erik the Outgolfer

ที่คุณสามารถทำได้b-=nถ้าคุณสลับคำสั่งของbและn?
Zacharý

6

Dyalog APL ขนาด 10 ไบต์

บันทึก 2 ไบต์ด้วย @ZacharyT

⊢-⍨⊣*1+∘⌊⍟

ลองออนไลน์!

รับnอาร์กิวเมนต์ที่ถูกต้องและbอาร์กิวเมนต์ซ้าย

คำนวณb⌊logbn + 1⌋ - n


ดีฉันเพิ่งจะโพสต์คำตอบที่ถูกต้องนี้
Kritixi Lithos

@KritixiLithos ฉันมีเวลายากกับเคล็ดลับพื้น คุณคิดว่ามันจะกลายเป็นรถไฟหรือไม่?
Uriel

ใช่มันสามารถ: ⊣-⍨⊢*1+∘⌊⍟⍨.
Zacharý

@ ZacharyT เป็นคนดี!
Uriel

ฉันได้⊢-⍨⊣*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 จากแต่ละส่วนย่อยในค่าบวกและส่งคืนค่า min

TIO มีรุ่นที่ไม่ใช่ pryr เรียกว่าf(n,b); รุ่นนี้จะต้องมีการเรียกว่าf(b,n)รุ่นนี้จะต้องเรียกว่าเป็น

บันทึกไปแล้ว 4 ไบต์ขอบคุณ Jarko Dubbeldam ซึ่งทำให้ฉันแย่กว่า

ลองออนไลน์!


Nice, สั้นกว่าการสอบถามซ้ำที่ฉันมีอยู่ในใจ
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 อัจฉริยะ! ฉันรู้สึกเหมือนทุกครั้งที่ฉันส่งคำตอบ cubix คุณมาพร้อมกับการโกนสี่หรือห้าไบท์ ...
Giuseppe


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

@Riley: ทำงานร่วมกับตัวกรองด้วย แต่น่าเสียดายที่ไม่ได้บันทึกไบต์ใด ๆ
Emigna

1
@Emigna น่าเสียดายที่ไม่ได้บันทึกไบต์ใด ๆ * บันทึกไบต์ *
Erik the Outgolfer

@EriktheOutgolfer: ใช่แล้ว มันเป็นความเปลี่ยนแปลงเพิ่มเติมใช้วิธีที่แปลกงานป้อนข้อมูลนัยที่บันทึกไว้ไบต์ :)
Emigna

1
@carusocomputing: ใช่ จริง ๆ แล้วมันช่วยประหยัดไบต์เพื่อให้พวกเขาอยู่ในลำดับ"ผิด"เพราะฉันสามารถนำมาใช้ซ้ำnโดยนัยทั้งในการเปรียบเทียบตัวกรองและการคำนวณผลต่างแน่นอน
Emigna


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 ไบต์

คล้ายกับแนวทางของ Rickแต่โพสต์เมื่อได้รับอนุญาตจากเขา (และบางคนช่วยประหยัด byte)

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

Mathematica ขนาด 24 ไบต์

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

ขอบคุณมาร์ติน

I / O

[343, 7]

2058


คุณสามารถใช้หรือ1/Log@## #2~Log~#หรือดียิ่งขึ้นสลับคำสั่งของปัจจัยการผลิตและLog@##การใช้งาน
Martin Ender

และจากนั้นจะสั้นกว่า#^Floor[...]# #^(Floor[...]+1)และมีผู้ให้บริการ Unicode ด้วยFloorเช่นกัน
Martin Ender

ใช่แน่นอนฉันกำลังทำงานกับสิ่งเหล่านี้ทั้งหมดคุณรวดเร็ว!
J42161217

อย่าลืมLog@##! ที่จริงถ้าคุณสลับลำดับอาร์กิวเมนต์#^⌊Log@##⌋#-#2&ควรเป็นไปได้ที่ -5 ไบต์ (ฉันคิดว่า)!
CalculatorFeline

2

C, 42 40 ไบต์

ขอบคุณ commenter @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
ceilingcat

2

R, 30 ไบต์

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

ประเมินฟังก์ชั่น

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

ซึ่งใช้พลังงานครั้งแรกมากกว่าหรือเท่ากับ n, and then substracts n from that value.

Changed ceiling(power) to floor(power+1) to ensure that if n is a power of b, we take the next power.


1

JavaScript (ES6), 31 bytes

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

Test cases:


You can save a byte by currying (it didn't matter whether I tried currying both n and b or just n), because that saves you from having to pass n recursively.
Neil

Thanks @Neil, but I'm having trouble figuring out how to do that(?)
Rick Hitchcock

The two versions I came up with were n=>g=(b,p=b)=>p>n?p-n:g(b,p*b) and n=>b=>(g=p=>p>n?p-n:g(p*b))(b).
Neil

Would 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.
Shaggy

@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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.