ペンローズトライアングルコードゴルフ


19

ペンローズの三角形もペンローズのtribar、または不可能tribarとして知られているが、不可能なオブジェクトです。

このチャレンジの目標は、可能な限り少ないバイト数でペンローズの三角形を表示することです。

ペンローズトライアングル

ソース:ウィキペディア

ルール:

  1. ペンローズトライアングルは、生成後にデジタル表示する必要があります。
  2. 画像を直接表示せずに、Wikiページの上の画像(上記のソース)と同じように見える必要があります。
  3. 同じ配色の同じ画像は、少なくとも400x400サイズで表示する必要があります。
  4. できるだけ正確である必要があります。

頑張って楽しんでね!


2
これは大きな課題になる可能性があると思いますが、画像の色や寸法など、明確にする必要がある特定の仕様があります。
KritixiのLithos

5
PS!チャレンジが終了したからといって落胆しないでください。それが悪いチャレンジのアイデアだった場合、閉票には下票が伴います... :)
Stewie Griffin

2
@DigitalTrauma私は言わないと思います。それには、さらに多くの詳細を描画する必要があります。
mbomb007

1
灰色はありますか、まったく同じ灰色である必要がありますか?後者の場合は、チャレンジテキストで正確なグレーのトーンを提供するとよいでしょう。
マーティンエンダー

1
アスペクト比も正確に再現する必要がある場合に役立ちます。
マーティンエンダー

回答:


3

ロゴ、129120バイト

各Lシェイプの最初の4辺のみを描画し、ペンを持ち上げて、次のLシェイプの対応するスポットに移動し、ペンを下げて、その4辺を描画します。各L形状は、前の形状から2つの側面を借ります。

最新の編集:使用して灰色の塗りつぶし領域に黒塗り領域からの移動fdの代わりにsetx、とのすべての動きを変更するfdbk180度回転に1つのバイトを保存するために:rt 210- > rt 30、短縮setpencolorsetpc(私が使用しているintepreterに文書化されていないが、それは動作します)

rt 30 repeat 3[pd bk 200 lt 120 bk 360 rt 120 bk 80 rt 60 bk 440 pu rt 139 bk 211 rt 41] setx -2 fill fd 9 setpc 15 fill

ロゴ、140バイト

各L形状の6辺を描画し、最後のエッジでオーバーシュートし、180度回転して次のエッジを開始します。

rt 30 repeat 3[rt 180 fd 200 lt 120 fd 360 rt 120 fd 80 rt 60 fd 440 rt 120 fd 360 rt 120 fd 200] pu setx -5 fill setx 5 setpencolor 15 fill

http://www.calormen.com/jslogo/#で実行

行うことに推奨されるcs pd setpencolor 0画面は、明らかである亀が中心と上向きされていることを確認するために実行する前に、ペンがダウンしていると黒(ブランドの新しいセッションを必要としないデフォルト設定)に設定され、またht亀(非表示にするst意志をもう一度見せてください。)

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


11

SVG(HTML5)、191バイト

<svg width=498 height=433 stroke=#000><path d=M211,134l38,66L154,365H496L458,431H40 /><path fill=#777 d=M211,2L2,365l38,66L211,134l95,165h76 /><path fill=#FFF d=M496,365L287,2H211L382,299H192


それは本当にうれしいです!
スティーブベネット

7

パイソン2、211の 201 195 188 175 173バイト

from turtle import*
d="t(120);fd(333);rt(120);fd(67);"
s="color(0,%r);begin_fill();fd(200);l"+d+"rt(60);fd(400);r"+d+"end_fill();fd(133);rt(180);"
exec s%'#fff'+s%0+s%'gray'

残念ながら、execTrinketには実装されていないため、オンラインでそのままテストすることはできません。少なくとも、無料版ではありません。文字列印刷し、テスト用のコードとして貼り付けました。スクリプトが賢い場合は、必要に応じてhtml / cssのサイズを変更して、キャンバスを大きくすることができます。もしそうなら教えてください。

オンラインで試してください -サイトのキャンバスが400pxには小さすぎるため、より小さいサイズを使用しますが、出力全体を見ることができます。

ゴルフをしていない:

from turtle import*
w=200
def f(n):
  c=255*n/2
  color(0,(c,c,c))
  begin_fill()
  fd(w)
  lt(120)
  fd(5*w/3)
  rt(120)
  fd(w/3)
  rt(60)
  fd(2*w)
  rt(120)
  fd(5*w/3)
  rt(120)
  fd(w/3)
  end_fill()
  fd(2*w/3)
  rt(180)
f(2);f(0);f(1)

255*n/2減らすことができるかどうか疑問に思っていますが、128*n浮動小数点RGB値はとにかく切り上げられるので、ピクセルカラーに変化がありますか?
アルバートレンショー

@AlbertRenshawこれは、改変されていないコードです。上記のゴルフバージョンのコードをご覧ください。また、これはPython 2なので、それらは浮動小数点数ではなく整数です。除算は整数除算です。
mbomb007

