รหัสที่สั้นที่สุดเพื่อย่ออย่างถูกต้องตามกฎหมาย


146

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

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

ข้อมูลจำเพาะ

  • คุณต้องใช้ภาษาที่มีคอมไพเลอร์อย่างชัดเจน
  • ระบุการนำไปปฏิบัติที่ใช้ในแต่ละโซลูชัน
  • นี่คือดังนั้นวิธีแก้ปัญหาที่สั้นที่สุดที่ถูกต้อง (เป็นไบต์) ชนะ
  • คอมไพเลอร์สามารถยุติจากหน่วยความจำไม่เพียงพอหรือพื้นที่สแต็ก

1
@obarakon ฉันไม่เห็นด้วย โค้ดจากการท้าทายอื่น ๆ ไม่สามารถโอนไปยังการท้าทายนี้ได้อย่างง่ายดาย ความท้าทายในขณะที่ทั้งสองเกี่ยวข้องกับการวนซ้ำไม่สิ้นสุดจะแตกต่างกันโดยพื้นฐาน
Sriotchilism O'Zaic

1
@obarakon ไม่ใช่คู่หูของคำถามนี้เหมือนกันเพราะไม่ใช่ code-golf
ผลไม้แยกกัน


1
ฉันไม่แน่ใจว่ามันเหมาะกับความท้าทายนี้ (และแม้ว่ามันจะทำคะแนนได้ดีมาก) แต่สำหรับผู้ที่สนใจนี่คือวิธีที่ฉันจะทำในJava: กำหนดโปรเซสเซอร์คำอธิบายประกอบ (ตัวอย่างโค้ด ideone) ซึ่งคุณจะใช้เมื่อเรียกใช้javacด้วย-processorตัวเลือก มันทำให้การรวบรวมของชั้นเรียนใด ๆ ตลอดไป
แอรอน

6
สำหรับคำตอบที่ทำให้คอมไพเลอร์หยุดทำงาน: สำหรับจุดประสงค์ของการหย่อนผมคิดว่าคุณยังต้องการให้มันใช้เวลานานเท่าที่จะทำได้
GuitarPicker

คำตอบ:


16

Japtap , 2 ไบต์

`ÿ

คุณสามารถทดสอบออนไลน์ได้ที่นี่แต่ฉันจะไม่แนะนำเพราะมันจะทำให้เบราว์เซอร์ของคุณค้าง

คำอธิบาย

Japt ใช้ไลบรารี shocoสำหรับการบีบอัดสตริง backtick บอกคอมไพเลอร์ให้ขยายทุกอย่างจนกว่า backtick ถัดไปหรือจุดสิ้นสุดของไฟล์ แต่ละไบต์ทำสิ่งต่อไปนี้:

  • 00-7F เหลืออยู่เหมือนเดิม
  • 80-BFแต่ละแปลงร่างเป็นตัวพิมพ์เล็กทั่วไปคู่ตัวอักษรสองตัว ( at, oo, thฯลฯ )
  • C0-DFแต่ละกินไบต์ถัดไปและแปลงเป็นสตริงสี่ตัวอักษรทั่วไป
  • E0-EFแต่ละบริโภคสามไบต์ถัดไปและเปลี่ยนเป็นสตริงแปดตัวอักษร "ทั่วไป" (เริ่มต้นที่Wherererและลงเขาจากที่นั่น)
  • F0-F7 ทำลายตัวขยายการบีบอัดถึงแม้ว่ามันจะยังคงส่งกลับทุกอย่างขึ้นไปถึงไบต์ที่ทำลาย
  • F8-FFทำให้ decompressor เข้าสู่วงวนไม่สิ้นสุด ฉันไม่แน่ใจว่าทำไมถึงเป็นเช่นนี้เพราะฉันไม่คุ้นเคยกับการทำงานภายในของห้องสมุด shoco มาก (และรหัส JavaScript ไม่สามารถอ่านได้อย่างสมบูรณ์ ) แต่ก็มีประโยชน์ในกรณีนี้

ฉันไม่เชื่อว่าจะมีวิธีอื่นที่จะยุ่งกับคอมไพเลอร์ Japt แต่คุณไม่มีทางรู้ว่า ...


10
คุณหมายความว่ายังอ่านไม่ได้ เห็นได้ชัดว่าคุณไม่ได้พยายามมากพอ
fəˈnɛtɪk

ฉันหวังว่าจะมีเครื่องถอดรหัส ems ...
tbodt

58

TikZ (pdfTeX 3.14159265-2.6-1.40.17), 85 79 74 24 22 21 ไบต์

บันทึกไบต์จำนวนมากด้วย wchargin

บันทึกหนึ่งไบต์ต้องขอบคุณ Chris H

\input tikz
\tikz\pic

ฉันเจออันนี้โดยบังเอิญเมื่อฉันทำการบ้าน ฉันใช้เวลาสักครู่เพื่อรอการรวบรวมก่อนที่ฉันจะรู้ว่าเกิดอะไรขึ้น

นี่มีสองส่วน:

\input tikz

สิ่งนี้จะโหลดแพ็คเกจ TikZ

และ:

\tikz\pic

สิ่งนี้เริ่มต้น\tikzสภาวะแวดล้อมและคำสั่ง draw

เกิดอะไรขึ้น

คอมไพเลอร์ pdflatex มีปัญหากับ\tikz\picและเข้าสู่โหมดโต้ตอบทำให้หยุดไปเรื่อย ๆ


(1/2) ฉันไม่สามารถทำซ้ำได้ ฉันได้รับ "อาร์กิวเมนต์ Runaway?! \draw l\end {document}File สิ้นสุดลงขณะสแกนการใช้\tikz@next." pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian) tikz 2010/10/13 v2.10 นี่คือมาตรฐานapt install texlive-fullบน Ubuntu 14.04
wchargin

1
@wchargin ฉันใช้รุ่นเดียวกันpdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016) และมันวนซ้ำไปเรื่อย ๆ ขอบคุณสำหรับเคล็ดลับ
Sriotchilism O'Zaic

1
คุณสามารถบันทึกไบต์โดยใช้\picแทน \ draw` - พฤติกรรมเดียวกัน (ทดสอบโดยใช้ tikz 1.142)
Chris H

