정수 로그


12

을 감안할 때 정수 N , P > 1, 가장 큰 정수 찾을 M그러한 P ^ M ≤ N.

I / O :

입력은 2 개의 정수 N와 로 제공됩니다 P. 출력은 정수가 M됩니다.

예 :

4, 5 -> 0
33, 5 -> 2
40, 20 -> 1
242, 3 -> 4 
243, 3 -> 5 
400, 2 -> 8
1000, 10 -> 3

노트:

입력은 항상 유효합니다. 즉, 항상 1보다 큰 정수입니다.

크레딧 :

이름에 대한 크레딧은 @cairdcoinheringaahing으로갑니다. 마지막 3 개의 예는 @Nitrodon이 었으며 설명을 개선 한 점은 @Giuseppe로갑니다.


3
나는 우리 (PPCG 커뮤니티)가 정말로 작은 것들에 대해 지나치게 까다로운 것처럼 보일 수 있다는 것을 알고 있지만, 내 것과 같은 의견은 선의로 도전을 더 잘하기위한 것입니다! 이제 문제가 해결되었으므로 행복하게 투표했으며 이전 의견을 삭제했습니다.
Giuseppe

9
이것이 바로 샌드 박스에 챌린지를 게시 할 것을 제안하는 또 다른 이유입니다. 따라서 유용한 피드백을 받고, 챌린지를 게시하며, 많은 찬란한 답변을 얻을 수 있습니다. :)
Giuseppe

2
샌드 박스 챌린지에 대한 피드백을 요청 하여 일반적인 PPCG 채팅방에 언제든지 관심을 기울일 수 있습니다.
Giuseppe

12
부동 소수점 수학을 기반으로 한 거의 모든 현재 답변은 반올림 오류로 인해 (1000, 10)과 같은 간단한 경우에도 잘못된 결과를 생성하므로 다른 테스트 사례를 추가했습니다.
nwellnhof

3
@MPW의 모든 답변이 삭제되었으며 내가 제안한 내용이 게시물로 수정되어 더 이상 관련이 없습니다.
주세페

답변:


8

Brain-Flak , 74 바이트

(({}<>)[()])({()<(({})<({([{}]()({}))([{}]({}))}{})>){<>({}[()])}{}>}[()])

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

이것은 표준 Brain-Flak 양의 정수 나누기 알고리즘과 동일한 개념을 사용합니다.

# Push P and P-1 on other stack
(({}<>)[()])

# Count iterations until N reaches zero:
({()<

  # While keeping the current value (P-1)*(P^M) on the stack:
  (({})<

    # Multiply it by P for the next iteration
    ({([{}]()({}))([{}]({}))}{})

  >)

  # Subtract 1 from N and this (P-1)*(P^M) until one of these is zero
  {<>({}[()])}{}

# If (P-1)*(P^M) became zero, there is a nonzero value below it on the stack
>}

# Subtract 1 from number of iterations
[()])


6

엑셀, 18 바이트

=TRUNC(LOG(A1,A2))

A1에서 "n"을 입력하고 A2에서 "p"를 입력합니다.


2 바이트를 절약하는 INT대신 함수를 사용할 수 있다고 생각합니다 TRUNC.
pajonk

4

젤리 , 3 바이트

bḊL

부동 소수점 산술을 사용하지 않으므로 정밀도 문제가 없습니다.

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

작동 원리

bḊL  Main link. Left argument: n. Right argument: p

b    Convert n to base p.
 Ḋ   Dequeue; remove the first base-p digit.
  L  Take the length.

3

레티 나 0.8.2 , 35 바이트

.+
$*
+r`1*(\2)+¶(1+)$
#$#1$*1¶$2
#

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

.+
$*

인수를 단항으로 변환하십시오.

+r`1*(\2)+¶(1+)$
#$#1$*1¶$2

두 번째 인수가 첫 번째 인수를 나누면 첫 번째 인수를 #더하기 정수 결과로 바꾸고 나머지는 버립니다. 첫 번째 인수가 두 번째 인수보다 작을 때까지이를 반복하십시오.

#

루프가 실행 된 횟수를 계산하십시오.


3

apt, 8 바이트

@<Vp°X}a

시도 해봐


이것은 정말 깔끔합니다 .Japt의 함수 메소드에 실제로 잘 사용되지는 않았습니다. 이것은 좋은 예입니다.
Nit

@Nit, 그것들을 이해하는 데는 시간이 많이 걸렸습니다. 최근에 용도를 알아 내기 시작한 것 F.g()입니다. 그러나 그들은 매우 유용합니다.
Shaggy


3

펄 6 , 13 바이트

&floor∘&log

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

