该鲁洛三角形是由三个圆的交点所形成的形状,其中每个圈通过别人的中心。无论旋转,Reuleaux三角形的宽度始终等于圆的半径:
编写一个程序,将宽度r
作为输入并显示该宽度的Reuleaux三角形(以像素为单位)。
您必须单独显示形状,即实心填充,未描边并在实心填充背景上显示。
code- golf-以字节为单位的最短程序获胜。
该鲁洛三角形是由三个圆的交点所形成的形状,其中每个圈通过别人的中心。无论旋转,Reuleaux三角形的宽度始终等于圆的半径:
编写一个程序,将宽度r
作为输入并显示该宽度的Reuleaux三角形(以像素为单位)。
您必须单独显示形状,即实心填充,未描边并在实心填充背景上显示。
code- golf-以字节为单位的最短程序获胜。
Answers:
j=math.rad(60)i="increment"m=math s=m.sin C=m.cos g=love.graphics f="fill"S=g.stencil function love.draw()r=arg[2]c=function(x,y)return function()g.circle(f,x,y,r,r*4)end end X=r/2 Y=0 S(c(X,Y),i,1)S(c(X+C(j)*r,Y+s(j)*r),i,1,true)S(c(X-C(j)*r,Y+s(j)*r),i,1,true)g.setStencilTest("greater",2)g.rectangle(f,0,0,2*r,2*r)end
可能不是最佳解决方案,它使用Love2D的模具,设置3个圆,并填充它们相交的位置。
通过命令行调用,例如 love tri.love 256
采用与@MichaelSeifert不同的方法,并且可能对pixel子句进行了一些字面解释:
Image@Boole@Table[And@@(({x,y}∈#~Disk~2)&/@{{0,c=√3},d={1,0},-d}),{x,-1,1,2/#},{y,c-2,c,2/#}]&
用法示例:
%@10
通过@MartinEnder(后缀表示法)节省了一个字节,并通过定义d节省了另外2个字节。
<?$h=3/8*$w=2*$d=2*$r=$_GET[0];$q=$r+sqrt($r**2-($r/2)**2);echo"<svg width=$w height=$w><path d='M$r,$r A$r,$r 0 0 1 $d,$r A$r,$r 0 0 1 $h,$q A$r,$r 0 0 1 $r,$r'/>";
<svg width=512 height=512><path d='M128,128 A128,128 0 0 1 256,128 A128,128 0 0 1 192,238.85125168441 A128,128 0 0 1 128,128'/>
dup(^@^^Z<^@Z<){sin mul exch dup}forall
0 1 2{newpath 369 arc clip}for fill
将输入作为堆栈上的值。^^
并^@
代表文字控制字符。(^@^^Z<^@Z<)
是分别具有代码点0、30、90、60、0、90和60的字符串。然后将其解释为角度(以度为单位),因为显然这就是代码点的用途。
节省了10个字节,因为closepath
不需要(包括clip
和fill
隐含接近路径)。
通过使用repeat
而不是定义函数来保存1个字节。
通过切换到完全不同的方法,节省了10个字节。
通过使用堆栈来节省2个字节。
使用0 1 2{}for
代替节省了1个字节3{}repeat
。
注意:此解决方案不再有效,因为后来对问题进行了编辑,以要求以像素为单位测量r。感谢Martin Ender帮助我在评论中删除了一些字节。
r=Input[];RegionPlot[And@@((Abs[y+I x-#]^2<3r^2)&/@Table[Exp[2n I/3Pi]r,{n,3}]),{x,-1,1},{y,-1,1},Frame->False,BoundaryStyle->None]
输入值必须在0到1之间缩放,此代码才能起作用。请注意,该代码中几乎有四分之一需要“单独”显示形状,因为这不是Mathematica的默认设置。
r Exp[2 I Pi n/3]
可以Exp[2I n/3Pi]r
节省一些空间。而且它一般较短写一个匿名函数,即删除r=Input[];
,替换r
与#
和追加&
。
I.r:L.r,r,r,r:F.i=0TO9S.PI/1.5PLOT177,r*COS(i),r*SIN(i)N.
在http://www.bbcbasic.co.uk/bbcwin/download.html下载口译员
不打高尔夫球
INPUTr :REM input a radius
LINEr,r,r,r :REM draw a line of length 0 from r,r to r,r to establish a cursor history away from the corner of the screen
FORi=0 TO 9 STEP PI/1.5 :REM in steps of 120 degrees (going round and round the three sides of an equilateral triangle)
PLOT177,r*COS(i),r*SIN(i) :REM move relative by r*COS(i),r*SIN(i) and draw a sector with arc between new and last graphics cursor positions,
NEXT :REM with the centre of the arc at the penultimate graphics cursor position.
\input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~ in{1,2,3}{[rotate=~*120]arc(0:60:\r pt)};\bye
TeX是基于矢量的,因此不做像素。半径是浮点数,在到达页面边缘之前最大约为15。它也不是真正为命令行输入而构建的,因此需要以
pdftex "\def\r{2} \input rt.tex"
上面的代码保存在哪里 rt.tex
.tex
; \footline{}
一样好\nopagenumbers
; 使用~
作为变量名代替\i
。为了满足“像素”要求,可以使用\r sp
; 1sp相当于TeX的像素,因为它是TeX可以管理的最佳位置(不过我不知道它是否适用于tikz)。
sp
但我认为pt
是个好主意。您的所有其他想法都起作用(在我的测试中似乎没有)。谢谢
~
保存一个字节。\input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\bye
为我工作。尝试pdftex "\def\r{2000000} \input rt.tex"
-在2sp下,鉴于形状很小,很难通过视觉找到形状。
precision lowp float;
uniform vec2 resolution;float r=100.;void main(){vec2 p=gl_FragCoord.xy-resolution.xy/2.;float h=sqrt(3.)/4.*r;gl_FragColor=vec4(length(p+vec2(r/2.,h))<r&&length(p+vec2(-r/2.,h))<r&&length(p-vec2(0.,h))<r);}
r
变量来设置to t :r filled 0[repeat 3[arc 60 :r fd :r rt 120]]end
使用filled
命令将颜色填充为颜色0(黑色)。执行外部方括号中的代码时,无需绘制任何线条,但是Logo会跟踪乌龟的运动,并在退出方括号后填充形状。
to t :r repeat 3[pd arc 60 :r pu fd :r rt 120]fd 9 fill end
下笔,以乌龟为中心绘制60度弧,上笔,将笔移动到弧的起点,旋转120度。
重复3次,然后在形状内部移动并填充它。
请尝试http://turtleacademy.com/playground/en
呼叫类似cs ht t 100
(清除屏幕,隐藏海龟,t
r = 100。)
9Bo&ZQ*3X^/G_G&:t!J*+8L&!-|G<A&e0YG
这将产生一个名为的文件image.png
。对于input r
,图像的大小为2*r+1
,三角形的宽度是r
所需的。
在MATL在线上尝试一下!在线解释器会自动打开创建的文件并以任意比例显示图像。单击它以获得实际尺寸的版本。
另外,这是在Matlab上运行的脱机编译器的两个示例输出,输入为50
和 100
。代码的最后一部分0YG
已替换为,IYG
以便直接显示图形(具有正确的大小),而不是将其写入文件。
9B % Push 9 in binary: [1 0 0 1] with logical values
o % Convert to double
&ZQ % Roots of polynomial with coefficients [1 0 0 1], as a 3×1 column vector
* % Multiply by implicit input r
3X^/ % Divide by sqrt(3). This gives a 3×1 vector with the circle centers
G_G&: % Push row vector [-r -r+1 ... r-1 r], with size 1×(2*r+1)
t!J* % Duplicate, transpose, multiply by 1j
+ % Add with broadcast. This gives a (2*r+1)×(2*r+1) 2D-array of complex
% numbers, which defines the pixel grid
8L % Push [3 1 2]
&! % Permute dimensions as indicated. This gives a 1×(2*r+1)×(2*r+1) 3D-array
-| % Subtract with broadcast. Absolute value. This gives a 3×(2*r+1)×(2*r+1)
% 3D-array with the distance from each circle center to each grid point
G< % Less than r? Gives a 3×(2*r+1)×(2*r+1) 3D-array containing true or false
A % All: this gives a 1×(2*r+1)×(2*r+1) array containing true for
% columns of the original 3D-array that contained all true values
&e % Squeeze the first singleton dimension to give a (2*r+1)×(2*r+1) 2D-array
0YG % Save as image file with default file name
f=
n=>s.setAttribute('width',n)
<input type=number value=82 oninput=f(this.value)><br>
<svg id=s width=82 viewbox=0,0,82,82><path d=M0,71a82,82,0,0,0,82,0A82,82,0,0,0,41,0A82,82,0,0,0,0,71>
字节数不包括方便用户输入所需大小所需的代码。
n=>s.style.width=n
也会工作。
outputtemplate:="%j-%c.ps";
prologues:=1
beginfig(1);
len:=1cm;
path p[];
p[1]:=len * dir -30 {dir 90} .. len * dir 90;
p[2]:=p[1] rotated 120;
p[3]:=p[1] rotated 240;
fill p[1] -- p[2] -- p[3] -- cycle;
endfig;
end.
可能有可能将其减少一些,我是metapost的新手。
len * dir
和末尾的点吗?
s:*/2#;l:2*r:.:0:`
`0:(,"P1")," "/'$(,l,l),&/{(s'n+x)</:(s r)-s'y+n:r-!l}./:r*%(0 0;4 0;1 3)%4
\\
输入来自stdin
,输出为stderr
(或stdin
取决于解释器)pgm
格式。例如:
说明:
s:*/2# /set s to a squaring function
r:.:0:` /get user input, set to r
l:2* /width/height is 2 times r
r*%(0 0;4 0;1 3)%4 /the coordinates of circle centers
{ }./: /for each coordinate pair (x, y) get a circle
/function to get a circle:
n:r-!l / set n to {r, r-1, ..., -(r-1)}
(s'n+x)</:(s r)-s'y+ / use b^2<r^2-a^2 on all points to get a circle
/ where x and y shift the circle right and down
&/ /get intersections of circles (fold binary and)
(,l,l), /prepend height and width for PGM format
" "/'$ /convert to string, add spaces
(,"P1"), /prepend PGM header
`0: /output to stderr
\\ /exit
module t(r){intersection_for(t=[0,120,240]){rotate(t)translate([r/sqrt(3),0,0])circle(r);}}
我不确定这是怎么做到的,因为在我所知道的任何网格网格格式中,像素并不是一个定义明确的单位。取而代之的是,无论使用t
哪种r
本机单位,模块都会绘制给定半径的reuleaux三角形。
的样本预览输出t(100)
:
r
应该以像素为单位还是仅按比例缩放?