Quyền hạn toàn số


19

Một số số 64có thể được biểu thị dưới dạng toàn bộ số theo nhiều cách:

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

Xuất ra một mảng được sắp xếp của tất cả các quyền hạn có thể có (ở đây, [1,2,3,6]) trong càng ít byte càng tốt.


Đầu vào

Một số nguyên dương lớn hơn 1 và nhỏ hơn 10000.


Đầu ra

Mảng quyền hạn toàn số p(bao gồm 1) mà đầu vào có thể được biểu thị a^pbằng toàn bộ sốa . Các đầu ra có thể có số thập phân, miễn là theo thứ tự.

Bất kỳ vấn đề điểm nổi phải được xử lý bởi chương trình.


Ví dụ

Input: 3
Output: [1]

Input: 9
Output: [1, 2]

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

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

Bảng điểm

Để điểm số của bạn xuất hiện trên bảng, nó phải ở định dạng này:

# Language, Bytes

Strikethroughs không gây ra vấn đề.


1
Câu trả lời của tôi in [1 2 3 6]cho trường hợp thử nghiệm cuối cùng. Nó cũng có thể in [6 3 2 1], [1.0 2.0 3.0 6.0]hoặc [6.0 3.0 2.0 1.0]?
Dennis

2
Chúng ta có thể giả định gì về kích thước đầu vào và số học dấu phẩy động? Điều này ảnh hưởng đến giải pháp mà bạn cố lấy gốc của số và xem kết quả có phải là số nguyên không.
xnor

4
Tôi nghĩ rằng các tài liệu tham khảo về rễ đã gây nhầm lẫn cho tất cả mọi người, vì vậy tôi viết lại nó về quyền hạn. Hãy thay đổi mọi thứ trở lại.
xnor

1
Tôi đánh giá cao sự chỉnh sửa! Đề xuất và sửa đổi luôn được chào đón, miễn là chúng cải thiện chất lượng câu hỏi của tôi (mà tôi tin rằng bạn đã làm). Gần đây tôi mới bắt đầu đặt câu hỏi trên mạng cụ thể này và thấy cộng đồng thường chào đón. Phê bình và sửa chữa được nhiều đánh giá cao! @xnor
Zach Gates

1
Đơn giản chỉ cần tìm sức mạnh hợp lệ lớn nhất và sau đó liệt kê các yếu tố của nó!
SuperJedi224

Câu trả lời:


10

Bình thường, 10 byte

f}Q^RTSQSQ

Trình diễn

Đối với mỗi công suất, nó tạo ra danh sách tất cả các số cho đến đầu vào được lấy cho công suất đó, sau đó kiểm tra xem đầu vào có nằm trong danh sách không.


10

Haskell, 38

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

Khá đơn giản. Việc hiểu danh sách tìm thấy các giá trị bmà đầu vào nxuất hiện trong số đó [1^b, 2^b, ..., n^b]. Nó đủ để kiểm tra btrong phạm vi [1..n].


9

Con trăn 2, 53

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

Brute buộc tất cả các tổ hợp căn cứ theo số mũ trong [0, n-1] và căn cứ trong [1, n].


8

Python 3, 56 byte

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

Điều này thực sự vụng về. Kiểm tra xem mỗi igốc -th tiềm năng cho một số nguyên bằng cách làm tròn nó, lấy sức mạnh của nó ivà kiểm tra xem nó có bằng với gốc không.

Kiểm tra trực tiếp rằng gốc là một số nguyên là khó khăn vì các dấu phẩy động cho những thứ như thế 64**(1/3) == 3.9999999999999996. Làm tròn nó thành một số nguyên cho phép chúng tôi kiểm tra nếu lấy năng lượng trở về giá trị ban đầu. Cảm ơn ypercube đã gợi ý điều này, tiết kiệm 1 byte.

frageum có một giải pháp ngắn gọn và thông minh hơn . Tất cả các bạn nên thực sự nâng cao điều đó.


Sẽ không chính xác nếu bạn kiểm tra round(n**(1/i),0)**i==n?
ypercubeᵀᴹ

@ypercube Cuộc gọi tốt, cùng với 0độ chính xác mặc định cho vòng, điều này giúp tiết kiệm một byte.
xnor

7

Bình thường, 11 10 12 byte

fsmqQ^dTSQSQ