로그와 플로어를 구성하는 연결은 첫 번째 함수 로그가 2를 예상하므로 암시 적으로 2 개의 인수를 갖습니다. 결과는 함수입니다.


3
인수의 1000, 10경우 2를 반환합니다.
Sean

@Sean : 허, 흥미로운 정밀도 문제
Phil H


3

R , 25 바이트

function(p,n)log(p,n)%/%1

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

의 로그 타고 P기지 N와와 부문 정수 수행 1이보다 짧은 것에 따라, floor(). 이것은 숫자 정밀도에 약간의 어려움을 겪으므로 정수 오버플로와는 별개로 아래 답변을 제시합니다.

R , 31 바이트

function(p,n)(x=p:0)[n^x<=p][1]

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


1
나는 도전이 우리에게 반올림 오차를 얼마나 엄격하게 요구하는지 모르지만, 예를 들어, 아마도 5가 필요할 때 f (243,3)은 4와 같습니다.
JDL

@JDL 그것은 공정한 포인트입니다. 완벽하게 정확한 답변은 ~ 31 바이트라고 생각합니다.
Giuseppe

1
나는 당신이 바꿀 수 있다고 생각 p하여 p+.125 바이트 대답하고 당신은 여전히 28 바이트, 괜찮을 것
JDL

수치 정밀도 문제가없는 또 다른 28 바이트 솔루션 .
Robin Ryder


2

루비 , 31 바이트

따라서 모든 로그 기반 접근 방식은 반올림 오류가 발생하기 때문에 정수로 작동하고 이러한 문제가없는 다른 방법이 있습니다.

->n,p{(0..n).find{|i|p**i>n}-1}

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

그러나 대수로 돌아 가면 입력을 지원 해야하는 정밀도가 확실하지 않지만이 작은 트릭은 거의 "현실적인"숫자의 반올림 문제를 해결할 것이라고 생각합니다.

루비 , 29 바이트

->n,p{Math.log(n+0.1,p).to_i}

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


2

C (gcc) + -lm, 24 바이트

f(n,m){n=log(n)/log(m);}

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


나는 알고 long long있지만 무엇 bytes bytes입니까? : P
완전 인간

또한 플래그는 더 이상 바이트 수에 추가되지 않으므로 이것을 반영하도록 편집했습니다.
완전 인간적인

5
반올림 오류로 인해 (1000, 10)에서 작동하지 않습니다.
nwellnhof

f(n,m){n=(float)log(n)/log(m);}@ 31 바이트에서 작동하는 것 같습니다
GPS



2

이것은 다른 모든 사람에게 불공평 한 것 같습니다
Floris

1
@Floris 경쟁은 언어 사이가 아닌 각 언어의 제출 사이에 있습니까?
user202729

예, 아니오. 내 마음에는 결국 "가장 짧은 코드가 이긴다". 그러나 2 바이트 솔루션이 더 아래에 있음을 알았습니다 ...이 골프 언어는 마음을 아프게합니다.
Floris

1
@Floris "코드 골프 언어가 코드 골프가 아닌 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 답변을 생각해보십시오."
user202729

1
@Floris 또한 ... Excel에서도 2 개의 내장으로 할 수 있습니다 . 골프 언어는 내장 된 2 개 언어로도 가능합니다. 내장 된 이름 만 짧습니다. 놀랄 것도 없습니다.
user202729

2

자바 스크립트 , 40 33 바이트

DanielIndie 덕분에 -3 바이트

카레 구문으로 입력을받습니다.

a=>b=>(L=Math.log)(a)/L(b)+.001|0

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



1
28 바이트 그리고 아마도 당신이 카레 방법을 원한다면
DanielIndie



4
toString솔루션은 최대 36 개까지만 작동합니다.
nwellnhof

2

Pari / GP, 6 바이트

logint

(내장 버전 2.7, 2014 년 3 월에 추가됨. 존재하는 경우 결과에 대한 기준으로 설정되는 선택적 세 번째 참조와 함께 두 개의 인수를 사용함)


Pari / GP 및 Perl / ntheory의 @StewieGriffin logint (x, y)는 1000,10의 '3'을 포함하여 현재 표시된 7 개의 예에 대한 올바른 결과를 제공합니다.
DanaJ

+1이지만 6 바이트로 계산합니다.
찰스

2
하드 코딩 된 입력을 사용할 수 없으므로 함수 (예 : 람다 또는 정의) 여야합니다. 그러나 당신은 logint어느 것이 유효하고 5 바이트 더 적은 수를 사용할 수 있습니다 .
ბიმო

2

파이썬 2, 3, 46 바이트

조나단 덕분에 -1

def A(a,b,i=1):
 while b**i<=a:i+=1
 return~-i

파이썬 1, 47 바이트

def A(a,b,i=1):
 while b**i<=a:i=i+1
 return~-i

