n이 b의 다음 거듭 제곱까지 얼마나 멀리 있습니까?


32

하자 nb보다 큰 양의 정수 수 1.

n의 다음 거듭 제곱 까지의 거리를 출력합니다 b.

내용 n=5b=3, 다음의 전원 3으로부터 5된다 9( 3^2 = 9), 따라서 출력된다 9 - 5 = 4.

내용 n=8b=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오른쪽을 가져와 결과를 반환 하는 2 차원 링크 .

온라인으로 사용해보십시오!

방법?

ạæċ - 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 바이 터에서 변경했습니다. 그것은이었다æċ_⁸
조나단 앨런

@JonathanAllan 그것은 역사에 없었기 때문에 이해가되지 않았기 때문에 그것을 편집했습니다.
아웃 골퍼 Erik 14

8

x86-64 어셈블리 ( Windows x64 호출 규칙 ), 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 비트 정수를 지원하도록 쉽게 수정할 수 있지만 이러한 명령어를 인코딩하는 데 더 많은 바이트가 필요합니다. :-)


따라서 4 바이트 미만에서 eax를 1로 설정할 수 없습니까?
Neil

흠… 제정신 프로그래머가 사용 하는 일반적인 방법은 아니지만 3 바이트 만 + 할 수 있습니다. 그러나 ... 그러면 곱셈을 건너 뛸 필요가 없으므로을 삭제할 수 있기 때문에 여전히 합리적인 절약이 될 것 입니다. push 1pop raxjmp
코디 그레이

아, 나는 1 바이트를 골프하는 방법이 있어야한다는 것을 알고 있었다!
Neil

Linux의 SysV 호출 규칙과 TIO 데모를 사용 하여 동일한 작업을 수행 할 수 있습니다 .
디지털 외상

물론 당신은 할 수. 레지스터에서 처음 두 개의 정수 매개 변수를 전달하는 호출 규칙으로이를 수행 할 수 있습니다. System V, Win x64, Win32 __fastcall 등 레지스터가 변경되어 하나만 선택했습니다. 코인이 "Windows"로 나왔습니다.
코디 그레이

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?
Leaky Nun

@LeakyNun 첫 번째 인수이므로 반환 값을 저장해야합니다.
아웃 골퍼 Erik 14

음, 코드를 업데이트하지 않았습니다.
아웃 골퍼 Erik 14

당신이 할 수있는 b-=n당신의 순서를 교체하는 경우 bn?
Zacharý

6

Dyalog APL, 10 바이트

@ZacharyT 덕분에 2 바이트 절약

⊢-⍨⊣*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을 빼고, 양수 값에서 부분 집합을 빼고, 최소값을 반환합니다.

TIO는 비 -pryr 버전을 가지고 있으며 f(n,b); 이 버전을로 호출해야합니다 f(b,n).

Jarko Dubbeldam 덕분에 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 바이트

MickyT 덕분에 -4 바이트

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@: 스택 상단 (거리)을 출력하고 종료합니다.
    • 음수 : |?: 스택의 상단이 0 인 것처럼 진행
  • <;qu;): IP를 올바른 방향으로 가리키고 스택 맨 위 (음수 / 제로 숫자)를 펼치고 n스택 맨 아래 로 이동 한 다음 U 턴을해서 스택 맨 위를 튀기고 ( b^(counter)) 카운터를 증가시킵니다.
  • IP가 ^w있고 프로그램이 계속됩니다.

온라인으로보십시오!

온라인으로 사용해보십시오!


1
동일한 절차를 사용하여 다른 경로 만 사용Pwp.I|-.;)^0@O?|uq;<
MickyT

@MickyT 천재! 큐빅스 답변을 제출할 때마다 여러분이 와서 4 ~ 5 바이트를 깎아 내고 싶습니다.
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
당신은 나를 1 분씩 때렸습니다. 그것이 내가 쓴 것과 정확히 같지만 ć대신에 사용 했습니다 ¬.
Riley

@ Riley : 필터와도 작동하지만 불행히도 바이트를 저장하지 않습니다.
Emigna 2016 년

1
@Emigna는 불행히도 어떤 바이트도 저장하지 않습니다 * 바이트를 절약합니다 *
Erik the Outgolfer

@EriktheOutgolfer : 그렇습니다. 바이트를 저장하는 이상한 방식의 암시 적 입력 작업을 사용하는 추가 변경 사항입니다.)
Emigna

1
@carusocomputing : 예. 필터 비교와 절대 차이 계산에서 암시 적으로 재사용 할 수 있으므로 실제로 바이트를 "잘못된" 순서로 저장합니다 n.
Emigna 2016 년


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

자바 스크립트 (ES6), 29 바이트

Rick의 접근 방식 과 매우 유사 하지만 그의 허가를 받아 게시했습니다 (일부 바이트 절약에 도움이 됨).

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 2016 년