3
ฉันไม่อยากจะเชื่อเลยว่าจริงๆแล้วฉันไม่ได้เรียกร้องให้ใช้ TikZ แต่การใช้งานมันเกินความจริงแล้ว เกิดอะไรขึ้นกับรุ่นเก่า\def\a{\a}\a(12 ไบต์) หรือเช่นนี้เป็นโค้ดกอล์ฟและ~มีการใช้งานตามค่าเริ่มต้น\def~{~}~(9 ไบต์)
Loop Space

2
@LoopSpace ไม่มีอะไรผิดปกติกับพวกเขาฉันไม่ได้รู้ว่ามีอยู่จริง หากคุณต้องการที่จะทำให้คำตอบของคุณเองแล้วรู้สึกฟรี
Sriotchilism O'Zaic

40

C, 18 ไบต์

#include __FILE__

คอมไพเลอร์มักจะยอมแพ้หลังจากเรียกซ้ำประมาณ 200 ครั้ง

การสร้าง DOM นับเป็นขั้นตอนการรวบรวมหรือไม่? ถ้าเป็นเช่นนั้นx.htm:

<iframe src=x.htm>

14
ฉันจำได้ว่าเฟรมเรียกซ้ำที่ใช้ในการทำงานผิดพลาด IE4 อย่างหนักจนบางครั้งมันก็เอาส่วนประกอบระบบปฏิบัติการที่สำคัญออกมาด้วย ดังนั้น HTML นั้นอาจนับได้

10
@ ais523 ว่าเป็นเพราะในวัน IE4, Internet Explorer ก็เป็น "องค์ประกอบของระบบปฏิบัติการที่สำคัญ"
Mark

2
บิตของการปรับเปลี่ยนและมันเป็นเรื่องที่ถูกต้อง <?include __FILE__;PHP:
Ismael Miguel

6
ไม่สามารถโพสต์คำตอบนี้ได้เพราะตัวแทนของฉันไม่สูงพอ แต่มีสองทางเลือกคือ: #include "/ dev / zero" และ #include "/ dev / stdin" - ระวังให้ดีก่อนใช้ !!
rrauenza

2
เมื่อฉันลองใช้การใช้หน่วยความจำของ gcc เริ่มเติบโตอย่างรวดเร็วโดยไม่ถูกผูกมัดระบบก็ไม่ตอบสนองและในที่สุดผู้เฝ้าระวังของฉันก็เตะและรีบูทในที่สุด มันค่อนข้างสนุก :)
rrauenza

38

Java, 102 95 89 88 78 ไบต์

class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}

สิ่งนี้สิ้นสุดลงด้วยสิ่งStackOverflowErrorที่เกิดขึ้นเนื่องจากระบบการแก้ปัญหาทั่วไปไม่สามารถตัดสินใจได้ว่าจะให้รูทใดเพื่อแก้ไขข้อมูลทั่วไปอื่น ๆ

เครดิตที่เนื่องจาก

