ค่าลอการิทึมจำนวนเต็ม


12

จำนวนเต็ม ป.ร. ให้N , P > 1ค้นหาเลขที่ใหญ่ที่สุดดังกล่าวว่าMP ^ M ≤ N

I / O:

การป้อนข้อมูลจะได้รับเป็น 2 จำนวนเต็มและN การส่งออกจะเป็นจำนวนเต็มPM

ตัวอย่าง:

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
นั่นเป็นอีกเหตุผลที่เราขอแนะนำให้โพสต์ความท้าทายลงในThe Sandboxก่อนเพื่อให้คุณสามารถรับข้อเสนอแนะที่เป็นประโยชน์โพสต์ความท้าทายที่ยอดเยี่ยมและรับคำตอบที่มีคุณภาพสูงจำนวนมากด้วยความยุ่งยากน้อยลง :)
Giuseppe

2
คุณสามารถโพสต์ลงในห้องสนทนา PPCG ทั่วไปเพื่อขอคำติชมเกี่ยวกับการแข่งขัน Sandbox ของคุณเพื่อให้พวกเขาได้รับความสนใจมากขึ้น
Giuseppe

12
คำตอบปัจจุบันเกือบทั้งหมดที่อยู่บนพื้นฐานของคณิตศาสตร์เลขทศนิยมให้ผลลัพธ์ที่ไม่ถูกต้องแม้ในกรณีง่าย ๆ เช่น (1,000, 10) เนื่องจากข้อผิดพลาดในการปัดเศษดังนั้นฉันจึงเพิ่มกรณีทดสอบอีกชุดหนึ่ง
nwellnhof

3
@MPW คำตอบทั้งหมดถูกลบและคำแนะนำที่ฉันทำถูกแก้ไขในโพสต์ดังนั้นจึงไม่มีความเกี่ยวข้องอีกต่อไป
Giuseppe

คำตอบ:


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

Excel, 18 ไบต์

=TRUNC(LOG(A1,A2))

รับอินพุต "n" ที่ A1 และป้อน "p" ที่ A2


ฉันคิดว่าคุณสามารถใช้INTฟังก์ชั่นแทนTRUNCการบันทึก 2 ไบต์
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

Japt, 8 ไบต์

@<Vp°X}a

ลองมัน


นี่เป็นระเบียบจริงๆฉันยังไม่เห็นการใช้งานที่ดีสำหรับวิธีการทำงานใน Japt นี่เป็นตัวอย่างที่ดี
นิด

@Nit ฉันใช้เวลาสักครู่ในการติดต่อกับพวกเขาเช่นกัน - เพิ่งเริ่มต้นคิดหาวิธีใช้F.g()- แต่ก็มีประโยชน์อย่างเหลือเชื่อ
ขนปุย


3

Perl 6 , 13 ไบต์

&floor∘&log

ลองออนไลน์!

การรวมไฟล์บันทึกและพื้นเข้าด้วยกันโดยนัยมี 2 อาร์กิวเมนต์เพราะบันทึกของฟังก์ชันแรกคาดว่าจะได้ 2 ผลลัพธ์คือฟังก์ชัน


3
สำหรับอาร์กิวเมนต์1000, 10นี้ส่งคืน 2
Sean

@Sean: Huh ปัญหาความแม่นยำที่น่าสนใจที่นั่น
Phil H

3

Haskellขนาด 16 ไบต์

(floor.).logBase

ลองออนไลน์!

Haskell ได้รับการออกแบบโดยนักคณิตศาสตร์ดังนั้นมันจึงมีฟังก์ชั่นที่เกี่ยวข้องกับคณิตศาสตร์ใน Prelude


6
ใช้งานไม่ได้ (1,000, 10) เนื่องจากข้อผิดพลาดในการปัดเศษ
nwellnhof

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
ฉันไม่รู้ว่าความท้าทายที่เข้มงวดนั้นบังคับให้เราต้องปัดเศษข้อผิดพลาดอย่างไรยกตัวอย่างเช่น f (243,3) เท่ากับ 4 เมื่อมันอาจจะต้องเป็น 5
JDL

@JDL นั่นเป็นประเด็นที่ยุติธรรม ฉันเชื่อว่าคำตอบที่แม่นยำอย่างสมบูรณ์จะเป็น ~ 31 ไบต์
Giuseppe

1
ฉันคิดว่าคุณสามารถแทนที่pด้วยp+.1คำตอบ 25 ไบต์และคุณจะยังคงโอเคสำหรับ 28 ไบต์
JDL

โซลูชัน 28 ไบต์อื่นที่ไม่มีปัญหาความแม่นยำเชิงตัวเลข
Robin Ryder


2

Ruby , 31 ไบต์

