พิมพ์หมายเลขเฉพาะ 128 หมายเลขแรกโดยไม่ใช้คำที่สงวนไว้


13

วิธีแก้ปัญหาที่ชัดเจนคือเพียงพิมพ์มันเป็นสตริง แต่เป็นไปได้ไหมที่จะเขียนรหัสที่สั้นลง?

ที่ต้องการ:

  1. ไม่ควรดำเนินการอินพุตใด ๆ และเอาต์พุตควรอยู่ในรูปแบบของ2 3 5 7 11 13 ...ฯลฯ
  2. ไม่มีการใช้คำสงวนในภาษาเลย
  3. ภาษาอย่างน้อยควรอนุญาตให้เขียนโปรแกรมที่มีโครงสร้างและมีคำที่สงวนไว้ (มิฉะนั้นจุดที่ 2 จะเป็นที่สงสัย)

ก่อนอื่นฉันนึกถึง C / C ++ เป็นพิเศษ แต่ขยายคำถามขณะที่ยังพยายามป้องกันการโกง


1
น่าเสียดายสำหรับฉัน Tcl ไม่มีคำสงวน
Johannes Kuhn

คำตอบ:


14

C, 60 ตัวอักษร

ข้อ จำกัด "ไม่มีคำหลัก" ไม่สำคัญที่นี่ ฉันค่อนข้างมั่นใจว่าถ้าเป็นไปได้การปรับปรุงจะไม่สามารถทำได้โดยการเพิ่มคำหลัก

n=2;main(m){n<720&&main(m<2?printf("%d ",n),n:n%m?m-1:n++);}

รุ่นอื่น:
ผลลัพธ์ไม่ดี แต่ฉันชอบการprintfละเมิด

n=2;main(m){n<720&&main(m<2?printf("%*d",n,n):n%m?m-1:n++);}

เคล็ดลับในการแก้ปัญหาทั้งสองคือการรวมสองลูป (ดำเนินการโดยการเรียกซ้ำ) เป็นหนึ่ง
nเป็นไพร์มmที่มีศักยภาพถัดไปตัวหารที่มีศักยภาพต่อไป
ในแต่ละโทร recursive เราอย่างใดอย่างหนึ่งที่เพิ่มขึ้นn(ในขณะที่การตั้งค่าmให้เป็นค่าเดิม) mหรือลดลง


7

Python 108 ตัวอักษร

Python ไม่ได้ถูกสร้างขึ้นสำหรับความท้าทายนี้ ต้องการที่จะprint? สงวนไว้ แล้วเราใช้กันยังstdoutไงดี? มันจะมีค่าใช้จ่ายimport... คุณคาดเดาไว้สงวนไว้ ดี ... ฉันอยู่บนระบบยูนิกซ์ดังนั้นฉันจึงสามารถเปิดไฟล์ descriptor 1 ซึ่งเป็น stdout ได้ สับ!

มนุษย์และซ้ำ? ไม่มีอะไรevalนอกจาก ไม่มีห่วงแน่นอน แต่เราไม่สามารถแม้แต่จะกำหนดฟังก์ชั่นที่มีหรือdef lambdaและเพื่อเพิ่มการดูถูกการบาดเจ็บเราไม่สามารถแม้แต่ใช้ความเข้าใจในรายการ! ฉันมักจะมองหาข้ออ้างที่จะใช้สิ่งต่าง ๆ เช่นmap(p.__mod__,...)ใน code golf ... ความเข้าใจจะดีขึ้นเสมอ จนถึงตอนนี้ก็คือ

p=1
eval(compile("p+=1;open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p))));"*720,'','exec'))

ตอนนี้คุณอาจบ่นว่าexecเป็นคำหลักแม้ว่าฉันไม่ได้ใช้คำหลัก (ฉันไม่ได้evalเป็นแม้แต่exec) ดีที่นี่เป็นทางออกที่ 117 'exec'ตัวอักษรที่ไม่ได้ใช้

p=2
s="eval('('+s*(p<720)+')',open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p)))),{'p':p+1})";eval(s)

1
พิมพ์ไม่ได้สงวนไว้ใน Python3 :) คุณสามารถใช้งาน__import__ได้ แต่นั่นจะเป็นราคาตัวอักษร
gnibbler

6

JavaScript (80 ตัวอักษร)

eval((s=Array(719)).join("s[j=++n]?j:"+s.join("s[j+=n]=")+"r+=n+' ';"),r="",n=1)

ทำงานในคอนโซลของเว็บเบราว์เซอร์ของคุณ

ใช้ตะแกรงที่สำคัญซึ่งกลายเป็นข้นมาก


4

C, 183 ตัวอักษร

#define q j*j<k?i%p[j++]||(i++,j=0):printf("%d\n",p[j=0,k++]=i++)
#define A q;q;q;q;q;q;q;q
#define B A;A;A;A;A;A;A;A
#define C B;B;B;B;B;B;B
main(){int i=2,j=0,k=0,p[999];C;C;C;C;C;}

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


4

C, 87 ตัวอักษร

d;p(n){--d<2||n%d&&p(n);}r(n){p(d=n);d<2&&printf("%d\n",n);++n<720&&r(n);}main(){r(2);}

(ฉันพยายามเขียนในรูปแบบที่ใช้งานได้มากกว่า แต่ฉันไม่สามารถใช้returnแผนนั้นแบบฆ่าได้)


3

C, 134 ตัวอักษร

ต่อไปนี้เป็นโซลูชันสำรองที่พยายามหลีกเลี่ยงการใช้คำให้มากที่สุดจองหรืออย่างอื่น:

main(i){i<9?main(2953216):i>4097?--i&4094?i/4096%(i%4096)?main(i):
main((i/4096-1)*4097):printf("%d\n",i>>12,main((i/4096-1)*4097)):0;}

ทั้งหมดที่ใช้คือprintfและmainมีอาร์กิวเมนต์เดียว


3

Mathematica 50 ตัวอักษร

ฉันไม่แน่ใจว่าจะตีความ "คำที่สงวนไว้" สำหรับMathematica ได้อย่างไรแต่ฉันต้องการเล่นดังนั้นฉันจะเอาไปหมายถึงการทำโดยไม่มีฟังก์ชั่นในตัวเพื่อสร้าง primes หรือทดสอบ primality

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]

2

Haskell, 72 ตัวอักษร

main=putStrLn.unwords$take 128[show p|p<-[2..],all((>0).mod p)[2..p-1]]

เป็นที่ยอมรับว่าการหลีกเลี่ยงคำหลักนั้นไม่ยากเกินไปใน Haskell


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