Vòng lặp tự động phá hủy ngắn nhất


61

Nhiệm vụ của bạn là viết một chương trình đầy đủ hoặc chức năng mà mất không có đầu vào và chạy bất kỳ loại vòng lặp ( while, for, foreach, do, do-while, do-loop, goto, đệ quy, vv) mà sẽ kết thúc trong gây ra lỗi, có nghĩa là chương trình phải dừng lại tự chạy và lối ra.

Quy tắc:

  1. Lỗi phải là lỗi thời gian chạy, ngoại lệ chưa được xử lý hoặc bất cứ điều gì làm cho chương trình tự kết thúc.
  2. Lỗi phải tạo ra điểm dừng và thoát khỏi chương trình mà không gọi rõ ràng exit;(hoặc tương đương) tại một số điểm.
  3. Các thông báo như Warning:, Notice:v.v., không khiến chương trình tự kết thúc không hợp lệ. Ví dụ, trong các phân chia PHP bằng 0 tạo ra một Warningthông báo nhưng chương trình sẽ không dừng lại và vẫn sẽ chạy, đây không phải là một câu trả lời hợp lệ.
  4. Vòng lặp phải chạy ít nhất một chu kỳ đầy đủ. Nói cách khác, lỗi có thể xảy ra bắt đầu từ chu kỳ thứ hai và hơn thế nữa. Điều này là để tránh gây ra lỗi sử dụng cú pháp mã không chính xác: mã phải đúng về mặt cú pháp.
  5. Vòng lặp có thể là vô hạn (ví dụ for(;;);) nếu nó tuân thủ các quy tắc đã nói ở trên, nhưng phải mất không quá 2 phút để tự kết thúc trong một lỗi thời gian chạy.
  6. Đệ quy không có Tối ưu hóa cuộc gọi Tail là không hợp lệ ( 1 , 2 ).
  7. Đây là nên mã ngắn nhất sẽ thắng.
  8. Sơ hở tiêu chuẩn bị cấm.

Ví dụ C # ( kiểm tra trực tuyến ):

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

Bảng xếp hạng:

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>

Cảm ơn Martin Ender cho Đoạn trích bảng dẫn


Nói rõ hơn, đệ quy không có TCO có thể được sử dụng miễn là lỗi không xảy ra với quá nhiều đệ quy, đúng không? (Ví dụ: một hàm đệ quy có lỗi trong lần đệ quy thứ hai)
ETHproductions

@ETHproductions Nó được đề xuất bởi Dennis trong trò chuyện: "Có thể khó quyết định nếu một chu trình đầy đủ đã hoàn thành trong trường hợp này [đệ quy]. Đệ quy đệ quy phù hợp với dự luật, nhưng chỉ TCO thực sự hoàn thành một chu kỳ nếu việc thực thi bị hủy bỏ do một lỗi. [...] Tôi muốn nói đệ quy mà không có TCO là không hợp lệ. "
Mario

Trong for(a;b;c)d;, sau khi tuyên bố kết thúc chu kỳ đầu tiên? Có hợp lệ để phá vỡ trong ctuyên bố đầu tiên của tuyên bố?
Hedi

1
@Hedi Đây là ý kiến ​​khiêm tốn của tôi (không phải OP): Tất cả các mục phải hoàn thành một chu kỳ đầy đủ, nghĩa là chúng phải bước vào chu kỳ thứ hai ; điều này có nghĩa là ít nhất một câu lệnh được chạy lần thứ hai . Vì thứ tự thực hiện trong ví dụ của bạn là a, b, d, c, b, d, c, ..., blà bắt đầu của chu kỳ và phải được chạy ít nhất lần thứ hai.
Sản phẩm ETH

2
Tôi không muốn bắt đầu bất kỳ rắc rối nào nhưng vì chương trình (chức năng cho vấn đề đó) không được phép sử dụng bất kỳ đầu vào nào, tất cả các giải pháp đệ quy có tham số đều không hợp lệ vì tham số là đầu vào.
BrainStone

Câu trả lời:


33

MATL , 5 1 byte

Ý tưởng được lấy từ câu trả lời CJam của @ MartinEnder

`

Hãy thử trực tuyến!

`    % 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

Phiên bản cũ

2:t"x

Hãy thử trực tuyến!

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
Hoạt động ngoại tuyến là tốt. Không có đầu vào có nghĩa là bạn có thể giả định đầu vào trống.
Dennis

@Dennis Hm chương trình ngoại tuyến sẽ tiếp tục chờ người dùng nhập liệu. Đầu vào là tương tác, tức là được yêu cầu khi cần trong phiên bản ngoại tuyến. Vì vậy, chương trình sẽ chờ đợi vô thời hạn. Không chắc chắn mà tính?
Luis Mendo

Không chắc chắn chính xác làm thế nào MATL hoạt động nội bộ, nhưng nếu bạn thực thi nó trong một môi trường không có khả năng yêu cầu đầu vào (chẳng hạn như phụ trợ của TIO), nó sẽ không thể nhận được bất kỳ đầu vào nào. Ngoài ra, nhấn Ctrl-D hoặc tương đương phụ thuộc vào hệ điều hành sẽ được phép gửi đầu vào trống.
Dennis

35

Python, 16 byte

Cách tiếp cận chia 0 không thú vị:

for x in 1,0:x/x

Các phép tính lặp đầu tiên 1 / 1, hoạt động tốt. Lặp lại thứ hai cố gắng tính toán 0 / 0, dẫn đến ZeroDivisionErrorbị ném.

