Đại diện đồ họa của Bông tuyết Koch


13

Tạo ra một bông tuyết Koch

Một bông tuyết Koch là một hình tam giác cho mỗi điểm n, một điểm bằng nhau khác được thêm vào giữa mỗi bên: http://en.wikipedia.org/wiki/Koch_snowflower#Properies

Chúng tôi đã có một thử thách cho . Thử thách mới là vẽ một bông tuyết Koch với bất kỳ giữa và .n=4n110

Quy tắc

Những bông tuyết có thể không được mã hóa cứng trong chương trình hoặc trong các tệp - chúng phải được tạo bởi chương trình của bạn.

Chương trình của bạn phải hỗ trợ tất cả các kích cỡ ntừ 1 đến 10.

Số lượng các mặt phải được người dùng nhập vào thông qua tiêu chuẩn.

Bạn phải in một biểu diễn đồ họa của bông tuyết lên màn hình.

Mẫu Bông tuyết Koch có giá trị nbằng 1, 2, 3 và 4 (chỉ các đường màu xanh lá cây cho rõ ràng, không tái tạo chúng):

Bông tuyết Koch

Trong trường hợp có break-breaker, chương trình có số lần upvote cao nhất sẽ giành chiến thắng (cuộc thi pop).


Tôi không hiểu điều này: "Bạn phải sử dụng một hàm để tính toán vị trí đặt pixel. Nếu chương trình của bạn không có chức năng tích hợp cho mục đích này, bạn có thể khấu trừ chi phí thực hiện một điểm từ điểm số của mình. " Pixel nào?
xnor

@xnor Ban đầu nó có nghĩa là tính toán làm thế nào để vẽ bông tuyết trên cơ sở mỗi pixel / ký tự (thử thách ban đầu cũng là một thử thách nghệ thuật ASCII). Hầu hết mọi người có thể sẽ chỉ sử dụng các dòng, vì vậy tôi sẽ loại bỏ điều đó.

Người ta có thể vẽ toàn bộ bông tuyết đầy?
xnor

Tất nhiên. Nhận xét này cần phải dài hơn.

Ngoài ra n=7, bạn không thể thấy các hình tam giác mới được thêm vào trong bông tuyết trên màn hình máy tính. Có "nỗ lực tốt nhất" nào ở đây được không? Có độ phân giải tối thiểu cho các giải pháp dựa trên pixel?
xnor

Câu trả lời:


7

Toán học 72

Region@Line@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]

n = 3

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

Cảm ơn alephalpha.


Công việc tốt. Golf nó bởi hai nhân vật, và bạn có được chiến thắng!

@ Hosch250 Cập nhật, Cảm ơn bạn.
chyanog

Bạn có thể sử dụng AnglePathtrong Mathicala 10.1.
alephalpha

