ช่วยGödelด้วยฟังก์ชั่น [ของเขา [ปิด]


13

ฟังก์ชันöของGödelใช้ตัวเลขธรรมชาติสามตัวเป็นอาร์กิวเมนต์

มันถูกกำหนดให้เป็น β(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 เช่นนั้นสำหรับทุก ๆ in, β (b, c, i) = k_i

Gödelต้องการความช่วยเหลือในการค้นหาbและสำหรับการป้อนข้อมูลใดก็ตามc(k_0, k_1, … , k_n), k_i ∈ ℕ


เขียนฟังก์ชั่นที่ใช้ความยาวเป็นอาร์เรย์nเต็มไปด้วยจำนวนธรรมชาติและให้b,cเอาต์พุตที่เป็นไปได้ที่ตรงกับเล็มม่าของอาร์เรย์


ไม่ได้รับการแก้ปัญหาด้วยกำลังดุร้าย!

(ในความเห็นของฉันโดยไม่คาดคิดทั้งหมดมันเป็นแรงเดรัจฉานเมื่อคุณได้รับตัวเลขจากนั้นทำการคำนวณนั่นคือการคาดเดาตัวเลขแล้วดูว่าการเดานั้นถูกต้องหรือไม่สิ่งที่ฉันต้องการให้มีการเข้ารหัสที่นี่ ตัวเลขและไม่จำเป็นต้องตรวจสอบว่าพวกเขาเติมเต็มบทแทรกเพราะพวกเขาถูกคำนวณให้ทำ)

สร้างพวกเขาด้วยสมการและข้อมูลที่ได้รับ รหัสที่สั้นที่สุดชนะคะแนนโบนัสถ้าคุณทำ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
@Takakimp ถึงกระนั้นตัวอย่างงานเดียวสามารถช่วยให้คำจำกัดความที่ค่อนข้างเป็นทางการได้ชัดเจนขึ้น
Martin Ender


1
ยังไม่ชัดเจนว่ามีคุณสมบัติอะไรบ้างที่เป็น "กำลังดุร้าย" เห็นได้ชัดว่าวิธีการที่วนซ้ำทุกคู่(b, c)จนกว่ามันจะพบว่างานใดที่จะเป็นการใช้กำลังอย่างดุเดือดและวิธีการทำงานแบบเส้นตรงในระยะเวลาตามความยาวของอินพุตจะไม่เป็น แต่มีช่องว่างขนาดใหญ่ระหว่างสิ่งนั้น การลากเส้นอยู่ที่ไหน
Peter Taylor

6
มีคนบอกว่าเบต้าหรือไม่
Beta Decay

คำตอบ:


3

JavaScript (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และในbสำหรับc:

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.