17 byte (yêu thích cá nhân)

i=1
while i:del i

Ban đầu, i=1đó là sự thật, vì vậy vòng lặp được nhập vào.

Lần đầu tiên vòng lặp được chạy, biến ibị xóa.

Điều này có nghĩa là, lần thứ hai, ikhông còn là một biến và do đó đánh giá của nó không thành công vớiNameError: name 'i' is not defined.


Một giải pháp 15 byte khác sẽ là def _():_()(dòng mới) _(), vì Python không tối ưu hóa đệ quy đuôi. Tuy nhiên, điều này vi phạm quy tắc số 6.


Giải pháp 17 byte cũng làm việc nếu bạn thay thế while ivới while 1vì nó cố gắng xóa imột lần nữa;
dùng6245072

2
@ user6245072 yep, cả hai đoạn có thể được sửa đổi một cách tầm thường cho nhiều giải pháp hoạt động
FlipTack

Bạn có thể sử dụng delthủ thuật của mình với tích hợp để cạo thêm một vài câu : while 1:del id.
DSM


18

Thạch , 3 2 byte

Ṿß

Giết chính nó bằng cách hết bộ nhớ. Tại địa phương làm như vậy sau ~ 100 giây.

Hãy thử trực tuyến! (giấy chứng tử trong ngăn kéo Debug )

Làm thế nào nó hoạt động

Ṿß  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.

Một vài lần lặp đầu tiên mang lại:

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

Sau đó, nó trở nên thật xấu xí, thật nhanh.


Giới hạn bộ nhớ của thạch là gì?
tuskiomi

Jelly không có giới hạn bộ nhớ rõ ràng, vì vậy bất cứ điều gì Python có thể giải quyết. Việc sử dụng bộ nhớ tăng gấp đôi với mỗi lần lặp, do đó, điều này sẽ làm cạn kiệt tất cả bộ nhớ khả dụng khá nhanh.
Dennis

28
Vì vậy, cứ sau 2 năm, chúng tôi sẽ có thể thực hiện một lần lặp khác
tuskiomi

Vì vậy, sẽ thất bại điều kiện số 5 trên máy chậm với nhiều RAM?
Nhà vật lý điên

@MadPhysicist Đúng vậy. Đây là một vấn đề cố hữu với giới hạn thời gian mặc dù. Tuân thủ phụ thuộc rất nhiều vào chương trình mà máy đang chạy.
Dennis

13

V , 2 byte

òl

Hãy thử trực tuyến!

Đây là thử thách hoàn hảo cho V vì tôi đã làm điều đó mọi lúc! Trong thực tế, V thậm chí không có bất kỳ điều kiện nào, nó chỉ có các chức năng phá vỡ một lỗi. Trong trường hợp này, òphương tiện "lặp lại mãi mãi" và lphương tiện "di chuyển đúng".

Trong một bộ đệm trống (không có đầu vào), nó sẽ bị hỏng ở lần đầu tiên và không tạo ra đầu ra. Nếu có đầu vào, nó sẽ phá vỡ khi chúng tôi di chuyển đăng ký tự cuối cùng của đầu vào, và đầu ra tất cả các đầu vào (làm này cũng là một chương trình con mèo)


3
Chờ đã, lcó nghĩa là "di chuyển đúng"? Không phải "di chuyển left"?
Conor O'Brien

1
@ ConorO'Brien yep. Thực sự có một số lý do lịch sử tốt cho việc này.
DJMcMayhem

3
Thử thách đòi hỏi các câu trả lời để sụp đổ ở lần lặp thứ hai trở lên, không phải ở lần lặp đầu tiên.
Martin Ender

11

JavaScript (ES6), 13 byte

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

Đây là một hàm đệ quy chạy tốt một lần, sau đó ném ReferenceError: a is not definedvà thoát.

Đây là phiên bản 15 byte không ES6:

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

Điều này chạy tốt một lần, sau đó ném TypeError: i is undefinedvà thoát.


10

Bash 4.2, 22 byte

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

Không hoạt động trong TIO vì nó có Bash 4.3 và lỗi tôi đang mắc phải cuối cùng đã được sửa.

xác minh

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

Sự cố này xảy ra khi chương trình cố gắng tính toán 2 63 mod -1 , bị lỗi trong Bash 4.2 và các phiên bản cũ hơn do một lỗi đã biết.


10

PHP, 22 21 20 18 byte

Điều này phụ thuộc vào PHP cho phép một người đặt tên hàm cho một biến và cố gắng chạy nó.

Điều này chỉ đơn giản là nối tên của pihàm hai lần. Điều này giết chết PHP với a Fatal Error: Uncaught Error: Call to undefined function pipi() in [...][...].

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

Điều này hoạt động tương tự như câu trả lời cũ của tôi.


Câu trả lời cũ, 20 byte

PHP cho phép bạn tăng các ký tự, sử dụng toán tử gia tăng. Nó chỉ hoạt động trên a-zphạm vi, nhưng là đủ.

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

Tôi tin rằng điều này đáp ứng tất cả các điểm cần thiết và vòng lặp sẽ chạy một lần.

Bạn có thể thấy nếu bởi vì bạn sẽ nhận được lỗi Fatal error: Function name must be a string.


