อำนาจเต็มจำนวน


19

ตัวเลขบางอย่างเช่น64สามารถแสดงเป็นพลังงานจำนวนเต็มในหลายวิธี:

64 ^ 1
 8 ^ 2
 4 ^ 3
 2 ^ 6

เอาท์พุทอาเรย์ที่เรียงลำดับของอานาจที่เป็นไปได้ทั้งหมด (ที่นี่[1,2,3,6]) ในจำนวนไบต์น้อยที่สุด


อินพุต

จำนวนเต็มบวกที่มากกว่า 1 และน้อยกว่า 10,000


เอาท์พุต

อาร์เรย์ของอำนาจจำนวนทั้งหมดp(รวม1) ซึ่งการป้อนข้อมูลที่สามารถแสดงเป็นที่มีจำนวนทั้งหมดa^p aผลลัพธ์อาจมีทศนิยมถ้าเป็นไปตามลำดับ

โปรแกรมจุดใดประเด็นหนึ่งจะต้องได้รับการจัดการ


ตัวอย่าง

Input: 3
Output: [1]

Input: 9
Output: [1, 2]

Input: 81
Output: [1, 2, 4]

Input: 729
Output: [1, 2, 3, 6]

ป้ายบอกคะแนน

เพื่อให้คะแนนของคุณปรากฏบนกระดานควรอยู่ในรูปแบบนี้:

# Language, Bytes

ขีดทับไม่ควรทำให้เกิดปัญหา


1
คำตอบของฉันพิมพ์ออกมา[1 2 3 6]สำหรับกรณีทดสอบล่าสุด สามารถก็ยังพิมพ์[6 3 2 1], [1.0 2.0 3.0 6.0]หรือ[6.0 3.0 2.0 1.0]?
เดนนิส

2
เราสามารถคิดอะไรเกี่ยวกับขนาดอินพุตและเลขคณิตทศนิยม สิ่งนี้มีผลต่อวิธีแก้ปัญหาที่คุณพยายามหยั่งรากของตัวเลขและดูว่าผลลัพธ์เป็นจำนวนเต็มหรือไม่
xnor

4
ฉันคิดว่าการอ้างอิงไปที่รูททำให้ทุกคนสับสนดังนั้นฉันจึงเขียนมันใหม่ในแง่ของพลัง อย่าลังเลที่จะเปลี่ยนสิ่งต่าง ๆ กลับมา
xnor

1
ฉันขอขอบคุณการแก้ไข! ข้อเสนอแนะและการแก้ไขยินดีต้อนรับเสมอหากพวกเขาปรับปรุงคุณภาพของคำถามของฉัน (ซึ่งฉันเชื่อว่าคุณทำ) ฉันเพิ่งเริ่มถามคำถามเกี่ยวกับเครือข่ายนี้และพบว่าชุมชนยินดีต้อนรับ คำติชมและการแก้ไขชื่นชมมาก! @xnor
Zach Gates

1
เพียงค้นหาพลังที่ถูกต้องที่ใหญ่ที่สุดแล้วระบุปัจจัยของมัน!
SuperJedi224

คำตอบ:


10

Pyth, 10 ไบต์

f}Q^RTSQSQ

สาธิต

สำหรับพลังงานแต่ละรายการมันจะสร้างรายการตัวเลขทั้งหมดขึ้นอยู่กับอินพุตที่นำไปสู่พลังงานนั้นแล้วตรวจสอบว่าอินพุตนั้นอยู่ในรายการหรือไม่


10

Haskell, 38

f n=[b|b<-[1..n],n`elem`map(^b)[1..n]]

ตรงไปตรงมาสวย ความเข้าใจรายการพบว่าค่าbที่ป้อนข้อมูลที่ปรากฏในหมู่n [1^b, 2^b, ..., n^b]มันพอเพียงในการตรวจสอบในช่วงb[1..n]


9

Python 2, 53

lambda n:[i/n for i in range(n*n)if(i%n+1)**(i/n)==n]

