หมายเลขที่ n มีจำนวนเฉพาะของปัจจัยสำคัญที่แตกต่างกัน


10

สร้างฟังก์ชั่นที่สั้นที่สุดโปรแกรมหรือการแสดงออกที่คำนวณA073329คือa(n)เป็นที่ nจำนวนที่มีnปัจจัยสำคัญที่แตกต่างกัน อินพุตคือจำนวนขององค์ประกอบในลำดับที่จะกลับมา 0 < n. ฉันไม่สนใจด้วยความแม่นยำจำนวนเต็ม ฉันแค่ต้องการอัลกอริทึม สำหรับภาษาที่ไม่รองรับจำนวนเต็มขนาดใหญ่โดยพลเราจะแสร้งทำ

คุณสามารถค้นหากรณีทดสอบโดยไปที่ลิงก์ไปยัง OEIS ที่ให้ไว้ข้างต้น

UPDATE:

ให้ฉันทำให้ชัดเจนว่าคุณต้องกลับลำดับจำนวนเต็มจากโปรแกรมฟังก์ชั่นหรือการแสดงออกของคุณ ในคำอื่น ๆf(x)ควรคำนวณa(n)ทั้งหมดnตั้งแต่ 1 xถึง ให้x8 ของฟังก์ชั่นของคุณควรกลับมา2, 10, 60, 420, 4290, 53130, 903210, 17687670เป็นอาร์เรย์หรือโครงสร้างข้อมูลที่เหมาะสมอื่น ๆ


ขีด จำกัด / ขอบเขต ??
st0le

ฉันไม่ได้เกี่ยวข้องกับขีด จำกัด และขอบเขตจริงๆ แต่ถ้าสำคัญสำหรับคุณทำอัลกอริทึมที่สมมติว่าอินพุตจะไม่เกิน 8 และเราจะแกล้งทำเพื่อให้ได้ตัวเลขที่สูงขึ้น อย่างที่ฉันบอกว่าฉันสนใจอัลกอริทึมทางคณิตศาสตร์ที่เป็นนามธรรมไม่ใช่รายละเอียดของข้อ จำกัด จำนวนเต็มของภาษาเฉพาะ
Gregory Higley

1
บางทีมันอาจจะเปิดกว้างกว่าเดิมเมื่อเราพูดว่า: output a(1), ... a(n)แทนที่จะส่งคืนสิ่งต่าง ๆ เช่นอาร์เรย์ ...
ผู้ใช้ที่ไม่รู้จัก

คำตอบ:


2

Python 144 ตัวอักษร

R=range
P=[x for x in R(2,99)if all(x%i for i in R(2,x))]
for a in R(input()):
 x=n=0
 while n<=a:n+=sum(x%p==0for p in P)==a+1;x+=1
 print x-1

ใช้เวลาประมาณ 2 นาทีจึงจะเสร็จสิ้นสำหรับ x = 8


2

Java, 170 ตัวอักษรในหนึ่งบรรทัด

int a(int n) {
    int a = 2, t = a, m = 1, i = 1;
    Set s = new HashSet();
    while (i++ > 0) {
        if (t % i == 0) {
            s.add(i);
            t /= i;
            if (t == 1) {
                if (s.size() == n) {
                    if (n == m) {
                        break;
                    }
                    m++;
                }
                t = ++a;
                s.clear();
            }
            i = 1;
        }
    }
    return a;
}

อัปเดต, +77 ตัวอักษร IOL

int[] f(int n) {
    int[] f = new int[n];
    for (int i = 0; i < n; i++) {
        f[i] = a(i+1);
    }
    return f;
}

สิ่งนี้ไม่ถูกต้องจริง แต่ใกล้ แต่ฉันคิดว่าฉันควรจะทำให้คำถามชัดเจนขึ้น คุณควรจะคืนลำดับจำนวนเต็ม ตัวอย่างเช่นถ้าอินพุต 8 คุณควรส่งคืน 8 องค์ประกอบแรกในลำดับ A073329
Gregory Higley