Làm thế nào điều này hoạt động, từng bước:

  • Chỉ định picho $x.
    piđang được sử dụng như một hằng số, PHP sẽ kiểm tra nếu tồn tại.
    Vì nó không có, PHP hiển thị một cảnh báo Use of undefined constant pi - assumed 'pi'(Về cơ bản: vì hằng số không tồn tại, nên nó được coi là một chuỗi)
  • Lặp lại lần đầu tiên
    • Chạy chức năng $x().
      $xcó giá trị pi, nó sẽ chạy hàm pi().
  • Lưu trữ giá trị trong $x.
    $xbây giờ có π, thay vìpi
  • Vòng lặp lần thứ hai
    • Chạy chức năng $x().
      Kể từ khi $xcó π, nó sẽ chạy hàm 3.14159...().
    • π không phải là một chuỗi, giết chương trình tại thời điểm này với a Fatal Error.

Cảm ơn @Titus đã tìm thấy pi()chức năng, tiết kiệm cho tôi 1 byte!


Đẹp một, nhưng tôi không nghĩ nó hợp lệ. Nó không thực sự chạy vòng lặp một lần. Bạn tăng $xlên abttrước khi cơ thể vòng lặp chạy. Bạn có thể khắc phục điều đó bằng cách tăng sau vòng lặp.
vào

Tôi đã nghĩ đến một cách tiếp cận khác
từ

@aross Duh, Bạn nói đúng, nó không hợp lệ. Sự gia tăng là ở sai chỗ. Nó đang làm việc như bây giờ. Bạn có thể thử chạy for($x=abs;;++$x)echo$x,$x();để kiểm tra. Nó sẽ hiển thị abs0abt Fatal error[...]. Hoặc tương tự.
Ismael Miguel

1
Bạn có thể sử dụng pithay vì abs. Điều đó thậm chí không đưa ra một cảnh báo trước khi nó ném chết người.
Tít

@Titus Tôi hoàn toàn quên mất chức năng đó! Tôi biết rằng chức năng _được xác định trong một số hệ thống, nhưng không đáng tin cậy. Nhưng cảm ơn bạn đã tìm thấy điều đó!
Ismael Miguel

10

GNU sed , 15 13 5 byte

-2 Cảm ơn seshoumara
-8 Cảm ơn zeppelin

H;G;D
  1. Nối một dòng mới và không gian giữ vào không gian mẫu.
  2. Nối một dòng mới và không gian mẫu vào không gian giữ.
  3. Xóa đến dòng mới đầu tiên và bắt đầu lại.

Điều này nhanh chóng hết bộ nhớ:

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

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

Xin chào, thế nào s:a\?:&a:g? Nó ít hơn 1 byte và tăng gấp đôi kích thước mẫu cho mỗi lần lặp.
seshoumara

@seshoumara Tôi không nghĩ rằng nó sẽ khớp với bất cứ thứ gì khi không gian mẫu trống, vì vậy nó sẽ không bao giờ thay thế đầu tiên.
Riley

@seshoumara echo -n | sed 's:a\?:&a:g'và không có đầu ra. Nó sẽ giống như sed 's::a:'không phù hợp với bất cứ điều gì.
Riley

Với echo -nhoàn toàn không có gì được thông qua để sed, nhưng sed không thể bắt đầu mà không đầu vào bằng cách thiết kế. Kiểm tra liên kết meta này để xem đó echo|sedlà cách được chấp nhận để bắt đầu sed cho các thách thức gọi quy tắc không có đầu vào.
seshoumara

@seshoumara Tôi nghĩ nó vẫn sẽ cho nó một chuỗi rỗng. Điều đó dường như để làm việc sau đó. Cảm ơn!
Riley

9

R, 22 25 22 20 18 byte

Chỉnh sửa: Cảm ơn @Mego đã chỉ ra rằng R không hỗ trợ tối ưu hóa cuộc gọi đuôi.

Edit4: Tìm thấy một giải pháp thậm chí ngắn hơn mà đơn giản nhưng khá phức tạp.

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

Câu trả lời sử dụng biến trung thực boolean dựng sẵn, Tđược giảm dần vô thời hạn trong vòng lặp. Hàm ls()được gọi là mỗi lần lặp trong đó liệt kê tất cả các đối tượng trong môi trường hiện tại. Tuy nhiên, đối số đầu tiên namechỉ định từ môi trường nào để liệt kê các đối tượng. Từ tài liệu R, chúng tôi thấy rằng:

Đối số tên có thể chỉ định môi trường mà từ đó tên đối tượng được lấy theo một trong một số dạng: dưới dạng một số nguyên (vị trí trong searchdanh sách); là tên chuỗi ký tự của một thành phần trong danh sách tìm kiếm; hoặc như một tường minh environment(bao gồm cả việc sử dụng sys.frameđể truy cập các cuộc gọi chức năng hiện đang hoạt động).

Điều này chủ yếu có nghĩa là trong lần lặp đầu tiên, chúng ta sẽ chạy ls(-1)trở lại character(0)(tiêu chuẩn khi cố gắng truy cập everything-except-the-firstphần tử không tồn tại của bất kỳ đối tượng loại ký tự nào). Trong lần lặp thứ hai, Tđược giảm hai lần và sau đó chúng tôi gọi ls(-3)lần lượt trả về lỗi:

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

Điều này là do chúng tôi cố gắng liệt kê everything-except-the-thirdphần tử nhưng môi trường cục bộ chỉ chứa biến Ttại thời điểm này (như vậy, ls()sẽ trả về một danh sách độ dài 1ở lần lặp này) và một lỗi được trả về.


