織り交ぜるクインを作る


17

あなたの仕事は、実行時に出力として自身を返すプログラムを作成することです(これはクインとして知られています)。ただし、このクインは、コピーされるときにnクインを返す必要がありますが、その文字のそれぞれが所定のn時間に複製されnます。ここで、は正の整数です。

元のプログラムがDerp次の場合:

Derp -> Derp (must return itself as output to be a quine)

DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)

DerpDerpDerp -> DDDeeerrrppp
etc. etc.

「ベース」プログラムに空白を含めることは許可されていますが、「織り交ぜる」ときに空白はカウントされます。あなたのプログラムは

Derp 
{newline}

(改行は末尾の改行を意味し、の後に余分なスペースがありますDerp)。複製されると

Derp 
Derp 
{newline}

出力する必要があります

DDeerrpp  
{newline}
{newline}

2後に余分なスペースがあることに注意してくださいDDeerrpp

ルールと仕様:

  • プログラムには、少なくとも2つの異なる文字が含まれている必要があります(これは、コードの長さが少なくとも2バイトでなければならないことを意味します)。
  • 標準のクインルールが適用されます。

これはなので、バイト単位の最短コードが勝ちです!


1
「標準ルールが適用されます」-それはソースコードを読み取らないことを意味しますか?
FlipTack 16

@FlipTackそれはそれを意味します-詳細についてはリンクを読んでください。
clismique 16

回答:


12

核分裂、6バイト

'!+OR"

オンラインでお試しください! 2つのコピーを試してください! 3つ試してください!

説明

これはちょうど核分裂標準の馬です。Fissionにはプログラムへの明示的なエントリポイントがあるため、たまたまこの課題に取り組んでいます。特に、プログラムを複製することにより、R別のアトム(命令ポインター)を追加する別のプログラムを追加します。ソースコードはトロイダルであるため、実行される有効なコードは他の点では変わりません。各アトムに対して、コードはローカルで同じように見えます。ただし、アトムはロックステップで実行されるため、印刷されるものはインターリーブされ、出力の各文字の追加コピーが取得されます。

完全を期すために、プログラム自体がどのように機能するかを簡単に繰り返します。プログラムを繰り返すかどうか(例:)に関係なく'!+OR"'!+OR"'!+OR"、各アトムには次のコードが表示されます。

R"'!+OR"'!+O

"トグル文字列の印刷モードは、そのためのプログラムは、印刷することにより開始し'!+OR、全ての引用を除くQUINEであるSTDOUTに直接。その後'!の文字コードに原子の質量を設定し!+与える、それをインクリメントし"、そしてO同時に原子を破壊しながら、それを印刷します。その後、アトムが残っていないため、プログラムは終了します。


11

Python 2.7、377 310 304 194 191バイト!

これは私の最初のゴルフですので、あまりにも良いとは思っていませんでした。しかし、私が思いついたソリューションのコンセプトはやや面白いと思ったので、とにかくそれを投稿しています。

def f():
 import threading as T,inspect as i;global t,a,i
 try:t.cancel()
 except:a=0
 a+=1;t=T.Timer(1,d);t.start()
def d():print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")
f()

実際、これは馬鹿です。ここで試してみることができます。検査モジュールをかなり酷使します。

同じソースコードx2で実行しようとすると、正しい出力も得られます。ここで試してみることができます。x3、x4などはすべて正常に機能します。

説明のないゴルフ:

def f():                                   # Defines a central function f
    import threading as T,inspect as i     # Imports threading and inspect
    global t,a,i                           # Global vars
    try:
        t.cancel()                         # Tries to cancel Timer from previous code
    except:
        a = 0                              # Reached when code is 1st copy; initializes a.
    a += 1                                 # a++; this is the number of copies thus far.
    t = T.Timer(1,d)               # Creates, then starts a timer to call function
    t.start()                              # d in 1 second.

def d():                                   # Prints out the source code; the quine part.
    print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")

f()                                        # Calls f()!

を使用して独自の関数のソースコードを読み取るため、これは不正行為ではありませんinspectか?(関連するメタ投稿を参照)。PPCGには、クインを有効にするものの特定の定義があり、通常、「ソースの読み取り」は不正行為と見なされます。
FlipTack 16

