Vẽ tam giác của Reutersvärd


33

Đây đối tượng không thểtam giác Reutersvärd của :

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

Vẽ phiên bản của riêng bạn theo các quy tắc sau:

  • Chính xác tổng cộng 9 khối
  • Mỗi bên được tạo thành từ đúng 4 hình khối
  • Các hình khối dường như trùng nhau sao cho đối tượng được hiển thị trên thực tế là một đối tượng không thể
  • 4 màu riêng biệt được sử dụng - một cho nền và 3 cho mỗi mặt của hình khối
  • Trong đầu ra bitmap, hình tam giác đầy đủ phải cao ít nhất 100 pixel và rộng ít nhất 100 pixel
  • Tỷ lệ khung hình: chiều rộng và chiều cao của tam giác đầy đủ không được tắt nhiều hơn hệ số 2
  • Hình tam giác có thể được xoay bởi bất kỳ số lượng nào liên quan đến hình ảnh trên
  • Hình tam giác có thể hoặc không thể được phản ánh liên quan đến hình ảnh trên

Câu trả lời:


14

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

Thật không may, đây là một chút lớn để phù hợp với một câu trả lời.

Dán

Dùng thử trực tuyến

Với -Acờ này xuất ra tệp ppm ASCII trông như sau:

Đầu ra mới

Giải trình

Bạn có thể đã đoán tôi đã không viết điều này bằng tay. Vì vậy, đây là cách tôi đã làm nó:

Lần đầu tiên tôi thực hiện hình ảnh bạn nhìn thấy ở trên từ hình ảnh được cung cấp bởi thử thách. Nó có điểm khác biệt là không có kênh màu nào ở bất kỳ giá trị nào khác hơn 255hoặc 0bằng cách này chúng ta có thể gói nó thành một tệp nhỏ hơn với kênh màu tối đa được đặt thành 1. Sau đó, tôi đã viết một kịch bản python để chơi chương trình Brain-Flak mà giải quyết điều này bằng cách sử dụng một mô-đun tôi đã tự viết có thể tìm thấy ở đây . Nó không được đánh bóng lắm, nó chỉ là một bản hack tôi đã ném vào nhau vì những thứ như thế này. pushlà một hàm trả về mã Brain-Flak hiệu quả để đẩy một số vào ngăn xếp và kolmolà một chương trình giải quyết phức tạp Kolmogorov rất đơn giản, cố gắng tìm một cách hiệu quả để đẩy một chuỗi cụ thể vào ngăn xếp.

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

Điều này khá thú vị và tôi hy vọng sẽ cải thiện câu trả lời của mình


14
Bạn đánh golf hợp pháp 160088 byte? Đó có phải là một kỷ lục?
Neil

Có thể một số câu trả lời đơn nhất có thể đánh bại điều đó
Roman Gräf


Mã Python của bạn hấp dẫn tôi. Có gì value? (Không phải mô-đun này trên PyPI , tôi đoán vậy?) Cái gì kolmo?
Tim Pederick

@TimPederick Xin lỗi về điều đó. Đó là một mô-đun tự viết cho tôi chơi golf Brain-Flak. Tôi sẽ bao gồm một liên kết trong cơ thể.
Phù thủy lúa mì

13

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

Phiên bản dễ đọc hơn:

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}

Dòng 1 định nghĩa một hàm nphủ định tọa độ đầu tiên của một cặp theo thứ tự. Dòng 2 định nghĩa một hàm gtạo ra một tam giác đều (đại khái) có tâm tại điểm cvà chỉ xuống hoặc hướng lên tùy thuộc vào việc s1hay không -1. Dòng 3 định nghĩa plà một mẫu hình bình hành bao gồm một màu và hai hình tam giác, và dòng 4-6 xác định a, bctrở thành ba loại cụ thể khác nhau của hình bình hành mà xuất hiện trong khối.

Dòng 8 định nghĩa một hàm {a@#, b@#, c@#}&vẽ toàn bộ khối lập phương tại điểm #; dòng 9 và 10 áp dụng điều đó cho chín điểm cần thiết để tạo ra tam giác lớn hơn. Điều này tạo ra chín khối, bắt đầu ở phía trên bên phải và đi ngược chiều kim đồng hồ, trong đó những cái sau bao phủ các phần của những cái trước đó. Cuối cùng, dòng 11 vẽ lại bốn hình bình hành (ở phía trên bên phải của hình ảnh) để cuối cùng chúng bao phủ các hình khối sau như chúng được yêu cầu. Đầu ra dưới đây:

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


6
Đợi cái gì Mathicala không tích hợp sẵn cho cái này?
Chấn thương kỹ thuật số

10

HTML + CSS 3D (855 866 byte)

HTML 117 byte + CSS 738 byte

Để giữ z-indexesthứ tự là một chút khó khăn. ;)

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

Tôi đã giữ các dòng mới để dễ đọc hơn. Có lẽ ai đó phát hiện ra tiềm năng để chơi golf nhiều hơn. Tuy nhiên, chúng không được bao gồm trong số byte.

