☣(バイオハザードシンボル)を描く


66

明確な色の背景に任意の色でバイオハザードシンボルを描画します。特定の比率は、1974年6月27日に発行された米国政府の連邦官報に掲載されました。

詳細

  • 出力として、ファイルへの書き込み(ラスターおよびベクター形式が許可されます)または画面への表示の両方が許可されます。

  • 境界線または塗りつぶされた図形のみを描画できます。

  • ラスターイメージを使用する場合は、出力の解像度(幅/高さなど)を調整できるパラメーター(または2つ)を入力として使用する必要があります。

  • 背景には、少なくともシンボルの境界ボックスのサイズが必要ですが、それより大きくてもかまいません。

  • UnicodeシンボルOutputを出力するだけでは不十分です。

  • 使用された距離の正確な比率は、次の図に示されています(元々はここから)。

また、同じ測定値で追加の図を作成しようとしました。

99%invisibleの投稿に触発された)


2
抜け穴:可変サイズの背景に1x1ピクセルの画像を配置するだけでいいですか?
ジョンドボラック

解像度を十分に大きく設定すると、シンボルが表示されるはずです。いずれにせよ、ここにいる人々が私たちの意味を理解するのに十分な常識を持っていることを望みます:)
flawr

1
時間があれば、PostScriptまたはturtleグラフィックを試してみてください。
ガイコーダー

1
@ SriotchilismO'Zaic長さは2つの円によって決まります。それぞれの円には中心と半径が与えられているため、長さはギャップのサイズによって決まります。
flawr

1
11

回答:


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バイト以上を節約しました。下のスクリーンショットの交換後のコードをご覧ください。

サンプルの図の座標値を2倍にし、表示される小数の数を減らすために9単位上に移動しました。

これは、SQL 2008で導入された地理空間機能を使用して、SQL 2017で行われましたSTBuffer

注釈付きコードを使用した出力のビジュアル:

地理空間関数を使用したT-SQLのバイオハザードシンボル

T-SQLの詳細については、イースターバニーを参照しください。

SQLでのこの技術のより実用的なアプリケーションについては、この記事を読む、このビデオをご覧ください。SEには、関連サイトgis.stackexchange.comもあります。

編集:

  1. 座標を104から99に変更して1バイトを保存しました。
  2. オブジェクトを個別に取得するのSTDifferenceではSTUnionなく、オブジェクトを取得して15バイトを節約しました。
  3. REPLACE()繰り返されるキーワードを使用して、動的SQLとして実行することで71バイトを節約しました。編集2を元に戻し、より多くの置換を残すSTDifference
  4. 中心を9ユニット上に移動して4バイトを節約しました。これにより、いくつかの座標が1桁(負)に変更されました。また、これにより数字5が解放され、の代わりに置換文字として使用できるよう'#'になり、引用符でさらに2バイト節約できます。
  5. 置換文字列に移動)して5バイトを保存しましたSTDifference。ありがとう、@ Nicholas!

56
なぜ...これは存在するのですか?
アレクサンダー

26
@Alexander人口調査、科学的調査、または地理的地域ごとの顧客の売上など、地理データを含むか使用するデータベース用。または、バニーやバイオハザードのシンボルを描くためだけに。
BradC

24
SQLは、正しい意味でそれを超えたいと思う人にとって、それが意味することとしては十分に悪いものです。SQLで書かれたGUIを想像してください。注釈、アスペクト、ユニットテストフレームワークが必要です。私たちはdeeeeeperに行く必要があります。
アレクサンダー

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
あなたは6つの外側のポイントを鈍らせていません。各ペアの間には4単位の空白が必要です。
Level River St

1
@LevelRiverSt外側の6つのポイントは、パートナーから4ユニット離れています。
ウィートウィザード

2
これらの「爪の先端」はとがりすぎており、中心円から来るセグメントに平行な直線セグメントで構成されている必要があります。また、20.88は非常に疑わしく見えます。
flawr

\1代わりにを使用して、別のバイトを保存\xできます\def\f{\foreach\1in{90,210,330}}
スキルモン

1
@flawrよく...文字通り5000x5000よりも文字通りかなり小さくなっています...今は90x90だけです...詳細はほとんどわかりません:D
Nelson

15

C、8010バイト

戻って、SVGまたはEMFの前に、ラスターを処理する必要がありました。たとえば、Windows起動画面のようにO / Sの準備ができる前に何かをロードする場合は、RLEまたはランレングスを使用する必要がありました-エンコーディング。このモンスターは、R​​LEをデータとして使用してPBMファイルを出力します。通常のようにビルドし、このように実行し./biohazard > biohazard.pbmます。

