Narysuj trójkąt Reutersvärd


33

Ten niemożliwy obiekt to trójkąt Reutersvärd :

wprowadź opis zdjęcia tutaj

Narysuj własną wersję zgodnie z następującymi zasadami:

  • Dokładnie 9 kostek ogółem
  • Każda strona składa się z dokładnie 4 kostek
  • Kostki wydają się nakładać, tak że renderowany obiekt jest w rzeczywistości obiektem niemożliwym
  • Wykorzystywane są 4 różne kolory - jeden dla tła i 3 dla każdej z powierzchni kostek
  • Na wyjściu bitmapy pełny trójkąt powinien mieć co najmniej 100 pikseli wysokości i co najmniej 100 pikseli szerokości
  • Współczynnik kształtu: szerokość i wysokość pełnego trójkąta nie powinna być większa niż współczynnik 2
  • Trójkąt może być obracany o dowolną wartość względem powyższego obrazu
  • Trójkąt może, ale nie musi, być odbity w stosunku do powyższego obrazu

Odpowiedzi:


14

Brain-Flak, 487810 327722 75564 + 1 = 75565 bajtów

Niestety jest to trochę za dużo, by zmieścić się w odpowiedzi.

PasteBin

Wypróbuj online

Po -Azaznaczeniu tej flagi plik wyjściowy ASCII ppm wygląda następująco:

Nowa wydajność

Wyjaśnienie

Być może już zgadłeś, że nie napisałem tego ręcznie. Oto jak to zrobiłem:

Najpierw zrobiłem obraz, który widzisz powyżej, z obrazu dostarczonego przez wyzwanie. Ma to tę różnicę, że nie ma kanału koloru o wartości innej niż 255lub w 0ten sposób możemy zawinąć go do mniejszego pliku z maksymalnym kanałem koloru ustawionym na 1. Potem napisałem skrypt pythonowy do gry w golfa w programie Brain-Flak rozwiązuje to za pomocą modułu, który sam napisałem, który można znaleźć tutaj . Nie jest bardzo dopracowany, to tylko hack, który rzuciłem razem na takie rzeczy. pushjest funkcją, która zwraca skuteczny kod Brain-Flak w celu wypchnięcia liczby na stos i kolmojest bardzo prostym programem do rozwiązywania złożoności Kołmogorowa, który próbuje znaleźć skuteczny sposób na wypchnięcie określonego ciągu do stosu.

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

To było całkiem fajne i mam nadzieję poprawić moją odpowiedź


14
Legalnie grałeś w 160088 bajtów? Czy to zapis?
Neil

Być może niektóre jednoznaczne odpowiedzi mogą temu
zaradzić


Twój kod Python mnie intryguje. Co jest value? ( Chyba nie ten moduł w PyPI ?) Co kolmo?
Tim Pederick

@TimPederick Przepraszamy za to. Ten moduł napisałem sobie do gry w Brain-Flak. Zamieszczę link w ciele.
Wheat Wizard

13

Mathematica, 237 bajtów

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}

Wersja łatwiejsza do odczytania:

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}

Wiersz 1 definiuje funkcję, nktóra neguje pierwszą współrzędną uporządkowanej pary. Linia 2 definiuje funkcję, gktóra tworzy (z grubsza) równoboczny trójkąt wyśrodkowany w punkcie ci skierowany w dół lub w górę w zależności od tego, czy sjest 1lub -1. Linia 3 określap się szablon równoległobok składający się z koloru i dwa trójkąty, a linie 4-6 określić a, bic się trzy różne typy szczególnych z równoległoboków, które pojawiają się w kostki.

Linia 8 definiuje funkcję, {a@#, b@#, c@#}&która rysuje cały sześcian wyśrodkowany w punkcie #; wiersze 9 i 10 odnoszą się do dziewięciu punktów potrzebnych do utworzenia większego trójkąta. W ten sposób powstaje dziewięć kostek, zaczynając od prawego górnego rogu i idąc w kierunku przeciwnym do ruchu wskazówek zegara, przy czym kolejne zakrywają części wcześniejszych. Na koniec linia 11 przerysowuje cztery równoległoboki (w prawym górnym rogu obrazu), aby ostatecznie zakryły późniejsze kostki, tak jak powinny. Dane wyjściowe są poniżej:

wprowadź opis zdjęcia tutaj


6
Poczekaj, co Mathematica nie ma do tego wbudowanego?
Cyfrowy uraz

10

HTML + CSS 3D (855 866 bajtów)

HTML 117 bajtów + CSS 738 bajtów

Utrzymanie z-indexesporządku było trochę trudne. ;)

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

