การค้นหาหมายเลขเฉพาะโดยไม่ใช้ "ตัวอักษรหลัก"


21

งานของคุณถ้าคุณเลือกที่จะยอมรับมันคือการเขียนโปรแกรม / ฟังก์ชั่นที่รับจำนวนเต็มNเป็นอินพุต โปรแกรม / ฟังก์ชั่นควรเอาท์พุท / ส่งคืนรายการหมายเลขนายกรัฐมนตรีN ตัวแรก แต่นี่คือสิ่งที่จับได้: คุณไม่ได้รับอนุญาตให้ใช้ตัวละครหลักในรหัสของคุณ ตัวละครหลักเป็นตัวละครที่มีจุดรหัส Unicode เป็นจำนวนเฉพาะ ในช่วง ASCII ที่พิมพ์ได้สิ่งเหล่านี้คือ:

%)+/5;=CGIOSYaegkmq

แต่กฎยังใช้กับอักขระที่ไม่ใช่ ASCII หากรหัสของคุณใช้

  • อินพุตที่ถูกต้องคือจำนวนเต็มNโดยที่0 <N <= Tซึ่งคุณสามารถเลือกTได้ แต่ต้องมากกว่าหรือเท่ากับ 10,000 Tไม่จำเป็นต้อง จำกัด
  • สำหรับอินพุตที่ไม่ถูกต้อง (ไม่ใช่จำนวนเต็มจำนวนเต็มอยู่นอกช่วง) ให้โยนข้อยกเว้นหรือเอาท์พุท / ส่งคืนอะไร / null
  • จำนวนเต็มที่มีช่องว่างนำหน้า / ต่อท้ายเนื่องจากอินพุตถือว่าไม่ถูกต้อง
  • จำนวนเต็มที่มี+อักขระเครื่องหมายเป็นอินพุตถือว่าไม่ถูกต้อง
  • จำนวนเต็มที่มีศูนย์นำหน้าเป็นอินพุตถือว่าถูกต้อง
  • หากภาษาของคุณอนุญาตให้คุณส่งจำนวนเต็มแยกแล้วเป็นอินพุตกฎการแยกวิเคราะห์ข้างต้น (ยกเว้นช่วงที่หนึ่ง) ไม่ได้ใช้เพราะ int จะถูกแยกวิเคราะห์แล้ว
  • อินพุตเป็นฐาน -10 เสมอ
  • ไม่อนุญาตให้ใช้เครื่องกำเนิดไฟฟ้าเฉพาะตัวและเครื่องทดสอบรุ่นแรก (รวมถึงฟังก์ชั่นการแยกตัวประกอบเฉพาะ)
  • การ จำกัด แหล่งที่มาถูกกำหนดไว้สำหรับอักขระ Unicode แต่การนับจำนวนไบต์สำหรับคะแนนนั้นอาจเป็นการเข้ารหัสแบบอื่นหากคุณต้องการ
  • เอาต์พุตสามารถมีการขึ้นบรรทัดใหม่ที่ต่อท้ายเดี่ยว แต่ไม่จำเป็น
  • หากคุณส่งออก / ส่งคืนรายการหมายเลขเฉพาะเป็นสตริงจำนวนเฉพาะทุกตัวต้องถูกคั่นด้วยอักขระที่ไม่ใช่ตัวเลขหนึ่งหลักหรือหลายตัว คุณสามารถเลือกตัวคั่นที่คุณใช้
  • นี่คือความท้าทายของรหัสที่สั้นที่สุดเป็นไบต์ชนะ

กองย่อยเพื่อยืนยันรหัสของคุณ

คุณสามารถใช้กองย่อยด้านล่างเพื่อตรวจสอบว่ารหัสของคุณไม่มีตัวอักษรหลัก:

var primes=[],max=10000;for(var i=2;i<=max;i++){primes.push(i);}for(var N=2;N<Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i<inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc>max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&&success){setText(resultSpan, "Valid code!");}else if(success) {  var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join(""));    }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:<br /><textarea id="codeTxt" rows="5" cols="70"></textarea><br /><button id="verifyBtn">Verify</button><br /><span id="result"></span>


