☣ çizin (Biohazard Symbol)


66

Biohazard sembolünü, rengarenk renkli bir arka plan üzerinde keyfi bir renkte çizin. Özel oranlar , ABD Hükümeti Federal Sicili'nin 27 Haziran 1974 sayısında yayınlandı .

ayrıntılar

  • Çıktı olarak, bir dosyaya yazma (tarama ve vektör biçimlerine izin verilir) veya ekranda görüntülemeye izin verilir.

  • Sadece kenarlık veya doldurulmuş şekli çizebilirsiniz.

  • Tarama görüntüleri kullanıyorsanız, çıkışın çözünürlüğünü ayarlamanıza izin veren bir parametre (veya iki) almanız gerekir (örneğin genişlik / yükseklik).

  • Arka plan, en azından sembolün sınırlayıcı kutusunun boyutuna sahip olmalıdır, ancak daha büyük olabilir.

  • Unicode sembolünü ting basmak yeterli değildir .

  • Kullanılan mesafelerin kesin oranları aşağıdaki diyagramda (başlangıçta buradan alınmıştır ) verilmiştir:

Ayrıca okumasını biraz daha kolaylaştıran aynı ölçümlerle ek bir diyagram yapmaya da çalıştım:

( % 99 görünmez üzerindeki bir yazıdan esinlenilmiştir )


2
Loophole: değişken büyüklükteki bir arkaplan içine 1x1 piksel görüntü koyabilir miyiz?
John Dvorak

Bence, çözünürlüğü yeterince büyük ayarlarsanız, sembol hala görünmelidir. Ve her durumda, burada insanlar ne demek istediğimizi anlamak için yeterli
sağduyuma

1
Boş zamanım olsaydı PostScript ya da kaplumbağa grafiklerini denerdim.
Guy Coder

1
@ SriotchilismO'Zaic Uzunluk iki daire tarafından belirlenir: Her birinin belirli bir merkezi ve yarıçapı vardır, bu nedenle uzunluk aralığın büyüklüğüne göre belirlenir.
kusur

1
11

Yanıtlar:


96

T-SQL, 442 441 426 355 349 344 bayt

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()Uzun anahtar kelimeler kullanarak ve dinamik SQL olarak çalıştırarak 70+ bayt kurtarıldı . Değiştirme sonrası kodu aşağıdaki ekran görüntüsünde görün.

Koordinat değerlerini örnek çizimden iki katına çıkardım ve görüntülenen ondalık sayısını azaltmak için 9 birim yükseldim.

Bu, SQL 2008'de tanıtılan coğrafi-mekansal özellikleri kullanarak, SQL 2017'de yapıldı. Bu, STBufferbir nokta etrafındaki farklı büyüklükteki daireleri tanımlamanın basit bir yolunu da içeren , pek çok kullanışlı yerleşik geometri işlevi .

Çıktının görsel, açıklamalı kod ile:

Jeo-uzamsal fonksiyonları kullanarak T-SQL'de biyolojik tehlike sembolü

Daha fazla T-SQL çizimi için Paskalya Tavşanıma bakın .

Bu tekniğin SQL'deki daha pratik uygulamaları için bu makaleyi okuyun veya bu videoyu izleyin . SE bile ilgili bir siteye sahiptir, gis.stackexchange.com .

Düzenlemeler:

  1. 104'den 99'a bir koordinat değiştirerek 1 byte kurtarıldı.
  2. Her biri ayrı ayrı STDifferencebir STUnionnesne alarak 15 bayt kurtarıldı .
  3. REPLACE()Tekrarlanan anahtar kelimeleri kullanarak 71 bayt kaydedildi , ardından dinamik SQL olarak çalıştırıldı. Daha fazla değişiklik yapmak için Düzenlenmiş Düzenleme 2 STDifference.
  4. Merkezi 9 birim yukarı hareket ettirerek 4 bayt kurtardı, bu da birkaç koordinatı tek (negatif) basamak olarak değiştirdi. Bu aynı zamanda, 5yerine karakter olarak kullanmak için sayıyı serbest bıraktı '#'ve tırnak işaretleri üzerine 2 bayt daha kazandı.
  5. Değiştirilen dizgeye )geçerek 5 bayt kaydedildi STDifference; teşekkürler, @Nicholas!

56
Bu neden var?
Alexander

26
@Alexander Nüfus sayımı veya bilimsel çalışmalar gibi coğrafi verileri içeren veya kullanan veritabanları ve hatta coğrafi bölgelere göre sadece müşteri satışları için. Veya sadece tavşan ve biyolojik tehlike sembolleri çizmek için.
BradC

