最長期間の反復クイン


10

ご存知のように、クインは独自のソースコードを出力するプログラムです。ただし、別の別のプログラムを出力して、最初のプログラムを再度出力するプログラムを作成することもできます。たとえば、Python 2プログラム

x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3

実行すると、次のテキストが出力されます。

print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""

Pythonプログラムとして実行すると、元のコードが再び出力されます。これは反復クインと呼ばれます。元のコードに戻すには2回実行する必要があるため、ピリオド2を持っていると言います。しかし、もちろん、もっと長い期間も可能です。

あなたの課題は、可能な限り長い期間の反復クインを、選択した言語で100バイト以下で記述することです。(上記の私の例は、末尾の改行を含めて119バイトであるため、この仕様には適合しません。)

次の規則と説明に注意してください。

  • 通常のquine規則が適用されます。つまり、プログラムは独自のソースコードに直接アクセスできる言語機能を使用できません。
  • 反復された出力は、最終的に元のコードに正確にループバックする必要があり、デモンストレーションまたはそれができることの証明を含める必要があります。
  • また、サイクルがそうである限り、そのサイクルが長い理由の説明も含める必要があります。これは数学的な証明のレベルである必要はありませんが、あなたの言語に精通している誰かに説得力があるはずです。(この規則はここにあります。非常に大きな数の回答が含まれると予想されるためです。)
  • 少なくともそれが長いことを証明できる限り、正確な数を与えるのではなく、「少なくとも1,000,000回の反復」のようなことを言っても問題ありません。この場合、スコアは1,000,000になります。そうでなければ、あなたのスコアはあなたのクインの期間です。
  • 100バイトの制限は初期プログラムにのみ適用されます-それが出力するプログラムは長くなる可能性がありますが、元のコードを出力するには、最終的に100バイトに戻す必要があります。
  • マシンに無限のRAMと無限のランタイムがあると想定できますが、言語に無制限の精度のデータ型(整数など)がない場合は想定できません。あなたはできるあなたのパーサが処理できる入力の長さに制限はありませんと仮定します。
  • 最も高いスコアが勝ちます。

注意:Quit Whiningと呼ばれる既存の課題があります。クインを繰り返すことには、クインの反復も含まれます。ただし、同じコンセプトに基づいていることを除けば、これらはまったく異なるタイプの課題です。もう1つはまっすぐなコードゴルフですが、これは(意図的に!)偽装で忙しいビーバーの問題です。この質問への適切な回答を生成するために必要な手法は、他の質問への回答に必要なものとは非常に異なる可能性が高く、これは仕様によるものです。


1
@LeakyNun答えが削除されたのはあなたなのかmodなのかはわかりませんが、おそらく何が問題であるかを説明すれば、これが重複ではない理由がわかるでしょう。この質問では、ソースの長さに100バイトの制限を指定しているため、実際にはその方法を使用して「好きなだけ高く」することはできません。それがこの質問の要点です。それに答えるには、あなたがしなければならないことは、100文字に収まる最も長いバージョンを投稿し、その期間が何であるかを言うことです。あなたが投稿したものは良い最初の試みですが、勝者になることはほとんどありません。
ナサニエル

1
@Daveの課題は、少数のバイトで大きな数を指定することです。それはそれが設計された周りの全体の原則です。問題は、3 ^^^ 3があなたの言語で100バイト単位で指定できる最大の数値か、それともそれより大きい数値かということです。それが、この課題に関するものです。それはその中核です。それは私が人々に見てもらいたかったことです。この構造の何もない挑戦への表面的な類似に基づいてそれを閉じることは、超、非常に苛立たしいです。
ナサニエル

1
@Dave(2番目のコメント)ですが、賢いのであれば、マシンの精度に制限される必要はまったくありません。競合他社の回答の期間は2 ^(2 ^ 64)よりはるかに長いと予想します。
ナサニエル

3
それでは、codegolf.stackexchange.com / q / 18028/194の複製として閉じますか?
Peter Taylor

1
@PeterTaylorはより近いテーマですが、それでも非常に異なる課題です。数値を出力することは、何かを何度も行うこととはかなり異なります。もちろん、私はそれがまったく閉鎖されないことを望みます。
ナサニエル

回答:


10

PHP、期間2,100,000,000

PHPでこれが可能だと誰が思ったでしょう?!:-)

これは実際には私の最初のクインで、長さは99バイトです。

<?$i=1;$i*=21e8>$i;printf($a='<?$i=%d;$i*=21e8>$i;printf($a=%c%s%c,++$i,39,$a,39);',++$i,39,$a,39);

PHPは2 * 10^8からintegerに切り替えるよりも大きな数をサポートしますがdouble、インクリメントは機能せず(無限ループにつながります)、100バイトに収まる別の解決策は見つかりませんでした。まだ。

証拠は、21億のリセットポイントに到達するまで各反復でカウントアップするだけなので、かなり単純です。

クレジットデイブコメントにとの擬似コードでアプローチを掲示し、ボブTwells私は最小限のPHPのQUINEのコードをコピーし誰から、。

テストプログラム(sloooooow):

<?php
$o = file_get_contents('quine.php');
for ($i = 0; $i < 22e8; $i++) {
    if ($i%2==0) exec('php q > p'); else exec('php p > q');
    $a = file_get_contents(($i%2==0) ? 'p' : 'q');
    echo "\r" . str_pad($i,6,' ') . ":\t$a";
    if ($a == $o) {
        die;
    }
}

ええと、少なくとも私が最初に答えます。


1
補足:これは、約10 ^ 9.322219295程度です。
LegionMammal978 2016

8

Mathematica、期間E8.5678#3 E2.1923# 4〜E6.2695#3#2

