n의 거듭 제곱


14

지도

입력 정수 n ( n >= 0)이 주어지면 가장 작은 양의 정수 m을 출력 하는 프로그램을 작성하십시오 .

  • n = a[1]^b[1] + a[2]^b[2] + a[3]^b[3] + ... + a[k]^b[k]
  • ab동일한 길이의 서열은 유한
  • 모든 요소는 a보다 작은m
  • 모든 요소는 b보다 작은m
  • 의 모든 요소 a다르고 정수a[x] >= 0
  • 의 모든 요소 b다르고 정수b[x] >= 0
  • a[x]그리고 b[x]둘 다 0 (불확정 0 ^ 0 이후이다)되고

이것은 이므로 가장 적은 바이트가 이깁니다.

In 0 -> Out 1
Possible Sum: 

In 1 -> Out 2
Possible Sum: 1^0

In 2 -> Out 3
Possible Sum: 2^1

In 3 -> Out 3
Possible Sum: 2^1 + 1^0

In 6 -> Out 4
Possible Sum: 2^2 + 3^0 + 1^1

In 16 -> Out 5
Possible Sum: 2^4

In 17 -> Out 4
Possible Sum: 3^2 + 2^3

In 23 -> Out 6
Possible Sum: 5^1 + 3^0 + 2^4 + 1^3

In 24 -> Out 5
Possible Sum: 4^2 + 2^3

In 27 -> Out 4
Possible Sum: 3^3

In 330 -> Out 7
Possible Sum: 6^1 + 4^3 + 3^5 + 2^4 + 1^0

무한대가 아닌 합이 아닌 고유하고 음이 아닌 정수 시퀀스를 어떻게 만들어야합니까?
feersum

또한 첫 번째 경우는 0 개의 용어로 충분하면 충분하지 않습니다.
feersum

@feersum 나는 당신의 질문을 잘 이해하지 못합니다. 이 내 솔루션은 모든 조합의 브 루트 포스 검색하다 m<2한 후 m<3다음 m<4나는 동일 합을 찾을 때까지 등 n. 또한, 나는 합계 0가 조건이 아니라고 생각 했지만 결과는 무엇입니까? m>?
kukac67

1
유한 시퀀스의 경우 일반적으로 다음과 같은 작업을 수행합니다 n = a[1]^b[1] + a[2]^b[2] + ... + a[k]^b[k].
변동성

1
좋은 질문. 첫 번째 테스트 사례에서 단 하나의 퀴즈 : ablength의 유한 시퀀스 0이므로 m제약 조건을 충족시키지 않는 정수 가 없으며 가장 작은 정수가 없으므로 답이 정의되지 않습니다. 가능한 수정은 가장 작은 자연수 m(이 경우 예상 답변을 변경해야 함 0) 또는 가장 작은 양의 정수를 요청하는 것 m입니다.
피터 테일러

답변:


2

GolfScript (59 자)

~:T),{),.0{2$0-{2${{4$2$^}2*@3$\?4$+f~}%\;~}%+\;\;}:f~T&}?)

온라인 데모

이것은 재귀를 사용하여 주어진 값에 대해 달성 가능한 값을 열거 m하고 첫 번째 값을 검색 m합니다. xnor의 답변 에서 가볍게 영감을 받았습니다. 지만 구현 방식은 상당히 다릅니다.

해부

~:T                  # Evaluate input and store in T (for Target)
),{                  # Search [0 1 ... T] for the first m which matches a predicate
  ),.0               #   Push [0 ... m] to the stack twice and then 0
                     #   Stack holds: possibleAs possibleBs sum
  {                  #   Define the recursive function f
    2$0-{            #     Map over A in possibleAs (except 0)
      2${            #       Map over B in possibleBs (except 0)
        {4$2$^}2*    #         Duplicate respective possibles and remove selected values
        @3$\?4$+     #         Compute sum' = sum + A^B
        f            #         Recursive call gives an array [sums]
        ~            #         Push the sums to the stack individually
        }%           #       End map: this collects the sums into a combined array
      \;             #       Pop A, leaving just the combined [sums] inside the map
      ~              #       Repeat the trick: push to the stack individually
    }%               #     End map, collecting into a combined array
                     #     Stack now holds: possibleAs possibleBs sum [sums]
    +                #     Include the original sum in the array of reachable sums
    \;\;             #     Pop possibleAs and possibleBs
  }:f                #   End function definition
  ~                  #   Evaluate the function
  T&                 #   Test whether the sums contain T
}?                   # End search
)                    # Increment to get m

6

파이썬, 120

f=lambda n,A,B:n*all(f(n-a**b,A-{a},B-{b})for a in A for b in B)
g=lambda n,m=1,M={0}:f(n,M-{0},M)and g(n,m+1,M|{m})or m

