彭罗斯三角Codegolf


19

彭罗斯三角形,也被称为彭罗斯tribar或不可能tribar,是不可能的对象。

此挑战的目标是以尽可能少的字节显示Penrose三角形。

彭罗斯三角

资料来源:维基百科

规则:

  1. 生成彭罗斯三角后,必须以数字方式显示它。
  2. 它们的外观必须与Wiki页面的上述图像相同(上述资源),而无需直接显示该图像。
  3. 具有相同配色方案的同一图像必须以至少400x400的尺寸显示。
  4. 应该尽可能准确。

祝好运并玩得开心点!


2
我认为这有可能成为一个巨大的挑战,但是有一些规范需要澄清,例如图像的颜色及其尺寸。
Kritixi Lithos

5
PS!不要因为挑战已经结束而灰心。如果这是一个不好的挑战性想法,那么近距离投票将伴随着反对票... :)
Stewie Griffin

2
@DigitalTrauma我不会说。那还有更多细节需要绘制。
mbomb007 '17

1
是否会有任何灰色或必须完全相同的灰色?如果是后者,最好在质询文本中提供确切的灰色调。
马丁·恩德

1
如果必须精确地复制纵横比,则它们也将有所帮助。
Martin Ender

Answers:


3

徽标,129120字节

仅绘制每个L形的前4个边,然后提起笔,移动到下一个L形上的相应点,放下笔并绘制该L的4个边。每个L形从上一个借来2个边。

最新编辑:使用fd代替从黑色填充区域移至灰色填充区域setx,并将所有移动从更改fdbk以180度旋转保存一个字节:rt 210-> rt 30,缩短setpencolorsetpc(我正在使用的解释器中未记录,但可以)

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

Python 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'

不幸的是,exec它没有在Trinket中实现,因此无法按原样在线进行测试。至少不是免费版。我打印出字符串并粘贴为代码以对其进行测试。如果您对脚本很聪明,则可以根据需要调整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 '17

哦,我懂了; 谢谢!
艾伯特·伦肖

6

PHP,153字节

仅在short_open_tag启用设置的情况下才有效。源代码包含不可打印的字符,因此有一个十六进制转储:

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声明,文档将以怪癖模式处理,这是非常宽容的。

为了改善压缩效果,我将图像分为三个“ 7”形部分,可以使用几乎相同的<path>元素进行绘制。生成的图像将展开以填充视口。这是从500×500像素的窗口抓取的屏幕:

500×500像素Penrose三角SVG图像的屏幕抓图


5

HTML + JS(ES6),34 + 306 = 340字节

利用30度水平偏斜-在矩阵变换的第3个参数中,30°的切线表示为pow(3,-.5)

有很多丑陋的魔术数字,它与Wikipedia图片的比例并不完全匹配。我敢肯定,还有一种更“数学”的方式来解决这个问题;任何帮助,将不胜感激。

请参阅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的非公开版本

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的要求?
sergiol

您不需要决赛>吧?
Stan Strum,2017年

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

彭罗斯三角

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.