최단 자동 파괴 루프


61

당신의 작업은 어떤 입력을지지 않습니다 및 루프 (모든 종류의 실행되는 전체 프로그램이나 기능을 작성하는 것입니다 while, for, foreach, do, do-while, do-loop, goto프로그램이 실행 자체를 중지해야 함을 의미합니다 오류를 일으키는 원인이 종료됩니다, 재귀 등) 출구.

규칙 :

  1. 오류는 런타임 오류, 처리되지 않은 예외 또는 프로그램 자체를 종료시키는 모든 항목이어야합니다.
  2. 오류는 exit;특정 시점에서 명시 적으로 (또는 이에 상응하는) 호출하지 않고 프로그램을 중지하고 종료해야합니다 .
  3. 같은 메시지 Warning:, Notice:자체 종료 프로그램을 발생하지 않는 등, 유효하지 않습니다. 예를 들어, PHP 0으로 나누면 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가 제안한 내용 : "이 경우 [재귀] 전체주기가 완료되었는지 결정하기 어려울 수 있습니다. 꼬리 재귀는 계산에 적합하지만 실행이 중단 된 경우 실제로 TCO 만주기를 완료합니다. [...] 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 바이트

@MartinEnder의 CJam 답변 에서 가져온 아이디어

`

온라인으로 사용해보십시오!

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

@Dennis Hm 오프라인 프로그램은 사용자 입력을 계속 기다립니다. 입력은 대화식입니다. 즉, 오프라인 버전에서 필요에 따라 요청됩니다. 따라서 프로그램은 무기한 대기합니다. 그게 확실하지 않습니까?
Luis Mendo

MATL이 내부적으로 어떻게 작동하는지 확실하지 않지만 입력을 요청할 수없는 환경 (예 : TIO의 백엔드)에서 실행하는 경우 입력을받을 수 없습니다. 또한 Ctrl-D 또는 OS 종속 항목을 누르면 빈 입력을 보낼 수 있습니다.
Dennis

35

파이썬, 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 _():_()(newline) _()입니다. 그러나 이것은 규칙 # 6을 위반합니다.


당신이 교체하면 17 바이트 솔루션은 작동 while iwhile 1는 삭제하려고하기 때문에 i다시;
user6245072


del내장 기능으로 트릭을 사용하여 몇 가지를 더 줄일 수 있습니다 while 1:del id.
DSM

@DSM : del id작동하지 않습니다. 그런 식으로 내장을 삭제할 수 없습니다 .
user2357112

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

젤리는 메모리 제한이 없으므로 파이썬이 처리 할 수있는 모든 것이 있습니다. 메모리 사용은 반복 할 때마다 두 배가되므로 사용 가능한 모든 메모리를 빨리 소모해야합니다.
Dennis

28
따라서 2 년마다, 우리는 또 다른 반복을 수행 할 수 있습니다
tuskiomi

RAM이 많은 느린 컴퓨터에서 조건 # 5가 실패합니까?
Mad Physicist

@MadPhysicist 맞습니다. 이것은 시간 제한에 내재 된 문제입니다. 규정 준수는 프로그램이 실행되는 시스템에 따라 크게 다릅니다.
Dennis

13

V , 2 바이트

òl

온라인으로 사용해보십시오!

내가 항상 그렇게했기 때문에 이것은 V에 대한 완벽한 도전입니다! 실제로 V에는 조건이 없으며 오류가 발생하는 기능 만 있습니다. 이 경우 ò"영원히 반복"이라는 l의미와 "오른쪽으로 이동"이라는 의미입니다.

빈 버퍼 (입력 없음)에서는 첫 번째 패스에서 중단되고 출력이 생성되지 않습니다. 입력 이있는 경우 입력의 마지막 문자를 이동 한 후 입력이 중단되고 모든 입력이 출력됩니다 (고양이 프로그램이기도 함)


3
잠깐, l"오른쪽으로 이동"을 의미합니까? "이동 이동 l"이 아닙니까?
Conor O'Brien

1
@ ConorO'Brien 네. 실제로 이것에는 좋은 역사적 이유 가 있습니다.
DJMcMayhem

3
이 문제를 해결하려면 첫 번째 반복이 아닌 두 번째 반복 이상에서 응답이 필요합니다.
Martin Ender

11

자바 스크립트 (ES6), 13 바이트

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

이 기능은 재귀 함수로 한 번 실행 된 다음 던지고 ReferenceError: a is not defined종료됩니다.

다음은 15 바이트 비 ES6 버전입니다.

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

이것은 한 번 잘 실행 된 다음 던지고 TypeError: i is undefined종료됩니다.


10

배쉬 4.2, 22 바이트

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

Bash 4.3이 있기 때문에 TIO에서 작동하지 않으며 내가 의존하는 버그가 마침내 수정되었습니다.

확인

$ 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$x.
    이후 pi일정으로 사용되고있는 경우, PHP 확인한다.
    PHP는 Use of undefined constant pi - assumed 'pi'존재하지 않기 때문에 (기본적으로 상수가 존재하지 않기 때문에 문자열이라고 가정합니다) 경고 메시지를 표시합니다
  • 처음으로 루프
    • 기능을 실행하십시오 $x().
      때문에 $x값을 가지고 pi,이 기능을 실행합니다 pi().
  • 에 값을 저장하십시오 $x.
    $x이제 대신에 π를 갖습니다.pi
  • 두 번째 루프
    • 기능을 실행하십시오 $x().
      이후 $xπ 있으며,이 기능을 실행합니다 3.14159...().
    • π는 문자열이 아니므로이 시점에서을 사용하여 프로그램을 종료하십시오 Fatal Error.

함수 를 찾아서 1 바이트를 절약 한 @Titus 에게 감사드립니다 !pi()


좋은 점이지만 유효하지 않다고 생각합니다. 실제로 루프를 한 번 실행하지는 않습니다. 당신은 증가 $xabt루프 본문이 실행되기 전에. 루프 후에 증가 시켜서 고칠 수 있습니다.
aross

나는 생각 다른 접근
aross

@aross Duh, 맞습니다. 유효하지 않습니다. 증분이 잘못된 위치에 있습니다. 지금처럼 작동합니다. 당신은 테스트를 실행하려고 할 수 있습니다 for($x=abs;;++$x)echo$x,$x();. 표시되어야합니다 abs0abt Fatal error[...]. 또는 비슷합니다.
Ismael Miguel

1
pi대신에 사용할 수 있습니다 abs. 그것은 치명적을 던지기 전에 경고조차하지 않습니다.
Titus

@Titus 나는 그 기능을 완전히 잊었다! 함수 _가 일부 시스템에서 정의되었지만 신뢰할 수 없음을 알고 있습니다. 그러나 그것을 찾아 주셔서 감사합니다!
Ismael Miguel

10

GNU sed , 15 13 5 바이트

-2 seshoumara에 감사합니다
-8 zeppelin에 감사합니다

H;G;D
  1. 패턴 공간에 줄 바꾸기 및 보류 공간을 추가합니다.
  2. 줄 바꾸기 및 패턴 공간을 보류 공간에 추가합니다.
  3. 첫 번째 줄 바꿈까지 삭제하고 다시 시작합니다.

메모리가 빨리 부족합니다.

$ 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 2012

@seshoumara 패턴 공간이 비어있을 때 아무것도 일치하지 않으므로 첫 번째 교체를하지 않습니다.
Riley

@seshoumara에 echo -n | sed 's:a\?:&a:g'출력이 없습니다. sed 's::a:'일치하지 않는 것과 동일 합니다.
Riley

echo -n절대적으로 아무것도 나오지에 전달하지만, 디자인에 의한 입력없이 시작할 수 없습니다 나오지도됩니다. 이 메타 링크 를 확인 echo|sed하여 입력 규칙 없음을 호출하는 문제에 대해 sed를 시작하는 데 허용되는 방법 인지 확인하십시오 .
seshoumara

@seshoumara 나는 여전히 빈 문자열을 줄 것이라고 생각했습니다. 그때 작동하는 것 같습니다. 감사!
Riley

9

R, 22 25 22 20 18 바이트

편집 : R이 꼬리 호출 최적화를 지원하지 않는다는 점을 지적한 @Mego에게 감사드립니다.

Edit4 : 간단하면서도 복잡한 더 짧은 솔루션을 찾았습니다.

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

대답은 내장 부울 진리 변수를 사용 T하며 반복 루프에서 무기한 감소합니다. ls()현재 환경의 모든 객체를 나열하는 각 반복이라고 하는 함수 입니다. 그러나 첫 번째 인수는 name객체를 나열 할 환경을 지정합니다. R 문서에서 우리는 다음을 발견합니다.

name 인수는 여러 가지 형식 중 하나로 오브젝트 이름이 사용되는 환경을 지정할 수 있습니다. 정수 ( search목록 의 위치 ); 검색 목록에서 요소의 문자열 이름으로; 또는 명시 적으로 environment( sys.frame현재 활성화 된 함수 호출에 액세스하는 것을 포함하여 ).

이것은 원칙적으로 첫 번째 반복 에서 어떤 문자 유형 객체의 존재하지 않는 요소에 액세스하려고 할 때 ls(-1)반환되는 character(0)표준 반복을 의미합니다 everything-except-the-first. 두 번째 반복 중에는 2 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 일 수 있음)

!%!

온라인으로 사용해보십시오!

루프의 첫 번째 반복에서 스택은 비어 있으며 이는 모든 0과 같습니다. 따라서 !(not) 연산은 스택 상단을 1로 변환하고 %(modulo) 연산은 0 mod 1을 계산하여 0을 남겨 둡니다. 다음 !연산은 프로그램 카운터가 래핑되고 루프를 다시 시작하기 전에 0을 1로 변환합니다.

두 번째 반복에서 첫 번째 !조작은 이제 스택 맨 위에있는 1을 0으로 변환합니다. %그런 다음 0 mod 0을 계산하여 참조 인터프리터에서 0으로 나누기 오류를 생성하여 프로그램을 종료합니다.

이것이 지루한 지 1 확실하지는 않지만 더 지루한 1 바이트 답변이 있습니다.

"

온라인으로 사용해보십시오!

"명령은 문자열을 시작하므로 프로그램 카운터가 줄 바꿈 "하여 문자열을 다시 닫을 때까지 나머지 줄의 모든 공간이 스택으로 푸시 됩니다. 그런 다음 다른 문자열을 시작하고 스택에 다른 79 칸을 밀어 넣는 과정을 반복하려면 두 번째로 감싸 야합니다. 결국 이것은 메모리가 부족하거나 (참조 인터프리터 동작) 스택 오버플로를 발생시킵니다.

이제 규칙을 실제로 적용하려면 기술적으로 0 바이트 솔루션이 있습니다.


당신이 가지고가는 경우에 이 판결을 의미하는 어떤 (여기에 많은으로 할) 인터프리터 언어를 정의하고, 우리는 비 펀지 언어에 의해 정의 된 순간을 가정 할 수있다 이 통역 . 그리고 그 인터프리터의 "기능"중 하나 는 빈 프로그램을 실행할 때 플레이 필드의 각 루프에 대해 스택에 정의되지 않은 값을 푸시한다는 것 입니다. 충분한 시간이 주어지면 결국 메모리가 부족합니다.

얼마나 빠른 속도는 컴퓨터 속도, 사용 가능한 메모리 및 사용중인 브라우저에 따라 다릅니다. 내 컴퓨터에서 Microsoft Edge가 가장 효과적이라는 것을 알았지 만 2 분 후에 500MB를 사용하는 것이 "단지"였습니다. Edge가 프로세스를 종료하고 탭을 새로 고치기로 결정한 것은 15 분 정도였습니다 (수 기가 바이트 사용). 따라서 2 분 제한 시간 내에 만들 가능성은 없지만 올바른 조건이 아닐 수도 있습니다.


8

거짓, 8 바이트

나는이 언어를 정말로 좋아한다.

1[$][.]#

이렇게하면 a를 푸시 한 1다음 true를 [$][.]#유지하면서 $(스택 상단 복제) ( .) 출력합니다. 이 인터프리터 는 싱글 1이 인쇄 된 후 충돌 합니다 (루프가 한 번 이상 실행되었다는 증거). 다음 9 바이트 프로그램은 모든 호환 통역사에서 작동해야합니다.

1[$][..]#

기본적으로 FALSE의 상위 집합 인 DUP도 시도해야합니다. 그것이 내가 RETURN을 할 때 사용한 것입니다.
Mama Fun Roll

@MamaFunRoll 아 그래, 네가 돌아온 것을 잊었 어! 나는 그것을 시도해야합니다. : D
Conor O'Brien

@ MamaFunRoll 나는 DUP를 좋아하고 방금 DUP 통역사를 썼고 그와 함께 놀고 있습니다.
ML

@ ConnorO'Brien : 첫 번째 솔루션이 모든 통역사와 충돌해야한다고 말하고 싶습니다. 방금 내 인터프리터로 디버그를 실행했으며 첫 번째 .는 데이터 스택을 비우고 두 번째 루프 $에서는 빈 스택의 맨 위 요소를 복제하려고 시도하여 오류가 발생합니다. ). 두 번째 버전은 이미 빈 스택에 조기에 액세스하려고하기 때문에 첫 번째 루프를 완료하지 않기 때문에 유효하지 않아야합니다.
ML

두 번째 예를 들어, 여기 내 DUP 인터프리터의 풀 컬러 디버그 덤프 가 있습니다. 데이터 스택 (ds)과 리턴 스택 (rs)이 어떻게 작동하는지 알면 후자는 FALSE에서 투명하지 않습니다.
ML

8

C, 21 바이트

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

여기서 i로 시작하는 것이 보장됩니다 0.

다음과 같이 한 번 실행되는 것을 확인할 수 있습니다.

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--;);}

이와 같은 기능이 메인처럼 취급됩니까? 이 경우 첫 번째 인수는 인수 목록의 길이 (1,이를 호출하는 데 사용 된 이름)입니다.
Riley

또는 인수 레지스터에는 여전히 메인 호출에서 나온 값이 있습니다.
Riley

@Riley Ahh, 후자의 이론은 명령 행 인수가 추가됨에 따라 숫자가 증가한다는 사실에 의해 입증 된 것처럼 보인다. 통찰력에 감사드립니다!
도어 노브

나는 당신이 내 첫 번째 추측에서 그것을 어떻게 호출했는지 확신하지 못했지만 f를 호출하는 함수의 첫 번째 인수와 동일해야합니다.
Riley

Yet, tio
Riley

6

MATLAB, 18 바이트

스크립트로 실행할 수 있습니다.

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

첫 번째 반복은 괜찮 j(1)습니다 1. 두 번째 반복 은 1x1 배열 인 j(2)차원을 초과하므로 범위를 벗어난 배열 오류와 충돌 합니다 j.

스크립트로 실행할 수도 있지만 처음 실행할 때만 작동합니다. 여전히 MATLAB의 미리 정의 된 상수를 남용하는 것은 유쾌합니다. 내가 그것을 포함 할 것이라고 생각했습니다. 또한 18 바이트입니다.

while i/i;i={};end

변수 i가 아직 정의되지 않은 작업 공간에서 실행될 때 이것은 i가상의 단위 라고 가정합니다 i/i = 1. 첫 번째 루프에서 할당 i={}은이라는 빈 셀형 배열을 만듭니다 i. 두 번째 반복에서 루프는 " 'cell'유형의 입력 인수에 대해 정의되지 않은 연산자 '/'로 종료됩니다."


둘 다 굉장합니다! 아마 이것을 알겠지만, j(2)보통 다음과 같은 0+1i
2x2

감사! 즉 옥타브에 사실이지만 MATLAB에서 나는 생각하지
MattWH

6

펄 6 , 13 바이트

loop {5[$++]}

무한 루프에서 정수 리터럴을 인덱싱합니다.
스칼라 값에서 배열 색인 구문을 색인과 함께 사용할 수 있지만 0(값 자체를 리턴 함) Index out of range다른 색인에 대해 오류가 발생합니다.


6

Q 기본, 17 바이트

이 코드는 매우 이상합니다.

DO
i=11+a(i)
LOOP

작동 원리

QBasic에서 변수는 사전 초기화됩니다. i이처럼 접미사가없는 정규 변수 는 0으로 미리 초기화됩니다.

배열과 같이 해당 변수를 첨자 화하려고하는 경우를 제외하고는이 경우 11 개의 0으로 구성된 배열입니다. *

루프를 처음에 따라서, i0a배열이다. a(i)배열의 0 번째 요소 ( 0)를 제공합니다. 모든 것이 좋고 좋습니다. 우리는 설정 i11루프. 그러나 이제는 11배열에 유효한 인덱스가 아니며 a프로그램이 중단됩니다 Subscript out of range.

진행 상황을보다 잘 보여주는 19 바이트 버전 :

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

오류가 발생 0하기 전에 11 번 인쇄됩니다 .


* 개념적으로 10 요소 배열입니다. QBasic의 대부분은 1 인덱싱되지만 구현상의 이유로 배열은 그렇지 않습니다. 프로그래머가 예상 한대로 작동하게하기 위해 QBasic은 추가 항목을 던져서 인덱스 1-10을 사용할 수 있습니다. 그러나 인덱스 0은 여전히 ​​완벽하게 액세스 할 수 있습니다. 그림을 이동.


Q 기본과 배열, 재미는 어디에서 멈추나요!
steenbergh

오류가 없기 때문에 두 번째 루프에있을, 당신은 할 수 없었 i=1+a(i)?
Quelklef

@Quelklef 아니요,해야 i=i+1+a(i)합니다. 그렇지 않으면 인덱스가 결코 초과 1하지 않으므로 오류가 아닙니다.
DLosc

@DLosc 아, 맞습니다.
Quelklef

5

하스켈, 15 바이트

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

f"a"첫 번째 문자를 삭제하여 문자열 "a"를 통해 재귀 적으로 실행되며 비어 있지 않은 문자열에 대해서만 정의 Non-exhaustive patterns in function f되므로 예외적 으로 끝에서 실패합니다 f.


5

C #, 71 38 바이트

C #에서 예제를 제공했기 때문에 다른 버전으로 골프를 쳤습니다.

그리고 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=-1(가) uint.Parse가 발생합니다 :

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

Ungolfed 버전 및 루프가 한 번 이상 실행되는지 확인

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

x86 어셈블리 (AT & T 구문), 40 바이트

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

첫 번째 반복에서 1을 1로 나누는 함수 f를 선언 한 다음 0을 0으로 나누고 오류를 시도합니다.


당신은 : 인텔 문법로 전환하여 4 바이트를 저장할 수 있습니다
mriklojn

6
우리는 일반적으로 사람이 읽을 수있는 명령어가 아니라 생성 된 바이트 코드의 크기에 따라 어셈블리 점수를 매 깁니다.
Dennis

@Dennis assmebled 어셈블리는 기계어입니다. 그러나 이것은 기계어 형태로 훨씬 짧게 주장 될 수 있습니다.
Jasen

f- 라벨과 mov를 제거하십시오. dec와 div를 바꾸면 더 많은 것을 제거 할 수 있습니다.
Clearer

4

CJam, 4 바이트

P`:~