1
Điều đó không có vẻ như đệ quy được thực hiện với tối ưu hóa cuộc gọi đuôi, nếu có giới hạn đệ quy.
Mego

@Mego Sau khi tìm hiểu kỹ, tôi phát hiện ra rằng R thực sự không hỗ trợ tối ưu hóa cuộc gọi đuôi nên câu trả lời này không hợp lệ (chưa bao giờ nghe về khái niệm này trước đây). Sẽ thay đổi thành một câu trả lời hợp lệ trong giây lát.
Billywob

9

Befunge-93, 3 byte (có thể 1 hoặc 0)

!%!

Hãy thử trực tuyến!

Trong lần lặp đầu tiên của vòng lặp, ngăn xếp trống, tương đương với tất cả các số không. Các !(không) hoạt động như vậy, chuyển đổi ngăn xếp trên xuống 1, và %(modulo) hoạt động tính toán 0 mod 1, để lại 0. Tiếp theo !hoạt động chuyển đổi mà từ 0 đến 1 trước khi bộ đếm chương trình kết thúc tốt đẹp xung quanh và bắt đầu vòng lặp lại.

Trong lần lặp thứ hai, các !hoạt động đầu tiên chuyển đổi 1 hiện đang ở trên cùng của ngăn xếp thành 0. %Hoạt động sau đó tính toán 0 mod 0, tạo ra một phép chia bằng 0 trên trình thông dịch tham chiếu và do đó chấm dứt chương trình.

Ngoài ra còn có câu trả lời 1 byte nhàm chán hơn, mặc dù tôi không chắc điều này có được coi là hợp lệ hay không.

"

Hãy thử trực tuyến!

"Lệnh này bắt đầu một chuỗi, do đó, mọi không gian trên phần còn lại của dòng được đẩy lên ngăn xếp cho đến khi bộ đếm chương trình kết thúc và gặp "lại chuỗi đóng lại. Sau đó, nó sẽ cần phải quấn lại lần thứ hai để lặp lại quá trình bắt đầu một chuỗi khác và đẩy 79 khoảng trắng khác lên ngăn xếp. Cuối cùng, điều này sẽ hết bộ nhớ (hành vi trình thông dịch tham chiếu) hoặc tạo ra tràn ngăn xếp.

Bây giờ nếu bạn muốn thực sự thúc đẩy các quy tắc thì về mặt kỹ thuật cũng có một giải pháp byte không.


Nếu bạn đưa ra phán quyết này có nghĩa là bất kỳ trình thông dịch nào định nghĩa ngôn ngữ (như nhiều người ở đây làm), thì chúng ta có thể giả sử rằng ngôn ngữ Befunge được xác định bởi trình thông dịch này . Và một trong những "tính năng" của trình thông dịch đó là nó đẩy một giá trị Không xác định lên ngăn xếp cho mỗi vòng lặp của sân chơi khi thực hiện một chương trình trống. Cho đủ thời gian cuối cùng nó sẽ hết bộ nhớ.

Tốc độ xảy ra sẽ phụ thuộc vào tốc độ của máy tính, bộ nhớ khả dụng và trình duyệt đang được sử dụng. Trên máy của tôi, tôi thấy rằng Microsoft Edge hoạt động tốt nhất, nhưng ngay cả khi đó nó "chỉ" sử dụng 500MB sau hai phút. Mãi đến khoảng mười lăm phút (với vài gigabyte được sử dụng), Edge mới quyết định giết tiến trình và làm mới tab. Vì vậy, không thể thực hiện dưới thời hạn hai phút, nhưng với điều kiện phù hợp sẽ không nhất thiết phải nằm ngoài câu hỏi.


8

SAI, 8 byte

Tôi thực sự thích ngôn ngữ này.

1[$][.]#

Điều này đẩy một 1, sau đó [$][.]#các vòng lặp trong khi $là true (trùng lặp trên cùng của ngăn xếp) và ( .) xuất ra nó. Trình thông dịch này gặp sự cố sau khi 1bản in được in (bằng chứng về vòng lặp chạy ít nhất một lần.) Nó dường như là một lỗi trong trình thông dịch này. Chương trình 9 byte sau sẽ hoạt động trong tất cả các trình thông dịch tuân thủ:

1[$][..]#

Bạn cũng nên thử DUP, về cơ bản là một superset của FALSE. Đó là những gì tôi đã sử dụng để thực hiện TRẢ LẠI.
Mama Fun Roll

@MamaFunRoll oh yeah, tôi quên rằng bạn đã TRẢ LẠI! Tôi phải thử cái đó : D
Conor O'Brien

@MamaFunRoll Tôi yêu DUP, tôi vừa viết một thông dịch viên DUP và tôi đang chơi xung quanh nó.
ML

@ ConnorO'Brien: Tôi muốn nói rằng giải pháp đầu tiên của bạn sẽ làm sập bất kỳ trình thông dịch nào. Tôi vừa thực hiện một chương trình gỡ lỗi với trình thông dịch riêng của mình và rõ ràng là lần đầu tiên làm .trống ngăn xếp dữ liệu, trong khi ở vòng lặp thứ hai $cố gắng sao chép phần tử trên cùng của ngăn xếp trống, điều này sẽ dẫn đến lỗi (vâng, trình thông dịch của tôi không ). Phiên bản thứ hai không nên hợp lệ vì nó thậm chí không hoàn thành vòng lặp đầu tiên vì nó đã cố gắng truy cập vào ngăn xếp trống sớm.
ML