24
SQL, zihninde bunun ötesine geçmek isteyen bir kişi için yeterince kötüdür. SQL ile yazılmış GUI düşünün. Ek açıklamalara, yönlere ve birim test çerçevesine ihtiyacım var. Bir yere gitmemiz gerek .
Alexander,

24
As @Alexander istediğiniz: TSQLT
FreeMan

15
@FreeMan Oh ... aşkına.
Alexander

32

Tex + Tikz, 232 bayt

Tex'a geçerek kaydedilen 43 bayt. Phelype Oleinik sayesinde

Skillmon sayesinde bazı baytlar kaydedildi

\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

Satır sonları olan ve olmayanlar \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

açıklama

Bu biraz modası geçmiş bir görüntü nasıl büyük değil yapmak nasıl çözebilirim zaman düzelteceğim

Burada, sıkıştırılmamış cevabın sorunu nasıl çözdüğünü açıklayacağım. Bir noktada sıkıştırmanın nasıl çalıştığını açıklayabilirim. İlk önce büyük siyah halkaları çizelim:

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

görüntü tanımını buraya girin

Sonra bazı beyaz çizgiler çizeriz:

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

görüntü tanımını buraya girin

Sonra beyaz daireler çizeriz:

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

görüntü tanımını buraya girin

Sonra merkezi bir beyaz daire ekleriz:

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

görüntü tanımını buraya girin

Sonra bir siyah halka ekleriz:

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

görüntü tanımını buraya girin

Sonra siyah halka şeklindeki kısımları çıkarırız.

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

görüntü tanımını buraya girin


9
Altı dış noktayı köreltmedin. Her çift arasında 4 ünite beyaz boşluk bulunmalıdır.
Seviye Nehri St

1
@LevelRiverSt Altı dış nokta şimdi eşlerinden 4 birim uzakta.
Buğday Sihirbazı,

2
Bu "pençe uçları" çok sivridir, merkez çemberden gelen parçalara paralel düz çizgi parçalarından oluşmalıdır. Ayrıca 20.88 de oldukça şüpheli görünüyor.
kusur

Daha sonra kullanabileceğiniz gibi, \1yerine başka bir bayt kaydedebilirsiniz . \x\def\f{\foreach\1in{90,210,330}}
Skillmon

1
@flawr peki ... onlar şimdi tam anlamıyla 5000x5000'den biraz daha küçükler ... şimdi sadece 90x90 ... ayrıntıları bile zorlukla çıkarabiliyorlar: D
Nelson

15

C, 8010 bayt

Geriye dönersek, SVG veya EMF'den önce, raster ile uğraşmak zorundaydınız ve bir şeyin hemen yüklenmesini istiyorsanız, O / S hazır olmadan önce, bir Windows başlangıç ​​ekranı gibi, bir RLE veya uzunluk kullanmanız gerektiğini söyleyin. -Encoding. Bu canavar, veri olarak RLE kullanarak bir PBM dosyası çıkarır. Her zamanki gibi yapın ve bu şekilde çalıştırın ./biohazard > biohazard.pbm.

Oluşturmak için gereken tüm çerçeveleri, örneğin HTML’deki SVG motoru, Java kütüphaneleri vb. İçerecek olsaydınız, bu muhtemelen en küçük kendi kendine yeten çözüm olurdu , çünkü putstek harici işlevdir ve tipik olarak en küçük işlevlerden biridir. stdio.hfonksiyonlar.

Bu detay ile ilgili olarak:

Tarama görüntüleri kullanıyorsanız, çıkışın çözünürlüğünü ayarlamanıza izin veren bir parametre (veya iki) almanız gerekir (örneğin genişlik / yükseklik).

Ben olduğu gibi, "şıra" dan farklı "gereken" örneğin yorumlanır RFC 2119 , bu nedenle bu kodu için sadece orijinal, örneğin katlarını yapmak mümkün olurdu çünkü ölçeklendirme içermiyordu ./biohazard 2ve bu getirecek atoi, printfve diğer Sunumun ana odağından uzaklaşacak komplikasyonlar.

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
Kodu nasıl oluşturduğunu açıklamak güzel olurdu.
Coeur

Kod her karakterden sonra yeni bir satır çıkarır; Sanırım ihtiyacın putchar()ya da benzeri.
marcelm

@marcelm - PBM P1 formatı bununla tamam!