ああなるほど; ありがとう!
アルバートレンショー

6

PHP、153バイト

これは、short_open_tag設定が有効な場合にのみ機能します。ソースコードには印刷できない文字が含まれているため、代わりに16進ダンプを作成します。

0000000: 3c3f 3d67 7a69 6e66 6c61 7465 2827 b329  <?=gzinflate('.)
0000010: 2e4b 5728 cb4c 2d77 caaf b0d5 3531 3000  .KW(.L-w....510.
0000020: 611d 0b08 5628 2e29 cacf 4eb5 5536 3030  a...V(.)..N.U600
0000030: b0b3 2948 2cc9 5048 b1f5 d535 35d6 3536  ..)H,.PH...55.56
0000040: b7d0 8152 c6a6 263a 8626 c6ba 8626 0660  ...R..&:.&...&.`
0000050: dac2 5cc7 14c8 b234 0452 510a 6999 3939  ..\....4.RQ.i.99
0000060: b6ca 6969 690a 2545 8979 c569 f945 b9b6  ..iii.%E.y.i.E..
0000070: 45f9 2589 25a9 1a06 9a0a fa14 990a 7415  E.%.%.........t.
0000080: a6a9 8646 949a 9b5e 945a 8969 ae2e cc60  ...F...^.Z.i...`
0000090: 7d60 88d9 0100 2729 3b                   }`....');

解凍されたデータは次のようになります(読みやすくするために改行が追加されています)。

<svg viewBox=-400-400,800,800 stroke=#000>
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=#fff transform=rotate(0) />
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=#000 transform=rotate(120) />
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=grey transform=rotate(-120) />
</svg>

SVGデータは完全に有効ではありませんが、PHPはtext/htmlデフォルトでそれを提供します。Doctype宣言がない場合、ドキュメントは互換モードで処理されます。これは非常に寛容です。

圧縮を改善するために、画像を3つの「7」の形に分割し、ほぼ同じ<path>要素を使用して描画できるようにしました。結果の画像は、ビューポート全体に拡大されます。これは、500×500ピクセルのウィンドウからのスクリーングラブです。

500×500ピクセルのペンローズトライアングルSVG画像のスクリーングラブ


5

HTML + JS(ES6)、34 + 306 = 340バイト

30度の水平方向のスキューを利用します。マトリックス変換の3番目の引数では、30°の接線はとして表されpow(3,-.5)ます。

magicい魔法の数字はかなりあり、ウィキペディアの画像の比率とは一致しません。これについては、もっと「数学的な」方法があると確信しています。任意の助けをいただければ幸いです。

CodePenの無料版をご覧ください。

f=

_=>{with(Math)with(C=c.getContext`2d`)for(l=lineTo.bind(C),lineWidth=.01,transform(50,0,0,50,200,224),N=4;N--;rotate(PI*2/3))beginPath(fill(save(fillStyle=N?N>1?'#fff':'#000':'#777'))),transform(-1,0,-pow(3,-.5),-1,3.965,1.71),l(0,0),l(0,6),l(1,6),l(1,1),l(4.616,1),l(5.772,0),closePath(restore(stroke()))}

f()
<canvas id=c width=400 height=400>


4

HTML + CSS、9 + 315 309 308 = 317バイト

たくさんのボーダーとスキュー!Chromeでテスト済み。CodePenにあるungolfedバージョンをご覧ください

body{margin:9em}b,:after{position:fixed;transform:rotate(240deg)}b:after{content:'';left:-6.1em;top:-7.95em;width:6em;height:9em;border-left:transparent 2.32em solid;border-right:2em solid;border-bottom:2em solid;transform:skew(30deg);filter:drop-shadow(0 0 .1em)}b{color:#777}b>b{color:#000}b>b>b{color:#fff
<b><b><b>


最小400x400pxの要件を満たしていますか?
セルヒオール

ファイナルは必要ありません>よね?
スタンストラム

4

Mathematica 171バイト

w=(v=AnglePath)[s={{9,0},{11,2(b=Pi/3)},{2,b},{9,2b},{5,-2b},{2,b}}];x={w[[5]],2b}~v~s;y={x[[5]],-2b}~v~s;Graphics@{White,EdgeForm[Black],(p=Polygon)@w,Gray,p@x,Black,p@y}

AnglePathを使用して3つのポリゴンを描画し、60度の倍数で、各ポリゴンの開始点が前のポリゴンの5番目の点であることを利用します。


1
を使用した素晴らしいアプローチAnglePath
-DavidC

1

Tcl / Tk、205

grid [canvas .c -w 402 -he 402]
.c cr p 171 2 237 2 401 337 125 337 156 280 301 280 -f #FFF
.c cr p 2 335 171 2 310 280 250 280 171 121 31 401 -f gray
.c cr p 171 127 34 401 374 401 401 337 127 337 201 188

ペンローズトライアングル

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