Ví dụ thứ hai của bạn, đây là bản sửa lỗi đầy màu Dump của trình thông dịch DUP của tôi. rõ ràng một khi bạn thấy cách ngăn xếp dữ liệu (DS) và ngăn xếp trả về (rs) hoạt động, mặc dù sau này không minh bạch trong FALSE.
ML

8

C, 21 byte

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

Ở đây iđược đảm bảo để bắt đầu như 0.

Có thể xác nhận rằng điều này chạy một lần như vậy:

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

Mà, trên máy của tôi, kết quả là:

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

Giải pháp đệ quy ngắn nhất tôi có thể tìm thấy là 22 byte :

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

gccchỉ loại bỏ cuộc gọi đuôi ở -O2hoặc cao hơn, tại thời điểm đó chúng ta cần gọi một chức năng như putsđể ngăn chặn toàn bộ điều được tối ưu hóa đi. Xác nhận rằng điều này hoạt động:

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

Sau đây là một chương trình đầy đủ, giả sử rằng nó được gọi không có đối số dòng lệnh, ở mức 22 byte :

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

tương đương với chức năng có cùng độ dài:

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

Là một chức năng như thế này được đối xử như chính? Nếu có, đối số đầu tiên là độ dài của danh sách đối số (là 1, tên được sử dụng để gọi nó).
Riley

Hoặc, thanh ghi đối số vẫn có giá trị ở đó từ lệnh chính được gọi.
Riley

@Riley Ahh, lý thuyết sau dường như là trường hợp, bằng chứng là thực tế là số lượng tăng lên khi các đối số dòng lệnh được thêm vào. Cảm ơn vì sự sáng suốt!
Doorknob

Tôi không chắc bạn đã gọi nó như thế nào trong lần đoán đầu tiên của tôi, nhưng tôi nên giống như đối số đầu tiên cho hàm gọi f.
Riley

Đúng, tio
Riley

6

MATLAB, 18 byte

Điều này có thể được chạy như một kịch bản:

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

Lặp lại đầu tiên là tốt, vì j(1)chỉ là 1. Lặp lại thứ hai gặp sự cố với một mảng ngoài giới hạn, j(2)vượt quá kích thước của j, đó là một mảng 1x1.

Điều này cũng có thể được chạy như một kịch bản, nhưng nó chỉ hoạt động khi bạn chạy nó lần đầu tiên. Tuy nhiên, đó là một sự lạm dụng đủ vui nhộn đối với các hằng số được xác định trước của MATLAB mà tôi nghĩ rằng tôi đã bao gồm nó. Nó cũng 18 byte.

while i/i;i={};end

Khi chạy trong một không gian làm việc mà biến ichưa được xác định, điều này giả sử ilà đơn vị tưởng tượng, vì vậy i/i = 1. Trong vòng lặp đầu tiên, phép gán i={}tạo ra một mảng ô trống được gọi i. Ở lần lặp thứ hai, vòng lặp thoát với "Toán tử không xác định '/' cho các đối số đầu vào của loại 'ô'."


Cả hai đều tuyệt vời! Bạn có thể biết điều này, nhưng j(2)thông thường sẽ đưa ra ma trận 2 nhân 2 với0+1i
Stewie Griffin

Cảm ơn! Điều đó đúng trong Octave nhưng không phải trong MATLAB tôi nghĩ
MattWH

6

Perl 6 , 13 byte

loop {5[$++]}

Lập chỉ mục một số nguyên trong một vòng lặp vô hạn.
Dựa vào thực tế là trên các giá trị vô hướng, cú pháp lập chỉ mục mảng có thể được sử dụng với chỉ mục 0(trả về chính giá trị), nhưng đưa ra Index out of rangelỗi cho bất kỳ chỉ mục nào khác.


6

QBasic, 17 byte

Mã này rất kỳ lạ.

DO
i=11+a(i)
LOOP

Làm thế nào nó hoạt động

Trong QBasic, các biến được khởi tạo trước. Một biến thông thường không có bất kỳ hậu tố loại nào, như iở đây, được khởi tạo trước bằng không.

Ngoại trừ nếu bạn cố gắng đăng ký vào biến đó như một mảng ... trong trường hợp đó, đó là một mảng gồm 11 số không. *

Do đó, lần đầu tiên qua vòng lặp, do đó, i0alà một mảng. a(i)đưa ra phần tử zeroth của mảng (đó là 0). Tất cả đều tốt và tốt. Chúng tôi đặt iđể 11và vòng lặp. Nhưng bây giờ 11không phải là một chỉ mục hợp lệ cho mảng avà chương trình tạm dừng với Subscript out of range.

Phiên bản 19 byte cho thấy rõ hơn những gì đang diễn ra:

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

Điều này sẽ in 0mười một lần trước khi lỗi.


* Về mặt khái niệm, đó là một mảng gồm 10 phần tử. Hầu hết mọi thứ trong QBasic đều được lập chỉ mục 1, nhưng mảng không, có thể vì lý do triển khai. Để làm mọi thứ hoạt động như mong đợi cho các lập trình viên, QBasic ném vào một mục bổ sung để bạn có thể sử dụng các chỉ số từ 1 đến 10. Tuy nhiên, Chỉ số 0 vẫn hoàn toàn có thể truy cập được. Đi hình.


