Penrose Triangle Codegolf


19

Il triangolo Penrose , noto anche come tribar Penrose, o tribù impossibile, è un oggetto impossibile.

L'obiettivo di questa sfida è quello di visualizzare un triangolo Penrose nel minor numero di byte possibile.

Triangolo di Penrose

Fonte: Wikipedia

Regole:

  1. È necessario visualizzare il triangolo Penrose in modo digitale dopo averlo generato.
  2. Devono avere lo stesso aspetto dell'immagine sopra della pagina wiki (fonte sopra) senza mostrare direttamente l'immagine.
  3. La stessa immagine con la stessa combinazione di colori deve essere mostrata con dimensioni di almeno 400x400.
  4. Dovrebbe essere il più preciso possibile.

Buona fortuna e buon divertimento!


2
Penso che questo abbia il potenziale per essere una grande sfida, ma ci sono alcune specifiche che devono essere chiarite come i colori dell'immagine e le sue dimensioni.
Kritixi Lithos,

5
PS! Non scoraggiarti solo perché la sfida è chiusa. Se fosse una cattiva idea sfida, i voti stretti sarebbero accompagnati da voti negativi ... :)
Stewie Griffin,

2
@DigitalTrauma Direi di no. Questo ha molti più dettagli da disegnare.
mbomb007,

1
Ci sarà un grigio o deve essere esattamente lo stesso grigio? Se è quest'ultimo, sarebbe bello fornire l'esatto tono grigio nel testo della sfida.
Martin Ender

1
Le razioni di aspetto sarebbero utili anche se devono essere riprodotte esattamente.
Martin Ender

Risposte:


3

logo, 129 120 byte

Disegna solo i primi 4 lati di ogni forma a L, quindi solleva la penna, si sposta nel punto corrispondente sulla forma a L successiva, abbassa la penna e ne disegna 4 lati. Ogni forma a L prende in prestito 2 lati da quello precedente.