@FlipTack関数の検査がソースコードの読み取りと同じかどうかはわかりません。JavaScriptおよびスタックベースの言語のQuinesは常にこれを行います。
デニス

OK :)。投稿に構文の強調表示を追加しました。スレッド化を使用した素晴らしいアイデア!
FlipTack

import threading,inspect as iすることができますimport threading as T,inspect as i
nedla2004 16

@FlipTackおっと、ありがとう。
Calconym 16

3

CJam、19バイト

{]W=s"_~"+T):Te*}_~

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

使い方

{               }_~  Define an anonymous code block (function).
                 _~  Push a copy, and execute the copy.
 ]W=                 Wrap the entire stack in an array and select its last element.
                     This discards whatever was on the stack before the original
                     code block, which is needed for subsequent iterations.
    s"_~"+           Cast the code block to string, push "_~", and concatenate.
                     This pushes the stringified source code on the stack.
          T):T       Push T (initially 0), increment it, and save the result in T.
              e*     Repeat each character in the stringified source code T times.

何...どのように...とても速い...コードを説明してください。CJamの方法を教えてください。
clismique 16

@ Qwerp-Derp説明を追加しました。
デニス

3

RProgN、66バイト

重要な空白は私の死になります

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R 

説明した

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R   #
[                                                                   # Pop whatever is already on the stack, if anything.
  "[ %q ] F 0 1 + `0 = `. { 0 m } R "                               # This string contains basically the entire function.
                                      ] F                           # ] F duplicates the string, and then F formats it, which in this case puts the first string into the second at %q, surrounded by qoutes.
                                          0 1 + `0 =                # I needed an Incrementer, so I chose 0. 0, is conveniently, pre initilized at 0. And because RProgN is horrifying, you can remap the number functions as they're just more variables. So this increments 0 every time the group is called.
                                                     `. { 0 m } R   # Replace each character with itself repeated '0' times. Because '0' is an incrementer, each time the script is called, the amount of times the characters are repeated increase.

私はモンスターです...

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


また、~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}R一般的には正常に機能しますが、ZSSマーカーを複製する方法がないため、有効なソリューションではありません。
ATaco 16

2

Perl 5、107バイト

$_=q[$_=q[S];s/S/$_/;$a++;END{s/./$&x$a/eg;print if$a;$a=0}];s/S/$_/;$a++;END{s/./$&x$a/eg;print if$a;$a=0}

ゴルフをしていない:

$_ = '...INSERT_SOURCE_HERE...';      # Standard quine
s/INSERT_SOURCE_HERE/$_;
$a++;                                 # Count the number of repetitions
END {
    s/./$&x$a/eg;                     # Interweave
    print if $a;                      # Print...
    $a=0;                             # ...but only once
}

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


2

Pythonの3122 121 112バイト

s='try:from atexit import*;n+=1\nexcept:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])';exec(s);

オンラインで試す: 1コピー | 2つのコピー | 3部 | 自動検証付きの4つのコピー

使い方

これは、標準のPythonクインを使用します。実行するコードを変数に(文字列として)格納します。その文字列に、それ自体、その前のすべて、およびその後ろのすべてを印刷するためのロジックを含めます。その後、その文字列を実行します。

文字列sを介して実行されるコードは次のとおりです。

try:from atexit import*;n+=1
except:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])

最初の行は無条件にatexitモジュールをインポートします。これにより、終了ハンドラーを登録できます。同じモジュールを複数回インポートしようとしても、スクリプトには何の影響もありません。次に、変数n インクリメントして、実行されたソースコードのコピー数を追跡しようとします。

2行目は、最初の行にエラーが含まれている場合にのみ実行されます。nはまだ定義されていないため、これは最初の反復の場合に当てはまります。この場合、nを次のように初期化します。 1に、実際の魔法を実行するラムダを登録します。

登録された終了ハンドラー

lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s]

プログラムが終了する直前に呼び出されます。ラムダ自体が文字列を作成します"s=%r;exec(s);"%s%r正しい引数(s)の文字列表現を作成します。これには、単一引用符と引用符自体の間のすべてが含まれます。その後、文字を反復処理します。各文字cについて、cのn個のコピーを単に印刷しますc*n名前付き引数として渡すことは、改行が追加されないことendprint意味します。


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