ロイターシュヴァルトの三角形を描く


33

この不可能なオブジェクトは、ロイターシュヴァルトの三角形です。

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

次のルールに従って独自のバージョンを描画します。

  • 合計9個のキューブ
  • 各辺はちょうど4つの立方体で構成されています
  • キューブは、レンダリングされたオブジェクトが実際には不可能なオブジェクトであるように重なっているように見えます
  • 4つの異なる色が使用されます-背景用に1つ、キューブの各面に3つ
  • ビットマップ出力では、完全な三角形の高さは少なくとも100ピクセル、幅は少なくとも100ピクセルにする必要があります
  • アスペクト比:完全な三角形の幅と高さが2倍以上ずれてはいけません
  • 三角形は、上の画像に対して任意の量だけ回転できます
  • 三角形は、上記の画像に対して反映される場合とされない場合があります

回答:


14

Brain-Flak、487810 327722 75564 + 1 = 75565バイト

残念ながら、これは答えに収まるには少し大きいです。

ペーストビン

オンラインで試す

この-Aフラグを使用すると、次のようなASCII ppmファイルが出力されます。

新しい出力

説明

あなたはすでに私がこれを手で書いていないことを推測しているかもしれません。だからここに私がそれをやった方法があります:

最初に、チャレンジで提供される画像から上記の画像を作成しました。それ以外の値のカラーチャンネルがないこと、255または0この方法で最大のカラーチャンネルを1に設定して小さなファイルにまとめることができるという区別があります。ここで見つけることができる私が自分で書いたモジュールを使用してこれを解決します。あまり洗練されていないので、このようなことのために私が一緒に投げたハックです。 pushは、数値をスタックにプッシュする効率的なBrain-Flakコードを返す関数でありkolmo、特定の文字列をスタックにプッシュする効率的な方法を見つけようとする非常に単純なコルモゴロフ複雑度解決プログラムです。

from value import push,kolmo

def group(a, n):
    return zip(*[a[i::n]for i in range(n)]) 

f=open("R.ppm")
a=["".join(x)for x in group(f.read().split()[3:][::-1],3)]
f.close()

def hardcode(string):
    result = push(ord("\n")).join("(<>({})<>"+{"0":"","1":"()"}[x]+")"for x in string)
    return result

last = ""
acc = 0
result = push(ord("0"))+"<>"
for x in a+[""]:
    if x != last:
        string = ("" if not last else kolmo("\n")+hardcode(last))
        result += min([push(acc)+"{({}[()]<%s>)}{}"%string,acc*string],key=len)
        acc=1
    else:
        acc += 1
    last = x
print result+kolmo("P3 100 100 ")

これはとても楽しかったし、答えを改善したいと思っています


14
あなたは合法的に160088バイト離れてゴルフをしましたか?それは記録ですか?
ニール

たぶん、いくつかの単項の答えがそれを打ち負かすことができます
ローマングレーフ


あなたのPythonコードに興味があります。なにvalue?(PyPIのこのモジュールではない、私は推測していますか?)何kolmoですか?
ティムペデリック

@TimPederickそれについてすみません。それは、Brain-Flakをゴルフするためのモジュールです。本文にリンクを含めます。
小麦ウィザード

13

Mathematica、237バイト

n={-1,1}#&;c_~g~s_:=Polygon[c+s#&/@{k={12,9},m=n@k,t={0,-12}}];p={#,#2~g~1,#3~g~-1}&;a=p[Cyan,#-k,#+m]&;b=p[Blue,#-t,#+k]&;c=p[Red,#-m,#+t]&;Graphics@{{a@#,b@#,c@#}&/@{j=4k,s=4{4,9},n@s,4m,r={-32,8},q=-4{4,5},4t,n@q,n@r},a@j,b@s,c@j,c@s}

読みやすいバージョン:

1  n = {-1, 1} # &;
2  c_~g~s_ := Polygon[c + s # & /@ {k = {12, 9}, m = n@k, t = {0, -12}}];
3  p = {#, #2~g~1, #3~g~-1} &;
4  a = p[Cyan, # - k, # + m] &;
5  b = p[Blue, # - t, # + k] &;
6  c = p[Red, # - m, # + t] &;
7  Graphics@{
8    {a@#, b@#, c@#} & /@
9      {j = 4 k, s = 4{4, 9}, n@s, 4 m, r = {-32, 8},
10       q = -4{4, 5}, 4 t, n@q, n@r},
11   a@j, b@s, c@j, c@s}

行1はn、順序付けられたペアの最初の座標を否定する関数を定義しています。ライン2つの定義する関数gの点を中心とする(略)正三角形を生成しc、そして下向きかどうかに応じてアップsです1か、-1。3行目はp、色と2つの三角形で構成される平行四辺形のテンプレートであると定義し、4〜6行目は、abおよびcキューブに表示される平行四辺形の三つの異なる特定のタイプであること。

行8は{a@#, b@#, c@#}&、ポイントを中心とした立方体全体を描く関数を定義しています#。9行目と10行目は、大きな三角形を作成するのに必要な9つのポイントにそれを適用します。これにより、右上から反時計回りに9個のキューブが生成され、後のキューブが前のキューブの一部を覆います。最後に、11行目は4つの平行四辺形(図の右上)を再描画し、後のキューブを想定どおりに覆うようにします。出力は次のとおりです。

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


6
Mathematicaにこれが組み込まれていないものを待ってください?
デジタル外傷

10

HTML + CSS 3D(855 866バイト)

HTML 117バイト + CSS 738バイト

z-indexes順番を維持するのは少し面倒でした。;)

/* CSS */
p{position:absolute;left:110px;top:0;width:50px;height:50px;transform-style:preserve-3d;transform:rotateX(-45deg)rotateY(21deg)rotateZ(20deg)}
p+p{left:140px;top:50px}
p+p+p{left:170px;top:100px}
p+p+p+p{left:200px;top:150px}
p+p+p+p+p{left:140px;top:150px}
p+p+p+p+p+p{left:80px;top:150px}
p+p+p+p+p+p+p{left:20px;top:150px}
p:nth-child(8){z-index:1;left:50px;top:100px}
p:nth-child(9){z-index:-1;left:80px;top:50px}
p:nth-child(10){z-index:1;left:67px;top:59px;transform:rotateX(-45deg)rotateY(21deg)rotateZ(20deg)scale(0.6)}
a{position:absolute;width:50px;height:50px;background:red;transform:rotateY(0deg)translateZ(25px)}
a+a{background:tan;transform:rotateY(-90deg)translateZ(25px)}
a+a+a{background:navy;transform:rotateX(90deg)translateZ(25px
<!-- HTML -->
<p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a>

読みやすくするために、新しい行を保持しました。たぶん誰かがより多くのゴ​​ルフの可能性を見つけます。ただし、バイトカウントには含まれません。

結果

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

jsFiddleデモ

自分で試してみてください

Goole Chromeを使用します。他のブラウザではに問題があるz-indexes可能性があります。

編集

  • 保存された2つのバイトを重複除去することaに、感謝を-selectorをETHproductions
  • -elementで不要なものを削除して9バイトを保存margin:0aました。

HEAD/BODYタグがなくてもタグは有効ですか?ブラウザは構文エラーを無視し、投げたものを表示しようとする傾向があることは知っていますが、このコードは仕様に従っていないと思います。(それは、素晴らしい解決策!)
フェデリコポロニ

2
@FedericoPoloniありがとうございます。html|head|body-elements について:省略できます。を見てみましょう「オプションのタグ」を。同様に、要素と終了タグもいくつ省略できるか驚かれることでしょう。仕様にはないが機能するのは、a-elementsの終了タグを省略することです。ただし、ネストできないため、ブラウザによって正しく閉じられます。また、Code Golfの観点から:「コンパイル」され、正しい出力を持つものはすべて有効です。;)
ユーザー名をここに挿入し

9

BBC BASIC、147バイト

トークン化されたファイルサイズ129バイト

t=PI/1.5x=500y=x:FORi=0TO28b=i MOD3GCOL0,b:b*=t:a=i DIV9*t:IFb=0x-=99*COSa:y-=99*SINa
MOVEx,y:VDU25;66*COSb;66*SINb;28953;66*COS(b-t);66*SIN(b-t);:NEXT

絶対座標指定を使用して保存された2バイト(MOVEすべての絶対指定を使用できるように原点を変更する代わりに)および平行四辺形ごとに2つの相対指定。1バイトの不要な空白が削除されました。

BBC BASIC、150バイト

トークン化されたファイルサイズ127バイト

http://www.bbcbasic.co.uk/bbcwin/download.htmlからインタープリターをダウンロードします

t=PI/1.5x=500y=x:F.i=0TO28b=i MOD3GCOL0,b:b*=t:a=i DIV9*t:IFb=0 x-=99*COSa:y-=99*SINa:ORIGINx,y
L.66*COSb,66*SINb,0,0PLOT117,66*COS(b-t),66*SIN(b-t)N.

説明

右上の座標から始めて、3つのグループに菱形をプロットします。3つの各グループの前に、原点(西、西、西、SE、SE SE、NE、NE NE)を移動します。右上には、プロットされる最後の完全なグループがあり、原点を元の場所に戻します。次に、最初のグループの黒と赤(緑は除く)を合計29個のひし形でプロットします。

非ゴルフ

  t=PI/1.5                                 :REM 120 deg
  x=500                                    :REM coordinates of top right corner
  y=x
  FORi=0TO28
    b=i MOD3:GCOL0,b                       :REM set colour 0=black,1=red,2=green
    b*=t                                   :REM convert b to a multiple of 120deg
    a=i DIV9*t
    IFb=0 x-=99*COSa:y-=99*SINa:ORIGINx,y  :REM before each group of 3 rhombs move the graphics origin
    LINE66*COSb,66*SINb,0,0                :REM define one side of a rhombus
    PLOT117,66*COS(b-t),66*SIN(b-t)        :REM define one further corner and plot the rhombus
  NEXT

出力

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


8

HTML + JavaScript(ES6)、351 374 384

<canvas id=C></canvas><script>c=C.getContext("2d");`133124222162184253104213162164244191224182133191064104222093164253122224284151284`.match(/.../g).map((v,i)=>(c.fillStyle=['#fc0','#f04','#08a'][a=i%3],c.beginPath(),c[l='lineTo'](x=5*~~v/10,y=v%10*25),c[l](x-10,y+(--a+!a)*17),a&&c[l](x-30,y+a*17),c[l](x-20,y),!a&&c[l](x-10,y-17),c.fill()))</script>

少ないゴルフ

<canvas id=C></canvas>
<script>
  c=C.getContext("2d");
  [133,124,222,162,184,253,104,213,162,164,244,191,224,182,133,191,64,104,222,93,164,253,122,224,284,151,284]
  .map((v,i)=>(
    a = i % 3,
    x = 5 * ~~ v / 10,
    y = v % 10 * 25,
    c.fillStyle = ['#fc0','#f04','#0a8'][a],
    c.beginPath(),
    --a,
    c[l='lineTo'](x, y),
    c[l]( x -10, y + (a+!a) * 17),
    a&&c[l](x - 30, y + a * 17),
    c[l](x - 20, y),
    !a&&c[l](x - 10, y - 17),
    c.fill()
  ))
</script>

テスト

<canvas id=C></canvas><script>c=C.getContext("2d");`133124222162184253104213162164244191224182133191064104222093164253122224284151284`.match(/.../g).map((v,i)=>(c.fillStyle=['#fc0','#f04','#08a'][a=i%3],c.beginPath(),c[l='lineTo'](x=5*~~v/10,y=v%10*25),c[l](x-10,y+(--a+!a)*17),a&&c[l](x-30,y+a*17),c[l](x-20,y),!a&&c[l](x-10,y-17),c.fill()))</script>


5

JavaScript(ES6)/ SVG(HTML5)、350 312バイト

document.write(`<svg width=390 height=338>`)
a=`195,52;240,130;285,208;330,286;240,286;150,286;60,286;105,208;150,130;`
a=(a+a).split`;`
for(i=9;i--;)document.write(`<path fill=#FD0 d=M${a[i]}h60l-30,-52h-60z /><path fill=#088 d=M${a[i+3]}h60l-30,52h-60z /><path fill=#F64 d=M${a[i+6]}l-30,-52l-30,52l30,52z />`)


3

SVG、562 540 520 504 487 473バイト

SVGを初めてゴルフする(または実際にマークアップする)のはこれが初めてです。穏やかな!

想定される表示環境は、一般的なウィンドウサイズのようなものを備えたSVG対応Webブラウザーです。Firefox 50とChrome 55でテストしました。

viewBox100ピクセルの要件を満たす必要があります。すべての測定値を適切な係数で爆破することもできますが、より多くのバイトが必要になります。ちなみに、別のバイトを保存するには、スペースを削除します0 -5viewBox(クローム一方意志)の値が、Firefoxは有効なものとして、これを受け入れることはありません。

アスペクト比は、真の0.866:1ではなく1:1です。「2の係数」ルールがどのように解釈されるのか正確にはわかりません(0.433:1または1.732:1の極端な誇張が許容されることを意味すると思います)が、これは要件を満たしていると確信していますとにかく。

SVG

<svg xmlns="http://www.w3.org/2000/svg"
xmlns:l="http://www.w3.org/1999/xlink"
viewBox="0 -5 26 26"><g
id="a"><path d="m7,9H3V5h6z"/><g
id="f"><path fill="red" d="m9,5H3V1h4z"/><path
fill="blue" d="m3,1l2,4L3,9l-2-4z"/></g></g><use
l:href="#a" x="3" y="6"/><use
l:href="#e" x="12"/><g
id="e"><use l:href="#a" x="-6" y="12"/><use l:href="#a" x="-12" y="12"/></g><use
l:href="#a" x="-9" y="6"/><use
l:href="#a" x="-6"/><use
l:href="#a" x="-3" y="-6"/><use
l:href="#f"/></svg>

結果

Reutersvärdの三角形の上記のSVGコードのPNGレンダリング


おそらくここで改行を削除できると思いますか?IIRC、XMLはほとんどのコンテキストで空白を無視します。

@ ais523:ええ、投稿する前にそれをするのを忘れていました。facepalmしかし、今は完了です。まだ改行があり、漠然と読みやすくなっていますが、とにかく何らかのスペースが必要な場所(つまり、タグ名と属性の間)でのみです。
ティムペデリック

アスペクト比ルールのあなたの解釈は正しいです
デジタル外傷
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.