500 bayt ile sınırlandırılmış en uzun periyod yineleme kinesini yazın


17

İşiniz , dizideki her bir programın uzunluğunun 500 bayt ile sınırlandığı en uzun süre yineleme kinesini oluşturmaktır .

Yani, aşağıdaki adımları tekrarlarsanız:

  1. İlk programınızla başlayın
  2. Geçerli programı çalıştır
  3. 2. adıma geri dönün

Sonunda orijinal programınıza geri döneceksiniz. Döngüdeki program sayısı, en üst düzeye çıkarmaya çalıştığınız puanınızdır.

Programların hiçbiri hata oluşturamaz. Her program da aynı şekilde çalıştırılmalıdır (örneğin, farklı sürümler, uygulamalar, derleyici seçenekleri, platformlar vb.) Her durumdan sonra harici durumun "sıfırlanması" gerekir. Gerçek rastgele sayılar kullanırsanız, en kötü durum varsayılır.)

Bu meydan okumayı ayıran en uzun süre yinelenen kine (100'e karşı 500 dışında), döngüdeki her programın 500 bayt veya daha az olması gerektiğidir. Bu, mümkün olan en uzun çevrimin (256 ^ 501-1) / 255 veya daha az olduğu anlamına gelir. Tabii ki bu büyük bir sayıdır, ancak hesaplanması için ne kadar kod gerektiğini o kadar büyük değil. Bu yüzden zorluk, meşgul bir kunduz mücadelesi değil, olabildiğince çok (256 ^ 501-1) / 255 olasılık kullanmaktır.

Programların kendi kaynak kodlarına erişmesine izin verilmez. Ancak boş bir programdır edilir İsterseniz (sürece diğer kuralları takip gibi) izin verdi.

Programları manuel olarak kontrol etmek zor olacağından, teorik yöntemleri kullanarak skoru anlayabilirsiniz. Programınıza puan ve doğruluk hakkında bir açıklama eklemelisiniz. Skoru bulamazsanız, bunun yerine döngüdeki program sayısının alt sınırını defacto skoru olarak kullanabilirsiniz. Daha düşük sınırlar bulduğunuzda veya gerçek puanı tam olarak bulduğunuzda bunu güncellemenize izin verilir.

Bu , bu yüzden en yüksek puan kazanır!

DÜZENLEME: Puanınızın bilimsel gösterimde ne olduğunu yazmanız önerilir, böylece yanıtlar daha kolay karşılaştırılabilir. Özellikle programınıza daha açık bir şekilde bağlıysa, puanın diğer formlarına sahip olmak da gayet iyi. Ayrıca, okuyucuların buna uymak için önceki cevapları düzenlemeleri önerilir.


2
"mümkün olan en uzun döngü (256 ^ 501 - 1) / 255 veya daha azdır" --- bu mutlaka doğru değildir, program harici bir nesneyi işlerse orijinaline dönmeden önce birkaç kez aynı durumdan geçebilir ( RNG durumu veya tohum gibi)
JDL

2
@JDL kurallara aykırı olmalıdır, IMHO - eğer durumu kaynak kodundan başka bir yerde depolarsa, uygun bir yineleme sorgusu değildir.
Nathaniel

1
@Nathaniel Bunu başka bir yerde devlet saklamak olarak sınıflandırmazdım, sadece içinde uygulandığı programlama dilinin geçerli bir parçası olan giriş noktalarını kullanıyor. kendi kaynak kodu.
JDL

1
@JDL hayır, bunlar farklı şeyler. Herhangi bir dilde herhangi bir programın kaynak kodun dışında uygulanan şeylere güvenmesi gerekir, ancak durumun kaynak kodun dışında depolanması farklıdır. Bu, programın çıktısının kaynak kodunun belirleyici bir işlevi olmadığı, bunun yerine önceki çalıştırmalarla değiştirilen diğer bazı dış bağlamlara bağlı olduğu anlamına gelir. Bu, kınama mücadelesinde izin verilmemeli, IMHO ve OP'nin maksimum döngü uzunluğu ile ilgili açıklaması, burada izin verilmemesi gerektiğini gösteriyor.
Nathaniel

3
@JDL'nin farkında olduğunuzdan emin olmak için, belirleyici bir dilde, talimat işaretçisi durumu bir programın yürütülmesi sırasında saklar ve programın çağrılması arasında saklamaz. Programın çıktısı kaynağının belirleyici bir işleviyse, 5 durumlu örneğiniz mümkün değildir.
Nathaniel

Yanıtlar:


13

Perl 6 , 1263988.86x10835 iterasyon

$!=Q~~;<say "\$!=Q~{chrs(my@a=[R,] polymod :126[$!.ords]+1: 126 xx*)x?(@a-399)}~;<$_>~~.EVAL">~~.EVAL

Çevrimiçi deneyin!

Bu, 398 ve altındaki uzunluktaki ilk 126 baytın tüm olası kombinasyonlarını tekrarlar (önde gelen NUL baytları olan dizeler hariç). Aslında ilk yinelemeye geri döndüğünü görmek istiyorsanız, sınırı bu şekilde değiştirerek uzunluğu 1'e düşürebilirsiniz .

Açıklama:

Her yineleme, taban 126 biçiminde depolanan dizgiyi arttırır ve daha sonra onu taban 126'ya dönüştürür. Bunu, 399 uzunluğunda bir dizeye ulaşana kadar yapar ve daha sonra dizgiyi yeniden boşalmaya sıfırlar. Sayıyı kavramsallaştırmada sorun yaşıyorsanız, bunun yerine on bayt ile hayal edin. Başlayarak 0, 4 basamağa kadar artırın 1000ve sıfırlayın. Bu 104-1 yinelemedir ( 0programımın durumunda dize veya boş dize).

$!=Q~~;         # Start with an empty string
< ... >~~.EVAL  # Set a string to $_ and EVAL it
  say "\$!=Q~{...}~;<$_>~~.EVAL"   # Print the program with the string replaced by
                       :126[$!.ords]   # The string converted from base 126
                                    +1 # Incremented
          [R,] polymod                : 126 xx*  # Back to base 126
chrs(                                )  # Back to a string
     my@a=                            x?(@a-399)  # Only if it isn't 399 characters

1
Vay be, bunu gerçekten hızlı yaptın, neredeyse benimkini bitirdim, ama muhtemelen yarın bitireceğim (benimki Gol> <>)
KrystosTheOverlord

Bu hesaplama , puanınızı tahmin etmenin çok üzerinde bir yol olduğunu gösterir. Pay, kaç tane 397 uzunluklu dizginin 126 sembol kullandığını gösterir. (Wolfram alfa garip davrandığından beri
kesri toplamam gerekiyordu

@PyRulez Sayımın doğru olduğunu düşünüyorum , çünkü temelde 399 basamağa kadar 126 numaralı bir sayıyı yineliyor ... Sanırım açıklamam kapalı
Jo King

@Çok evet, sanırım açıklama sorun oldu. 397'yi 398'e değiştirdiniz, bu da skorunuzu artık fazla abartmıyorsunuz. Bunu küçümsüyor olabilirsiniz (sadece skorda tam olarak 398 uzunluk dizeleri eklediğinizden), ancak bu iyi.
19:26

3

Runik Büyüler , 64654 106 ; 122 387 -1 ≈ 2.638 x 10 807 iterasyon

"3X4+kSq'ƃZ,r{1?{1[:1Z%1+:a=+:d=+:3X4+=+:6X2+=+:'€(c*?~1-1kq}͍f1+0Bl1=6*?S1-Skql͗2=4*?{͍]}B͍l1=6*?kS1-Sq]}@

Çevrimiçi deneyin!

Uyarı: Hatalı gösteriliyor, `` (0x80) olmalıdır.

Yığından ziyade, bir dize ve yığın ͍yerine bir dizeyi değiştirmek için değiştirilmiş yığın işleçlerini kullanın (bkz. Önceki düzeltme). Bu nedenle, her karakter 1 bayt (0-127 aralık, sorunlu karakterler eksi) ile sınırlıdır, ancak bunların 3 katından fazladır (Unicode birleştirme karakterlerini atlamak zorunda kalmamaları nedeniyle daha az işlem kazanı olması nedeniyle, bazı diğer bayt tasarrufları gibi) daha yüksek sayıda yineleme sağlar.

Gerçek bir büyük endian olarak kodlamaya izin verilirse (yani, 0x00baytları bölmeden 127'nin üzerinde bayt değerlerine sahip olmak ), bu 251 387 -1 ≈ 4.717 × 10 928 yinelemelerine ulaşabilir. Bununla birlikte, TIO'nun Latin kodlaması, Python 2 cevabında Outgolfer Erik'in belirttiği gibi bunu önler. Bu puanı talep etmeden önce yerel olarak çalışıp çalışmadığını kontrol etmem gerekir.

Değiştirmek mümkün olmalıdır f1+0Bile '0B(unprinting bir var 0x16orada), ancak bunu yalnız bıraktı yüzden, beni (şeyler doğru dal / atlama / dönüş istemiyordu) savaşıyordu. Bu big-endian yapısını 387'den 388'e yükseltir.


2

C # (Visual C # Etkileşimli Derleyici) , bayraklar: /u:System.Numerics.BigIntegerve/r:System.Numerics

Puan: 10332

10 Skorumu arttı Kim şaka sayesinde 255 şimdi 1 - * 2!

var i=Parse("0");var s="var i=Parse({0}{2}{0});var s={0}{1}{0};Write(s,(char)34,s,(++i).ToString().Length<333?i:0);";Write(s,(char)34,s,(++i).ToString().Length<333?i:0);

Çevrimiçi deneyin!

açıklama

Uzunluğu çok büyük hale gelene kadar her yinelemeyi bir BigInteger artırır, bu durumda anında orijinal alıntıya geri döneriz.

//The BigInteger that will be incremented
var i=Parse("0");
//The string that encodes the quine
var s="var i=Parse({0}{2}{0});var s={0}{1}{0};Write(s,(char)34,s,(++i).ToString().Length<333?i:0);";
//Print out the string, with every {0} replaced with quotes and the {1} replaced with the original string
Write(s,(char)34,s,
//And the {2} is replaced to the BigInteger+1 if the BigInteger wouldn't be too long, else 0
(++i).ToString().Length<333?i:0);

1

DOS COM, 49 bayt, nokta 2 ^ 3608

00000000  be 31 01 89 f7 b9 f4 02  f9 ac 14 00 aa 39 ce 72  |.1...........9.r|
00000010  f8 31 c9 b4 3c ba 2b 01  cd 21 89 c3 b4 40 b9 f4  |.1..<.+..!...@..|
00000020  01 ba 00 01 cd 21 b4 3e  cd 21 c3 71 2e 63 6f 6d  |.....!.>.!.q.com|
00000030  00                                                |.|

Orijinal montaj oluşturmak için:

 BITS 16
 ORG 0100h
   mov si, l
   mov di, si
   mov cx, 500 + 0100h
   stc
n: lodsb
   adc al, 0
   stosb
   cmp si, cx
   jb n
   xor cx, cx
   mov ah, 3ch
   mov dx, f
   int 21h
   mov bx, ax
   mov ah, 40h
   mov cx, 500
   mov dx, 0100h
   int 21h
   mov ah, 3eh
   int 21h
   ret
f: db "q.com", 0
l: db 0

Bu küçük mücevher, null ve terminalin kaldıramayacağı diğer şeyler nedeniyle standart çıktı yerine bir sonraki aşamayı q.com'a yazar. Kök kine tekniği dizilişe eşdeğerdir ve faydalı yük odası 3608 bitlik bir sayaç olarak kullanılır. DOS'un çalışma şekli nedeniyle, sayacın ilk durumu ilk yürütmeden önce bellekte bulunanlardan enkaz içerir.

Orijinal 49 bayt giriş ulaşılamaz, bu yüzden 500 bayt olarak puanlamak istiyorsanız devam edin.


1

252219

#coding=L1
s=""""""
for i in range(220-len(s.lstrip("ÿ")))[:219]:s=s[:i]+chr(ord(s[i])%255-~(s[i]in"!$&"))+s[i+1:]
S='#coding=L1\ns="""%s"""\nfor i in range(220-len(s.lstrip("\xff")))[:219]:s=s[:i]+chr(ord(s[i])%%%%255-~(s[i]in"!$&"))+s[i+1:]\nS=%%r;print S%%%%s%%%%S';print S%s%S

Sonunda bir satırsonu olduğunu unutmayın. Sözdizimi vurgulayıcı içeri girmeye zorlarsa yukarıda kaldırılabilir.

Ne yazık ki, Latin-1 kodlanmış olduğu için bu programı TIO'da çalıştıramazsınız.

Yukarıda, s219 0x01 bayt içerir. Program çalıştıktan sonra, bir fark dışında kaynağı yazdırılır: sbase-252 big-endian numarası gibi artırılır, böylece en soldaki karakteri 0x02'ye "artırılır". 0x00, 0x22, 0x25 ve 0x5C baytlarından kaçınılır, bu nedenle, dizenin herhangi bir karakteri artımdan sonra karakterlerden biri olursa, karakterin kendisi tekrar artırılır.

  • 0x00 (null): Bir Python kaynak dosyası null karakter içeremez.
  • 0x22 ( "): Bir satırda üç 0x22 bayt oluşma tehlikesi vardır , yani """dizenin son karakteri ya da son karakteri olur ", böylece dize erken kapanır.
  • 0x25 ( %): Printf-dize gibi biçimlendirme bir böylece quine iskeletinin tamamlanmasından önce kullanılan %bir başka bitişik olmayan %in ssorun neden olur. Ne yazık ki, bu uyarıyı önlemek için biçimlendirmeyi yeniden düzenlemek mümkün değildir.
  • 0x5C ( \): Dizede \kelimesi kelimesine değil, bir çıkış işareti olarak kullanılma olasılığı vardır , bu nedenle önlenir.

Bu nedenle, 256 bayttan 252'si kullanılabilir. Eğer s(219 0xFF içerir ÿ) bayt, sadece bu nedenle döngüsünü tamamlayarak, 219 0x01 bayt döndürüldü oluyor.

252219

252219=8067118401622543607173815381864126969021321378412714150085501148172081568355283332551767558738710128769977220628694979838777041634307806013053042518663967641130129748108465109552157004184441957823830340121790768004370530578658229253323149648902557120331892465175873053680188287802536817909195292338112618632542000472094347226540339409672851252596442228662174845397731175044304251123874046626291460659909127172435776359148724655575878680270692451120531744950544969860952702932354413767504109600742385916705785109741289800204288


1

2512262.1x10542

  • 251 39 bağımlılığın kaldırılmasıText
  • 251 122 golfed artan işlevi
  • 251 128 birleşik önek ve sonek kaynak dizeleri
  • 251 188 bağımlılık kaldırıldıGast.GenLibTest

Yazdırılamayan / geçersiz UTF-8 nedeniyle xxd biçiminde sunulur:

00000000: 6d6f 6475 6c65 2071 3b69 6d70 6f72 7420  module q;import 
00000010: 5374 6445 6e76 3b53 7461 7274 3d28 7325  StdEnv;Start=(s%
00000020: 2830 2c34 3129 2c3f 5b27 0101 0101 0101  (0,41),?['......
00000030: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000040: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000050: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000060: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000070: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000080: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000090: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000a0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000b0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000c0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000d0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000e0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000f0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000100: 0101 0101 0101 0101 0101 0101 275d 2c73  ............'],s
00000110: 2528 3432 2c39 3939 292c 712c 732c 7129  %(42,999),q,s,q)
00000120: 3b71 3d69 6e63 2721 273b 3f5b 683a 745d  ;q=inc'!';?[h:t]
00000130: 2363 3d68 2b69 6628 616e 7928 283d 3d29  #c=h+if(any((==)
00000140: 6829 5b27 ff09 0c26 5b27 5d29 2702 2727  h)['...&['])'.''
00000150: 0127 3d5b 633a 6966 2863 3e68 2969 643f  .'=[c:if(c>h)id?
00000160: 745d 3b3f 653d 653b 733d 226d 6f64 756c  t];?e=e;s="modul
00000170: 6520 713b 696d 706f 7274 2053 7464 456e  e q;import StdEn
00000180: 763b 5374 6172 743d 2873 2528 302c 3431  v;Start=(s%(0,41
00000190: 292c 3f5b 2727 5d2c 7325 2834 322c 3939  ),?[''],s%(42,99
000001a0: 3929 2c71 2c73 2c71 293b 713d 696e 6327  9),q,s,q);q=inc'
000001b0: 2127 3b3f 5b68 3a74 5d23 633d 682b 6966  !';?[h:t]#c=h+if
000001c0: 2861 6e79 2828 3d3d 2968 295b 27ff 090c  (any((==)h)['...
000001d0: 265b 275d 2927 0227 2701 273d 5b63 3a69  &['])'.''.'=[c:i
000001e0: 6628 633e 6829 6964 3f74 5d3b 3f65 3d65  f(c>h)id?t];?e=e
000001f0: 3b73 3d22                                ;s="

Çevrimiçi deneyin!

Hariç tüm bayt değerleri ile 226 bayt dize artırır \0, \n, \r, 've \.

Bu karakterlerden kaçınmamızın nedeni:

  • \0 derleyiciyi kızdırır
  • \nve \rlistelerde görünemez
  • ' listeyi bitirir
  • \ kaçan bir karakterden önce gelirse sorunlara neden olabilir

Dize bir kez tüm orijinal program vererek, \377tüm \001s sarar .


Çıktı (en azından TIO'da) sıra değeri 128 olan ancak iki bayttan oluşan karakterdir C2 80. Bu, yerel makinenizdeki davranışla aynı mı?
Jo King

1
@JoKing Oh, hayır, makinemde tek bir bayt var. TIO geçerli UTF-8 olmadığında çıktıyı yönetir (ve girdi dosyaları da).
19'da

1
@JoKing Cevabı, TIO'da doğru davranışı görmeyi mümkün kılan yeni bir biçime değiştirdim.
Οurous


0

Gol> <> , 70 bayt, 39039000 yineleme

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||lPaa*5*=?1:1=Q$~$~|:1)lPaa*5*(Q?:|r2ssH##

Vay be, bu sandığımdan çok daha düşük ... Sonraki adım! Daha fazla iterasyona sahip olmak !!!

Çevrimiçi deneyin!


500'e ulaştığında hiçbir şeyi silmiyor gibi görünüyor, sadece bir NUL baytı ekliyor
Jo King

Bu bile işe yarıyor mu? Çalışmak için "son karakter artış" alamadım
sadece ASCII-sadece

@ ASCII-only Şimdi bu çalışıyor, daha önce için üzgünüm, her şeyi düzeltmeye çalışırken bir bölümü berbat ettim. Şimdi çalışıyor, rahatsızlıktan dolayı özür dilerim !!!
KrystosTheOverlord

@JoKing NUL bayt silme işlemidir, şimdi program neredeyse bitene kadar silmeli, daha sonra NUL'u silmeli ve eğer bir ~ ise son karakteri arttırmalıdır, o zaman geri döner. Normal!!!
KrystosTheOverlord
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.