シェルピンスキーコード


47

空白の部分に同じサイズのスペースブロックを使用して、シェルピンスキーカーペットに配置したときに、カーペットの繰り返し数を出力するプログラムを作成する長方形のテキストブロックを記述します。

たとえば、テキストブロックが

TXT
BLK

その後、プログラムを実行する

TXTTXTTXT
BLKBLKBLK
TXT   TXT
BLK   BLK
TXTTXTTXT
BLKBLKBLK

1プログラムの形状は、シェルピンスキーカーペットの最初の反復を表すため、出力する必要があります。

同様に、実行中

TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT   TXTTXT   TXTTXT   TXT
BLK   BLKBLK   BLKBLK   BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT         TXTTXTTXT
BLKBLKBLK         BLKBLKBLK
TXT   TXT         TXT   TXT
BLK   BLK         BLK   BLK
TXTTXTTXT         TXTTXTTXT
BLKBLKBLK         BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT   TXTTXT   TXTTXT   TXT
BLK   BLKBLK   BLKBLK   BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK

これは2番目のシェルピンスキーカーペット反復の形状であるため、2を出力する必要があります。

テキストブロックをそのまま実行する

TXT
BLK

00回目の反復と見なすことができるため、出力する必要があります。

これは、それ以降のすべての反復で機能するはずです。(少なくとも理論的には、コンピューターにメモリとすべてが搭載されていると仮定します。)

詳細

  • プログラムは、ソースコードに関する情報を読み取ったりアクセスしたりすることはできません。これを厳しい馬の挑戦のように扱ってください。
  • 出力はstdoutまたは同様の代替になります。数値とオプションの末尾の改行のみを出力します。入力はありません。
  • テキストブロックには、行末記号と見なされない文字が含まれる場合があります。テキストブロックにはスペースを含めることができます。
  • カーペットの「空のスペース」は、スペース文字のみで構成する必要があります。
  • オプションで、すべてのプログラムの末尾に改行があると想定することもできます。

このスタックスニペットを使用して、任意の反復で特定のテキストブロックのカーペットを生成できます。

<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>

得点

最初のテキストブロックが面積(幅x高さ)で最小の提出物が勝者です。TXT\nBLK例は、6のスコアのために2によって3である(基本的に最短コード勝、したがってコードゴルフタグ)。

Tiebreakerは、テキストブロック内で最も少数の異なる文字を使用する送信に進みます。まだ同点の場合、回答は投稿された最初の勝利です。

回答:


23

CJam、9バイト

これは改善できると思いますが、今のところはそれを試してみましょう...

];U):U8mL

仕組み

];             "Wrap everything on stack in an array and discard it";
               "Before this point, the only thing on array can be the log 8 result of";
               "last updated value of U, or nothing, if its the first code";
  U):U         "Increment by 1 and update the value of U (which is pre initialized to 0)";
      8mL      "Take log base 8 of U. This is the property of Sierpinski carpet that";
               "the occurrence of the code is 8 to the power iteration count, indexed 0";

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


35

piet-32 * 6 = 192

ここに画像の説明を入力してください

空のスペースをチェッカーパターンで埋めました。シェルピンスキーは少しトリッピーになると思います。

2番目の反復は次のとおりです。 ここに画像の説明を入力してください

オリジナル:32 * 7

ここに画像の説明を入力してください


19

> <>、11 * 2 = 22

";n"00pbi1v
+$3*:@3-0.>

ここでは、> <>のジャンプ/テレポート機能を使用して、異なるアプローチを取ります。

プログラムは、一番上の行のブロックのみを実行し、1番目と2番目のブロック、3番目と4番目のブロック、9番目と10番目のブロック、27番目と28番目のブロックなどを実行します(3の累乗)。一番上の行には3^nブロックnがあるため、プログラムが最初に戻り、スタックの一番上を出力して停止する前にブロックのみが実行されます(nを介して配置された命令によりp)。

iEOFが満たされた場合、コマンドはスタックに-1をプッシュするため、プログラムは「入力がありません」というルールを利用します。そのため、これをテストするには、空のファイルにパイプする必要があります。


以前の提出、7 * 4 = 28