Zachowałem nowe wiersze dla lepszej czytelności. Może ktoś dostrzega potencjał do gry w golfa. Nie są one jednak uwzględniane w liczbie bajtów.

Wynik

wprowadź opis zdjęcia tutaj

jsFiddle Demo

Spróbuj sam

Użyj Goole Chrome. Inne przeglądarki mogą mieć problemy zz-indexes .

Edytować

  • Zapisane 2 bajty usuwając zduplikowane a-selector, dzięki produktom ETH .
  • Zapisano 9 bajtów , usuwając niepotrzebne margin:0elementy a.

Czy nadal jest prawidłowy HTML bez HEAD/BODYtagów zamykających i zamykających? Wiem, że przeglądarki zwykle ignorują błędy składniowe i próbują wyświetlać to, co na nich rzucasz, ale nie sądzę, aby ten kod był zgodny ze specyfikacjami. (To powiedziawszy, świetne rozwiązanie!)
Federico Poloni

2
@FedericoPoloni Dziękujemy. Odnośnie html|head|bodyelementów: Można je pominąć. Spójrz na „Opcjonalne tagi” , zdziwisz się, ile elementów i tagów zamykających można również pominąć. To, czego nie ma w specyfikacjach, ale też działa, to pominięcie tagów zamykających aelementów. Są one jednak poprawnie zamknięte przez przeglądarkę, ponieważ nie można ich zagnieżdżać. Również z punktu widzenia Code Golf: Wszystko, co „ kompiluje ” i ma poprawne wyjście, jest prawidłowe. ;)
inserttusernamehere

9

BBC BASIC, 147 bajtów

tokenizowany rozmiar pliku 129 bajtów

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

2 bajty zapisane przy użyciu bezwzględnej specyfikacji współrzędnych ( MOVE) i dwóch względnych specyfikacji na równoległobok, zamiast zmiany początku, aby móc korzystać ze wszystkich bezwzględnych specyfikacji. Usunięto 1 bajt niepotrzebnych białych znaków.

BBC BASIC, 150 bajtów

tokenizowany rozmiar pliku 127 bajtów

Pobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/download.html

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.

Wyjaśnienie

Zaczynamy od współrzędnych w prawym górnym rogu i rysujemy romby w grupach po 3. Przed każdą grupą 3 przesuwamy początek (Zachód, Zachód, Zachód, SE, SE SE, NE, NE NE.) Oznacza to, że grupa 3 w prawym górnym rogu znajduje się ostatnia kompletna grupa do wykreślenia, przywracająca początek do pierwotnej lokalizacji. Następnie kontynuujemy i ponownie rysujemy czarno-czerwoną (ale nie zieloną) pierwszą grupę, w sumie 29 rombów.

Bez golfa

  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

Wydajność

wprowadź opis zdjęcia tutaj


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>

Mniej golfa

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

Test

<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 bajtów

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 bajtów

To jest moja pierwsza gra w golfa SVG (lub jakikolwiek znacznik); bądź delikatny!

Zakładane środowisko wyświetlania to przeglądarka internetowa obsługująca SVG z czymkolwiek takim, jak typowy rozmiar okna. Testowałem to w Firefox 50 i Chrome 55.

Jest viewBoxto konieczne, aby spełnić wymaganie 100 pikseli; wysadzenie wszystkich pomiarów odpowiednim współczynnikiem również działałoby, ale zajęłoby więcej bajtów. Nawiasem mówiąc, jest to możliwe, aby zapisać kolejny bajt usuwając w przestrzeni 0 -5wviewBox wartości, ale Firefox nie będzie akceptować to jako ważny (podczas gdy Chrome).

Współczynnik proporcji wynosi 1: 1 zamiast prawdziwego 0,866: 1. Nie jestem pewien, w jaki sposób należy interpretować zasadę „współczynnik 2” (myślę, że oznacza to, że przesada tak ekstremalna, jak 0,433: 1 lub 1,732: 1 jest dopuszczalna), ale jestem prawie pewien, że spełnia to wymaganie tak czy inaczej.

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>

Wynik

Renderowanie powyższego kodu SVG w formacie PNG dla trójkąta Reutersvärd


Myślę, że prawdopodobnie mógłbyś tutaj usunąć nowe wiersze, prawda? IIRC, XML pomija białe znaki w większości kontekstów.

@ ais523: Tak, zapomniałem to zrobić przed opublikowaniem. facepalm To się jednak skończyło. Wciąż pojawiają się nowe linie, dzięki czemu są niejasno czytelne, ale tylko w miejscach (między nazwami tagów a atrybutami), gdzie i tak potrzebna jest jakaś spacja.
Tim Pederick

Twoja interpretacja reguły proporcji jest poprawna
Digital Trauma
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.