Disegna il triangolo di Reutersvärd


33

Questo oggetto impossibile è il triangolo di Reutersvärd :

inserisci qui la descrizione dell'immagine

Disegna la tua versione secondo queste regole:

  • Esattamente 9 cubi in totale
  • Ogni lato è composto esattamente da 4 cubetti
  • I cubi sembrano sovrapporsi in modo tale che l'oggetto reso sia in realtà un oggetto impossibile
  • Vengono utilizzati 4 colori distinti, uno per lo sfondo e 3 per ciascuna delle facce dei cubi
  • Nell'output bitmap, l'intero triangolo deve essere alto almeno 100 pixel e largo almeno 100 pixel
  • Proporzioni: la larghezza e l'altezza dell'intero triangolo non devono essere inferiori di oltre un fattore 2
  • Il triangolo può essere ruotato di qualsiasi quantità relativa all'immagine sopra
  • Il triangolo può o non può essere riflesso rispetto all'immagine sopra

Risposte:


14

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

Purtroppo questo è un po 'grande per adattarsi a una risposta.

Pastebin

Provalo online

Con il -Aflag questo genera un file ppm ASCII che ha il seguente aspetto:

Nuovo output

Spiegazione

Potresti aver già indovinato che non l'ho scritto a mano. Quindi ecco come l'ho fatto:

Ho prima creato l'immagine che vedi sopra dall'immagine fornita dalla sfida. Ha la particolarità di non avere un canale di colore che abbia un valore diverso 255o in 0questo modo possiamo racchiuderlo in un file più piccolo con il canale di colore massimo impostato su 1. Ho quindi scritto uno script Python per giocare a golf un programma Brain-Flak che risolve questo usando un modulo che ho scritto io stesso che può essere trovato qui . Non è molto raffinato, è solo un trucco che ho messo insieme per cose come questa. pushè una funzione che restituisce un efficiente codice Brain-Flak per inviare un numero allo stack ed kolmoè un programma Kolmogorov per la risoluzione della complessità molto semplice che tenta di trovare un modo efficiente per inviare una particolare stringa allo stack.

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

È stato abbastanza divertente e spero di migliorare la mia risposta


14
Hai legittimamente giocato a golf 160088 byte? È un record?
Neil,

Forse alcune risposte unarie possono batterlo
Roman Gräf il


Il tuo codice Python mi incuriosisce. Cosa value? (Non questo modulo su PyPI , immagino?) Cosa kolmo?
Tim Pederick,

@TimPederick Mi dispiace per quello. Questo è un modulo che ho scritto per il golf Brain-Flak. Includerò un collegamento nel corpo.
Wheat Wizard

13

Mathematica, 237 byte

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}

Versione più facile da leggere:

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}

La linea 1 definisce una funzione nche nega la prima coordinata di una coppia ordinata. La linea 2 definisce una funzione gche produce un triangolo (approssimativamente) equilatero centrato nel punto ce rivolto verso il basso o verso l'alto a seconda che ssia 1o -1. Linea 3 definisce pper essere un modello parallelogramma composto da un colore e due triangoli, e le linee 4-6 definire a, be cdi essere i tre diversi tipi specifici di parallelogrammi che appaiono nei cubi.