เกิดอะไรขึ้นที่นี่?

  1. A<T>มีเพียงเพื่อให้มีผู้ปกครอง 1 ตัวอักษร มันเป็นเรื่องธรรมดา ฉันสามารถใช้งานได้Listแต่การนำเข้าและการทำซ้ำ 4 ตัวอักษรนั้นยาวเกินไป
  2. B<T> ประกาศทั่วไปขั้นพื้นฐาน
  3. B extends Aจะต้องมีลำดับชั้นระหว่างและBA
  4. extends A<A>A<T>สร้างอ้างอิงตนเอง
  5. A<? super B> เรียกการค้นหาสำหรับข้อมูลทั่วไปเกี่ยวกับ A<T>
  6. B<B<T>>B<T>สร้างอ้างอิงตนเอง
  7. A<...> a=new B<>()บังคับให้มีการใช้ยาชื่อสามัญแทนคำจำกัดความเหล่านั้นบังคับให้มีการลงมติเมื่อรวบรวมBและไม่ใช่หลังจากนั้น
  8. A<?super BAสร้างที่ไม่ใช่ตัวเองอ้างอิงดังนั้นเราจึงมีทั้งการอ้างอิงถึงประเภทหนึ่งและไปยังอีกในยาชื่อสามัญของ
  9. B<A>Bสร้างที่ไม่ใช่ตัวเองอ้างอิงดังนั้นเราจึงมีทั้งการอ้างอิงถึงประเภทหนึ่งและไปยังอีกในยาชื่อสามัญของ

ทีนี้รูปแบบAนี้มีประเภทยาชื่อสามัญAและBจะเลือกแบบไหนดี? Bลืมเกี่ยวกับตัวเองให้พยายามที่จะแก้ไข ปิง

ตกลงBมีประเภททั่วไปAและBแต่ที่จะเลือก? Aลืมเกี่ยวกับตัวเองให้พยายามที่จะแก้ไข สาบ

ชนิดของการเรียกซ้ำนี้ไม่สามารถจริงๆจะหลีกเลี่ยงเพราะมีกรณีถูกต้องตามกฎหมายเช่นA<B<A<B<A<B<Object>>>>>>: ยกตัวอย่างเช่นวัตถุ List<Map<String,Map<String,List<Map<String,List<String>>>>>>JSON:

ผลการรวบรวม

$ javac NoCompile.java


The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
        at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2587)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
        at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
        at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2592)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
        at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)

ในระบบของฉันการติดตามสแต็กจะหยุดหลังจากแสดง 1024 บรรทัดซึ่งจริงๆแล้วคือ 4 บรรทัดเดียวกันซ้ำ ๆ กัน 256 ครั้งจึงเป็นการพิสูจน์การวนซ้ำแบบไม่สิ้นสุด ฉันจะขอให้คุณติดตามทั้งหมดที่

เงินออม

  1. 102 → 95 ไบต์: แทนที่interface+ implementsกับ+classextends
  2. 95 → 89 ไบต์: แทนที่Longด้วยA(สองครั้ง)
  3. 89 → 88 ไบต์: ตัวดำเนินการเพชรที่ใช้แล้ว ( new B<A>()new B<>())
  4. 88 → 78 ไบต์: ย้ายการประกาศตัวแปรให้กับสมาชิกระดับขอบคุณVoteToClose

1
ฉันกำลังดูอะไรอยู่
แอดดิสันครัมพ์

คุณสามารถย่อให้เหลือ 78 ไบต์ด้วย:class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
Addison Crump

@VoteToClose คุณกำลังดูตัวอย่างสำคัญของความไม่แน่นอนใน Java generics ควรจะแก้ไขแต่ละสามัญกับรากทั่วไปที่จะตรวจสอบแล้วกับ สิ่งที่อยู่ที่นี่คือหมวดทั่วไปของ Bมีการอ้างอิง undecidable ทั่วไปAซึ่งจะมีการอ้างอิง undecidable ทั่วไปของ B. เมื่อผู้แก้ไขไม่สามารถตัดสินใจได้มันตรวจสอบรวมการอ้างอิง แต่ที่นี่ทั้ง generics อ้างถึงกัน ในทางที่ไม่สามารถตัดสินใจได้ (ส่วนใหญ่ต้องขอบคุณการอ้างอิงตนเองและsuperคำสำคัญดังนั้นตัวแก้ไขจึงใช้คำสั่ง ping-pongs ระหว่าง generics ทั้งสอง
Olivier Grégoire

ฉันกำลังคิดเกี่ยวกับการสร้างปัญหาเวลาคอมไพล์ด้วยคำอธิบายประกอบแบบเป็นวัฏจักร: public @interface X {@X(x=X.class)Class<? extends X> x();}... แต่ฉันรู้ได้อย่างรวดเร็วว่าทำไมมันถึงใช้งานไม่ได้
Magic Octopus Urn

34

GNU Makefile, 8 7 ไบต์

บันทึกหนึ่งไบต์ด้วย KonradRudolph

บันทึกMakefileและเรียกใช้โดยmake:

x:;make

นี้จะผลิตสร้าง recursion "x"อนันต์ในเป้าหมายแรกที่พบ

จำเป็นต้องพูดว่าคุณไม่ได้จริงๆต้องการที่จะทำงานนี้ระเบิดส้อมบนเซิร์ฟเวอร์การผลิตของคุณ :-)

