Tôi thích cây Pythagore


17

... Vì vậy, đây là một thách thức để làm cho tôi một cái cây.

Tạo một chương trình hoặc hàm gọi là cây, lấy một đối số nguyên duy nhất, N và rút ra một cấp độ N của Pythagore, trong đó cấp 0 chỉ là thân cây.

Mỗi điểm nối của cây nên đặt đỉnh của tam giác tại một điểm ngẫu nhiên trên chu vi (điểm này phải được phân bố đồng đều trên ít nhất 5 điểm cách đều nhau hoặc đồng đều trên toàn bộ hình bán nguyệt).

Tùy chọn cây của bạn có thể là 3d, đầy màu sắc hoặc được thắp sáng theo thời gian trong ngày. Tuy nhiên, đây là mã golf, vì vậy tệp nhỏ nhất sẽ thắng.

EDIT: Tôi sẽ kết thúc cuộc thi và chấp nhận câu trả lời nhỏ nhất khi nó được một tuần tuổi


Xuất hiện dưới dạng trùng lặp: codegolf.stackexchange.com/questions/18785/iêu
DavidC

Sai. Tôi theo một thuật toán khác :)
alexander-brett

Đồng ý. Đủ công bằng. Bạn có thể muốn xem xét gửi lại bài đăng của mình vào "Cây Pythagore".
DavidC

Tôi thích xe lửa? :)
tomsmeding

Câu trả lời:


15

Toán học, 246 234 221 ký tự

