En kısa otomatik yıkıcı döngü


61

Göreviniz hiçbir girdi alır ve döngü (her türlü çalışan bir tam program veya fonksiyon yazmaktır while, for, foreach, do, do-while, do-loop, gotoprogram çalışmaya kendisini durdurmak ve gerektiği anlamına gelir bir hata, neden sona erecek, özyineleme, vs) çıkış.

Kurallar:

  1. Hata çalışma zamanı hatası, işlenmeyen istisna veya programın kendisini sonlandıran herhangi bir şey olmalıdır.
  2. Hata exit;, bir noktada açıkça (veya eşdeğeri) çağırmadan durdurmayı üretmeli ve programdan çıkmalıdır .
  3. Gibi mesajlar Warning:, Notice:kendisi sonlandırmak için programı neden olmaz, vs, geçerli değildir. Örneğin, PHP bölümlerinde sıfır ile bir Warningmesaj üretilir ancak program durmaz ve çalışmaya devam eder, bu geçerli bir cevap değildir.
  4. Döngü en az bir tam döngü çalıştırmalıdır. Başka bir deyişle, hata ikinci döngüden başlayarak ve daha sonra ortaya çıkabilir. Bunun nedeni yanlış kod sözdizimini kullanarak hataya neden olmamaktır: kod sözdizimsel olarak doğru olmalıdır.
  5. for(;;);Yukarıda belirtilen kurallara uyuyorsa, döngü sonsuz olabilir (örnek ), ancak bir çalışma zamanı hatasıyla sona ermesi 2 dakikadan daha uzun sürmemelidir.
  6. Kuyruk Çağrı Optimizasyonu olmadan tekrarlama geçersiz ( 1 , 2 ).
  7. Bu yani en kısa kod kazanır.
  8. Standart boşluklar yasaktır.

C # example ( çevrimiçi olarak test edin ):

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

Liderler Sıralaması:

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>

Sayesinde Martin Ender için Afiş Snippet'ine


Sadece açık olmak gerekirse, hatanın çok fazla özyineleme ile ilgisi olmadığı sürece, TCO'suz özyineleme kullanılabilir, doğru mu? (Örneğin, ikinci özyinelemede hata yapan özyinelemeli bir işlev)
ETHproductions

@ETHproductions Dennis tarafından sohbette önerildi: “Bu durumda tam bir döngünün tamamlanıp tamamlanmadığına karar vermek zor olabilir. bir hatayla. [...] TCO'suz özyinelemenin geçersiz olduğunu söyleyebilirim. "
Mario

Içinde for(a;b;c)d;, hangi cümle deyimi ilk döngüsü sona erdikten sonra? İlk değerlendirme değerlendirmesini reddetmek geçerli cmidir?
Hedi

1
@ Hedi İşte benim alçakgönüllü görüşüm (OP değil): Tüm girişler bir tam çevrimi tamamlamalıdır, yani ikinci bir çevreye girmeleri gerekir ; Bu, en az bir ifadenin ikinci kez çalıştırıldığı anlamına gelir . Sizin örnekte yürütme sırasını olduğundan a, b, d, c, b, d, c, ..., bdöngünün başlangıcıdır ve en az ikinci kez çalıştırılmalıdır.
ETH Sunumları

2
Herhangi bir sorun başlatmak istemem ancak programın (bu konuda işlediğine göre) herhangi bir giriş yapması gerekmediğinden, parametresi olan tüm özyinelemeli çözümler geçersizdir çünkü bir parametre girişi vardır.
BrainStone

Yanıtlar:


33

MATL , 5 1 bayt

@ MartinEnder'ın CJam yanıtından alınan fikir

