インクリメンタルクイン


23

あなたの仕事は、ソースコードの最初の文字を出力するプログラムまたは関数を作成し、次に実行するたびに2番目、3番目...を出力することです

たとえば、プログラムがfileのfoo言語barであった場合baz.bar、次のような出力が得られます。

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

この方法でソースコードを出力すると、プログラムは何でもできます。あなたは、ファイルのソースコードを変更しますが、印刷するためのソースコードであることを覚えているかもしれのソースコード。

これはコードゴルフであるため、バイト単位の最短プログラムが優先されます。


1
ファイルのソースコードを変更できる場合、それも読み取ることができるということですか?
FlipTack 16

1
@ Flp.Tkc良い質問です。正直なところわからない。ソースを読んでクインを作成してほしくありませんが、ファイルを変更するためだけにソースを読んでも大丈夫です。
コナーオブライエン

回答:


6

ゼリー、12バイト

“;⁾vṾ®ȯ©Ḣ”vṾ

これはニラディックリンクです。オンラインでお試しください!(リンクを12回呼び出すコードが含まれています。)

使い方

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

追加のボーナスとして、12回目の呼び出しの後、レジスターは空の文字列を保持するため、再び偽りになり、リンクを最初からやり直す準備が整います。リンクを24回呼び出すと、ソースコードが2回出力され、36回呼び出されます。


私はゼリーを知らないので、フッターは正確に何をしますか?なぜ^ 17?
コナーオブライエン

上記のリンク(¢)、識別関数(¹、最初の呼び出し後に実際には不要)を呼び出し、戻り値を改行に設定し(、以前の戻り値を暗黙的に出力します)、繰り返します。¹そして両方の上付き文字ですが、彼らは無関係です。私はそれらを混乱の少ない¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(呼び出し、連結、繰り返し)に置き換えました。
デニス

12

Javascript-26バイト

f()文字ごとにソースコードを返すことを定義します。

n=0;f=x=>("n=0;f="+f)[n++]

文字がなくなると未定義を返します。

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness


間違っていない場合は、コードの一部として関数呼び出しを含める必要があります。
ママファンロール

関連するメタ投稿への@MamaFunRollリンク?
ダウンゴート16

私は何も知らない:Pしかし、私は常に関数呼び出し自体は馬の一部であると考えてきました。たぶん私が見逃しているものがありますか?
ママファンロール

@MamaFunRoll仕様では特に関数が許可されているため、呼び出しは必要ありません。とにかく、この特定の課題にはあまり意味がありません。
デニス

わかりました、念のため。
ママファンロール


2

ピップ、31バイト

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

匿名関数。TIOでテストしてください!

説明

この標準のPipクインから始めます。

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

これを中括弧で囲み、関数にします。ここで、ソース全体を返す代わりに、インデックスを作成する必要があります。インデックスにグローバル変数を使用し、毎回それをインクリメントすると、「呼び出されるたびに次の文字」の要件が満たされます。vは、に事前初期化されているため、最適な候補-1です。初めてインクリメントすると、のインデックス0、次回のインデックスなどが得られます1

Pipには循環インデックスが設定されているため、関数が最後の文字を出力すると、最初からやり直します。


1

Python、90バイト

標準Pythonクインの拡張機能(ゴルフのヒントを歓迎):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

これはpython ジェネレーター関数です。つまり、それを反復処理し、各反復処理がソースコードの次の文字を提供します。すべての文字が返されると、これはでクラッシュしIndexErrorます。

テストのために、このスクリプトをプログラムの最後に追加するだけです:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

または、オンラインでお試しください!


1

*> <>13 21バイト

" r:2+a1Fi1+:1F1+[ro;

\nインデックスを追跡する名前のファイルを作成します。

これはもっとゴルフができるかもしれませんが、すぐに私に飛び出すものはありません...

出力

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

説明

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

インクリメンタルクインの不正行為

a1Fi1+:0go1F;

説明

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit

ハハ、ファイルに「\ n」という名前を付けられるとは思いもしませんでした。これは技術的にはソースコードをg命令によって読み取りますが。
コナーオブライエン

@ ConorO'Brien、ああまあまあ。うーん...
redstarcoder

*> <>には、ある種のスタックインデックスがありますか?またはコマンドの繰り返しですか?その後、あなたは標準クワインフレームワークを使用することができます"your code goes here;> <>は、スタック上のn番目のメンバーにアクセスするために
コナー・オブライエン

@ ConorO'Brienええ、Teal Pelicanは、私の他の不正行為の答えにこの馬の変種を見せてくれました:)。
redstarcoder 16

1
@redstarcoder私はクインにもっと取り組んでいます(イェーイ!)。#;または[+ 1F1:+ 1iF1a-1:「私は、現時点ではこれをテストすることはできませんが、私はそれはあなたのコードから1つのバイトをカットすると信じて> <> quines <#Oのように行うことができます-1:」など:D
ティールペリカン

1

Mathematica、91バイト

コメントは大歓迎です。私はまだ、どのクインが適切なクインであるかについてロープを学んでいます。

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

引数なしで繰り返し呼び出される関数を定義します。91回目の呼び出しの後、大きなエラーがスローされ、未評価で返されます。

克服しなければならない問題が2つありました。まず、単にを使用したかっStringTake[ToString[#0]<>"[]"]たのToString[]ですが、引用符が消去されたようです。だから私はに置き換えなければなりませんでし"[]"FromCharacterCode[{91, 93}]。第二に、Mathematica変数は初期化されていない状態で開始されるため、定義される++q前に呼び出すことはできませんq。これがイニシャルIf[!NumberQ[q], q = 0]が必要な理由です。

無関係なコーダ:見上げながらNumberQ、MathematicaにTrueQ... という関数があることを学びました。この関数Trueは、引数がTrueありFalse、引数がFalse!(ユーティリティは、False他のすべての引数でも返すことです。)


1

Microscript II、40 33バイト

関数に最も近い言語のコードブロックリテラル:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

実行後、x再び呼び出しやすくするために、自身を元に戻します。


0

Bash(およびzsh、ksh)、39バイト

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

プログラムが印刷されると、何も印刷されません。

0現在のディレクトリに存在しないことを確認して実行します:

bash iquine.bash

PPCGへようこそ!インデックスをインクリメントするための賢いアイデアがあります。残念ながら、この回答は独自のソースコードを読み取ることで機能するようです。つまり、標準では有効な馬ではありません。独自のソースを読むこと以外のクインテクニックを使用するように変更する場合は、良い答えになります。
DLosc 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.