最短の自動破壊ループ


61

あなたの仕事はまったく入力を取らず、ループの任意のタイプ(実行フルプログラムまたは機能書き込むことでwhileforforeachdodo-whiledo-loopgotoプログラムの実行自体を停止しなければならないことを意味し、エラーの原因で終了する、再帰など)と出口。

ルール:

  1. エラーは、実行時エラー、未処理の例外、またはプログラムを終了させるものでなければなりません。
  2. エラーはexit;、ある時点で明示的に(または同等の)呼び出しをせずに、プログラムを停止して終了する必要があります。
  3. 以下のようなメッセージがWarning:Notice:自身に終了するプログラムを引き起こさない、などは、有効ではありません。たとえば、PHPのゼロ除算ではWarningメッセージが生成されますが、プログラムは停止せずに実行されますが、これは有効な答えではありません。
  4. ループは少なくとも1フルサイクル実行する必要があります。言い換えれば、エラーは2番目のサイクル以降で発生する可能性があります。これは、誤ったコード構文を使用してエラーを発生させないようにするためです。コードは構文的に正しい必要があります。
  5. for(;;);上記のルールを順守している場合、ループは無限になります(例)
  6. 末尾呼び出しの最適化なしの再帰は(無効である12)。
  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>

おかげマーティンエンダーのためのリーダーボードスニペット


明確にするために、TCOを使用しない再帰は、エラーが再帰とあまり関係がない限り使用できます。(たとえば、2番目の再帰でエラーが発生する再帰関数)
ETHproductions

@ETHproductionsそれはチャットでデニスによって提案されました:「この場合[完全なサイクル]が完了したかどうかを判断するのは難しいかもしれません。 [...] TCOを使用しない再帰は無効です。」
マリオ

for(a;b;c)d;、文が最初のサイクルを終了した後?c声明の最初の評価を破ることは有効ですか?
エディ

1
@Hedi私の謙虚な意見は次のとおりです(OPではありません):すべてのエントリは1つの完全なサイクルを完了する必要があります。つまり、2番目のサイクルに入る必要があります。これは、少なくとも1つのステートメントが2目に実行されることを意味します。あなたの例では、実行の順序があるのでa, b, d, c, b, d, c, ...bサイクルの開始であり、少なくとも二回実行する必要があります。
ETHproductions 16

2
私は何の問題も始めたくありませんが、(そのための機能の)プログラムが入力を受け取ることは想定されていないため、パラメーターが入力されているため、パラメーターを持つすべての再帰的ソリューションは無効です。
BrainStone 16

回答:


33

MATL5 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 Hmオフラインプログラムはユーザーの入力を待機し続けます。入力はインタラクティブです。つまり、オフラインバージョンで必要に応じて要求されます。そのため、プログラムは無期限に待機します。それが重要なのか分かりませんか?
ルイスメンドー

MATLが内部的にどのように機能するかは正確にはわかりませんが、入力を要求できない環境(TIOのバックエンドなど)でMATLを実行すると、入力を取得できなくなります。また、Ctrl-Dまたは同等のOS依存キーを押すと、空の入力を送信できるようになります。
デニス

35

Python、16バイト

興味のない0除算アプローチ:

for x in 1,0:x/x

最初の反復では1 / 1、が計算され、正常に機能します。2回目の反復では、の計算が試行され0 / 0、結果としてZeroDivisionErrorスローされます。

17バイト(個人的なお気に入り)

i=1
while i:del i

最初i=1は真実であるため、ループに入ります。

ループが最初に実行されるとき、変数iは削除されます。

これは、2回目iはもはや変数ではないため、その評価が次のように失敗することを意味します。NameError: name 'i' is not defined.


Pythonは末尾再帰を最適化しないため、別の15バイトソリューションはdef _():_()(改行)_()になります。ただし、これはルール#6に違反します。


あなたが交換する場合は17バイトのソリューションは、作品while iwhile 1それを削除しようとするため、i再び。
user6245072 16

2
@ user6245072うん、両方のスニペットは自明ワーキングソリューションの多くのために改変することができる
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 16

Jellyには明示的なメモリ制限がないため、Pythonが対応できるものは何でも。ただし、メモリの使用量は反復ごとに2倍になるため、使用可能なすべてのメモリがかなり速く枯渇するはずです。
デニス

