増加するサイズでプログラムを生成する


21

この課題では、元のプログラムの2倍の長さのプログラムを出力するプログラムを作成します。出力されたプログラムは、出力の新しいプログラムは、プログラムが倍増する必要があり、その長さを。

私のプログラムがa次の場合:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

ルール

  • クインは組み込まれていません
  • 元のプログラムは少なくとも1バイトである必要があります
  • シーケンスは理論的には無限に機能するはずです
  • あなたのプログラムは何(ファイル、stdio)からも読み取ることはできません

スコアは元のプログラムのサイズです。


コード自体が含まれている場所にアクセスするか、コードが含まれている場所にアクセスして、ファイルにアクセスするのはどうですか?
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴは、私が信じているルールに違反することになるため、許可されていません。
ダウンゴート

2
Doᴡɴɢᴏᴀᴛ@クワイン規則は、タグwikiが推奨されますが、自動的に適用されません
マーティン・エンダー


回答:



8

JavaScript、62 61 37バイト


@Doᴡɴɢᴏᴀᴛに助けてくれてありがとう!


元の[37バイト]:

f=_=>'f='+'_'.repeat((10+f).length)+f

子[74バイト]:

f=______________________________________=>'f='+'_'.repeat((10+f).length)+f

孫[148バイト]:

f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f


代替(コンソールへの印刷、および完全なプログラムとして):

元の[61バイト]:

f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

子[122バイト]:

f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

孫[244バイト]:

f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()



使い方!

1.   f=_=>   関数fを次のように定義しますconsole.log(...)

2.   ;f()   関数fを実行します。

3.   (関数f)  

  • console.log(...)   以下を印刷します。

    • f=   リテラルテキスト "f ="
    • ${'_'.repeat((0+f).length+5)   「_」はfの長さだけ繰り返され、fの文字列化に含まれない文字を考慮して変更されます。
    • +f}   関数fの文字列化
    • ;f()   リテラルテキスト「; f()」

ノート

  • console.log代わりに必要なのはalertalert(少なくとも私のマシン/ブラウザの設定では)本当に長い文字列ではうまく再生できないようだからです
  • _のは、それらがFの文字列化に含まれていることを保証するために、関数f(未使用)パラメータの名前に挿入されます。
  • console.log最初のソリューションの2番目のソリューションの主な改善(を除く):文字列にキャストする10代わりに関数に追加すると、01バイト長くなり、後で長さに1を追加してバイトを節約する必要がなくなります。

0+fまた、文字列に関数をキャストする動作するはずです
Downgoat

48バイト:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Downgoat

@Doᴡɴɢᴏᴀᴛ結果を返すことは通常許容できることを忘れていました。更新されます。
jrich

@Doᴡɴɢᴏᴀᴛ実際、関数として答えを書くことは一般に受け入れられているので、ソリューションは関数を呼び出す必要さえありますか?
jrich

必ず、あなたは何ができる
Downgoat

6

Minkolang 0.1519の 14バイト

"66*2-rIDdr$O.

オリジナル

説明

"66*2-      $O.    Standard quine formulation

      r            Reverse stack
       I           Push length of stack
        D          Pop n and duplicate top of stack n times
         d         Duplicate top of stack
          r        Reverse stack

rsの間にあることは、終了期間を倍増基準を満たすのに十分な回数複製することです。.は「プログラムの停止」文字であるため、最後の多くのピリオドは、そこにある以外は何もしません。



2

Python 3、51バイト

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

これには、末尾の改行が含まれます。

どの出力:

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

2

GolfScript、11バイト

{: ".~"]}.~

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

ソースコードの仕組み

{: ".~"]}.~

{       }    Define and push a code block.
         .~  Push a copy and execute it.
 :           Save the code block in the space character.
             Every subsequent space will now execute the code block.
   ".~"      Push that string.
       ]     Wrap the entire stack in an array.

上記のソースコードが1回実行されると、スタックは次のようになります。

["" {: ".~"]} ".~"]

ここで、先頭の空の文字列は、スタックの初期状態に対応しています(空の入力)。

ソースコードの2つのコピーは、最終状態のままになります。

[["" {: ".~"]} ".~"] {: ".~"]} ".~"]

等々。

次は何が起こる

ソースコードの実行後、インタープリターは次のことを行います。

  1. スタック全体を配列にラップし、その配列をスタックにプッシュします。

    ソースコードの単一コピーの場合、スタックには次が含まれます。

    ["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
    
  2. putsラップされたスタックを印刷する目的で実行され、その後に改行が続きます。

    putsはとして定義されている{print n print}ため、次のことを行います。

    1. print検査せずに(つまり、文字列表現に変換せずに)スタックのラップされたコピーを印刷します。これにより

      {: ".~"]}.~
      

      STDOUTに移動し、スタックの最上部からスタックコピーをポップします。

      スタックには次が含まれます

      ["" {: ".~"]} ".~"]
      
    2. 前に定義したコードブロックを実行します。

      :["" {: ".~"]} ".~"]スペース文字で保存することから始め、それ".~"自体をプッシュし]てスタックを配列にラップします。

    3. n 単一の改行で構成される文字列をプッシュします。

      スタックには次が含まれます

      [["" {: ".~"]} ".~"] ".~"] "\n"
      
    4. もう一度実行されます。ただし、最初に呼び出したときに再定義され、コードブロックではなく配列が含まれるようになりました。

      実際に["" {: ".~"]} ".~"]は、スタックをそのままにして、プッシュします

      [["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
      
    5. 最後にprint、最上位のスタック項目を検査せずに印刷し、送信します

      {: ".~"]}.~
      

      STDOUTへ。


1

𝔼𝕊𝕄𝕚𝕟、26文字/ 36バイト

⟮ô`\u27ee⦃ᶈ0}\u27ef
`ď2)⟯

Try it here (Firefox only).

末尾に改行があることに注意してください。

説明

標準クイン: ⟮ⒸⅩ222+ᶈ0

変更点:

  • ô関数を使用して、最後の結果ではなくすべての結果を出力します(暗黙的な出力を使用して行われます)
  • \u27ee⦃ᶈ0}\u27ef\nコピーブロックを使用して閉じ、後のコピーブロックとの競合を防ぎます。
  • ď2文字列を2回繰り返すために使用します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.