1
Bunun bu soru için olması gerektiği anlamına geldiğinden eminim, ancak bu muhtemelen OP'ye katılmaya değecektir.
Buğday Sihirbazı

1
Kullanmanın mutlaka bir ayrım olduğu anlamına geldiğini sanmıyorum. Bu gerçekten OP'ye sormanız gereken (veya belki de söylemelisiniz) bir sorudur.
Buğday Sihirbazı,

15

TeX + Ti kZ , 234 230 226 bayt

Başlangıçta Sriotchilism O'Zaic'in cevabından 5 bayt daha uzun , ama bu doğru olmalı. Cevabına benzer, ancak burada birkaç bayt daha fazla tasarruf sağlar ve orada, sembolün ipuçlarını doğru bulmak için bir tane \draw[line width=8]daha gerekir (bunun altındaki kodda \28](~30)to(~55);, sadece bunun için 17 byte eklenir). Daha genel kod uzunluğu bayt.

Ve Sriotchilism O'Zaic sayesinde bazı soruları tekrar okudum ve rengini kırmızıya çevirebileceğimi fark ettim, böylece tekrar birkaç bayt kazandırdı:

\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 kZ , 195 Bayt

Sadece birileri umursarsa, aşağıdakiler üzerinde çalıştığım bir TeX tabanlı kod golf lehçesi kullanır (kodu kararlı olarak düşünmeyin). Bayt sayısı, anlamsal olarak kullanıldığından EOL karakterlerini ve EOF karakterini içerir (EOL, döngülerin argümanlarını sınırlar). Ağız şu ana kadar oldukça küçüktür ve sadece tanımlar için kısa yollar ve bir for döngüsü sözdizimi içermektedir, ancak bu cevap için özel olarak yazılmamıştır, bu nedenle kod golfünün kurallarını çiğnememesi gerekir. -g.tex-Package / file deposu : 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);
}

Her iki kod parçacığının çıktısı aynı görünüyor:

görüntü tanımını buraya girin

( görüntüyü güncellemek için çok tembel, sadece kırmızı olduğunu hayal edin )


Cevabım şimdi doğru ve sizinkinden 2 bayt daha kısa. Eminim biri daha kısa bir cevap vermek için cevabımın bir kısmını sizinkilerle bir araya getirebilir, ama cevabınızı tam olarak anlamadım.
Buğday Sihirbazı

@ SriotchilismO'Zaic rengini kırmızıya çevirirsem (rengin keyfi olabileceği kuralının üzerine çıkar), 230 byte'a çıkarırım.
Skillmon

@ SriotchilismO'Zaic ve açıkçası benim cevabınıza cevabınızla sadece bir bayttan fazlasını kurtardınız (sadece söyleyerek).
Skillmon

Tamam, cevabınıza baktım ve ne yaptığını anlamadım, bu yüzden cevabınızdan gerçekten çok fazla şey alabileceğimi sanmıyorum. Ama yine de kesin bir numara çıkarmak için mesajı değiştirdim, çünkü belki de cevabınızdan bazı şeyler farketmeden aldım.
Buğday Sihirbazı,

2
@ SriotchilismO'Zaic tamam. Her şeyden önce kodum sizden etkilendi, şu anda TeX'i bir tür kodlu golf diline dönüştürmek için bir kod golf paketi yazmaya çalışıyorum. Sonunda yayınladığımda cevabım daha kısa olacak :) (Bu soru için özel olarak hazırlanmış bir dil değil, bu yüzden kuralları
bozmuyor

12

GLSL, 700 629 564 545 499 bayt

#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 ile oynuyordum, bu yüzden GLSL gölgelendirme dilini denedim. Kod sadece her bir parçayı test ederek çevreleri ve çizgileri rasterleştirir ve onlara bir veya sıfır değeri atar. Makroların yoğun kullanımı ile boyut> 1000 bayttan kesildi.

Shadertoy programı

görüntü tanımını buraya girin


1
Siteye Hoşgeldiniz! Düzgün ilk cevap!
Buğday Sihirbazı,

Ben dil bilmiyorum, ama &&ve ||hiç golfed edilmesi &ve |bazı veya tüm kısımlarda?
Kevin Cruijssen

@KevinCruijssen Bu bir C altkümesidir, bu yüzden bunlar bitsel işlemler olacaktır. Benim için derleyici olsa da türü hakkında şikayet
Roninkoi

1
@Roninkoi Gerçekten C'ye dayandığını gördüm. C'de, bools için |/ &yerine ||/ kullanmak mümkündür &&, değil mi? C de uzun zamandır hiçbir şey yapmadım, o yüzden emin değilim. Çoğu durumda Java / C # .NET ile çalıştığını biliyorum. Ancak yalnızca şimdi eklediğiniz Shadertoy bağlantısını fark ediyorum ve daha önce belirttiğiniz gibi orada çalışmıyor gibi görünüyor. Ah iyi. Güzel ilk cevap btw! CGCC'ye hoş geldiniz.
Kevin Cruijssen

Kodda -30 bayt kestim ancak Başlık 566 bayt ve gönderilen kod 628 mi?
PrincePolka

12

SVG (HTML5), 434 410 321 bayt

<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

Şimdi @ LevelRiverSt SVG'sine dayanıyor.


1
İhmal etmenin <defs>güvenli olduğuna inanıyorum . Bu benim için Firefox, Chrome ve Edge'de çalışıyor.
Arnauld,

@Arnauld Teşekkürler, bu da ilkinden kurtulabileceğim anlamına geliyor <use>!
Neil

12

İşlem, 371 368 bayt

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);}