28
だから、2年ごとに、我々は別の反復を実行することができるでしょう
tuskiomi

だから、大量のRAMを搭載した遅いマシンで条件#5に失敗しますか?
マッド物理学者

@MadPhysicistそれは正しいです。ただし、これは時間制限の固有の問題です。コンプライアンスは、プログラムが実行されるマシンに大きく依存します。
デニス

13

V、2バイト

òl

オンラインでお試しください!

これはVにとって完璧な挑戦です。なぜなら、私はすでにそれをいつもやっているからです!実際、Vには条件さえありません。エラーで中断する関数のみがあります。この場合、ò「永久に繰り返す」というl意味と「右へ移動する」という意味です。

空のバッファー(入力なし)では、これは最初のパスで中断し、出力を生成しません。そこにいる場合、入力、我々はすべての入力(これも猫のプログラムを作るの)最後の入力の文字、および出力を投稿動かすと、それが解除されます


3
待って、l「右に移動する」という意味ですか?「移動l後」ではないですか?
コナーオブライエン

1
@ ConorO'Brienうん。これには、実際にはいくつかの歴史的な理由があります。
DJMcMayhem

3
チャレンジには、最初の反復ではなく、2回目の反復でクラッシュする回答が必要です。
マーティンエンダー

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が含まれているため、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関数の名前を2回連結するだけです。これにより、PHPがFatal Error: Uncaught Error: Call to undefined function pipi() in [...][...]

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

これは私の古い答えと同様に機能します。


古い回答、20バイト

PHPでは、インクリメント演算子を使用して文字をインクリメントできます。a-z範囲でのみ機能しますが、十分です。

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

これですべての必要なポイントが満たされ、ループが1回実行されると思います。

エラーが発生するかどうかを確認できます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ます。

関数を見つけてくれた@Titusに感謝しpi()1バイト節約しました!


良いものですが、私はそれが有効だとは思わない。実際にループを1回実行することはありません。ループ本体が実行さ$xれるabt前に増分します。ループのにインクリメントすることで修正できます。
アロス16


@aross Duh、あなたは正しい、それは無効でした。増分が間違った場所にあります。今のように動作しています。実行for($x=abs;;++$x)echo$x,$x();してテストすることができます。表示されるはずですabs0abt Fatal error[...]。または類似。
イスマエルミゲル

1
pi代わりに使用できますabs。それは致命的なものを投げる前に警告さえもたらさない。
タイタス

@Titusその機能を完全に忘れてしまいました!この機能_は一部のシステムで定義されていますが、信頼性が低いことは知っています。しかし、それを見つけてくれてありがとう!
イスマエルミゲル

10

GNU sed15 13 5バイト

-2 seshoumaraに
感謝-8 ツェッペリンに感謝

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バイト少なく、反復ごとのパターンサイズも2倍になります。
セショウマラ

@seshoumaraパターンスペースが空の場合、何にも一致するとは思わないので、最初の置換を行うことはありません。
ライリー

@seshoumara echo -n | sed 's:a\?:&a:g'と出力がありません。それはsed 's::a:'何にも一致しないものと同じです。
ライリー

echo -n、絶対に何もsedのために渡されるが、SEDは、設計することにより、入力せずに起動することはできません。このメタリンクをチェックしecho|sedて、入力ルールを呼び出さないチャレンジのsedを開始する方法として受け入れられていることを確認してください。
seshoumara

@seshoumaraそれはまだ空の文字列を与えると思った。それでうまくいくようです。ありがとう!
ライリー

9

R、22 25 22 20 18バイト

編集:Rはテールコールの最適化をサポートしていないことを指摘してくれた@Megoに感謝します。

Edit4:シンプルでありながら非常に複雑な、さらに短いソリューションを見つけました。

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

答えは、組み込みのブール値の真偽値変数を使用します。Tこれは繰り返しループ内で無期限に減少します。この関数ls()は、現在の環境内のすべてのオブジェクトをリストする各反復と呼ばれます。ただし、最初の引数nameは、どの環境からオブジェクトをリストするかを指定します。Rドキュメントから次のことがわかります。

name引数は、オブジェクト名が取得される環境をいくつかの形式のいずれかで指定できます。整数(searchリスト内の位置); 検索リスト内の要素の文字列名として。または明示的にenvironmentsys.frame現在アクティブな関数呼び出しにアクセスするための使用を含む)。

