여러 가지 방법으로 완벽한 힘?


13

도전

당신의 임무는 양의 정수 N이 주어지면 여러 가지 방법으로 완벽한 거듭 제곱으로 표현 될 수있는 N 이하의 모든 양의 정수를 찾는 프로그램이나 함수를 작성하는 것입니다.

정의

완벽한 전력 수로 정의 제가 발견 m ^ K :

  • mi 는 양의 정수입니다.
  • m! = k

테스트 사례

입력-> 출력
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

읽을 수 있고 주석이 달린 버전도 제공하십시오.


마지막 문장은 공백이 문자 수를 나타내지 않는다는 것을 의미합니까?
sepp2k

@ sepp2k 예! 공백을 계산해서는 안됩니다.
fR0DDY

4
@ fR0DDY 공백은 어떻습니까? 공백 문자를 무시하면이 언어가 항상 승리합니다.
moinudin

4
공백 답변으로 얻을 수있는 이상한 질문을하는 것이 아프지 않다고 생각합니다. 우리는 누군가 귀찮게하기까지 시간이 얼마나 걸리는지 볼 것이다.
gnibbler

1
N에 제한이 있습니까?
Wile E. Coyote

답변:


3

매스 매 티카 : 103 자

공백을 제거 할 수 있습니다

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

용법:

%[81]
{16, 64, 81}

3

젤리 , 11 개의 의미있는 바이트, 언어 사후 도전

ḊḟÆR *@þ Ḋ  F  fḊ

온라인으로 사용해보십시오!

완전히 다른 해결책이 있습니다. 이것은 매우 비효율적 인 래퍼에서 효율적인 핵심 알고리즘을 사용하여 효율적이고 비효율적 인 호기심 많은 하이브리드입니다 (너무 많은 수를 처리 할 수 ​​없습니다). 이전과 마찬가지로 모든 공백은 의미가 없습니다.

작동 방식은 다음과 같습니다. (여러 번 나타남)은 2에서 입력을 포함하여 숫자 목록입니다.

ḊḟÆ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 Ḋ

여기에서 기본적인 관찰은 숫자가 복합 지수 (1이 아님)를 가진 완벽한 거듭 제곱 인 경우에만 여러 가지면에서 완벽한 거듭 제곱이라는 것입니다. 밑이 2부터 입력까지의 목록을 생성하고 지수는 4부터 입력까지의 복소수입니다. 이것은 실제로 큰 숫자를 생성하기 때문에 속도가 느리며 질문에 대한 답변입니다. 그런 다음 범위 내에있는 답변 만 유지합니다.

범위의 최대 전력이 무엇인지 더 이상 반복하지 않고 더 많은 바이트를 반복함으로써이를 매우 효율적인 답변으로 쉽게 수정할 수 있지만 이것은 더 많은 바이트이며 코드 골프입니다.


1

펄 : 68 자

최대 값 (1000)을 가져 $N오고에 답변을 반환합니다 @a.

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

전체 프로그램을 위해서는 또 다른 18 개의 문자가 필요합니다.

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

순서대로 인쇄되지 않습니다. codepad.org/H0Zyau3z
Wile E. Coyote

@Dogbert : 순서대로 인쇄하는 것은 어려운 일이 아닙니다. 그렇다면 sort 이전에 추가하십시오 grep. 그건 그렇고, 전에는 코드 패드를 보지 못했습니다. 감사.

0

루비-공백없이 101 자

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}

1 <= limit <= 100,000,0005 초 안에 작동합니다 .

테스트

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

0

젤리 , 13 개의 의미있는 캐릭터, 언어 사후 도전

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

온라인으로 사용해보십시오!

여기의 모든 공백은 중요하지 않습니다. 질문에 따라 답변의 구조를 보여주기 위해 사용했습니다.

작동 방식은 다음과 같습니다.

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

예를 들어, n = 256을 테스트 할 때 2에서 256까지의 각 숫자가 256으로 나누는 횟수를 확인합니다. 두 번 이상 나누는 숫자는 2 (8 번 나누기), 4 (4 나누기)뿐입니다. 시간), 8 (두 번 나누기) 및 16 (두 번 나누기)입니다. 따라서 우리가 결정한 거듭 제곱으로 나누기의 수를 늘리면 다음과 같은 결과를 얻습니다.

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

이것은 원래 값인 256을 생성합니다. 256은 완전한 거듭 제곱과 같은 횟수에 1을 더한 값에 1을 더한 값입니다. 따라서 배열에서 256을 두 번 이상 볼 경우 (이 경우 8²는 64이지만 다른 "관심있는"요소는 모두 256을 생성합니다) 완벽한 힘이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.