初期コードを複製して、サイズが増加する正方形を作成します


45

あなたの割り当ては偶数の長さのプログラムを書くことです。これはASCIIアートの正方形(下記)を印刷し、元のソースコードが現在のコードの真ん中に貼り付けられるたびに辺の長さを増やします。

このタスクを非常にうまく定義するのは非常に難しいので、例を挙げます。

  • あなたの初期コードがCODEあり、それが印刷されたとしましょう:

    0
    
  • 次に、CODE中央に挿入します。コードが次のようになりCOCODEDE、印刷されるはずです。

    00
    00
    
  • CODE真ん中に再挿入します。コードは次のようになりCOCOCODEDEDE 、印刷されるはずです。

    000
    000
    000
    
  • 等々。あなたの答えは理論的には何回も繰り返した後でも機能するはずですが、言語のパフォーマンスの制限により、特定のしきい値を超えて合理的に実行できない場合は理解しています。

いくつかのルール:

  • 任意の印刷可能なASCII(32〜127)を正方形に使用する文字として使用できます。選択は一定である必要があります(各反復に同じ文字を使用する必要があります)。

  • 初期出力の正方形の辺の長さは1でなければなりません。

  • ascii-art squareは、N行(N-1個の改行/改行で区切られた)の文字列として定義され、各行には選択された文字のN個のコピーが含まれます。

  • 出力には、末尾の改行以外の余分な空白を含めることはできません。

  • 入力および出力にデフォルトを使用できます(プログラムまたは関数は許可されますが、スニペットは許可されません)。

  • コードの中央は、ソースコードが2つの部分に等しくなるように2つの部分に分割できるポイントとして定義されます。

  • 回答は、元のプログラムの長さ(バイト単位)によってスコア付けされます。最も低いバイトカウントが優先されます。同点の場合は、以前に送信された回答が優先されます。

  • このプログラムを使用して、手動で挿入しなくても挿入を適用できます。


1
以前に投稿されたこの馬鹿げた質問に触発されたことを認めなければならない。人々が近すぎると思ったら、私は喜んでこれを削除します。また、間違いを犯した場合は失礼しますが、ここでのルールについてはあまり経験がありません。:)

2
PPCGへようこそ!今後の課題にサンドボックスを使用することをお勧めします。
user202729

7
サイトへようこそ!デュープトラップに陥ることなくインスピレーションを得るための別のチャレンジの優れた使用:)
シャギー

ヘルパープログラムは、複数行のプログラムでは機能しません。他の質問のこの修正版はどうですか?
ジョーキング

1
@ user77954しかし、私のBrainfuckコードはあなたのpythonよりも短いです:((誰かがそれを前に言ったことがありますか?)
ジョーキング

回答:


41

Pyth、2バイト


5

オンラインでお試しください!また、2倍3倍にしてみてください

それはどのように機能しますか?

\n引数を末尾の改行で出力し、同時にそれ返すコマンドです。だから、あなたが挿入するたびに、あなたは整数リテラルを回す5含む数にNをのコピー5連結、および主要な改行は基本的に確認してくださいそれは、正方形、それを維持するため、適切な回数を印刷した作り。


6
短いです聖なるフリック...
ETHproductions

最適性の証明(:P):バイトカウントは偶数でなければならず、負にできないため、可能な最小バイトカウントは0バイトです。0バイトのプログラムが1つだけありますが、これはタスクを実行しません。したがって、2バイトが最適です。
Mr Xcoder

10
全員(特にHNQの有権者)は、他の回答にも賛成票を投じ、FGITW効果を回避します。
user202729

25

JavaScript(ES6)、42 32 30バイト

s=[this.s]+0;  console.log(s);

2回目の反復:

s=[this.s]+0;  s=[this.s]+0;  console.log(s);console.log(s);

これは、 0sは、コードの前半が実行たびにをs後半が実行されるたびにそれ自体を出力することで機能します。JavaScriptの4つの癖を利用します。

  1. 現在の環境は、 this。これによりthis.s、の代わりに行うことができますs
  2. オブジェクトで定義されていないプロパティにアクセスすると、JavaScriptはエラーをスローする代わりにを返しますundefined
  3. 配列と数値は文字列を返します。 [1,2,3] + 4 === "1,2,34"
  4. 配列を文字列化するとき、 undefined、空の文字列に変換され[undefined] + 0 === "0"ます。つまり、

まとめると、これは、前半(ゼロの文字列を生成)をわずか13バイトで表現できることを意味します。のalert代わりに使用することconsole.logが許可されている場合、後半を短くすることでさらに4バイト節約できます。


おめでとうございます、私が作ったテストに合格しました!

1
...独創的!:)
シャギー