これは主に、最初の反復で実行され、ls(-1)返されることを意味しますcharacter(0)everything-except-the-first文字型オブジェクトの存在しない要素にアクセスしようとするときの標準)。2番目の反復中に、は2 Tずつ減分され、続いて呼び出しls(-3)てエラーを返します:

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

これは、everything-except-the-third要素をリストしようとするが、ローカル環境にTはこの時点でのみ変数が含まれているためです(そのため、ls()長さのリストを返します1この反復)、エラーが返されるためです。


1
再帰の制限がある場合、末尾呼び出しの最適化で再帰が行われているようには思えません。
メゴ

@Megoいくつか調べてみると、Rが実際にテールコールの最適化をサポートしていないことがわかったため、この答えは無効です(これまでこの概念について聞いたことがない)。すぐに有効な回答に変わります。
ビリーウォブ16

9

Befunge-93、3バイト(1または0の場合があります)

!%!

オンラインでお試しください!

ループの最初の繰り返しでは、スタックは空になります。これはすべてゼロに相当します。したがって、!(not)操作はスタックtopを1に変換し、%(モジュロ)演算は0 mod 1を計算して0を残します。次の!演算は、プログラムカウンターがラップしてループを再開する前にその0を1に変換します。

2回目の反復で、最初の!操作により、スタックの最上部にある1が0に変換されます。%ます。その後、操作は0 mod 0を計算し、参照インタープリターでゼロ除算エラーを生成し、プログラムを終了します。

より退屈な1バイトの回答もありますが、これが有効と見なされるかどうかはわかりません。

"

オンラインでお試しください!

この"コマンドは文字列を開始します。したがって、プログラムカウンターがラップアラウンドし"て文字列を再び閉じるまで、残りの行のすべてのスペースがスタックにプッシュされます。その後、もう一度ラップして、別の文字列を開始してスタックに別の79スペースをプッシュするプロセスを繰り返す必要があります。最終的に、これはメモリ不足(参照インタープリターの動作)になるか、スタックオーバーフローを引き起こします。

本当にルールをプッシュしたい場合は、技術的にゼロバイトのソリューションもあります。


あなたが取る場合は、この判決をすることを意味する任意の(ここでは多くの人がそうであるように)インタプリタ言語を定義し、その後、我々はBefunge言語がで定義されていることを一瞬想定することができ、このインタプリタ。そして、そのインタープリターの「機能」の1つは、未定義の空のプログラムを実行するときに、プレイフィールドの各ループの値をスタックです。十分な時間があれば、最終的にはメモリが不足します。

その速度は、コンピューターの速度、使用可能なメモリ、使用されているブラウザーによって異なります。私のマシンでは、Microsoft Edgeが最適に機能することがわかりましたが、それでも2分後には500MBしか使用していませんでした。Edgeがプロセスを強制終了してタブを更新することにしたのは、15分前後(数ギガバイト使用)になってからでした。そのため、2分の時間制限内に収まる可能性は低くなりますが、適切な条件を備えていれば、必ずしも問題となるわけではありません。


8

FALSE、8バイト

私はこの言語が本当に好きです。

1[$][.]#

これはをプッシュしてから1、trueの[$][.]#間にループし$(スタックの最上部を複製)、(.)を出力します。このインタープリター1は、シングルが印刷された後にクラッシュします(ループが少なくとも1回実行されている証拠)。このインタープリターのバグのようです。次の9バイトのプログラムは、すべての準拠インタープリターで動作するはずです。

1[$][..]#

基本的にFALSEのスーパーセットであるDUPも試してください。それが私がRETURNを作成するために使用したものです。
ママファンロール

@MamaFunRollそうそう、あなたがRETURNしたことを忘れてしまった!やってみよう :D
コナーオブライエン

@MamaFunRoll私はDUPが大好きです。DUPインタプリタを書いたばかりで、遊んでいます。
ML

@ ConnorO'Brien:最初の解決策はどんなインタープリターもクラッシュさせるべきだと思います。私は自分のインタープリターでデバッグを実行しましたが、最初の.ループはデータスタックを空にし、2番目のループ$では空のスタックの最上位要素を複製しようとしているため、エラーになります(インタープリターは)。2番目のバージョンは、空のスタックに早まってアクセスしようとするため、最初のループも終了しないため、有効ではありません。
ML