make
make[1]: Entering directory `/path/to/my/dir'
make
make[2]: Entering directory `/path/to/my/dir'
make
make[3]: Entering directory `/path/to/my/dir'
make
make[4]: Entering directory `/path/to/my/dir'
make
make[5]: Entering directory `/path/to/my/dir'
make
make[6]: Entering directory `/path/to/my/dir'
make
make[7]: Entering directory `/path/to/my/dir'
make
...

รุ่นอื่น 5 ไบต์

แนะนำโดย KonradRudolph:

x:;$_

$_เป็นการอ้างอิงถึงอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า โดยเฉพาะอย่างยิ่งจะได้รับการแก้ไขที่นี่เป็นเส้นทางที่แน่นอนไปยังคำสั่งที่กำลังดำเนินการ - ซึ่งเป็นmakeตัวเอง

สิ่งนี้จะทำงานได้ดีในสภาพแวดล้อม Bash ของแท้ แต่ไม่ใช่ใน Windows + MinGW


2
อืมฉันไม่คิดว่าmakeจะรวบรวม Makefile จริงๆ(มันแค่ตีความมัน)
zeppelin

3
@zeppelin คุณพูดถูกนี่อาจเป็นคำตอบที่เป็นเส้นแบ่งเขต ที่กล่าวว่าการส่งที่เกี่ยวข้องกับการเรียกซ้ำแมโครในระดับตัวประมวลผลก่อนจะไม่เริ่มต้นการรวบรวมรหัสจริงใด ๆ
Arnauld

11
มันเหมาะกับเป้าหมายที่ตั้งใจไว้: มีกระบวนการสร้างที่ไม่มีที่สิ้นสุด +1!
YSC

23

C ++, 60 58

template<class T>class a{a<T*>operator->();};a<int>i=i->b;

สิ่งนี้จะสร้างอินสแตนซ์ที่class aมีพารามิเตอร์เทมเพลตต่าง ๆ ซ้ำ ๆ GCC 7.0 หยุดหลังจากที่ 900 ระดับการเรียกซ้ำกับตันของข้อผิดพลาดเกี่ยวกับoperator->การเป็นส่วนตัว แต่สำหรับตัวอย่างเช่น ICC 17 และ Microsoft (R) C / C ++ เพิ่มประสิทธิภาพคอมไพเลอร์ 19 หมดเวลาใน godbolt

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

แก้ไข: 2 ไบต์บันทึกโดย bolov - ขอบคุณ


1
สั้นกว่า:a<int>i=i->b;
bolov

1
@ กระเป๋าเช่นฉันระบุไว้ในคำตอบของฉันนั่นเป็นเพราะค่าเริ่มต้นoperator->ส่วนตัวในชั้นเรียน ภายในโครงสร้างมันเป็นแบบสาธารณะและi->bอาจเข้าถึงได้
Christoph

1
gcc 4.4.7 ดูเหมือนว่าจะอยู่ที่นี่อย่างไม่มีกำหนด กำลังรออินฟินิตี้หรือเพื่อให้แสดงผลลัพธ์ไม่ว่าอย่างใดมาก่อน จะอัปเดต
osuka_

1
@osuka_ ยังคงทำงานอยู่หรือไม่
Christoph

1
@ Christoph nope มันชนกับ SIGSEGV หลังจากที่ฉันปล่อยให้มันวิ่งไปสองสามวัน ลืมปรับปรุงแม้ว่า - ขอบคุณสำหรับการเตือน!
osuka_

23

Perl , 15 13 ไบต์

BEGIN{{redo}}

ลองออนไลน์!

ขณะนี้มี 2 ไบต์ที่บันทึกไว้: @ Zaid ทำให้ฉันนึกถึงวิธีที่ผู้ใช้ทำซ้ำใน Perl

มันค่อนข้างง่าย: เพียงแค่ติดตั้ง parser hook ที่มีการวนซ้ำไม่สิ้นสุดทำให้โค้ดใช้เวลานานในการแยกวิเคราะห์ (Perl เป็นสิ่งที่ดีที่ช่วยให้คุณสามารถเรียกใช้รหัสโดยพลการในช่วงกลางของการแยกวิเคราะห์ตะขอ parser มีการระบุไว้ใน Perl ตัวเองและใช้บ่อยในการทำสิ่งต่าง ๆ เช่นห้องสมุดนำเข้าหรือเปลี่ยนกฎการแยกวิเคราะห์สำหรับตัวระบุที่คุณต้องการ คำหลัก) ลองออนไลน์! ลิงก์ด้านบนแสดง-cตัวเลือก (เพื่อรวบรวมรหัสเพื่อตรวจสอบความถูกต้องของไวยากรณ์ แต่ไม่เรียกใช้) เพื่อพิสูจน์ว่าวงวนไม่สิ้นสุดเกิดขึ้นในเวลารวบรวม

ในกรณีที่คุณสงสัยเกี่ยวกับ "เวลาในการรวบรวม" ในภาษาสคริปต์: Perl จริง ๆ แล้วรวบรวมไปยัง bytecode แล้วเรียกใช้ bytecode แต่นี่เป็นรายละเอียดที่ไม่ค่อยเกี่ยวข้องเมื่อเขียนโปรแกรม -MO=ครอบครัวเลือกบรรทัดคำสั่งสามารถใช้ในการทำสิ่งที่มี bytecode อื่น ๆ นอกเหนือจากการทำงาน (แม้ว่าไม่ได้อยู่กับโปรแกรมนี้เป็นห่วงอนันต์เกิดขึ้นก่อนที่จะ bytecode สามารถสร้างขึ้น)


1
a:goto aดูดีเหมือนกัน (bytecount เดียวกันเศร้า)
Dada

3
BEGIN{{redo}}จะช่วยให้คุณประหยัดไม่กี่ไบต์
Zaid

20

C ++ 37 30 29 ไบต์

int f(auto p){f(&p);},a=f(0);

มันใช้พารามิเตอร์ฟังก์ชั่นอัตโนมัติในอนาคต มันถูกเสนอเป็น C ++ 17 แต่ฉันไม่คิดว่ามันจะทำ gccอย่างไรก็ตามสนับสนุนเป็นส่วนขยาย

เป็นพื้น

void foo(auto p);

เทียบเท่ากับ

template <class T>
void foo(T p);

รหัสพยายามสร้างอินสแตนซ์fซ้ำด้วยอาร์กิวเมนต์แบบต่าง ๆ gccล้มเหลวด้วย

ข้อผิดพลาดร้ายแรง: ความลึกของอินสแตนซ์ของแม่แบบเกินค่าสูงสุดที่ 900 (ใช้ -ftemplate-depth = เพื่อเพิ่มค่าสูงสุด)

เมื่อ-ftemplate-depth=10000ฉันได้รับมันจะคาย "เกินกำหนดเวลาในการประมวลผล" ใน godbolt

ตรวจสอบกับ godbolt


บันทึก 1 ไบต์โดย Quentin ขอขอบคุณ.


1
หนึ่งไบต์จะถูกบันทึกไว้โดยใช้intเป็นประเภทผลตอบแทน :)
เควนติน

อันที่จริงautoพารามิเตอร์ฟังก์ชั่นไม่ได้ทำให้มันเป็น C ++ 17; และint f() { ... }, a;ไม่ใช่การประกาศทางกฎหมายครั้งสุดท้ายที่ฉันตรวจสอบ (คุณไม่สามารถผสมการประกาศฟังก์ชั่นที่มีการประกาศตัวแปรเช่นที่.) สิ่งที่คุณได้มาถึงที่นี่เป็นอย่างยิ่งภาษา GCC-เฉพาะของภาษา C ++ ไม่ใช่ว่ามีอะไรผิดปกติกับสิ่งนั้นในบริบทนี้ :)
Quuxplusone

19

Common Lisp 8 ไบต์

#.(loop)

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


17

TeX, 9 ไบต์

\def~{~}~

TeX ทำงานโดยการขยายมาโคร เวลาส่วนใหญ่ของแมโครเท็กซ์ (หรือที่เรียกว่าลำดับการควบคุม ) เป็นรูปแบบ\nameแต่ก็ยังเป็นไปได้ที่จะกำหนดตัวอักษรบางอย่างเป็นมาโครเหล่านี้เรียกว่าตัวละครที่ใช้งาน ตัวละคร~มีการใช้งานโดยค่าเริ่มต้นใน TeX ธรรมดาและสามารถใช้เป็นชื่อแมโครโดยไม่มีการประกาศเพิ่มเติม \def~{~}ในกำหนดข้างต้นเพื่อที่จะขยายไปยัง~ ~นั่นคือเมื่อใดก็ตามที่เท็กซ์พบ~แล้วก็แทนที่มันด้วย~และ re-ตรวจสอบทดแทนที่มีความหมายที่พบที่เกิดขึ้นใหม่ในเครือของและแทนที่ว่าด้วยการ~ ~สิ่งนี้นิยามลูปไม่สิ้นสุด ทั้งหมดที่จำเป็นต้องแล้วคือการเริ่มต้นห่วงและนั่นคือสิ่งสุดท้าย~ไม่


เพิ่มในการแก้ไข

ในการทำให้คอมไพล์อย่างถูกต้องให้เรียกใช้เป็น:

pdftex -ini "&pdftex \def~{~}~"

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


สิ่งนี้เกิดขึ้นในเวลารวบรวมหรือไม่? คำถามต้องการวงวนไม่สิ้นสุดที่จะเกิดขึ้นในขณะคอมไพล์ไม่ใช่เมื่อทำงาน

@ ais523 ไม่ได้คิดอย่างถี่ถ้วน ฉันกำลังออกคำตอบ TikZ ฉันได้เพิ่มทางเลือกที่ถูกรวบรวมอย่างแน่นอนโดยมีค่าใช้จ่ายเพิ่มอีกไม่กี่ไบต์
Loop Space

2
@ ais523: เช่นเคย "คอมไพล์" และ "วิ่ง" เป็นสองด้านของเหรียญเดียวกัน โดยส่วนตัวฉันคิดว่าซอร์สโค้ดของ TeX นั้นเป็น "การคอมไพล์" ลงในเอกสาร PDF (ซึ่งก็คือ "ดำเนินการ" โดยการดู) ในลักษณะเดียวกับที่ซอร์สโค้ด C ++ ถูก "คอมไพล์" ลงในไฟล์. exe (ซึ่งก็คือ วิ่ง). แต่คุณอาจคิดว่าpdftexโปรแกรมเป็น "การแปล" อินพุต TeX เพื่อสร้าง PDF เป็น "เอาต์พุต" - เช่นเดียวกับที่g++โปรแกรม "ตีความ" อินพุต C ++ เพื่อสร้างไฟล์. exe เป็น "เอาต์พุต" ;)
Quuxplusone

13

Haskell, 25 + 17 = 42 ไบต์

a= $(let a='a':a in[|a|])

Hapell metaprogram อย่างง่ายซึ่งกำหนดค่าอนันต์และพยายามคำนวณค่าดังกล่าว ณ เวลารวบรวม

เรียกใช้ด้วยghc -XTemplateHaskell <file.hs>(+17 สำหรับพารามิเตอร์ของคอมไพเลอร์)


ไม่$(let a=a in a)ทำงาน (สำหรับ 32 ไบต์)
Ry-

1
Nope! GHC ฉลาดเกินไป ลูปแบบไม่ จำกัด ใด ๆ ของฟอร์มlet a = a in aจะถูกเขียนใหม่เป็นข้อยกเว้นซึ่งทำให้เกิดข้อผิดพลาดในการคอมไพเลอร์ซึ่งตรงข้ามกับการวนซ้ำไม่สิ้นสุด (แม้ว่าอาจจะใช้งานได้กับคอมไพเลอร์ Haskell ที่แตกต่างกัน แต่ฉันไม่มีมือลอง)
user2407038

มันทำงานร่วมกับ runghc สำหรับฉันดังนั้นฉันจะบอกว่ามันถูกต้อง (อันที่จริงแล้วมันใช้งานได้กับ ghc เช่นกัน 8.0.1 ที่นี่)
Ry-

จริงๆ? ฉันใช้ ghc 8.0.1 เช่นกัน - สำหรับฉันมันให้Exception when trying to run compile-time code: <<loop>>ทั้งในล่ามและเมื่อรวบรวม ... ในทางเทคนิคโค้ดข้างต้นตายด้วยข้อยกเว้นเช่นกัน แต่สแต็กล้นซึ่งอนุญาตโดยสเป็คอย่างชัดเจน - และถ้าคุณมีความจำที่ไม่สิ้นสุดมันจะวนซ้ำตลอดไป <<loop>>ไฟยกเว้นไกลก่อนที่เครื่องของฉันไหลออกมาจากหน่วยความจำ
user2407038

12

gradle, 10 9 ไบต์

for(;;){}

โดยมีรหัสข้างต้นอยู่ในbuild.gradleไฟล์ Gradle ใช้ Groovy เป็นภาษาพื้นฐานดังนั้นเราจึงพูดถึง Groovy ที่นี่จริง ๆ แต่เนื่องจากคำถามเกี่ยวกับเวลาในการสร้างฉันคิดว่าการไล่ระดับสีจะเหมาะสมกว่า

การรันคำสั่ง gradle build ใด ๆ ด้วยโค้ดด้านบนจะพิมพ์บรรทัดสถานะบิลด์ที่เข้ากันได้กับเจ้านาย:

$ gradle tasks
> Configuring > 0/1 projects > root project

หากคุณต้องการเพิ่มขึ้นให้เพิ่มการดีบัก-dสำหรับ:

$ gradle -d tasks
14:56:25.522 [INFO] [org.gradle.internal.nativeintegration.services.NativeServices] Initialized native services in: .gradle/native
14:56:25.757 [DEBUG] [org.gradle.launcher.daemon.client.DaemonClient] Executing build 84908c0d-f28d-4c57-be61-40eaf0025e16.1 in daemon client {pid=27884}
14:56:25.761 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface tun0
14:56:25.762 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
14:56:25.762 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a multicast interface? false
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x:x:x:x:x:x:%tun0
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x.x.x.x
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a multicast interface? true
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x:x:x:x:x:x:%eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x.x.x.x
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote multicast interface eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface lo
<snip>
14:57:07.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
> Configuring > 0/1 projects > root project

ซึ่งนอกจากจะดูซับซ้อนแล้วยังอัปเดตด้วยชุดใหม่ของ:

15:07:57.054 [DEBUG] [org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
15:07:57.054 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
15:07:57.054 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.

บรรทัดสถานะทุก ๆ 10 วินาทีทำให้ดูเหมือนว่างานสร้างไม่ว่างทำเรื่องทางเทคนิคที่สำคัญ ...


8

SWI-Prolog ขนาด 34 ไบต์

term_expansion(_,_):-repeat,1=0.

คำอธิบาย

term_expansion/2 เป็นสิ่งที่ถูกเรียกโดยอัตโนมัติโดยคอมไพเลอร์ก่อนที่จะรวบรวมรหัสเพื่อแปลงคำบางคำในซอร์สโค้ดให้เป็นคำอื่น ๆ

ที่นี่เราแนะนำกฎใหม่สำหรับ:term_expansion/2repeat,1=0.

repeat/0 เป็นคำกริยาที่ประสบความสำเร็จเสมอและให้คะแนนทางเลือกที่ไม่ จำกัด จำนวน

1=0พยายามที่จะรวมกัน1ด้วยซึ่งเป็นเสมอ0 falseสิ่งนี้จะทำให้คอมไพเลอร์ย้อนรอยไปrepeat(เนื่องจากเป็นจุดเลือกเสมอ) และลอง1=0อีกครั้ง ฯลฯ


ใช้งานไม่ได้ใน GNU Prolog ดังนั้นฉันจึงสมมติว่านี่เป็นการใช้งานเฉพาะ คุณอาจต้องการใส่ชื่อของคอมไพเลอร์ในส่วนหัว (ฉันสมมติว่า SWI Prolog.)

@ ais523 ขอบคุณไม่ได้ตรวจสอบ distribs อื่น ๆ แต่เนื่องจากสิ่งที่คอมไพเลอร์มักจะค่อนข้างเฉพาะฉันควรจะรู้จักดีกว่า ...
Fatalize

@ ais523 อย่างไรก็ตามตามนี้คุณอาจจะสามารถใช้expand_termแทนได้ (อย่างที่บอกว่าterm_expansionไม่สามารถใช้เหมือนที่นี่ใน GNU Prolog) มันไม่ทำงานกับexpand_termSWI
เสียชีวิต

7

GNU Make, 44

.PHONY:x
$(MAKEFILE_LIST):x;sleep 1;touch $@

ฉันไม่สามารถรับเครดิตสำหรับสิ่งนี้ มันมาจากหนังสือของโรเบิร์ตบวร์กของการจัดการโครงการกับ GNU ยี่ห้อ: พลังของ GNU ทำให้การสร้างสิ่งใด

เมื่อ make เรียกใช้ makefile นี้จะเห็นว่า makefile ล้าสมัย (เนื่องจากเป้าหมาย. Phoney ล้าสมัยดังนั้นจึงเรียกใช้งานคำสั่ง touch ซึ่งจะอัพเดตเวลาประทับของ makefile จากนั้นให้อ่านไฟล์ใหม่และค้นพบ makefile ล้าสมัย .... คุณเข้าใจแล้ว

ฉันชอบสิ่งนี้กับคำตอบอื่น ๆเนื่องจากไม่ได้ใช้การสอบถามซ้ำ บน VM ของฉันคำตอบ Make อื่น ๆ จะดำเนินการตามกระบวนการอย่างต่อเนื่องและที่ใดที่หนึ่งที่มีความลึกประมาณ 7,000 VM นั้นจะหยุดลงโดยไม่ตอบสนอง อย่างไรก็ตามด้วยคำตอบนี้จะสามารถดำเนินการต่อไปได้อย่างไม่มีกำหนดโดยไม่ต้องกินทรัพยากรระบบ คุณจะสามารถหย่อนออกได้ด้วยงานสร้างนี้ ฉันได้ทำซ้ำไปแล้วกว่า 1,000,000 ครั้งโดยไม่มีการเสื่อมของระบบ

หมายเหตุฉันต้องเพิ่มsleep 1เพื่อให้การประทับเวลาของ makefile ถูกอัพเดตทุกครั้ง คุณสามารถเปลี่ยนสิ่งนี้เป็นsleep 0.01หากคุณต้องการให้การเขียนซ้ำเร็วขึ้นเล็กน้อย


6

GNU Forth ขนาด 15 ไบต์

แข็งแรงเล่นกอล์ฟ

: : [do] [loop]

กำหนดใหม่ (รวบรวมใหม่) คำ:และเรียกใช้การวนซ้ำไม่สิ้นสุดทันที[do] [loop]ภายในคำจำกัดความใหม่ (ขวา ณ เวลารวบรวม)

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

ลองออนไลน์!


5

Clojure 21 ไบต์

(defmacro a[]`(a))(a)