`

Çevrimiçi deneyin!

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

Eski versiyon

2:t"x

Çevrimiçi deneyin!

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
Aynı zamanda çevrimdışı çalışıyor. Giriş yok, boş giriş yapabileceğinizi gösterir.
Dennis,

@Dennis Hm çevrimdışı program kullanıcı girişi için beklemeye devam edecektir. Giriş etkileşimlidir, yani çevrimdışı sürümde gerektiği şekilde istenir. Böylece program süresiz olarak bekleyecek. Önemli olduğundan emin değil misiniz?
Luis Mendo

MATL'nin dahili olarak nasıl çalıştığından tam olarak emin değilim, ancak giriş talebinde bulunamayan bir ortamda (TIO'nun arka ucu gibi) yürütürseniz, herhangi bir giriş yapamaz. Ayrıca, Ctrl-D'ye veya işletim sistemine bağlı eşdeğerine basıldığında boş girdi gönderilmesine izin verilmelidir.
Dennis,

35

Python, 16 bayt

İlginç olmayan 0 bölünme yaklaşımı:

for x in 1,0:x/x

İlk yineleme 1 / 1, iyi sonuç verir. İkinci yineleme hesaplanmaya çalışılmakta 0 / 0ve ZeroDivisionErroratılmaya neden olmaktadır.

17 bayt (kişisel favori)

i=1
while i:del i

Başlangıçta, i=1hangi gerçeği, bu yüzden döngü girilir.

Döngü ilk çalıştırıldığında değişken isilinir.

Bu, ikinci kez iartık bir değişken olmadığı ve bu nedenle değerlendirmesinin başarısız olduğu anlamına gelir.NameError: name 'i' is not defined.


Başka bir 15 byte çözüm def _():_()(newline) olacaktır _(), çünkü Python kuyruk özyinelemesini optimize etmemektedir. Ancak, bu kural 6'yı ihlal ediyor.


17 byte çözümü de değiştirirseniz çalışır while i, while 1çünkü itekrar silmeye çalışır ;
user6245072

2
@ user6245072 evet, her iki parçacık da çok sayıda çalışma çözümü için önemsiz bir şekilde değiştirilebilir
FlipTack

Sen kullanabilirsiniz deltraş için yerleşik ile hile birkaç: while 1:del id.
DSM

@DSM: del idçalışmıyor. Yerleşikleri bu şekilde silemezsiniz .
user2357112 3

18

Jöle , 3 2 bayt

Ṿß

Hafızası tükenerek kendini öldürür. Yerel olarak ~ 100 saniye sonra yapar.

Çevrimiçi deneyin! ( Debug çekmecesinde ölüm belgesi )

Nasıl çalışır

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

İlk birkaç yineleme verimi:

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

Ondan sonra çok çirkinleşiyor, çok hızlı.


Jölenin hafıza limitleri nedir?
tuskiomi

Jelly'in açık bir hafıza sınırı yok, bu yüzden Python ne olursa olsun çözebilir. Bellek kullanımı her yineleme ile ikiye katlanır, bu nedenle mevcut tüm belleği oldukça hızlı bir şekilde tüketmelidir.
Dennis,

28
Yani her 2 yılda bir, başka bir yineleme yapabiliriz
tuskiomi

Öyleyse, çok sayıda RAM ile yavaş makinede durum # 5 başarısız olur?
Mad

@MadPhysicist Bu doğru. Bu olsa da zaman sınırları ile içsel bir sorundur. Uyumluluk, programın hangi makinede çalıştığına bağlıdır.
Dennis,

13

V , 2 bayt

òl

Çevrimiçi deneyin!

Bu V için mükemmel bir meydan okuma çünkü zaten her zaman bunu yapıyorum! Aslında, V'nin hiçbir şartı bile yoktur, sadece bir hatayı bozan fonksiyonlara sahiptir. Bu durumda, òaraçlar "sonsuza dek tekrarla" ve l"sağa hareket et" anlamına gelir.

Boş bir tamponda (giriş yok), ilk geçişte kırılır ve çıkış olmaz. Girdi varsa , girişin son karakterini yazdıktan sonra tüm girişi çıkardıktan sonra kırılır (bunu ayrıca bir cat programı yapar)


3
Bekle, l"doğru hareket et" anlamına mı geliyor? " lEft taşı" değil mi?
Conor O'Brien,

1
@ ConorO'Brien evet. Bunun için bazı güzel tarihsel nedenler var .
DJMcMayhem

3
Buradaki zorluk, ilk yinelemede değil, ikinci yinelemede veya daha sonra çökmesine cevap verilmesini gerektirir.
Martin Ender

11

JavaScript (ES6), 13 bayt

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

Bu, bir kere ince çalışan, sonra atan ReferenceError: a is not definedve çıkan bir özyinelemeli bir işlevdir .

İşte 15 bayt ES6 olmayan bir sürüm:

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

Bu bir kez iyi çalışır, sonra atar TypeError: i is undefinedve çıkar.


10

Bash 4.2, 22 bayt

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

TIO'da çalışmıyor çünkü Bash 4.3'e sahip ve güvendiğim hata nihayet düzeltildi.

Doğrulama

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

Bu, program bilinen bir hata nedeniyle Bash 4.2 ve daha eski sürümlerinde çöken 2 63 mod -1'i hesaplamaya çalıştığında çöküyor.


10

PHP, 22 21 20 18 bayt

Bu, PHP'nin bir değişkene fonksiyon ismi vermesine ve çalıştırmayı denemesine izin verir.

Bu sadece pifonksiyonun ismini iki kere birleştirir . Bu PHP'yi bir ile öldürür Fatal Error: Uncaught Error: Call to undefined function pipi() in [...][...].

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

Bu benim eski cevabım gibi çalışır.


Eski cevap, 20 bayt

PHP, artırma operatörünü kullanarak karakterleri artırmanıza izin verir. Yalnızca a-zaralıkta çalışır , ancak yeterlidir.

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

Bunun gerekli tüm noktaları yerine getirdiğine ve döngünün bir kez çalıştığına inanıyorum.

Görebiliyorsunuz çünkü hatayı alacaksınız Fatal error: Function name must be a string.


Bu nasıl çalışır, adım adım:

  • Atama piiçin $x.
    Yana pisürekli olarak kullanılıyor varsa, PHP kontrol edecektir.
    Olmadığından, PHP bir uyarı gösterir Use of undefined constant pi - assumed 'pi'(Temel olarak: sabit olmadığından, bir dize olduğu varsayılır)
  • İlk kez döngü
    • Fonksiyonu çalıştırın $x().
      Yana $xdeğere sahiptir pi, bu işlevini çalışacaktır pi().
  • Değeri içinde saklayın $x.
    $xşimdi π yerinepi
  • İkinci kez döngü
    • Fonksiyonu çalıştırın $x().
      Yana $xtt etmiştir, bu işlevini çalışacaktır 3.14159...().
    • string bir dize değildir, programı bu noktada a ile öldürür Fatal Error.

İşlev bulmak için @Titus sayesinde pi(), bana 1 byte tasarruf !


Güzel olan, ama bunun geçerli olduğunu sanmıyorum. Bir kez döngü gerçekten çalıştırmaz. Sen artırmak $xiçin abtdöngü gövdesi dolmadan. Bunu döngüden sonra artırarak düzeltebilirsiniz .
Aralık'ta, 14


@ aross Duh, Haklısın, geçerli değildi. Artış yanlış yerde. Şimdi olması gerektiği gibi çalışıyor. for($x=abs;;++$x)echo$x,$x();Test etmek için koşmayı deneyebilirsin . Göstermeli abs0abt Fatal error[...]. Veya benzeri.
Ismael Miguel

1
Sen kullanabilirsiniz piyerine abs. Ölümcül atmadan önce bu bir uyarı bile vermiyor.
Titus

@Titus, bu işlevi tam olarak unuttum! İşlevin _bazı sistemlerde tanımlandığını ancak güvenilmez olduğunu biliyorum . Ama bunu bulduğun için teşekkürler!
Ismael Miguel

10

GNU sed , 15 13 5 bayt

-2 Seshoumara
sayesinde -8 Zeplin sayesinde

H;G;D
  1. Desen alanına yeni bir çizgi ve tutma alanı ekler.
  2. Tutma alanına yeni satır ve desen alanı ekler.
  3. İlk newline kadar siler ve baştan başlar.

Bu hızla bellek yetersiz kalıyor:

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

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

Merhaba, nasıl s:a\?:&a:g? 1 byte azdır ve yineleme başına desen boyutunu da iki katına çıkarır.
seshoumara

@seshoumara Desen alanı boşaldığında hiçbir şeyin eşleşeceğini sanmıyorum, bu nedenle ilk değiştirmeyi asla yapmaz.
Riley,

@seshoumara echo -n | sed 's:a\?:&a:g've çıktı yok. sed 's::a:'Hiçbir şeyle eşleşmeyenle aynı olurdu.
Riley,

Sed'e echo -nkesinlikle hiçbir şey geçilmez, ancak sed, tasarım gereği girdi olmadan başlayamaz. Girdi kurallarının olmadığı durumlarda zorlukların üstesinden gelmenin kabul edilmiş yolu olduğunu görmek için bu meta linke bakın echo|sed.
seshoumara

@seshoumara Hala boş bir dize vereceğini düşündüm. O zaman iş gibi görünüyor. Teşekkürler!
Riley,

9

R, 22 25 22 20 18 bayt

Düzenleme: R'nin kuyruk çağrısı optimizasyonunu desteklemediğine işaret ettiği için @Mego sayesinde.

Edit4: Basit ama oldukça karmaşık olan daha kısa bir çözüm buldu.

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

Cevap T, tekrarlayan döngüde süresiz olarak azalan yerleşik boolean truthy değişkenini kullanır . İşlev ls(), geçerli ortamdaki tüm nesneleri listeleyen her yineleme olarak adlandırılır. Ancak, ilk argüman namehangi ortamdan nesnelerin listeleneceğini belirler. R dökümantasyonundan şunu bulduk:

Name argümanı, nesne adlarının birkaç formdan birinde alındığı ortamı belirleyebilir: tamsayı olarak ( searchlistedeki konum ); arama listesindeki bir öğenin karakter dizisi adı olarak; veya açık bir şekilde environment(mevcut sys.frameetkin işlev çağrılarına erişmek için kullanmak dahil ).

Bu prensip olarak, ilk tekrarlamada çalıştıracağımızın ls(-1)geri döneceği anlamına gelir (herhangi bir karakter tipi nesnenin character(0)varolmayan everything-except-the-firstöğelerine erişmeye çalışırken standart ). İkinci yineleme sırasında, Tiki azalır ve daha sonra ls(-3)hangi hatayı döndürür diyoruz :

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

Bunun nedeni everything-except-the-thirdelementi listelemeye çalışmamızdır, ancak yerel ortam sadece Tbu noktadaki değişkeni ( bu yinelemede bir ls()uzunluk listesi döndürür 1) içerir ve bir hata döndürülür.


1
Özyineleme sınırı varsa, özyineleme kuyruk çağrısı optimizasyonu ile yapılır gibi gelmiyor.
Mego

@Mego Bazı araştırmalardan sonra, R'nin gerçekten kuyruk çağrısı optimizasyonunu desteklemediğini öğrendim, bu nedenle bu cevabın geçerli olmadığı söylendi (daha önce bu konsepti hiç duymadım). Bir anda geçerli bir cevapla değişecek.
Billywob

9

Befunge-93, 3 bayt (muhtemelen 1 veya 0)

!%!

Çevrimiçi deneyin!

Döngünün ilk yinelemesinde yığın boştur, bu tüm sıfırların karşılığıdır. Böylece !(değil) işlemi, yığının tepesini 1'e dönüştürür ve %(modulo) işlemi, 0 mod 1'i hesaplayarak 0 bırakır !.

İkinci yinelemede, birinci !işlemler şimdi yığının en üstünde olan 1'i 0'a dönüştürür. %İşlem daha sonra 0 yorumunu hesaplar, bu da referans yorumlayıcıda sıfır hatayla bölme üretir ve böylece programı sonlandırır.

Daha sıkıcı 1 baytlık cevap da var, bunun geçerli olup olmadığından emin değilim.

"

Çevrimiçi deneyin!

Bu "komut bir dizgeyi başlatır, böylece program sayacı etrafına dolanıp "dizgiyi tekrar kapatarak tekrar karşılaşıncaya dek, satırın geri kalanındaki her boşluk yığına itilir . Daha sonra başka bir dizgeden başlayan ve yığına 79 boşluk daha bastırarak işlemi tekrarlamak için ikinci kez sarmanız gerekecektir. Sonunda bu, ya bellek yetersiz kalır (referans yorumlayıcı davranışı) ya da yığın taşması meydana getirir.

Şimdi kuralları gerçekten zorlamak istiyorsanız teknik olarak sıfır baytlık bir çözüm de var.


Bu kararı , herhangi bir tercümanın dili tanımladığı anlamına gelirse (burada olduğu gibi), o zaman Befunge dilinin bu tercüman tarafından tanımlandığı ana kadar olduğunu varsayabiliriz . Ve bu tercümanın "özelliklerinden" biri, boş bir program yürütülürken oyun alanının her döngüsü için Tanımsız bir değeri istifin üzerine itmesidir. Yeterli zaman verildiğinde sonunda bellek tükenir.

Bunun ne kadar hızlı olacağı bilgisayarın hızına, kullanılabilir belleğe ve kullanılan tarayıcıya bağlı olacaktır. Makinemde Microsoft Edge'in en iyi şekilde çalıştığını öğrendim, ancak o zaman bile iki dakika sonra 500 MB kullanıyordu. Onbeş dakikalık bir işarete kadar (birkaç gigabayt kullanılmış) Edge'in süreci öldürmeye ve sekmeyi yenilemeye karar vermesine kadar değildi. Bu yüzden, iki dakikalık bir zaman sınırının altında tutmanız pek mümkün değil, ancak mutlaka söz konusu olamayacak doğru şartlarla.


8

YANLIŞ, 8 bayt

Bu dili gerçekten seviyorum.

1[$][.]#

Bu bir a iter 1, sonra doğru [$][.]#ise döngüler $(yığının çoğaltılmış) ve ( .) çıkarır. Bu yorumlayıcı , tek 1basıldıktan sonra çöker (en az bir kez çalışan döngünün kanıtı.) Bu yorumlayıcıda bir hata gibi görünüyor. Aşağıdaki 9 baytlık program tüm uyumlu tercümanlarda çalışmalıdır:

1[$][..]#

Ayrıca FALSE'in bir süperseti olan DUP'ı da denemelisiniz. RETURN yapmak için kullandığım şey buydu.
Mama Fun Roll

@MamaFunRoll oh evet, İADE yaptığını unuttum! Bunu denemeliyim. : D
Conor O'Brien,

@MamaFunRoll DUP'u seviyorum, sadece bir DUP tercümanı yazdım ve onunla oynuyorum.
ML

@ ConnorO'Brien: İlk çözümünüzün tercümanlara çarpması gerektiğini söyleyebilirim. Sadece kendi yorumlayıcımla bir hata ayıklama yaptım ve birincisinin .veri yığınını boşalttığı açık , ikinci döngüde $boş yığının üst elemanını çoğaltmaya çalışırken, bir hataya yol açmalı (tercümanım bunu yapıyor) ). İkinci sürüm geçerli olmamalıdır çünkü ilk çevrimi bile bitirememektedir çünkü boş yığına erken erişmeye çalışmaktadır.
ML

İkinci örneğiniz için, İşte DUP yorumlayıcımdan çıkan tam renkli bir hata ayıklama dökümü . Veri yığını (ds) ve dönüş yığını (rs) nasıl çalıştığını görünce açıktır, ikincisi FALSE'ta saydam değildir.
ML

8

C, 21 bayt

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

İşte iolarak başlamak için garanti edilir 0.

Bunun bir zamanlar böyle çalıştığı doğrulanabilir:

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

Hangi, benim makinede, sonuçlanır:

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

Bulabildiğim en kısa özyinelemeli çözüm 22 bayttır :

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

gccsadece kuyruk çağrısı yok etme işlemini ortadan kaldırır, -O2bu noktada her putsşeyin iyileştirilmesini önlemek gibi bir işlevi çağırmamız gerekir . Bunun çalıştığına dair onay:

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

Aşağıdaki, 22 baytta hiçbir komut satırı argümanı olmadan çağrıldığını varsayan tam bir programdır :

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

aynı uzunluktaki fonksiyona eşdeğerdir:

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

Bunun gibi bir fonksiyon ana gibi mi işlem görür? Eğer öyleyse, ilk argüman argüman listesinin uzunluğudur (1, onu çağırmak için kullanılan addır).
Riley,

Veya, argüman kaydı, hala ana çağrılmakta olan değere sahip.
Riley,

@Riley Ahh, ikinci teori, sayının komut satırı argümanları eklendikçe artacağı gerçeğinin kanıtı gibi görünmektedir. İçgörü için teşekkürler!
Doorknob

İlk tahminime göre nasıl çağırdığınızdan emin değildim, ancak f'yi çağıran işlevin ilk argümanı ile aynı olmalıyım.
Riley,

Evet, tio
Riley

6

MATLAB, 18 bayt

Bu bir komut dosyası olarak çalıştırılabilir:

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

İlk yineleme iyidir, çünkü j(1)sadece 1. İkinci yineleme , bir 1x1 dizisi olan j(2)boyutlarını aşması nedeniyle sınır dışı bir diziyle çöküyor j.

Bu aynı zamanda bir komut dosyası olarak çalıştırılabilir, ancak yalnızca ilk çalıştırdığınızda çalışır. Yine de, MATLAB'ın önceden tanımlanmış sabitlerinin, onu dahil edeceğimi düşündüğüm, çok kötü bir istismarı. Aynı zamanda 18 bayttır.

while i/i;i={};end

Değişkenin ihenüz tanımlanmadığı bir çalışma alanında çalıştırıldığında i, bunun hayali birim olduğu varsayılmaktadır i/i = 1. İlk döngüde, atama i={}denilen boş bir hücre dizisi yaratır i. İkinci yinelemede, döngü "'hücre' türündeki giriş bağımsız değişkenleri için" Tanımsız işleç '/' ile çıkar.


İkisi de harika! Muhtemelen bunu biliyorsunuzdur, ancak j(2)normalde 2'ye 2 matris verirdi0+1i
Stewie Griffin

Teşekkürler! Bu
Octave'da

6

Perl 6 , 13 bayt

loop {5[$++]}

Sonsuz bir döngüde bir tamsayı değişmezi indeksler.
Skaler değerlerde, dizi indeksleme sözdiziminin, indeks ile birlikte kullanılabileceği 0(değerin kendisini döndürerek) kullanılabileceğine, ancak Index out of rangebaşka bir indeks için bir hata attığına dayanır .


6

QBasic, 17 bayt

Bu kod çok garip.

DO
i=11+a(i)
LOOP

Nasıl çalışır

QBasic'te değişkenler önceden başlatılmıştır. Herhangi bir tür sonekine sahip olmayan normal bir değişken, iburada olduğu gibi sıfıra önceden başlatılır.

Bir dizi gibi o değişkene abone olmayı denemenin dışında ... bu durumda, 11 sıfırlık bir dizidir. *

Döngü ile, ilk kez, bu nedenle, ibir 0ve abir dizidir. a(i)dizinin sıfır elemanını verir (ki bu 0). Her şey yolunda ve iyi. Biz set iiçin 11ve döngü. Ancak şimdi 11dizi için geçerli bir dizin değil ave program durdu Subscript out of range.

Neler olup bittiğini daha iyi gösteren 19 baytlık bir sürüm:

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

Bu 0hatadan önce on bir kez basılacaktır.


* Kavramsal olarak, 10 elemanlı bir dizi. QBasic'teki çoğu şey 1 dizinlidir, ancak diziler muhtemelen uygulama nedenleriyle değildir. Programcıların beklendiği gibi çalışmasını sağlamak için, QBasic fazladan bir giriş yapar; böylece 1'den 10'a kadar olan indeksleri kullanabilirsiniz. Git figürü.


QBasic ve diziler, eğlence nerede duruyor?
steenbergh

Hata olmadığından sahip ikinci döngü olmasını istiyorsanız, bunu yapamadık i=1+a(i)?
Quelklef

@Quelklef Hayır, yapmanız gerekecek i=i+1+a(i). Aksi halde endeks asla üst seviyeye çıkmaz 1, bu bir hata değildir.
DLosc

@DLosc Oh, haklısın.
Quelklef

5

Haskell, 15 bayt

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

f"a"ilk karakteri bırakarak tekrarlı bir şekilde "a" dizesi boyunca ilerler ve sonuçta bir Non-exhaustive patterns in function fistisna dışında sonunda başarısız olur , çünkü fyalnızca boş olmayan dizeler için tanımlanır.


5

C #, 71 38 bayt

C # 'a bir örnek verdiğin için burada golf oynadım.

Ve pinkfloydx33 sayesinde

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

Bir anahtar kelimenin çok uzun olması nedeniyle zihinsel olarak terk ettiğimden daha kısa Parse.ToString()ve hatta . Zor, kesinlikle daha kısaParse($"{c--}")checkedParse(c.ToString())

Orijinal cevap

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

Bu başlayacaktır c=0zaman, olarak azaltmak ardından bir neden olur:c=-1uint.Parse

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

Ungolfed sürümü ve bu döngünün en az bir kez çalıştığını doğrulamak

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

Tamam, vay! '$' Stenobini bilmiyordum!
MrPaulch

4

CJam , 4 bayt

1{}g

Çevrimiçi deneyin!

Boş {}gdöngünün ilk yinelemesi, 1devam etmesini söyleyen açılır . İkinci yineleme, başka bir koşullu yayınlamaya çalışır, ancak yığın boştur, bu nedenle program çöker.


4

x86 montajı (AT&T sözdizimi), 40 bayt

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

İlk yinelemesinde 1'i 1'e bölen f işlevini bildirir, ardından 0'ı 0'a bölmeyi dener ve hatalar.


Sen :) Intel sözdizimi geçerek 4 bayt kaydedebilirsiniz
mriklojn

6
Biz genellikle montajı insan tarafından okunan talimatların değil, üretilen bayt kodunun boyutuna göre puanlarız.
Dennis,

@Dennis montajlı montaj makine dilidir. ancak evet, makine dili formunda çok daha kısa olduğu iddia edilebilir.
Jasen

F etiketinden ve mov'tan kurtulun. Dec ve div'i değiştirin, hatta daha da kurtulabilirsiniz.
Daha net

4

CJam, 4 bayt

P`:~