n~-i보다 1 바이트 짧습니다 n i-1.
Jonathan Frech

또한 파이썬 버전을 명시하십시오.
Jonathan Frech

어떤 버전에서도 작동합니까?
Vedant Kandoi

파이썬 1에서는 작동하지 않습니다.
Jonathan Frech




1

Wolfram Language (Mathematica) 15 10 바이트

Floor@*Log 

(입력시 역순 필요)

원본 제출

⌊#2~Log~#⌋&

⌊Log@##⌋&1 바이트 짧습니다
Lukas Lang

@ Mathe172, 그것은 한 문자 짧지 만 13 바이트를 셉니다. 왼쪽과 오른쪽은 UTF-8에서 각각 3 바이트로 계산됩니다.
Kelly Lowder

@StewieGriffin % [10,1000]은 3을 제공합니다. 입력은 소수점 이하를 입력하지 않으면 기계 번호가 아닌 정수로 처리됩니다.
Kelly Lowder

1

4 번째 (2 번째) , 35 바이트

: f swap s>f flog s>f flog f/ f>s ;

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

예상되는 입력 매개 변수를 교체하여 5 바이트를 절약 할 수는 있지만 질문은 N을 먼저 지정해야합니다 (접미사 언어에서 "First"는 최상위 스택을 의미한다고 주장 할 수 있지만 규칙의 문자를 고수합니다. 지금)

설명

swap       \ swap the parameters to put N on top of the stack
s>f flog   \ move N to the floating-point stack and take the log(10) of N
s>f flog   \ move P to the floating-point stack and take the log(10) of P
f/         \ divide log10(N) by log10(P)
f>s        \ move the result back to the main (integer) stack, truncating in the process

1

Pyth, 6 4 바이트

s.lF

저장된 2 Mmenomic 덕분에 바이트를
온라인으로보십시오

작동 원리

.l로그 인 B (A)
솔직히 말해서, 나는 어떻게 아무 생각이없는 F작품. 그러나 작동하면 작동합니다.
sfloat를 int로 자르고에 대해 가장 높은 정수를 제공 M합니다.


2
1000,10 입력으로서 출력으로 제공 2
스튜 그리핀에게

다른 유사한 솔루션은/FlM
RK입니다.

1

Wonder , 9 바이트

|_.sS log

사용법 예 :

(|_.sS log)[1000 10]

설명

자세한 버전 :

floor . sS log

이것은 포인트 프리 스타일로 작성되었습니다. sS목록 항목을 함수에 인수로 전달합니다 (이 경우 log).


1

기 포스 , 31 바이트

SWAP S>F FLOG S>F FLOG F/ F>S .

용법

242 3 SWAP S>F FLOG S>F FLOG F/ F>S . 4 OK

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

설명

불행히도 FORTH는 전용 부동 소수점 스택을 사용합니다. 이를 위해 SWAP입력 값 을 (교환)해야하므로 올바른 순서로 부동 소수점 스택에 도달합니다. 또한를 사용하여 값을 해당 스택으로 이동해야합니다 S>F. 부동 소수점 결과를 정수 (F>S )로 무료로 잘림을 얻는 이점이 있습니다.

더 짧은 버전

요구 사항을 확장하고 입력을 부동 형식 및 올바른 순서로 제공하면 24 바이트의 짧은 버전이 있습니다.

FLOG FSWAP FLOG F/ F>S .
3e0 242e0 FLOG FSWAP FLOG F/ F>S . 4 OK

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


일반적으로 CodeGolf 답변의 경우 스 니펫 이 허용되지 않습니다 (챌린지에 달리 명시되지 않은 경우). 이 응답은 하나 (워드 포스의) 기능으로 포장해야 : f .... ;하거나 사용하여 입력을 받아 프로그램으로 변환 KEY또는ACCEPT
reffu

@reffu 스 니펫이란 무엇입니까? 제 생각에는 작은 코드 부분이 뭔가를 보여 주지만 그 자체로는 의미가 없습니다. 반면에, 내가 제공 한 코드는 "온라인으로 사용해보십시오!"에 대한 변경없이 작동합니다. 메타로 가야합니까?

이 특정 경우 게시 한 코드는 실제로 매개 변수를 배치하지 않으면 스택 언더 플로우를 발생시킵니다. 코드 골프 답변은 일반적으로 나중에 호출 될 경우 예상되는 결과를 생성하는 독립적 인 프로그램 또는 기능이어야합니다. 이전 의견에서 메타 게시물 링크를 따르면 표준은 답변이 프로그램이나 기능에 대한 것임을 명시 적으로 언급합니다. 이 문제를 해결하려면 또 다른 4 바이트 만 필요합니다
reffu



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