ตกลงดังนั้นวิธีการที่ใช้บันทึกเหล่านี้มีแนวโน้มที่จะเกิดข้อผิดพลาดในการปัดเศษดังนั้นนี่เป็นวิธีการอื่นที่ทำงานกับจำนวนเต็มและไม่มีปัญหาเหล่านั้น:

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

ลองออนไลน์!

แต่กลับไปที่ค่าลอการิทึมถึงแม้ว่ามันจะไม่ชัดเจนถึงความแม่นยำที่เราต้องสนับสนุนอินพุต แต่ฉันคิดว่าเคล็ดลับเล็กน้อยนี้จะแก้ปัญหาการปัดเศษสำหรับตัวเลข "สมจริง" ทั้งหมดที่มากหรือน้อย:

Ruby , 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
ใช้งานไม่ได้ (1,000, 10) เนื่องจากข้อผิดพลาดในการปัดเศษ
nwellnhof

f(n,m){n=(float)log(n)/log(m);}ดูเหมือนว่าจะทำงาน @ 31 ไบต์
GPS



2

05AB1E , 6 ไบต์

Lm¹›_O

ลองออนไลน์!


นี่ดูเหมือนจะไม่ยุติธรรมสำหรับทุกคน
Floris

1
@Floris การแข่งขันอยู่ระหว่างการส่งในแต่ละภาษาไม่ใช่ระหว่างภาษาใช่มั้ย
user202729

@ user202729 ใช่และไม่ใช่ ในใจของฉันในที่สุด "รหัสสั้นที่สุดชนะ" แต่ฉันสังเกตเห็นว่ามีวิธีแก้ปัญหา 2 ไบต์ต่อไป ... ภาษากอล์ฟเหล่านี้ทำให้ฉันรู้สึกใจ
Floris

1
@ ฟลอริส "อย่าปล่อยให้ภาษาของ code-golf กีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่มี codegolfing พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาการเขียนโปรแกรม 'ใด ๆ '
user202729

1
@Floris นี้ด้วย ... แม้แต่ Excel สามารถทำมันได้ใน 2 builtins ภาษาการเล่นกอล์ฟสามารถทำได้ 2 แบบในตัวเช่นกันเพียงแค่ชื่อบิวด์อินจะสั้นลง ไม่มีอะไรน่าแปลกใจ
user202729

2

JavaScript , 40 33 ไบต์

-3 ไบต์ขอบคุณ DanielIndie

รับอินพุตในรูปแบบ currying

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 มีนาคมใช้สองอาร์กิวเมนต์ด้วยการอ้างอิงตัวเลือกที่สามซึ่งหากมีการตั้งค่าเป็นฐานยกผล)


@StewieGriffin logint (x, y) จากทั้ง Pari / GP และ Perl / ntheory ให้ผลลัพธ์ที่ถูกต้องสำหรับตัวอย่าง 7 ตัวอย่างที่แสดงในปัจจุบันรวมถึง '3' สำหรับ 1,000,10
DanaJ

+1 แต่ฉันจะนับเป็น 6 ไบต์
ชาร์ลส์

2
คุณไม่ได้รับอนุญาตให้ใช้อินพุตฮาร์ดโค้ดดังนั้นจึงต้องเป็นฟังก์ชัน (เช่นแลมบ์ดาหรือคำจำกัดความ) อย่างไรก็ตามคุณสามารถใช้logintที่ถูกต้องและนับน้อยกว่า 5 ไบต์
ბიმო

2

Python 2, 3, 46 ไบต์

-1 ขอบคุณโจนาธาน

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

Python 1, 47 ไบต์

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

n~-in i-1เป็นหนึ่งไบต์สั้นกว่า
Jonathan Frech

นอกจากนี้โปรดระบุเวอร์ชัน Python ของคุณ
Jonathan Frech

จะใช้ได้กับทุกรุ่นใช่มั้ย
Vedant Kandoi

มันจะไม่ทำงานใน Python 1
Jonathan Frech

2

JavaScript (Node.js)ขนาด 22 ไบต์

m=>f=n=>n<m?0:f(n/m)+1

ลองออนไลน์!

ฟังก์ชั่นวนซ้ำแบบ Curried g(P)(N)ใช้เป็น มีโอกาสน้อยที่จะเกิดข้อผิดพลาดจุดลอยตัวกว่าการใช้Math.logและ (ฉันเชื่อว่า) โค้ดให้ค่าที่ถูกต้องตราบใดที่อินพุตทั้งสองเป็นจำนวนเต็มปลอดภัย (ใต้2**52)




1

ภาษา Wolfram (Mathematica) 15 10 Bytes

Floor@*Log 

(ต้องมีคำสั่งกลับรายการในอินพุต)