g[n_,s_:1]:={p=RandomReal[q=Pi/2],r=##~Rotate~(o={0,0})&,t=Translate}~With~If[n<0,{},Join[#~t~{0,s}&/@(#~r~p&)/@g[n-1,s*Cos@p],t[#,s{Cos@p^2,1+Sin[2p]/2}]&/@(r[#,p-q]&)/@g[n-1,s*Sin@p],{Rectangle[o,o+s]}]]
f=Graphics@g@#&

Đây chắc chắn không phải là cách thanh lịch / ngắn nhất để làm điều này.

Sử dụng: f[8]

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

Và đây là ví dụ đầu ra cho f[6]f[10]tương ứng.

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

Hơi vô dụng:

g[n_, s_:1] := With[{p},
  r = Rotate;
  t = Translate;
  p = RandomReal[q = Pi/2];
  If[n < 0, {},
   Join[
    (t[#, {0, s}] &) /@ (r[#, p, {0, 0}] &) /@ g[n - 1, s*Cos[p]],
    (t[#, s {Cos[p]^2, 1 + Sin[2 p]/2}] &) /@ (r[#, p - q, {0, 0}] &) /@
       g[n - 1, s*Sin[p]],
    {Rectangle[{0, 0}, {s, s}]}
    ]
   ]
  ]
f = Graphics@g[#] &

Điều đó khá ấn tượng. Thật xấu hổ tôi không có toán học để kiểm tra nó - bạn có thể thêm một vài kết quả đầu ra ví dụ không?
alexander-brett

@ ali0sha xem chỉnh sửa
Martin Ender

Bạn không cần Showtrong đó, và Modulecũng không cần thiết.
swish

@swish Cảm ơn bạn đã Showgợi ý, nhưng làm thế nào tôi có thể thoát khỏi Module? Nếu tôi không khai báo pcục bộ, nó sẽ bị ghi đè trong các cuộc gọi đệ quy, vì vậy tôi không thể thực hiện cả hai cuộc gọi giống nhau p, phải không?
Martin Ender

@ m.buettner Có lẽ bạn có thể sử dụng Block, nó ngắn hơn Module.
alephalpha

20

CFDG, 134 ký tự

Điều này không chính xác, bởi vì bạn không thể giới hạn độ sâu đệ quy. Nhưng vấn đề chỉ cần một giải pháp trong cái này . :)

startshape t
c(q)=cos(q/2)^2
d(q)=1+sin(q)/2
p=acos(-1)
shape t{w=rand(p)
SQUARE[x .5 .5]t[trans 0 1 c(w) d(w)]t[trans c(w) d(w) 1 1]}

Kết quả trông như thế này

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

Đối với 46 ký tự khác ( tổng cộng 180 ký tự ), bạn thậm chí có thể tô màu nó trong:

startshape t
c(q)=cos(q/2)^2
d(q)=1+sin(q)/2
p=acos(-1)
shape t{w=rand(p)
SQUARE[x .5 .5 h 25 sat 1 b .2]t[trans 0 1 c(w) d(w) b .08 .8 h 2.2]t[trans c(w) d(w) 1 1 b .08 .8 h 2.2]}

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


Tôi biết điều này không hoàn toàn ontopic, nhưng một phiên bản sẽ trông như thế nào nếu thay vì "tiếng ồn trắng", bạn đã sử dụng "tiếng ồn nâu" làm góc?
ɐɔıʇǝɥʇuʎs

@Synthetica bạn có nghĩa là có nhiều góc hơn 90 ° và ít hơn ở 0 và 180?
Martin Ender

@Synthetica Tương tự như thế này . Tôi không thể thực hiện nhiễu đi bộ ngẫu nhiên thực tế, bởi vì điều đó đòi hỏi phải lấy tham số đầu vào (giá trị ngẫu nhiên cuối cùng), điều chỉnh nó và chuyển nó đi. Điều này sẽ làm cho ngữ pháp trở nên nhạy cảm và do đó không được CFDG hỗ trợ. Tôi hơi làm giả nó, bằng cách đơn giản đẩy các giá trị ngẫu nhiên hơn một chút về phía π / 2 bằng cách sử dụng hàm khối đơn giản trên mẫu ngẫu nhiên.
Martin Ender

Tôi nghĩ rằng liên kết imgur của bạn bị hỏng, và mặc dù tôi rất thích màu sắc và hình dạng, tôi nghĩ rằng tôi phải loại bỏ liên kết này vì lý do bạn đã đề cập
alexander-brett

@ ali0sha bạn nói đúng, đây là liên kết cố định . Không đủ điều kiện này là hoàn toàn công bằng, tôi chỉ muốn chia sẻ Nghệ thuật tự do bối cảnh với một số người và nó có vẻ như là một cách tiếp cận gọn gàng cho vấn đề. ;) ... Chà, tôi vẫn nhận được câu trả lời Mathicala ^^
Martin Ender

4

Bản thảo, 322 270

Chỉnh sửa: Dường như realtimekhông thể được sử dụng làm hạt giống trình tạo ngẫu nhiên thích hợp. Do đó, chúng tôi sẽ sử dụng biến môi trường cho mục đích này và chạy chương trình như thế:

gs -c 20 $RANDOM -f tree.ps

hoặc là

gswin32c -c 20 %RANDOM% -f tree.ps

Bây giờ cây của chúng tôi là ít dự đoán. 14 byte được thêm vào tổng số. Các thay đổi khác: 1) Đối số chương trình hiện được truyền trên dòng lệnh. 2) Không có bộ đếm lặp rõ ràng - kích thước ngăn xếp phục vụ cho mục đích này (góc xoay nhánh bên trái được lưu trữ trên ngăn xếp, để vẽ nhánh phải, sau này). 3) Không có biến được đặt tên cho độ sâu yêu cầu - kích thước ngăn xếp là phần bù của nó, trên ngăn xếp. Nó để lại ở đó trên lối ra, tức là nó không được tiêu thụ.

srand
250 99 translate
50 50 scale
/f{
    count
    dup index div dup 1 le{
        0 exch 0 setrgbcolor
        0 0 1 1 rectfill
        0 1 translate
        rand 5 mod 1 add 15 mul
        gsave
        dup rotate
        dup cos dup scale
        f
        grestore
        dup cos dup dup mul
        exch 2 index sin mul translate
        dup 90 sub rotate
        sin dup scale 1
        f
        pop
    }{pop}ifelse
}def
f

Tôi nghĩ nó khá rõ ràng - trạng thái đồ họa đã được chuẩn bị và fthủ tục được gọi đệ quy cho mỗi cấp độ sâu liên tiếp, hai lần - cho các nhánh 'trái' và 'phải'. Làm việc với hình chữ nhật có 1x1kích thước (xem tỷ lệ gốc) giúp giảm rắc rối khi nhân theo chiều dài cạnh. Góc quay của nhánh trái được chọn ngẫu nhiên - một trong 5 cách chia ngẫu nhiên cách đều nhau được sử dụng - Tôi nghĩ rằng nó ngăn ngừa các trường hợp xấu có thể xảy ra đối với tính ngẫu nhiên đồng nhất.

Nó có thể chậm đối với độ sâu yêu cầu hơn 20 hoặc hơn.

Tiếp theo là phiên bản được đánh gôn, sử dụng mã thông báo nhị phân được mã hóa ASCII (xem câu trả lời của người sử dụng trình duyệt từ chủ đề được liên kết). Lưu ý, cos, sin, randkhông thể sử dụng ký hiệu này.

/${{<920>dup 1 4 3 roll put cvx exec}forall}def srand 250 99<AD>$ 50 50<8B>$/f{count(8X68)$ 1 le{0(>)$ 0<9D>$ 0 0 1 1<80>$ 0 1<AD>$ rand 5 mod 1 add 15<~CecsG2u~>$ cos<388B>$ f(M8)$ cos(88l>)$ 2(X)$ sin<6CAD38>$ 90<A988>$ sin<388B>$ 1 f pop}{pop}(U)$}def f

.

/${{<920>dup 1 4 3 roll put cvx exec}forall}def
srand
250 99<AD>$
50 50<8B>$
/f{
count(8X68)$
1 le{
0(>)$ 0<9D>$
0 0 1 1<80>$
0 1<AD>$
rand 5 mod 1 add 15 
<~CecsG2u~>$
cos<388B>$ 
f
(M8)$
cos(88l>)$
2(X)$ sin<6CAD38>$
90<A988>$ sin<388B>$
1
f
pop
}{pop}(U)$
}def
f

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


Tôi nghĩ phong cách ở đây là các đối số dòng lệnh cần được thêm vào để điểm này đạt 344 ... Tôi phải nói rằng ngay cả theo tiêu chuẩn của codegolf, điều này cũng khá ấn tượng với ngoại hình. Làm thế nào đến nay bạn có thể nhận được nó với mã thông báo nhị phân? Bạn không ở xa Mathicala chắc chắn
alexander-brett

@ ali0sha, -dGraphicsAlphaBitslà cờ cho đầu ra chống bí danh để ngăn các cạnh lởm chởm của các hình vuông lớn hơn, nó có thể được bỏ qua (hoặc 'ẩn' trong ví dụ biến môi trường). Một số người có thể thích nó nhiều hơn mà không có cờ này (lá cây nhận được nhiều 'khối lượng'). Chà, 20 byte đó không quan trọng lắm. Tôi muốn giảm 20-25% khi sử dụng mã thông báo nhị phân được mã hóa ascii (đánh giá bằng câu trả lời chủ đề được liên kết). Có thể giảm 50% mà không cần mã hóa ascii, 2 byte nhị phân cho mỗi mã thông báo tên hệ thống. Sẽ trông giống như một số ngôn ngữ thường chiến thắng;)
user2846289