QBasic và mảng, nơi vui vẻ dừng lại!
steenbergh

Kể từ khi lỗi không phải để được vào vòng thứ hai, không có thể giúp bạn làm i=1+a(i)?
Quelklef

@Quelklef Không, bạn phải làm i=i+1+a(i). Nếu không, chỉ mục không bao giờ được ở trên 1, đó không phải là một lỗi.
DLosc

@DLosc Ồ, bạn nói đúng.
Quelklef

5

Haskell, 15 byte

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

f"a"chạy đệ quy thông qua chuỗi "a" bằng cách thả char đầu tiên và cuối cùng thất bại ở cuối của nó với một Non-exhaustive patterns in function fngoại lệ, bởi vì fchỉ được xác định cho các chuỗi không trống.


5

C #, 71 38 byte

Vì bạn đã cung cấp một ví dụ trong C # ở đây, một phiên bản khác được đánh gôn

Và cảm ơn Pinkfloydx33

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

Ngắn hơn Parse.ToString()và thậm chí hơn Parse($"{c--}") tôi bỏ đi checkedvì nó quá dài của một từ khóa. Nó chắc chắn là ngắn hơnParse(c.ToString())

Câu trả lời gốc

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

Điều này sẽ bắt đầu c=0sau đó giảm dần, khi c=-1ý uint.Parsechí sẽ gây ra:

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

Phiên bản đã được chỉnh sửa và xác minh rằng vòng lặp chạy ít nhất một lần

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

Được rồi, wow! Không biết về tốc ký '$'!
MrPaulch

4

CJam , 4 byte

1{}g

Hãy thử trực tuyến!

Lặp lại đầu tiên của {}gvòng lặp trống bật lên 1, cho biết nó tiếp tục. Lặp lại thứ hai cố gắng bật một điều kiện khác, nhưng ngăn xếp trống, vì vậy chương trình gặp sự cố.


4

lắp ráp x86 (cú pháp AT & T), 40 byte

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

Khai báo một hàm f chia 1 cho lần lặp đầu tiên sau đó cố gắng chia 0 cho 0 và lỗi.


Bạn có thể lưu 4 byte bằng cách chuyển sang cú pháp Intel :)
mriklojn

6
Chúng tôi thường chấm điểm lắp ráp theo kích thước của mã byte được tạo, không phải là hướng dẫn có thể đọc được của con người.
Dennis

@Dennis lắp ráp assmebled là ngôn ngữ máy. nhưng vâng, điều này có thể được yêu cầu ngắn hơn nhiều ở dạng ngôn ngữ máy.
Jasen

Loại bỏ nhãn f và Mov. Trao đổi dec và div, và bạn có thể thoát khỏi nhiều hơn.
Rõ ràng hơn

4

CJam, 4 byte

P`:~

P`tạo chuỗi 3.141592653589793. :~đánh giá từng nhân vật. 3là mã hợp lệ trong CJam, đơn giản trả về 3. Trong lần lặp tiếp theo, .gây ra lỗi vì nó yêu cầu một chữ số hoặc toán tử theo sau nó.




4

Mẻ, 22 20 byte

:a
set i=%i%1
goto a

Giải trình

Đây là một vòng lặp vô hạn nối thêm một 1chuỗi trống ban đầu. Cuối cùng, điều này sẽ vượt qua độ dài chuỗi tối đa 8192 và sự cố. Trên máy của tôi, việc này mất khoảng 30 giây.


Đẹp! Bạn có thể lưu 2 byte bằng cách sử dụng kết thúc dòng Unix.
briantist

Bạn có thể sử dụng% 0 là tên tệp thay vì nhãn và goto.
YourDeathIsComing

Tôi không chắc chắn nếu điều đó phá vỡ quy tắc đệ quy đuôi.
SomethingDark

4

JavaScript, 9 byte

for(;;i);

Điều này chạy một lần, sau đó ném ReferenceError: i is not definedmà dừng vòng lặp.

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


Lấy ví dụ sau đây là <increment>kết thúc của chu kỳ đầu tiên hay bắt đầu của chu kỳ thứ hai?

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

1 / Tôi thấy nó

Sau khi đi từ dòng 0 đến dòng 3 rồi quay lại dòng 0, có cảm giác như một chu trình đầy đủ đã được hoàn thành.
Điều đó sẽ làm cho sự <increment>khởi đầu của chu kỳ thứ hai.
- Chu kỳ thứ nhất: <init>-> <test>-> <statement>
- Chu kỳ thứ hai: <increment>-> <test>-><statement>

2 / Whiletương đương

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

Trong tương đương này while<increment>phải là kết thúc của chu kỳ đầu tiên và nó cảm thấy như nó giống với for.
Điều đó sẽ làm cho sự <increment>kết thúc của chu kỳ đầu tiên.
- Chu kỳ thứ nhất: <test>-> <statement>-> <increment>
- Chu kỳ thứ hai: <test>-> <statement>-><increment>

3 / Một tuyên bố được gặp hai lần

Một chu kỳ đầy đủ được hoàn thành khi một câu lệnh gặp phải hai lần.
Tuyên bố đầu tiên gặp phải hai lần là <test>.
Điều đó sẽ làm cho sự <increment>kết thúc của chu kỳ đầu tiên.
- Chu kỳ thứ nhất: <test>-> <statement>-> <increment>
- Chu kỳ thứ hai: <test>-> <statement>-><increment>