ผูกคอมไพเลอร์โดยกำหนดแมโครที่ส่งเสียงเรียกตัวเองซ้ำ ๆ

ในโทรศัพท์ของฉันนี่เป็นสาเหตุให้ REPL หยุดการทำงานของอุปกรณ์ ในแล็ปท็อปของฉันสิ่งนี้ล้มเหลวทันทีด้วย StackOverflow

น่าเสียดายที่ StackOverflow เกิดขึ้นทันที แต่ก็ยังคงใช้ได้ตามกฎ


5

MSBuild, 130 ไบต์

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="X">
        <Exec Command="msbuild"/>
    </Target>
</Project>

บันทึกเป็นไฟล์ที่มี.projนามสกุลและเรียกใช้msbuildจากพรอมต์คำสั่ง MSBuild จะเรียกใช้เป้าหมายเดียวที่เพิ่งวางไข่msbuildกระบวนการ อื่น


การเยื้องนี้จำเป็นสำหรับการทำงานหรือไม่ สิ่งที่เกี่ยวกับการขึ้นบรรทัดใหม่? ปกติแล้วมันเป็นไปได้ที่จะเล่นกอล์ฟในที่โล่ง

ไม่มันอ่านง่ายกว่า จำนวนตัวอักษรไม่รวมถึงช่องว่าง
Danko Durbić

