画the(生物危害标志)


66

在明显不同的背景上以任意颜色绘制生物危害符号。具体比例已发布在1974年6月27日的美国政府联邦公报上。

细节

  • 作为输出,都允许写入文件(允许光栅和矢量格式)或在屏幕上显示。

  • 您可以只绘制边框或填充的形状。

  • 如果使用光栅图像,则应将一个(或两个)参数作为输入,以调整输出的分辨率(例如,宽度/高度)。

  • 背景必须至少具有符号边框的大小,但可以更大。

  • 输出unicode符号☣是不够的

  • 下图给出了使用距离的确切比例(该图最初来自此处):

我还尝试制作一个具有相同度量的附加图,希望它更容易阅读:

(灵感来自99%invisible的帖子)


2
漏洞:我们可以将1x1像素的图像放到可变大小的背景中吗?
John Dvorak

我认为不是,如果将分辨率设置得足够大,该符号仍会出现。无论如何,我希望这里的人们有足够的常识来理解我们的意思:)
虚假的

1
如果有时间可以尝试使用PostScript或turtle图形。
Guy Coder

1
@ SriotchilismO'Zaic长度由两个圆确定:它们每个都有给定的中心和半径,因此长度由间隙的大小确定。
flawr

1
在原始图中为“ E”(十字代表圆心),在下面的I中添加(半径与对称轴交界)。11
flawr

Answers:


96

T-SQL,442 441 426 355 349 344字节

DECLARE @ VARCHAR(MAX)=REPLACE(REPLACE(REPLACE('DECLARE @a5MULTIPOINT((0 31),(19 -2),(-19 -2))'',@b5MULTIPOINT((0 39),(26 -6),(-26 -6))'',@5POINT(0 9)'',@d5LINESTRING(0 9,0 99,90 -43,0 9,-90 -43)''SELECT @a830%b821)%86)%d81)%d84%819))).STUnion(@827%820)).STIntersection(@b819)))'
,8,'.STBuffer('),5,' GEOMETRY='''),'%',').STDifference(@')EXEC(@)

使用REPLACE()长关键字并作为动态SQL执行可节省70多个字节。请参阅下面的屏幕快照中的替换后代码。

我将示例图中的坐标值加倍,并向上移动了9个单位,以减少显示的小数位数。

这是在SQL 2017中使用SQL 2008中引入的地理空间功能完成的。许多有用的内置几何函数,包括STBuffer,为我提供了一种简单的方法来定义一个点周围不同大小的圆。

输出的视觉效果,带有注释代码:

使用地理空间功能的T-SQL中的生物危害符号

有关更多T-SQL绘图的信息,请参见“ 复活节兔子”

有关此技术在SQL中的更多实际应用,请阅读本文观看此视频。SE甚至还有一个相关站点gis.stackexchange.com

编辑:

  1. 通过将坐标从104更改为99保存了1个字节。
  2. 通过取所保存的15个字节STDifference的一个STUnion对象,单独的每一个代替。
  3. 通过REPLACE()在重复的关键字上使用,然后作为动态SQL执行,节省了71个字节。恢复编辑2,保留更多替换STDifference
  4. 通过将中心上移9个单位节省了4个字节,这将几个坐标更改为一位(负)数字。这也释放了数字5以用作替换字符,而不是'#',在引号上又节省了2个字节。
  5. 通过移动保存5个字节)STDifference替换字符串; 谢谢@尼古拉斯!

56
为什么...这存在吗?
亚历山大

26
@Alexander用于包含或使用地理数据的数据库,例如人口普查或科学研究,甚至仅是按地理区域划分的客户销售额。或仅用于绘制兔子和生物危害符号。
BradC

24
SQL对于它所针对的一件事已经够糟糕的了,在他们看来正确的人想超越这一点。想象一下用SQL编写的GUI。我需要注释,方面和单元测试框架。我们需要去窥探者
亚历山大

24
@Alexander如您所愿:TSQLT
FreeMan

15
@FreeMan哦,是为了...。
亚历山大

32

Tex + Tikz,232字节

切换到tex可节省43个字节。感谢Phelype Oleinik

多亏了Skillmon节省了一些字节

\input tikz \tikz[x=1,y=1,white]{\def\f{\foreach\1in{90:,210:,330:}}\def\u{\draw[line width=}\def~{circle(}\f\fill[red](\122)~30);\f{\u2](0,)--(\111);\u8](\130)--(\160);\fill(\130)~21);}\fill~6);\u7,red]~23.5);\f\u2](\130)~20);}\bye

有换行符,无\def

\input tikz
\tikz[x=1,y=1,white]{
\foreach\1in{90,210,330}\fill[red](\1:22)circle(30);
\foreach\1in{90,210,330}{
\draw[line width=2](0,0)--(\1:11);
\fill(\1:30)circle(21);
\draw[line width=8](\1:30)--(\1:60);
}
\fill(0,0)circle(6);
\draw[line width=7,red](0,0)circle(23.5);
\foreach\1in{90,210,330}\draw[line width=2](\1:30)circle(20);
}
\bye

说明

这有点过时,当我能弄清楚如何使图像不令人讨厌时,我会修复它

在这里,我将解释未压缩的答案如何解决该问题。我可能会在某个时候解释压缩的工作原理。首先,我们绘制一个大的黑色圆圈:

\foreach\x in{90,210,330}\fill(\x:21)circle(30);

在此处输入图片说明

然后我们画一些白线:

\foreach\x in{90,210,330}\draw[white,line width=2cm](0,0)--(\x:11);

在此处输入图片说明

然后我们画出白色圆圈:

\foreach\x in{90,210,330}\fill[white](\x:30)circle(21);

在此处输入图片说明

然后,我们添加一个中心白色圆圈:

\fill[white](0,0)circle(6);