l"v"10p
v>:1=?v
3  ;n{<
<^}+1{,

最初の行は、ブロックごとにスタックの長さを継続的にプッシュし、putコマンドを使用"して最初の引用符を下矢印に変更します。最初の行が終わるまでに、スタックは次のようになりますvp

[0, 1, 2, .., 3^n]

(イニシャルlは2回使用されることに注意してください。)

最後の3行は、1をヒットするまでに3で割る必要がある回数をカウントします(> <>にはログ関数がないため)。下のゼロは、カウントを追跡するために使用されます。


13

Perl、26

$_+=.91/++$n;
die int."\n";

これは、基数3の対数を近似するために調和級数を使用します。私はそれがうまくいくと思うが、私は少数のためだけにそれを試した。die。を使用するというアイデアをきしむossifrageにありがとう。

古いバージョン(34):

$n--or$n=3**$s++;
print$s-1if!$o++;

それは非常にきれいです!
squeamish ossifrage

10

Perl、30(15×2)

まず第一に、10回の反復が2 32ではなく合理的な制限であると主張します。10回の反復後、Nバイトで構成されるプログラムは(N ×3 20)バイト(および改行)に拡張され、N = 1の場合でも3ギガバイトを超えます。32ビットアーキテクチャでは、11回の反復を完全に処理できません。(そして明らかに、2 32回の反復には十分な粒子が宇宙にありません)。

だからここに私の解決策があります:

$n++; $_=log$n;
print int;exit;

これ$nは、最初の行の変数をインクリメントし、各ステップでその対数を計算することにより機能します。2行目は、この対数の整数部分を出力して終了します。

eを底とする単純な対数(2.718 ..)は、最初の10回の繰り返しに対して正しい結果を与えるのに十分近いです。


2
OPによると、理論的にはすべての反復で機能するはずです。
ネイサンメリル

2
@NathanMerrillさて、OK。しかし、元の仕様に準拠するには、別の宇宙で作業する必要もありました。質問はそれ以来編集されています。
squeamish ossifrage

ここでの良い点のために質問を変更しました。自然なログを使用することは灰色の領域であることに同意します、正直なところ、これは勝てないのであまり心配していません。
カルバンの趣味

これらの提出のほとんどは、3 ^ nx 1タイルの一番上の行でのみ制御を維持します。カーペットのそのセグメントを生成するだけであれば、さらに拡大することができます。ほぼ間違いなく、丸め誤差によってどこが壊れるのか。
captncraig

1
すでに述べたように、元の質問では、「合理的な」反復回数(2 ^ 32まで)に拡張できるコードが必要でした。計算を行うと、1回のバイトでさえ、その多くの反復の後、10 ^ 4098440370バイトを超えるまで拡張することがわかります。私は少しだと思ったことを答え提案し、より合理的に、それ以来言葉「合理的に」質問から姿を消しました: - /。ほら、ここで終わった。気に入らない場合は、この回答に投票してください。
squeamish ossifrage

9

Golfscript、9 * 2 = 18

0+       
,3base,(}

(最初の行には、長方形にするために末尾のスペースがあることに注意してください)

Golfscriptのログ関数が見つからなかったので、見つけbaseなければなりませんでした。

Golfscriptは空の文字列で始まるため0+、文字列の長さを1だけ増やします(強制により)。最初の行が終了するまでに、スタックには長さの文字列が3^nあります。これは、スーパーコメントする前にログベース3を取得します。nその後、自動的に印刷されます。


文字列の代わりに整数を使用,して、2行目に保存することで2文字を保存できます。最初の行:0or); 2行目3base,(}。もう1つの明らかなターゲットは(、2行目です。これは複雑ですが、最初の行を1+~abs(7 * 2の長方形に置き換えることで削除することもできます。
ピーターテイラー

8

C、12x8 = 96

@ciamejに触発されて、削減しました。この除算3トリックと、カーペットがifをwhileループに効果的に変換するという認識を使用します。

コードは、gcc / Ubuntuで最大3回の反復でテストされました。

#ifndef A //
#define A //
x;main(a){//
a++;/*    */
if(a/=3)x++;
printf(   //
"%d",x);} //
#endif    //

以前のソリューション:C、11x12

サイズの勝者ではありませんが、ちょっと、それはCです。

ビットシフトによってブロックカウントのlog2を見つけてから、マジックナンバーと整数の切り捨てを使用してlog3を推定します。計算は最大26回の反復(42ビット数)で動作するはずです。

#ifndef A//
#define A//
int n=0;//_
int main//_
(v,c){//___
n+=1;/*..*/
while(n//__
>>=1)v++;//
n=.3+.62*v;
printf(//__
"%d",n);}//
#endif//__

こんにちは、ソリューションの短縮バージョンを投稿しました。
シアメ

その場合の素敵なトリック!;)
ciamej

6

CJam、9バイト

使用のアイデアは]オプティマイザーからのものですが、カウントには非常に異なる方法が使用されます。