La linea 8 definisce una funzione {a@#, b@#, c@#}&che disegna un intero cubo centrato nel punto #; le linee 9 e 10 lo applicano ai nove punti necessari per rendere il triangolo più grande. Questo produce nove cubi, iniziando in alto a destra e andando in senso antiorario, dove i successivi coprono parti dei precedenti. Infine, la linea 11 ridisegna quattro parallelogrammi (in alto a destra nell'immagine) in modo che finiscano per coprire i cubi successivi come dovrebbero. L'output è inferiore:

inserisci qui la descrizione dell'immagine


6
Aspetta che Mathematica non ha un built-in per questo?
Trauma digitale il

10

HTML + CSS 3D (855 866 byte)

HTML 117 byte + CSS 738 byte

Mantenere z-indexesin ordine era un po 'complicato. ;)

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

Ho mantenuto le nuove righe per una migliore leggibilità. Forse qualcuno individua il potenziale per più golf. Tuttavia, non sono inclusi nel conteggio dei byte.

Risultato

inserisci qui la descrizione dell'immagine

jsFiddle Demo

Provate voi stessi

Usa Goole Chrome. Altri browser potrebbero avere problemi conz-indexes .

modificare

  • Salvato 2 byte rimuovendo il duplicato- aselettore, grazie a ETHproductions .
  • Salvato 9 byte rimuovendo un elemento non necessario margin:0sull'elemento a.

È ancora valido HTML senza HEAD/BODYtag di chiusura? So che i browser tendono a ignorare gli errori di sintassi e provano a visualizzare ciò che si lancia loro, ma non credo che questo codice segua le specifiche. (Detto questo, ottima soluzione!)
Federico Poloni il

2
@FedericoPoloni Grazie. Per quanto riguarda gli html|head|bodyelementi: possono essere omessi. Dai un'occhiata a "Tag opzionali" , rimarrai sorpreso da quanti elementi e tag di chiusura possono essere omessi. Ciò che non è nelle specifiche ma funziona anche è omettere i tag di chiusura degli aelementi. Tuttavia sono chiusi correttamente dal browser, perché non è possibile nidificarli. Anche dal punto di vista del Code Golf: tutto ciò che " compila " e ha l'output corretto è valido. ;)
inserireusernamehere il

9

BBC BASIC, 147 byte

dimensione del file tokenizzata 129 byte

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 byte salvati utilizzando una specifica di coordinate assolute ( MOVE) e due specifiche relative per parallelogramma, invece di modificare l'origine per poter utilizzare tutte le specifiche assolute. Eliminato 1 byte di spazio bianco non necessario.

BBC BASIC, 150 byte

dimensione del file tokenizzata 127 byte

Scarica l'interprete su 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.

Spiegazione

Iniziamo con le coordinate in alto a destra e tracciamo i rombi in gruppi di 3. Prima di ogni gruppo di 3 spostiamo l'origine (Ovest, Ovest, Ovest, SE, SE SE, NE, NE NE.) Ciò significa che il gruppo di 3 in alto a destra è l'ultimo gruppo completo da tracciare, riportando l'origine nella posizione originale. Quindi continuiamo e tracciamo di nuovo il nero e il rosso (ma non il verde) del primo gruppo, per un totale di 29 rombi.

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

Produzione

inserisci qui la descrizione dell'immagine


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>

Meno golf

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

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 byte

Questa è la prima volta che gioco a golf in formato SVG (o qualsiasi markup, in effetti); Sii gentile!

Si presume che l'ambiente di visualizzazione sia un browser Web compatibile con SVG con una dimensione tipica di una finestra. L'ho provato su Firefox 50 e Chrome 55.

Il viewBoxoccorre per soddisfare il requisito 100 pixel; far esplodere tutte le misurazioni con un fattore adatto funzionerebbe, ma richiederebbe più byte. Per inciso, è possibile salvare un altro byte, eliminando lo spazio 0 -5nel viewBoxvalore, ma Firefox non accetterà questo come valido (mentre Chrome volontà).

Le proporzioni sono 1: 1 anziché 0,866: 1 reali. Non sono sicuro di come interpretare la regola del "fattore 2" (penso che significhi che un'esagerazione estrema come 0,433: 1 o 1,732: 1 è accettabile), ma sono abbastanza sicuro che questo soddisfi i requisiti Comunque.

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>

Risultato

Un rendering PNG del precedente codice SVG per il triangolo di Reutersvärd


Penso che potresti probabilmente cancellare le nuove righe qui, vero? IIRC, XML ignora gli spazi bianchi nella maggior parte dei contesti.

@ ais523: Sì, ho dimenticato di farlo prima di pubblicarlo. facepalm Ora è fatto. Ci sono ancora nuove righe, che lo rendono vagamente leggibile, ma solo in luoghi (vale a dire tra nomi di tag e attributi) in cui è comunque necessario uno spazio di qualche tipo.
Tim Pederick,

La tua interpretazione della regola delle proporzioni è corretta
Trauma digitale
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.