Số nguyên logarit


12

Cho các số nguyên N , P > 1, tìm số nguyên lớn nhất Msao cho P ^ M ≤ N.

Tôi / O:

Đầu vào được cho là 2 số nguyên NP. Đầu ra sẽ là số nguyên M.

Ví dụ:

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

Ghi chú:

Đầu vào sẽ luôn hợp lệ, tức là nó sẽ luôn là số nguyên lớn hơn 1.

Tín dụng:

Tín dụng cho tên đi đến @cairdcoinheringaahing. 3 ví dụ cuối cùng là của @Nitrodon và tín dụng để cải thiện mô tả được gửi tới @Giuseppe.


3
Tôi biết chúng tôi (cộng đồng PPCG) dường như quá kén chọn những thứ thực sự nhỏ nhặt, nhưng những ý kiến ​​như của tôi thực sự có chủ đích, với mục đích tốt, để làm cho thách thức tốt hơn! Bây giờ điều đó đã được giải quyết, tôi đã vui vẻ bỏ phiếu và xóa các bình luận trước đó của tôi.
Giuseppe

9
Đó là một lý do khác tại sao chúng tôi khuyên bạn nên đăng các thử thách lên The Sandbox trước để bạn có thể nhận được phản hồi hữu ích, đăng một thử thách lớn và nhận được nhiều câu trả lời chất lượng cao, với ít sự ồn ào hơn (như gần và bỏ phiếu). :)
Giuseppe

2
Bạn luôn có thể đăng bài vào Phòng trò chuyện PPCG chung để yêu cầu phản hồi về các thách thức trong hộp cát của bạn để khiến họ chú ý hơn một chút.
Giuseppe

12
Hầu như tất cả các câu trả lời hiện tại dựa trên toán học dấu phẩy động đều cho kết quả sai ngay cả đối với các trường hợp đơn giản như (1000, 10) vì lỗi làm tròn, vì vậy tôi đã thêm một trường hợp kiểm tra khác.
nwellnhof

3
@MPW tất cả các phản hồi đã bị xóa và các đề xuất tôi đưa ra đã được chỉnh sửa vào bài đăng, vì vậy chúng không còn phù hợp nữa.
Giuseppe

Câu trả lời:


8

Brain-Flak , 74 byte

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

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

Điều này sử dụng khái niệm tương tự như thuật toán phân chia số nguyên dương Brain-Flak tiêu chuẩn.

# 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

Excel, 18 byte

=TRUNC(LOG(A1,A2))

Lấy đầu vào "n" tại A1 và đầu vào "p" tại A2.


Tôi nghĩ bạn có thể sử dụng INTchức năng thay vì TRUNCđể lưu 2 byte.
pyjama

4

Thạch , 3 byte

bḊL

Điều này không sử dụng số học dấu phẩy động, do đó không có vấn đề chính xác.

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

Làm thế nào nó hoạt động

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

Võng mạc 0.8.2 , 35 byte

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

Hãy thử trực tuyến! Giải trình:

.+
$*

Chuyển đổi các đối số để unary.

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

Nếu đối số thứ hai chia thứ nhất, thay thế đối số thứ nhất bằng #kết quả cộng với số nguyên, loại bỏ phần còn lại. Lặp lại điều này cho đến khi đối số thứ nhất nhỏ hơn đối số thứ hai.

#

Đếm số lần chạy vòng.


3

Japt, 8 byte

@<Vp°X}a

Thử nó


Điều này thực sự gọn gàng, tôi chưa thực sự thấy một cách sử dụng tốt cho các phương thức hàm trong Japt, đây là một ví dụ tốt.
Nit

@Nit, tôi cũng mất một thời gian để hiểu rõ về họ - chỉ gần đây mới bắt đầu tìm ra cách sử dụng cho F.g()- nhưng chúng cực kỳ hữu ích.
Xù xì


3

Perl 6 , 13 byte

&floor∘&log

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

Kết hợp nhật ký và sàn, kết hợp có 2 đối số vì nhật ký hàm đầu tiên mong đợi 2. Kết quả là một hàm.


3
Đối với các đối số 1000, 10này trả về 2.
Sean

@Sean: Huh, vấn đề chính xác thú vị ở đó
Phil H


3

R , 25 byte

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

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