Tôi nghĩ bạn nên làm điều đó - làm cho nó cạnh tranh hơn một chút ở đây :)
alexander-brett

3

Bản thảo 377B 352B

Tôi cảm thấy bẩn khi viết coffeescript nhưng tôi không thể tìm thấy một gói vẽ đẹp cho python3: - /

Q=(n)->X=(D=document).body.appendChild(C=D.createElement('Canvas')).getContext('2d');C.width=C.height=400;M=Math;T=[[175,400,50,i=0]];S=M.sin;C=M.cos;while [x,y,l,a]=T[i++]
 X.save();X.translate x,y;X.rotate -a;X.fillRect 0,-l,l,l;X.restore();T.push [e=x-l*S(a),f=y-l*C(a),g=l*C(b=M.random()*M.PI/2),d=a+b],[e+g*C(d),f-g*S(d),l*S(b),d-M.PI/2] if i<2**n

Javascript 393B 385B

Hơi đẹp hơn trong javascript và tôi hạnh phúc hơn với vòng lặp for nhưng không có [x, y, z] = Một cú pháp tôi chỉ không thể làm cho nó đủ ngắn để đánh bại coffeescript

function Q(n){X=(D=document).body.appendChild(C=D.createElement('Canvas')).getContext('2d');C.width=C.height=600;M=Math;T=[[275,400,50,i=0]];while(A=T[i++]){X.save();X.translate(x=A[0],y=A[1]);X.rotate(-(a=A[3]));X.fillRect(0,-(l=A[2]),l,l);X.restore();S=M.sin;C=M.cos;i<M.pow(2,n)&&T.push([e=x-l*S(a),f=y-l*C(a),g=l*C(b=M.random()*M.PI/2),d=a+b],[e+g*C(d),f-g*S(d),l*S(b),d-M.PI/2])}}

Phải nói rằng tôi hơi thất vọng, điều này dài gần gấp đôi so với giải pháp toán học: - / xem nó trong hành động: http://jsfiddle.net/FK2NX/3/


Một vài gợi ý: Bạn có thể lưu ít nhất 16 ký tự bằng cách sử dụng dấu chấm phẩy thay vì ngắt dòng trong CoffeeScript. Trong cả hai trường hợp, nếu bất kỳ phương thức nào được Xtrả về X, bạn có thể xâu chuỗi chúng. Và bạn có thể lưu một loạt các ký tự tốt khác bằng cách lưu M.sinM.costrong các biến ký tự đơn.
Martin Ender

Thật không may, các hoạt động bối cảnh không trả lại bối cảnh, điều mà tôi khá buồn. Ngoài ra, bạn có thể đổi tên M.sin thành Ms, nhưng dòng Ms = M.sin chiếm nhiều ký tự hơn mức tiết kiệm ... Tôi sẽ xem xét tước bỏ khoảng trắng.
alexander-brett

Không, bạn chỉ có thể làm s=M.sin.
Martin Ender

Tại sao tôi có thể làm S = M.sin, nhưng không phải R = X.rotate?
alexander-brett

Tôi cho rằng rotatesử dụng this, và sinkhông. Bạn cần phải làm một cái gì đó như thế R=X.rotate.bind(X), nhưng điều đó có lẽ không còn giá trị nữa.
Martin Ender
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.