4 / Đó là một thiết lập

Đây <init>chỉ là thiết lập bất cứ điều gì cần thiết cho chu kỳ đầu tiên.
Đây <increment>chỉ là thiết lập bất cứ điều gì cần thiết cho chu kỳ thứ hai.
Điều đó sẽ làm cho sự <increment>khởi đầu của chu kỳ thứ hai.
- Chu kỳ thứ nhất: <init as a setup>-> <test>-> <statement>
- Chu kỳ thứ hai: <increment as a setup>-> <test>-><statement>


Đặc tả ngôn ngữ ECMAScript® 2016

Thời gian chạy của for(<init>;<test>;<increment>)<statement>;

Đặt varDcl là kết quả của việc đánh giá <init>.
Trả về IfAbrupt (varDcl).
Trở về ? ForBodyEvaluation ( <test>, <increment>, <statement>, «», labelSet).

Có ba hình thức, vì vậy tôi đã lấy mẫu ngắn nhất ở đây, không có sự khác biệt:
- Dù <init>đó không phải là một phần của lần lặp đầu tiên.
- Những gì có liên quan trong ForBodyEvalval.

Chi tiết về ForBodyEvaluation ( <test>, <increment>, <statement>, «», labelSet)

0 Đặt V không xác định.
1 Thực hiện? CreatePerIterationEn Môi trường (perIterationBindings).
2 Lặp lại
3 Nếu không [trống], thì
4 Đặt testRef là kết quả của việc đánh giá <test>.
5 Đặt testValue là? GetValue (testRef).
6 Nếu ToBoolean (testValue) là sai, hãy trả về NormalCompletion (V).
7 Hãy để kết quả là kết quả của việc đánh giá <statement>.
8 Nếu LoopContinues (kết quả, nhãn Set) là sai, trả về Hoàn thành (UpdateEmpty (kết quả, V)).
9 Nếu kết quả. [[Giá trị]] không trống, hãy để V là kết quả. [[Giá trị]].
10 Thực hiện? CreatePerIterationEn Môi trường (perIterationBindings).
11 Nếu không [trống], thì
12 Gọi incRef là kết quả của việc đánh giá <increment>.
13 Thực hiện? GetValue (incRef).

6 / Tôi thấy nó

Một chu kỳ đầy đủ một phần chạy đầy đủ của phần lặp lại.
Điều đó sẽ làm cho sự <increment>kết thúc của chu kỳ đầu tiên.
- Chu kỳ đầu tiên: <test>-> <statement>-> <increment>/ Nói cách khác từ dòng 3 đến dòng 13
- Chu kỳ thứ hai: <test>-> <statement>-> <increment>/ Nói cách khác từ dòng 3 đến dòng 13

7 / Một chu kỳ là một lần lặp

Một chu kỳ bắt đầu với CreatePerIterationEnvironment.
Vì vậy, khi CreatePerIterationEnvironmentgặp phải một chu kỳ mới bắt đầu, do đó kết thúc chu kỳ trước.
Điều đó sẽ làm cho sự <increment>khởi đầu của chu kỳ thứ hai.
- Chu kỳ đầu tiên: <test>-> <statement>/ Nói cách khác từ dòng 1 đến dòng 9
- Chu kỳ thứ hai: <increment>-> <test>-> <statement>/ Nói cách khác từ vòng 10 cho đến dòng 9


<increment>kết thúc của chu kỳ đầu tiên hay bắt đầu của chu kỳ thứ hai?

Giải thích đúng là 6 hoặc 7.


8
Tôi nghĩ rằng tôi có xu hướng quy định sự gia tăng đến cuối của lần lặp đầu tiên, thay vì bắt đầu lần lặp thứ hai hoặc không lặp lại. Tôi cho rằng đây là một sự mơ hồ của câu hỏi.

1
for(a;b;c)d;gần tương đương với a;while(b){d;c;}, tôi có xu hướng nói rằng lỗi vẫn bị ném trong lần lặp đầu tiên (trước khi điều kiện vòng lặp được kiểm tra lần thứ hai).
Sản xuất ETH

@Hurkyl Lần lặp đầu tiên bắt đầu bằng lần khởi tạo, vì vậy tôi nghĩ rằng sự gia tăng phải là sự khởi đầu của lần lặp thứ hai.
Hedi

4
Nếu bạn đọc thông số kỹ thuật , bạn có thể thấy rằng hoạt động gia tăng là phần cuối cùng của lần lặp và như vậy, vẫn thuộc về lần lặp đầu tiên.
Nit

3
@Hedi Tôi không thấy điều đó có liên quan gì cả. Hoạt động gia tăng rất rõ ràng là một phần của lần chạy đầu tiên của vòng lặp. Để viết lại, khi thao tác tăng được gọi, vòng lặp chưa hoàn thành một lần chạy hoàn chỉnh.
Nit

4

INTERCAL , 12 byte

(1)DO(1)NEXT

Hãy thử trực tuyến!

NEXTlà lệnh điều khiển luồng chính của INTERCAL-72. (Các bản sửa đổi sau này được giới thiệu COME FROM, đã trở nên nổi tiếng hơn, nhưng nó không có trong phiên bản gốc của ngôn ngữ; và tất cả các triển khai INTERCAL đã hoàn thành Tôi biết về hỗ trợ NEXTcho khả năng tương thích ngược, với tất cả trừ một hỗ trợ cho nó theo mặc định. Tôi không cảm thấy cần phải đặt tên INTERCAL-72 cụ thể trong tiêu đề.)