İşleme'nin bu zorluk için rasterleştirilmiş olarak sayılıp sayılmayacağından emin değildim. Rasterleştirilmiş olarak sayılırsa, translateve scalebelirli bir pencere boyutu için sembolü okunaklı ve ekranda yapmak için gereklidir. Ancak, tüm çizim komutları vektörleştirildiği için herhangi bir ölçekte çalışır; bu yüzden göreceli orijinden çizimin yaklaşık 200 birim genişliğinde olduğunu varsayarsak, ilk 43 byte atılabilir.

Bu, arka plan renginin işlemdeki varsayılan arka plan rengi olduğunu varsayar 204, 204, 204. Aynı zamanda bir varsayar rectModeait CORNERve bir ellipseModearasında CENTER(varsayılan)

Bir başlangıç size(640, 640)ile ortaya çıkan çizim şuna benzer:

görüntü tanımını buraya girin

Ölçeği iki katına çıkararak 3 byte tasarruf ettim, çünkü .5s yok edildi (birkaç rakam 1 basamaktan 2 basamağa kadar aksa da).

Yapı, şekil arasındaki boşlukları "silmek" için siyah ve daha sonra gri çizen TeX çözümüne benzer.

Açıklama:

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);
}

Güzel görünüyor :) Tüm ölçümleri iki katına çıkarırsanız kaçınabileceğinizi düşünüyorum .5!
kusur

Evet, ancak bu aynı zamanda tek haneli sayının bazılarını çift haneli olarak değiştirir, bu yüzden nasıl dengelendiğinden emin değilim. Doğru sayırsam, 2 bayt kurtarır gibi görünüyor. Ayrıca scalekodun sadece bir kısmı için onu değiştirmek için bir tane kullanmayı düşünüyordum , ama en iyi nereye koyacağından emin değildim
Curtis Fenner

oh haklısın, bunu düşünmedim.
kusur

Birkaç kord tekten duble hanelere geçse de, yanıtları kaldırmak için ölçümleri iki katına çıkarıp cevabımda neredeyse 10 bayt tasarruf etti. Yine de denemeye değer.
BradC

1
Çizdiği ölçeği ikiye katlayarak 3 bayt kurtardım. @IsmaelMiguel
Curtis Fenner

9

GLSL, 319 310 bayt

#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);}

Bu Shadertoy'da oluşturulabilir .

Numune

Görüntüdeki simetriyi, daha az miktarda ayrı şekillerle çizmek için kullanabilirsiniz.

İşte biraz şişirilmiş bir versiyon:

#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);
}

