그의 β 기능으로 괴델을 도와주세요.


13

고델의 β 함수는 세 개의 자연수를 인수로 취합니다.

그것은 다음과 같이 정의됩니다 β(x,y,z) = rem(x, 1 + (z + 1) · y) = rem(x, (z · y + y + 1) )

여기서 rem (a, b)는 a를 b로 정수 나눈 후의 나머지를 나타냅니다.

β 레마는 이제 다음과 같이 말합니다.

일련의 자연수 (k_0, k_1,…, k_n)에 대해, 자연수 b와 c가 있으며, 모든 i ≤ n에 대해 β (b, c, i) = k_i입니다.

괴델이 찾아 도움을 필요로 b하고 c주어진 입력 (k_0, k_1, … , k_n), k_i ∈ ℕ.


length의 배열을 취하고 n자연수로 채워 b,c지고 배열의 Lemma를 충족 시키는 가능한 출력을 제공 하는 함수를 작성 하십시오.


무차별 대입으로 해결책을 얻지 마십시오!

(내 완전히 비전문가의 의견으로는, 처음 숫자를 얻은 다음 계산을 수행하면 무차별 적 인 힘입니다. 숫자를 추측 한 다음 추측이 올바른지 찾고 있습니다. 여기에서 코딩하려는 것은 다음을 계산하는 솔루션입니다. 숫자를 계산하고 계산했기 때문에 그들이 정리를 수행하는지 여부를 확인할 필요가 없습니다.)

주어진 방정식과 정보로 구성하십시오. 가장 짧은 코드가 승리 Javascript합니다.:)


예:

[5, 19, 7, 8] -> (1344595, 19)
1344505 % (1 + (0 + 1) * 19) = 5
1344505 % (1 + (1 + 1) * 19) = 19
1344505 % (1 + (2 + 1) * 19) = 7
1344505 % (1 + (3 + 1) * 19) = 8

5
PPCG에 오신 것을 환영합니다! 이것은 좋은 첫 번째 질문이지만 좀 더 명확하게하기 위해 테스트 사례를 추가하는 것이 좋습니다.
Laikoni

4
@Tweakimp 그럼에도 불구하고 하나의 예제는 오히려 공식적인 정의를 명확하게하는 데 도움이 될 수 있습니다.
Martin Ender


1
무엇이 "브 루트 포스 (brute force)"에 해당되는지 명확하지 않습니다. 분명히 작동하는 방법이 (b, c)무차별 한 것을 발견 할 때까지 모든 쌍을 반복 하는 접근 방식은 입력 길이에 따라 선형으로 진행되는 접근 방식은 그렇지 않지만 그 사이에는 큰 차이가 있습니다. 선은 어디에 그려 지나요?
피터 테일러

6
누군가 베타라고 했습니까?
Beta Decay

답변:


3

자바 스크립트 (ES6), 104 바이트

a=>[c=a.reduce(c=>c*++i,Math.max(...a),i=0),a.reduce(g=(x,k)=>x%m-k?g(x+n,k):(n*=m,m+=c,x),0,n=1,m=c+1)]

[c, b]배열로 반환 합니다. 그것이 반환하는 솔루션은 최소가 c아니지만 b주어진 에 대해 최소라고 생각합니다 c. 120 바이트의 경우 주어진 c및 최소의 솔루션을 반환합니다 .bc

f=(a,c=1,b=a.reduce(g=(x,k)=>x%m-k?d--?g(x+n,k):0/0:n%m?g(x,k,n+=o):(o=n,d=m+=c,x),0,o=n=1,d=m=c+1))=>1/b?[b,c]:f(a,c+1)

Ungolfed 최소 솔루션 솔버 :

function godel(a) {
    for (c = 0;; c++) {
        var b = 0, n = 1, i = 0;
        for (;;) {
            var m = c * i + c + 1;
            // Increase b until β(b,c,i) = a[i]
            // Adding n won't change output for smaller i
            for (j = 0; j < m; j++) if (b % m != a[i]) b += n;
            if (j == m) break; // couldn't find a remainder, c too low
            i++;
            if (i == a.length) return [b, c]; // Result!
            // Next time we want adding n to b not to change β(b,c,i)
            for (j = 1; n * j % m != 0; j++);
            n *= j;
        }
    }
}

1
큰! 친절하고 코드에 주석을 달겠습니까? :)
Tweakimp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.