@chyaongGraphics@Line@AnglePath[Nest[Join@@({-1,2,-1,#}&/@#)&,{2,2,2},Input[]-1]Pi/3]
alephalpha

1
@alephalpha 73 ký tự:ListLinePlot@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]
chyanog

15

MATLAB, 119 115

Trong một diễn biến bất thường, tôi thấy rằng chương trình này thực sự hoạt động tốt hơn khi tôi đánh gôn. Đầu tiên, nó trở nên nhanh hơn nhiều do vector hóa. Bây giờ, nó sẽ hiển thị một lời nhắc hữu ích nhắc ~n:~nhở người dùng về số lượng cần nhập!

Dòng mới không phải là một phần của chương trình.

x=exp(i*pi/3);
o='~n:~';
P=x.^o;
for l=2:input(o);
P=[kron(P(1:end-1),~~o)+kron(diff(P)/3,[0 1 1+1/x 2]) 1];
end;
plot(P)

n = 9: n = 9

olà một chuỗi tùy ý bằng với [0 2 4 0]modulo 6. e iπ / 3 được nâng lên cho các lũy thừa này cho các đỉnh của một tam giác đều trong mặt phẳng phức. Đầu tiên kronđược sử dụng để tạo một bản sao của danh sách các điểm với mỗi điểm được nhân đôi 4 lần. ~~olà cách thuận tiện để có được một vectơ gồm 4 cái. Thứ hai diff(P)tìm thấy vectơ giữa mỗi cặp điểm liên tiếp. Bội số của vectơ này (0, 1/3, (1 + e -iπ / 3 ) / 3 và 2/3) được thêm vào từng điểm cũ.


Uhm, bạn có thể giải thích phần nào cách thức hoạt động của mã này không? Tôi nghĩ rằng tôi biết một số Matlab nhưng đây là ... điên rồ ?? =)
flawr

@flawr Tôi đã thêm một vài ghi chú, điều đó có giúp được gì không?
frageum

Cảm ơn rât nhiều! Tôi sẽ giữ thủ thuật lạm dụng chuỗi đó trong tâm trí =)
flawr

9

T-SQL: 686 (không bao gồm định dạng)

Đối với máy chủ SQL 2012+.

Mặc dù điều này sẽ không bao giờ là một ứng cử viên, tôi phải xem liệu tôi có thể hoàn thành nó trong T-SQL không. Đi theo cách tiếp cận bắt đầu với ba cạnh ban đầu, sau đó đệ quy qua từng cạnh và thay thế chúng bằng 4 cạnh cho mỗi cấp. Cuối cùng kết hợp tất cả lại thành một hình học duy nhất cho cấp độ được chỉ định cho @i

DECLARE @i INT=8,@ FLOAT=0,@l FLOAT=9;
WITH R AS(
    SELECT sX,sY,eX,eY,@l l,B,1i
    FROM(VALUES(@,@,@l,@,0),(@l,@,@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),-120),(@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),@,@,-240))a(sX,sY,eX,eY,B)
    UNION ALL
    SELECT a.sX,a.sY,a.eX,a.eY,l/3,a.B,i+1
    FROM R 
        CROSS APPLY(VALUES(sX,sY,sX+(eX-sX)/3,sY+(eY-sY)/3,sX+((eX-sX)/3)*2,sY+((eY-sY)/3)*2))x(x1,y1,x2,y2,x3,y3)
        CROSS APPLY(VALUES(x2+((l/3)*SIN(RADIANS(B-210.))),y2+((l/3)*COS(RADIANS(B-210.)))))n(x4,y4)
        CROSS APPLY(VALUES(x1,y1,x2,y2,B),
            (x3,y3,eX,eY,B),
            (x2,y2,x4,y4,B+60),
            (x4,y4,x3,y3,B-60)
        )a(sX,sY,eX,eY,B)
WHERE @i>i)
SELECT Geometry::UnionAggregate(Geometry::Parse(CONCAT('LINESTRING(',sX,' ',sY,',',eX,' ',eY,')')))
FROM R 
WHERE i=@i

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


Tôi không biết có thể đạt được thuật sĩ như vậy với T-SQL!
Harry Mustoe-Playfair

9

Logo: 95

to w:c ifelse:c=1[fd 2 lt 60][w:c-1 w:c-1 lt 180 w:c-1 w:c-1]end
to k:c repeat 3[w:c rt 180]end

Xác định hàm kvới một tham số mức duy nhất.

Biên tập

Trong trình chỉnh sửa trực tuyến này, http://www.calormen.com/jslogo/, bạn có thể thêm k readwordđể sử dụng dấu nhắc cho đầu vào, nhưng vì một số lý do, lệnh này không hỗ trợ viết tắt tiêu chuẩn rw.

Giải pháp 102 ký tự bên dưới hoạt động trong USBLogo với đầu vào tiêu chuẩn như được chỉ định trong câu hỏi. Tuy nhiên, mã cần thay đổi nhỏ vì UCBLogo có một số trình phân tích cú pháp kỳ lạ. Nó đòi hỏi toendphải ở trong các dòng riêng biệt và không gian trước đó :là bắt buộc nhưng mặt khác :là tùy chọn.