Khi sử dụng NEXTđể tạo thành một vòng lặp, bạn phải sử dụng RESUMEhoặc FORGETđể giải phóng không gian mà nó sử dụng để ghi nhớ chương trình đã ở đâu; RESUMEhồi tố làm cho NEXTmột thứ gì đó giống với một lệnh gọi hàm (mặc dù bạn có thể trả về từ các hàm khác với hàm bạn đang làm) trong khi FORGETbiến nó thành một thứ tương tự như câu lệnh GOTO. Nếu bạn không thực hiện (và chương trình này thì không), chương trình sẽ bị sập sau 80 lần lặp (hành vi này thực sự được chỉ định trong đặc tả INTERCAL).

Nó hơi mơ hồ cho dù điều này được tính là đệ quy không giới hạn (không được phép trong câu hỏi); bạn chắc chắn có thể sử dụng loại này NEXTđể thực hiện một lệnh gọi hàm, trong trường hợp đó nó thực sự là một hàm đệ quy, nhưng không có đủ thông tin ở đây để xác định xem chúng ta có thực hiện cuộc gọi hàm hay không. Ít nhất, dù sao tôi cũng đăng bài này vì nó không vi phạm các quy tắc một cách rõ ràng và việc triển khai INTERCAL tối ưu hóa "cuộc gọi đuôi" sẽ không chỉ vi phạm đặc điểm kỹ thuật, mà còn khiến hầu hết các chương trình hiện tại bị phá vỡ, bởi vì trở về từ "hàm sai" là cách chính để thực hiện tương đương với câu lệnh IF.

Đây là thông báo lỗi kết quả, như được tạo bởi C-INTERCAL:

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

(Lưu ý rằng dòng thứ hai được thụt vào với một tab và dòng thứ ba có tám khoảng trắng. Điều này có vẻ đúng trong một thiết bị đầu cuối hoặc trong hầu hết mọi chương trình có tab dừng ở bội số 8. Tuy nhiên, Markdown có các điểm dừng ở bội số của bốn, vi phạm các giả định mà hầu hết các chương trình cũ tạo ra về các tab, vì vậy thông báo lỗi có một chút sai ở đây.)


Liệu lỗi thực sự nói CORRECT SOURCE AND RESUBNIT? Như trong một lỗi đánh máy trong thông báo lỗi C-INTERCAL ban đầu?
Andrakis

1
@Andrakis: Vâng, đúng vậy. Đó là typo được bảo quản cẩn thận trong nhiều năm.

3

Bình thường, 3 byte

W1w

Hãy thử trực tuyến.

W1chỉ là while 1:trong Python. Phần thân vòng lặp in một dòng đọc từ STDIN, nó gặp sự cố cho lần lặp thứ hai khi mã được chạy với đầu vào trống.

Nếu các vòng lặp sử dụng #(loop-Until-error) bị cấm (tôi giả sử như vậy), tôi nghĩ đây là vòng lặp ngắn nhất có thể nhận được.


3

Python 3, 29 byte

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

Thực sự đơn giản. Trong cuộc gọi thứ hai đến x, tôi không có ở đó và Python phàn nàn về điều đó.


3

Mê cung , 3 byte

#(/

Hãy thử trực tuyến!

Giống như hầu hết các ngôn ngữ 2D, Labyrinth không có bất kỳ cấu trúc lặp rõ ràng nào. Thay vào đó, bất kỳ mã nào được đặt ra sao cho nó được thực thi nhiều lần liên tiếp là một vòng lặp trong các ngôn ngữ này. Đối với trường hợp của Labyrinth, một chương trình tuyến tính đơn giản hoạt động như một vòng lặp, bởi vì con trỏ lệnh sẽ nảy qua lại trên nó. Nếu chương trình là abc(đối với một số lệnh a, bc), sau đó thực hiện thực tế sẽ abcbabcbabcb...để nó chạy abcbtrong một vòng lặp vô hạn.

Về lý do tại sao chương trình cụ thể này gặp sự cố trong lần lặp thứ hai của vòng lặp này, đây là những gì các lệnh riêng lẻ làm. Lưu ý rằng ngăn xếp của Labyrinth chứa một số lượng không giới hạn ẩn ở phía dưới:

#   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 (Đường biên giới không cạnh tranh)

exec $0 1$@

Kịch bản lệnh này thực hiện đệ quy chính nó, nối 1vào các đối số được truyền trên mỗi lần lặp. Tôi nghĩ điều này được tính là TCO vì exec thực hiện lại không gian xử lý nhưng không ăn hết stack. Đó là đường biên giới không cạnh tranh vì phải mất khoảng 10 phút trước khi bị giết trên máy của tôi - YMMV.


1
exec $0 1$@$@ chấm dứt nhanh hơn nhiều nhưng là hai ký tự dài hơn.
Jasen

3

cmd, 34 byte

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

Điều này sẽ xoay vòng %itừ 0 đến 10. Lệnh (cổ) colorsẽ vui vẻ chấp nhận bất kỳ đối số nào có 2 chữ số thập phân (hexa-). Với đối số, 100nó sẽ thất bại, in thông báo trợ giúp và đặt ERRORLEVELthành 1.

Bằng chứng về vòng lặp chạy ít nhất một lần: Màu sắc của vỏ của bạn sẽ khác!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.