画Reutersvärd的三角形


33

这个不可能的对象Reutersvärd的三角形

在此处输入图片说明

根据以下规则绘制自己的版本:

  • 总共恰好9个立方体
  • 每边正好由4个立方体组成
  • 立方体似乎重叠,因此渲染的对象实际上是不可能的对象
  • 使用4种不同的颜色-一种用于背景,另一种用于立方体的三个面
  • 在位图输出中,整个三角形的高度至少应为100像素,宽度至少应为100像素
  • 宽高比:整个三角形的宽度和高度相差不应超过2倍
  • 三角形可以相对于上图旋转任何量
  • 三角形可能会或可能不会相对于上图反映

Answers:


14

Brain-Flak,487810 327722 75564 +1 = 75565字节

不幸的是,这有点适合回答。

粘贴框

在线尝试

使用该-A标志,将输出如下所示的ASCII ppm文件:

新的输出

说明

您可能已经猜到我没有亲手写。所以这是我的做法:

我首先根据挑战提供的图像制作了您在上方看到的图像。它的区别在于没有其他任何颜色的颜色通道,255否则0我们可以将其包装到一个较小的文件中,并将最大颜色通道设置为1。然后我编写了一个Python脚本来编写Brain-Flak程序使用我自己写的模块解决了这个问题,可以在这里找到。它不是很完美,只是我为这样的事情而提出的一个技巧。 push是一个返回有效的Brain-Flak代码以将数字压入堆栈的函数,并且kolmo是一个非常简单的Kolmogorov复杂度解决程序,试图找到一种将特定字符串压入堆栈的有效方法。

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字节?那是唱片吗?
尼尔

也许一些一元答案可以解决这个问题
RomanGräf17年


您的Python代码引起了我的兴趣。什么value啊 (我猜不是PyPI上的这个模块吗?)什么kolmo
蒂姆·佩德里克

@TimPederick抱歉。多数民众赞成在写模块自己打高尔夫球的大脑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,并根据sis 1或向下或向上-1。线3只限定p为包括一个颜色和两个三角形的平行四边形模板,线4-6限定abc成为三种不同的特定类型显示在立方体平行四边形。

第8行定义了一个函数{a@#, b@#, c@#}&,该函数以点为中心绘制整个立方体#; 第9和10行将其应用于制作更大三角形所需的九个点。这将产生九个立方体,从右上角开始,并逆时针旋转,后面的立方体覆盖前面的立方体的一部分。最后,第11行重新绘制了四个平行四边形(在图片的右上角),以便它们最终覆盖了预期的后面的多维数据集。输出如下:

在此处输入图片说明


6
等待Mathematica没有内置的功能吗?
Digital Trauma '01

10

HTML + CSS 3D(855866字节)

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出现问题

编辑

  • 多亏了ETHproductions,通过删除重复的选择器节省了2个字节a
  • 通过删除-element 上不必要的部分,节省了9个字节margin:0a

没有HEAD/BODY和关闭标签,它仍然是有效的HTML 吗?我知道浏览器往往会忽略语法错误,并尝试显示您向它们抛出的任何错误,但是我认为这段代码并不符合规范。(这就是说,很好的解决方案!)
Federico Poloni

2
@FedericoPoloni谢谢。关于html|head|body-elements:它们可以省略。看一看“可选标签”,您会惊讶地发现有多少元素和结束标签也可以省略。规范中没有但可以使用的是省略-elements的结束标记a。但是,它们无法被浏览器正确关闭,因为您无法嵌套它们。同样从Code Golf的角度来看:“ 编译 ”并具有正确输出的所有内容都是有效的。;)
insertusername此处为

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)和每个平行四边形两个相对规范,而不是更改原点以便能够使用所有绝对规范。消除了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组之前,我们移动原点(West,West,West,SE,SE SE,NE,NE NE)。这意味着3组右上角是要绘制的最后一个完整组,使原点回到其原始位置。然后,我们继续绘制第一组的黑色和红色(而不是绿色),总共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中对其进行了测试。

viewBox,以满足100像素的要求是必要的; 将所有测量值放大一个合适的因子也可以,但是会占用更多字节。顺便说一句,可以通过在消除空间来保存另一个字节0 -5viewBox值,但Firefox不会接受此为有效(而Chrome浏览器会)。

长宽比是1:1,而不是真实的0.866: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>

结果

上面的SVG代码的PNG渲染为Reutersvärd的Triangle


我想您可能可以在这里删除换行符,不是吗?IIRC,XML在大多数情况下都忽略空格。

@ ais523:是的,我在发布之前忘了这么做。facepalm现在就完成了。仍然有换行符,使其隐约可读,但仅在无论如何都需要某种空间的地方(即,标记名称和属性之间)。
蒂姆·佩德里克

您对长宽比规则的解释是正确的
Digital Trauma'1
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.