たとえば、HTMLのSVGエンジン、Javaライブラリなど、生成に必要なすべてのフレームワークを含める場合、これはおそらく唯一の外部機能であり、通常は最も小さなものの1つであるため、最小の自己完結型ソリューションになります。機能。putsstdio.h

この詳細について:

ラスターイメージを使用する場合は、出力の解像度(幅/高さなど)を調整できるパラメーター(または2つ)を入力として使用する必要があります。

私はのように、「必須」と異なり、「べき」などを解釈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 + Ti k Z、234 230 226バイト

もともとスリオチリズムオザイックの答えよりも5バイト長いですが、これは正しいはずです。それは彼の答えに似ていますが、あちこちで数バイトを節約し、もう1つ必要です\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ループ構文のみを特徴としていますが、この答えのために特別に書かれていないので、コードゴルフの規則を破るべきではありません。-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そして明らかにあなたは私の答えを見て(ちょうど言って)1バイト以上を節約しました。
スキルモン

わかりました、私はあなたの答えを見て、それが何をしていたのか理解していなかったので、私はあなたの答えから本当に多くをとることができなかったと思います。しかし、とにかく正確な番号を削除するようにメッセージを変更しました。おそらく、あなたの答えから気づかずにいくつかのものを選んだからです。
ウィートウィザード

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シェーディング言語を試しました。コードは、各フラグメントをテストすることで円と線をラスタライズし、1または0の値を割り当てます。マクロを頻繁に使用することにより、サイズが> 1000バイトから削減されました。

シェーダートイプログラム

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


1
サイトへようこそ!きちんとした最初の答え!
ウィートウィザード

私は言葉を知らないが、可能&&||するgolfedする&|、一部またはすべての部分で?
ケビンクルイッセン

@KevinCruijssenこれはCのサブセットなので、ビット単位の操作になります。私にとっては、コンパイラは型について文句を言います
ロノニコイ

1
@Roninkoi実際、それはCに基づいていることがわかりました。Cでは、boolsに|/の&代わりに||/ を使用でき&&ますよね。長い間Cで何もしていないので、よくわかりません。ほとんどの場合、Java / C#.NETで動作することを知っています。しかし、私はあなたが追加したShadertoyリンクに気付いただけで、既に述べたようにそこには機能しないようです。まぁ。素敵な最初の答えはところで!CGCCへようこそ。
ケビンクルーイッセン

投稿されたコードで-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);}

この課題のために、Processingがラスタライズされているとみなすべきかどうかはわかりませんでした。ラスタライズされたものとしてカウントされる場合、特定のウィンドウサイズでシンボルを読みやすく、画面上に表示するためにtranslatescaleが必要です。しかし、描画コマンドはすべてベクトル化されているため、任意のスケールで機能します。そのため、相対的な原点での描画が約200単位の幅であると仮定すると、最初の43バイトを削除できます。

これは、背景色が204, 204, 204であると想定しています。これは、処理中のデフォルトの背景色です。また、rectModeof CORNERおよびellipseModeof CENTER(デフォルト)を想定しています

initialを使用するsize(640, 640)と、結果のスケッチは次のようになります。

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

スケールを2倍にすることで、3バイト節約しました。 .5 sが削除されるました(ただし、いくつかの数字は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);
}

よさそうだ:)私はあなたが避けることができるすべての測定値を2倍にすると思う.5
flawr

はい。ただし、それによって1桁の数字の一部が2桁に変更されるため、どのようにバランスを取るのかわかりません。正しく数えれば、2バイト節約できるようです。scaleコードの一部だけを変更するためにa を使用することも考えていましたが、どこに配置するのが最適かは
わかり

ああ、あなたは正しい、私はそれを考慮しませんでした。
flawr

少数の座標が1桁から2桁になったにもかかわらず、測定値を2倍にして小数部を削除すると、10バイト近く節約できました。とにかく試してみる価値があります。
BradC

1
描画されるスケールを2倍にして、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バイトを保存

ウィキメディアコモンズのこの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>

オンラインでお試しください!(解凍された文字列を出力するだけです)

デモスニペット


これは 392のためにクロームのAndroidでCodePen、上、作品
シャギー

1
@Arnauld私は答えを逆にしましたが、それは5バイトかかりました(私は別の不必要なバイトを見つけましたが、全体的に私のスコアは4だけ上がったのです)。
ニール