在此处输入图片说明

然后我们添加一个黑色的环面:

\draw[line width=7cm](0,0)circle(25.5);

在此处输入图片说明

然后我们去除黑环的一部分

\foreach\x in{90,210,330}\draw[white,line width=2cm](\x:30)circle(20);

在此处输入图片说明


9
您还没有削弱六个外在点。每对之间应有4个空白单元。
圣河

1
@LevelRiverSt六个外部点现在距离其伙伴4个单位。
小麦巫师

2
那些“爪尖”太尖了,它们应该由与来自中心圆的线段平行的直线段组成。另外20.88看起来也很可疑。
flawr

您可以使用\1代替来保存另一个字节,\x然后再使用\def\f{\foreach\1in{90,210,330}}
Skillmon

1
@flawr好...他们现在实际上比5000x5000小很多...现在只有90x90 ...几乎无法分辨出细节:D
尼尔森

15

C,8010字节

回溯过去,在SVG或EMF之前,您必须处理栅格,如果要立即加载某些内容,例如在操作系统准备就绪之前(例如Windows启动屏幕),则必须使用RLE或行程-编码。该怪兽使用RLE作为数据输出PBM文件。像往常一样构建并像这样运行./biohazard > biohazard.pbm

如果要包含生成所需的所有框架,例如HTML中的SVG引擎,Java库等,则这可能是最小的自包含解决方案,因为puts它是唯一的外部函数,并且通常是最小的函数之一。stdio.h职能。

关于这个细节:

如果使用光栅图像,则应将一个(或两个)参数作为输入,以调整输出的分辨率(例如,宽度/高度)。

我将“应该”解释为与“必须”不同,例如在RFC 2119中,因此我不包括缩放,因为对于此代码,仅进行原始倍数是可行的,例如./biohazard 2并且会引入atoiprintf以及其他复杂性会降低提交内容的重点。