Kiểm tra tất cả các kết hợp sức mạnh có thể. Rất chậm.


5

CJam, 23 byte

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

Điều này hoạt động bằng cách lấy thừa số nguyên tố của n và tính toán giao điểm của các ước của tất cả các số mũ.

Nó dài hơn một chút so với giải pháp khác của tôi , nhưng tôi hy vọng nó sẽ hoạt động (và hoàn thành ngay lập tức) cho tất cả các số nguyên trong khoảng từ 2 đến 2 63 - 1 .

Dùng thử trực tuyến trong thông dịch CJam .

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

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 byte

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

Chương trình APL đầu tiên của tôi; đề nghị chơi golf được đánh giá cao.

              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)

Vui lòng thêm mã giả / giải thích. Nhưng +1 (không thể bỏ phiếu ngay bây giờ) khi sử dụng APL (- thật tuyệt vời trước khi nó thật tuyệt ) :-)
mınxomaτ

Cũng +1, nhiều tình yêu dành cho APL. Xe golf cuối cùng.

Dựa trên mã giả, điều này khó có thể hoạt động (trừ khi APL thực hiện kiểm tra tính bằng dấu phẩy động gần đúng). Ví dụ, với pow(pow(7,3),1./3))tôi nhận được 6.99999999999999bằng C hoặc Python. Điều này là do độ chính xác bị mất khi tính 1 / A.
frageum

@feersum Tôi không biết về thông dịch viên ngoại tuyến, nhưng tất cả các quyền hạn của 3 hoạt động chính xác trên tryapl.org.
lirtosiast

@ThomasKwa Có vẻ như một bài kiểm tra đẳng thức gần đúng thực sự được sử dụng. dyalog.com/uploads/document/Papers/tolerant_comparison/ory
frageum

3

JavaScript (ES5), 73 byte 81 byte 79 byte 75 byte

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

Kiểm tra xem liệu sức mạnh số nguyên gần nhất của gốc có thể bằng n. ~~(.5+...)tương đương với Math.round(...)các biểu thức trong phạm vi số nguyên (0 đến 2 ^ 31 - 1).

Chỉnh sửa: Được sử dụng &&logic lười biếng thay vì ifđể cạo 2 byte và thêm dấu nhắc cho đầu vào do câu hỏi đã thêm một sự làm rõ. Trước đây giả sử đầu vào được lưu trữ trongn .

Chỉnh sửa 2: Thay đổi ~~(.5+...)để .5+...|0lưu hai byte bằng cách tránh nhóm.

Chỉnh sửa 3: Xóa varđể lưu 4 byte. Trong chế độ không nghiêm ngặt, điều này được chấp nhận.


Bạn có thể cạo một vài byte bằng cách tung hứng các biểu thức: for (var p = Math.pow, i = 1; i ++ <n; p (~ ~ (.5 + p (n, 1 / i)), i) == n && console .log (i));

@Alhadis cảm ơn bạn đã đóng góp, tôi sẽ chỉnh sửa ngay lập tức
Patrick Roberts

@PatrickRoberts Bạn có thể p=Math.powtiết kiệm nhanh chóng 1 byte
Downgoat

@vihan, đó sẽ là một tuyên bố không hợp lệ, vì varđược yêu cầu
Patrick Roberts

Trừ khi bạn có ý forthay vì prompt..
Patrick Roberts

3

Brachylog , 8 byte

≥^↙.?≥ℕ≜

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

Đưa đầu vào qua biến đầu vào của nó và tạo ra mỗi công suất thông qua biến đầu ra của nó, theo thứ tự tăng dần theo yêu cầu, không giống như giải pháp cũ ≥ℕ≜^↙.?∧xảy ra có cùng độ dài.

≥           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.

Tôi không có bất kỳ lời biện minh nghiêm ngặt nào để khẳng định rằng mọi số mũ không lớn hơn đầu vào, nhưng để chương trình thực sự chấm dứt, nó cần phải bị ràng buộc.

ḋḅlᵛflà một giải pháp ngắn hơn (không phải máy phát) cho tất cả các trường hợp thử nghiệm đã cho, nhưng sẽ thất bại nếu đầu vào không phải là một sản phẩm của các số nguyên tố khác nhau. (Nghĩ về nó, vì tất cả các trường hợp thử nghiệm đều là sức mạnh của số nguyên tố, ḋlfcũng hoạt động ...) Điều tốt nhất tôi nghĩ ra để cứu vãn ý tưởng ḋḅlᵐḋˢ⊇ᵛ×f, xuất hiện tới 10 byte.