to w c
ifelse c=1[fd 2 lt 60][w c-1 w c-1 lt 180 w c-1 w c-1]
end
to k c
repeat 3[w c rt 180]
end
k rw

Làm thế nào để bạn chạy LOGO?
Beta Decay

@BetaDecay Tôi đã sử dụng cái này: logo.tovengototen.org nhưng đây là cái đầu tiên tôi tìm thấy: calormen.com/jslogo Bạn cũng có thể cài đặt USBLogo
nutki

8

BBC BASIC, 179

REV 1

INPUTn
z=FNt(500,470,0,0,3^n/9)END
DEFFNt(x,y,i,j,a)
LINEx-36*a,y-21*a,x+36*a,y-a*21PLOT85,x,y+a*42IFa FORj=-1TO1FORi=-1TO1z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3)NEXTNEXT
=0

Như trước đây, nhưng trong màu đen và trắng, trong các phiên bản không có người lái (nhưng sắp xếp hợp lý) và golf. Không phải là một người chiến thắng, mặc dù thực tế là làm theo cách đó sẽ tránh được sự cần thiết phải có một điều trị đặc biệt cho n = 1.

  INPUTn
        REM call function and throw return value away to z
  z=FNt(500,470,0,0,3^n/9)
  END

        REM x,y=centre of triangle. a=scale.
        REM loop variables i,j are only passed in order to make them local, not global.
  DEFFNt(x,y,i,j,a)

        REM first draw a line at the bottom of the triangle. PLOT85 then draws a filled triangle,
        REM using the specified point (top of the triangle) and the last two points visited (those used to draw the line.)
  LINEx-36*a,y-21*a,x+36*a,y-21*a
  PLOT85,x,y+42*a

        REM if the absolute magnitude of a is sufficient to be truthy, recurse to the next level.
        REM j determines if the triangle will be upright, inverted or (if j=0) infinitely small.
        REM i loops through the three triangles of each orientation, from left to right.
  IFa FORj=-1TO1 FORi=-1TO1:z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3):NEXT:NEXT

        REM return 0
  =0

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

REV 0

Theo câu trả lời của OP cho @xnor, đầy những bông tuyết là OK. Câu trả lời này được lấy cảm hứng từ bình luận của xnor. Các màu sắc chỉ để cho vui và để hiển thị cách nó được xây dựng. Lấy một hình tam giác (màu đỏ tươi trong trường hợp này) và overplot với 6 hình tam giác 1/3 của cơ sở.

  INPUTn
  z=FNt(500,470,n,1,0,0)
  END

  DEFFNt(x,y,n,o,i,a)
  a=3^n/22
  GCOLn
  MOVEx-36*a,y-o*21*a
  MOVEx+36*a,y-o*21*a
  PLOT85,x,y+o*42*a
  IFn>1FORi=-1TO1:z=FNt(x+24*a*i,y+14*a*(i*i*3-2),n-1,-1,i,a):z=FNt(x+24*a*i,y-14*a*(i*i*3-2),n-1,1,i,a)NEXT
  =0

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


1
Tôi thích cách mà 7 người trong số họ hợp nhất với nhau.

@ hosch250 Thật vậy, tôi dường như đã "phát minh ra" một mảnh nhỏ mới mà hình bóng của nó là một bông tuyết Koch, và nếu bạn xóa phần màu đỏ tươi, bạn sẽ còn lại 6 bông tuyết nhỏ hơn. Phiên bản chơi gôn sẽ chỉ là một hình bóng đen đơn giản, nhưng tôi cũng sẽ để hình ảnh này lên.
Cấp sông St

Bạn có viết nó BBC Basic hay BBC BASIC không? Tôi đi sau nhưng tôi không biết có đúng không ...
Beta Decay