int o,i,x[]=
{4946,3,33,2,389,8,33,8,378,13,33,13,369,17,33,16,363,20,33,20,356,19,41,19,350,18,49,18,344,18,55,18,339,17,61,17,334,
17,66,17,330,17,71,17,325,17,75,17,321,17,79,17,317,17,83,17,313,17,87,16,311,16,90,17,307,17,93,17,303,17,97,17,300,
17,99,17,297,17,102,18,293,18,105,17,291,18,107,18,288,17,110,18,285,18,113,17,283,18,115,18,280,18,117,18,277,19,119,
18,275,19,121,19,272,19,123,19,270,19,125,19,268,19,127,19,266,19,129,19,263,20,131,19,261,20,133,19,259,20,134,20,257,
20,136,20,255,21,137,20,253,21,139,20,251,21,141,20,249,21,142,21,248,21,143,21,246,21,145,21,244,21,146,22,242,22,147,
22,240,22,149,22,238,22,150,22,238,22,151,22,236,22,152,23,234,23,153,23,232,23,155,22,232,23,155,23,230,23,157,23,228,
24,157,24,226,24,159,23,226,24,159,24,224,24,160,25,222,25,161,24,222,24,162,25,220,25,163,25,219,25,163,25,218,25,164,
26,216,26,165,25,216,26,165,26,214,26,166,26,214,26,167,26,212,27,167,26,212,26,168,27,210,27,169,27,209,27,169,27,208,
27,170,28,207,27,170,28,206,28,171,27,206,28,171,28,204,29,171,28,204,28,172,29,202,29,172,29,202,29,173,29,201,29,173,
29,200,30,173,29,200,30,173,30,198,31,173,30,198,30,174,31,197,30,174,31,196,31,174,31,196,31,175,31,195,31,175,31,194,
32,175,31,194,32,175,32,193,32,175,32,193,32,175,32,192,33,175,32,192,33,175,33,191,33,175,33,190,34,175,33,190,34,175,
33,190,34,175,34,189,34,174,35,189,34,174,35,188,35,174,35,188,35,174,36,187,36,173,36,187,36,173,36,187,36,173,36,186,
37,74,25,74,36,186,37,67,39,67,36,186,37,62,49,61,38,185,37,58,57,57,38,185,38,53,64,54,38,185,38,50,71,50,38,185,38,
47,76,48,38,185,38,45,81,44,39,184,40,41,87,41,39,184,40,39,91,39,39,184,40,37,95,37,39,184,40,35,99,34,41,183,41,32,
103,32,41,183,41,30,107,30,41,183,41,28,111,27,42,183,42,25,115,25,42,183,42,24,117,24,42,183,42,22,121,21,43,183,43,
19,124,20,43,183,43,18,127,18,43,183,43,17,129,16,44,183,44,14,133,14,44,183,44,13,135,12,45,183,45,11,137,11,45,183,
45,10,139,9,46,183,46,9,138,10,46,183,46,10,137,9,47,183,47,9,136,10,47,183,47,10,135,9,48,183,48,10,56,20,57,10,48,
183,49,9,50,33,49,10,48,184,49,10,45,41,45,10,48,184,50,10,40,49,40,10,49,184,50,10,37,55,36,10,50,185,50,10,33,60,34,
10,50,185,51,10,30,65,30,10,51,185,51,11,27,69,27,10,52,185,52,10,25,73,24,11,52,185,53,10,22,77,21,11,53,185,53,11,19,
81,19,10,53,186,54,11,16,85,16,10,54,185,56,11,13,88,14,11,56,181,59,11,11,91,11,11,59,176,63,11,8,94,9,11,63,171,66,
11,6,97,6,11,66,167,68,12,4,99,4,11,69,163,71,12,1,102,2,11,72,159,74,126,75,155,77,124,78,151,80,123,79,149,82,120,83,
145,85,118,86,141,88,116,88,139,90,114,91,135,93,112,93,133,96,109,96,130,98,107,98,127,101,104,102,124,104,101,104,
122,106,99,106,119,110,95,109,117,112,93,112,114,115,89,115,112,118,85,118,110,120,82,121,107,124,78,124,105,127,74,
127,103,131,69,130,101,134,65,133,99,137,60,137,97,141,54,141,95,146,47,145,93,151,39,150,91,157,29,156,89,166,13,165,
88,168,9,168,86,169,9,169,84,170,9,170,82,171,9,171,80,172,9,171,79,173,9,172,78,173,9,173,76,174,9,174,74,175,9,175,
72,176,9,175,72,176,9,176,70,177,9,177,68,64,20,93,10,94,20,63,68,57,34,83,17,83,33,58,66,54,42,77,21,76,43,54,64,51,
50,71,25,71,49,51,64,48,57,65,29,65,56,49,62,46,63,61,31,61,62,47,60,45,67,58,33,58,67,44,60,43,71,55,35,54,72,43,58,
41,36,8,32,52,37,51,33,8,35,41,58,40,36,17,26,49,39,48,27,16,37,40,56,39,38,22,23,46,41,45,24,21,39,39,55,37,40,26,21,
43,42,44,21,26,40,37,54,36,42,29,20,41,43,41,20,29,42,36,53,35,43,29,21,39,44,39,22,29,43,35,52,34,45,29,23,37,45,37,
23,29,45,34,51,33,46,29,24,35,46,35,25,29,46,33,50,32,48,29,26,33,47,33,26,29,47,33,49,31,49,29,27,32,47,32,27,29,49,
31,48,31,49,30,28,30,48,30,29,29,50,31,47,29,51,30,30,28,49,28,30,29,51,30,46,29,52,29,32,27,49,27,31,29,53,28,46,28,
53,29,33,26,49,26,32,29,54,28,44,28,54,29,34,25,49,25,33,29,55,27,44,27,55,29,35,24,49,23,35,29,56,27,43,26,56,29,36,
22,50,22,36,29,57,26,42,26,57,29,37,21,50,21,37,29,58,26,41,25,58,29,38,21,49,20,38,29,59,25,40,25,59,29,39,20,49,19,
39,29,60,24,40,24,60,29,40,19,49,19,39,29,61,24,39,23,61,29,41,18,49,18,40,29,62,23,38,23,62,30,41,17,49,17,41,29,63,
22,38,22,63,30,42,16,48,17,42,29,63,23,37,21,65,29,43,16,47,16,43,29,64,22,36,22,65,29,43,16,47,15,44,29,65,21,36,21,
66,29,44,13,50,14,44,29,66,21,35,20,67,29,45,11,53,11,45,29,67,20,34,20,68,29,46,8,57,8,46,29,67,20,34,20,68,29,46,6,
61,5,46,30,68,19,34,19,69,29,47,4,63,4,46,30,69,19,33,18,70,30,47,1,67,1,47,29,70,19,32,19,70,30,163,29,71,18,32,18,71,
30,61,2,37,2,61,29,72,18,31,17,73,29,59,5,35,5,58,30,72,18,31,17,73,29,58,7,33,7,57,30,73,17,30,17,74,30,55,10,31,10,
55,30,73,17,30,17,74,30,53,13,28,14,53,30,74,16,30,16,75,30,51,17,25,16,52,29,75,17,29,16,76,29,50,20,21,19,50,30,76,
16,29,15,77,30,50,21,16,22,50,30,77,15,29,15,77,30,50,26,7,25,51,30,77,15,28,15,78,30,51,57,50,30,78,15,28,15,78,31,50,
56,51,30,79,15,27,14,80,30,51,55,51,30,79,15,27,14,80,30,51,55,50,31,80,14,27,13,81,31,51,53,51,30,81,14,27,13,82,30,
51,53,51,30,82,13,27,13,82,31,50,52,51,31,82,13,26,13,83,31,51,51,51,31,82,13,26,13,83,31,51,51,50,31,84,12,26,13,84,
31,50,50,51,31,84,12,26,12,85,31,51,49,50,32,84,13,25,12,85,32,50,49,50,31,86,12,25,12,86,31,50,48,50,32,86,12,25,11,
87,32,50,47,50,32,86,12,25,11,87,32,50,47,49,32,88,11,25,11,88,32,49,47,49,32,88,11,25,11,88,32,49,46,49,32,89,11,25,
10,90,32,49,45,49,32,89,11,25,10,90,33,48,45,48,33,90,10,25,10,91,32,48,45,47,33,91,10,25,10,91,33,47,44,48,33,91,10,
25,10,91,34,46,44,47,33,92,10,25,9,93,33,47,43,46,34,92,10,25,9,93,34,46,43,46,33,93,10,25,9,94,34,45,43,45,34,94,9,25,
9,94,35,44,43,44,34,95,9,25,9,95,34,44,42,44,35,95,9,25,9,95,35,43,42,44,34,96,9,25,9,96,35,42,42,43,35,96,9,25,8,97,
36,42,41,42,35,97,9,25,8,98,36,41,41,41,36,97,9,25,8,99,36,40,41,40,36,98,8,26,8,99,37,39,41,39,36,99,8,26,8,100,37,38,
41,38,37,99,8,27,7,100,38,37,41,37,37,101,7,27,7,101,38,36,41,36,38,101,7,27,7,102,38,35,41,35,38,102,7,27,7,102,39,34,
41,34,38,103,7,27,7,103,39,33,41,33,39,103,7,27,7,104,39,32,41,32,39,104,7,27,7,104,41,30,41,30,40,104,7,29,6,105,41,
29,41,29,40,105,7,29,6,106,41,28,41,28,41,105,7,29,6,107,42,26,41,26,42,106,7,29,6,108,42,25,41,25,42,107,7,29,7,107,
44,22,42,23,43,108,6,30,7,108,44,21,42,21,45,108,6,31,6,109,45,19,42,20,45,109,6,31,6,110,46,17,43,17,46,110,6,31,6,
111,47,15,43,15,47,111,6,31,6,112,48,13,43,13,48,112,5,33,5,113,49,11,43,10,50,112,6,33,5,114,50,9,43,9,50,113,6,33,6,
113,50,8,44,9,49,114,6,33,6,114,48,9,45,8,48,115,5,35,5,115,47,9,45,8,47,116,5,35,5,117,45,8,46,9,45,116,6,35,6,117,44,
8,46,9,44,117,5,37,5,118,42,9,47,8,43,118,5,37,5,119,41,9,47,9,41,119,5,37,5,120,40,8,48,9,40,119,5,39,5,120,39,8,48,9,
38,121,5,39,5,121,37,9,49,8,37,122,5,39,5,123,35,9,49,9,35,123,4,41,5,123,34,8,50,9,34,123,5,41,5,124,32,9,51,9,31,125,
5,42,3,127,30,9,51,9,30,127,3,43,1,130,28,9,52,9,29,130,1,176,26,9,53,9,26,310,24,9,54,9,24,314,22,9,55,9,22,317,20,9,
55,9,20,320,18,9,56,10,17,324,15,10,57,9,16,327,13,9,58,10,13,331,10,10,59,9,11,335,8,9,60,10,8,339,5,10,61,9,6,344,2,
9,62,10,2,358,63,368,65,367,65,366,67,365,67,364,69,362,70,362,71,360,73,358,75,356,76,356,77,354,79,352,81,350,82,349,
84,215,2,130,86,130,3,79,5,129,87,128,6,77,6,127,89,126,6,79,6,125,91,124,7,80,6,123,93,122,7,82,6,121,95,120,7,84,6,
119,97,118,7,86,7,115,100,116,7,87,8,113,102,114,7,89,8,111,105,111,7,91,8,109,107,109,7,93,8,107,109,106,9,94,9,103,
112,104,9,96,9,101,115,101,9,98,10,97,118,98,10,100,10,95,121,95,10,102,11,91,124,92,11,104,11,89,127,88,11,107,12,85,
131,85,11,110,12,81,135,81,12,112,13,77,138,78,13,114,14,73,143,73,14,116,15,69,72,2,73,69,15,118,17,63,74,5,73,64,16,
122,17,59,75,7,75,58,18,124,19,53,77,9,77,53,19,126,22,45,79,13,78,46,21,130,24,37,82,15,81,38,24,132,28,27,85,18,86,
27,28,135,37,5,95,21,95,5,37,138,134,24,135,141,131,27,131,144,128,31,127,148,124,34,125,151,121,37,121,155,117,41,117,
159,113,45,113,163,109,49,109,167,105,53,105,171,101,57,101,175,96,62,96,181,91,67,91,185,86,72,86,191,80,78,81,196,74,
84,74,204,67,91,67,211,59,99,59,219,51,107,51,228,40,119,39,242,25,133,25,5311,0};
main(){for(puts("P1\n432 408");x[i];++i,o=!o)while(x[i]--)puts(o?"0":"1");}