그리고 #^Floor[...]#보다 짧습니다 #^(Floor[...]+1). 그리고 유니 코드 연산자 Floor도 있습니다.
Martin Ender

예, 물론입니다. 나는이 모든 작업을하고 있습니다.
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대신하는 while2 바이트를 저장합니다o;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}
Steadybox

추천 n/b대신n>=b
천장 고양이

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)nb


1

자바 스크립트 (ES6), 31 바이트

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

테스트 사례 :


당신은 (내가 두 무두질 시도 여부를 중요하지 않았다 무두질하여 바이트를 저장할 수 있습니다 nb단지 또는 n그 통과하는 데에서 당신을 저장하기 때문에) n재귀.
Neil

@Neil에게 감사드립니다 만, 어떻게해야하는지 알아내는 데 어려움을 겪고 있습니다 (?)
Rick Hitchcock

내가 해낸 두 가지 버전이 있었다 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

시겠습니까 f=(n,i)=>g=(b=i)=>b>n?b-n:g(b*i)30 바이트 작동? 다음과 같이 호출해야합니다 f(324,5)().. 편집 : 아, @ Neil이 나를 이겼습니다.
얽히고 설킨

@ Neil, 고마워, 카레를 더 연습해야합니다.
Rick Hitchcock







1

Japt , 9 바이트

_q}a@nVpX

온라인으로 테스트하십시오!

설명

_  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
... 잠깐만 뭐?
얽히고 설킨

@Shaggy 설명을 추가했지만 도움이되기를 바랍니다.
ETHproductions

1

파이썬 ,  42  41 바이트

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

로 시작하는 재귀 함수는 엄격하게 초과 하여 차이를 반환 할 때까지 v=1반복적으로 곱 합니다.ba

온라인으로 사용해보십시오!

참고 : 결과는 0이 아니므 a>=v and f(a,b,v*b)or v-a(a<v)*(v-a)or f(a,b,v*b)재귀 오류없이 대체 될 수 있습니다 .


파이썬 3, 37 바이트?

rici의 아이디어를 사용하여 ...

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

부동 소수점 산술을 사용하므로 결과가 실제 거리에서
벗어날 수 있습니다 . 여기 에서 시도하십시오 .


tio.run/… 은 약간 짧지 만 "% .0f"형식의 결과를 출력해야하는 것은 아마도 부정 행위 일 것입니다.
rici 2016 년

@rici 니스, 부동 소수점 산술을 사용하는 것이 좋습니다. 대안으로 추가 할 것 입니다 (참 b-n과 동시에 0이 아니기 때문에 양식을 전환하여 다른 바이트를 저장할 수 있습니다 n<b).
Jonathan Allan



0

루아, 74 73 바이트

간단한 해결책으로, 인수가 문자열이 아닌 숫자로 처리되도록 10 바이트를 사용하고 있습니다. STDIN으로 출력합니다.

편집 :에서 공백을 제거하지 않고 w=1 n=n+01 바이트를 저장합니다.

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)

설명

온라인으로 사용해보십시오!

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

나는 Lua를 잘 모르지만 사이 1end필요한 공간이 있습니까?
Zacharý

@ZacharyT 루아에서 16 진수는 숫자로 시작하면 인라인 될 수 있으며 숫자 1end로 해석되기 시작 하고 유효한 16 진수 값이 아니기 1e때문에 오류가 발생 1en합니다. [abcdef]다른 문자를 16 진수 값으로 해석 할 수 없기 때문에 숫자 뒤에 오는 문자가있는 경우에만 발생합니다 .-> w=1while오류가 발생하지 않습니다.
Katenkyo

PPCG에 다시 오신 것을 환영합니다!
Leaky Nun

0

QBIC , 23 바이트

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

b먼저 매개 변수를 취한 다음을 사용 n합니다.

설명

{       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

파이썬 3 , 50 48 바이트

2 바이트를 절약 한 EriktheOutgolfer에게 감사합니다!

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

온라인으로 사용해보십시오!

파이썬에는 멋진 통나무 또는 천장이 내장되어 있지 않으므로 약간의 골프 감각으로 명확한 접근 방식을 사용했습니다.


import math;lambda n,b:b**-~int(math.log(n,b))-n2 바이트를 절약하고 메타 합의 당 허용됩니다.
아웃 골퍼 Erik

@EriktheOutgolfer ceil가 작동하지 않습니다.
Leaky Nun

@EriktheOutgolfer의 ceil힘으로 작동하지 않기 때문에 사용 하지 않았지만 b@Uriel이 가져 오기를 지적함에 따라 여전히 바이트를 저장합니다.
notjagan 2016 년

완벽하게 다시 포맷 할 수 있습니다. 온라인으로 사용해보십시오! . import람다 뒤에 배치하고 f=헤더에 추가 하십시오.
Mr. Xcoder 2016 년

@ Mr.Xcoder 아, 맞습니다! 왜 그런 일이 일어나지 않았는지 모르겠습니다.
notjagan

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.