1
อ่าใช่มั้ย ในกรณีนี้คุณอาจจะต้องพูดถึงสิ่งนั้นในเนื้อหาของการโพสต์

5

C, 31 ไบต์

main[-1llu]={1};

แรงบันดาลใจจากการบาดเจ็บดิจิตอล คอมไพล์ด้วย-mcmodel=mediumแฟล็ก

โชคดีที่รวบรวมสิ่งนี้คุณจะต้องมี 1.8 yottabytes of RAM และพื้นที่ดิสก์


4

Mathematica 33 Bytes

Compile[{},Evaluate@While[True,]]

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


"ก่อนการรวบรวม" ใช่ ... ไม่
CalculatorFeline

โปรดระบุอาร์กิวเมนต์ที่ถูกต้อง Reference.wolfram.com/language/tutorial/…
Kelly Lowder

คำถามคือการวนซ้ำเกิดขึ้นระหว่างการCompileโทรหรือก่อนหน้าหรือไม่?
CalculatorFeline

3

Haskell (GHC โดยไม่มีเทมเพลต Haskell หรือกฎการเขียนซ้ำแบบกำหนดเอง) , 138

{-#LANGUAGE FlexibleContexts,UndecidableInstances#-}
data A x=A
class C y where y::y
instance C(A(A x))=>C(A x)where y=A
main|A<-y=pure()

ในทางทฤษฎีสิ่งนี้เข้าสู่วงวนอนันต์ในแบบเดียวกับที่วิธีC ++ ทำ : วิธี polymorphic yนั้นถูกสร้างอินสแตนซ์ให้กับประเภทที่ซับซ้อนยิ่งขึ้น ในทางปฏิบัติขนาดสแต็กที่กำหนดเริ่มต้นจะล้นอย่างรวดเร็วจริง ๆ :

$ ghc-7.10 wtmpf-file14146.hs 
[1 of 1] Compiling Main             ( wtmpf-file14146.hs, wtmpf-file14146.o )

wtmpf-file14146.hs:5:9:
    Context reduction stack overflow; size = 101
    Use -fcontext-stack=N to increase stack size to N
      C (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A t0))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
    In a stmt of a pattern guard for
                   an equation for ‘main’:
      A <- y
    In an equation for ‘main’: main | A <- y = pure ()

