500バイトで区切られた反復期間の最長期間を書き込みます


16

あなたの仕事は、シーケンス内の各プログラムの長さが500バイトに制限されている、最も長い期間反復するquineを作成することです。

つまり、次の手順を繰り返す場合:

  1. 最初のプログラムから始めます
  2. 現在のプログラムを実行する
  3. 手順2に戻る

最終的に元のプログラムに戻ります。サイクル内のプログラムの数はスコアであり、最大化しようとしています。

どのプログラムでもエラーは発生しません。各プログラムも同様に実行する必要があります(異なるバージョン、実装、コンパイラオプション、プラットフォームなどはありません)(編集:はい、擬似乱数ジェネレーターのような外部状態は最後に含まれていましたステートメント。外部状態は、各実行後に「リセット」する必要があります。真の乱数を使用する場合、最悪の場合が想定されます。

この課題と最長期間の反復クイン(100対500以外)との違いは、サイクル内のすべてのプログラムも500バイト以下でなければならないことです。これは、可能な最長のサイクルが(256 ^ 501-1)/ 255以下であることを意味します。それはもちろん大きな数字ですが、計算に必要なコードの量という点ではそれほど大きくはありません。したがって、課題は、できるだけ多くの(256 ^ 501-1)/ 255の可能性を使用することであり、忙しいビーバーの課題ではありません。

プログラムが独自のソースコードにアクセスすることは許可されていません。ただし、必要に応じて空のプログラム使用できます(他の規則に従う場合)。

プログラムを手動でチェックするのは難しいので、理論的な方法を使用してスコアを計算することができます。プログラムにスコアと正確さの説明を含める必要があります。スコアを把握できない場合は、代わりに、サイクル内のプログラム数の下限を事実上のスコアとして使用できます。より良い下限を見つけた場合、または正確な実際のスコアを見つけた場合、これを更新することができます。

これはので、最高のスコアが勝ちます!

編集:あなたのスコアが科学的記法であるものを書くことをお勧めします。そうすれば、答えはより簡単に比較できます。他の形式のスコアも特に問題なくプログラムに関連付けられている場合、まったく問題ありません。また、読者はこれに準拠するために以前の回答を編集することをお勧めします。


2
「可能な最長のサイクルは(256 ^ 501-1)/ 255以下」---これは必ずしも真実ではありません。外部オブジェクトを操作する場合、元のプログラムに戻る前にプログラムが同じ状態を複数回通過することがあります( RNG状態またはシードなど)
JDL

2
@JDLはルールに反するはずです、私見-ソースコード以外の場所に状態を保存する場合、適切な反復クインではありません。
ナサニエル

1
@Nathaniel私はそれを他の状態を保存するものとして分類せず、単にそれが実装されているプログラミング言語の有効な部分であるエントリポイントを使用しています。おそらく、プログラミング言語で別の関数を呼び出すものは独自のソースコード。
JDL

1
@JDLいいえ、これらは異なるものです。どの言語のプログラムでも、ソースコードの外部で実装されているものに依存する必要があることは明らかですが、ソースコードの外部で状態を保存することは異なります。これは、プログラムの出力がソースコードの決定的な関数ではなく、以前の実行によって変更された他の外部コンテキストに依存することを意味します。これは、クインチャレンジ、IMHOで許可されるべきではなく、最大サイクル長に関するOPの声明は、ここで許可されないことを意図したことを示しています。
ナサニエル

3
確定的な言語では、命令ポインタはプログラムの実行中にのみ状態を保存し、呼び出し間では状態を保存しません。プログラムの出力がソースの決定的な関数である場合、5ステートの例は不可能です。
ナサニエル

回答:


12

Perl 6の1263988.86×10835回の反復

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

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

これは、長さ398以下の最初の126バイトのすべての可能な組み合わせを繰り返します(先頭のNULバイトの文字列を除く)。あなたはそれが実際には最初の反復に戻っていることを確認したい場合は、制限値を変更することにより、1に長さを短くすることができますので、のように

説明:

各反復は、ベース126形式で格納された文字列をインクリメントし、それをベース126に変換します。長さ399の文字列に到達するまでこれを行い、文字列をリセットして空に戻します。数値の概念化に問題がある場合は、代わりに10バイトで想像してください。から始めて0、最大4桁まで増分し1000、リセットします。これは、1041(含む、反復0または私のプログラムの場合は空の文字列)。

$!=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
うわー、あなたは本当に速くやった、私は私のものでほとんど終わったが、おそらく明日それを終えるだろう(私はGol> <>に行くつもりだ)
KrystosTheOverlord

この計算は、あなたがあなたのスコアを見積もったことを示唆しています。分子は、126個のシンボルを使用する長さ397の文字列の数です。(ウルフラムアルファが変な振る舞いをしていたので、分数を合計に分配しなければなり
ませんでした

私は@PyRulez だと思う、それは基本的に399桁にベース126番号を反復だから私の電話番号は、正しいです...私が思うに、私の説明がオフだった
ジョー・キング

@JoKingああ、説明は問題だったと思う。397を398に変更したため、スコアが過大評価されなくなりました。あなたはそれを過小評価しているかもしれません(スコアに正確に398の長さの文字列だけを含めたので)が、それは問題ありません。
PyRulez

2

ルーンエンチャントメント64654 106 ; 122 387 -1≈2.638×10 807反復

"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]}@

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

警告:は誤って表示され、「(0x80)である必要があります。

スタックではなく、文字列とで変更されたスタック演算子を使用して、スタックでは͍なく文字列を変更します(以前のリビジョンを参照)。そのため、各文字は1バイト(0-127の範囲、問題のある文字を差し引いたもの)に制限されていますが、3倍以上あります(Unicodeを結合するUnicodeをスキップする必要がないため、処理の定型化が少ないため)その他のバイトの節約と同様に)より多くの反復を実現します。

真のビッグエンディアンとしてのエンコードが許可されている場合(つまり、バイトを挿入せずに127を超えるバイト値を持つ場合0x00)、251 387 -1≈4.717×10 928の反復を達成できます。ただし、TIOのラテンエンコードは、Erik the OutgolferがPython 2の回答で述べたように、これを防ぎます。このスコアを要求する前に、ローカルで機能するかどうかを確認する必要があります。

交換することができるはずf1+0B'0B(unprintingあります0x16が)、私は一人でそれを残したので、それは、私に(物事が正しく支店/スキップ/リターンにしたくなかった)戦っていました。これにより、ビッグエンディアン構造が387から388に引き上げられます。


1

DOS COM、49バイト、期間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                                                |.|

作成する元のアセンブリ:

 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

この小さな宝石は、端末が処理できないヌルやその他のもののために、標準出力ではなく次のフェーズをq.comに書き込みます。ルートクインの手法は文字列化同等であり、ペイロードルームは3608ビットカウンターとして使用されます。DOSの動作方法により、カウンターの初期状態には、最初の実行前にメモリにあったものからの破片が含まれています。

元の49バイトの入力は到達不能であるため、500バイトとしてこれをスコアリングする場合は先に進みます。


1

C#(Visual C#インタラクティブコンパイラー)、フラグ:/u:System.Numerics.BigIntegerおよび/r:System.Numerics

スコア:10 332

10 255 * 2-1から現在にスコアを上げたJoKingに感謝します!

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

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

説明

長さが大きくなりすぎるまで、BigIntegerを繰り返しごとにインクリメントします。その場合、すぐに元のクインに戻ります。

//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

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

末尾に改行があることに注意してください。構文ハイライターが強制的に挿入されると、上記のように削除される場合があります。

残念ながら、このプログラムはLatin-1でエンコードされているため、TIOで実行できません。

上記にsは、219 0x01バイトが含まれています。プログラムの実行後、1つの違いを除いて、ソースが出力さsれます。ベース252のビッグエンディアン番号のようにインクリメントされているため、左端の文字は0x02に「インクリメント」されています。バイト0x00、0x22、0x25、および0x5Cは回避されるため、文字列のいずれかの文字がインクリメント後にそれらのいずれかになった場合、文字自体は再びインクリメントされます。

  • 0x00(null):Pythonソースファイルにnull文字を含めることはできません。
  • 0x22("):3つの0x22バイトが連続して形成される危険性があります。つまり"""、文字列の最後の文字が"ため、文字列は早まって閉じられます。
  • 0x25( %):printf のような書式文字列がQUINE骨格が完了する前に使用される、そうで%互いに隣接しない%sトラブルの原因となります。残念ながら、この警告を回避するためにフォーマットを並べ替えることはできません。
  • 0x5C(\):\は、文字列内のエスケープマークとしてそのまま使用される可能性があるため、回避されます。

したがって、256バイトのうち252バイトが使用可能です。s219 0xFFを含む場合(ÿ)バイト、それは単に219 0x01バイトに戻され、サイクルが完了します。

252219

252219=8067118401622543607173815381864126969021321378412714150085501148172081568355283332551767558738710128769977220628694979838777041634307806013053042518663967641130129748108465109552157004184441957823830340121790768004370530578658229253323149648902557120331892465175873053680188287802536817909195292338112618632542000472094347226540339409672851252596442228662174845397731175044304251123874046626291460659909127172435776359148724655575878680270692451120531744950544969860952702932354413767504109600742385916705785109741289800204288


1

2512262.1×10542

  • 251 39依存を削除Text
  • 251 122ゴルフインクリメント機能
  • 251 128プレフィックスとサフィックスのソース文字列の組み合わせ
  • 251 188への依存を削除Gast.GenLibTest

印刷不能/無効なUTF-8のためにxxd形式で表示されます:

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="

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

除くすべてのバイト値によってインクリメント226バイトの文字列を\0\n\r'および\

これらの文字を避ける理由は次のとおりです。

  • \0 コンパイラを怒らせます
  • \nまた\r、charlistsには表示できません
  • ' 文字リストを終了します
  • \ エスケープ可能なキャラクターの前に来ると問題を引き起こす可能性があります

文字列がすべて\377sになると、すべてのsに折り返され\001、元のプログラムが提供されます。


出力(少なくともTIOでは)は、序数値が128の文字ですが、2バイトで構成されますC2 80。これはローカルマシンの動作と同じですか?
ジョーキング

1
@JoKingああ、いや、マシンでシングルバイトを取得します。TIOは、有効なUTF-8(および入力ファイルも)でない場合に出力をマングルします。
Οurous

1
@JoKing TIOで正しい動作を確認できるように、回答を新しい形式に変更しました。
Οurous

0

Gol> <>、70バイト、39039000反復

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

うわー、それは思ったよりずっと低いです...次のステップ!より多くの反復を行う!!!

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


それが500に達すると、それだけで、何も削除していないようNULバイトを追加
ジョー・キング

これはまったく機能しますか?私は仕事に、「最後の文字をインクリメント」を得ることができない
ASCIIのみ

@ASCIIのみこれで機能します。以前は申し訳ありませんが、全体の修正作業中にセクションを台無しにしてしまいました。ご不便をおかけして申し訳ありません!!!
KrystosTheOverlord

@JoKing NULバイトは削除プロセスです。プログラムは、ほとんどなくなるまで削除し、NULを削除して最後の文字をインクリメントする必要があります(〜の場合)通常に!!!
KrystosTheOverlord
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.