@Gregory ดูที่การอัปเดต
cubanacan

ฉันขอโทษ - ฉันลงคะแนนให้คุณตามความเข้าใจที่คลาดเคลื่อนของงานซึ่งได้อธิบายหลังจากอ่าน OEIS-link แล้ว หากคุณทำการแก้ไขเล็กน้อยของโพสต์ของคุณฉันสามารถและจะเพิกถอน downvote ของฉัน
ผู้ใช้ไม่รู้จัก

@user เนื่องจากความเข้าใจผิดของฉันเกี่ยวกับความคิดเห็นของคุณชี้แจงคำขอของคุณโปรด
cubanacan

ฉันเข้าใจผิดคำถามและคิดว่าปัจจัยทั้งหมดจะต้องเป็นช่วงเวลาที่ชัดเจนดังนั้น 2 * 3 * 5 * 2 จะเป็นคำตอบที่ผิด ดังนั้นฉันจึงโหวตคำตอบของคุณสำหรับ beeing false จากนั้นฉันก็ค้นพบว่า 'ช่วงเวลาที่แตกต่าง' เป็นอย่างไรและต้องการแก้ไขการลงคะแนนของฉัน แต่ฉันไม่ได้รับอนุญาตให้เปลี่ยนการลงคะแนนของฉัน - เป็นไปได้ในไม่กี่นาทีแรกเท่านั้น แต่ถ้าคุณแก้ไขคำตอบของฉันฉันสามารถเปลี่ยนการลงคะแนนของฉัน ดังนั้นฉันขอให้คุณแก้ไขเพียงเล็กน้อย
ผู้ใช้ไม่รู้จัก

2

Java (Ungolfed)

public class M {

    public static void main(String[] a) {
        final int N = 100000000;
        int[] p = new int[N];
        for(int f = 2; f * f < N; f++) {
            if(p[f] == 0)
                for(int k = f; k < N; k += f)
                    p[k]++;
        }
        for(int i = 1; i <= 8; i++) {
            int c = 0, j;
            for(j = 1; j < N && c < i; j++)
                if(p[j] == i)
                    c++;
            if(c == i)
                System.out.println(i + " = " + --j);
        }
    }
}

ใช้อัลกอริทึมตะแกรง มันค่อนข้างเร็ว (6 วินาที) จะทำงานได้อย่างถูกต้องนาน8ถึงอาจจะล้มเหลวสำหรับสิ่งที่สูงกว่า


1

JavaScript, 149 ตัวอักษร

function(n){function f(x){for(r=[],o=x,z=2;z<=o;x%z?++z:(x/=z,r.indexOf(z)+1?0:r.push(z)));return r}for(c=0,i=1;c<n;)f(++i).length==n?c++:0;return i}

รู้สึกไม่ตอบสนองสำหรับ n> = 6 ดังนั้นฉันจึงไม่ได้ทดสอบว่าต้องใช้เวลานานเท่าใด (เบราว์เซอร์ของฉันปรากฏการแจ้งเตือนสคริปต์ที่หยุดทำงานทุก 10 วินาทีหรือมากกว่านั้นดังนั้นฉันจึงไม่สามารถกำหนดเวลาได้อย่างถูกต้อง ทำเครื่องหมายที่ "ไม่ต้องแสดงอีก" ")

แก้ไข: ในการส่งคืนอาเรย์คือ200 ตัวอักษร (+51) :

function(n){function F(){function f(x){for(r=[],o=x,z=2;z<=o;x%z?++z:(x/=z,r.indexOf(z)+1?0:r.push(z)));return r}for(c=0,i=1;c<n;)F(++i).length==n?c++:0;return i}for(a=[];n>0;n--)a.push(f());return a}

0

J, 32 ไบต์

({"0 1~i.@#)(]/.~#@~.@q:)

แต่เนื่องจากฉันตอบคำถามตัวเองช้ามากเราจะปล่อยให้คำตอบนี้เป็นความอยากรู้อยากเห็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.