Print[ToString[#0, InputForm], "[", #1 - 1 /. 0 -> "Nest[#!,9,9^9^99!]", "]"] & [Nest[#!,9,9^9^99!]]

スコアはHyper-E表記で説明されていることに注意してください。反復により、final Nest[#!,9,9^9^99!]Nest[#!,9,9^9^99!]-1、Nest[#!,9,9^9^99!]-2、Nest[#!,9,9^9^99!]-3、...、3、2、1の10進展開に置き換えられ、に戻りNest[#!,9,9^9^99!]ます。


階乗が速く成長しないのではないでしょうか?
Maltysen 2016

1
Mathematicaは知りませんが、これはクインのルール違反ではありませんか?それは自分のソースコードを読んでいるのですか?ToString[#0, InputForm]
daniero 2016

だから、ちょうど9 !!!! 動作しませんか?idk cuz mathematica rpiを持っていません。
Maltysen 2016

@Maltysenこれは、9の二重階乗の二重階乗、または(9 !!)!!を計算します。≈2.116870635・10¹²⁰²
LegionMammal978

@danieroつまり、アイデアは標準のCJamに似ている{"_~"}_~ので、それは有効であるべきだと思います...
LegionMammal978

5

R、期待値のランダムな期間2 ^ 19936-0.5

f=function(){
    options(scipen=50)
    body(f)[[4]]<<-sum(runif(623))
    0
    cat("f=")
    print(f)
}

Rのデフォルトの乱数ジェネレーターの周期は2 ^ 19937-1で、623の連続次元で等分布です。したがって、その期間のどこか(ただし1回だけ)は、623の長さのゼロのベクトルになります。そこに着くと(そしてシーケンスの開始に合わせて)、次の623個のランダムなU [0,1]数の合計がゼロになり、元のプログラムに戻ります。

プログラムは非常に高い確率で、ゼロに戻る前に同じ非ゼロ状態を数回通過することに注意してください。たとえば、合計311.5が最も可能性が高く、発生する可能性のある方法は多数ありますが、RNGでは0の期間を311.5の期間より長くすることができます。


このエントリに割り当てるスコアがわからない:P
JDL

1
ルールに従って:「正確な数を与えるのではなく、「少なくとも1,000,000回の反復」のようなものを言うのは結構です」だから私の意見では「少なくとも1回の反復」です。なぜなら、私たちが最初の試みで本当に幸運になるなら...;)
YetiCGN 2016

「ランダムな入力を生成する可能性がありますが、答えはそこにあります」のような多くの標準的な抜け穴とは異なり、これは正確な答えが確実に発生することを示す非常にきちんとした証明であり、非常に優れた見積もりが与えられます。いいね!
アンドレイKostyrka

1
プログラムがいったん基本状態に戻ると、ランダムでない期間がちょうど2 ^ 19937-1になります。
JDL

この出力は実際のプログラムと一致しません(空白が少し欠けています)。また、状態はプログラム呼び出し間で保持されないため、期間は正確な数値ではなく、一貫していません
Jo King

1

JavaScript、期間9,007,199,254,700,000

勝つことはできませんが、この課題でJavaScriptを使用するのは楽しいものでした。

a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)

次のサイクルに従います。

a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699999-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699998-1||90071992547e5)
// etc...
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),3-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),2-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
// and so on

注:次のように、スコアの〜0.08%のみを削除しながら、18バイト短くすることができます。

a="a=%s;console.log(a,uneval(a),%.0f-1||9e15)";console.log(a,uneval(a),1-1||9e15)

1

C、期間2,100,000,000

unsigned long long i;main(a){i=1;i*=21e8>i;printf(a="ungisned long long i;main(a){i=%d;i*=21e8>i;printf(a=%c%s%2$c,++i,34,a);}",++i,34,a);}

PHPの回答に基づいています(明らかに)。時間がありましたら説明で更新します。



1

Python 2

9((99↑↑(9((99↑↑(9((99↑↑(9↑↑51))9)1))9)1))9)+1

99(99↑↑12)+1

b=0;s="print'b=%d;s=%r;exec s'%(-~b%eval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9))),s)";exec s

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

コードでは、それまでのb=0変更はb=1b=2それが到達するまで続き、b=decimal expansion of the periodその後リセットされてb=0


1
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9よりもはるかに高いです9**9**99**99**99**99**99**99**99**99**99**99**99**99。とはいえeval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))、はるかに高い数値の場合と同じように実行できます。
バブラー

peroidの意味?
SSアン


1
@Mukundan期間を意味するかもしれませんが、よくわかりません。テトラションとは何ですか。
SSアン

@SSAnne申し訳ありませんが、タイプミスでした。指摘してくれてありがとう
Mukundan

0

Gol> <>、70バイト、ピリオド32588319662129706495760020617571905647680487948828870818800327491986095953477010107951243339634806280305573964022539575879085231587686846939060379372963971590813619650590816522713615428796947583901754481192603680808959620908188187202502606962818148577208902602602812819448608520260260961128518020260260696281944857720890260260121212

非常に大きい(3.25E270)と呼ばれることもある

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

これは実際には、500バイトのイテレータに置いた回答の変更バージョンです

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||//if last is equal to 1 and length is 71, delete the delete char, if the last char is '~', delete and push 'H#', which will later return to 'H##', completing the cycle!
lPffXfX=?1:1=Q$~$~|          //if length is equal to 15^15^15, then start delete process(append ascii one)
:1)lPffXfX(Q?:|              //if the last character is not 1 (the delete checker), and length is less than 15^15^15, duplicate the last value and append
r2ssH##                      //push the " to the front and output the whole thing

うまくいけば、私はスコアを正しく取得し、バグはありません。この値を実際に計算する実際の方法はなく、理論的なものです。しかし、それは膨大な数です!!!

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

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