ห่วงทำลายอัตโนมัติสั้นที่สุด


61

งานของคุณคือการเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่ใช้เวลาไม่ป้อนข้อมูลและการทำงานประเภทของวง (ใด ๆwhile, for, foreach, do, do-while, do-loop, goto, recursion ฯลฯ ) ที่จะสิ้นสุดในการก่อให้เกิดข้อผิดพลาดซึ่งหมายความว่าโปรแกรมที่จะต้องหยุดตัวเองทำงานและ ทางออก

กฎ:

  1. ข้อผิดพลาดต้องเป็นข้อผิดพลาดในการทำงานข้อยกเว้นที่ไม่สามารถจัดการได้หรือสิ่งใดก็ตามที่ทำให้โปรแกรมหยุดทำงานเอง
  2. ข้อผิดพลาดจะต้องสร้างการหยุดและออกจากโปรแกรมโดยไม่ต้องเรียกอย่างชัดเจนexit;(หรือเทียบเท่า) ในบางจุด
  3. ข้อความเช่นWarning:, Notice:ฯลฯ ที่ไม่ทำให้โปรแกรมสิ้นสุดตัวเองไม่ถูกต้อง ตัวอย่างเช่นในแผนก PHP โดยศูนย์สร้างWarningข้อความ แต่โปรแกรมจะไม่หยุดและจะยังคงทำงานอยู่นี่ไม่ใช่คำตอบที่ถูกต้อง
  4. การวนซ้ำต้องทำงานอย่างน้อยหนึ่งรอบเต็ม กล่าวอีกนัยหนึ่งข้อผิดพลาดอาจเกิดขึ้นได้ตั้งแต่รอบที่สองเป็นต้นไป นี่คือการหลีกเลี่ยงที่จะทำให้เกิดข้อผิดพลาดโดยใช้ไวยากรณ์รหัสที่ไม่ถูกต้อง: รหัสจะต้องถูกต้องทางไวยากรณ์
  5. การวนซ้ำอาจเป็นอนันต์ (ตัวอย่างfor(;;);) ถ้ามันเคารพกฎดังกล่าวข้างต้น แต่ต้องใช้เวลาไม่เกิน 2 นาทีในการสิ้นสุดตัวเองในข้อผิดพลาดขณะทำงาน
  6. การเรียกซ้ำโดยไม่มี Tail Call Optimization ไม่ถูกต้อง ( 1 , 2 )
  7. นี่คือเพื่อให้โค้ดที่สั้นที่สุดชนะ
  8. ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

ตัวอย่าง C # ( ทดสอบออนไลน์ ):

using System;
public class Program {
    public static void Main() {
        int i;
        int[] n;
        n = new int[5];
        for(i=0; i<7; i++) {
            n[i] = i;
            Console.WriteLine(n[i]);
        }
    }
}


Output: 

0
1
2
3
4
Run-time exception (line 9): Index was outside the bounds of the array.

Stack Trace:

[System.IndexOutOfRangeException: Index was outside the bounds of the array.]
  at Program.Main(): line 9

ลีดเดอร์บอร์ด:

var QUESTION_ID=104323,OVERRIDE_USER=59718;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important;font-family:Arial,Helvetica; font-size:12px}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>

ขอบคุณMartin Enderสำหรับตัวอย่างกระดานผู้นำ


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

@ETHproductions มันถูกแนะนำโดย Dennis ในการแชท: "มันอาจเป็นเรื่องยากที่จะตัดสินใจว่าครบวงจรได้เสร็จสมบูรณ์ในกรณีนี้ [ของ recursion] หาง recursion kinda เหมาะกับการเรียกเก็บเงิน ด้วยข้อผิดพลาด [... ] ฉันจะบอกว่าการเรียกซ้ำโดยไม่มี TCO นั้นไม่ถูกต้อง "
Mario

ในfor(a;b;c)d;หลังจากคำสั่งที่จะสิ้นสุดรอบแรก? ถูกต้องหรือไม่ที่จะทำลายการประเมินcคำสั่งแรก?
Hedi

1
@Hedi นี่คือความเห็นที่ต่ำต้อยของฉัน (ไม่ใช่ OP): รายการทั้งหมดจะต้องเสร็จสมบูรณ์หนึ่งรอบเต็มซึ่งหมายความว่าพวกเขาจะต้องเข้าสู่รอบที่สอง ; นี้หมายความว่าคำสั่งอย่างน้อยหนึ่งคือการทำงานที่สองเวลา เนื่องจากคำสั่งของการดำเนินการในตัวอย่างของคุณคือa, b, d, c, b, d, c, ..., bเป็นจุดเริ่มต้นของวงจรและต้องทำงานอย่างน้อยเป็นครั้งที่สอง
ETHproductions

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

คำตอบ:


33

MATL , 5 1 ไบต์

แนวคิดที่นำมาจากคำตอบ CJamของ @ MartinEnder

`

ลองออนไลน์!

`    % Do...while loop
     % Implicit end. The loop continues if the top of the stack is true.
     % After the first iteration, since the stack is empty, the program 
     % implicitly tries to take some non-existing input, and finishes
     % with an error

เวอร์ชั่นเก่า

2:t"x

ลองออนไลน์!

2:   % Push [1 2]
t    % Duplicate
"    % For each (i.e. do the following twice)
  x  %   Delete top of the stack. Works the first time. The second it tries to
     %   implicitly take some non-existing input, and finishes with an error

3
ทำงานแบบออฟไลน์เช่นกัน ไม่มีการป้อนข้อมูลหมายความว่าคุณสามารถสมมติว่าการป้อนข้อมูลว่างเปล่า
เดนนิส

@Dennis หืมโปรแกรมออฟไลน์จะรอการป้อนข้อมูลของผู้ใช้ อินพุตเป็นแบบอินเทอร์แอคทีฟเช่นมีการร้องขอตามต้องการในเวอร์ชันออฟไลน์ ดังนั้นโปรแกรมจะรออย่างไม่มีกำหนด ไม่แน่ใจว่านับหรือไม่
Luis Mendo

ไม่แน่ใจว่า MATL ทำงานอย่างไรภายใน แต่ถ้าคุณดำเนินการในสภาพแวดล้อมที่ไม่สามารถขออินพุต (เช่นแบ็กเอนด์ของ TIO) ก็จะไม่สามารถรับอินพุตใด ๆ ได้ นอกจากนี้ควรอนุญาตให้กด Ctrl-D หรือระบบเทียบเท่าขึ้นอยู่กับ OS เพื่อส่งอินพุตว่าง
เดนนิส