함수 f여부를 체크가 보조 기능이다 n없는 별개의 염기와의 전력의 합으로서 표현 될 A로부터 지수 B. 자연 재귀 전략을 사용 n합니다. 0이 아니어야하며, 가능한 모든 기본 및 지수 선택을 시도하고 모두 실패해야합니다. 우리는 허용 된 목록에서 그것들을 제거하고 n해당하는 양만큼 감소 합니다.

기능 g이 주요 기능입니다. m작동 하는 것을 검색 합니다. M최대 허용 된 값의 집합입니다 m-1. 0허용 된 지수에서 0**0파이썬이 1로 평가되는 것을 막기 위해 제거 합니다 . 이것은 아무 것도 해치지 않습니다. 왜냐하면 다른 모든 사람 0**x에게는 쓸모가 없기 때문 입니다 .0x


당신은 아마 변경 될 수 있습니다 n and all()n*all().
grc

@grc 아, 실제로 단락이 필요하지 않습니다. 개선 주셔서 감사합니다.
xnor

4

파이썬 2, 138 바이트

from itertools import*
S=lambda n,m=0,R=[]:m*any(n==sum(map(pow,*C))for k in R for C in product(*tee(permutations(R,k))))or S(n,m+1,R+[m])

(모든 팁에 대한 @Jakube에게 감사합니다)

나는 itertools이 한 가지 질문에서 모듈 에 대해 많이 배운 적이 없습니다 . 마지막 경우는 약 1 분이 걸립니다.

우리 m = 1는 솔루션을 얻을 때까지 검색 하고 증가시키는 것으로 시작 합니다. 반복되는 솔루션을 확인하려면 다음을 수행하십시오.

  • k = 0 to m-1k솔루션의 항 수는 어디에 있습니까?
  • 가능한 모든 용어 조합 ( [0, 1, ... m-1]size 가있는 부분 집합의 두 순열을 함께 압축하여 k)을 합한 후n

우리는 반복한다 k 까지이 m-1- 비록 기술적 m용어는 총 가능 항상있는 해결 방법이 있습니다 m-1같은 용어 0^0허용되지 않으며 0^b기여 아무것도. 이것은 0^0파이썬에서 1로 취급 되기 때문에 실제로 중요 합니다. 문제처럼 보이지만 문제가되지 않습니다!

이유는 다음과 같습니다.

0^01로 잘못 사용 된 솔루션이 있다고 가정합니다 . 예 :3^2 + 1^1 + 0^0 = 11 . 우리는 m-1용어 까지만 생성하기 때문에 j기본으로 사용하지 않는 항목 이 있어야합니다 (여기 j = 2). j유효한 솔루션을 얻기 위해 base 0을 스왑 할 수 있습니다 ( here) 3^2 + 1^1 + 2^0 = 11.

우리 모두까지 반복했다 m면, 우리는 같은 잘못 솔루션을 찍었을 수도 m = 2에 대한을 n = 2통해 0^0 + 1^1 = 2.


좋은데 imap을 사용하여 4 바이트를 절약 할 수 있습니다. imap(pow,C,D) ... for C,D in
Jakube

@Jakube 실제로 itertools우리가 말하는 것처럼 문서를 살펴보고 tee있습니다.
Sp3000

나도. 또한 내 실수. imap있을 때 누군가가 제안하는 이유는 무엇입니까 map?? -1 바이트
Jakube

의 기본 매개 변수 tee는 이미 n=2입니다. 2 바이트를 저장합니다.
Jakube

@Jakube Ahaha 감사합니다. 이것은 아마도 map하나 이상의 iterable과 함께 사용한 적이있을 것입니다. 실제로이 질문은 나에게 많은 것을 가져옵니다.
Sp3000

4

GolfScript ( 90 84 바이트)

[0.,.]](~:T),(+{:x;{:|2,{:c)|=x),^{c[1$x]=:A^x^:-;[|~-+@A-?+@A+@]}%}/+~}%.[]*T&}?)\;

온라인 데모

해부

[0.,.]             # Base case: [sum As Bs] is [0 [] []]
](~:T              # Collect it in an array of cases; fetch parameter, eval, store in T.
),(+               # Create array [1 2 ... T 0]. Putting 0 at the end means that it won't
                   # be reached except when T is 0, and nicely handles that special case.
{                  # Loop over the values from that array...
  :x;              #   ...assigning each in turn to x (and popping it from the stack)
  {                #   Stack holds array of [sum As Bs] cases; map them...

    :|             #     Store [sum As Bs] in |
    2,{:c          #     For c in [0 1]...
      )|=x),^      #       Get [0 1 ... x]^ either As or Bs, depending on c
      {            #       Map these legal new As or Bs respectively...
        c[1$x]=:A  #         Work out which of that value or x is the new A
        ^x^:-;     #         And the other one is the new B
        [          #         Begin gathering in an array
          |~       #           Push sum As Bs to the stack
          -+       #           Add - to Bs to get Bs'
          @A-?+    #           Rotate sum to top and add A^- to get sum'
          @A+      #           Rotate As to top and add A to get As'
          @        #           Final rotation to put elements in the right order
        ]          #         Gather in array [sum' As' Bs']
      }%           #       End map
    }/             #     End for
    +~             #     Push all the elements corresponding to x^B and A^x on to the stack
  }%               #   End map, collecting the untouched [sum As Bs] and all the new
                   #   [sum' As' Bs'] arrays into a new array of reached cases.
  .[]*T&           #   Flatten a copy of that array and filter to values equal to T.
                   #   This gives a truthy value iff we've found a way to make T.
}?                 # Loop until we get a truthy value, and push the corresponding x
)\;                # Increment to get the value of m and discard the array of cases