10
มันสวยโหดร้ายที่;เกิดขึ้นจะห้าม ...
ɐɔıʇǝɥʇuʎs

หากไม่ได้รับอนุญาตให้ทำการทดสอบแบบดั้งเดิมฟังก์ชันเกี่ยวกับการแยกตัวประกอบเฉพาะ
Maltysen

@Maltysen จากฟังก์ชั่นการแยกตัวประกอบเฉพาะคุณสามารถเห็นได้อย่างรวดเร็วว่าตัวเลขนั้นเป็นจำนวนเฉพาะหรือไม่ดังนั้นฉันจึงกลัวว่าจะไม่ได้รับอนุญาต ฉันจะอธิบายอย่างนั้น
ProgramFOX

เราได้รับคำสั่งให้ทิ้งอินพุตที่ไม่ถูกต้องเหล่านี้หรือไม่? ตัวอย่างเช่นหากฟังก์ชั่น string-> int ของภาษาของเราอนุญาตให้มีการนำ+หน้าดูเหมือนจะน่าผิดหวังที่จะต้องทิ้งสิ่งเหล่านี้ด้วยตนเอง
Runer112

11
ฉันตื่นเต้นกับเรื่องนี้มากและเริ่มแก้ปัญหาจากนั้นการตระหนักถึงความสำคัญของการปิดคำสั่งจึงไม่ได้รับอนุญาต ฉันออกไปแล้ว
Alex A.

คำตอบ:


10

CJam, 19 18 30 34 33 19 17 21 20 ไบต์

ลองออนไลน์