Brute บังคับให้รวมกันทั้งหมดของฐานในเลขชี้กำลังใน [0, n-1] และฐานใน [1, n]


8

Python 3, 56 ไบต์

lambda n:[i for i in range(1,n)if round(n**(1/i))**i==n]

นี่มันเงอะงะจริงๆ ทดสอบว่าแต่ละศักยภาพi-th root ให้จำนวนเต็มโดยการปัดมันรับพลังiและตรวจสอบว่ามันเท่ากับต้นฉบับ

64**(1/3) == 3.9999999999999996โดยตรงการตรวจสอบว่ารากเป็นจำนวนทั้งหมดเป็นเรื่องยุ่งยากเพราะจุดลอยให้สิ่งที่ต้องการ การปัดเศษเป็นจำนวนเต็มให้เราตรวจสอบว่าการพาวเวอร์ส่งกลับค่าเดิมหรือไม่ ขอบคุณ ypercube ที่แนะนำสิ่งนี้ให้ประหยัด 1 ไบต์

feersum มีวิธีแก้ปัญหาที่สั้นกว่าและฉลาดกว่า คุณทุกคนควรโหวตว่า


มันจะไม่ถูกต้องถ้าคุณตรวจสอบround(n**(1/i),0)**i==n?
ypercubeᵀᴹ

@ypercube การโทรที่ดีพร้อมกับ0ความถูกต้องของการปัดเศษจะช่วยประหยัดไบต์
xnor

7

Pyth, 11 10 12 ไบต์

fsmqQ^dTSQSQ

ตรวจสอบการรวมพลังที่เป็นไปได้ทั้งหมด ช้ามาก.


5

CJam, 23 ไบต์

rimF{1=:E){E\d%!},}%:&p

สิ่งนี้ทำงานโดยการแยกตัวประกอบเฉพาะของnและคำนวณจุดตัดของตัวหารของเลขชี้กำลังทั้งหมด

มันเป็นบิตนานกว่าการแก้ปัญหาอื่น ๆ ของฉันแต่ฉันคาดหวังในการทำงาน (และเสร็จสิ้นทันที) สำหรับจำนวนเต็มทั้งหมดระหว่าง2และ2 63 - 1

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

ri                       Read an integer from STDIN.
  mF                     Push its prime factorization.
    {             }%     For each [prime exponent]:
     1=:E                  Retrieve the exponent and save it in E.
         ){     },         Filter; for each I in [0 ... E]:
           E\d%              Compute E % Double(I).
                             (Casting to Double is required to divide by 0.)
               !             Push the logical NOT of the modulus.
                           Keep I if the result is truhty, i.e., if I divides E.
                    :&   Intersect all resulting arrays of integers.
                      p  Print the resulting array.

5

APL, 17 ไบต์

(X=⌊X←N*÷⍳N)/⍳N←⎕

โปรแกรม APL ครั้งแรกของฉัน ข้อเสนอแนะการเล่นกอล์ฟได้รับการชื่นชม

              N←⎕  ⍝ Store input into N
             ⍳     ⍝ The list [1 2 ... N]
            /      ⍝ Select the elements A for which
      N*÷⍳N)       ⍝ N^(1/A)
(X=⌊X←             ⍝ equals its floor (that is, is an integer)

โปรดเพิ่ม pseudocode / คำอธิบาย แต่ +1 (ไม่สามารถลงคะแนนได้ในขณะนี้) สำหรับการใช้ APL (- เป็นแบบสั้นก่อนที่จะเจ๋ง ) :-)
mınxomaτ

+1 ด้วยชอบมากสำหรับ APL สุดยอดยานพาหนะการเล่นกอล์ฟ

ตาม pseudocode สิ่งนี้ไม่น่าเป็นไปได้ (เว้นแต่ว่า APL จะทำการทดสอบความเท่าเทียมกันของเลขทศนิยม) ตัวอย่างเช่นpow(pow(7,3),1./3))ฉันได้รับ6.99999999999999ใน C หรือ Python เนื่องจากความแม่นยำจะหายไปเมื่อคำนวณ 1 / A
feersum