2番目の例として、DUPインタープリターのフルカラーのデバッグダンプ示します。データスタック(ds)とリターンスタック(rs)がどのように機能するかを見れば明らかです。後者はFALSEでは透過的ではありません。
ML

8

C、21バイト

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

ここでiはとして開始することが保証されてい0ます。

これが次のように1回実行されることを確認できます。

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 Ahh、後者の理論が当てはまるようです。これは、コマンドライン引数が追加されると数が増えるという事実によって証明されています。洞察力をありがとう!
ドアノブ

最初の推測ではどのように呼び出すのかわかりませんでしたが、fを呼び出す関数の最初の引数と同じでなければなりません。
ライリー

うん、ティオ
ライリー

6

MATLAB、18バイト

これはスクリプトとして実行できます:

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

はであるため、最初の反復は問題j(1)ありません1。2番目の反復は、1x1配列であるj(2)の次元を超えるため、配列の範囲外エラーでクラッシュしますj

これはスクリプトとして実行することもできますが、最初に実行したときにのみ機能します。それでも、MATLABの事前定義された定数の陽気で十分な乱用であるため、それを含めると思いました。また、18バイトです。

while i/i;i={};end

変数iがまだ定義されていないワークスペースで実行する場合、これはi虚数単位であると想定しi/i = 1ます。最初のループでは、割り当てi={}によりという空のセル配列が作成されiます。2回目の反復で、ループは「タイプ 'cell'の入力引数の未定義演算子 '/'」で終了します。


両方とも素晴らしいです!おそらくこれを知っていますが、j(2)通常で2行2列の行列を与えるだろう0+1i
Stewieグリフィン

ありがとう!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番目の要素(つまり0)を返します。すべて順調です。に設定iします11てループします。しかし、現在11は配列の有効なインデックスではなくa、プログラムはで停止しSubscript out of rangeます。

何が起こっているかをより良く示す19バイトのバージョン:

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

これは印刷されます 0前に11回。


*概念的には、10要素の配列です。QBasicのほとんどのものは1インデックスですが、配列はおそらく実装上の理由でそうではありません。プログラマーが期待どおりに動作するように、QBasicは追加のエントリをスローするため、インデックス1〜10を使用できます。ただし、インデックス0は引き続き完全にアクセス可能です。図を移動します。


QBasicと配列、楽しみはどこで止まりますか!
steenbergh

エラーがないので持っている第二のループ上にあるように、あなたが行うことができませんでしたかi=1+a(i)
Quelklef 16

@Quelklefいいえ、あなたはする必要がありますi=i+1+a(i)。それ以外の場合、インデックスはを超えること1はありません。これはエラーではありません。
DLosc 16

@DLoscああ、あなたは正しい。
Quelklef 16

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#で例を提供したので、別のバージョンはゴルフしました

そして、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.

ゴルフされていないバージョンと、ループが少なくとも1回実行されることを確認する

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 16

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

わかった、すごい!「$」の略記について知らなかった!
MrPaulch


4

x86アセンブリ(AT&T構文)、40バイト

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

最初の反復で1を1で除算し、0を0で除算しようとする関数fを宣言します。


Intel構文に切り替えることで4バイト節約できます:)
mriklojn

6
通常、アセンブリは、人間が読み取れる命令ではなく、生成されたバイトコードのサイズでスコア付けされます。
デニス

@Dennis assmebledアセンブリは機械語です。ええ、これは機械語の形式ではずっと短いと言えます。
Jasen

fラベルとmovを取り除きます。decとdivを入れ替えると、さらに多くを取り除くことができます。
鮮明

4

CJam、4バイト

P`:~

P`文字列を生成します3.141592653589793:~各文字を評価します。3CJamの有効なコードで、単に3を返します。次の反復.では、数字またはそれに続く演算子が必要なため、エラーが発生します。




4

バッチ、22 20バイト

:a
set i=%i%1
goto a

説明

これは、1最初は空の文字列にa を追加する無限ループです。最終的に、これは8192の最大文字列長を超えてクラッシュします。私のマシンでは、これには約30秒かかります。


いいね!Unixの行末を使用すると、2バイトを節約できます。
ブリアンティスト16