1
很好地解释您如何生成代码。
心教堂

代码在每个字符后输出换行符;我认为您需要putchar()或类似。
marcelm

@marcelm-PBM P1格式可以!

1
我很确定这确实意味着必须解决这个问题,但这可能值得考虑OP。
小麦巫师

1
我认为使用不一定意味着存在区别。这确实是您应该(或可能必须)问问OP的一个问题。
麦向导

15

的TeX +钛ķ Z,234个 230 226字节

最初比Sriotchilism O'Zaic的答案长5个字节,但这应该是正确的。它与他的答案类似,但是到处都节省了几个字节,它还需要一个字节\draw[line width=8](在下面的代码中,由完成\28](~30)to(~55);,仅为此增加了17个字节),以便正确获得符号提示,因此5整体代码长度增加了字节。

感谢Sriotchilism O'Zaic,我重新阅读了一些问题,并意识到我可以将颜色更改为红色,从而再次节省了一些字节:

\input tikz\let~\def~\1{circle(}~\2{\draw[line width=}~~{\foreach~in{90:,210:,330:}}\tikz[x=1,y=1,white]{~\fill[red](~22)\130);~{\fill(~30)\121);\28](~30)to(~55);\22](~0)to(~10);}\fill\16);\27,red]\123.5);~\22](~30)\120);}\bye

TeX-g + Ti k Z,195字节

就算有人在乎,以下代码也使用了我正在研究的基于TeX的代码高尔夫方言(不要认为代码稳定)。字节数包括EOL字符和EOF字符,因为它们是在语义上使用的(EOL分隔循环的参数)。到现在为止,该方言还很小,并且仅具有定义的简写形式和for-loop语法,但是它不是专门为此答案编写的,因此它不应违反代码打法的规则。-g.tex-package / file的存储库:https : //github.com/Skillmon/TeX-g

\input-g <tikz>~"{\:~{90:,210:,330:}}~'{circle(}~_{\draw[line width=}!f\fill\tikz[x=1,y=1,white]{"f[red](~22)'30);
"f(~30)'21);_8](~30)to(~55);_2](~0)to(~10);
f'6);_7,red]'23.5);"_2](~30)'20);
}

这两个代码段的输出看起来相同:

在此处输入图片说明

太懒了,无法更新图像,只需想象它是红色的


我的答案现在是正确的,比您的短2个字节。我确定有人可能将我的一些答案与您的一些答案结合在一起,使答案更短一些,但我不太理解您的答案。
小麦巫师

@ SriotchilismO'Zaic如果我将颜色更改为红色(过度读取了颜色可以是任意的规则),则将其更改为230字节。
Skillmon