Kết quả

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

Trình diễn jsFiddle

Tự mình thử

Sử dụng Chrome Goole. Các trình duyệt khác có thể có vấn đề vớiz-indexes .

Chỉnh sửa

  • Đã lưu 2 byte bằng cách xóa a-selector trùng lặp , nhờ vào ETHproductions .
  • Đã lưu 9 byte bằng cách loại bỏ một thứ không cần thiết margin:0trên tầng a.

Nó vẫn còn hợp lệ HTML mà không có HEAD/BODYvà đóng thẻ? Tôi biết các trình duyệt có xu hướng bỏ qua lỗi cú pháp và cố gắng hiển thị bất cứ điều gì bạn ném vào chúng, nhưng tôi không nghĩ mã này tuân theo thông số kỹ thuật. (Điều đó nói rằng, giải pháp tuyệt vời!)
Federico Poloni

2
@FedericoPoloni Cảm ơn bạn. Về các điều khoản html|head|body: Chúng có thể được bỏ qua. Hãy xem "Thẻ tùy chọn" , bạn sẽ ngạc nhiên khi có thể bỏ qua bao nhiêu yếu tố và thẻ đóng. Những gì không có trong thông số kỹ thuật nhưng cũng hoạt động là bỏ qua các thẻ đóng của các phần tử a. Tuy nhiên, chúng được đóng chính xác bởi trình duyệt, vì bạn không thể lồng chúng. Cũng theo quan điểm của Code Golf: Mọi thứ " biên dịch " và có đầu ra chính xác đều hợp lệ. ;)
insertusernamehere

9

BBC BASIC, 147 byte

kích thước tập tin tokenised 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 được lưu bằng cách sử dụng một đặc tả tọa độ tuyệt đối ( MOVE) và hai thông số kỹ thuật tương đối trên mỗi hình bình hành, thay vì thay đổi nguồn gốc để có thể sử dụng tất cả các thông số kỹ thuật tuyệt đối. 1 byte khoảng trắng không cần thiết được loại bỏ.

BBC BASIC, 150 byte

kích thước tập tin tokenised 127 byte

Tải xuống thông dịch viên tại http://www.bbcbasic.co.uk/bbcwin/doad.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.

Giải trình

Chúng tôi bắt đầu với tọa độ ở trên cùng bên phải và vẽ các hình thoi theo nhóm 3. Trước mỗi nhóm 3 chúng tôi di chuyển gốc (Tây, Tây, Tây, SE, SE SE, NE, NE NE.) Điều đó có nghĩa là nhóm 3 ở trên cùng bên phải là nhóm hoàn chỉnh cuối cùng được vẽ, đưa nguồn gốc trở lại vị trí ban đầu. Sau đó chúng tôi tiếp tục và vẽ màu đen và đỏ (nhưng không phải màu xanh lá cây) của nhóm đầu tiên một lần nữa, tổng cộng có 29 hình thoi.

Bị đánh cắp

  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

Đầu ra

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


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>

Ít chơi gôn

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

Kiểm tra

<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

Đây là lần đầu tiên tôi chơi golf SVG (hoặc bất kỳ đánh dấu nào, trên thực tế); hãy nhẹ nhàng

Môi trường xem giả định là một trình duyệt web có khả năng SVG với mọi thứ như kích thước cửa sổ thông thường. Tôi đã thử nghiệm nó trong Firefox 50 và trong Chrome 55.

Điều viewBoxcần thiết là phải đáp ứng yêu cầu 100 pixel; làm nổ tung tất cả các phép đo bởi một yếu tố phù hợp cũng sẽ hoạt động nhưng sẽ mất nhiều byte hơn. Ngẫu nhiên, nó có thể tiết kiệm một byte bằng cách loại bỏ các không gian trong 0 -5trong viewBoxgiá trị, nhưng Firefox sẽ không chấp nhận điều này là hợp lệ (trong khi Chrome sẽ).

Tỷ lệ khung hình là 1: 1 thay vì đúng 0,866: 1. Tôi không chắc chắn chính xác quy tắc "yếu tố 2" được hiểu như thế nào dù sao.

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>

Kết quả

Kết xuất PNG của mã SVG ở trên cho Tam giác của Reutersvärd


Tôi nghĩ rằng bạn có thể có thể xóa các dòng mới ở đây, phải không? IIRC, XML bỏ qua khoảng trắng trong hầu hết các bối cảnh.

@ ais523: Vâng, tôi đã quên làm điều đó trước khi đăng nó. facepalm Nó được thực hiện bây giờ, mặc dù. Vẫn có những dòng mới, giữ cho nó có thể đọc được một cách mơ hồ, nhưng chỉ ở những nơi (cụ thể là giữa tên thẻ và thuộc tính), dù sao cũng cần một khoảng trống.
Tim Pederick

Giải thích của bạn về quy tắc tỷ lệ khung hình là chính xác
Chấn thương kỹ thuật số
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.