35

Python ขนาด 16 ไบต์

วิธีการหาร 0 ที่ไม่น่าสนใจ:

for x in 1,0:x/x

การคำนวณซ้ำครั้งแรก1 / 1ซึ่งทำงานได้ดี การคำนวณซ้ำครั้งที่สองพยายามคำนวณ0 / 0ทำให้เกิดZeroDivisionErrorการโยน

17 ไบต์ (โปรดส่วนตัว)

i=1
while i:del i

ในขั้นต้นi=1ซึ่งเป็นความจริงดังนั้นวงถูกป้อน

ครั้งแรกที่ลูปรันตัวแปรiจะถูกลบ

ซึ่งหมายความว่าครั้งที่สองiไม่ใช่ตัวแปรอีกต่อไปดังนั้นการประเมินจึงล้มเหลวด้วยNameError: name 'i' is not defined.


โซลูชัน 15 ไบต์อื่นคือdef _():_()(ขึ้นบรรทัดใหม่) _()เนื่องจาก Python ไม่ปรับหางแบบเรียกซ้ำให้เหมาะสม อย่างไรก็ตามสิ่งนี้ละเมิดกฎ # 6


โซลูชัน 17 ไบต์ยังใช้งานได้หากคุณแทนที่while iด้วยwhile 1เพราะจะพยายามลบiอีกครั้ง
user6245072

2
@ user6245072 yep ทั้งสองตัวอย่างสามารถปรับเปลี่ยนได้เล็กน้อยสำหรับโซลูชันการทำงานจำนวนมาก
FlipTack

คุณสามารถใช้เคล็ดลับกับในตัวที่จะโกนไม่กี่เพิ่มเติม:del while 1:del id
DSM


18

เจลลี่ , 3 2 ไบต์

Ṿß

ฆ่าตัวตายโดยใช้หน่วยความจำไม่เพียงพอ ทำภายในเครื่องหลังจาก ~ 100 วินาที

ลองออนไลน์! (ใบมรณบัตรในลิ้นชักดีบั๊ก )

มันทำงานอย่างไร

Ṿß  Main link. Argument: x. Implicit first argument: 0

Ṿ   Uneval; yield a string representation of x.
 ß  Recursively call the main link.
    Jelly uses TCO, so the first cycle finishes successfully before entering
    the next one.

การทำซ้ำสองสามครั้งแรกให้ผลลัพธ์:

'0'
'”0'
'””,”0'
'””,””,”,,””,”0'
'””,””,”,,””,””,”,,””,”,,”,,””,””,”,,””,”0'
'””,””,”,,””,””,”,,””,”,,”,,””,””,”,,””,””,”,,””,”,,”,,””,””,”,,””,”,,”,,””,”,,”,,””,””,”,,””,””,”,,””,”,,”,,””,””,”,,””,”0'

หลังจากนั้นมันก็น่าเกลียดจริงเร็วจริง ๆ


หน่วยความจำของเยลลี่ จำกัด คืออะไร?
tuskiomi

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

28
ดังนั้นทุกๆ 2 ปีเราจะสามารถทำซ้ำได้อีก
tuskiomi

ดังนั้นจะล้มเหลวเงื่อนไข # 5 บนเครื่องช้าที่มี RAM มากมาย?
นักฟิสิกส์บ้า

@MadPhysicist นั่นถูกต้อง นี่เป็นปัญหาโดยธรรมชาติที่มีเวลา จำกัด การปฏิบัติตามขึ้นอยู่กับว่าเครื่องใดที่โปรแกรมกำลังทำงานอยู่
เดนนิส

13

V , 2 ไบต์

òl

ลองออนไลน์!

นี่เป็นความท้าทายที่สมบูรณ์แบบสำหรับ V เพราะฉันทำมาตลอดเวลา! ในความเป็นจริง V ไม่ได้มีเงื่อนไขใด ๆ แต่ก็มีฟังก์ชั่นที่ผิดพลาด ในกรณีนี้òหมายถึง "ทำซ้ำตลอดไป" และl"ย้ายไปทางขวา"

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


3
รอlหมายถึง "เลื่อนไปทางขวา" หรือไม่ ไม่ใช่ "ย้ายleft" หรือไม่
Conor O'Brien

1
@ ConorO'Brien yep มีเหตุผลทางประวัติศาสตร์ที่ดีสำหรับเรื่องนี้
DJMcMayhem

3
ความท้าทายต้องการคำตอบที่จะเกิดความผิดพลาดในการทำซ้ำครั้งที่สองหรือใหม่กว่าไม่ใช่การทำซ้ำครั้งแรก
Martin Ender

11

JavaScript (ES6), 13 ไบต์

f=_=>f(_?a:1)

นี่เป็นฟังก์ชั่นวนซ้ำที่ทำงานได้ดีครั้งเดียวจากนั้นจึงโยนReferenceError: a is not definedและออก

นี่คือเวอร์ชัน 15 ไบต์ที่ไม่ใช่ ES6:

for(i=0;;)i=i.a

สิ่งนี้จะทำงานได้ดีหนึ่งครั้งจากนั้นจึงโยนTypeError: i is undefinedและหยุด


10

Bash 4.2, 22 ไบต์