เครดิตลุคพาลเมอร์


1

Haskell (ghc), 32 + 2 = 34 bytes

{-#RULES""main=main#-}
main=main

ghc -O <file>ทำงานด้วย ทริกเกอร์กฎการเขียนซ้ำสำหรับฟังก์ชั่นหลักที่เขียนซ้ำในสิ่งเดียวกัน คุณลักษณะที่โชคร้ายเพียงอย่างเดียวคือ ghc ฉลาดพอที่จะตรวจจับสิ่งนี้และหยุดหลังจากทำซ้ำ 100 ครั้ง ฉันไม่รู้วิธีง่ายๆในการปิดใช้งานพฤติกรรมนี้


1

Boo ขนาด 25 ไบต์

macro l:
 x=0 while 1>0
l

สิ่งนี้กำหนดแมโครซึ่งดำเนินการ ณ เวลารวบรวมซึ่งดำเนินการวนรอบไม่สิ้นสุดแล้วเรียกใช้แมโคร


1

สนิมขนาด 18 ไบต์

include!(file!());

คลาสสิกรวมตัวเอง Rustc มีสติที่น่ารำคาญและโดยค่าเริ่มต้นจะประกันตัวหลังจากการเรียกซ้ำ 128 ครั้งและจะขยายความลึกก่อนดังนั้นการเติบโตแบบเลขชี้กำลังจะไม่ทำงานเช่นกัน เช่นเดียวกับโซลูชัน C และ C ++


0

ปัจจัย , 29 16

<< [ t ] loop >>

ส่วนระหว่าง<< >>ถูกดำเนินการในเวลาในการแยกวิเคราะห์

สำหรับสิ่งที่[ t ] loopฉันจะให้คุณเดา ...

คุณสามารถใส่สิ่งนั้นลงใน Listener ได้ตามที่เป็นอยู่หรือเพิ่มลงในคำศัพท์หรือไฟล์สคริปต์ใด ๆ


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