@feersum ฉันไม่รู้เกี่ยวกับล่ามแบบออฟไลน์ แต่พลังของ 3 ทั้งหมดทำงานอย่างถูกต้องบน tryapl.org
lirtosiast

@ThomasKwa ดูเหมือนว่าจะใช้การทดสอบความเท่าเทียมกันโดยประมาณ dyalog.com/uploads/documents/Papers/tolerant_comparison/ …
feersum

3

JavaScript (ES5), 73 ไบต์ 81 ไบต์ 79 ไบต์ 75 ไบต์

for(n=+prompt(),p=Math.pow,i=0;i++<n;)p(.5+p(n,1/i)|0,i)==n&&console.log(i)

ตรวจสอบเพื่อดูว่าพลังจำนวนเต็มที่ใกล้เคียงที่สุดของรูทเท่ากับnหรือไม่ ~~(.5+...)เทียบเท่ากับMath.round(...)นิพจน์ภายในช่วงจำนวนเต็ม (0 ถึง 2 ^ 31 - 1)

แก้ไข:ใช้&&ตรรกะขี้เกียจแทนifการโกน 2 ไบต์และเพิ่มพรอมต์สำหรับการป้อนข้อมูลเนื่องจากคำถามได้เพิ่มการชี้แจง nก่อนหน้านี้การป้อนข้อมูลสมมติว่าถูกเก็บไว้ใน

แก้ไข 2:เปลี่ยน~~(.5+...)เป็น.5+...|0บันทึกสองไบต์โดยหลีกเลี่ยงการจัดกลุ่ม

แก้ไข 3:ลบvarเพื่อบันทึก 4 ไบต์ ในโหมดไม่เข้มงวดนี่เป็นที่ยอมรับ


คุณสามารถโกนหนวดได้สองไบต์โดยการเล่นกลนิพจน์: สำหรับ (var p = Math.pow, i = 1; i ++ <n; p (~~ (.5 + p (n, 1 / i)), i) == n && console .log (i));

ขอบคุณ @Alhadis สำหรับการป้อนข้อมูลของคุณผมจะได้ทำการแก้ไขในบิต
แพทริคโรเบิร์ต

@PatrickRoberts คุณสามารถบีบp=Math.powลงในการบันทึกที่รวดเร็ว 1 ไบต์
Downgoat

@vihan ว่าจะเป็นประกาศที่ไม่ถูกต้องเนื่องจากvarจะต้อง
แพทริคโรเบิร์ต

ถ้าคุณไม่ได้ตั้งใจforแทนprompt..
Patrick Roberts

3

Brachylogขนาด 8 ไบต์

≥^↙.?≥ℕ≜

ลองออนไลน์!

รับอินพุตผ่านตัวแปรอินพุตและสร้างพลังงานแต่ละตัวผ่านตัวแปรเอาต์พุตตามลำดับจากน้อยไปมากตามความต้องการซึ่งแตกต่างจากโซลูชันเก่า≥ℕ≜^↙.?∧ที่เกิดขึ้นเพื่อให้มีความยาวเท่ากัน

≥           Some number which is less than or equal to
            the input,
 ^          when raised to the power of
  ↙.        the output,
    ?       is the input.
       ≜    Label
            the output
      ℕ     as a whole number
     ≥      which is less than or equal to
    ?       the input.

ฉันไม่มีเหตุผลที่เข้มงวดในการยืนยันว่าเลขชี้กำลังทุกตัวไม่เกินค่าอินพุท แต่เพื่อให้โปรแกรมยุติการใช้งานจริงจำเป็นต้องมีขอบเขต

