スニペットのN個のコピーを結合して、N ^ 2文字を生成します


30

チャレンジ

コードのN個のコピーを連結すると、出力される文字数がN 2になるように、可能な限り短いコードスニペットを記述します。Nは正の整数です。

たとえば、スニペットがの場合、soln();running soln();はちょうど1文字soln();soln();を印刷し、running はちょうど4文字soln();soln();soln();を印刷し、running はちょうど9文字を印刷します。

文字の総数が正しい限り、任意の文字が出力に含まれることがあります。OS間の混乱を避けるため、\r\n改行は1文字としてカウントされます。

プログラムは、独自のソースを読み取ったり、ファイルサイズを読み取ったり、他のそのような抜け穴を使用したりすることはできません。これを厳しい挑戦のように扱ってください。

出力は、stdoutまたはファイルまたは同様の代替物に送られます。入力はありません。

コード内のコメントは問題なく、実行中に終了します。

任意の文字がプログラムに含まれている可能性があります。バイト単位の最短提出勝ちです。


プログラムを終了する必要がありますか?
マーティンエンダー

@MartinBüttnerはい
カルビンの趣味

回答:


24

TECO、4バイト

V1\V

Vテキストバッファの現在の行の内容を印刷します。1\現在の位置に数値1の文字列表現を挿入します。

そのため、プログラムのN番目の反復で、最初Vは文字のN-1個のコピーを出力し、次にテキストに1別のコピーを追加して1からN を出力します1


1
TECOへのリンクを追加できますか?
エリック・ザ・アウトゴルファー

22

Brainfuck、17 16バイト

[>+>-..+<<-]-.>+

あなたはそれをテストすることができます ここでます。という事実を使用してください。n2+2n+1=(n+1)2


16
BFが競合レベルのバイトで見られるなんて信じられません!
agweber

21

Brainfuck、11

私は最初のBrainfuckの答えを見たが、それは長すぎると思った:)

[.<]>[.>]+.

プラスをもっと多くのプラスに置き換えると、出力が見やすくなる場合があります。

N回目の反復では、各ループはASCII値1の文字のN-1個のコピーを出力し、次にもう1つを使用して文字のコピーを出力し+.ます。


N文字ではなく、N ^ 2文字を印刷する必要があります。BFコードを読むことができないので、コードが間違っているのか、説明が間違っているのかわかりません。
ブライアンJ

@BrianJ N ^ 2文字を出力します。ここでテストできます:copy.sh/brainfuck出力が表示されない場合は、プラスをマイナスに置き換えます。
-alephalpha

@alephalphaおっと、コメントを読み間違えたことがわかりました。コードは、当初考えていたように(N-1)+ 1しません。
ブライアンJ

16

Python 2、22

a='';print a;a+='xx';a

空の文字列を出力し、次に2つxの文字列を出力し、次にx4 つの文字列を出力します。各文字列の後に改行があると、文字になりますn*n

1部:"\n"(1文字)
2部:"\nxx\n"(4文字)
3部: "\nxx\nxxxx\n"(9文字)

a実行ごとに初期変数が再初期化されるのを止めるために、コードをで終了します;a。これは、それ自体は無害ですが、aa代わりに割り当てるスケープゴートを作成するために次のループと組み合わせます。このトリックは私のものではありません。以前の回答で見ました。誰かが私を指し示してくれて、信用できるようになれば幸いです。


実際、最終的な改行は印刷されますか?
xnor

いいえ、最終的な改行は印刷されません。ただし、単に,after print aを削除するだけで機能します。print a各印刷後に改行を印刷します。
ジャスティン

@Quincunxああ、もちろんありがとう!
xnor

この投稿について話している
Sp3000

10

CJam、6バイト

LLS+:L

という事実を使用します。n2 + n + (n+1) = (n+1)2

L      "Push L. Initially this is an empty string, but its length increases by 1 with each copy
        of the snippet.";
 L     "Push another L.";
  S+   "Add a space to the second copy.";
    :L "Store the lengthened string in L for the next copy of the snippet.";

:L..1+GolfScriptでも同じ考えです。
ピーターテイラー