@ SriotchilismO'Zaic,显然,通过查看我的话,您在答案中节省了不止一个字节(只是说了一点)。
Skillmon

好的,我查看了您的答案,但不知道它在做什么,因此我认为我真的不能从您的答案中受益匪浅。但是我还是更改了消息以删除确切的数字,因为也许我从您的答案中捡到了一些东西而没有意识到。
小麦巫师

2
@ SriotchilismO'Zaic很好。毕竟,我的代码受您的影响,我目前正在尝试编写代码高尔夫球包,以将TeX转换为某种代码高尔夫球语言。当我最终发布它时,我的答案将会更短:)(这不是专门针对此问题而设计的语言,因此它不会违反规则)
Skillmon

12

GLSL,700个 629 564 545 499字节

#define v vec2
#define j(x,r)length(x-g)<r
#define k(x,r,q)j(x,q)!=j(x,r)
#define l(b)length(g-b)<1.&&length(g-dot(g,b)*b)<(length(g)<S?A*S:A/S)
float C=.86,S=.5,F=.3,E=.22,A=.02,G=.21;void mainImage(out vec4 o,in v p){v r=iResolution.xy;v g=(p/S-r)/r.y;o.g=(k(v(0,F),G,G-A)||k(v(F*C,-F*S),G,G-A)||k(v(-F*C,-F*S),G,G-A))?o.g=0.:k(v(0),F,G)?C:l(v(0,1))||l(v(C,-S))||l(v(-C,-S))||j(v(0),.06)||j(v(0,F),G)||j(v(F*C,-F*S),G)||j(v(-F*C,-F*S),G)?0.:j(v(0,E),F)||j(v(E*C,-E*S),F)||j(v(-E*C,-E*S),F)?C:0.;}

我在玩Shadertoy,所以尝试了GLSL着色语言。该代码只是通过测试每个片段来光栅化圆和线,并为其分配一个值或零。通过大量使用宏,将大小从> 1000字节减少了。

Shadertoy程序

在此处输入图片说明


1
欢迎光临本站!干净利落的第一答案!
小麦巫师

我不知道的语言,但可以在&&||被golfed到&|在部分或全部零件?
凯文·克鲁伊森

@KevinCruijssen是C的子集,因此它们将是按位运算。对我来说,编译器会抱怨型,虽然
Roninkoi

1
@Roninkoi我确实看到了它是基于C.在C,可以使用|/ &,而不是||/ &&的布尔变量,不是吗?很久没用C做任何事情了,所以不确定。我知道它在大多数情况下都可以在Java / C#.NET中使用。但是我现在才注意到您已经添加了Shadertoy链接,而且您似乎已经说过了,它似乎在那里不起作用。呃,好吧。不错,首先回答!欢迎来到中国总商会。
凯文·克鲁伊森

我在发布的代码上剪切了-30个字节,但标头说了566个字节,发布的代码是628?
PrincePolka

12

SVG(HTML5),434个 410 321字节

<svg><circle cx=60 cy=60 r=23.5 stroke-width=7 fill=#fff stroke=#000 /><use href=#g transform=translate(120,0)scale(-1,1) /><g id=g><use href=#p transform=rotate(120,60,60) /><use href=#p transform=rotate(240,60,60) /><path id=p stroke=#fff stroke-width=2 d=M55,60A5,5,0,0,1,60,55V50A20,20,0,0,1,58,10V7A31,31,0,0,0,29,43

现在基于@LevelRiverSt的SVG。


1
我相信省略<defs>是安全的。这对我适用于Firefox,Chrome和Edge。
Arnauld

@Arnauld谢谢,这意味着我也可以摆脱第一个<use>
尼尔

12

处理中,371,368字节

translate(width/2,width/2);scale(width/99);int i=0,b=204;float t=TAU/3;noStroke();for(;i<3;i++){fill(0);ellipse(0,-22,60,60);rotate(t);}for(;i<6;i++){fill(b);rect(-4,-60,8,16);ellipse(0,-30,42,42);rotate(t);}ellipse(0,0,12,12);stroke(0);strokeWeight(7);noFill();ellipse(0,0,47,47);for(;i<9;i++){strokeWeight(2);stroke(b);ellipse(0,-30,40,40);line(0,0,0,-9);rotate(t);}

对于此挑战,我不确定处理是否应计为栅格化。如果算作栅格化对象,则对于给定的窗口大小,必须使用translatescale来使符号清晰可见并显示在屏幕上。但是,由于所有绘图命令都是矢量化的,因此可以在任何给定的比例下使用;因此,如果我们假设相对原点处的绘图大约200单位宽,则可以删除前43个字节。

假定背景色为204, 204, 204,这是处理中的默认背景色。它还假定一个rectModeof CORNER和一个ellipseModeof CENTER(默认值)

使用initial size(640, 640),生成的草图如下所示:

在此处输入图片说明

通过将标度加倍,我节省了3个字节,因为.5s被消除了(尽管几个数字确实从1位流到2位)。

构造类似于TeX解决方案,先在顶部绘制黑色,然后绘制灰色以“擦除”形状之间的间隙。

说明:

translate(width/2,width/2); // Move to the middle of the canvas
scale(width/99);            // Scale up to fill the canvas

int i=0,b=204;              // Initialize i, and `b` to the background color
float t=TAU/3;              // Save a rotation of one third, in radians