Lấy nhật ký của Pcơ sở Nvà thực hiện phép chia số nguyên với 1, vì nó ngắn hơn floor(). Điều này chịu một chút từ độ chính xác số, vì vậy tôi cũng trình bày câu trả lời dưới đây, không nên, ngoài khả năng tràn số nguyên.

R , 31 byte

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

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


1
Tôi không biết thử thách khắt khe đến mức nào đối với chúng tôi về lỗi làm tròn nhưng ví dụ, f (243,3) bằng 4 khi có thể bắt buộc phải là 5.
JDL

@JDL đó là một điểm công bằng; Tôi tin rằng một câu trả lời hoàn toàn chính xác sẽ là ~ 31 byte.
Giuseppe

1
Tôi nghĩ bạn có thể thay thế pbằng p+.1câu trả lời 25 byte và bạn vẫn sẽ ổn, với 28 byte
JDL

Một giải pháp 28 byte khác mà không có vấn đề chính xác về số.
Robin Ryder


2

Ruby , 31 byte

OK, vì vậy tất cả các cách tiếp cận dựa trên nhật ký này dễ bị lỗi làm tròn, vì vậy đây là một phương pháp khác hoạt động với số nguyên và không có các vấn đề đó:

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

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

Nhưng quay trở lại logarit, mặc dù không rõ độ chính xác nào chúng ta phải hỗ trợ đầu vào, nhưng tôi nghĩ mẹo nhỏ này sẽ giải quyết vấn đề làm tròn cho tất cả các số "thực tế" ít nhiều:

Ruby , 29 byte

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

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





2

05AB1E , 6 byte

Lm¹›_O

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


điều này có vẻ không công bằng với những người khác
Floris

1
@Floris Các cuộc thi là giữa các bài nộp trong mỗi ngôn ngữ không phải giữa các ngôn ngữ phải không?
dùng202729

@ user202729 có và không. Trong tâm trí của tôi, cuối cùng, "mã ngắn nhất sẽ thắng". Nhưng tôi nhận thấy có một giải pháp 2 byte hơn nữa ... Những ngôn ngữ golf này làm tôi suy nghĩ.
Floris

1
@Floris "Đừng để ngôn ngữ golf-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Hãy thử đưa ra câu trả lời ngắn nhất có thể cho ngôn ngữ lập trình 'bất kỳ' nào."
dùng202729

1
@Floris Ngoài ra ... ngay cả Excel cũng có thể làm điều đó trong 2 nội trang . Các ngôn ngữ chơi gôn cũng có thể thực hiện điều này trong 2 tích hợp, chỉ các tên dựng sẵn ngắn hơn. Không có gì để ngạc nhiên.
dùng202729

2

JavaScript , 40 33 byte

-3 byte nhờ DanielIndie

Đưa đầu vào theo cú pháp currying.

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

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



1
28 byte và có thể nếu bạn muốn phương thức cà ri
DanielIndie



4
Các toStringgiải pháp duy nhất làm việc cho các cơ sở lên đến 36.
nwellnhof

2

Pari / GP, 6 byte

logint

(được tích hợp sẵn trong phiên bản 2.7, tháng 3 năm 2014. Có hai đối số, với tham chiếu thứ ba tùy chọn, nếu có, được đặt thành cơ sở được nâng lên thành kết quả)


@StewieGriffin logint (x, y) từ cả Pari / GP và Perl / ntheory đều cho kết quả chính xác cho 7 ví dụ hiện được hiển thị, bao gồm '3' cho 1000,10.
DanaJ

+1, nhưng tôi sẽ tính đây là 6 byte.
Charles

2
Bạn không được phép sử dụng các đầu vào được mã hóa cứng, vì vậy đây phải là một hàm (ví dụ như lambda hoặc định nghĩa). Tuy nhiên, bạn chỉ có thể sử dụng loginthợp lệ và đếm ít hơn 5 byte.
ბიმო

2

Python 2, 3, 46 byte

-1 nhờ jonathan

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

Python 1, 47 byte

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

n~-ilà một byte ngắn hơn n i-1.
Jonathan Frech

Ngoài ra, vui lòng nêu phiên bản Python của bạn.
Jonathan Frech

Sẽ hoạt động trong bất kỳ phiên bản nào, phải không?
Vedant Kandoi

Nó sẽ không hoạt động trong Python 1.
Jonathan Frech