ラベルとgotoの代わりに、ファイル名である%0を使用できます。
YourDeathIsComing

それが末尾再帰規則を破ったかどうかはわかりませんでした。
-SomethingDark

4

JavaScript、9バイト

for(;;i);

これは1回実行され、その後スローさReferenceError: i is not definedれてループが停止します。

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


以下を例にとる<increment>と、最初のサイクルの終わりですか、それとも2番目のサイクルの始まりですか?

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

1 /見える

行0から行3に移動してから行0に戻ると、完全なサイクルが完了したように感じます。
それが<increment>第2サイクルの始まりになります。
-最初のサイクル:<init>-> <test>-> <statement>
-2番目のサイクル:<increment>-> <test>-><statement>

2 / While同等

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

これに相当whileするの<increment>は、最初のサイクルの終わりであり、と同じように感じforます。
それは<increment>最初のサイクルの終わりになります。
-最初のサイクル:<test>-> <statement>-><increment>
-2番目のサイクル:<test>-> <statement>-><increment>

3 /ステートメントが2回検出された

ステートメントが2回検出されると、完全なサイクルが完了します。
2回遭遇した最初のステートメントは<test>です。
それは<increment>最初のサイクルの終わりになります。
-最初のサイクル:<test>-> <statement>-> <increment>
-2番目のサイクル:<test>-> <statement>-><increment>

4 /セットアップです

これ<init>は、最初のサイクルに必要なものをセットアップするだけです。ちょうど第二サイクルのために必要とされるものは何でも設定されます。 それが第2サイクルの始まりになります。 -最初のサイクル:-> -> -2番目のサイクル:-> ->
<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)。

3つの形式があるので、ここでは最も短いものを取り上げましたが、違いはありません
。- <init>最初の反復の一部ではないものは何でも。
-関連するのはForBodyEvaluationにあります。

ForBodyEvaluationの詳細(<test><increment><statement>、«»、labelSet)

0 Vを未定義にします。
1実行しますか?CreatePerIterationEnvironment(perIterationBindings)。
2繰り返し
3 ifが[空でない]の場合、
4 testRefを評価の結果とし<test>ます。
5 testValueを?GetValue(testRef)。
6 ToBoolean(testValue)がfalseの場合、NormalCompletion(V)を返します。
7 resultを評価の結果とし<statement>ます。
8 LoopContinues(result、labelSet)がfalseの場合、Completion(UpdateEmpty(result、V))を返します。
9 result。[[Value]]が空でない場合、Vをresult。[[Value]]とします。
10実行しますか?CreatePerIterationEnvironment(perIterationBindings)。
11 Ifが[空]でない場合、
12 incRefを評価の結果とし<increment>ます。
13実行?GetValue(incRef)。

6 /見えます

フルサイクルは、繰り返し部分のフルランです。
それは<increment>最初のサイクルの終わりになります。
-最初のサイクル:<test>-> <statement>-> <increment>/言い換えると、行3から行13-2
番目のサイクル:<test>-> <statement>-> <increment>/言い換えると、行3から行13

7 /サイクルは反復

サイクルはで始まりますCreatePerIterationEnvironment
そのCreatePerIterationEnvironmentため、新しいサイクルが開始されると、前のサイクルが終了します。
それが<increment>第2サイクルの始まりになります。
-最初のサイクル:<test>-> <statement>/言い換えれば行1から行9-2
番目のサイクル:<increment>-> <test>-> <statement>/言い換えれば行10から行9までループ


ある<increment>最初のサイクルの終了または第二サイクルの始まり?

正しい説明は6または7です。


8
私は、2番目の反復の開始または両方の反復ではなく、最初の反復の終了に増分を割り当てる傾向があると思います。これは質問の曖昧さだと思います。

1
for(a;b;c)d;はにほぼ等しいのでa;while(b){d;c;}、エラーは最初の反復(ループ条件が2回目にチェックされる前)でもまだスローされると言いたいです。
ETHproductions 16

@Hurkyl最初の反復は初期化で始まるため、増分は2番目の反復の開始であると思います。
エディ

4
仕様を読むと、増分操作が反復の最後の部分であり、それでも最初の反復に属していることがわかります。
Nit

3
@Hediそれがどのように関連するのか全くわかりません。インクリメント操作は、ループの最初の実行の一部です。言い換えると、インクリメント操作が呼び出されたとき、ループは1回の完全な実行を終了していません。
NIT

