Reutersvärd's Üçgenini Çiz


33

Bu imkansız bir nesne olduğunu Reutersvärd üçgeni :

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

Kendi versiyonunuzu bu kurallara göre çizin:

  • Tam olarak 9 küp toplam
  • Her iki taraf tam 4 küpten oluşuyor
  • Küpler, işlenen nesne aslında imkansız bir nesne olacak şekilde üst üste gelir
  • 4 farklı renk kullanılır - arka plan için bir tane ve küplerin yüzlerinin her biri için 3 tane
  • Bitmap çıktısında, tam üçgen en az 100 piksel yüksekliğinde ve en az 100 piksel genişliğinde olmalıdır
  • En boy oranı: tam üçgenin genişliği ve yüksekliği 2 kattan fazla olmamalıdır
  • Üçgen yukarıdaki resme göre herhangi bir miktarda döndürülebilir.
  • Üçgen yukarıdaki görüntüye göre yansıtılabilir veya yansıtılmayabilir.

Yanıtlar:


14

Brain-Flak, 487810 327722 75564 + 1 = 75565 bayt

Maalesef bu bir cevaba uyacak kadar büyük.

Pastebin

Çevrimiçi Deneyin

Bu -Abayrakla birlikte, aşağıdaki gibi görünen bir ASCII ppm dosyası çıkarılır:

Yeni çıkış

açıklama

Zaten bunu elle yazmadığımı tahmin etmiş olabilirsin. Yani burada nasıl yaptım:

İlk önce yukarıda gördüğünüz görüntüyü, meydan okuma tarafından sağlanan görüntüden yaptım. Hiçbir renk kanalı olmadığı 255veya 0bu yoldan başka bir değere sahip olmadığı ayırt edilir. Bu şekilde, maksimum renk kanalı 1'e ayarlanmış olarak daha küçük bir dosyaya sığdırabiliriz. Bu bir modülü kullanarak çözer kendimi burada bulunabilecek yazdım . Çok parlak değil, sadece bunun gibi şeyler için birlikte attığım bir hack. pushbir sayıyı yığına itmek için etkili Brain-Flak kodu döndüren bir işlevdir ve kolmobelirli bir dizeyi yığına itmek için etkili bir yol bulmaya çalışan çok basit bir Kolmogorov karmaşıklık çözme programıdır.

from value import push,kolmo

def group(a, n):
    return zip(*[a[i::n]for i in range(n)]) 

f=open("R.ppm")
a=["".join(x)for x in group(f.read().split()[3:][::-1],3)]
f.close()

def hardcode(string):
    result = push(ord("\n")).join("(<>({})<>"+{"0":"","1":"()"}[x]+")"for x in string)
    return result

last = ""
acc = 0
result = push(ord("0"))+"<>"
for x in a+[""]:
    if x != last:
        string = ("" if not last else kolmo("\n")+hardcode(last))
        result += min([push(acc)+"{({}[()]<%s>)}{}"%string,acc*string],key=len)
        acc=1
    else:
        acc += 1
    last = x
print result+kolmo("P3 100 100 ")

Bu oldukça eğlenceliydi ve cevabımı iyileştirmeyi umuyorum


14
Yasal olarak 160088 byte golf oynadın mı? Bu bir rekor mu?
Neil

Belki bazı sıradışı cevaplar bunu yenebilir
Roman Gräf