9

C(gcc)170 168 96 80 72 70バイト

はるかに短いバージョン。それでも、プリプロセッサなしで解決策を見つけられることを願っています。

i;main(n){for(;i++<n;)printf
#if 0

#endif
(" %*c",n=__LINE__/4, 10);}

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

古い168バイトバージョン:

#ifndef A
#define A p(c){putchar(c);}j,n;main(i){for(
#else
#define A n++,
#endif
A



#ifndef B
#define B i=++n;i--;p(10))for(j=n;j--;)p(64);}
#else
#define B
#endif
B

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



@ user202729ああ、はい。私はタイプミスを修正したと思ったが、バグを導入した。元に戻す。
ガストロプナー

8

Python 2、30バイト

False+=1      ;print'*'*False;

オンラインでお試しください!2番目3番目反復

これは、Pythonのboolは基本的にintおよび名前でFalseありTrue、Python 2で再割り当て可能であるという事実を利用しています。

Python 1、32バイト

exit=exit+'*'  ;print exit[30:];

オンラインでお試しください!2番目3番目の反復

Pythonの1では組み込みの文字列exitquit、それを終了するには、どのように対話型シェルのユーザーに知らせるために存在していました。デフォルト値は"Use Ctrl-D (i.e. EOF) to exit."です。


1
私が提案するつもりだったn=False+=1;print'*'*n;...が、私はそれはPythonの機能ではないことを忘れておく
ETHproductions

6

、6バイト

⊞υωLυ⸿

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

  ω     Predefined empty string (any variable would do here)
 υ      Predefined initially empty list
⊞       Push

υ 繰り返しの長さで終わります。

    υ   List
   L    Length
        Implicitly print as a row of `-`s
     ⸿  Move to start of next line

6

Haskell、68バイト

let s@(z:n)="0\n"in case lines<$>[]of(h:t):_->(h:h:t)>>(z:h++n);_->s

オンラインで1回2回、または3 試してください。

Haskellの遅延のため、上記のような式は、このMetaの質問のように、引数をとらない関数としてカウントされます。




5

Brain-Flak、74バイト

(((((()()()){}){}){}){})((()()()()()<>){})<>([]){({}[()]<(({})<>)<>>)}{}<>

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

2倍3倍にしてみてください

説明

(((((()()()){}){}){}){}) # push 48 ("0") onto first stack
((()()()()()<>){})       # push 10 (\n) onto second stack
<>([]){({}[()]<          # a number of times equal to the height of the first stack:
  (({})<>)<>             #   copy the top of the first stack to the second stack
>)}{}<>                  # cleanup and return to second stack

ブレークポイントは <>、「プッシュ10」セクションます。これを分割すると、対応する後半に到達するまで3番目のスタックに5が残り、その時点で10を押すと、中断したところから再開します。

22バイトで印刷可能なASCII値(スペース)をプッシュすることは可能ですが、これにより、<>プッシュ後にセントラルが実行され5ます。さらに2バイトを追加すること<>で、プッシュの進行状況がすべて103番目のスタックで行われるように移動できました。ボーナスとして、これにより、結果として得られる正方形がより審美的に楽しくなりました。



4

tinylisp、112バイト

(load library) (d N((q((x)(i x(inc x)1)))(v(h(t(t(h(t(q())))))))))(join(repeat-val(string(repeat-val 42 N))N)nl)

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

多くの言語が取っている「前半で文字列を構築し、後半で印刷する」アプローチは、可変変数がないため、tinylispでは機能しません。代わりに、深刻なコードのネストを行います。

