Penrose Tam giác


19

Các Penrose tam giác , hay còn gọi là tribar Penrose, hoặc tribar không thể, là một đối tượng không thể.

Mục tiêu trong thử thách này là hiển thị tam giác Penrose theo số byte ít nhất có thể.

Penrose tam giác

Nguồn: Wikipedia

Quy tắc:

  1. Bạn phải hiển thị kỹ thuật số Tam giác Penrose sau khi tạo nó.
  2. Chúng phải trông giống như hình ảnh trên của trang wiki (nguồn ở trên) mà không hiển thị trực tiếp hình ảnh.
  3. Hình ảnh tương tự với cùng tông màu phải được hiển thị ở kích thước tối thiểu 400x400.
  4. Nên càng chính xác càng tốt.

Chúc may mắn và vui vẻ!


2
Tôi nghĩ rằng điều này có khả năng là một thách thức lớn, nhưng có một số thông số kỹ thuật nhất định cần được làm rõ như màu sắc của hình ảnh và kích thước của nó.
Kritixi Lithos

5
Tái bút Đừng nản lòng chỉ vì thử thách đã kết thúc. Nếu đó là một ý tưởng thách thức tồi thì những lá phiếu gần sẽ được kèm theo những lời khen ngợi ... :)
Stewie Griffin

2
@DigitalTrauma Tôi muốn nói là không. Điều đó có nhiều chi tiết để vẽ.
mbomb007

1
Bất kỳ màu xám sẽ làm hoặc nó phải là màu xám chính xác? Nếu đó là phần sau, sẽ rất tuyệt nếu cung cấp tông màu xám chính xác trong văn bản thử thách.
Martin Ender

1
Khẩu phần cũng sẽ hữu ích nếu chúng phải được sao chép chính xác.
Martin Ender

Câu trả lời:


3

logo, 129 120 byte

Chỉ vẽ 4 cạnh đầu tiên của mỗi hình chữ L, sau đó nhấc bút, di chuyển đến vị trí tương ứng trên hình chữ L tiếp theo, hạ bút xuống và vẽ 4 cạnh của nó. Mỗi hình chữ L mượn 2 mặt so với hình trước.

Chỉnh sửa mới nhất: di chuyển từ khu vực fill màu đen để diện tích lấp đầy màu xám sử dụng fdthay vì setx, và thay đổi tất cả phong trào từ fdđể bktiết kiệm một byte trên vòng xoay 180 °: rt 210-> rt 30, rút ngắn setpencolortới setpc(cung cấp tài liệu trong intepreter Tôi đang sử dụng, nhưng nó hoạt động .)

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

Vẽ 6 cạnh của mỗi hình chữ L, ghi đè lên cạnh cuối cùng, sau đó xoay 180 độ để bắt đầu hình tiếp theo.

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

chạy tại http://www.calormen.com/jslogo/#

Bạn nên làm cs pd setpencolor 0trước khi chạy để đảm bảo màn hình rõ ràng, rùa nằm ở giữa và hướng lên trên, bút bị tắt và được đặt thành màu đen (cài đặt mặc định, không bắt buộc cho phiên hoàn toàn mới) và cũng htđể ẩn rùa ( stsẽ hiển thị lại.)

nhập mô tả hình ảnh ở đây


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


Nó thật là tuyệt!
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'

Thật không may, execkhông được triển khai trong Trinket, vì vậy điều này không thể được kiểm tra trực tuyến. Ít nhất, không phải trong phiên bản miễn phí. Tôi đã in ra chuỗi và dán dưới dạng mã để kiểm tra nó. Nếu bạn thông minh với các tập lệnh, bạn có thể thay đổi kích thước html / css khi cần thiết để có được một khung vẽ lớn hơn. Hãy cho tôi biết nếu bạn làm.

Dùng thử trực tuyến - sử dụng kích thước nhỏ hơn vì khung vẽ của trang web quá nhỏ với 400px, nhưng bạn có thể thấy toàn bộ đầu ra.

Ung dung:

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)

Tôi tự hỏi liệu 255*n/2có thể giảm xuống để 128*ntôi nghĩ rằng các giá trị RGB nổi sẽ làm tròn mọi cách để có sự thay đổi về màu pixel không?
Albert Renshaw

@AlbertRenshaw Đó là mã không được mã hóa. Xem mã ở trên cho phiên bản golf. Ngoài ra, đây là Python 2, vì vậy chúng không nổi, chúng là số nguyên, vì phép chia là phép chia số nguyên.
mbomb007

Ồ tôi hiểu rồi; cảm ơn!
Albert Renshaw

6

PHP, 153 byte

Điều này sẽ chỉ hoạt động nếu short_open_tagcài đặt được kích hoạt. Mã nguồn chứa các ký tự không thể in được, do đó, có một kết xuất hex thay thế:

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                   }`....');

Dữ liệu được giải nén trông như thế này (có thêm ngắt dòng cho mức độ dễ đọc):

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

Mặc dù dữ liệu SVG không hoàn toàn hợp lệ, PHP text/htmlmặc định phục vụ nó như mặc định. Không có khai báo doctype, tài liệu được xử lý ở chế độ quirks, điều này rất dễ tha thứ.

Để cải thiện khả năng nén, tôi chia hình ảnh thành ba phần hình chữ "7" có thể được vẽ bằng <path>các phần tử gần giống nhau . Hình ảnh thu được sẽ mở rộng để lấp đầy khung nhìn. Đây là một màn hình lấy từ cửa sổ 500 × 500 pixel:

Ảnh chụp màn hình hình ảnh SVG tam giác Penrose 500 × 500 pixel


5

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

Làm cho việc sử dụng độ nghiêng ngang 30 độ - trong đối số thứ 3 của phép biến đổi ma trận, tiếp tuyến 30 ° được biểu diễn dưới dạng pow(3,-.5).

Có khá nhiều con số ma thuật xấu xí, và nó không hoàn toàn khớp với tỷ lệ của hình ảnh Wikipedia. Tôi chắc chắn có một cách "toán học" hơn để đi về điều này; Bất kỳ trợ giúp sẽ được đánh giá cao.

Xem phiên bản chưa được chỉnh sửa trên 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

Biên giới và xiên galore! Đã thử nghiệm trên Chrome. Xem phiên bản chưa được chỉnh sửa trên 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>


Nó có đáp ứng yêu cầu tối thiểu 400x400px không?
sergiol

Bạn không cần trận chung kết >, phải không?
Stan Strum

4

Toán học 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}

Vẽ 3 đa giác bằng AnglePath, bội số của 60 độ và tận dụng điểm bắt đầu của mỗi đa giác là điểm thứ 5 của đa giác trước đó.


1
Cách tiếp cận đẹp, sử dụng 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

Penrose tam giác

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.