Python kodun ilgimi çekiyor. Nedir value? ( PyPI'deki bu modül değil sanırım?) Ne kolmo?
Tim Pederick

@TimPederick Bunun için üzgünüm. Bu, Brain-Flak golf oynamak için kendime yazdığım bir modül. Vücuda bir link ekleyeceğim.
Buğday Sihirbazı

13

Mathematica, 237 bayt

n={-1,1}#&;c_~g~s_:=Polygon[c+s#&/@{k={12,9},m=n@k,t={0,-12}}];p={#,#2~g~1,#3~g~-1}&;a=p[Cyan,#-k,#+m]&;b=p[Blue,#-t,#+k]&;c=p[Red,#-m,#+t]&;Graphics@{{a@#,b@#,c@#}&/@{j=4k,s=4{4,9},n@s,4m,r={-32,8},q=-4{4,5},4t,n@q,n@r},a@j,b@s,c@j,c@s}

Daha kolay okunur sürüm:

1  n = {-1, 1} # &;
2  c_~g~s_ := Polygon[c + s # & /@ {k = {12, 9}, m = n@k, t = {0, -12}}];
3  p = {#, #2~g~1, #3~g~-1} &;
4  a = p[Cyan, # - k, # + m] &;
5  b = p[Blue, # - t, # + k] &;
6  c = p[Red, # - m, # + t] &;
7  Graphics@{
8    {a@#, b@#, c@#} & /@
9      {j = 4 k, s = 4{4, 9}, n@s, 4 m, r = {-32, 8},
10       q = -4{4, 5}, 4 t, n@q, n@r},
11   a@j, b@s, c@j, c@s}

Satır 1, nsipariş edilen bir çiftin ilk koordinatını geçersiz kılan bir işlevi tanımlar . Hat 2 tanımlayan bir işlev gnoktasında merkezlenmiş bir (kabaca) eşkenar üçgen oluşturur cve yere veya olmamasına bağlı olarak yukarı sbir 1ya da -1. Satır 3 tanımlar ptanımlar 4-6 renk ve iki üçgen ve hatlardan oluşan bir paralelkenar şablonu olduğu a, bve cküpler görünür paralel kenar üç farklı özel tipleri için.

Satır 8 {a@#, b@#, c@#}&, noktada merkezlenmiş bir küpün tamamını çizen bir işlevi tanımlar #; 9. ve 10. satırlar bunu daha büyük üçgeni yapmak için gereken dokuz noktaya uygular. Bu, sağ üstte başlayan ve saat yönünün tersine ilerleyen dokuz küp üretir, burada daha sonrakilerin önceki bölümleri kapsar. Son olarak, çizgi 11, dört paralelkenar (resmin sağ üst köşesinde) yeniden çizer, böylece olması gerektiği gibi daha sonraki küpleri kaplarlar. Çıktı aşağıdadır:

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


6
Hangi Mathematica'nın bunun için yerleşik bir özelliği olmadığını bekle?
Dijital Travma,

10

HTML + CSS 3D (855 866 bayt)

HTML 117 bayt + CSS 738 bayt

z-indexesSırayla tutmak için biraz zor oldu. ;)

/* CSS */
p{position:absolute;left:110px;top:0;width:50px;height:50px;transform-style:preserve-3d;transform:rotateX(-45deg)rotateY(21deg)rotateZ(20deg)}
p+p{left:140px;top:50px}
p+p+p{left:170px;top:100px}
p+p+p+p{left:200px;top:150px}
p+p+p+p+p{left:140px;top:150px}
p+p+p+p+p+p{left:80px;top:150px}
p+p+p+p+p+p+p{left:20px;top:150px}
p:nth-child(8){z-index:1;left:50px;top:100px}
p:nth-child(9){z-index:-1;left:80px;top:50px}
p:nth-child(10){z-index:1;left:67px;top:59px;transform:rotateX(-45deg)rotateY(21deg)rotateZ(20deg)scale(0.6)}
a{position:absolute;width:50px;height:50px;background:red;transform:rotateY(0deg)translateZ(25px)}
a+a{background:tan;transform:rotateY(-90deg)translateZ(25px)}
a+a+a{background:navy;transform:rotateX(90deg)translateZ(25px
<!-- HTML -->
<p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a>

Daha iyi okunabilirlik için yeni hatları korudum. Belki birileri daha fazla golf oynamak için potansiyel gösterir. Ancak, bayt sayısına dahil edilmezler.

Sonuç

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

jsFiddle Demo

Kendin dene

Goole Chrome'u kullanın. Diğer tarayıcılarda sorunz-indexes olabilir .

Düzenle

  • Kaydedilen 2 bayt yinelenen kaldırarak asayende-seçici ETHproductions .
  • Kaydedilen 9 bayt gereksiz kaldırarak margin:0ile a-eleman.

Etiketsiz HEAD/BODYve etiketsiz olarak hala geçerli HTML mi? Tarayıcıların sözdizimi hatalarını göz ardı etme eğiliminde olduğunu ve onlara ne attığınızı göstermeye çalıştıklarını biliyorum, ancak bu kodun özellikleri takip ettiğini sanmıyorum. (Dedi, harika bir çözüm!)
Federico Poloni

2
@FedericoPoloni Teşekkürler. İlişkin html|head|body-elemanları: Bunlar göz ardı edilebilir. Bir göz atın "İsteğe Bağlı Etiketler" , sen de atlanabilir kaç elemanları ve kapanış etiketleri şaşıracaksınız. Teknik özelliklerde olmayan, fakat aynı zamanda işe ayarayan şey , öğelerin kapanış etiketlerini atlamaktır. Ancak tarayıcı tarafından doğru bir şekilde kapatılırlar, çünkü onları yuvalayamazsınız. Ayrıca Code Golf açısından: " Derleyen " ve doğru çıktı alan her şey geçerlidir. ;)
03'te insertusernamehere

9

BBC BASIC, 147 bayt

tokenised dosya boyutu 129 bayt

t=PI/1.5x=500y=x:FORi=0TO28b=i MOD3GCOL0,b:b*=t:a=i DIV9*t:IFb=0x-=99*COSa:y-=99*SINa
MOVEx,y:VDU25;66*COSb;66*SINb;28953;66*COS(b-t);66*SIN(b-t);:NEXT

MOVETüm mutlak özellikleri kullanabilmek için orijini değiştirmek yerine mutlak bir koordinat özelliği ( ) ve paralelkenar başına iki göreceli özellik kullanılarak kaydedilen 2 bayt . Gereksiz boşlukların 1 baytı elimine edildi.

BBC BASIC, 150 bayt

tokenised dosya boyutu 127 bayt

Tercümanı http://www.bbcbasic.co.uk/bbcwin/download.html adresinden indirin.

t=PI/1.5x=500y=x:F.i=0TO28b=i MOD3GCOL0,b:b*=t:a=i DIV9*t:IFb=0 x-=99*COSa:y-=99*SINa:ORIGINx,y
L.66*COSb,66*SINb,0,0PLOT117,66*COS(b-t),66*SIN(b-t)N.

açıklama

Sağ üstteki koordinatlarla başlıyoruz ve 3 kişilik gruplar halinde eşkenar dörtgenleri çiziyoruz. Her 3 grubundan önce orijini taşıyoruz (Batı, Batı, Batı, SE, SE SE, NE, NE NE.) sağ üstte, orijini orijinal konumuna geri getirerek, çizilecek en son gruptur. Daha sonra devam edip ilk grubun siyah ve kırmızılarını (ancak yeşillerini değil) tekrar çizeriz, toplam 29 eşkenar dörtgen.

Ungolfed

  t=PI/1.5                                 :REM 120 deg
  x=500                                    :REM coordinates of top right corner
  y=x
  FORi=0TO28
    b=i MOD3:GCOL0,b                       :REM set colour 0=black,1=red,2=green
    b*=t                                   :REM convert b to a multiple of 120deg
    a=i DIV9*t
    IFb=0 x-=99*COSa:y-=99*SINa:ORIGINx,y  :REM before each group of 3 rhombs move the graphics origin
    LINE66*COSb,66*SINb,0,0                :REM define one side of a rhombus
    PLOT117,66*COS(b-t),66*SIN(b-t)        :REM define one further corner and plot the rhombus
  NEXT

Çıktı

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


8

HTML + JavaScript (ES6), 351 374 384

<canvas id=C></canvas><script>c=C.getContext("2d");`133124222162184253104213162164244191224182133191064104222093164253122224284151284`.match(/.../g).map((v,i)=>(c.fillStyle=['#fc0','#f04','#08a'][a=i%3],c.beginPath(),c[l='lineTo'](x=5*~~v/10,y=v%10*25),c[l](x-10,y+(--a+!a)*17),a&&c[l](x-30,y+a*17),c[l](x-20,y),!a&&c[l](x-10,y-17),c.fill()))</script>

Daha az golf oynadı

<canvas id=C></canvas>
<script>
  c=C.getContext("2d");
  [133,124,222,162,184,253,104,213,162,164,244,191,224,182,133,191,64,104,222,93,164,253,122,224,284,151,284]
  .map((v,i)=>(
    a = i % 3,
    x = 5 * ~~ v / 10,
    y = v % 10 * 25,
    c.fillStyle = ['#fc0','#f04','#0a8'][a],
    c.beginPath(),
    --a,
    c[l='lineTo'](x, y),
    c[l]( x -10, y + (a+!a) * 17),
    a&&c[l](x - 30, y + a * 17),
    c[l](x - 20, y),
    !a&&c[l](x - 10, y - 17),
    c.fill()
  ))
</script>

Ölçek

<canvas id=C></canvas><script>c=C.getContext("2d");`133124222162184253104213162164244191224182133191064104222093164253122224284151284`.match(/.../g).map((v,i)=>(c.fillStyle=['#fc0','#f04','#08a'][a=i%3],c.beginPath(),c[l='lineTo'](x=5*~~v/10,y=v%10*25),c[l](x-10,y+(--a+!a)*17),a&&c[l](x-30,y+a*17),c[l](x-20,y),!a&&c[l](x-10,y-17),c.fill()))</script>


5

JavaScript (ES6) / SVG (HTML5), 350 312 bayt

document.write(`<svg width=390 height=338>`)
a=`195,52;240,130;285,208;330,286;240,286;150,286;60,286;105,208;150,130;`
a=(a+a).split`;`
for(i=9;i--;)document.write(`<path fill=#FD0 d=M${a[i]}h60l-30,-52h-60z /><path fill=#088 d=M${a[i+3]}h60l-30,52h-60z /><path fill=#F64 d=M${a[i+6]}l-30,-52l-30,52l30,52z />`)


3

SVG, 562 540 520 504 487 473 bayt

Bu benim ilk kez SVG'yi golf oynamak (ya da aslında herhangi bir işaretleme); nazik olmak!

Varsayılan görüntüleme ortamı, tipik pencere boyutu gibi bir şeye sahip SVG özellikli bir web tarayıcısıdır. Firefox 50'de ve Chrome 55'te test ettim.

viewBox100 piksellik ihtiyacını karşılamak için gereklidir; tüm ölçümleri uygun bir faktörle yapmak da işe yarayacak, ancak daha fazla bayt alacaktır. Bu arada, boşluğu kaldırarak başka byte kaydetmek mümkündür 0 -5içinde viewBox(Chrome oysa olacak) değeri, ancak Firefox geçerli olarak bu kabul etmeyecektir.

En boy oranı, gerçek 0.866: 1 yerine 1: 1'dir. "2 faktörü" kuralının nasıl yorumlanacağından tam olarak emin değilim (sanırım bunun 0.433: 1 veya 1.732: 1 kadar uç bir abartmanın kabul edilebilir olduğu anlamına geliyor), ancak bunun şartı yerine getirdiğinden eminim neyse.

SVG

<svg xmlns="http://www.w3.org/2000/svg"
xmlns:l="http://www.w3.org/1999/xlink"
viewBox="0 -5 26 26"><g
id="a"><path d="m7,9H3V5h6z"/><g
id="f"><path fill="red" d="m9,5H3V1h4z"/><path
fill="blue" d="m3,1l2,4L3,9l-2-4z"/></g></g><use
l:href="#a" x="3" y="6"/><use
l:href="#e" x="12"/><g
id="e"><use l:href="#a" x="-6" y="12"/><use l:href="#a" x="-12" y="12"/></g><use
l:href="#a" x="-9" y="6"/><use
l:href="#a" x="-6"/><use
l:href="#a" x="-3" y="-6"/><use
l:href="#f"/></svg>

Sonuç

Reutersvärd's Triangle için yukarıdaki SVG kodunun PNG görüntülemesi


Sanırım buradaki yeni hatları silebilirsin, değil mi? IIRC, XML çoğu bağlamda boşlukları göz ardı eder.

@ ais523: Evet, göndermeden önce bunu yapmayı unuttum. facepalm Şimdilik bitti. Belirgin bir şekilde okunabilir kılmak için hala yeni satırlar var, ancak yalnızca yine de bir tür boşluğa ihtiyaç duyulan yerlerde (etiket adları ve öznitelikler arasında).
Tim Pederick,

En boy oranı kuralına ilişkin yorumunuz doğru
Dijital Travma
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.