noStroke();
for(;i<3;i++){ // Draw the three big black circles
  fill(0);
  ellipse(0,-22,60,60);
  rotate(t);
}
for(;i<6;i++){
  fill(b);
  rect(-4,-60,8,16);     // "Blunt" the corners on the sharp outer rings
  ellipse(0,-30,42,42); // Cut out the middle of the big circles
  rotate(t);
}
ellipse(0,0,12,12); // Cut out the small circle in the middle
stroke(0);
strokeWeight(7);
noFill();
ellipse(0,0,47,47); // Draw the thick band that goes through all three big circles
for(;i<9;i++){
  strokeWeight(2);
  stroke(b);
  ellipse(0,-30,40,40); // Cut the "gap" between the three big rings
                        //and the band passing through them
  line(0,0,0,-16);      // Cut the lines coming out of the small middle circle
  rotate(t);
}

看起来不错:)我想,如果将所有度量加倍,就可以避免.5
flawr

是的,但是那还会将一些个位数更改为两位数,因此我不确定它是如何平衡的。如果我算对的话,那将节省2个字节。我也正在考虑使用a scale来仅对部分代码进行更改,但不确定将其放置在哪里
Curtis Fenner

哦,您是对的,我没有考虑过。
flawr

将测量值加倍以除去小数位,即使我的回答从一位到两位数也减少了将近10个字节。还是值得一试。
BradC

1
通过将绘制比例加倍,我节省了3个字节。@IsmaelMiguel
柯蒂斯·芬纳

9

GLSL, 319 310字节

#define F float
#define H(y)sqrt(x*x+(y)*(y))
void mainImage(out vec4 D,in vec2 u){vec2 U=u*.003-.5;F x=abs(U.x),y=U.y;if(y<.577*x){F t=.5*x+.866*y;y=.866*x-.5*y;x=abs(t);}F c=F(H(y-.11)<.15);F R=H(y);F S=H(y-.15);if(S<.105)c=0.;if(R<.03)c=0.;if(x<(R<.1?.005:.02))c=0.;if(R>.10&&R<.135&&S<.095)c=1.;D=vec4(c);}

这可以在Shadertoy渲染

样品

您可以使用图像中的对称性绘制少量单独的形状。

这是一个有点夸张的版本:

#define F float
#define H(y) sqrt(x*x+(y)*(y))

void mainImage(out vec4 D,in vec2 u)
{
    // normalized UV
    vec2 U = u*.003 - .5;

    // fold the 6 identical sections to the same UV coordinates
    F x = abs(U.x), y = U.y;
    if (y < .577*x)
    {
        F t = .5*x + .866*y;
        y = .866*x - .5*y;
        x = abs(t);
    }

    // circles and lines
    F c = F(H(y-.11) < .15);
    F R = H(y);
    F S = H(y-.15);
    if (S < .105) c = 0.;
    if (R < .03) c = 0.;
    if (x < (R < .1 ? .005 : .02)) c = 0.;
    if (R > .10 && R < .135 && S < .095) c = 1.;

    // output
    D = vec4(c);
}

(感谢@Kevin Cruijssen删除了一些不必要的空格)