ส่งต้นฉบับ

⌊#2~Log~#⌋&

⌊Log@##⌋&สั้นลงหนึ่งไบต์
Lukas Lang

@ Mathe172 นั่นคือหนึ่งตัวอักษรที่สั้นกว่า แต่ฉันนับ 13 ไบต์บนนั้น พื้นด้านซ้ายและพื้นด้านขวานับเป็น 3 ไบต์ใน UTF-8
Kelly Lowder

@StewieGriffin% [10,1000] ให้ 3 อินพุตจะถือว่าเป็นจำนวนเต็มแทนที่จะเป็นหมายเลขเครื่องเว้นแต่ว่าคุณจะใส่ทศนิยมตามหลังพวกเขา
Kelly Lowder

1

Forth (gforth) , 35 ไบต์

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

ลองออนไลน์!

สามารถบันทึก 5 ไบต์ได้โดยการสลับพารามิเตอร์อินพุตที่คาดไว้ แต่คำถามต้องระบุ N ว่าต้องเป็นอันดับแรก (อาร์กิวเมนต์สามารถทำได้ในภาษา postfix "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คือ log B (A)
พูดตามตรงฉันไม่รู้เลยว่ามันFทำงานยังไง แต่ถ้ามันใช้งานได้ผล
sตัดทลอยให้เป็น int เพื่อให้จำนวนเต็มที่สูงสุดแก่Mเรา


2
1,000,10 เป็นอินพุตให้ 2 เป็นเอาต์พุต
Stewie Griffin

อีกวิธีที่คล้ายกันคือ/FlM
RK

1

สงสัย 9 ไบต์

|_.sS log

ตัวอย่างการใช้งาน:

(|_.sS log)[1000 10]

คำอธิบาย

เวอร์ชัน verbose:

floor . sS log

นี่คือรูปแบบการเขียนที่ไม่มีจุดหมาย sSส่งไอเท็มรายการเป็นอาร์กิวเมนต์ไปยังฟังก์ชัน (ในกรณีนี้log)


1

Gforth , 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 ใช้ floating-point-stack โดยเฉพาะ เพื่อที่ฉันจะต้องSWAP(แลกเปลี่ยน) ค่าอินพุตเพื่อให้พวกเขาไปที่จุดสแต็คลอยตามลำดับที่ถูกต้อง S>Fฉันยังมีการย้ายค่าที่จะสแต็คที่ว่าด้วย เมื่อเลื่อนผลลัพธ์จุดลอยกลับไปเป็นจำนวนเต็ม ( F>S) ฉันมีประโยชน์ที่จะได้รับการตัดฟรี

รุ่นที่สั้นกว่า

การยืดความต้องการและป้อนข้อมูลในรูปแบบลอยและลำดับที่ถูกต้องมีรุ่นที่สั้นกว่า 24 ไบต์

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

ลองออนไลน์!


โดยทั่วไปสำหรับคำตอบของ CodeGolf จะไม่อนุญาตให้มีการใช้ตัวอย่าง (เว้นแต่จะระบุไว้เป็นอย่างอื่นในการแข่งขัน) คำตอบนี้ควรห่อด้วยฟังก์ชั่น (Word in Forth) : f .... ;หรือแปลงเป็นโปรแกรมที่รับอินพุตโดยใช้KEYหรือACCEPT
reffu

@reffu ข้อมูลโค้ดคืออะไร ในความคิดของฉันส่วนรหัส smal เพื่อแสดงบางสิ่งซึ่งไม่มีอะไรมีความหมายสำหรับตัวเอง ในทางกลับกันรหัสที่ฉันให้ไว้ใช้งานได้โดยไม่มีการเปลี่ยนแปลงใน "ลองใช้งานออนไลน์!" เราควรไปเมตาหรือไม่
Kitana

ในกรณีนี้รหัสที่คุณโพสต์นั้นอันที่จริงจะมีการสแต็กอันเดอร์โฟล์วเว้นเสียแต่ว่าคุณจะวางพารามิเตอร์ไว้ข้างหน้า โดยทั่วไปคำตอบของรหัสกอล์ฟควรเป็นโปรแกรมหรือฟังก์ชั่นในตัวที่สร้างผลลัพธ์ที่คาดหวังหากเรียกในภายหลัง หากคุณไปที่ลิงก์ไปยังโพสต์เมตาในความคิดเห็นก่อนหน้าของฉันมันระบุอย่างชัดเจนว่ามาตรฐานนั้นเป็นคำตอบให้เป็นโปรแกรมหรือฟังก์ชั่นซึ่งเป็นของคุณ หากต้องการแก้ไขจะต้องมีเพียง 4 ไบต์เท่านั้น
reffu



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