1

Ngôn ngữ Wolfram (Mathicala) 15 10 byte

Floor@*Log 

(yêu cầu đảo ngược thứ tự đầu vào)

Trình gốc

⌊#2~Log~#⌋&

⌊Log@##⌋&ngắn hơn một byte
Lukas Lang

@ Mathe172, đó là một ký tự ngắn hơn, nhưng tôi đếm 13 byte trên đó. Tầng bên trái và tầng bên phải được tính là 3 byte mỗi UTF-8.
Kelly Lowder

@StewieGriffin% [10,1000] cho 3. Các đầu vào được coi là số nguyên thay vì số máy trừ khi bạn đặt một số thập phân sau chúng.
Kelly Lowder

1

Forth (gforth) , 35 byte

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

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

Có thể tiết kiệm 5 byte bằng cách hoán đổi các tham số đầu vào dự kiến, nhưng câu hỏi chỉ định N phải là đầu tiên (một đối số có thể được đưa ra là trong ngôn ngữ hậu tố "Đầu tiên" có nghĩa là đỉnh của ngăn xếp, nhưng tôi sẽ tuân theo chữ cái của quy tắc cho hiện nay)

Giải trình

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

Bình thường 6 4 byte

s.lF

Đã lưu 2 byte nhờ Mmenomic
Dùng thử trực tuyến

Làm thế nào nó hoạt động

.llà log B (A)
Thành thật mà nói, tôi không biết làm thế nào Fhoạt động. Nhưng nếu nó hoạt động, nó hoạt động.
scắt một số float cho một int để cung cấp cho chúng tôi số nguyên cao nhất cho M.


2
1000,10 làm đầu vào cho 2 là đầu ra
Stewie Griffin

Một giải pháp tương tự khác là/FlM
RK.

1

Kỳ quan , 9 byte

|_.sS log

Ví dụ sử dụng:

(|_.sS log)[1000 10]

Giải trình

Phiên bản dài dòng:

floor . sS log

Đây là phong cách pointfree viết. sSchuyển các mục danh sách dưới dạng đối số cho một hàm (trong trường hợp này log).


1

Gforth , 31 byte

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

Sử dụng

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

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

Giải trình

Thật không may, FORTH sử dụng ngăn xếp dấu phẩy động chuyên dụng. Vì vậy, tôi phải SWAP(trao đổi) các giá trị đầu vào để chúng có được ngăn xếp dấu phẩy động theo đúng thứ tự. Tôi cũng phải di chuyển các giá trị đến ngăn xếp đó với S>F. Khi di chuyển kết quả dấu phẩy động trở lại số nguyên (F>S ) tôi có lợi ích để được cắt ngắn miễn phí.

Phiên bản ngắn hơn

Kéo dài các yêu cầu và cung cấp đầu vào ở định dạng float và đúng thứ tự, có một phiên bản ngắn hơn với 24 byte.

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

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


Nói chung đối với câu trả lời của CodeGolf, đoạn trích không được phép (trừ khi có quy định khác trong thử thách). Câu trả lời này phải được gói bằng một hàm (Word in Forth) : f .... ;hoặc được chuyển đổi thành chương trình lấy đầu vào bằng KEYhoặcACCEPT
thiệu lại vào

@reffu Đoạn trích là gì? Theo tôi, một phần mã smal để hiển thị một cái gì đó, tuy nhiên, không có ý nghĩa gì cho chính nó. Mặt khác, mã mà tôi đã cung cấp không hoạt động mà không thay đổi về "Dùng thử trực tuyến!". Chúng ta có nên đi meta không?
Kitana

Trong trường hợp cụ thể này, mã bạn đã đăng trên thực tế sẽ ném một ngăn xếp ngăn xếp trừ khi bạn đặt các tham số trước nó. Mã câu trả lời golf thường phải là một chương trình hoặc chức năng độc lập tạo ra kết quả mong đợi nếu được gọi sau. Nếu bạn theo liên kết đến bài đăng meta trong bình luận trước đây của tôi, nó sẽ đề cập rõ ràng rằng tiêu chuẩn dành cho câu trả lời là một chương trình hoặc một chức năng, trong đó bạn không phải là một chương trình. Để khắc phục, nó chỉ cần thêm 4 byte
reffu



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.