コードの2番目のコピーが挿入されると、コード内に配置さ(q())れ、リストにラップされます。次に(h(t(t(h(t(...))))))、そのリストを次の部分にドリルし(d Nます。(v(...))評価する; 次に、それを名前のない関数に渡します(q((x)(i x(inc x)1)))。この関数は、数値の場合は結果の値をインクリメントし、空のリストの場合は1を返します。コードの最も外側のネストされたバージョンの最終結果はに割り当てられNます。本質的に、ネストレベルの数をカウントする奇妙な再帰を設定しました。

コードの後半では、Nアスタリスクの文字列を作成し、次にそのNような文字列のリストを作成してから、リストを改行で結合します。結果は末尾の改行で表示されます。


3

R、44バイト

F=F+1;T=TRUE*TRUE+12;
write(strrep(1,F),"");

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

末尾に改行を付けて印刷します。T=TRUE*TRUE+12ただパッドの長さにあります。

それを2倍にて、3 倍にしてみてください


セミコロンを削除することにより、2バイトを削除できます。私はあなたが#で置き換えることができ、最初の行の末尾にスペースがあるとしますF=F+1;T=TRUE*TRUE+12#。<改行>write(strrep(1,F),"")
アンドレイKostyrka

@AndreïKostyrkaは43バイトになりますが、残念ながら偶数ではありません。
ジュゼッペ


3

SNOBOL4(CSNOBOL4) 130 68バイト

コメントなし!古いアルゴリズムの説明については、編集履歴を参照してください。

	X =X + 1
	A =ARRAY(X,DUPL(1,X));
I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

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

2倍3倍にしてみてください

説明:

	X =X + 1		;* increment X
	A =ARRAY(X,DUPL(1,X));	;* create an x-length array with 1 repeated x times for each element
I	I =I + 1		;* for i < x
	OUTPUT =A<I>	:S(I)	;* output a[i]
END

のでENDラベルが必要とされ、最初の後に何もENDラベルが無視され、私たちはこの挑戦のための2つの利点が得られます。

  • プログラムの前半の操作はXX繰り返し
  • (インタープリターにとって)ラベルを含む後半のコピーが1つだけ存在します。

これは、前半に繰り返しを使用し、その後、より「従来の」ラベル付けアプローチを使用して出力X時間を繰り返すことができることを示唆しています。

前半は

	X =X + 1
	A =ARRAY(X,DUPL(1,X));

これは、繰り返されるとX、適切な回数だけ増加し、ARRAY Aから1までのインデックスを作成し、のX各要素Aは文字列の1繰り返しですX回数です。

その後、プログラムが何回繰り返されても、インタープリターは次のようにしか見えません。

I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

これはA、インデックスが範囲外になるまで一度に1つの要素を出力し、プログラムを終了する典型的なSNOBOLプログラムです。

;は通常、1行EVALまたはCODEステートメント用に予約されているオプションの行終了記号で、バイトカウントを68に非常に整頓し、中間点をマークして、そこにコードを追加できるようにします。


3

shortC56 44バイト

-12バイト:ちょっと待ってください。shortCを使用しています

s[];A
strcat(s,"@");//
Js);/*filling space*/

私は標準のCを使用していましたが、それは}最後にレプリケーションを台無しにする必要があります。shortCはEOFに暗黙的に挿入します。



1

Zsh、10バイト

s+=0
<<<$s

完全なテストスイートをオンラインでお試しください!

...ええ、これは少し良いです。文字列にN回追加してから、N回印刷します。<<<foo<<<fooうまくいくことがわかりました。


Zsh、64バイト

使用される文字:(スペース)。

f(){printf '%*s\n' $1}
:<<'E'

E
repeat $[i=LINENO/3];f $i
exit

完全なテストスイートをオンラインでお試しください!

中間点は、2番目Eとそれに続く改行の間にあります。ヒアドキュメントは、Eそれ自体で行が存在するときに終了します。これは、コードの途中で発生します。


LOL @「わずかな」改善。次のように表現することもできますs+=0;<<<$s
ロブログ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.