Sức mạnh hoàn hảo theo nhiều cách?


13

Thử thách

Nhiệm vụ của bạn là viết một chương trình hoặc hàm, với một số nguyên dương N , tìm thấy tất cả các số nguyên dương nhỏ hơn hoặc bằng N có thể được biểu thị như một sức mạnh hoàn hảo theo nhiều cách.

Định nghĩa

Một sức mạnh hoàn hảo được định nghĩa là một số i được tìm thấy bởi m ^ k , trong đó:

  • mtôi là số nguyên dương
  • m! = k

Các trường hợp thử nghiệm

đầu vào -> đầu ra
1000 -> 16, 64, 81, 256, 512, 625, 729
56 -> 16
999 -> 16, 64, 81, 256, 512, 625, 729
81 -> 16, 64, 81
1500 -> 16, 64, 81, 256, 512, 625, 729, 1024, 1296

Vui lòng cung cấp một phiên bản dễ đọc, bình luận là tốt.


Câu cuối cùng của bạn có nghĩa là khoảng trắng không tính vào số lượng ký tự?
sepp2k

@ sepp2k Vâng! Chúng ta không nên tính khoảng trắng.
fR0DDY

4
@ fR0DDY Điều gì về khoảng trắng ngôn ngữ ? Bỏ qua các ký tự khoảng trắng sẽ luôn làm cho ngôn ngữ này giành chiến thắng.
marcog

4
Tôi không nghĩ rằng thật đau lòng khi có câu hỏi kỳ lạ có thể giành được bằng câu trả lời khoảng trắng. Chúng ta sẽ thấy phải mất bao lâu trước khi ai đó có thể bị làm phiền.
gnibbler

1
Có giới hạn nào cho N không?
Dogbert

Câu trả lời:


3

Toán học: 103 ký tự

Không gian có thể được loại bỏ

Select[Flatten@
       Table[
        Solve[Log@#/Log@b == k, k, Integers] /. k -> #, {b, 2, #}] & /@ Range@#, 
Length@# > 2 &][[All, 1, 1]] &  

Sử dụng:

%[81]
{16, 64, 81}

3

Jelly , 11 byte có ý nghĩa, thách thức ngôn ngữ

ḊḟÆR *@þ Ḋ  F  fḊ

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

Đây là một giải pháp hoàn toàn khác. Đây là một sự kết hợp tò mò giữa hiệu quả và không hiệu quả, sử dụng thuật toán lõi hiệu quả trong trình bao bọc rất kém hiệu quả (đến mức nó không thể xử lý số lượng rất lớn). Như trước đây, tất cả khoảng trắng là vô nghĩa.

Đây là cách nó hoạt động. (xuất hiện nhiều lần) là danh sách các số từ 2 đến đầu vào đã bao gồm:

ḊḟÆR *@þ Ḋ  F  fḊ
ḊḟÆR                Ḋ, with all primes between 2 and the input removed
                    (i.e. all composite numbers from 4 to the input)
     *@þ Ḋ          Exponentiate all Ḋ elements with all ḊḟÆR elements
            F       Flatten the result (it had a nested structure)
               fḊ   Keep only elements in Ḋ

Quan sát cơ bản ở đây là một số là một công suất hoàn hảo theo nhiều cách, chỉ khi đó là một công suất hoàn hảo với số mũ tổng hợp (đó không phải là 1). Chúng tôi tạo ra một danh sách những người có cơ sở từ 2 đến đầu vào và số mũ là một số tổng hợp từ 4 đến đầu vào; Điều này thực sự chậm vì nó tạo ra một số con số thực sự lớn, tất cả đều là câu trả lời cho câu hỏi. Sau đó, chúng tôi chỉ giữ câu trả lời trong phạm vi.

Có thể dễ dàng sửa đổi điều này thành một câu trả lời hiệu quả cao, bằng cách tìm ra sức mạnh tối đa trong phạm vi là gì và không lặp lại nữa, nhưng đó sẽ là nhiều byte hơn, và đây là môn đánh gôn.


1

Perl: 68 ký tự

Nhận tối đa (1000) trong $Nvà trả về câu trả lời @a.

for $x ( 2..$N ) {
    $c{$x**$_}++ for 2..log($N)/log$x
}
@a = grep { $c{$_} > 1 } keys %c

Đối với toàn bộ chương trình, tôi cần thêm 18 ký tự:

$m = shift;
for $x ( 2..$m ) {
    $c{$x**$_}++ for 2..log($m)/log$x
}
print join ' ', grep { $c{$_} > 1 } keys %c

Điều này không in theo thứ tự. codepad.org/H0Zyau3z
Dogbert

@Dogbert: In theo thứ tự không phải là một phần của thách thức. Nếu có, bạn cculd thêm sort trước grep. Nhân tiện, tôi chưa từng thấy codepad. Cảm ơn.

0

Ruby - 101 ký tự (không có khoảng trắng)

f=->l{c=Hash.new{0}
2.upto(1E4){|i|2.upto(20){|j|c[i**j]+=1}}
c.map{|k,v|v>1&&k<=l&&k||p}.compact.sort}

Hoạt động 1 <= limit <= 100,000,000trong vòng 5 giây.

Kiểm tra

> f[10000]
[16, 64, 81, 256, 512, 625, 729, 1024, 1296, 2401, 4096, 6561, 10000]

0

Jelly , 13 nhân vật có ý nghĩa, thách thức ngôn ngữ

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf

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

Tất cả khoảng trắng ở đây là không đáng kể. Tôi đã sử dụng nó để hiển thị cấu trúc câu trả lời của tôi, như câu hỏi yêu cầu.

Đây là cách nó hoạt động:

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf
R                     Ðf    Find all numbers n from 1 to the input, such that:
   µ               µ          (grouping marks, like {} in C)
       Ḋ   Ḋ                  Take the range from 2 to n
      ọ                       Find the number of times each divides n
         *@                   Raise the range from 2 to n to these powers
             ċ                Count the number of times n appears
               >2             and the result must be greater than 2

Vì vậy, ví dụ, khi kiểm tra n = 256, chúng tôi kiểm tra số lần mỗi số từ 2 đến 256 chia thành 256. Các số duy nhất chia nhiều lần là 2 (chia 8 lần), 4 (chia 4 lần), 8 (chia hai lần) và 16 (chia hai lần). Vì vậy, khi chúng tôi tăng số lượng các đơn vị cho các quyền lực được xác định ở đó, chúng tôi nhận được:

2⁸, 3, 4⁴, 5, 6, 7, 8², 9, 10, 11, 12, 13, 14, 15, 16², 17, ..., 255, 256

Điều này tạo ra giá trị ban đầu, 256, số lần bằng với cách 256 là một công suất hoàn hảo, cộng với một (phần tử cuối cùng tạo ra 256 vì 256 = 256¹). Vì vậy, nếu chúng ta thấy 256 hơn hai lần trong mảng (và chúng ta làm trong trường hợp này; 8² là 64 nhưng các yếu tố "thú vị" khác đều tạo ra 256), thì đó phải là một sức mạnh hoàn hảo.

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.