あなたの平均的な馬を1つアップ


34

1アップQUINEは QUINEに非常によく似ているプログラムです。1つの大きな違いは、1回印刷する代わりに、プログラムのn個のコピーが連結されると、結果は元のプログラムをn + 1回印刷することです。

プログラムがAbc123次の場合:

Abc123  ->  Abc123Abc123
Abc123Abc123  ->  Abc123Abc123Abc123
Abc123Abc123Abc123  -> Abc123Abc123Abc123Abc123

チャレンジ

あなたの課題は、任意の言語で最短の有効な1アップクインを作成することです。通常のクインルールが適用されるため、次のことはできません。

  • 空のプログラムを送信します。
  • 直接的または間接的に読み出す1にソースコードを。
  • quiningビルトインを使用します。

これはコードゴルフなので、バイト単位の最短コードが優先されます。

1これには、プログラムの一部としてハードコーディングされた文字列またはコードブロックの使用は含まれません。


2
nいくつかのデータ型の制限(最大整数サイズなど)によって制限されていても大丈夫ですか
ルイスメンドー

2
@LuisMendo合理的な数のリピート(おそらく100)をサポートできる限り、それは問題ないと思います。
ETHproductions

組み込みのquiningメソッドを使用してソースコードの長さを読み取りますか?
コナーオブライエン

2
@CᴏɴᴏʀO'Bʀɪᴇɴあなたはまだソースコードに関する情報を取得しているので、それは私にソースコード自体を取得することに少し似すぎているようです。だから
ETHproductions

回答:


13

GolfScript、12バイト