(Gereksiz beyaz boşlukları kaldırdığı için @Kevin Cruijssen'e teşekkürler)


1
Boşlukların bazılarını kaldırabilirsiniz. Tanımlamanızdakiler: H(y) sqrtH(y)sqrt; if ifadelerindeki tüm alanlar: if (if(; ve AND'leri çevreleyen son if-ifadenizde olanlar: if (R>.10 && R<.135 && S<.095)c=1.;if(R>.10&&R<.135&&S<.095)c=1.;.
Kevin Cruijssen

8

HTML / JS,  448 435 433  387 bayt

@ Neil'in SVG'nin küçültülmüş sürümünü kullanarak birçok bayt
kaydedildi @Shaggy sayesinde Kaydedilen 2 bayt

Wikimedia Commons'daki bu SVG dosyasının sıkıştırılmış bir versiyonu .

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

Çevrimiçi deneyin! (sadece sıkıştırılmış dizgeyi çıktılar)

Demo pasajı


Bu , Chrome Android'de CodePen'de 392 için çalışıyor.
Shaggy,

1
@Arsam, 5 bayta mal olmasına rağmen cevabımı tersine çevirmiş olsam da (başka bir gereksiz bayt buldum, ancak genel olarak puanım sadece 4'e yükseldi).
Neil

@Neil Buna göre güncellenir. ;)
Arnauld

@ LevelRiverSt'in SVG'sinin çok daha küçük olduğu ortaya çıktı!
Neil

7

Haskell , 530 491 436 435 430 420 bayt

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]

Bir PBM dosyası çıkarır.

Bu çok eğlenceliydi!

Biohazard

(Bunu PNG'ye dönüştürmek zorunda kaldım, imgur'a yüklemek için)

Temel olarak, pikselin şeklin bir parçası olup olmadığını tespit ederek görüntü pikseline piksel olarak görüntüleyen kendi vektör grafik fonksiyonlarımızı yaratırız. Şekil, temel küme işlemleriyle bir arada tutulan bir dizi daire ve çizgi (orijinden yayılan) olarak oluşturulur: birleşme, kesişme ve değil. Daireler merkezlerinden ve yarıçaplarından oluşur ve çizgiler bu sırayla minimum yarıçapa, genişliğe ve açıya sahiptir. Bir çemberdeki üyeliği tespit etmek kolaydır: Sadece merkez kodları çıkarırım ve büyüklüğünü yarıçapla karşılaştırırım. Çizgi biraz daha karmaşık: Noktayı döndürmek için açının karşısına doğru döndürüyorum (rotasyonu geçersiz kılmak için) sonra sadece x ve y koordinatlarının beklenen aralıkta olup olmadığını kontrol ediyorum. Minimum yarıçap, büyük dairelerin uzak uçlarındaki daha büyük aralığın merkeze yakın küçük boşlukları geçersiz kılmamasını sağlamaktır. Bundan sonra matematik ayarlamak için basit bir Boole mantığı meselesi.

EDIT: 39 byte çıkardığı için @flawr'a çok teşekkürler!

EDIT2: @Hristian Sievers'e 55 byte ayırdıkları için çok teşekkürler! Onları fonksiyonlara dönüştürmek iyi fikir

EDIT3: @Hristian Sievers'e başka bir baytı tıraş ettiğin için tekrar teşekkürler!

EDIT4: @ H.PWiz ve @Angs sayesinde 7 byte çıktı!

EDIT5: Sadece bir hata farkettim! Çizgileri olması gerekenden iki kat daha kalın hale getirdim! Düzeltmek için bana 2 bayta mal oldu (genişliği 2'ye bölmek zorunda kaldım; sabit değerleri ayarlayabilirdim ancak 1'den 0,5'e değiştirmek de 2'ye mal olacak).

EDIT6: Teşekkürler @ 10 bayt daha ayırdığınız için teşekkürler!


Vay, bu çok güzel. Burada kod golflerinde kendi türlerini tanımlayan birini görmek nadirdir :) İki soru: Olumsuz açılara sahip olmak gerekli [-90,-210,-330]mi? Ve değiştirmek mümkün olacağını <=hiç <?
kusur

1
Bu yüzden denedim ve birkaç baytı tıraş
kusur

1
Oh, bilmiyorsanız, haskell'de golf oynamak için bazı ipuçlarının yanı sıra bir karma sohbetimiz de var .
kusur

1
Başka bir küçük çimdik
kusur


6

Ruby , 278 bayt

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

Çevrimiçi deneyin!

OP'deki ölçek% 200'ünde sembolü olan aşağıdaki SVG kodunu oluşturur.

Arkada bir daire ve öndeki çatallardan oluşur. Çatal ölçeklendirilir -1,0,1olarak Xeksen 120 arasında birçok döndürülür. XÖlçeklemenin sıfır olduğu durumlarda , -1ve iken +1. her iki uç çiftinin iki tarafını da sağlayın.

strokeVe stroke-widthözelliğini kullanarak arka çemberi kesmek için dişin etrafındaki 2 birimlik geniş beyaz bir kenarlık kullanılır . İç şeklin OP'ye göre olması için koordinatlar 1 birim (sınırın genişliğinin yarısı kadar) hareket ettirilir. Sınırın son çizgisinin çizilmesini bastırmak için yolun kasıtlı olarak kapatılmadığını unutmayın. Bu, her bir uç çiftinin iki yarısının bir araya gelmesini sağlar.

Golf nedeniyle, beklenen 60 dereceden ziyade iç çemberin 90 derece çizilir. Bu, her çift çatal ucunun tabanı arasında bir miktar örtüşme olduğu anlamına gelir, ancak bu, çıktı şeklinin görünümünü etkilemez.

<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

PostScript , 367 359 328 271 bayt

Kod (sıkıştırılmış sürüm):

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

Kod (sıkıştırılmamış sürüm):

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

Sonuç (nasıl çizildiğini görmek için animasyon olarak):

sonuç


Harika animasyon
dana

2

Python 3 ile Pygame, 327 314 287 278 bayt

(13 baytı kurtarmak için çeşitli iğrenç kesitler uygulandı ; en önemlisi artık rengi saklamakla kalmıyor, aynı zamanda anında hesaplamak -(r>25))
(Fonksiyonel, kayıtsız ; koordinat sabitleri lehine syskesildi math; küçük tweaks; 27 bayt kaydedildi)
(Yeniden yazılan koordinat 9 cote tasarruf, (co) sinüs elde etmek için karmaşık matematik hilelerine sabitleri

Ortaya çıkan görüntünün genişliğinin / yüksekliğinin yarısını temsil eden tek bir tamsayı argümanı alan işlev. Örneğin f(500), 1000x1000 piksel bir pencere yaratacak ve buraya bir biyolojik tehlike sembolü çizecektir.

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()

Kısaltılmamış sürüm:

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()

Bu programın anahtarı çoğunlukla sembolün 3-yollu nokta simetrisinden yararlanmak ve çizim işlemlerini mümkün olduğunca seyrek ifade etmektir. Hepsinin kalbi circles, aşağıdakilerden oluşan daire tanımlarının bir listesidir:

  • position: Kökten ne kadar uzak yarı temel birimler halinde
  • radius: dairenin yarıçapı yarım temel birim cinsinden
  • width: dairenin sınır genişliği (dış daireden içe, 0 = dolgu)
  • color: pygame'in 0siyah -1beyaz olarak yorumlanması gerçeğinden istifade etmek

Her çizim işlemi, 120 ° döndürülmüş üç kez tekrarlanır. "Pençelerin" körelmesi başka bir daire ile yapılır. İç kısımdaki “hat kesimleri” özel olarak kaselenmiştir, çünkü onları oraya sokmanın daha etkili bir yolunu düşünemedim. Ben kullanmak zorunda değildi bu yüzden şartnamede tanımlanan "temel birimi" Burada iki katına .5içinde circlesve int()Pygame karşılamak için biryere.

Sonuç python3 -c 'from biohazard import *; f(500)':

Bu cevabın çıktısını görüntüle


1
İyi iş ve CGCC'ye hoş geldiniz! Tanım, yerleşik olmayan bir kütüphane kullanıldığında "Python 3 + pygame" demelidir. Girdi, standart girişten veya syskodu kısaltan modülün içe aktarılmasını önlemek için bir işlev argümanı olarak alınabilir ( kurallara bakınız ). Ayrıca, bu numara ithalat ihtiyacını önlemek için uygulanabilir math.
Joel,

@Joel Geri bildiriminiz için teşekkür ederiz! Pygame'i başlığa ekledim ve kodu bir işleve çevirdim. Gelince math, bunu bir koordinat listesine ekledim; Zaten sadece üç tanesiydi. (Ko) sinüs gerekmez.
marcelm

1
Yukarıda belirtilen numarayı uygulamak aslında tüm sayıları kaynak koduna koymaktan daha fazla bayt kazandırır.
Joel,

@Joel Hatırlatma için teşekkürler; daha önce bu seçeneği atmıştım çünkü daha uzun gözüküyordu ama yanılmışım gibi görünüyordu. Ayrıca daha fazla optimizasyona izin verdi.
marcelm

1

Tcl / Tk - 557 bayt

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

Ancak bu sürüm sıkıcıdır, çünkü ne olursa olsun aynı küçük boyutlu görüntüyü elde edersiniz. Bununla birlikte, ekranda görüntülemek için OP koşullarını yerine getirir. Yorumun yer aldığı sıkıştırılmamış versiyon ve eklenmiş bir boyut belirtme özelliği:

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

Üzgünüm, resim yok (bugün telefonumdan çalışıyor). Biyolojik tehlike turuncu zemin üzerine siyah bir sembol üretir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.