@PeterTaylor ..n+GolfScriptで考えていましたが、その厄介な後続の改行...:(
Martin Ender

ああ、あなたは正しい。:L使用されていないため、必要ありません。
ピーターテイラー

10

///、21バイト

///でこれを解決するための本当に短くてねじれた方法があると確信していますが、まだ「単純な」方法を超えて何も見つかりませんでした:

1/1\//112\///2\//1\//

これは、連続した奇数を印刷するアプローチに基づいています。スニペットは1、最初に印刷されるa 1と、スニペットの各連続コピーの最初の部分にさらに2を追加する2つの置換で構成されます。でこれを見ていきましょうN = 3。以下は、3行以上のグループで読む必要があります。1。現在のコード、2。処理されたトークン、3。(およびそれに続く)上記のトークンが行うことのコメント。

1/1\//112\///2\//1\//1/1\//112\///2\//1\//1/1\//112\///2\//1\//
1
is printed
/1\//112\///2\//1\//1/1\//112\///2\//1\//1/1\//112\///2\//1\//
/1\//112\//
replaces all occurrences of 1/ with 112/. This affects the starts of all further snippets
but not the substitution commands, because the slashes in those are always escaped.
It is necessary to put a 2 in there, because otherwise the interpreter goes into an infinite
loop replacing the resulting 1/ again and again.
/2\//1\//112/1\//112\///2\//1\//112/1\//112\///2\//1\//
/2\//1\//
Replace all occurrences of 2/ with 1/, so the the next snippets substitution works again.
111/1\//112\///2\//1\//111/1\//112\///2\//1\//
111
is printed
/1\//112\///2\//1\//111/1\//112\///2\//1\//
/1\//112\//
add two 1s again
/2\//1\//11112/1\//112\///2\//1\//
/2\//1\//
turn the 2 into a 1 again
11111/1\//112\///2\//1\//
11111
print 11111
/1\//112\///2\//1\//
the last two substitutions have nothing to substitute so they do nothing

興味深いことに、1最後まで移動しても同様に機能します。

/1\//112\///2\//1\//1

7

> <>、14バイト

1:na*a*';'10p!

「1から始まる連続する奇数整数の合計」というアイデアを使用します。1で始まり、毎回100倍され、出力の長さが2ずつ増加します。

たとえば、5つのコピーを追加すると、

1100100001000000100000000

出力をファイルにパイピングしてテストしましたが、末尾の改行は表示されませんでした。

壊す

1                   Push 1, skipped by ! every time except the first
 :n                 Copy top of stack and output as num                  
   a*a*             Multiply by 10 twice
       ';'10p       Modify the source code so that the first : becomes a ; for termination
             !      Skip the next 1

5

CJam、10 9バイト

],)_S*a*~

これは、コードのコピー数であるN 2スペースを印刷Nします。

コード拡張

],            "Wrap everything on stack and take length";
  )_          "Increment and take copy";
    S*        "Get that length space string";
      a*      "Wrap that space string in an array and create that many copies";
        ~     "Unwrap so that next code can use to get length";

こちらからオンラインでお試しください



5

Java-91バイト

{String s=System.getProperty("a","");System.out.println(s);System.setProperty("a","xx"+s);}

このソリューションは、Pythonのこの他のソリューションと同等です。きっと勝てないでしょうが、楽しかったです:)


何かを実行するためにクラスが必要ではありませんか?

いいえ、OPはコードのスニペットを要求したためです。たとえば、これがメイン内で実行されていると想定できます。
cygnusv

その後、私は59またはさらに44バイトのソリューションを持っています。

クール:)私はワンライナーを好むが、あなたのものは確かに短い!
cygnusv

4

Perl、14バイト

print;s//__/;

これは、Perlの-lコマンドスイッチで実行する必要があります。print。、新しい行が追加されます。

デフォルト変数を出力します $_置換により2つのアンダースコアを付加し。

例:

$ perl -le 'print;s//__/;print;s//__/;print;s//__/;print;s//__/;'

__
____
______

フラグはフラグごとにさらに1バイトとしてカウントされます
オプティマイザー

どうsay
hmatt1

@chilemagic私はそれを試してみましたが、Perlの私のバージョンで動作させることができませんでした。
-grc

@grcはバージョン5.10以降であり、-E代わりに必要です。
hmatt1

@chilemagicうーん、5.16ではうまくいかないようでした。
-grc

4

Brainfuck、10文字

以前のBrainfuckソリューションは両方とも長すぎたため(16文字と11文字)、短いものを次に示します。

+[.->+<]>+