exec $0 $@ $[2**$#%-1]

ไม่ทำงานใน TIO เพราะมี Bash 4.3 และข้อผิดพลาดที่ฉันพึ่งพาได้รับการแก้ไขในที่สุด

การตรวจสอบ

$ xxd -c 22 -g 22 self-destruct
0000000: 6578656320243020244020245b322a2a2423252d315d  exec $0 $@ $[2**$#%-1]
$ ./self-destruct
Floating point exception

สิ่งนี้ขัดข้องเมื่อโปรแกรมพยายามคำนวณ2 63 mod -1ซึ่งขัดข้องใน Bash 4.2 และรุ่นที่เก่ากว่าเนื่องจากข้อผิดพลาดที่ทราบ


10

PHP, 22 21 20 18 ไบต์

สิ่งนี้อาศัย PHP ที่ยอมให้ชื่อฟังก์ชั่นเป็นตัวแปรและพยายามเรียกใช้

นี่เป็นการรวมชื่อของpiฟังก์ชันสองอย่างเข้าด้วยกัน นี้ฆ่า PHP Fatal Error: Uncaught Error: Call to undefined function pipi() in [...][...]ด้วย

while($x.=pi)$x();

งานนี้คล้ายกับคำตอบเก่าของฉัน


คำตอบเก่า 20 ไบต์

PHP อนุญาตให้คุณเพิ่มตัวอักษรโดยใช้ตัวดำเนินการที่เพิ่มขึ้น มันใช้งานได้ในa-zช่วงเท่านั้น แต่ก็เพียงพอแล้ว

for($x=pi;;)$x=$x();

ฉันเชื่อว่าสิ่งนี้ตอบสนองทุกจุดที่ต้องการและลูปจะทำงานเพียงครั้งเดียว

Fatal error: Function name must be a stringคุณสามารถดูว่าเพราะคุณจะได้รับข้อผิดพลาด


มันทำงานอย่างไรทีละขั้นตอน:

  • กําหนดการpi เนื่องจากมีการใช้เป็นค่าคงที่ PHP จะตรวจสอบว่ามีอยู่หรือไม่ PHP ไม่แสดงคำเตือน(โดยทั่วไป: เนื่องจากค่าคงที่ไม่มีอยู่จึงสันนิษฐานว่าเป็นสตริง)$x
    pi
    Use of undefined constant pi - assumed 'pi'
  • วนซ้ำเป็นครั้งแรก
    • $x()เรียกใช้ฟังก์ชั่น
      เนื่องจาก$xมีค่าก็จะเรียกใช้ฟังก์ชั่นpipi()
  • เก็บค่า$xไว้
    $xตอนนี้มีπแทนpi
  • วนซ้ำเป็นครั้งที่สอง
    • $x()เรียกใช้ฟังก์ชั่น
      ตั้งแต่มีπก็จะเรียกใช้ฟังก์ชั่น$x3.14159...()
    • Fatal Errorπไม่เป็นสตริงฆ่าโปรแกรมที่จุดนี้ด้วย

ขอบคุณ@Titus ที่หาpi()ฟังก์ชั่นนี้ช่วยฉันได้1ไบต์!


เป็นคนดี แต่ฉันคิดว่ามันไม่ถูกต้อง มันไม่ได้วนซ้ำจริงๆ คุณเพิ่มขึ้น$xไปabtก่อนที่จะม้วนตัววิ่ง คุณสามารถแก้ไขได้โดยเพิ่มขึ้นหลังจากวนรอบ
aross


@aross Duh คุณพูดถูกมันไม่ถูกต้อง การเพิ่มขึ้นนั้นผิดที่ มันทำงานได้ตามที่ควรจะเป็น คุณสามารถลองเรียกใช้for($x=abs;;++$x)echo$x,$x();เพื่อทดสอบ abs0abt Fatal error[...]มันควรจะแสดง หรือคล้ายกัน
Ismael Miguel

1
คุณสามารถใช้แทนpi absสิ่งนั้นไม่ได้เตือนแม้แต่ก่อนที่จะทำให้เกิดอันตรายถึงชีวิต
ติตัส

@Titus ฉันลืมไปแล้วเกี่ยวกับฟังก์ชั่นนี้! ฉันรู้ว่าฟังก์ชั่น_ถูกกำหนดในบางระบบ แต่ไม่น่าเชื่อถือ แต่ขอบคุณสำหรับการค้นพบ!
Ismael Miguel

10

GNU sed , 15 13 5 ไบต์

-2 ต้องขอขอบคุณseshoumara
-8 ขอบคุณZeppelin

H;G;D
  1. ผนวกบรรทัดใหม่และพื้นที่พักไว้กับพื้นที่รูปแบบ
  2. ต่อท้ายบรรทัดใหม่และพื้นที่รูปแบบกับพื้นที่พัก
  3. ลบจนถึง newline แรกและเริ่มต้นใหม่

หน่วยความจำหมดอย่างรวดเร็ว:

$ time (echo|sed 'H;G;D')
sed: couldn't re-allocate memory

real    0m1.580s
user    0m0.545s
sys     0m1.012s

สวัสดีแล้วไงs:a\?:&a:gล่ะ มันมีขนาดเล็กลง 1 ไบต์และเพิ่มขนาดรูปแบบสองเท่าต่อการวนซ้ำเช่นกัน
seshoumara

@seshoumara ฉันไม่คิดว่าจะจับคู่สิ่งใดเมื่อช่องว่างรูปแบบว่างเปล่าดังนั้นจึงไม่มีทางเปลี่ยนครั้งแรกได้เลย
Riley

@seshoumara echo -n | sed 's:a\?:&a:g'และไม่มีการส่งออก มันจะเหมือนกับsed 's::a:'ที่ไม่ตรงกับอะไรเลย
Riley

ด้วยecho -nอะไรอย่างที่ได้รับการส่งผ่านไปยัง sed แต่ sed ไม่สามารถเริ่มต้นโดยไม่ต้องใส่โดยการออกแบบ ตรวจสอบลิงค์เมตานี้เพื่อดูว่าecho|sedเป็นวิธีที่ได้รับการยอมรับในการเริ่มความท้าทายสำหรับการเรียกใช้กฎการป้อนข้อมูลที่ไม่มี
seshoumara

@seshoumara ฉันคิดว่ามันจะยังคงให้สตริงที่ว่างเปล่า ที่ดูเหมือนว่าจะทำงานแล้ว ขอบคุณ!
Riley

9

R, 22 25 22 20 18 ไบต์

แก้ไข: ขอบคุณ @Mego สำหรับการชี้ให้เห็นว่า R ไม่สนับสนุนการเพิ่มประสิทธิภาพการโทรหาง

แก้ไข 4: พบโซลูชันที่สั้นกว่าซึ่งเรียบง่าย แต่ค่อนข้างซับซ้อน

repeat(ls(T<-T-1))

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

อาร์กิวเมนต์ชื่อสามารถระบุสภาพแวดล้อมที่ชื่อวัตถุถูกนำมาในหนึ่งในหลายรูปแบบ: เป็นจำนวนเต็ม (ตำแหน่งในsearchรายการ); เป็นชื่อสตริงอักขระขององค์ประกอบในรายการค้นหา หรือเป็นการชัดแจ้งenvironment(รวมถึงการใช้sys.frameเพื่อเข้าถึงการเรียกใช้ฟังก์ชันที่ใช้งานในปัจจุบัน)

สิ่งนี้หมายความว่าในการทำซ้ำครั้งแรกเราจะเรียกใช้ls(-1)ซึ่งจะกลับมาcharacter(0)(มาตรฐานเมื่อพยายามเข้าถึงeverything-except-the-firstองค์ประกอบที่ไม่มีอยู่ของวัตถุประเภทตัวอักษรใด ๆ ) ในระหว่างการทำซ้ำครั้งที่สองTจะลดลงสองและเราก็เรียกls(-3)ว่าในทางกลับกันส่งกลับข้อผิดพลาด:

Error in as.environment(pos) : invalid 'pos' argument

นี่เป็นเพราะเราพยายามที่จะแสดงeverything-except-the-thirdองค์ประกอบ แต่สภาพแวดล้อมในท้องถิ่นมีเพียงตัวแปรTที่จุดนี้ (เช่นls()จะส่งกลับรายการความยาว1ในการทำซ้ำนี้) และข้อผิดพลาดจะถูกส่งกลับ


1
ไม่ฟังก์ชั่นการเรียกซ้ำด้วยการเพิ่มประสิทธิภาพการโทรหางหากมีการ จำกัด การเรียกซ้ำ
Mego

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

9

Befunge-93, 3 ไบต์ (อาจเป็น 1 หรือ 0)

!%!

ลองออนไลน์!

ในการวนซ้ำครั้งแรกของลูปสแต็กจะว่างเปล่าซึ่งเทียบเท่ากับศูนย์ทั้งหมด การดำเนินการ!(ไม่ใช่) จึงแปลงสแต็คท็อปเป็น 1 และการดำเนินการ%(โมดูโล) คำนวณ 0 mod 1 โดยเหลือ 0 การ!ดำเนินการถัดไปจะแปลง 0 เป็น 1 ก่อนที่โปรแกรมตัวนับจะวนรอบและเริ่มลูปอีกครั้ง

ในการวนซ้ำครั้งที่สองการ!ดำเนินการครั้งแรกจะแปลง 1 ซึ่งตอนนี้อยู่ที่ด้านบนสุดของสแต็กเป็น 0%จากนั้นการดำเนินการจะคำนวณ 0 mod 0 ซึ่งจะสร้างการหารด้วยศูนย์ข้อผิดพลาดในล่ามอ้างอิงและทำให้โปรแกรมสิ้นสุดลง

นอกจากนี้ยังมีคำตอบที่น่าเบื่อมากกว่า 1 ไบต์ถึงแม้ว่าฉันไม่แน่ใจว่านี่ถือว่าถูกต้องหรือไม่

"

ลองออนไลน์!

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

ตอนนี้ถ้าคุณต้องการผลักดันกฎจริงๆแล้วยังมีวิธีแก้ปัญหาทางศูนย์อีกด้วย


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

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


8

FALSE, 8 ไบต์

ฉันชอบภาษานี้มาก

1[$][.]#

สิ่งนี้จะส่ง a 1แล้ว[$][.]#วน$ซ้ำในขณะที่เป็นจริง (ซ้ำด้านบนของสแต็ก) และ ( .) ส่งออก ล่ามนี้ขัดข้องหลังจาก1พิมพ์ครั้งเดียว(หลักฐานการวนซ้ำทำงานอย่างน้อยหนึ่งครั้ง) ดูเหมือนว่าจะเป็นข้อบกพร่องในล่ามนี้ โปรแกรมขนาด 9 ไบต์ต่อไปนี้ควรทำงานกับล่ามที่สอดคล้องทั้งหมด:

1[$][..]#

คุณควรลอง DUP ซึ่งโดยทั่วไปแล้วจะเป็น FALSE นั่นคือสิ่งที่ฉันใช้ในการสร้างผลตอบแทน
Mama Fun Roll

@ MamaFunRoll ใช่แล้วฉันลืมว่าคุณกลับมา! ฉันต้องลองอันนั้น : D
Conor O'Brien

@ MamaFunRoll ฉันรัก DUP ฉันเพิ่งเขียนล่าม DUP แล้วฉันก็เล่นกับมัน
ML

@ ConnorO'Brien: ฉันจะบอกว่าทางออกแรกของคุณควรผิดพลาดล่ามใด ๆ ฉันเพิ่งทำการดีบักด้วยล่ามของฉันเองและเห็นได้ชัดว่าครั้งแรก.ที่ลบข้อมูลสแต็กในขณะที่ในวงที่สอง$พยายามที่จะทำซ้ำองค์ประกอบด้านบนของสแต็คที่ว่างเปล่าซึ่งควรนำไปสู่ข้อผิดพลาด ) รุ่นที่สองไม่ควรถูกต้องเนื่องจากยังไม่เสร็จสิ้นลูปแรกเนื่องจากพยายามเข้าถึงสแต็กเปล่าก่อนกำหนด
ML

สำหรับตัวอย่างที่สองของคุณนี่คือการดีบัก Dump แบบเต็มของ DUP ล่ามของฉัน จะเห็นได้ชัดเมื่อคุณเห็นว่า data stack (ds) และ return stack (rs) ทำงานอย่างไรส่วนหลังไม่โปร่งใสใน FALSE
ML

8

C, 21 ไบต์

i;f(){for(;1/!i++;);}

ที่นี่รับประกันได้ว่าจะเริ่มต้นออกเป็นi0

สามารถยืนยันได้ว่าสิ่งนี้จะทำงานอีกครั้งเช่นนั้น:

i;f(){for(;1/!i++;)puts("hi");}
main(){f();}

ซึ่งบนเครื่องของฉันผลลัพธ์ใน:

llama@llama:...code/c/ppcg104323loop$ ./a.out 
hi
zsh: floating point exception (core dumped)  ./a.out

โซลูชันแบบเรียกซ้ำที่สั้นที่สุดที่ฉันพบคือ22 ไบต์ :

f(i){f(i-puts(""-i));}

gccตัดการเรียกหางเท่านั้นที่-O2หรือสูงกว่า ณ จุดที่เราต้องเรียกใช้ฟังก์ชันที่ต้องการputsป้องกันไม่ให้สิ่งทั้งหมดถูกปรับให้อยู่ในตำแหน่งที่เหมาะสม ยืนยันว่าใช้งานได้:

llama@llama:...code/c/ppcg104323loop$ cat loop.c       
main(){f();}
f(i){f(i-puts(""-i));}
llama@llama:...code/c/ppcg104323loop$ gcc -O2 -S loop.c 2>/dev/null
llama@llama:...code/c/ppcg104323loop$ grep call loop.s
    call    puts
    call    f

ต่อไปนี้เป็นโปรแกรมเต็มรูปแบบซึ่งสันนิษฐานว่าถูกเรียกโดยไม่มีอาร์กิวเมนต์บรรทัดคำสั่งที่22 ไบต์ :

main(i){for(;1/i--;);}

ซึ่งเทียบเท่ากับการทำงานของความยาวเดียวกัน:

f(i){for(i=1;1/i--;);}

ฟังก์ชั่นแบบนี้ถือว่าเหมือนกับ main หรือไม่? ถ้าเป็นเช่นนั้นอาร์กิวเมนต์แรกคือความยาวของรายการอาร์กิวเมนต์ (ซึ่งคือ 1 ชื่อที่ใช้เรียกมัน)
Riley

หรือการลงทะเบียนอาร์กิวเมนต์ยังคงมีค่าที่ได้จากการเรียกหลัก
Riley

@Riley Ahh, ทฤษฎีหลังดูเหมือนจะเป็นกรณีตามหลักฐานจากข้อเท็จจริงที่ว่าจำนวนที่เพิ่มขึ้นตามอาร์กิวเมนต์บรรทัดคำสั่งจะถูกเพิ่ม ขอบคุณสำหรับความเข้าใจ!
Doorknob

ฉันไม่แน่ใจว่าคุณเรียกมันอย่างไรในการเดาครั้งแรกของฉัน แต่ฉันควรจะเหมือนกับอาร์กิวเมนต์แรกของฟังก์ชันที่เรียกว่า f
Riley

อ๋อ, tio
Riley

6

MATLAB, 18 ไบต์

สิ่งนี้สามารถเรียกใช้เป็นสคริปต์:

for j=1:2;j(j);end

ย้ำแรกคือปรับตั้งแต่เป็นเพียงj(1) 1การวนซ้ำครั้งที่สองล้มเหลวโดยมีข้อผิดพลาดของอาร์เรย์ไม่j(2)เกินขอบเขตซึ่งเกินขนาดของjซึ่งเป็นอาร์เรย์ 1x1

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

while i/i;i={};end

เมื่อทำงานในพื้นที่ทำงานที่ตัวแปรiไม่ได้รับการกำหนดไว้ในยังนี้จะถือว่าเป็นหน่วยจินตภาพดังนั้นi i/i = 1ในวงแรกที่ได้รับมอบหมายสร้างอาร์เรย์เซลล์ที่ว่างเปล่าที่เรียกว่าi={} iในการวนซ้ำครั้งที่สองการวนซ้ำจะออกด้วย "ตัวดำเนินการที่ไม่ได้กำหนด '/' สำหรับอาร์กิวเมนต์อินพุตของประเภท 'cell'


ทั้งสองอย่างยอดเยี่ยม! คุณอาจจะรู้เรื่องนี้ แต่j(2)โดยปกติแล้วจะให้เมทริกซ์ขนาด 2 คูณ 2 ด้วย0+1i
Stewie Griffin

ขอบคุณ! นั่นเป็นความจริงใน Octave แต่ไม่ใช่ใน MATLAB ฉันคิดว่า
MattWH

6

Perl 6 , 13 ไบต์

loop {5[$++]}

ดัชนีดัชนีตัวอักษรจำนวนเต็มในการวนซ้ำไม่สิ้นสุด
อาศัยข้อเท็จจริงที่ว่าค่าสเกลาร์นั้นสามารถใช้ไวยากรณ์ของการทำดัชนีอาร์เรย์กับดัชนี0(คืนค่าตัวเอง) แต่ส่งIndex out of rangeข้อผิดพลาดสำหรับดัชนีอื่น ๆ


6

QBasic ขนาด 17 ไบต์

รหัสนี้แปลกมาก

DO
i=11+a(i)
LOOP

มันทำงานอย่างไร

ใน QBasic ตัวแปรจะถูกกำหนดค่าเริ่มต้นล่วงหน้า ตัวแปรปกติที่ไม่มีคำต่อท้ายชนิดใด ๆ เช่นiที่นี่จะถูกกำหนดค่าเริ่มต้นเป็นศูนย์

ยกเว้นถ้าคุณพยายามห้อยลงในตัวแปรนั้นเหมือนอาร์เรย์ ... ซึ่งในกรณีนี้มันจะเป็นอาร์เรย์ 11 ศูนย์ *

ในครั้งแรกที่ผ่านลูปดังนั้นจึงiเป็น0และaเป็นอาร์เรย์ a(i)ให้องค์ประกอบศูนย์ของอาร์เรย์ (ซึ่งก็คือ0) ทุกอย่างดีและดี เราตั้งiไป11และห่วง แต่ตอนนี้11ไม่ได้เป็นดัชนีที่ถูกต้องสำหรับอาร์เรย์และโปรแกรมที่หยุดด้วยaSubscript out of range

เวอร์ชัน 19- ไบต์ที่แสดงสิ่งที่ดีกว่า:

DO
?a(i)
i=i+1
LOOP

สิ่งนี้จะพิมพ์0สิบเอ็ดครั้งก่อนที่จะเกิดข้อผิดพลาด


* แนวคิดมันเป็นอาร์เรย์ 10 องค์ประกอบ สิ่งส่วนใหญ่ใน QBasic นั้นได้รับการจัดทำดัชนี 1 ตัว แต่อาร์เรย์นั้นอาจไม่ได้เป็นไปได้สำหรับเหตุผลในการนำไปใช้ เพื่อให้สิ่งต่าง ๆ ทำงานได้อย่างที่คาดหวังสำหรับโปรแกรมเมอร์ QBasic จะแสดงรายการเพิ่มเติมเพื่อให้คุณสามารถใช้ดัชนี 1 ถึง 10 ดัชนี 0 อย่างไรก็ตามยังสามารถเข้าถึงได้อย่างสมบูรณ์ ไปคิด


QBasic และอาร์เรย์สนุกจะหยุดที่ไหน!
steenbergh

เนื่องจากข้อผิดพลาดไม่จำเป็นต้องอยู่ในลูปที่สองคุณทำi=1+a(i)ไม่ได้ใช่ไหม
Quelklef

@Quelklef i=i+1+a(i)ไม่มีคุณจะต้องทำ มิฉะนั้นดัชนี1จะไม่หายไปด้านบนซึ่งไม่ใช่ข้อผิดพลาด
DLosc

@DLosc โอ้คุณพูดถูก
Quelklef

5

Haskell ขนาด 15 ไบต์

f(a:b)=f b
f"a"

f"a"เรียกใช้ซ้ำผ่านสตริง "a" โดยปล่อยอักขระตัวแรกและในที่สุดก็ล้มเหลวเมื่อสิ้นสุดโดยมีNon-exhaustive patterns in function fข้อยกเว้นเนื่องจากfถูกกำหนดไว้สำหรับสตริงที่ไม่ว่างเท่านั้น


5

C #, 71 38 ไบต์

เนื่องจากคุณให้ตัวอย่างใน C # ที่นี่รุ่นอื่น golfed

และต้องขอบคุณ pinkfloydx33

void c(){checked{for(uint i=1;;i--);}}

สั้นกว่าParse.ToString()และมากกว่าที่Parse($"{c--}") ฉันทิ้งไว้ในใจcheckedเพราะมันยาวเกินไปสำหรับคำหลัก ยากที่จะสั้นกว่าParse(c.ToString())

คำตอบเดิม

class p{static void Main(){for(int c=0;;c--)uint.Parse(c.ToString());}}

นี้จะเริ่มc=0แล้วพร่องมันเมื่อจะทำให้เกิดการ:c=-1uint.Parse

Unhandled Exception: System.OverflowException: Value was either too large or too small for a UInt32.

เวอร์ชันที่ไม่ได้รับการตรวจสอบและตรวจสอบว่าลูปนั้นทำงานอย่างน้อยหนึ่งครั้ง

class p {
    static void Main() {
        for(int c=0;;c--) {
            System.Console.Write(c);
            uint.Parse(c.ToString());
        }
    }
}

for(int c=0;;)uint.Parse($"{c--}");
pinkfloydx33

1
checked{for(uint c=1;;)c--;}
pinkfloydx33

ตกลงว้าว! ไม่ทราบเกี่ยวกับชวเลข '$'!
MrPaulch

4

CJam , 4 ไบต์

1{}g

ลองออนไลน์!

การวนซ้ำครั้งแรกของ{}gลูปว่างจะปรากฏขึ้น1ซึ่งจะบอกให้ดำเนินการต่อ การทำซ้ำครั้งที่สองพยายามแสดงเงื่อนไขอื่น แต่สแต็กว่างเปล่าดังนั้นโปรแกรมจึงล้มเหลว


4

ชุดประกอบ x86 (ไวยากรณ์ของ AT&T) ขนาด 40 ไบต์

f:
mov $1,%eax
A:
div %eax
dec %eax
je A

ประกาศฟังก์ชัน f ซึ่งหาร 1 ด้วย 1 ในการวนซ้ำครั้งแรกจากนั้นพยายามหาร 0 ด้วย 0 และข้อผิดพลาด


คุณสามารถบันทึกได้ 4 ไบต์โดยเปลี่ยนไปใช้ไวยากรณ์ของ Intel :)
mriklojn

6
เรามักจะให้คะแนนการชุมนุมตามขนาดของรหัสไบต์ที่สร้างขึ้นไม่ใช่คำแนะนำที่มนุษย์อ่านได้
Dennis

@Dennis assmebled assembly เป็นภาษาเครื่อง แต่ใช่นี้สามารถเรียกร้องสั้นกว่ามากในรูปแบบภาษาเครื่อง
Jasen

กำจัด f-label และ mov สลับระหว่าง dec และ div และคุณสามารถกำจัดได้มากกว่าเดิม
ชัดเจน

4

CJam, 4 ไบต์

P`:~

P`3.141592653589793สร้างสตริง :~ประเมินตัวละครแต่ละตัว 3เป็นรหัสที่ถูกต้องใน CJam ซึ่งจะคืนค่า 3 ในการทำซ้ำครั้งถัดไป.ทำให้เกิดข้อผิดพลาดเนื่องจากต้องมีตัวเลขหรือตัวดำเนินการที่ตามมา




4

แบตช์22 20 ไบต์

:a
set i=%i%1
goto a

คำอธิบาย

นี่คือการวนซ้ำไม่สิ้นสุดที่ผนวก1เข้ากับสตริงว่างเริ่มต้น ในที่สุดสิ่งนี้จะผ่านความยาวสตริงสูงสุด 8192 และความล้มเหลว บนเครื่องของฉันใช้เวลาประมาณ 30 วินาที


ดี! คุณสามารถบันทึก 2 ไบต์โดยใช้จุดสิ้นสุดบรรทัด Unix
ต้มตุ๋น

คุณสามารถใช้% 0 ซึ่งเป็นชื่อไฟล์แทนป้ายกำกับและข้ามไป
YourDeathIsComing

ฉันไม่แน่ใจว่ามันหักกฎการเรียกซ้ำหางหรือไม่
SomethingDark

4

JavaScript ขนาด 9 ไบต์

for(;;i);

สิ่งนี้จะทำงานหนึ่งครั้งจากนั้นจึงพ่นReferenceError: i is not definedซึ่งจะหยุดลูป

// With a console.log(1) to see that it runs once.
for(;;i)console.log(1);


ยกตัวอย่างต่อไปนี้เป็น<increment>จุดสิ้นสุดของรอบแรกหรือจุดเริ่มต้นของรอบที่สองหรือไม่?

0:for(<init>;<test>;<increment>)
1:{
2:  <statement>;
3:}

1 / ฉันเห็นมัน

หลังจากเปลี่ยนจากบรรทัดที่ 0 เป็นบรรทัดที่ 3 จากนั้นกลับไปที่บรรทัดที่ 0 มันให้ความรู้สึกเหมือนว่าครบวงจรแล้ว
นั่นจะทำให้<increment>จุดเริ่มต้นของรอบที่สอง
- รอบแรก: <init>-> <test>-> <statement>
- รอบที่สอง: <increment>-> <test>-><statement>

2 / Whileเทียบเท่า

0:<init>;
1:while(<test>)
2:{
3:  <statement>;
4:  <increment>;
5:}

ในเทียบเท่านี้เป็นจุดสิ้นสุดของรอบแรกและมันให้ความรู้สึกเหมือนว่ามันจะเป็นเช่นเดียวกันกับ นั่นจะทำให้จบรอบแรก - รอบแรก: -> -> - รอบที่สอง: -> ->while<increment>for
<increment>
<test><statement><increment>
<test><statement><increment>

พบคำสั่ง 3 / A สองครั้ง

ครบวงจรจะสมบูรณ์เมื่อพบคำสั่งสองครั้ง คำสั่งแรกพบครั้งที่สองคือ
นั่นจะทำให้จบรอบแรก - รอบแรก: -> -> - รอบที่สอง: -> -><test>
<increment>
<test><statement><increment>
<test><statement><increment>

4 / เป็นการตั้งค่า

<init>เป็นเพียงการตั้งค่าอะไรก็ตามที่เป็นสิ่งจำเป็นสำหรับรอบแรก เป็นเพียงการตั้งค่าอะไรก็ตามที่เป็นสิ่งจำเป็นสำหรับรอบที่สอง นั่นจะทำให้จุดเริ่มต้นของรอบที่สอง - รอบแรก: -> -> - รอบที่สอง: -> ->
<increment>
<increment>
<init as a setup><test><statement>
<increment as a setup><test><statement>


ข้อกำหนดทางภาษาของECMAScript® 2016

รันไทม์ของ for(<init>;<test>;<increment>)<statement>;

ให้ varDcl เป็นผลลัพธ์ของการประเมิน <init>เป็นผลมาจากการประเมิน
ReturnIfAbrupt (varDcl)
กลับมา ForBodyEvaluation ( <test>, <increment>, <statement>«» labelSet)

มีสามรูปแบบดังนั้นฉันจึงเลือกที่สั้นที่สุดที่นี่ไม่มีความแตกต่าง:
- ไม่ว่า<init>มันจะไม่ได้เป็นส่วนหนึ่งของการทำซ้ำครั้งแรก
- สิ่งที่เกี่ยวข้องมีอยู่ใน ForBodyEvaluation

รายละเอียดของ ForBodyEvaluation (<test> , <increment>, <statement>«» labelSet)

0 อนุญาตให้ V ไม่ถูกกำหนด
1 แสดงไหม CreatePerIterationEnvironment (perIterationBindings)
2 ซ้ำ
3 หากไม่ได้ [ว่าง] จากนั้น
4 Let testRef <test>เป็นผลมาจากการประเมิน
5 ให้ค่าทดสอบเป็นอย่างไร GetValue (testRef)
6 ถ้า ToBoolean (testValue) เป็นเท็จให้ส่งคืน NormalCompletion (V)
ผล 7 <statement>อนุญาตเป็นผลมาจากการประเมิน
8 ถ้า LoopContinues (ผลลัพธ์ labelSet) เป็นเท็จให้ส่งคืนเสร็จสมบูรณ์ (UpdateEmpty (ผลลัพธ์ V))
9 หากผลลัพธ์ [[ค่า]] ไม่ว่างเปล่าให้ V เป็นผลลัพธ์ [[ค่า]]
10 แสดงไหม CreatePerIterationEnvironment (perIterationBindings)
11 ถ้าไม่ใช่ [empty] ดังนั้น
12 ให้ incRef เป็นผลลัพธ์ของการประเมิน<increment>เป็นผลมาจากการประเมิน
13 แสดงไหม GetValue (incRef)

6 / ฉันเห็นมัน

รอบการทำงานเต็มรูปแบบของส่วนการทำซ้ำ
นั่นจะทำให้<increment>จบรอบแรก
- รอบแรก: <test>-> <statement>-> <increment>/ ในคำอื่น ๆ จากบรรทัด 3 ถึงบรรทัดที่ 13
- รอบที่สอง: <test>-> <statement>-><increment> / ในคำอื่น ๆ จากบรรทัดที่ 3 ถึง 13

7 / รอบเป็นซ้ำ

CreatePerIterationEnvironmentวงจรเริ่มต้นด้วย
ดังนั้นเมื่อCreatePerIterationEnvironmentพบวงจรใหม่จึงเริ่มต้นขึ้น
นั่นจะทำให้<increment>จุดเริ่มต้นของรอบที่สอง
- รอบแรก: <test>-> <statement>/ ในคำอื่น ๆ จากบรรทัดที่ 1 ถึงบรรทัดที่ 9
- รอบที่สอง: <increment>-> <test>-><statement> / ในคำอื่น ๆ จากบรรทัดที่ 10 วนลูปจนถึงบรรทัดที่ 9


คือ <increment>จุดสิ้นสุดของรอบแรกหรือจุดเริ่มต้นของรอบที่สองหรือไม่

คำอธิบายที่ถูกต้องคือ 6 หรือ 7


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

1
เนื่องจากfor(a;b;c)d;ค่อนข้างคร่าวๆa;while(b){d;c;}ฉันจึงอยากบอกว่าข้อผิดพลาดยังคงเกิดขึ้นในการทำซ้ำครั้งแรก (ก่อนที่จะตรวจสอบสภาพของลูปเป็นครั้งที่สอง)
ETHproductions

@Hurkyl การทำซ้ำครั้งแรกเริ่มต้นด้วยการเริ่มต้นดังนั้นฉันคิดว่าการเพิ่มขึ้นควรเป็นจุดเริ่มต้นของการทำซ้ำที่สอง
Hedi

4
หากคุณอ่านข้อมูลจำเพาะคุณจะเห็นว่าการดำเนินการที่เพิ่มขึ้นเป็นส่วนสุดท้ายของการทำซ้ำและยังคงอยู่ในการทำซ้ำครั้งแรก
Nit

3
@Hedi ฉันไม่เห็นว่ามีความเกี่ยวข้องเลย การดำเนินการที่เพิ่มขึ้นเป็นส่วนหนึ่งของลูปแรก ในการใช้ถ้อยคำใหม่เมื่อมีการเรียกการดำเนินการที่เพิ่มขึ้นการวนซ้ำยังไม่เสร็จสิ้นการทำงานแบบเต็มครั้งเดียว
Nit

4

INTERCAL 12 ไบต์

(1)DO(1)NEXT

ลองออนไลน์!

NEXTเป็นคำสั่งควบคุมการไหลหลักของ INTERCAL-72 (การแก้ไขในภายหลังได้รับการแนะนำCOME FROMซึ่งมีชื่อเสียงมากขึ้น แต่ไม่ได้อยู่ในภาษาต้นฉบับและการใช้งาน INTERCAL ที่เสร็จสิ้นทั้งหมดฉันทราบถึงการสนับสนุนNEXTความเข้ากันได้ของระบบย้อนหลัง ฉันไม่รู้สึกว่าจำเป็นต้องตั้งชื่อ INTERCAL-72 เป็นพิเศษในชื่อเรื่อง)

เมื่อใช้NEXTในการวนซ้ำคุณควรจะใช้RESUMEหรือFORGETเพื่อเพิ่มพื้นที่ว่างที่มันใช้ในการจดจำตำแหน่งของโปรแกรม RESUMEretroactively ทำให้NEXTสิ่งที่คล้ายกับการเรียกใช้ฟังก์ชัน (แม้ว่าคุณจะสามารถกลับมาจากฟังก์ชั่นอื่นนอกเหนือจากที่คุณอยู่) ในขณะที่FORGETทำให้มันเป็นสิ่งที่คล้ายกับคำสั่ง GOTO หากคุณไม่ทำอย่างใดอย่างหนึ่ง (และโปรแกรมนี้ไม่ได้) โปรแกรมจะทำงานล้มเหลวหลังจากทำซ้ำ 80 ครั้ง (พฤติกรรมนี้จะถูกระบุในสเปค INTERCAL จริง ๆ )

มันค่อนข้างคลุมเครือไม่ว่าจะนับเป็นการเรียกซ้ำที่ไม่ จำกัด (ไม่อนุญาตในคำถาม); คุณสามารถใช้NEXTการเรียกใช้ฟังก์ชันนี้ในกรณีนี้มันจะเป็นฟังก์ชันแบบเรียกซ้ำได้อย่างมีประสิทธิภาพ แต่มีข้อมูลไม่เพียงพอที่นี่เพื่อตรวจสอบว่าเรากำลังทำการเรียกใช้ฟังก์ชันหรือไม่ อย่างน้อยฉันก็โพสต์สิ่งนี้อยู่แล้วเพราะมันไม่ได้ละเมิดกฎอย่างไม่น่าสงสัยและการใช้งาน INTERCAL ที่เพิ่มประสิทธิภาพของ "tail call" ไม่เพียง แต่จะเป็นการละเมิดข้อกำหนด แต่ยังทำให้โปรแกรมที่มีอยู่ส่วนใหญ่หยุดทำงานเพราะกลับมาจาก "ฟังก์ชั่นที่ไม่ถูกต้อง" เป็นวิธีหลักในการทำคำสั่ง IF ที่เทียบเท่ากัน

นี่คือข้อความแสดงข้อผิดพลาดที่สร้างขึ้นโดย C-INTERCAL:

ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
    ON THE WAY TO 1
        CORRECT SOURCE AND RESUBNIT

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


ข้อผิดพลาดพูดจริง ๆCORRECT SOURCE AND RESUBNITหรือไม่ เช่นเดียวกับการพิมพ์ผิดในข้อความผิดพลาด C-INTERCAL ดั้งเดิม?
Andrakis

1
@Andrakis: ใช่มันเป็นเช่นนั้น พิมพ์ผิดนั้นได้รับการเก็บรักษาอย่างระมัดระวังเป็นเวลาหลายปี

3

Pyth, 3 ไบต์

W1w

ลองออนไลน์

W1อยู่while 1:ใน Python ร่างกายวนพิมพ์บรรทัดอ่านจาก STDIN ซึ่งเกิดปัญหาสำหรับการทำซ้ำที่สองเมื่อรหัสจะทำงานด้วยการป้อนข้อมูลที่ว่างเปล่า

หากลูปที่ใช้#(วนซ้ำจนกว่าข้อผิดพลาด) จะถูกแบน (ฉันถือว่าเป็นเช่นนั้น) ฉันคิดว่านี่เป็นวิธีที่สั้นที่สุดที่จะได้รับ


3

Python 3, 29 ไบต์

i=1
def x(n):del i;x(i)
x(i)

ง่ายจริงๆ ในการโทรครั้งที่สองไปที่ x ฉันไม่ได้อยู่ที่นั่นและ Python บ่นเกี่ยวกับเรื่องนี้


3

เขาวงกต 3 ไบต์

#(/

ลองออนไลน์!

เช่นเดียวกับภาษา 2D ส่วนใหญ่เขาวงกตไม่มีโครงสร้างวนลูปที่ชัดเจน แต่รหัสใด ๆ ที่ถูกจัดวางเพื่อที่จะถูกเรียกใช้งานหลายครั้งในแถวนั้นจะเป็นการวนซ้ำในภาษาเหล่านี้ สำหรับกรณีของ Labyrinth โปรแกรมเชิงเส้นอย่างง่ายจะทำหน้าที่เป็นลูปเนื่องจากตัวชี้คำสั่งจะเด้งกลับไปกลับมา หากโปรแกรมคือabc(สำหรับคำสั่งบางa, bและc) แล้วการดำเนินการที่เกิดขึ้นจริงจะเป็นabcbabcbabcb...เช่นนั้นมันจะทำงานabcbในวง จำกัด

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

#   Push stack depth.   [... 0]
(   Decrement.          [... -1]
/   Divide.             [... 0]
(   Decrement.          [... -1]
#   Push stack depth.   [... -1 1]
(   Decrement.          [... -1 0]
/   Divide.             Crashes with division-by-zero error.

3

Bash, 11 (ไม่เป็นคู่กัน)

exec $0 1$@

สคริปต์นี้เรียกใช้งานแบบวนซ้ำโดยผนวก1เข้ากับ args ที่ส่งผ่านในแต่ละการทำซ้ำ ฉันคิดว่าสิ่งนี้นับว่าเป็น TCO เพราะ exec นำพื้นที่กระบวนการมาใช้ใหม่ แต่ไม่กินหมด มันเป็นเส้นเขตแดนที่ไม่แข่งขันเพราะใช้เวลาประมาณ 10 นาทีก่อนที่จะถูกฆ่าในเครื่องของฉัน - YMMV


1
exec $0 1$@$@ ยุติเร็วขึ้นมาก แต่มีความยาวสองอักขระ
Jasen

3

cmd, 34 ไบต์

for /l %i in (0,1,10) do color %i0

สิ่งนี้จะวน%iจาก 0 ถึง 10 colorคำสั่ง(โบราณ) จะยอมรับอาร์กิวเมนต์ที่มีทศนิยม 2 หลัก (hexa-) อย่างมีความสุข ด้วยอาร์กิวเมนต์100มันจะล้มเหลวพิมพ์ข้อความช่วยเหลือและการตั้งค่าERRORLEVELเป็น 1

หลักฐานการวนรอบทำงานอย่างน้อยหนึ่งครั้ง: สีของเปลือกหอยของคุณจะแตกต่างกัน!

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