ḋḅlᵛfเป็นวิธีแก้ปัญหาที่สั้นกว่า (ไม่ใช่เครื่องกำเนิดไฟฟ้า) สำหรับกรณีทดสอบที่ให้มาทั้งหมด แต่จะล้มเหลวหากอินพุตไม่ใช่พลังงานของผลิตภัณฑ์เฉพาะช่วงเวลา (ลองคิดดูสิเนื่องจากกรณีทดสอบทั้งหมดเป็นพลังของช่วงเวลาḋlfก็ใช้ได้ ... ) สิ่งที่ดีที่สุดที่ฉันคิดไว้เพื่อกอบกู้แนวความคิดḋḅlᵐḋˢ⊇ᵛ×fออกมาคือ 10 ไบต์




2

JavaScript ES7, 66 ไบต์

ใช้ประโยชน์จากความเข้าใจของอาร์เรย์ทดลอง ใช้ได้กับ Firefox เท่านั้น

n=>[for(i of Array(n).keys(m=Math.pow))if(m(0|.5+m(n,1/i),i)==n)i]

การตีกอล์ฟที่เป็นไปได้ ฉันอาจจะพยายามที่จะทำให้การแสดงออกสั้นลงสักหน่อยและหวังว่าจะได้พบกับทางเลือกที่ยาวกว่าArray(n).keys()ซินแท็คซ์

อาจจะสั้นลง แต่ JavaScript มีความแม่นยำของจุดลอยตัวอย่างน่ากลัว


อ่าเรียนรู้สิ่งใหม่ ... เจ๋ง
Patrick Roberts

2

CJam, 20 ไบต์

ri_,1df+\1$fmL9fmO&p

สำหรับการป้อนข้อมูลnคำนวณนี้เข้าสู่ระบบ nสำหรับทุกน้อยกว่าหรือเท่ากับnและช่วยให้ผลลัพธ์ที่เป็นจำนวนเต็ม

นี้ควรจะทำงานสำหรับจำนวนเต็มทั้งหมดระหว่าง2และ9,999 เวลาทำงานคือประมาณO (n)

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

ri                   e# Read an integer N from STDIN.
  _,                 e# Copy N and transform it into [0 ... N-1].
    1df+             e# Add 1.0 to each, resulting in [1.0 ... Nd].
        \1$          e# Swap the array with N and copy the array.
           fmL       e# Mapped log base N: N [1.0 ... Nd] -> [log1(N) ... logN(N)]
              9fmO   e# Round each logarithm to 9 decimals.
                  &  e# Intersect this array with [1.0 ... Nd].
                   p e# Print the result.

คือ 15,625 อินพุตเดียวที่มันล้มเหลวหรือเป็นเพียงอินพุตเดียวที่คุณล้มเหลว?
สลายตัวเบต้า

มีคนอื่นแน่นอนที่สุด ในความเป็นจริงฉันเพิ่งพบว่ามันล้มเหลวสำหรับ4913เช่นกันซึ่งทำให้การแก้ไขก่อนหน้าของฉันไม่ถูกต้อง
เดนนิส

2

ทับทิม, 50

->n{(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||p(i)}}

พิมพ์ไปที่หน้าจอ

ทับทิม, 57

->n{a=[]
(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||a<<i}
a}

ส่งกลับอาร์เรย์

ในโปรแกรมทดสอบ:

f=->n{(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||puts(i)}}

g=->n{a=[]
(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||a<<i}
a}

f.call(4096)
puts g.call(4096)

คำนวณแต่ละรากและทดสอบโมดูโล 1 เพื่อดูว่าส่วนที่เหลือน้อยกว่า 1e-8 หรือไม่ เนื่องจากความแม่นยำที่ จำกัด มีการคำนวณรากจำนวนเต็มที่ถูกต้องเป็นรูปแบบ 0.9999 .. ดังนั้นจึงจำเป็นต้องเพิ่ม 1e-9

จนถึงการคำนวณรูตที่ n ของ n ซึ่งก็คือ overkill ทั้งหมด แต่ดูเหมือนจะเป็นวิธีที่สั้นที่สุดในการเขียนลูปแบบไม่สิ้นสุด