가장 우아한 트릭은에 대한 특별한 경우를 처리하는 것입니다 0.


CJam이 이번이 표준 python = P보다 훨씬 짧지 않다는 것이 정말 기쁩니다.
flawr

@flawr, 이것은 CJam이 아닌 GolfScript입니다. CJam은 직교 제품에 내장되어 있기 때문에 아마도 약간 더 짧을 수 있습니다. 그리고 xnor의 재귀 함수에 대한 아이디어는 GolfScript도 짧아 질 수 있습니다.
피터 테일러

죄송합니다, 그냥 혼란스러워하셨습니다. =)
flawr

4

하스켈 143 130

import Data.List
p n=head$[1..]>>=(\m->[m|let x=permutations[0..m-1]>>=inits,a<-x,b<-x,sum(zipWith(\x y->x^y*signum(x+y))a b)==n])

사용 예 : p 23-> 6.

이것은 간단한 무차별 대입 검색입니다. 모든 목록 [0..0], [0..1], [0..2] ... [0..∞]에 대해 순열의 모든 초기 세그먼트를 취하십시오 (예 : [0..2] : 순열 : [012], [102], [210], [120], [201], [021], 첫 번째 순열의 초기 세그먼트 : [0], [01], [012], 2nd : [1], [10], [102], 등). 이 목록 중 2 개의 모든 조합에 대해 검정력의 합을 계산하십시오. 첫 번째가 n과 같을 때 중지합니다.


>>=대신에 사용해야합니다 concatMap. 그것들은 동일하지만 논쟁이 뒤집어졌습니다.
자부심을 가진 haskeller

@ proudhaskeller : 예, 감사합니다!
nimi

2

파이썬 : 166 자

from itertools import*;p=permutations
f=lambda n,r=[0]:any(n==sum(map(lambda x,y:(x+y>0)*x**y,a,b))for j in r for a,b in product(p(r,j),p(r,j)))*1or 1+f(n,r+[len(r)])

설명

이 함수는 f가능한 모든 정수를 생성하며에있는 숫자의 거듭 제곱의 합계로 표현할 수 있습니다 r. 시작과 함께하면 r = [0]. 해당 정수 중 하나가 같으면 n의 길이를 반환하고 r그렇지 않으면 확장을 사용하여 재귀 적으로 호출합니다.r .

합으로 표현 될 수있는 모든 정수의 계산은 두 개의 루프로 수행됩니다. 첫 번째 루프는 for j in r표현식의 길이를 알려줍니다 (2 ^ 3 + 1 ^ 2의 길이는 2 임). 내부 루프 r는 length 의 순열의 모든 조합을 반복 j합니다. 각각에 대해 나는 힘의 합을 계산합니다.


2

자바 스크립트 (ES6) 219 224

재귀 기능. m = 1부터 시작하여 정수의 경우 1..m의 정수와 지수의 경우 0..m의 모든 조합을 시도합니다 (0의 밑은 0 ^ 0 == 정의되지 않음).
해결책을 찾지 못하면 m을 높이고 다시 시도하십시오.
입력 0의 특수 사례 (제 생각에는 사양에 오류가 있음)

C 함수는 주어진 길이의 배열에서 모든 조합을 재귀 적으로 생성하므로

C(3, [1,2,3]) --> [[3,2,1], [3,1,2], [2,3,1], [2,1,3], [1,3,2], [1,2,3]]

세 번째 수준 every은 a 배열과 b 배열을 묶는 데 사용됩니다 ( zipJavaScript 에는 기능 이 없음 ). 사용 every초기에 중지하면 두 배열의 모든 요소를 사용하지 않는 해결책이있을 때.

F=(n,j=1,k=[],
  C=(l,a,o=[],P=(l,a,i=l)=>{
    for(l||o.push(a);i--;)
      e=[...a],P(l-1,e.concat(e.splice(i,1)))
  })=>P(l,a)||o
)=>n&&C(k.push(j++),k)[E='every'](a=>C(j,[0,...k])[E](b=>a[E](x=>t-=Math.pow(x,b.pop()),t=n)))
?F(n,j,k):j

FireFox / FireBug 콘솔에서 테스트

;[0,1,2,3,6,16,17,23,24,27,330].map(x=>[x,F(x)])

산출

[[0, 1], [1, 2], [2, 3], [3, 3], [6, 4], [16, 5], [17, 4], [23, 6], [ 24, 5], [27, 4], [330, 7]]

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