@Neilはそれに応じて更新されました。;)
Arnauld

@LevelRiverStのSVGははるかに小さいことがわかりました!
ニール

7

Haskell530 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座標が期待される範囲内に収まるかどうかを確認します。最小半径は、大きな円の遠端の大きなギャップが中心近くの小さなギャップを覆さないようにすることです。その後、数学を設定するのはブール論理の簡単な問題です。

編集:39バイトを削除してくれた@flawrに感謝します!

EDIT2:55バイトを削除してくれた@Christian Sieversに感謝します!それらを関数にする良いアイデア

EDIT3:もう一度@Christian Sieversに感謝します!

EDIT4:@ H.PWizと@Angsのおかげで7バイトを引き継ぎました!

EDIT5:ちょうどバグに気づいた!私は線を本来の2倍の太さでレンダリングしていました!修正するには2バイトかかります(幅を2で除算する必要がありました。定数値を調整できましたが、1から0.5に変更すると2になります)。

EDIT6:さらに10バイトを削除してくれてありがとう@Angs!


うわー、これはとてもクールです。ここでコードゴルフで自分のタイプを定義している人を見ることはめったにありません:2つの質問:負の角度を持つ必要があり[-90,-210,-330]ますか?そして、変更することは可能であろう<=<
フレア

1
だから私はそれを試してみましたが、ために管理外の数バイトを剃る
flawr

1
ああ、あなたが知らなかった場合のために、私たちはhaskell チャットとhaskell でゴルフをするためのいくつかのヒントを持っています。
フレー

1
もう一つの小さな微調整
flawr


6

Ruby、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})'/>"}

オンラインでお試しください!

OPのスケールの200%にあるシンボルで、以下のSVGコードを生成します。

後ろの円と手前の突起で構成されています。プロングは軸でスケーリングさ-1,0,1れ、X120度の倍数で回転します。Xスケーリングがゼロの場合は出力が生成されませんが、-1and は出力されません+1。プロングの各ペアの両側を提供します。

strokeとのstroke-width属性を使用して、プロングの周囲に2ユニット幅の白い境界線を使用して、バックサークルをカットします。内部形状をOPに合わせるため、座標は1単位(境界線の幅の半分)移動します。境界線の最終線の描画を抑制するために、パスは意図的に閉じられないことに注意してください。これにより、プロングの各ペアの2つの半分が結合されます。

ゴルフの理由から、予想される60度ではなく、90度の内側の円が描かれています。これは、プロングの各ペアのベース間にある程度の重なりがあることを意味しますが、これは出力形状の外観には影響しません。

<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

結果(どのように描画されるかを見るためのアニメーション):

結果


素晴らしいアニメーション。
ダナ

2

Python 3 with pygame、327 314 287 278バイト

(13のバイトを保存するために、様々な厄介なハックを適用しない。最も顕著なのはもはや色を保存するが、とその場でそれを計算-(r>25)
(負け、関数にリファクタリングsys;アウトハッキングmath座標定数の賛成で、小さな微調整は、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°回転します。「爪」の鈍化は別の円で行われます。内側の「ラインカット」は特別なケースです。なぜなら、そこに入れるより効率的な方法を考えられなかったからです。仕様で定義されている「基本単位」はここで2倍になっているので、pygameを満たすために、あちこちで使用する必要.5circlesありませんでしたint()

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

この回答の出力を表示する


1
CGCCへようこそ。非組み込みライブラリを使用する場合、説明には「Python 3 + pygame」と記載する必要があります。入力は標準入力から取得することも、sysモジュールをインポートしないようにするための関数引数として取得することもできます。これにより、コードが短縮されます(ルールを参照)。また、このトリックを適用して、インポートの必要性を回避できますmath
ジョエル

@Joelフィードバックをありがとう!ヘッダーにpygameを含め、コードを関数に変換しました。に関してはmath、座標のリストにリファクタリングしました。とにかくたった3人でした。(コ)サインは必要ありません。
マーセル

1
上記のトリックを適用すると、実際にはすべての数字をソースコードに入れるよりも多くのバイトを節約できます。
ジョエル

@ジョエルリマインダーをありがとう。長いように見えたので、以前はそのオプションを破棄しましたが、間違っていたようです。また、いくつかの最適化が可能になりました。
マーセル

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 .}

申し訳ありませんが、写真はありません(今日は携帯電話で作業しています)。バイオハザードオレンジ色の背景に黒のシンボルを生成します。

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