4

INTERCAL、12バイト

(1)DO(1)NEXT

オンラインでお試しください!

NEXTINTERCAL-72のメイン制御フローコマンドです。(後のリビジョンが導入されましたがCOME FROM、これはより有名になりましたが、元のバージョンの言語ではありませんでした。すべての完成したINTERCAL実装はサポートがわかっていますNEXTは後方互換性をしており、1つを除くすべてがデフォルトでサポートを有効にしています。特にタイトルにINTERCAL-72と名前を付ける必要はありません。)

使用する場合はNEXTループを形成するために、あなたが使うことになっているRESUMEFORGET、それはプログラムがされている場所を覚えておくために使用するスペースを解放するために、RESUME遡及的にNEXT関数呼び出しに似たものにします(ただし、あなたがいる関数以外の関数から戻ることができます)FORGET、GOTOステートメントにより類似したものにします。どちらも実行しない場合(およびこのプログラムは実行しない場合)、プログラムは80回の反復後にクラッシュします(この動作は実際にはINTERCAL仕様で指定されています)。

これが無制限の再帰(質問では許可されていません)としてカウントされるかどうかは、多少あいまいです。確かにこの種のNEXT関数呼び出しを使用して関数呼び出しを実装できます。この場合、事実上再帰関数になりますが、関数呼び出しを行っているかどうかを判断するのに十分な情報はありません。少なくとも、ルールに明確に違反していないため、とにかくこれを投稿しています。「テールコール」を最適化するINTERCAL実装は、仕様に違反するだけでなく、 「間違った関数」は、IFステートメントに相当する主な方法です。

C-INTERCALによって生成された結果のエラーメッセージは次のとおりです。

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

(2行目はタブでインデントされ、3行目は8つのスペースでインデントされていることに注意してください。これは、ターミナルまたは8の倍数でタブストップがあるほとんどすべてのプログラムで正しく見えます。 4、ほとんどの古いプログラムがタブについて行う仮定に違反しているため、エラーメッセージはここで少し誤っています。


エラーは本当に言うのCORRECT SOURCE AND RESUBNITですか?元のC-INTERCALエラーメッセージのタイプミスのように?
アンドラキス16

1
@Andrakis:はい、そうです。そのタイプミスは何年も注意深く保存されています。

3

Pyth、3バイト

W1w

オンラインでお試しください。

W1 ただ while 1:Pythonです。ループ本体は、STDINから読み取った行を出力します。コードが空の入力で実行されると、2回目の反復でクラッシュします。

#(loop-until-error)を使用したループが禁止されている場合(そうだと思います)、これが最短になると思います。


3

Python 3、29バイト

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

本当に簡単です。xの2回目の呼び出しでは、私はそこにいません、そしてPythonはそれについて文句を言います。


3

ラビリンス、3バイト

#(/

オンラインでお試しください!

ほとんどの2D言語と同様に、Labyrinthには明示的なループ構造はありません。代わりに、連続して複数回実行されるようにレイアウトされたコードは、これらの言語のループです。ラビリンスの場合、単純な線形プログラムはループとして機能します。これは、命令ポインターがループ上を往復するためです。プログラムがabc(一部のコマンドabおよびc)の場合、実際の実行は無限ループで実行されるabcbabcbabcb...ようになりabcbます。

この特定のプログラムがこのループの2回目の繰り返しでクラッシュする理由については、個々のコマンドが行うことは次のとおりです。Labyrinthのスタックには、下部に暗黙の無限量のゼロが含まれていることに注意してください。

#   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実行し、各反復で渡される引数に追加します。execはプロセス空間を再利用しますが、スタックを使い果たしないため、これはTCOとしてカウントされると思います。私のマシン(YMMV)で殺されるまでに約10分かかったため、境界線の競合はありません。


1
exec $0 1$@$@ 終了はずっと速くなりますが、2文字長くなります。
ジェイセン

3

cmd、34バイト

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

これは%i0から10まで循環します。(古代の)colorコマンドは、2桁の(16進数)桁の引数を喜んで受け入れます。引数を指定100すると失敗し、ヘルプメッセージが出力され、ERRORLEVEL1に設定されます。

少なくとも1回実行されているループの証明:シェルの色が異なります!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.