유전 적 기초 변화


9

배경

이 문제에서 정수 의 기본 b표현 은 의 거듭 제곱의 n표현 n으로 b, 각 항은 최대 b-1횟수로 발생합니다 . 예를 들어, 기본 4표현 2015

4^5 + 3*4^4 + 3*4^3 + 4^2 + 3*4 + 3

이제, 유전 적 기본 b표현은 n지수를 기본 b표현으로 변환 한 다음 지수를 재귀 적으로 변환하여 얻습니다 . 따라서 유전의 기본 4표현 2015

4^(4 + 1) + 3*4^4 + 3*4^3 + 4^2 + 3*4 + 3

좀더 복잡한 예로서, 유전베이스 - 3표현

7981676788374679859068493351144698070458

이다

2*3^(3^(3 + 1) + 2) + 3 + 1

의 유전 염기 변화 nbc 붙이고는 H(b, c, n), 유전베이스 - 구한다 개수 b의 표현을 n마다 교체 b하여 c, 생성 식을 평가. 예를 들어

H(3, 2, 7981676788374679859068493351144698070458)

이다

2*2^(2^(2 + 1) + 2) + 2 + 1 = 2051

도전

당신은 입력으로 세 개의 정수 주어 b, c, n,하는 당신이 가정 수를 n >= 0하고 b, c > 1. 출력은 H(b, c, n)입니다. 가장 짧은 바이트 수가 이기고 표준 허점은 허용되지 않습니다. 함수 또는 전체 프로그램을 작성할 수 있습니다. 임의로 큰 입력 및 출력 (큰 숫자)을 처리 할 수 ​​있어야합니다.

테스트 사례

4 2 3 -> 3
2 4 3 -> 5
2 4 10 -> 1028
4 4 40000 -> 40000
4 5 40000 -> 906375
5 4 40000 -> 3584
3 2 7981676788374679859068493351144698070458 -> 56761
2 3 2051 -> 35917545547686059365808220080151141317047

재미있는 사실

임의의 정수 n에 대해

n1 = n
n2 = H(2, 3, n1) - 1
n3 = H(3, 4, n2) - 1
n4 = H(4, 5, n3) - 1
....

결국에 도달 0합니다. 이것을 Goodstein의 정리라고 합니다.

답변:


6

CJam, 60 58 45 43 41 38 36 바이트

2 바이트를 절약 해 준 Optimizer에게 감사합니다.

l~:C;:B;{Bb)1$,,@f{1$~=C@)F#*+}~}:F~

여기에서 테스트하십시오.

순서대로 입력을 n b c받습니다.

이를 사용하여 모든 테스트 사례를 테스트 할 수 있습니다.

"3 4 2 
3 2 4 
10 2 4 
40000 4 4 
40000 4 5 
40000 5 4 
7981676788374679859068493351144698070458 3 2 
2051 2 3 "N/
{
~:C;:B;{Bb)1$,,@f{1$~=C@)F#*+}~}:F~
p}/

설명

이것은 재귀 기본 확장, 기본 대체 및 최종 결과 계산을 인터리브한다는 점을 제외하고는 도전 과제에서 설명한 프로세스를 상당히 직접 구현 한 것입니다.

l~:C;:B;{Bb)1$,,@f{1$~=C@)F#*+}~}:F~
l~:C;:B;                             "Read and evaluate input, store b and c in B and C.";
        {                       }:F  "Define a block F. This performs the required conversion.";
         Bb                          "Get digits of input number in base B.";
           )                         "Split off 0-power digit.";
            1$,                      "Copy remaining digits. Get their length n.";
               ,                     "Make array [0 1 ... n-1].";
                @                    "Pull up remaining digits.";
                 f{           }      "Map this block onto the range, passing in the digits
                                      as a second argument each time.";
                   1$~=              "Copy current i, bitwise complement, access digit array.
                                      This accesses the digits in reverse order.";
                       C             "Push the new base C.";
                        @)           "Pull up current i and increment to get power.";
                          F          "Apply F recursively.":
                           ~         "Raise C to the resulting power.";
                            *        "Multiply by digit.";
                             +       "Add to running total.";
                               ~     "The result will be in an array. Unwrap it.";
                                   ~ "Execute F on the input n.";

8

파이썬 2, 55

H=lambda b,c,n,s=0:n and n%b*c**H(b,c,s)+H(b,c,n/b,s+1)

재귀 솔루션. 재귀 알고리즘은 지수 사이에서 재귀하는 것을 제외 하고는베이스 사이를 변환합니다.

우리 n는 현재 숫자 n%b와 다른 모든 숫자의 두 부분으로 나뉩 니다 n/b. 현재 장소 값은 선택적 매개 변수에 저장됩니다 s. 현재 자릿수가 기준 c으로 변환되고 c**지수 s는 재귀 적 으로 변환됩니다. 그런 다음 나머지는 같은 방식으로 변환 +H(b,c,n/b,s+1)되지만 장소 값 s은 하나 더 높습니다.

기본 변환과 달리 유전 기본 변환은 변환을 위해 재귀에서 현재 위치 값을 기억해야했습니다.

읽기 쉽게하기 위해, 다음과 같이 표시됩니다 bc고정 전역 상수.

H=lambda n,s=0:n and n%b*c**H(s)+H(n/b,s+1)

pyth에서 명명 된 인수를 사용할 수 있다는 것을 몰랐기 때문에 주로 이것을 게시했습니다 D(GHY=Z0)R&Y+*%YG^H(GHZ)(GH/YGhZ. 원한다면 자유롭게 추가하십시오. (pyth : D에서 골프를 치기위한 팁을 떠났습니다.)
FryAmTheEggman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.