1
您可以删除一些空格。您定义的一个:H(y) sqrtH(y)sqrt; if语句中的所有空格:if (if(;以及您最近一次关于AND的if陈述中的陈述:if (R>.10 && R<.135 && S<.095)c=1.;if(R>.10&&R<.135&&S<.095)c=1.;
凯文·克鲁伊森

8

HTML / JS, 448个435 433  387字节

使用@Neil 的SVG 最小化版本节省了许多
字节由于@Shaggy而节省了2个字节

Wikimedia Commons 上此SVG文件的压缩版本。

<body onload="_=`<svg~12y~24y><path id=p d=m28.8117,27.046a3,3}0qb3117q4.004v-1w539|1wq20.7959v-w583a1jxb7975x7.3228xj,8.6032x9.7443l-.4835q.2792|-18.7598q9.0989zm3.4148q8.871a10x0}0q1b453,c9w,9w{-kx3wx3w}1x6.8042,0x0x0{k>~><use href=#p transform=rotate(},cc|a10wx0w}c{}1qb1756,yc26,26) /x,1w.5q,-kb7417j5x5}1c0,b2.`;for(i of`bcjkqwxy{|}~`)with(_.split(i))_=b.innerHTML=join(pop())"id=b>

在线尝试!(仅输出解压缩的字符串)

演示片段


这个作品,对CodePen在Chrome的Android,为392
长毛

1
@Arnauld我已经把答案反过来了,尽管它花了5个字节(尽管我发现了另一个不必要的字节,所以总的来说我的分数只增加了4个)。
尼尔

@Neil进行了相应更新。;)
Arnauld

事实证明,@ LevelRiverSt的SVG小得多!
尼尔

7

Haskell中530个 491 436 435 430 420字节

f=fromIntegral
c(a,b)r(x,y)=(x-a)^2+(y-b)^2<r^2
(m#w)t(x,y)|c<-cos(-t),s<-sin(-t)=x*c-y*s>m&&abs(x*s+y*c)<w/2
u a p=any($p)a
i a p=all($p)a
v=(*(pi/6))<$>[9,5,1]
o=c(0,0)
h?r=[c(h*cos a,h*sin a)r|a<-v]
(h%y)x|u[i[u$11?15,(not.)$u$o 3:map(0#1)v++map(9#4)v++15?10.5],i[o 13.5,not.(o 10),u$15?9.5]](60*f x/h-30,60*f y/h-30)="0 "|0<1="1 "
g h|s<-show h,n<-[0..h-1]=writeFile"a.pbm"$unlines$"P1":(s++' ':s):[n>>=(f h%)y|y<-n]

输出PBM文件。

这很有趣!

生物危害

(我必须将其转换为PNG才能上传到imgur)

基本上,我们创建自己的矢量图形功能,通过检测像素是否为形状的一部分,逐个像素地渲染到图像上。形状被构造为一束与基本设置操作(并集,交集和非集)结合在一起的圆和线(从原点放射)。圆由其中心和半径组成,并且直线依次具有最小半径,宽度和角度。检测圆中的隶属关系很容易:我只减去中心坐标,然后将幅度与半径进行比较。这条线稍微复杂一点:我将点旋转角度的相反方向以使其带点(使旋转无效),然后仅检查x和y坐标是否在预期范围内。最小半径是为了确保大圆的远端处的较大间隙不会覆盖中心附近的小间隙。之后,只需进行布尔逻辑设置数学即可。

编辑:非常感谢@flawr腾出39个字节!

EDIT2:非常感谢@Christian Sievers删除了55个字节!使它们成为功能的好主意

EDIT3:再次感谢@Christian Sievers削减了另一个字节!

EDIT4:由于@ H.PWiz和@Angs占用了7个字节!

EDIT5:刚发现一个错误!我渲染的线条比原来的要粗两倍!我花了2个字节来修复它(必须将宽度除以2;可以调整常数值,但是将1更改为0.5也将花费2)。

EDIT6:感谢@Angs删除了另外10个字节!


哇,太酷了。很少有人在这里在代码高尔夫球中定义自己的类型:)两个问题:是否需要具有负角[-90,-210,-330]?并且可以将更<=改为<吗?
瑕疵

1
因此,我尝试了一下,并设法剃掉了一些字节
瑕疵的

1
哦,如果您不知道,我们还会进行haskell 聊天,以及在haskell打高尔夫球的一些技巧
flawr

1
另一个小调整
瑕疵


6

红宝石,278字节

puts"<svg viewBox='-60-60 120 120'><circle cx='0'cy='0'r='23.5'stroke-width='7'fill='white'stroke='red'/>",(-3..5).map{|i|"<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(#{i/3},-1)rotate(#{i*120})'/>"}

在线尝试!

在下面生成SVG代码,其符号为OP中比例的200%。

它由后面的圆和前景的叉组成。该叉被缩放-1,0,1X轴线并通过120度的倍数旋转。X标度为零的情况下不产生任何输出,而-1和则为+1。提供每对插脚的两侧。

使用strokestroke-width属性,在插脚周围使用2单位宽的白色边框切出后圆圈。为了使内部形状符合OP,将坐标移动1个单位(边框的宽度的一半)。请注意,路径故意未闭合,以抑制绘制边框的最后一行。这样可以确保每对插脚的两半连接在一起。

出于打高尔夫球的原因,绘制了90度的内圆,而不是预期的60度。这意味着每对插脚的底脚之间有一些重叠,但这并不影响输出形状的外观。

<svg viewBox='-60-60 120 120'><circle cx='0'cy='0'r='23.5'stroke-width='7'fill='white'stroke='red'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(-1,-1)rotate(-360)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(-1,-1)rotate(-240)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(-1,-1)rotate(-120)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(0,-1)rotate(0)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(0,-1)rotate(120)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(0,-1)rotate(240)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(1,-1)rotate(360)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(1,-1)rotate(480)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(1,-1)rotate(600)'/>


6

的PostScript367个 359 328 271字节

代码(压缩版):

5 5 scale 36 24 translate <</c{0 360 arc closepath}/r{120 rotate}/R{repeat}/L{setlinewidth}/g{setgray}/F{fill}>>begin 3{0 11 15 c F r}R 1 g 3{0 15 10.5 c F r}R 0 0 3 c F 3{[-.5 2 1 3 -2 25 4 3]rectfill r}R 0 g 4 L 0 0 11.5 c stroke 1 g 1 L 3{0 15 10 c stroke r}R showpage

代码(未压缩版本):

5 5 scale                  % over-all scale
36 24 translate            % over-all shift

% define some short-named procedures for later use
<<
  /c { 0 360 arc closepath }  % append circle (x, y, radius are taken from stack)
  /r { 120 rotate }           % rotate by 120°
  /R { repeat }
  /L { setlinewidth }
  /g { setgray }
  /F { fill }
>> begin

3 {
    0 11 15 c F       % black circle
    r                 % rotate by 120°
} R
1 g                   % set white color
3 {
    0 15 10.5 c F     % white circle
    r                 % rotate by 120°
} R
0 0 3 c F             % small white circle
3 {
    [ -.5 2 1 3       % white gap near center
      -2 25 4 3       % white gap on edge
    ] rectfill
    r                 % rotate by 120°
} R
0 g                   % set black color
4 L                   % set linewidth 4
0 0 11.5 c stroke     % black ring
1 g                   % set white color
1 L                   % set linewidth 1
3 {
    0 15 10 c stroke  % white ring
    r                 % rotate by 120°
} R
showpage

结果(作为动画查看其绘制方式):

结果


很棒的动画。
dana

2

Python 3中与pygame的,327个314 287 278字节

(应用了各种讨厌的技巧以节省13个字节;最显着的是不再存储颜色,而是使用进行动态计算-(r>25)
(重构为函数,丢失sysmath为了支持坐标常数而乱砍;细微调整;保存了27个字节)
(重写了坐标用于获取(co)sine的复杂数学技巧的常量,节省9个字节)

该函数采用单个整数参数,该整数参数表示结果图像的宽度/高度的一半。例如,f(500)将创建一个1000x1000像素的窗口,并在其中绘制生物危害符号。

from pygame import*;D=display
def f(S):
 u=D.set_mode([S*2]*2);b=S>>6
 for p,r,w in(22,30,0),(30,20,0),(0,27,7),(30,21,2),(0,6,0),(51,4,0):
  for l in 0,4/3,8/3:Z=1j**l*p*b;q=S+int(Z.imag),S-int(Z.real);draw.circle(u,-(r>25),q,r*b,w*b);r-20or draw.line(u,0,(S,S),q,b*2);D.flip()

未简化的版本:

import pygame
import math
import sys

size = int(sys.argv[1])
basic = size // 55

screen = pygame.display.set_mode((size * 2, size * 2))

circles = [
    (22, 30, 0, -1),  # basic shape
    (30, 20, 0, 0),   # large cutouts
    (0, 27, 7, -1),   # "background circle"
    (30, 21, 2, 0),   # "background circle" clearance
    (0, 6, 0, 0),     # center disc
    (51, 4, 0, 0),    # blunt the points
]

for pos, radius, width, color in circles:
    for lobe in [0, math.pi * 2 / 3, math.pi * 4 / 3]:
        x = int(math.sin(lobe) * pos * basic) + size
        y = size - int(pos * basic * math.cos(lobe))
        pygame.draw.circle(screen, color, (x, y), radius * basic, width * basic)
        # Hack to draw the small slots in the center
        if radius == 20:
            pygame.draw.line(screen, 0, (size, size), (x, y), basic * 2)

pygame.display.flip()

该程序的关键主要是利用符号的3向点对称性,并尽可能稀疏地表示绘图操作。这一切的核心是circles,这是一个圈子定义的列表,仅包括:

  • position:以半个基本单位离原点有多远
  • radius:以半个基本单位表示的圆的半径
  • width:圆的边框宽度(从外圆向内,0 =填充)
  • color:利用pygame解释0为黑色和-1白色的事实

每次绘制操作重复3次,旋转120°。“爪”的钝化是用另一个圆圈完成的。内部的“线切割”是特殊情况,因为我想不出一种更有效的方法将它们插入其中。在规范中定义的“基本单位”在这里一倍,所以我没有用.5circlesint()所有的地方,以满足pygame的。

结果python3 -c 'from biohazard import *; f(500)'

显示此答案的输出


1
辛苦了,欢迎来到中国总商会!当使用非内置库时,说明应显示“ Python 3 + pygame”。输入可以取自标准输入,也可以用作函数参数,以避免导入sys模块,从而缩短了代码(请参阅规则)。同样,可以使用此技巧来避免需要import math
乔尔

@Joel感谢您的反馈!我在标题中包含pygame,并将代码转换为函数。至于math,我将其重构为一个坐标列表。反正只有三个。不需要(余弦)正弦。
marcelm

1
与将所有数字放入源代码相比,应用上述技巧实际上节省了更多的字节。
乔尔

@Joel感谢您的提醒;较早时,我放弃了该选项,因为它看起来更长了,但看起来我错了。它还允许进行更多优化。
marcelm

1

Tcl / Tk-557字节

set F #000
set B #F50
pack [canvas .c -bg $B]
rename expr e
rename foreach f
rename proc p
p R r {list [e $r*cos($::a)] [e $r*sin($::a)]}
p D {d r} {lassign [R $d] x y;list [e $x-$r] [e $y-$r] [e $x+$r] [e $y+$r]}
p C {d r c} {.c cr o {*}[D $d $r] -f $c -outline $c}
p L {p q w} {.c cr l {*}[R $p] {*}[R $q] -w [e $w] -f $::B}
p A {d r w c} {.c cr a {*}[D $d $r] -w [e $w] -star 0 -ex 359.9 -sty arc -outline $c}
f x {{C 11 15 $F} {C 15 10.5 $B} {L 0 5 1} {L 20 40 4} {C 0 3 $B} {A 0 11.75 3.5 $F} {A 15 10 1 $B}} {f a {2.62 4.72 6.81} $x}
.c move all 99 99

但是,该版本很无聊,因为无论如何您都会获得相同的小尺寸图像。但是,它确实满足了在屏幕上显示的OP条件。这是带注释的未压缩版本,可以在其中添加指定大小的功能:

# Input: command line argument is the pixel width (same as the height) of the window to create
# For example:
#   wish a.tcl 500
set window_size $argv

set foreground_color #000
set background_color #F50
pack [canvas .c -bg $background_color -width $window_size -height $window_size]

# Helper procs to generate x,y coordinates
proc radius->x,y r {
  list [expr {$r*cos($::angle)}] [expr {$r*sin($::angle)}]
}

proc center_offset,radius->rectangle {offset r} {
  lassign [radius->x,y $offset] x y
  list [expr {$x-$r}] [expr {$y-$r}] [expr {$x+$r}] [expr {$y+$r}]
}

# Tk's canvas does not scale line widths, so we have to do that manually
# The $scale is a global variable for compressing the code text above
set scale [expr {$window_size*.016}]

# These three procs draw items in the canvas
proc circle {offset r color} {
  .c create oval {*}[center_offset,radius->rectangle $offset $r] -fill $color -outline $color
}
proc line {p q w} {
  .c create line {*}[radius->x,y $p] {*}[radius->x,y $q] -width [expr {$::scale*$w}] -fill $::background_color
}
proc annulus {offset r w color} {
  .c create arc {*}[center_offset,radius->rectangle $offset $r] -width [expr {$::scale*$w}] -start 0 -extent 359.9 -style arc -outline $color
}

# Our list of shapes to draw
#  circle  center_offset, radius,                   color
#  line    end_offset_1,  end_offset_2, line_width
#  annulus center_offset, radius,       line_width, color
foreach command {
  {circle  11 15        $foreground_color}
  {circle  15 10.5      $background_color}
  {line     0  5    1}
  {line    20 40    4}
  {circle   0  3        $background_color}
  {annulus  0 11.75 3.5 $foreground_color}
  {annulus 15 10    1   $background_color}
} {
  # Each command gets applied thrice, rotated $angle radians each time
  foreach angle {2.62 4.72 6.81} $command
}

.c scale all 0 0 $scale $scale
.c move all [expr {$window_size/2}] [expr {$window_size/2}]

# Some random convenience stuff for playing with it
bind . <Escape> exit
after 500 {focus -force .}

抱歉,没有照片(今天正在关闭我的手机)。在生物危害橙色背景上产生一个黑色符号。

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.