P`문자열을 생성합니다 3.141592653589793. :~각 문자를 평가합니다. 3CJam의 유효한 코드는 단순히 3을 반환합니다. 다음 반복에서는 .숫자 나 그 뒤에 연산자가 필요하기 때문에 오류가 발생합니다.


4

루비, 14 바이트

loop{$./=~$.}

다음으로 인한 출구 ZeroDivisionError: divided by 0

$. The current input line number of the last file that was read

루비 문서



4

배치, 22 20 바이트

:a
set i=%i%1
goto a

설명

이것은 1처음에 빈 문자열 에 a 를 추가하는 무한 루프입니다 . 결국 이것은 최대 문자열 길이 인 8192를 전달하고 충돌합니다. 내 컴퓨터에서는 약 30 초가 걸립니다.


좋은! 유닉스 줄 끝을 사용하여 2 바이트를 절약 할 수 있습니다.
briantist

레이블 대신 goto 대신 파일 이름 인 % 0을 사용할 수 있습니다.
YourDeathIsComing

그것이 꼬리 재귀 규칙을 위반했는지 확실하지 않습니다.
무언가

4

자바 스크립트, 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 / 진술이 두 번 발생

명령문이 두 번 발생하면 전체주기가 완료됩니다.
두 번 발생한 첫 번째 문장은 <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 수행? PeriterationEnvironment (perIterationBindings)를 작성하십시오.
2 반복
3 비어 있지 않은 경우
4 평가의 결과 인 testRef를 지정합니다 <test>.
5 testValue는? GetValue (testRef).
6 ToBoolean (testValue)이 false이면 NormalCompletion (V)을 반환합니다.
7 결과는 평가 결과가된다 <statement>.
8 LoopContinues (result, labelSet)가 false이면 Completion (UpdateEmpty (result, V))을 반환합니다.
9 결과 [[값]]이 비어 있지 않으면 V가 결과입니다 [[값]].
10 수행? PeriterationEnvironment (perIterationBindings)를 작성하십시오.
11이 비어 있지 않으면
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
spec 을 읽으면 증가 작업이 반복의 마지막 부분이므로 여전히 첫 번째 반복에 속한다는 것을 알 수 있습니다.
Nit

3
@ Hedi 나는 그것이 어떻게 관련이 있는지 전혀 모른다. 증분 연산은 루프의 첫 번째 실행의 일부입니다. 다시 말하면 증가 작업이 호출 될 때 루프가 단일 전체 실행을 완료하지 않은 것입니다.
Nit

4

INTERCAL , 12 바이트

(1)DO(1)NEXT

온라인으로 사용해보십시오!

NEXTINTERCAL-72의 주요 제어 흐름 명령입니다. (나중에 개정판이 도입 COME FROM되어 더 유명해졌지만 원래 버전의 언어에는 없었습니다. 모든 완성 된 INTERCAL 구현 NEXT은 기본적으로 하나만 제외하고 이전 버전과의 호환성 지원 을 알고 있습니다. 제목에 INTERCAL-72라는 이름을 지정할 필요가 없습니다.)

사용하는 경우 NEXT루프를 형성하기 위해, 당신이 사용하는 거 야 RESUME또는 FORGET이 프로그램이되었습니다 위치를 기억하기 위해 사용하는 공간을 확보하기 위해; RESUME소싱은 NEXT함수 호출과 비슷한 것을 소급 적용 하지만 (현재있는 것이 아닌 다른 함수에서 반환 할 수는 있지만) FORGETGOTO 문과 더 유사한 것으로 만듭니다. 두 가지 중 하나를 수행하지 않으면 (이 프로그램은 그렇지 않은 경우) 80 번의 반복 후에 프로그램이 중단됩니다 (이 동작은 실제로 INTERCAL 사양에 지정되어 있음).

이것이 무한한 재귀로 간주되는지 (질문에서 허용되지 않음) 다소 모호합니다. 확실히 이런 종류의 NEXT함수 호출을 사용 하여 함수 호출을 구현할 수 있습니다.이 경우 효과적으로 재귀 함수일 것입니다. 그러나 함수 호출을 수행하는지 여부를 결정하기위한 정보가 충분하지 않습니다. 적어도 규칙을 위반하지 않기 때문에 어쨌든 게시하고 있으며 "꼬리 호출"을 최적화 한 INTERCAL 구현은 사양을 위반할뿐만 아니라 대부분의 기존 프로그램을 중단시킵니다. "잘못된 함수"는 IF 문에 해당하는 주요 방법입니다.

C-INTERCAL에 의해 생성 된 결과 오류 메시지는 다음과 같습니다.

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

(두 번째 줄은 탭으로 들여 쓰기되고 세 번째 줄은 8 칸으로 들여 쓰기됩니다. 이것은 터미널에서 또는 탭이있는 프로그램이 8의 배수로 거의 모든 프로그램에서 올바르게 나타납니다. 그러나 마크 다운은 넷째, 대부분의 이전 프로그램이 탭에 대해 가정한다는 가정을 위반하므로 오류 메시지의 형식이 약간 잘못되었습니다.)


오류가 실제로 말 CORRECT SOURCE AND RESUBNIT합니까? 원래 C-INTERCAL 오류 메시지의 오타에서와 같이?
Andrakis

1
@Andrakis : 그렇습니다. 그 오타는 수년간 조심스럽게 보존되었습니다.

3

Pyth, 3 바이트

W1w

온라인으로 사용해보십시오.

W1그냥 while 1:파이썬에 있습니다. 루프 본문은 STDIN에서 읽은 행을 인쇄합니다. 빈 입력으로 코드를 실행할 때 두 번째 반복이 충돌합니다.

#(loop-until-error)를 사용하는 루프가 금지되면 (그렇다고 가정) 이것이 가장 짧은 것으로 생각합니다.


3

파이썬 3, 29 바이트

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

정말 간단합니다. x에 대한 두 번째 호출에서 나는 거기에 없으며 파이썬은 그것에 대해 불평합니다.


3

미로 , 3 바이트

#(/

온라인으로 사용해보십시오!

대부분의 2D 언어와 마찬가지로 Labyrinth에는 명시적인 루핑 구문이 없습니다. 대신, 여러 번 연속해서 실행되도록 배치 된 코드는 이러한 언어의 루프입니다. Labyrinth의 경우 명령 포인터가 앞뒤로 튀기 때문에 간단한 선형 프로그램이 루프 역할을합니다. 프로그램이있는 경우 abc(일부 명령 a, bc예), 실제의 실행은 것 abcbabcbabcb...이 실행되도록 abcb무한 루프.

이 특정 프로그램이이 루프의 두 번째 반복에서 충돌하는 이유는 다음과 같습니다. 개별 명령의 기능은 다음과 같습니다. Labyrinth의 스택에는 하단에 암시 적 무한량의 0이 포함되어 있습니다.

#   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

배쉬, 11 (경계선 비경쟁)

exec $0 1$@

이 스크립트는 재귀 적으로 실행 1되며 각 반복에 전달 된 인수에 추가 됩니다. exec가 프로세스 공간을 재사용하지만 스택을 먹지 않기 때문에 이것이 TCO로 계산됩니다. 내 컴퓨터 인 YMMV에서 죽이기까지 약 10 분이 걸리기 때문에 경계선이 아닌 경쟁입니다.


1
exec $0 1$@$@ 훨씬 빨리 종료되지만 두 문자가 더 깁니다.
Jasen

3

cmd, 34 바이트

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

이것은 %i0에서 10까지 순환 합니다. (고대) color명령은 2 자리 (16 진수)의 숫자를 가진 인수를 기꺼이 받아들입니다. 인수를 사용하면 100도움말 메시지를 인쇄하고 ERRORLEVEL1로 설정 하여 실패 합니다.

한 번 이상 실행되는 루프 증명 : 쉘의 색상이 다릅니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.