2
@BetaDecay BASIC là từ viết tắt của Mã hướng dẫn tiêu chuẩn / tượng trưng cho người mới bắt đầu. Bit "Standard" gây tranh cãi vì có rất nhiều biến thể. vi.wikipedia.org/wiki/BASIC . Hầu hết các biến thể của BASIC thích phiên bản viết hoa, nhưng theo trang Wikipedia, Visual Basic thích chữ thường. Tôi nghĩ BBC BASIC khi vận chuyển là chữ hoa. Tôi đang sử dụng phiên bản tại bbcbasic.co.uk/bbcwin/bbcwin.html . Đó là chữ hoa trong trang web và IDE, vì vậy tôi muốn nói phiên bản chữ hoa là chính xác hơn. Nhưng tôi không nghĩ nó quan trọng lắm.
Cấp sông St

À được rồi, tôi sẽ tiếp tục với phiên bản chữ hoa
Beta Decay

8

Toán học - 177

r[x_, y_] := Sequence[x, RotationTransform[π/3, x]@y, y]
Graphics@Polygon@Nest[
 ReplaceList[#, {___, x_, y_, ___}  Sequence[x,r[2 x/3 + y/3, 2 y/3 + x/3], y]
  ] &, {{0, 0}, {.5, √3/2}, {1, 0}, {0, 0}}, Input[]]

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

Clip thưởng thay đổi góc của mảnh giữa

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


6

Con trăn 3 - 139

Sử dụng thư viện đồ họa rùa.

from turtle import*
b=int(input())
a=eval(("FR"*3)+".replace('F','FLFRFLF')"*~-b)
for j in a:fd(9/b*("G">j));rt(60*(2-3*("Q">j))*("K"<j))])

Mát mẻ. Tôi thích cách tiếp cận dựa trên chuỗi của bạn trong việc tìm kiếm hình dạng với không quá hai dòng mã! Nhưng bạn không thể kiểm tra "G">j, "Q"<jvà sử dụng fd(9/b)tiết kiệm 3 byte? Hơn nữa, bạn có thể tránh các ifcâu lệnh nhân lên, ví dụ, ("G">j)với đối số 9/bvà đặt tất cả chúng vào một dòng phía sau for. Oh! Sau đó, bạn thậm chí có thể kết hợp rtltsử dụng120*(...)-60*(...)
Falko

Điều này xuất hiện để hiển thị đầu vào bông tuyết Koch + 1. Đầu vào 1 chỉ nên là một hình tam giác như hình trên cho thấy.

@Falko Cảm ơn tất cả sự giúp đỡ đó!
Beta Decay

@ hosch250 Đã chỉnh sửa
Beta Decay

Bây giờ nó không rút ra bất cứ điều gì và đầu vào 1 tạo ra một phép chia cho 0.

4

Python 3, 117 byte

from turtle import*
ht();n=int(input())-1
for c in eval("'101'.join("*n+"'0'*4"+")"*n):rt(60+180*(c<'1'));fd(99/3**n)

Phương pháp:

  • Giải pháp sử dụng đồ họa rùa của Python.
  • ninput - 1
  • Bắt đầu từ chuỗi, 0000chúng tôi tham gia mỗi ký tự của nó với số 101 nlần lặp lại với thủ thuật eval (cảm ơn @xnor vì điều đó).
  • Đối với mỗi ký tự trong chuỗi cuối cùng, chúng ta xoay 60 độ sang phải hoặc 120 độ trái dựa trên giá trị ký tự ( 1hoặc 0) và sau đó di chuyển về phía trước một chiều dài ( 99/3^n) đảm bảo kích thước tương tự cho tất cả ncác.
  • Cái cuối cùng 0trong chuỗi sẽ vô dụng nhưng nó chỉ vẽ lại cùng một dòng trong lần 0rút đầu tiên .

Ví dụ đầu ra cho input = 3:

koch


2

R: 240 175

Bởi vì tôi đang cố gắng xoay quanh R, đây là một phiên bản khác. Có nhiều cách tốt hơn để làm điều này và tôi rất vui khi nhận được con trỏ. Những gì tôi đã làm dường như rất phức tạp.