2

JavaScript ES7, 66 byte

Tận dụng lợi thế của sự hiểu biết mảng thử nghiệm. Chỉ hoạt động trên Firefox.

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

Có thể chơi golf. Có lẽ tôi sẽ cố gắng squish các biểu thức ngắn hơn một chút và hy vọng tìm thấy một thay thế cho Array(n).keys()cú pháp dài .

Có thể ngắn hơn nhưng JavaScript có độ chính xác điểm nổi khủng khiếp.


Ah, học được một cái gì đó mới ... tuyệt vời.
Patrick Roberts

2

CJam, 20 byte

ri_,1df+\1$fmL9fmO&p

Đối với đầu vào n , điều này sẽ tính log b n cho tất cả b nhỏ hơn hoặc bằng n và giữ kết quả là số nguyên.

Điều này sẽ làm việc cho tất cả các số nguyên từ 2 đến 9,999 . Thời gian chạy là khoảng O (n) .

Hãy thử trực tuyến trong trình thông dịch CJam .

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

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 là đầu vào duy nhất mà nó thất bại hay nó là thất bại duy nhất mà bạn đã thử nghiệm?
Beta Decay

Có những người chắc chắn nhất. Trên thực tế, tôi cũng phát hiện ra rằng nó cũng thất bại trong 4913 , điều này làm cho bản sửa đổi trước đó của tôi không hợp lệ.
Dennis

2

Hồng ngọc, 50

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

In ra màn hình.

Ruby, 57

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

Trả về một mảng.

Trong chương trình thử nghiệm:

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)

Tính toán từng gốc và kiểm tra chúng modulo 1 để xem phần còn lại có nhỏ hơn 1e-8 không. Do độ chính xác hạn chế, một số gốc số nguyên hợp lệ được tính là dạng 0.9999 .., do đó cần phải thêm 1e-9 cho chúng.

Lên đến gốc thứ n của n được tính, đó là tổng số quá mức cần thiết, nhưng dường như là cách ngắn nhất để viết một vòng lặp không vô hạn.



2

DC, 104 byte

Đầu vào được lấy từ thiết bị đầu cuối, đầu ra được in và cũng trên ngăn xếp.

Bởi vì điều này sử dụng? Toán tử, bạn cần sử dụng dc -e "<solution>"hoặc dc <file with solution in it>.

Không ai từng thấy câu trả lời của tôi, chứ đừng nói đến việc bỏ phiếu cho họ, nhưng tôi thực sự chỉ thích giải quyết các vấn đề ở DC. Đó là giải pháp kém hiệu quả nhất trong chủ đề này cho đến nay, nhưng tôi nghĩ rằng dù sao tôi cũng sẽ đăng nó.

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

công cụ khởi động

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

Macro để tăng cơ sở cho tất cả các quyền hạn cho đến khi kết quả lớn hơn mục tiêu hoặc bằng với mục tiêu

[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

Macro để lưu giá trị số mũ hợp lệ như được tìm thấy từ các macro số mũ ở trên vào ngăn xếp khá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

Macro để chạy macro trên 2 lần (macro c) thông qua tất cả các cơ sở từ 2 đến số mục tiêu của chúng tôi

[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

Macro để in các giá trị từ ngăn xếp 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
Tôi đoán rằng không nhiều người biết DC. Trả lời các câu hỏi mới (đặc biệt là một trong những câu trả lời sớm nhất) sẽ giúp thu hút sự chú ý nhiều hơn. Bạn cũng có thể thử sử dụng các liên kết TIO cho câu trả lời của mình, vì điều đó rất phổ biến. Đây là DC trên TIO .
mbomb007

Cảm ơn! Tôi chắc chắn sẽ sử dụng nó cho câu trả lời đi về phía trước!
FlexEast



0

Japt , 10 byte

õ
f@mpX øN

Thử nó

õ            :Implicit input of integer U
õ            :Range [1,U]
f@mpX øN     :Reassign to U
f            :Filter
 @           :By passing each X through the following function
  m          :  Map U
   pX        :    Raise to the power of X
      ø      :  Contains
       N     :    Any element of the (singelton) array of inputs
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.