{`'.~'+:n}.~

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

説明

これは、標準のGolfScriptクインのアイデアを組み合わせたものです。

{'.~'}.~

そして、私の最近発見された馬

":n`":n`

主なアイデアはn、クインの追加コピーを取得するために、プログラムの最後に暗黙的に印刷されるものを使用することです。変数を割り当てても、後続のコピーで再び行われても何も変わらないため、コピーが1つだけ追加されます。コードの内訳は次のとおりです。

{        # Standard quine framework. This pushes the block, duplicates it and runs the
         # second copy, such that it can process the first copy to create a quine.
  `      # Convert the block to its string representation.
  '.~'+  # Append the string '.~' to make a complete quine. This is simply left on the
         # stack to be printed at the end.
  :n     # Store the string in n such that one more copy is printed at the end.
}.~

12

GolfScript、12バイト

{: ".~"][}.~

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

ソースコードの仕組み

{: ".~"][}.~

{        }    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 everything up to the last [ in an array.
        [     Set a new array marker.

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

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

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

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

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

最終状態の3つのコピー

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

等々。

次は何が起こる

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

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

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

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

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

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

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

      (ソースコード)をSTDOUTに送信し、スタックの先頭からスタックコピーをポップします。

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

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

      :[{: ".~"][} ".~"]スペース文字で保存することから始まり、それ".~"自体をプッシュし、配列に]ラップし、新しい配列マーカー".~"[設定します。

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

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

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

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

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

      {: ".~"][}.~
      

      STDOUTに、ソースコードを1アップ。


11

Javascript ES6(REPL)、55バイト

var a=-~a;$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

@ user81655のおかげで2バイト節約できました!

説明

これが標準のクインフレームワークです。

$=_=>`$=${$};$()`;$()

このフレームワークを提出物の中で見ることができるはずです。以下で詳細を説明します。


var a=-~a;

これはカウンタであり、デフォルトは1です。基本的には、クインとインクリメントを同時に繰り返す量を示します。

$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

これは、クイーンパートです。基本的に、カウンター+1でクイン文字列を繰り返します。後続の関数呼び出しは、出力をオーバーライドします。


これは私だけかもしれませんが、これは何も印刷しないようです。(重要な場合、JSFiddleを使用してテストしましたか?)
jrich

ああ、Firefoxコンソールを使用する必要があります。(そして、実行するたびにリロードしてリセットしますa)。
ママファンロール

私はあなたが必要とは思わないvar
チョイス

いいえ、aは最初は定義されていないためです。varを使用すると、それを使用できます。
ママファンロール

7

CJam、14バイト

{"_~"]-2>_o}_~

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

使い方

{"_~"]-2>_o}_~

{          }    Define a code block and push it on the stack.
            _~  Push and execute a copy of it.
 "_~"           Push that string.
     ]          Wrap the entire stack in an array.
      -2>       Discard all but the last two elements (block and string).
         _o     Push and print a copy of that array.

プログラムの最後のコピーが実行された後、ブロックと文字列を含む配列はまだスタック上にあるため、暗黙的に印刷されます。


4

Groovy、83バイト

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

埋め込みがあり、末尾の改行はありません。これは印刷します:

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

この関数f()は、クインの1つのコピーを印刷します。初期プログラムは2回呼び出します。追加されたコードの最初の行はコメントになり、2番目の呼び出しのみf()が実行されます。


4

ルビー、43バイト

1;s="1;s=%p;$><<s%%s*n=2-0";$><<s%s*n=2-0

それ自体で、これはそれ自体2-0または2時間を表示します。自身の別のコピーに連結されると、最終的なprintステートメントはのよう$><<s%s*n=2-01になります。つまり、自身を1回だけ出力します(01 8進数1で)されます。そのため、文字列の最終コピーのみが2回印刷され、その他は1回印刷されます。

へのインライン割り当てnは、単に正常に動作する操作の順序を取得することです。状態は実際には1つのコピーから次のコピーに渡されません。


4

NodeJS、63 61 60 55バイト

複数のコンソールメッセージが改行で区切られていると見なす場合、これはJavaScript(ES6)でも機能します(REPLは不要です)

@ dev-nullのおかげで2バイト節約

(f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t()))()

コードの最後に改行があることに注意してください。


これは興味深いもので、間違いなくこれまでこのサイトで私のお気に入りの1つでした。

これ以上ゴルフをすることはできないと私はかなり確信しています。(おそらくSpiderMonkeyのprint機能...)

説明

//FIRST ITERATION
            console.log(`(f=${f})()`)                   //logs to the console a quine of the source code using function f's toString()
                                     ||                 //causes the expression to evaluate to the second part, since console.log's return value is falsy
                                       (_=>t)           //a function that returns function t when called
       t=_=>                                            //defines function t to be the code above. When called, t will log a quine and then return a function that returns t.
      (                                      )(t())     //call t twice. (one call is done via the t() as an ignored parameter) This will print the quine twice.
 f=_=>                                                  //define f as the above code.
(                                                  )()  //call function f with no arguments. this results in a function returning t. (the result of calling t once)
                                                        //this newline is to compensate for console.log's behavior of adding a newline to its output
//SECOND ITERATION
(                                                  )    //call the function that returns t that was returned from the first iteration. This expression will result in whatever that function returns, which is t.
 f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t())     //this part evaluates to a function, which is passed as a parameter to the function that returns t, that ignores its parameter.
                                                    ()  //call whatever the last expression returned, which is the function t, with no parameters. This will print the quine once.
                                                        //this call will result in a function returning t, just like from the first iteration, so we can add on more iterations at will.

最初にサングラスをかけているように見えるのも気に入っています。(f=_=少し疲れているかもしれません。
ベンレジェロ

2

Ruby、55バイト

n||=2;s="n||=2;s=%p;$><<(s%%s)*n;n=1;";$><<(s%s)*n;n=1;

ここでは何もおもしろいことはありませんが、カウンターを備えた通常のルビーです。


2

JavaScript(ES6)、164バイト

console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))
console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))

FirefoxのJSテストページまたはコンソールで機能します。2つのコンソールメッセージ間のスペースは改行としてカウントされます。


汎用言語でこれを行うための多くの小道具!
ベンレジェロ

に短縮windowthisます。
ママファンロール



1

Y

非競合、6バイト

UCn*px

Yは私がしばらく持っていたヘッドキャノンであり、これは私にそれを書くように促しました。このように、シーケンスが重要な課題のために作られています。コードは「ノード」文字によってリンクに分割されます。この場合、コードは(元々)2つのチェーンに配置され、ノードはCです。

U  C  n* px
1  N    2

U超越文字列、つまりリンクにまたがる文字列を記録します。別に会うまで記録しUます。Uストリングの終わりまでにa が満たされない場合、折り返されます。また、Uデフォルトで文字列に含まれています。文字列を記録した後、ノードCに進み、次のリンクに移動します。

nチェーンの数をプッシュします。基本ケースの場合、この2。Kチェーンのシーケンスの場合、ノードK+2があるので、チェーンがありますK*文字列の繰り返しです。pスタック全体(この場合は1つの文字列)を出力します。xプログラム終了します。

テキスト内:

UCn*px
U..... record that string
 C     next link
  n*   repeat that string twice.
    px print and terminate

UCn*pxUCn*pxUCn*px
U.....U            record string
 C                 next link
  n*               repeat that string four times (three Cs)
    px             print and terminate

ここで試してみてください!


それではU、クイニング以外の実用的な用途は何でしょうか?(おめでとう、7k、ところで)
-ETHproductions

@ETHproductions Uは、リンクにまたがる文字列をキャプチャするために使用できます。また、プログラムへのリンクの分解をキャプチャして費やすこともできます。ありがとう!:D
コナーオブライエン

1

Brachylog、20バイト

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

このクインから修正

⊥                       Fail,
 ∨                      or
                w       print
  "⊥∨~kgjw₃w₅"          "⊥∨~kgjw₃w₅"
                 ₃      formatted
              gj        with itself;
                 ₃w₅    print it again at the end of the program if this route succeeds.

これがそれ自体と連結されると、最後のルートを除くすべてのルートが失敗し、プログラムは次のルートに移動し、それぞれw₃を実行して、最後のルートを除くすべてw₅をバックトラックします。

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

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