n番目のブロックはプリントアウト2*n-1からのコードポイントを持つ文字(2*n-11


2
これは、セルのサイズが無制限の場合にのみ、標準的なブレインファックでは機能しません。実際、それもまったく意味をなさないでしょう。文字コード1兆をどのように出力しますか?
feersum

3

プレリュード18 12バイト

^1+(9!1-)#2+

これにより、N 2個のタブが印刷されます。数値ではなく文字を出力する標準準拠のインタープリターを想定しているため、Pythonインタープリターを使用する場合は、設定する必要があります。NUMERIC_OUTPUTするFalse

考えは、スタックの先頭(最初は0)をとして使用し2(N-1)2N-1タブを印刷してから、スタックの先頭を2ずつインクリメントすることです。したがって、各繰り返しは次の奇数のタブを印刷します。


3

Java-59/44(要件に応じて)

static String n="1";
static{System.out.print(n);n+="11";}//

どうやら、クラス内でコードが実行されると想定できます。

mainメソッド内に移動できる場合:

String n="1";
System.out.print(n);n+="11";//

3

C、87バイト

#if!__COUNTER__
#include __FILE__
main(a){a=__COUNTER__-1;printf("%*d",a*a,0);}
#endif

これは2つの魔法のマクロを使用します。__COUNTER__は、0最初に使用されるとき1、2番目に使用されるときなどに展開されるマクロです。これはコンパイラー拡張ですが、少なくともgcc、clang、およびVisual Studioの両方で使用可能です。__FILE__ソースファイルの名前です。C / C ++にファイルを含めることは、文字通りソースコードに直接貼り付けることと同じであるため、利用するのは少し面倒でした。

それなしでこのテクニックを使用するのはまだ可能でしょう__COUNTER__。その場合、コードの2回の使用に対する標準的な保護を#ifステートメントに__LINE__使用でき、必要な文字数をカウントするために使用できます。


このソリューションはCではなく、Cの方言で書かれています。言語名を修正してください。
FUZxxl

2
@FUZxxlほとんどのコードゴルフの回答はgccでのみ動作するように設計されているため、これが問題になる理由はわかりません。
feersum

そうではありませんが、実際に宣言する必要があります。
FUZxxl

よくわかりません。なぜ非問題を宣言するのですか?O_O
corsiKa

@corsiKa宣言すれば、それは問題ではありません。C gccが話すCは標準Cではありません。
FUZxxl15年

2

Dyalog APL、20 19バイト

マトリックスベースのソリューション。

{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'

ここで試してみてください。の繰り返しの文字列を返します。爆発による説明:N2aN = 2

{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'
                                  ⍪'a'  Wrap 'a' into a 1x1 matrix.
                'a'{            }⍨      Binary function: bind 'a' to ⍵ and the matrix to ⍺.
                    ⍺≢⍵:                The arguments are not identical,
                        ⍵⍪⍵,⍺           so add to the matrix 1 column and 1 row of 'a's.
               ⍪                        Identity function for a matrix.
{            }⍨                         Unary function: bind the matrix to both ⍵ and ⍺.
 ⍺≢⍵:                                   The arguments are identical,
           ∊⍺                           so flatten the matrix into the string 'aaaa'.

2

スタタ20

di _n($a)
gl a=$a+2

display(di)ステートメントが機能することを確認するために、末尾に改行があります。最初に、$ a改行で現在の番号を表示します(デフォルトの表示からさらに1つ追加します)。次に、$ aに2を追加します。

毎回余分な改行を使用して、偶数アプローチ(つまり、奇数が1に近づく)を使用します。


2

T-SQL 117

IF OBJECT_ID('tempdb..#')IS NULL CREATE TABLE #(A INT)INSERT INTO # VALUES(1)SELECT REPLICATE('a',COUNT(*)*2-1)FROM #

if条件が毎回適切にチェックされるように、末尾のスペースに注意してください。

奇数アプローチを使用します。selectステートメントに改行があるかどうかはわかりません。

テーブルが存在しない場合、テーブルを作成するより短い方法があるかどうかはわかりません。


2
珍しい言語の選択に対してあなたに称賛を。
シナリス

2

PostScript、35文字

count dup 2 mul 1 add string print

各パスはスタック上の1つのものを「リーク」するため、 count毎回1ずつ増加します。それから、ジャストは奇数のトリックの合計を使用します。

バイト出力はすべて\000、文字列の初期値であるためです。


2

ハスケル、72

putStr$let a="1";aputStr=(\n->take(n^2)$show n++cycle" ").(+1).read in a

説明

適用演算子$は、残りの行を囲む括弧を配置するかのように機能します(これには例外がありますが、この場合は機能します)。aputStr「abc ...」という形式の文字列を受け取る関数です。「abc」は、abcを含む文字列の長さの平方根です。文字列を整数として解析し、abc + 1で始まりその長さが2乗した文字列を返します。$演算子のため、これはN回 "1"で再帰的に呼び出されます。


1

Pyth、8バイト

*d*2Z~Z1

これは、N 2N奇数の合計に等しいという事実に依存しています。今Pythオートは、私はちょうど印刷する必要がありますので、新しい行を印刷しZ * 2、各コードの文字をZから行く0までN - 1です。

コード拡張

*d               "Print d whose value is a space character"
  *2Z            "2 * Z times where Z's initial value is 0"
     ~Z1         "Increment the value of Z";

こちらからオンラインでお試しください


1

Golflua、23バイト

X=2+(X|-2)w(S.t("&",X))

&\n文字の組み合わせを出力します。

同等のLuaコード

X = 2 + (X or -2)          -- initialize X to 0 the first time, add 2 ever other time

print(string.rep("&", X))

コードスニペットを実行するたびに、前回よりも2文字多く、1文字から始まる出力が生成されます。print私は0ではなく1にXを初期化するための機能は、改行を追加します。


0

ActionScript-27/26バイト

var n=""
trace(n);n+="11"//

または

var n=1
trace(n);n+="11"//

使い方:

var n=""
trace(n);n+="11"//var n=""
trace(n);n+="11"//

最初の行をコメントアウトするだけです。注:trace改行を追加します。あるいは、私が使用しているすべてのIDEが自動的にそれを行うかもしれません。


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