X~]:X,8mL

オンラインで試す

使い方:

X~          "push X and dump its contents.  On the zeroth iteration, X is a single number, but later is it an array.";
  ]         "wrap everything into an array.  The stack would contain the contents of X plus the result of the previous instance of the code";
   :X       "store this array back into X.  X is now 1 element longer";
     ,      "take the length of X";
      8mL   "do a base-8 logarithm of it";

他の2つの9バイトソリューション

]X+:X,8mL

],X+:X8mL

これは、実際にタイブレーカーでもオプティマイザーを結び付けます。:P Tiebreakerbreaker:以前の投稿が勝ちます。
カルビンの趣味

関係なく、それは良い解決策だと思います。私は9文字を打つことができませんでした。
PhiNotPi

私は一般的なアプローチは同じだと思います(そしてそれが理にかなっている唯一のアプローチです)-変数を持ち、何らかの方法でそれを1増やします。
オプティマイザー

4

Python 2、15 * 3 = 45

m=n=0;E=exit  ;
m+=1;n+=m>3**n;
print n;E()   ;

count-first-row-then-log-three-and-exitアイデアの別の実装。おそらくまだもう少しゴルフすることができます。


2

bc、2 * 16 + 1 = 33

スコアの余分な+1は、-lbcオプションが必要なためです。

a+=1;          
l(a)/l(3);halt;

2

Golfscript、7 * 2 = 14

1+~abs(
3base,}

これは、Sp3000の回答にインスパイアされており、特に長い2行目を最適化したいという要望に基づいています。3base,GSで3を底とする対数が得られるほど短く、スーパーコメント}は明らかに最適です。

最初の行に必要なのは、空の文字列''を初期stdinから0にマップし、次に負でない各整数をその後継にマップすることです。このようにし3^n - 1て、スタックの最初の行を終了し、3base,デクリメントを必要としません。


2

C、13x8

#ifndef A//__
#define A//__
x;a;main(){//
a++;;;;;;;;;;
while(a/=3)//
x++;printf(//
"%d",x);}//__
#endif//_____

1

Perl、76

すでに徹底的に打ち負かされているので、これを投稿することはおそらくあまり意味がないことを知っていますが、とにかく私の現在の解決策があります。

$_++;                                 
if(not$_&$_-1){print log()/log 8;$_--}

@Alexこれは、最初の反復でも動作しないようです。
PhiNotPi

はい、それは現状のままで動作します。メソッドをテストしましたか?
PhiNotPi

私はideone:ideone.com/othumPで動作します。
PhiNotPi

わかった。以前は機能しなかった重要な詳細を見逃していました。そうです、私の提案は間違っています。
アレックスA.

1

> <>(魚)、12 * 3 = 36

より簡単な> <>ソリューション:

'v'00p0l1+  
>  :2-?v$1+v
^$+1$,3< ;n<

まず、一番上のブロックの一番上の行を実行します。'v'00pv全体に達した後、最初に戻ったときにプログラムポインタを下に向けるプログラム全体の最初の位置に配置します。その前に、すべてのブロックは0をプッシュし、スタックの長さは1になります。(スタックはになります0 2 0 4 0 6 ...

2番目と3番目の前半では、2を取得する前に一番上のスタック要素を分割できる回数をカウントします(これを2番目から2番目の要素に格納します)。

最後に、スタックの2番目から2番目の要素を出力します。


1

ルア、3 * 17 = 51

ほとんどの人と同じ戦略:

x=(x or 0)+1;    
y=math.log(x,3)  
print(y)os.exit()

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