2

DC, 104 ไบต์

อินพุตถูกนำมาจากเทอร์มินัลเอาต์พุตจะถูกพิมพ์และบนสแต็ก

เพราะสิ่งนี้ใช้ ผู้ประกอบการ, คุณจำเป็นต้องใช้หรือdc -e "<solution>"dc <file with solution in it>

ไม่มีใครเคยเห็นคำตอบของฉันโหวตคนเดียว แต่ฉันสนุกกับการแก้ปัญหาใน DC มันเป็นวิธีที่มีประสิทธิภาพน้อยที่สุดในหัวข้อนี้ แต่ฉันคิดว่าฉันจะโพสต์มันต่อไป

1sb?sn[lesi]ss[lble1+dse^dln=sln>c]sc[liSflq1+sq]sm[Lfplq1-dsq0<p]dsp[lb1+sb0si0selcxli0!=mlbln!=h]dshxx

สิ่งเริ่มต้น

1sb           Store 1 in register b
?sn           Store user input in register n
[lesi]ss      A macro to copy the e to the i register, stored in the s register

แมโครเพื่อยกระดับฐานไปยังพลังทั้งหมดจนกว่าผลลัพธ์จะใหญ่กว่าเป้าหมายหรือเท่ากับเป้าหมาย

[lble1+dse^dln=sln>c]sc
[lb                 ]   load our base num (register b)
[  le               ]   load our exponent (register e)
[    1+dse          ]   add 1 to the exponent, copy and store in the e register
[         ^d        ]   raise the base to the exponent and copy it
[           ln=s    ]   load the user input, if that is equal to the power result run the macro in register s
[               ln>c]   load the user input, if it's greater than the power result run the macro in register c (this one)
[                   ]sc save this macro in register c

แมโครเพื่อบันทึกค่าเลขชี้กำลังที่ถูกต้องตามที่พบจากแมโครเลขชี้กำลังด้านบนไปยังสแต็กอื่น

[liSflq1+sq]sm
[liSf      ]     copy the i register to the top of the stack in register f
[    lq1+sq]     add 1 to the q register
[          ]sm   save this macro in the m register

มาโครเพื่อเรียกใช้มาโคร 2x ที่อยู่เหนือ (มาโคร c) ผ่านฐานทั้งหมดตั้งแต่ 2 ถึงหมายเลขเป้าหมายของเรา

[lb1+sb0si0selcxli0!=mlbln!=h]dsh
[lb1+sb                      ]     add 1 to the base number
[      0si0se                ]     reset the i and e registers (previously found value and exponent
[            lcx             ]     load and run the c macro
[               li0!=m       ]     load the result of the c macro and if it's not 0, run m to save it to the f stack
[                     lbln!=h]     if our base number is not equal to our target number, run macro h (this macro)
[                            ]dsh  duplicate this macro and save one copy, so that one is left on the stack to run later

แมโครเพื่อพิมพ์ค่าจากสแต็ก f

[Lfplq1-dsq0<p]dsp
[Lfp          ]      load the top value from the f register and print it
[   lq1-dsq   ]      load the q register and subtract one from it and save it
[          0<p]      if the q register is greater than 0, run macro p (this macro) again
[             ]dsp   duplicate this macro and save one copy, so that one is left on the stack to run later

xx finally run the two macros on the stack (h and then p)


1
ฉันเดาว่ามีคนไม่มากที่รู้จัก DC การตอบคำถามใหม่ (โดยเฉพาะการตอบคำถามแรกสุด) จะช่วยให้ได้รับความสนใจมากขึ้น คุณอาจลองใช้ลิงค์ TIO สำหรับคำตอบของคุณเนื่องจากเป็นที่นิยมมาก นี่คือดี.ซี. เมื่อ TIO
mbomb007

ขอบคุณ! ฉันจะใช้คำตอบนั้นต่อไปอย่างแน่นอน!
FlexEast



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