n=readline();d=c(0,-120,-240);c=1;while(c<n){c=c+1;e=c();for(i in 1:length(d)){e=c(e,d[i],d[i]+60,d[i]-60,d[i])};d=e};f=pi/180;plot(cumsum(sin(d*f)),cumsum(cos(d*f)),type="l")

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


2

Khôn ngoan khi bạn muốn ...

Tôi biết tôi muốn thử thực hiện điều này trong Befunge-98 bằng TURT, nhưng tôi không thể tìm ra cách thực hiện và tôi đã ngồi trên nó trong vài tháng. Bây giờ, chỉ gần đây, tôi đã tìm ra một cách để làm điều đó mà không cần sử dụng tự sửa đổi! Và vì thế...

Befunge-98 với dấu vân tay TURT, 103

;v;"TRUT"4(02-&:0\:0\1P>:3+:4`!*;
>j$;space makes me cry;^
^>1-:01-\:0\:01-\:0
0>I@
^>6a*L
^>ca*R
^>fF

Trước tiên, hãy lấy một số chi tiết triển khai:

  • Tôi đã thử nghiệm điều này bằng CCBI 2.1 , việc triển khai TURT (dấu vân tay đồ họa rùa) tạo ra I"in" hình ảnh thành tệp SVG. Nếu bạn chạy nó trong CCBI mà không có đối số lệnh --turt-line=PATH, nó sẽ xuất hiện dưới dạng tệp có tên CCBI_TURT.svg theo mặc định. Đây là lần gần nhất tôi có thể đến để "in một biểu diễn đồ họa của bông tuyết lên màn hình" với các thông dịch viên Funge có sẵn mà tôi có thể tìm thấy. Có thể một ngày nào đó sẽ có một thông dịch viên tốt hơn ngoài kia có màn hình hiển thị đồ họa cho rùa, nhưng bây giờ ...
  • Cuối cùng, phải có một dòng mới để CCBI chạy nó mà không bị treo (điều này được bao gồm trong số lượng ký tự). Tôi biết, phải không?

Về cơ bản, điều này hoạt động bằng cách sử dụng ngăn xếp như một loại hệ thống L tạm thời và mở rộng nó một cách nhanh chóng. Trên mỗi lượt đi, nếu số trên cùng của ngăn xếp là:

  • -2, sau đó nó in và dừng lại;
  • -1, con rùa quay ngược chiều kim đồng hồ 60 độ;
  • 0, nó quay theo chiều kim đồng hồ 120 độ;
  • 1, nó di chuyển về phía trước (15 pixel ở đây, nhưng bạn có thể thay đổi nó bằng cách sửa đổi ftrên dòng cuối cùng);
  • một số số n là 2 hoặc lớn hơn, sau đó nó được mở rộng trên ngăn xếp thành n-1, -1, n-1, 0, n-1, -1, n-1.

Đối với n = 10, quá trình này mất một thời gian rất dài (một vài phút trên hệ thống của tôi) và kết quả là SVG có kích thước ~ 10 MB và không nhìn thấy được khi xem trong trình duyệt vì bạn không thể điều chỉnh kích thước của bàn chải bằng TURT. IrfanView dường như hoạt động tốt nếu bạn có các plugin phù hợp. Tôi không quá quen thuộc với SVG, vì vậy tôi không biết phương pháp ưa thích nào để xem các tệp đó (đặc biệt là khi chúng thực sự lớn).

Này, ít nhất là nó hoạt động - mà, coi nó là Befunge, là thứ đáng để tự mình biết ơn.


1

Python 2, 127 byte

from turtle import *
def L(l,d=input()-1):
 for x in[1,-2,1,0]:[L(l,d-1),rt(60*x)] if d>0 else fd(l)
for i in'lol':lt(120);L(9)

1
Grats vì đã có bài thứ 50.000 trên đây.
Andrew
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.