P`dizeyi oluşturur 3.141592653589793. :~Her karakteri değerlendirir. 3sadece 3 döndüren CJam'deki geçerli koddur. Bir sonraki yinelemede, .bir rakam veya onu izleyen bir operatör gerektirdiği için hataya neden olur.


4

Ruby, 14 Bayt

loop{$./=~$.}

Nedeniyle çıkışlar ZeroDivisionError: divided by 0

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

Ruby Docs



4

Toplu, 22 20 bayt

:a
set i=%i%1
goto a

açıklama

Bu, 1başlangıçta boş bir dizeye ekleyen sonsuz bir döngüdür . Sonunda bu 8192 maksimum string uzunluğunu geçecek ve çökecektir. Makinemde bu yaklaşık 30 saniye sürer.


Güzel! Unix satır sonlarını kullanarak 2 bayt kaydedebilirsiniz.
Britanist

Etiket ve goto yerine dosya adı olan% 0 kullanabilirsiniz.
YourDeathIsComing

Bunun kuyruk özyineleme kuralını ihlal edip etmediğinden emin değildim.
şey

4

JavaScript, 9 bayt

for(;;i);

Bu bir kez çalışır, sonra ReferenceError: i is not definedhangi döngüyü durduran atar .

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


Aşağıdakileri örnek alarak, <increment>ilk döngünün sonu veya ikinci döngünün başlangıcı mı?

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

1 / görüyorum

0 satırından 3 satırına gittikten sonra 0 satırına geri döndükten sonra tam bir döngü tamamlanmış gibi geliyor.
Bu <increment>ikinci döngünün başlangıcını yapar .
- İlk döngü: <init>-> <test>-> <statement>
- İkinci döngü: <increment>-> <test>-><statement>

2 / Whileeşdeğeri

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

Bu eşdeğer olarak whilemekanizma aşağıdakiler <increment>birinci döngünün sonudur ve aynı şey gibi geliyor for.
Bu <increment>, ilk döngünün sonunu getirir .
- İlk döngü: <test>-> <statement>-> <increment>
- İkinci döngü: <test>-> <statement>-><increment>

3 / A ifadesine iki kez rastlanır

Bir ifadeye iki kez rastlandığında tam bir döngü tamamlanır.
İki kez karşılaşılan ilk ifade <test>.
Bu <increment>, ilk döngünün sonunu getirir .
- İlk döngü: <test>-> <statement>-> <increment>
- İkinci döngü: <test>-> <statement>-><increment>

4 / Bu bir kurulum

<init>İlk döngüsü için gerekli her türlü oluşturmaktadır. Sadece ikinci döngüsü için gerekli her türlü oluşturmaktadır. Bu ikinci döngünün başlangıcını yapar . - İlk döngü: -> -> - İkinci döngü: -> ->
<increment>
<increment>
<init as a setup><test><statement>
<increment as a setup><test><statement>


ECMAScript® 2016 Dil Belirtimi

Çalışma zamanı for(<init>;<test>;<increment>)<statement>;

VarDcl değerlendirmenin sonucu olsun <init>.
ReturnIfAbrupt (varDcl).
Dönüş ? ForBodyEvaluation ( <test>, <increment>, <statement>, «», labelSet).

Üç form var, bu yüzden burada en kısa olanı aldım, fark yok:
- Her ne olursa olsun <init>, ilk yinelemenin bir parçası değil.
- İlgili olan ForBodyEvaluation'de.

ForBodyEvaluation detayları ( <test>, <increment>, <statement>, «», labelSet)

0 V'nin tanımsız olmasına izin verin.
1 gerçekleştir? CreatePerIterationEnvironment (perIterationBindings).
2 Tekrar
3 Eğer [boş] değilse,
4 TestRef'in değerlendirmenin sonucu olmasını sağlayın <test>.
5 TestValue olsun mu? GetValue (testRef).
6 ToBoolean (testValue) yanlış ise, NormalCompletion (V) değerini döndürün.
7 Sonuç değerlendirmenin sonucu olsun <statement>.
8 LoopContinues (result, labelSet) yanlış ise, Completion (UpdateEmpty (result, V)) değerini döndürün.
9 Eğer sonuç. [[Değer]] boş değil, V sonuç olsun. [[Değer]].
10 gerçekleştir? CreatePerIterationEnvironment (perIterationBindings).
11 Eğer [boş] değilse, o zaman
12 Değerlendirme sonucu incRef olsun <increment>.
13 Yap? GetValue (incRef).

6 / görüyorum

Tam bir döngü tekrarlanan kısmın tam bir çalışması.
Bu <increment>, ilk döngünün sonunu getirir .
- Birinci döngü: <test>-> <statement>-> <increment>/ Diğer bir deyişle 3. satırdan 13. satıra
- İkinci döngü: <test>-> <statement>-> <increment>/ Diğer bir deyişle 3. satırdan 13. satıra

7 / A döngüsü bir yinelemedir

Bir döngü ile başlar CreatePerIterationEnvironment.
Böylece, CreatePerIterationEnvironmentyeni bir döngüle karşılaşıldığında öncekine son verilir.
Bu <increment>ikinci döngünün başlangıcını yapar .
- Birinci döngü: <test>-> <statement>/ Diğer bir deyişle 1. satırdan 9. satıra
- İkinci döngü: <increment>-> <test>-> <statement>/ Diğer bir deyişle 10. satırdan 9. satırın sonuna kadar döngü


<increment>birinci döngünün sonu veya ikinci döngünün başlangıcı?

Doğru açıklama 6 ya da 7'dir.


8
Sanırım, ikinci yinelemenin başlangıcına değil, her iki yinelemenin başlangıcına değil, artışın ilk yinelemenin sonuna kadar yükselmesine meyilliyim. Sanırım bu sorunun belirsizliği.

1
Yana for(a;b;c)d;kabaca eşdeğer a;while(b){d;c;}, ben (döngü koşulu ikinci kez denetlenir önce) hata yine birinci tekrarda atılmış olduğunu söylemek niyetindeyim.
ETHProductions

@Hulkyl İlk yineleme ilklendirmeyle başlar, bu yüzden artışın ikinci yinelemenin başlangıcı olması gerektiğini düşünüyorum.
Hedi

4
Spesifikasyonu okursanız , artış işleminin yinelemenin son kısmı olduğunu ve bu nedenle yine de ilk yinelemeye ait olduğunu görebilirsiniz.
Nit

3
@Hedi Bunun ne kadar alakalı olduğunu anlamıyorum. Artış işlemi açıkça döngü ilk çalışmasının bir parçasıdır. Tekrarlama işlemi için, artış işlemi çağrıldığında, döngü tek bir tam çalışmayı bitirmedi.
Nit

4

INTERCAL , 12 bayt

(1)DO(1)NEXT

Çevrimiçi deneyin!

NEXTINTERCAL-72'nin ana kontrol akış komutu. (Daha sonra yapılan COME FROM, daha ünlü olan, ancak dilin orijinal sürümünde olmayan revizyonlar yapıldı ve hepsi bitmiş INTERCAL uygulamaları NEXT, geriye dönük uyumluluk için desteğin farkındayım . INTERCAL-72'yi özellikle başlığında belirtme gereği duymuyorum.)

Bir NEXTdöngü oluşturmak için kullanırken, programın nerede olduğunu hatırlamak için kullandığı alanı boşaltmak için kullanmanız RESUMEveya FORGETkullanmanız gerekir; RESUMEgeriye dönük olarak NEXTişlev çağrısına benzer bir şey haline getirir (içinde bulunduğunuz işlev dışındaki işlevlerden geri dönebilseniz de) FORGET, bunu bir GOTO ifadesine benzer bir şey haline getirir. Bunlardan birini yapmazsanız (ve bu program yapmazsa), program 80 yinelemeden sonra çökecektir (bu davranış aslında INTERCAL belirtiminde belirtilmiştir).

Bunun sınırsız özyineleme olarak kabul edilip edilmeyeceği (soruya izin verilmeyen) biraz belirsizdir; NEXTBir işlev çağrısı uygulamak için bu tür bir işlemi kesinlikle kullanabilirsiniz , bu durumda etkin bir özyinelemeli işlev olacaktır, ancak burada bir işlev çağrısı yapıp yapmamamızı belirlemek için yeterli bilgi yoktur. En azından, zaten bu kuralları gönderiyorum, çünkü kuralları açıkça ihlal etmiyor ve "kuyruk çağrısı" nı optimize eden bir INTERCAL uygulaması sadece şartnameyi ihlal etmeyecek, aynı zamanda mevcut programların çoğunun bozulmasına neden olacak. "yanlış fonksiyon", bir IF ifadesinin eşdeğerini yapmanın ana yoludur.

İşte C-INTERCAL tarafından oluşturulan sonuç hata mesajı:

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

(İkinci satırın bir sekme, üçüncünün sekiz boşlukla girintili olduğuna dikkat edin. Bu, bir terminalde veya hemen hemen 8'in katlarında sekme durağı olan herhangi bir programda doğru görünüyor. Ancak, Markdown'un katlarının sekme durakları var. dördüncü olarak, çoğu eski programın sekmelerle ilgili yaptığı varsayımları ihlal ettiği için hata mesajı burada biraz biçimlendirilmiştir.)


Hata gerçekten söylüyor CORRECT SOURCE AND RESUBNITmu? Orijinal C-INTERCAL hata iletisindeki bir yazım hatası gibi mi?
Andrakis

1
@Andrakis: Evet, öyle. Bu yazım hatası yıllarca dikkatlice korunmuş.

3

Pyth, 3 bayt

W1w

Çevrimiçi deneyin.

W1sadece while 1:Python'da. Döngü gövdesi, kod boş girişle çalıştırıldığında ikinci yineleme için çöken STDIN'den okunan bir satır yazdırır.

#(Döngü-hataya kadar) kullanarak döngüler yasaklanmışsa (sanırım) yasak, bence alabileceği en kısa yol budur.


3

Python 3, 29 bayt

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

Gerçekten basit. İkinci x çağrısında orada değilim ve Python bundan şikayet ediyor.


3

Labirent , 3 bayt

#(/

Çevrimiçi deneyin!

Çoğu 2D dilde olduğu gibi, Labyrinth'in açık döngü yapıları yoktur. Bunun yerine, bir satırda birden çok kez çalıştırılacak şekilde tasarlanan herhangi bir kod, bu dillerde bir döngüdür. Labyrinth için, basit bir doğrusal program bir döngü işlevi görür, çünkü komut göstericisi üzerinde ileri geri sekecektir. Program ise abc(bazı komutlar için a, bve c), sonra gerçek yürütme olacak abcbabcbabcb...o çalıştırır böylece abcbsonsuz döngüye.

Bu özel programın neden bu döngünün ikinci yinelemesinde çökmesiyle ilgili olarak, bireysel komutların yaptığı işte. Labyrinth'in yığınının altında örtük miktarda sonsuz sayıda sıfır bulunduğunu unutmayın:

#   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 (Borderline yarışmaz)

exec $0 1$@

Bu komut dosyası 1, her bir yinelemede geçirilen hataları ekleyerek yinelenerek kendisini yürütür. Bence bu TCO olarak sayılıyor çünkü exec işlem alanını yeniden kullanıyor ama yığını yemez. Sınırda rekabet etmiyor, çünkü makinemde öldürülmesi 10 dakika kadar sürdü - YMMV.


1
exec $0 1$@$@ çok daha hızlı sona erer ancak iki karakter daha uzundur.
Jasen

3

cmd, 34 bayt

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

Bu, %i0 dan 10 a kadar değişecektir . (Eski) colorkomutu, 2 (onaltılık) ondalık basamağı olan herhangi bir argümanı mutlu bir şekilde kabul edecektir. Argümanla 100birlikte, yardım mesajını basar ERRORLEVELve 1 olarak ayarlar .

En az bir kez çalışan döngünün kanıtı: Kabuğunuzun rengi farklı olacaktır!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.