{_3\#,2>__ff*:~-<N*}

นี่อาจเป็นหนึ่งในอัลกอริทึมที่ไม่มีประสิทธิภาพอย่างน่ากลัวที่สุดเท่าที่ฉันเคยใช้ แต่ฉันทำเพื่อขนาด!

คำตอบของฉันประกอบด้วยรหัสบล็อกซึ่งทำหน้าที่เหมือนฟังก์ชันที่ไม่ระบุชื่อใน CJam รันด้วยจำนวนเต็มที่นำหน้าทันทีบนสแต็กและรายการผลลัพธ์จะถูกดัมพ์ลงบนสแต็ก ฉันปฏิบัติขอบเขตบนของอินพุตเป็นอนันต์ดังนั้นฉันไม่ต้องตรวจสอบขอบเขตนั้น

อัลกอริทึมของฉันเริ่มต้นด้วยการเพิ่มinputกำลังไฟที่ 3 ซึ่งรับประกันได้ว่าจะให้จำนวนที่มากกว่าinputนายก -th ถ้าอินพุตถูกต้อง จากนั้นรายการของจำนวนเต็มจาก 2 ถึงจำนวนนี้ลบหนึ่งจะถูกสร้างขึ้นซึ่งเป็นแนวที่มีขนาดใหญ่พอที่จะมีจำนวนเฉพาะทั้งหมดที่เราต้องการ เพื่อกำจัดหมายเลขคอมโพสิต ... ถอนหายใจ ... เราสร้างรายการผลิตภัณฑ์ทุกคู่ที่ควรสร้างหมายเลขคอมโพสิตทั้งหมดจาก 4 ถึงค่าที่ยิ่งใหญ่อย่างโง่เง่ามากพอสำหรับจุดประสงค์ของเรา จากนั้นเป็นเรื่องของการลบทุกองค์ประกอบออกจากรายการต้นฉบับที่อยู่ในรายการคอมโพสิตนี้ตัดมันให้เป็นinputองค์ประกอบแรกและเข้าร่วมองค์ประกอบด้วยอักขระขึ้นบรรทัดใหม่

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


3
heh, ที่ 17 คุณมีจำนวนไบต์ที่สำคัญในคำตอบของคุณ
Corey Ogburn

ทำไมคุณต้องการS*?
jimmy23013

@ user23013 อินพุตไม่ถูกต้องน้อยกว่า 1 ยังคงฟีดผ่านอัลกอริทึมพวกเขาเพิ่งสร้างรายการที่ว่างเปล่า แต่นั่นไม่ใช่เอาท์พุททางกฎหมายสำหรับพวกเขาดังนั้นฉันจึงเข้าร่วมองค์ประกอบรายการพร้อมช่องว่างเพื่อสร้างเอาต์พุตว่างสำหรับอินพุตที่ไม่ถูกต้องเหล่านี้
Runer112

1
ฉันสังเกตุสิ่งนี้ไม่ใช่Sตัวละครเอก?
Zacharý

มันเป็นตัวละครเอก ฉันรู้ว่าฉันเกิน 2 ปีในการพูดคำนี้ แต่คำตอบนี้ควรจะไม่ถูกต้อง
Zacharý

8

ชวา 474 ไบต์

i\u006dport j\u0061v\u0061.util.*\u003bvoid b(int b\u0029{Lon\u0067 c\u003d2L,d,f[]\u003d{}\u003bfor(f\u003dArr\u0061ys.copy\u004ff(f,b\u0029,Arr\u0061ys.fill(f,0L\u0029\u003bb-->0\u003b\u0029for(d\u003d0L\u003bf[b]<1\u003bf[b]\u003dd<1?c:f[b],d\u003d0L,c\u002b\u002b\u0029for(lon\u0067 h:f\u0029d\u003dh>0&&c\u002fh*h\u003d\u003dc?1:d\u003bj\u0061v\u0061x.x\u006dl.bind.JAXB.un\u006d\u0061rsh\u0061l(""\u002bArr\u0061ys.\u0061sList(f\u0029,Lon\u0067.cl\u0061ss\u0029\u003b}

รับอินพุตผ่านอาร์กิวเมนต์ของฟังก์ชันเอาต์พุตผ่านข้อยกเว้นการส่งออก

เยื้อง:

i\u006dport j\u0061v\u0061.util.*\u003b
void b(int b\u0029{
    Lon\u0067 c\u003d2L,d,f[]\u003d{}\u003b
    for(f\u003dArr\u0061ys.copy\u004ff(f,b\u0029,Arr\u0061ys.fill(f,0L\u0029\u003bb-->0\u003b\u0029
        for(d\u003d0L\u003bf[b]<1\u003bf[b]\u003dd<1?c:f[b],d\u003d0L,c\u002b\u002b\u0029
            for(lon\u0067 h:f\u0029
                d\u003dh>0&&c\u002fh*h\u003d\u003dc?1:d\u003b
    j\u0061v\u0061x.x\u006dl.bind.JAXB.un\u006d\u0061rsh\u0061l(""\u002bArr\u0061ys.\u0061sList(f\u0029,Lon\u0067.cl\u0061ss\u0029\u003b
}

ลบอักขระที่หนีออกไป:

import java.util.*;
void b(int b){
    Long c=2L,d,f[]={};
    for(f=Arrays.copyOf(f,b),Arrays.fill(f,0L);b-->0;)
        for(d=0L;f[b]<1;f[b]=d<1?c:0,d=0L,c++)
            for(long h:f)
                d=h>0&&c/h*h==c?1:d;
    javax.xml.bind.JAXB.unmarshal(""+Arrays.asList(f),Long.class);
}

คำอธิบาย:

Long c,d,f[]={};                                                //Initialize variables.

for(f=java.util.Arrays.copyOf(f,b),Arrays.fill(f,0L);b-->0;)
    f=java.util.Arrays.copyOf(f,b),Arrays.fill(f,0L)            //Initialize f to an array of 0's.
                                                     b-->0      //Iterate over the first b primes.

for(d=0L;f[b]<1;f[b]=d<1?c:0,d=0L,c++)
    d=0L                        d=0L                            //Initialize d to 0.
         f[b]<1                      c++                        //Increment c while the b'th prime is 0.
                f[b]=d<1?c:0                                    //If d = 0, the b'th prime = c, else continue.

for(long h:f)                                                   //Iterate over all found primes.

d=h>0&&c/h*h==c?1:d;
  h>0                                                           //Ignore non-found primes.
       c/h*h==c                                                 //Equivalent to c%h==0
               ?1:d                                             //If h is prime and c is divisible by h, d = 1. Otherwise d stays unchanged.

javax.xml.bind.JAXB.unmarshal(""+Arrays.asList(f),Long.class)   //Print solution to stderr
javax.xml.bind.JAXB.unmarshal(                   ,Long.class)   //Prints what's contained to stderr.
                                 Arrays.asList(f)               //Convert f to list.
                              ""+                               //Convert to string.

โซลูชันดั้งเดิมของฉันใช้returnคำสั่ง หลังจากถามคำถามนี้ใน StackOverflow แล้วregettmanก็ใจดีพอที่จะให้วิธีการแสดงผล / ส่งคืนโดยไม่ต้องใช้ตัวอักษรพิเศษ

ตามปกติข้อเสนอแนะยินดีต้อนรับ :)


3
+1 นั่นเป็นเรื่องยากสำหรับคุณและคนอื่น ๆ ที่จะคิดออก ที่น่าประทับใจมาก. :)
TNT

5

ทับทิม, 74

->n,*o{o<<[2..n*n][0].find{|x|!o.find{|y|1.>x.^y.*x.div y}}until o[n-1]
o}

คำอธิบาย:

*oเริ่มต้นอาร์เรย์ผลลัพธ์ว่างเปล่า จนกว่าจะมีnรายการที่เราจะพบจำนวนที่เล็กที่สุด> = 2 ที่ไม่ได้แบ่งรายการใด ๆ ในขณะนี้แล้วเพิ่มเข้าไปo oเพื่อทดสอบการหาร ผู้ประกอบการที่ดีทั้งหมดไม่ได้รับอนุญาตและฉันไม่สามารถใช้งานdivmodได้ ดีที่สุดที่ฉันจะได้เห็นคือใช้x.div yซึ่งใช้ x หารด้วย y และปัดเศษลงแล้วคูณด้วย y อีกครั้ง หากมันเท่ากับ x ไม่มีการปัดเศษดังนั้น y จึงหาร x 1.>x.^เป็นการทดสอบความเท่าเทียมกันตรวจสอบว่าผลลัพธ์ของ xor เป็น 0 หรือไม่.ก่อนหน้าผู้ให้บริการทุกรายเป็นเพราะคุณไม่สามารถผสม.การโทรของผู้ให้บริการฟรีและการโทรวิธีการที่ไม่ต้องใช้วงเล็บ

แก้ไข: ข้อกำหนดการตรวจสอบช่วงถูกเพิ่มหลังจากฉันโพสต์นี้ฉันคิดว่า ในการปฏิบัติตามนั้นต้องใช้อักขระ 79 ตัว:

->n,*o{o<<[*2..-~n*n].find{|x|!o.find{|y|1.>x.^y.*x.div y}}until o[n-1]||n<1
o}

4

CJam, 38 37 30 ไบต์

{_~2#,2>\{(\{1$37c~},\p}*'<(~}

ลองที่นี่

ฉันคิดว่าสิ่งนี้ควรเป็นไปตามกฎทั้งหมดและใช้ได้กับN ที่ไม่เป็นลบใด ๆ(เช่นTไม่มีที่สิ้นสุด) แม้ว่ามันจะไม่มีประสิทธิภาพอย่างน่ากลัวดังนั้นอย่าลองใช้กับคนจำนวนมาก

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

ส่วนใหญ่ของรหัสคือการตรวจสอบการป้อนข้อมูลตามด้วยตะแกรงของ Eratosthenes ฉันต้องการแก้ไขข้อ จำกัด การป้อนข้อมูลใน 3 แห่งเท่านั้น:

  • )เป็นการเพิ่มขึ้นของ CJam ฉันต้องการสิ่งนั้นครั้งเดียว แต่สามารถแทนที่ด้วย~(ส่วนประกอบ bitwise) เพราะฉันกำลังสองตัวเลขในภายหลัง
  • %คือโมดูโล่ ฉันกำลังใช้37c~แทนซึ่งสร้างตัวละครขึ้น%มาก่อนแล้วค่อยทำสิ่งนั้น ทำให้รหัสช้าลงมาก
  • ;ปรากฏและทิ้งองค์ประกอบจากสแต็ก ฉันต้องทำสิ่งนี้ในตอนท้าย แต่ฉันใช้'<(~ซึ่งผลักดันตัวละคร<ให้ลดมันและทำให้เป็นเช่นนั้น

ฉันคิดว่าเนื่องจากกฎการแยกวิเคราะห์อินพุตทั้งหมดเราไม่ได้รับอนุญาตให้ใช้จำนวนเต็มแยกแล้ว
Runer112

@ Runer112 เราได้รับอนุญาตให้เขียน "ฟังก์ชั่นที่รับจำนวนเต็ม" ไม่ใช่ "ฟังก์ชั่นที่ยอมรับการแทนค่าสตริงของจำนวนเต็ม"
Martin Ender

3

Bash + coreutils, 227 ไบต์

printf -vb br`dc<<<Di14B8209P`
printf -vc -- $[$1-0]
[ "${1#$c}" -o $c -lt 1 ]||{
for i in {2..104729}
{
for f in `jot $[i-1] $[i-1] 1`
{
[ 0 -lt `dc<<<"$i $f~p"` ]||$b
}
[ $f -lt 2 ]&&printf $i\ &&: $[c--]
[ $c -lt 1 ]&&$b
}
}

มันค่อนข้างยุ่งยาก บางสิ่งที่ฉันพบ:

  • ลูปส่วนใหญ่ ( whileและuntil) ใช้ไม่ได้เพราะใกล้เคียงที่สุดdoneซึ่งเป็นคำหลักของเชลล์และไม่สามารถเป็นผลลัพธ์ของการขยายตัวของตัวแปร (ยกเว้นว่าevalจะใช้ แต่เป็นสิ่งที่ออกมามากเกินไป) ห่วงเพียง แต่สามารถใช้งานได้เป็นfor/ inซึ่งจะช่วยให้{/ }แทน/ do ยังไม่สามารถใช้งานได้donefor (( ; ; ))
  • =ออกดังนั้นเราต้องการวิธีอื่นในการกำหนดตัวแปร printf -vดีสำหรับสิ่งนี้
  • เรารู้ว่า p (10,000) คือ 1,04729 ดังนั้นสำหรับวงรอบนอกสำหรับช่วงเวลาที่เป็นไปได้เราสามารถวนรอบจาก 2 ถึง 104729 และแตกเมื่อเรามีจำนวนเฉพาะเพียงพอ
  • jotสร้างรายการของปัจจัยที่อาจเกิดขึ้นในวงด้านใน หากปัจจัยที่มีศักยภาพแบ่งนายกที่มีศักยภาพแล้วมันไม่ได้เป็นนายกและเราแบ่งออกก่อน
  • โชคดีที่breakมีเชลล์ในตัวและไม่ใช่คำหลักดังนั้นอาจถูกสร้างขึ้นเนื่องจากการขยายตัว dcแปลงจำนวนฐาน 13 ถึง eakbytestream
  • ในการตรวจสอบว่าปัจจัยที่เป็นไปได้นั้นจะแบ่งไพรม์ที่เป็นไปได้นั้นเราไม่สามารถใช้ตัวดำเนินการทางคณิตศาสตร์แบบปกติ/หรือแบบ%เชลล์ ดังนั้นนี่คือแหล่งภายนอกเพื่อdcs ~ผู้ประกอบการซึ่งผลักดันความฉลาดและส่วนที่เหลือจะสแต็ค
  • -lt - less-than - เป็นตัวดำเนินการเปรียบเทียบเชลล์ที่ใช้งานได้เท่านั้น
  • echoไม่ได้ใช้สำหรับการส่งออก printfทำงานได้ตราบใดที่เราหลีกเลี่ยง%

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

เอาท์พุท:

$ ./primenoprime.sh 10
2 3 5 7 11 13 17 19 23 29 $ 

3

Haskell, 90 ไบต์

\n->[fst c|c<-zip[p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]][1..n]]

นี่คือฟังก์ชั่นไม่ระบุชื่อซึ่งใช้จำนวนเต็มnเป็นอินพุต

มันทำงานอย่างไร: [p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]](ตัวอย่างแรกของหมายเลขหนึ่ง liners อันดับหนึ่งที่Haskell wikiแต่มีการelemแทนที่ฟังก์ชัน) สร้างรายการ primes ที่ไม่มีที่สิ้นสุด zipมันมีตัวเลขตั้งแต่1ถึงnเพื่อสร้างรายการของ(prime, seq. number)คู่ ลบ seq หมายเลขอีกครั้ง ผลลัพธ์คือรายการช่วงเวลาที่nกำหนด


1

สนิม 64897 ไบต์

|n|println!{"{:?}",&[2,3,6-1,7,11,13,17,19,23,29,31,37,41,43,47,60-7,0x3b,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,0x97,0x9d,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,0xfb,0x101 ...}

(โค้ดตัดออกเนื่องจากขีด จำกัด อักขระ จำกัดวิธีการแก้ไขทั้งหมดที่นี่ )

คุณสมบัติสนิมต่อไปนี้ใช้งานไม่ได้เนื่องจากข้อ จำกัด ที่สำคัญ:

  • ฟังก์ชั่นการโทรตามที่พวกเขาต้องการ ')'
  • การผูกปกติเนื่องจากพวกเขาต้องการให้ (e)
  • นิยามแมโครพวกเขาต้องการกฎแมโคร! (A, E, M)
  • คำชี้แจงการแข่งขันพวกเขาต้องการการแข่งขัน (a, m) และ => (=)
  • ความไม่แน่นอนเนื่องจากมีการใช้คำหลัก mut (m) เสมอ
  • return (e), break (a, e), ดำเนินการต่อ (e)
  • อื่น ๆ (e)

สิ่งที่คุณสามารถใช้ในทางเทคนิค:

  • ถ้า. แต่ถ้าไม่มีอย่างอื่นพวกเขาไร้ประโยชน์ในบริบทของการแสดงออกดังนั้นจึงเหมาะสำหรับผลข้างเคียง
  • แมโคร มาโครมาตรฐานเช่นพิมพ์! มักจะตามด้วย () แต่จริงๆแล้วมันถูกกฎหมายที่จะใช้ {} หรือ [] แทน หากปราศจากสิ่งนี้งานจะเป็นไปไม่ได้
  • การปิดในแง่ที่แคบที่สุด คุณไม่สามารถเรียกพวกเขา (ต้องการ ()) หรือผูกพวกเขา (ต้องการให้) แต่คุณสามารถกำหนดหนึ่งที่ไม่ใช่แบบเรียกซ้ำ หากปราศจากสิ่งนี้งานจะกลายเป็นไปไม่ได้อย่างเห็นได้ชัด
  • structs
  • สำหรับลูป สิ่งเหล่านี้มีแนวโน้มเนื่องจากจริง ๆ แล้วพวกเขาอนุญาตให้มีการผูกตัวแปรและพวกเขาใช้ตัววนซ้ำซึ่งยังสามารถกำหนดด้วยไวยากรณ์ช่วง ตัววนซ้ำสามารถเป็นนิพจน์ได้
  • ผู้ประกอบการ Builtin ยกเว้น +,% และ / ตัวดำเนินการเชิงตรรกะที่ลัดวงจรดูมีแนวโน้ม

ฉันไม่สามารถทำสิ่งทัวริงได้อย่างสมบูรณ์ด้วยเครื่องมือเหล่านี้ ฉันขอโทษ. สิ่งที่เหลือก็คือการรวม 10,000 ครั้งแรกเต็มจำนวน 5 ครั้ง อย่างน้อยคุณก็สามารถหั่นมันและมีทางออกที่ถูกต้องในความหมายที่แคบที่สุดเท่าที่จะเป็นไปได้

ฉันอยากให้ผู้เชี่ยวชาญในการดำน้ำของ Turing tarpit (หรือบนสนิม!) เพื่อบอกฉันว่าฉันสามารถทำอะไรได้ดีกว่านี้!


1

GNU APL, 75 68 67 65 59 56 55 ตัวอักษร

⎕IO1จะต้องเป็น

∇z←p n
z←2,j←3
j←j--2
→2×⍳∨⌿1>z|j
z←z,j
→2×⍳n>⍴z
z←n↑z∇

ฉันกลับมาอีกครั้งในเดือนนี้หลังจากทราบว่ามีพื้นที่เพิ่มเติม!


นี่คือการเข้ารหัส APL หรือ UTF-8 หรือไม่ ถ้าคุณแปลงเป็นการเข้ารหัส APL (และใช้ได้) มันจะสั้นลงเป็นไบต์
NoOne อยู่ที่นี่

UTF-8 ใช่ แต่เมื่อถึงตัวละครที่มีคะแนนต่ำจะมีจำนวนมากขึ้น
Zacharý

แน่นอนว่าตอนนี้นับเป็นไบต์ใน APL แต่ข้อ จำกัด ของแหล่งที่มาคือ Unicode (ฉันตระหนักถึงความท้าทายที่อนุญาตให้ใช้จำนวนไบต์ที่ไม่ใช่ Unicode)
Zacharý

0

Pyth - 12 ไบต์

ใช้ฟังก์ชันการแยกตัวประกอบเฉพาะของ pyth เพื่อดูว่า # เป็นจำนวนเฉพาะหรือไม่ !tPTเคล็ดลับการใช้งานแนะนำให้ฉันที่คำตอบของฉันสำหรับ primes ภายใต้ปัญหาล้าน

<f!tPTr2^T6Q

เนื่องจากตัวกรองใช้งานได้เฉพาะช่วง pr ใต้และไม่ใช่อันดับแรกฉันจึงค้นหาค่าผกผันของ pi (x) สำหรับ 10,000 และได้ 104,000 ดังนั้นฉันจึงใช้เฉพาะช่วงอายุต่ำกว่า10⁶และรับ n ก่อน สิ่งนี้ไม่ได้ทำงานจริงดังนั้นคุณควรทดสอบโดยแทนที่^T6ด้วย^T3และ จำกัด n เป็นต่ำกว่า 1,000 อินพุตจาก stdin และเอาต์พุตไปที่ stdout

<          Q     Slice first n
f     r2^T6      filter on range 2->10⁶
 !               Logical not (gives true if tail is empty)
  t              Tail (all but first, so gives empty if prime fact is len 1)
   PT            Prime factorization of filter var (len 1 if num is prime)

5
จากกฎ: "ไม่อนุญาตให้ใช้เครื่องกำเนิดไฟฟ้าเฉพาะนายกและเครื่องทดสอบรุ่นแรก"
Runer112

@ Runer112 ใช่ แต่นี่ไม่ใช่ผู้ทดสอบขั้นต้นเป็นตัวประกอบที่สำคัญอยู่ในขอบเขตของกฎ ฉันควรถามว่าได้รับอนุญาต
Maltysen

@Maltysen "การใช้งานในตัวเครื่องกำเนิดไฟฟ้าที่สำคัญและทดสอบ primality (ซึ่งรวมถึงฟังก์ชั่นที่สำคัญตีนเป็ด) ไม่ได้รับอนุญาต" - ดูเหมือนว่าสวยใสกับผม
Digital Trauma

4
@DigitalTrauma ชี้แจง "(ซึ่งรวมถึงฟังก์ชั่นการแยกตัวประกอบเฉพาะ)" ถูกเพิ่มหลังจากคำตอบนี้ถูกโพสต์
Martin Ender

MartinBüttner True ฉันเดาว่ามันขึ้นอยู่กับดุลยพินิจของ @ ProgramFOX
Digital Trauma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.