Ultime modifiche: passa dall'area di riempimento nero all'area di riempimento grigio usando fdinvece di setx, e cambia tutti i movimenti da fda bkper salvare un byte su una rotazione di 180 gradi: rt 210-> rt 30, accorcia setpencolora setpc(non documentato nell'intero che sto usando, ma funziona .)

rt 30 repeat 3[pd bk 200 lt 120 bk 360 rt 120 bk 80 rt 60 bk 440 pu rt 139 bk 211 rt 41] setx -2 fill fd 9 setpc 15 fill

logo, 140 byte

Disegna i 6 lati di ogni forma a L, supera l'angolo superiore, quindi ruota di 180 gradi per iniziare il successivo.

rt 30 repeat 3[rt 180 fd 200 lt 120 fd 360 rt 120 fd 80 rt 60 fd 440 rt 120 fd 360 rt 120 fd 200] pu setx -5 fill setx 5 setpencolor 15 fill

correre su http://www.calormen.com/jslogo/#

Si consiglia di fare cs pd setpencolor 0prima di eseguire per garantire lo schermo è chiara, la tartaruga è centrato e rivolto verso l'alto, la penna è giù e su Bianco (impostazioni di default, non necessarie per una marca nuova sessione) ed anche htper nascondere la tartaruga ( stvolontà mostralo di nuovo.)

inserisci qui la descrizione dell'immagine


11

SVG (HTML5), 191 byte

<svg width=498 height=433 stroke=#000><path d=M211,134l38,66L154,365H496L458,431H40 /><path fill=#777 d=M211,2L2,365l38,66L211,134l95,165h76 /><path fill=#FFF d=M496,365L287,2H211L382,299H192


È molto carino!
Steve Bennett,

7

Python 2, 211 201 195 188 175 173 byte

from turtle import*
d="t(120);fd(333);rt(120);fd(67);"
s="color(0,%r);begin_fill();fd(200);l"+d+"rt(60);fd(400);r"+d+"end_fill();fd(133);rt(180);"
exec s%'#fff'+s%0+s%'gray'

Sfortunatamente, execnon è implementato in Trinket, quindi non può essere testato online così com'è. Almeno, non nella versione gratuita. Ho stampato la stringa e incollato come codice per testarlo. Se sei abile con gli script, puoi ridimensionare l'html / css come necessario per ottenere una tela più grande. Fammi sapere se lo fai.

Provalo online : usa una dimensione inferiore poiché l'area di disegno del sito è troppo piccola per 400 px, ma puoi vedere l'intero output.

Ungolfed:

from turtle import*
w=200
def f(n):
  c=255*n/2
  color(0,(c,c,c))
  begin_fill()
  fd(w)
  lt(120)
  fd(5*w/3)
  rt(120)
  fd(w/3)
  rt(60)
  fd(2*w)
  rt(120)
  fd(5*w/3)
  rt(120)
  fd(w/3)
  end_fill()
  fd(2*w/3)
  rt(180)
f(2);f(0);f(1)

Mi chiedo se il valore 255*n/2può essere ridotto fino a 128*npensare che i valori float RGB arrotondino comunque, quindi ci sarebbe un cambiamento nei colori dei pixel?
Albert Renshaw,

@AlbertRenshaw Questo è il codice ungolfed. Vedi il codice sopra quello per la versione golf. Inoltre, questo è Python 2, quindi non sono float, sono numeri interi, poiché la divisione è divisione intera.
mbomb007,

Oh, capisco; Grazie!
Albert Renshaw,

6

PHP, 153 byte

Funzionerà solo se l' short_open_tagimpostazione è abilitata. Il codice sorgente contiene caratteri non stampabili, quindi usa invece un dump esadecimale:

0000000: 3c3f 3d67 7a69 6e66 6c61 7465 2827 b329  <?=gzinflate('.)
0000010: 2e4b 5728 cb4c 2d77 caaf b0d5 3531 3000  .KW(.L-w....510.
0000020: 611d 0b08 5628 2e29 cacf 4eb5 5536 3030  a...V(.)..N.U600
0000030: b0b3 2948 2cc9 5048 b1f5 d535 35d6 3536  ..)H,.PH...55.56
0000040: b7d0 8152 c6a6 263a 8626 c6ba 8626 0660  ...R..&:.&...&.`
0000050: dac2 5cc7 14c8 b234 0452 510a 6999 3939  ..\....4.RQ.i.99
0000060: b6ca 6969 690a 2545 8979 c569 f945 b9b6  ..iii.%E.y.i.E..
0000070: 45f9 2589 25a9 1a06 9a0a fa14 990a 7415  E.%.%.........t.
0000080: a6a9 8646 949a 9b5e 945a 8969 ae2e cc60  ...F...^.Z.i...`
0000090: 7d60 88d9 0100 2729 3b                   }`....');

I dati decompressi si presentano così (con interruzioni di riga aggiunte per leggibilità):

<svg viewBox=-400-400,800,800 stroke=#000>
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=#fff transform=rotate(0) />
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=#000 transform=rotate(120) />
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=grey transform=rotate(-120) />
</svg>

Sebbene i dati SVG non siano del tutto validi, PHP lo utilizza come text/htmlimpostazione predefinita. Senza una dichiarazione doctype, il documento viene gestito in modalità stranezze, il che è molto tollerante.

Per migliorare la compressione, ho suddiviso l'immagine in tre parti a forma di "7" che possono essere disegnate usando <path>elementi quasi identici . L'immagine risultante si espanderà per riempire la finestra. Ecco una schermata da una finestra di 500 × 500 pixel:

Immagine presa SVG del triangolo Penrose da 500 × 500 pixel


5

HTML + JS (ES6), 34 + 306 = 340 byte

Fa uso di un'inclinazione orizzontale di 30 gradi: nel 3 ° argomento della trasformazione della matrice, la tangente di 30 ° è rappresentata come pow(3,-.5).

Ci sono alcuni brutti numeri magici e non corrispondono esattamente alle proporzioni dell'immagine di Wikipedia. Sono certo che esiste un modo più "matematico" di procedere; Qualsiasi aiuto sarebbe apprezzato.

Guarda la versione non giocata su CodePen.

f=

_=>{with(Math)with(C=c.getContext`2d`)for(l=lineTo.bind(C),lineWidth=.01,transform(50,0,0,50,200,224),N=4;N--;rotate(PI*2/3))beginPath(fill(save(fillStyle=N?N>1?'#fff':'#000':'#777'))),transform(-1,0,-pow(3,-.5),-1,3.965,1.71),l(0,0),l(0,6),l(1,6),l(1,1),l(4.616,1),l(5.772,0),closePath(restore(stroke()))}

f()
<canvas id=c width=400 height=400>


4

HTML + CSS, 9 + 315 309 308 = 317 byte

Bordi e inclinazioni a bizzeffe! Testato su Chrome. Guarda la versione non giocata su CodePen .

body{margin:9em}b,:after{position:fixed;transform:rotate(240deg)}b:after{content:'';left:-6.1em;top:-7.95em;width:6em;height:9em;border-left:transparent 2.32em solid;border-right:2em solid;border-bottom:2em solid;transform:skew(30deg);filter:drop-shadow(0 0 .1em)}b{color:#777}b>b{color:#000}b>b>b{color:#fff
<b><b><b>


Soddisfa i requisiti di almeno 400x400px?
sergiol,

Non hai bisogno del finale >, giusto?
Stan Strum,

4

Mathematica 171 byte

w=(v=AnglePath)[s={{9,0},{11,2(b=Pi/3)},{2,b},{9,2b},{5,-2b},{2,b}}];x={w[[5]],2b}~v~s;y={x[[5]],-2b}~v~s;Graphics@{White,EdgeForm[Black],(p=Polygon)@w,Gray,p@x,Black,p@y}

Disegna 3 poligoni usando AnglePath, multipli di curve di 60 gradi e sfruttando il fatto che il punto iniziale per ciascun poligono è il 5 ° punto del poligono precedente.


1
Bel approccio, usando AnglePath.
DavidC,

1

Tcl / Tk, 205

grid [canvas .c -w 402 -he 402]
.c cr p 171 2 237 2 401 337 125 337 156 280 301 280 -f #FFF
.c cr p 2 335 171 2 310 280 250 280 171 121 31 401 -f gray
.c cr p 171 127 34 401 374 401 401 337 127 337 201 188

Triangolo di Penrose

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.