Tạo một cây Giáng sinh có thể mở rộng [đóng]


95

Thử thách của bạn: Làm cây thông Noel. Kích thước phải được lựa chọn theo một số phương thức nhập liệu, nhưng không phải liên quan trực tiếp đến bất kỳ phần nào của cây; tuy nhiên, đầu vào lớn hơn sẽ tạo ra một cây lớn hơn.

Làm thế nào bạn có thể làm cho nó? Bạn có thể tạo cây theo bất kỳ cách nào bạn thích, ngoài việc in ký tự unicode cho cây , chẳng hạn như tạo hình ảnh, nghệ thuật ascii, với các khía cạnh khác, v.v. Dù bạn làm gì, hãy nhớ rằng đây là một , vì vậy sáng tạo.

Câu trả lời có nhiều lượt ủng hộ nhất vào cuối tháng 12, nhưng tôi sẽ chấp nhận câu trả lời khác nếu nó cao hơn


1
Câu hỏi hay;)
Timtech

1
Một trang trí đáng tiếc không bắt buộc!
o0 '.

@Lohoris Tôi nghĩ thật tốt khi họ không bắt buộc. Bằng cách này, mọi người có thể làm những gì họ muốn, và những cây fractal rực rỡ đó là câu trả lời hợp pháp.
Justin

@Quincunx bạn có thể thêm đồ trang trí ngay cả vào cây fractal ...
o0 '.

@Lohoris có, nhưng họ rất nhiều. Tác giả của những cái cây đó có thể thêm đồ trang trí nếu họ muốn, nhưng tôi không muốn nó.
Justin

Câu trả lời:


92

Con trăn

Một cây Giáng sinh fractal sử dụng gói rùa:

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

n = input()*1.

from turtle import *
speed("fastest")
left(90)
forward(3*n)
color("orange", "yellow")
begin_fill()
left(126)
for i in range(5):
    forward(n/5)
    right(144)
    forward(n/5)
    left(72)
end_fill()
right(126)

color("dark green")
backward(n*4.8)
def tree(d, s):
    if d <= 0: return
    forward(s)
    tree(d-1, s*.8)
    right(120)
    tree(d-3, s*.5)
    right(120)
    tree(d-3, s*.5)
    right(120)
    backward(s)
tree(15, n)
backward(n/2)

import time
time.sleep(60)

n là tham số kích thước, cây hiển thị là cho n = 50. Mất một hoặc hai phút để vẽ.


2
Trông thật đáng yêu:)
Soner Gönül 18/12/13

80

JavaScript

enter image description here

Hiển thị cây hoạt hình trực tuyến .

var size = 400;

var canvas = document.createElement('canvas');
canvas.width = size;
canvas.height = size;
document.body.appendChild(canvas);

var ctx = canvas.getContext('2d');

var p3d = [];

var p = [Math.random(), Math.random(), Math.random(), 0];

for (var i = 0; i < 100000; i++) {
    p3d.push([p[0],p[1],p[2],p[3]]);
    var t = Math.random();
    if (t<0.4) {
        _y = 0.4 * p[1];
        _x = 0.1 * p[0];
        _z = 0.6 * p[2];
        var r = Math.floor(3*t/0.4)/3.0;
        var rc = Math.cos(Math.PI*2.0*r);
        var rs = Math.sin(Math.PI*2.0*r);
        p[1] = _x+0.1*r+0.5*_y*_y;
        p[0] = _y*rc+_z*rs;
        p[2] = _z*rc-_y*rs;
        p[3] = 0.2*t + 0.8*p[3];
    } else {
        p[1] = 0.2 + 0.8*p[1];
        p[0] = 0.8 * p[0];
        p[2] = 0.8 * p[2];
        p[3] = 0.2 + 0.8*p[3];
    }
}

var rot = 0.0;

function render() {
    rot = rot + 0.1;
    var rc = Math.cos(rot);
    var rs = Math.sin(rot);

    ctx.strokeStyle='#FF7F00';
    ctx.lineWidth=2;
    ctx.beginPath();
    ctx.moveTo(size/2,size/8);
    ctx.lineTo(size/2,size*15/16);
    ctx.stroke();

    var img = ctx.getImageData(0, 0, size, size);
    for (var j = 0; j < size*size; j++) {
        img.data[4*j+0] = 0.5*img.data[4*j+0];
        img.data[4*j+1] = 0.5*img.data[4*j+1];
        img.data[4*j+2] = 0.5*img.data[4*j+2];
        img.data[4*j+3] = 255;
    }

    for (var i = 0; i < p3d.length; i++) {
        var px = p3d[i][0];
        var py = 0.5 - p3d[i][1];
        var pz = p3d[i][2];
        var col = Math.floor(128.0*p3d[i][3]);

        var _x = rc*px + rs*pz;
        var _z = rc*pz - rs*px;

        var z = 3.0 * size / (_z + 4.0);
        var x = size / 2 + Math.round(_x * z);        
        var y = size / 2 + Math.round(py * z);

        if(x>=0&&y>=0&&x<size&&y<size) {
            img.data[4 * (y * size + x) + 0] = col;
            img.data[4 * (y * size + x) + 1] = 128+col;
            img.data[4 * (y * size + x) + 2] = col;
            img.data[4 * (y * size + x) + 3] = 255;
        }
    }

    ctx.putImageData(img, 0, 0);
}

setInterval(render, 1000 / 30);

Tôi thích nó, nhưng bạn nên thêm một thân cây.
Fels

1
@Fels thêm thân cây
Howard

2
Điều này rất ấn tượng, nhưng những pixel màu xanh lá cây bao quanh cây thì sao? Tôi đã không nhận ra rằng Santa có những chú lùn xanh nhỏ có thể bay. (họ không làm mất đi vẻ đẹp của câu trả lời của bạn, nhưng tôi tự hỏi họ đến từ đâu)
Justin

@Quincunx: Chúng dường như là các điểm mẫu ban đầu từ trước khi lặp lại hội tụ. Bỏ qua 100 điểm đầu tiên được loại bỏ chúng.
Ilmari Karonen

2
Thực sự mát mẻ, nhưng nó không hoàn toàn trông giống như một cây thông Noel. Nó trông giống như một cây gậy với một vài lá dương xỉ gắn liền với nó. Ngoài ra, bạn có thể làm cho chế độ xem từ từ cuộn dọc theo trục y, vì vậy tính năng 3D rõ ràng hơn?
Chàng trai với chiếc mũ

76

Một cây ngôn ngữ Mathicala / Wolfram khác dựa trên câu trả lời của Vitaliy :

PD = .5;
s[t_, f_] := t^.6 - f
dt[cl_, ps_, sg_, hf_, dp_, f_, flag_] :=
    Module[{sv, basePt},
           {PointSize[ps],
            sv = s[t, f];
            Hue[cl (1 + Sin[.02 t])/2, 1, .3 + sg .3 Sin[hf sv]],
            basePt = {-sg s[t, f] Sin[sv], -sg s[t, f] Cos[sv], dp + sv};
            Point[basePt],
           If[flag,
              {Hue[cl (1 + Sin[.1 t])/2, 1, .6 + sg .4 Sin[hf sv]], PointSize[RandomReal[.01]],
               Point[basePt + 1/2 RotationTransform[20 sv, {-Cos[sv], Sin[sv], 0}][{Sin[sv], Cos[sv], 0}]]},
              {}]
          }]

frames = ParallelTable[
                       Graphics3D[Table[{
                                         dt[1, .01, -1, 1, 0, f, True], dt[.45, .01, 1, 1, 0, f, True],
                                         dt[1, .005, -1, 4, .2, f, False], dt[.45, .005, 1, 4, .2, f, False]},
                                        {t, 0, 200, PD}],
                                  ViewPoint -> Left, BoxRatios -> {1, 1, 1.3}, 
                                  ViewVertical -> {0, 0, -1},
                                  ViewCenter -> {{0.5, 0.5, 0.5}, {0.5, 0.55}}, Boxed -> False,
                                  PlotRange -> {{-20, 20}, {-20, 20}, {0, 20}}, Background -> Black],
                       {f, 0, 1, .01}];

Export["tree.gif", frames]

Christmas tree


7
Đây là cái tốt nhất!!
Murta

63

Javascript

Đầu ra của mẫu mã đã cho

Đây là mã golf đầu tiên của tôi!

var a=40,b=8,c=13,o="<div style='font-family:monospace;text-align:center;color:#094'>",w=1,x=0,y="|#|<br>";for(i=1;i<a;i++){for(j=0;j<w;j++){x%c==0?o+="<span style='color:#D00'>O</span>":o+="+";x++;}i%b==0?w-=4:w+=2;o+="<br>";}document.write(o+"<span style='color:#640'>"+y+y+y+"</span></div>");

Nó xuất hiện ở 295 Nhân vật.

Kích thước và trang trí của cây được đặt bởi các biến a, b, c:

  • một tập hợp số lượng hàng trong cây
  • b đặt số lượng hàng giữa các chiều giảm (đặt thấp cho cây gầy, cao cho cây mập). Phải lớn hơn hoặc bằng 3.
  • c đặt số lượng của các trang sức rẻ tiền (đặt 0 cho không, 1 chỉ cho các trang sức rẻ tiền, số cao hơn cho vị trí của các trang sức rẻ tiền)

Nó trông tốt nhất khi a là bội số của b, như trong ví dụ.

Dán vào bàn điều khiển để tạo cây. Có vẻ tốt hơn từ xa!


1
giảm xuống còn 264a=40,b=8,c=13,o="<p style='font:monospace;color:#094' align='center'>",w=1,x=0,y="|#|<br>";for(i=1;i<a;i++){for(j=0;j<w;j++){x%c==0?o+="<b style='color:red'>O</b>":o+="+";x++;}i%b==0?w-=4:w+=2;o+="<br>";}document.write(o+"<b style='color:#640'>"+y+y+y+"</b></p>");
user1886419

4
Bạn đang thực sự chơi golf trong một cuộc thi nổi tiếng? Ồ, tôi sẽ viết mã dễ đọc (dễ viết mã hơn). +1
Justin

7
ôi Bạn đang sử dụng doc.write? Không có +1 từ tôi.
John Dvorak

2
@JanDvorak, tại sao không? Tôi đã nghĩ rằng đây là chơi gôn .....
Pacerier

62

C ++

Hãy làm cho nó theo tinh thần của IOCCC và có mã theo hình dạng của một cây! :CƯỜI MỞ MIỆNG

#include <iostream>
using namespace std;

               int
             main(){
              int a
                ; 
               cin
             >>a;int
           w=a*2+5;for
             (int x=
           0;x<a;++x){
         for(int y=2;y>=
       0;--y){for(int z=0;
           z<a+y-x;++z
        ){cout<<" ";}for(
     int z=0;z<x*2-y*2+5;++z
        ){cout<<".";}cout
      <<endl;}}for(int x=0;
    x<w/5+1;++x){for(int z=0;
  z<w/3+1;++z){cout<<" ";}for(
int z=0;z<w-(w/3+1)*2;z+=1){cout
           <<"#";}cout
           <<endl;;;}}

Lấy một số nguyên làm đầu vào và trả về cây Giáng sinh với nhiều "cấp độ ngăn xếp" đó. Ví dụ: đầu vào của

5

Trả về:

       .
      ...
     .....
      ...
     .....
    .......
     .....
    .......
   .........
    .......
   .........
  ...........
   .........
  ...........
 .............
      ###
      ###
      ###
      ###

ví dụ đầu ra?
John Dvorak

32
Mã trông giống như một cây chrismas hơn là đầu ra ...
Denys Séguret

2
@dystroy cho bản ghi, các hướng dẫn không nói đó là đầu ra phải làm mờ cây.
Pierre Arlaud

4
@ArlaudPierre: Nhưng, kích thước phải được điều chỉnh, điều này là không thể chỉ với mã nguồn. Tôi có thể tạo một chương trình xuất mã chương trình theo hình cây Giáng sinh tạo ra cây Giáng sinh thực sự , nhưng tôi tưởng tượng rằng nó sẽ cực kỳ khó khăn nếu không dùng đến việc chèn dấu chấm phẩy đi lạc khắp nơi.
Joe Z.

1
Nếu bạn đặt một cây *ở đầu cây (mã nguồn), bạn sẽ có +1 của tôi.
Fabricio

61

Javascript

Quasirealistic hoàn toàn 3D thủ tục tạo cây linh sam.

Tính năng: cấu hình mở rộng với nhiều tùy chọn cấu hình hơn có trong mã; một thân cây ngoằn ngoèo; phân nhánh; hoạt hình tăng trưởng; luân chuyển của một cây phát triển đầy đủ.

Không có tính năng: jQuery, Underscore.js hoặc bất kỳ thư viện nào khác; phụ thuộc phần cứng - chỉ cần hỗ trợ canvas; mã lộn xộn (ít nhất đó là ý định)

Trang trực tiếp: http://fiddle.jshell.net/honnza/NMva7/show/

Chỉnh sửa trang: http://jsfiddle.net/honnza/NMva7/

ảnh chụp màn hình:

cây linh sam

HTML:

<canvas id=c width=200 height=300 style="display:none"></canvas>
<div id=config></div>

Javascript:

var TAU = 2*Math.PI,
    deg = TAU/360,

    TRUNK_VIEW      = {lineWidth:3, strokeStyle: "brown", zIndex: 1},
    BRANCH_VIEW     = {lineWidth:1, strokeStyle: "green", zIndex: 2},
    TRUNK_SPACING   = 1.5,
    TRUNK_BIAS_STR  = -0.5,
    TRUNK_SLOPE     = 0.25,
    BRANCH_LEN      = 1,
    BRANCH_P        = 0.01,
    MIN_SLOPE       = -5*deg,
    MAX_SLOPE       = 20*deg,
    INIT_SLOPE      = 10*deg,
    MAX_D_SLOPE     =  5*deg,
    DIR_KEEP_BIAS   = 10,
    GROWTH_MSPF     = 10, //ms per frame
    GROWTH_TPF      = 10, //ticks per frame
    ROTATE_MSPF     = 10,
    ROTATE_RPF      = 1*deg; //radians per frame

var configurables = [
//    {key: "TRUNK_SPACING", name: "Branch spacing", widget: "number",
//     description: "Distance between main branches on the trunk, in pixels"},
    {key: "TRUNK_BIAS_STR", name: "Branch distribution", widget: "number",
     description: "Angular distribution between nearby branches. High values tend towards one-sided trees, highly negative values tend towards planar trees. Zero means that branches grow in independent directions."},
    {key: "TRUNK_SLOPE", name: "Trunk slope", widget: "number",
     description: "Amount of horizontal movement of the trunk while growing"},
    {key: "BRANCH_P", name: "Branch frequency", widget: "number",
     description: "Branch frequency - if =1/100, a single twig will branch off approximately once per 100 px"},
    {key: "MIN_SLOPE", name: "Minimum slope", widget: "number", scale: deg,
     description: "Minimum slope of a branch, in degrees"},
    {key: "MAX_SLOPE", name: "Maximum slope", widget: "number", scale: deg,
     description: "Maximum slope of a branch, in degrees"},
    {key: "INIT_SLOPE", name: "Initial slope", widget: "number", scale: deg,
     description: "Angle at which branches leave the trunk"},
    {key: "DIR_KEEP_BIAS", name: "Directional inertia", widget: "number",
     description: "Tendency of twigs to keep their horizontal direction"},
    {get: function(){return maxY}, set: setCanvasSize, name: "Tree height",
     widget:"number"}
    ];

var config = document.getElementById("config"),
    canvas = document.getElementById("c"),
    maxX   = canvas.width/2,
    maxY   = canvas.height,
    canvasRatio = canvas.width / canvas.height,
    c;

function setCanvasSize(height){
    if(height === 'undefined') return maxY;
    maxY = canvas.height = height;
    canvas.width = height * canvasRatio;
    maxX = canvas.width/2;
x}

var nodes = [{x:0, y:0, z:0, dir:'up', isEnd:true}], buds = [nodes[0]],
    branches = [],
    branch,
    trunkDirBias = {x:0, z:0};

////////////////////////////////////////////////////////////////////////////////

configurables.forEach(function(el){
    var widget;
    switch(el.widget){
        case 'number':
            widget = document.createElement("input");
            if(el.key){
                widget.value = window[el.key] / (el.scale||1);
                el.set = function(value){window[el.key]=value * (el.scale||1)};
            }else{
                widget.value = el.get();
            }
            widget.onblur = function(){
                el.set(+widget.value);
            };
            break;
        default: throw "unknown widget type";
    }
    var p = document.createElement("p");
    p.textContent = el.name + ": ";
    p.appendChild(widget);
    p.title = el.description;
    config.appendChild(p);
});
var button = document.createElement("input");
button.type = "button";
button.value = "grow";
button.onclick = function(){
    button.value = "stop";
    button.onclick = function(){clearInterval(interval)};
    config.style.display="none";
    canvas.style.display="";
    c=canvas.getContext("2d");
    c.translate(maxX, maxY);                
    c.scale(1, -1);
    interval = setInterval(grow, GROWTH_MSPF);
}
document.body.appendChild(button);
function grow(){
    for(var tick=0; tick<GROWTH_TPF; tick++){
        var budId = 0 | Math.random() * buds.length,
            nodeFrom = buds[budId], nodeTo, branch,
            dir, slope, bias

        if(nodeFrom.dir === 'up' && nodeFrom.isEnd){
            nodeFrom.isEnd = false; 
            rndArg = Math.random()*TAU;
            nodeTo = {
                x:nodeFrom.x + TRUNK_SPACING * TRUNK_SLOPE * Math.sin(rndArg),
                y:nodeFrom.y + TRUNK_SPACING,
                z:nodeFrom.z + TRUNK_SPACING * TRUNK_SLOPE * Math.cos(rndArg), 
                dir:'up', isEnd:true}
            if(nodeTo.y > maxY){
                console.log("end");
                clearInterval(interval);
                rotateInit();
                return;
            }
            nodes.push(nodeTo);
            buds.push(nodeTo);
            branch = {from: nodeFrom, to: nodeTo, view: TRUNK_VIEW};
            branches.push(branch);
            renderBranch(branch);
        }else{ //bud is not a trunk top
            if(!(nodeFrom.dir !== 'up' && Math.random() < BRANCH_P)){
                buds.splice(buds.indexOf(nodeFrom), 1)
            }
            nodeFrom.isEnd = false; 
            if(nodeFrom.dir === 'up'){
                bias = {x:trunkDirBias.x * TRUNK_BIAS_STR,
                        z:trunkDirBias.z * TRUNK_BIAS_STR};
                slope = INIT_SLOPE;
            }else{
                bias = {x:nodeFrom.dir.x * DIR_KEEP_BIAS,
                        z:nodeFrom.dir.z * DIR_KEEP_BIAS};
                slope = nodeFrom.slope;
            }
            var rndLen = Math.random(),
                rndArg = Math.random()*TAU;
            dir = {x: rndLen * Math.sin(rndArg) + bias.x,
                   z: rndLen * Math.cos(rndArg) + bias.z};
            var uvFix = 1/Math.sqrt(dir.x*dir.x + dir.z*dir.z);
            dir = {x:dir.x*uvFix, z:dir.z*uvFix};
            if(nodeFrom.dir === "up") trunkDirBias = dir;
            slope += MAX_D_SLOPE * (2*Math.random() - 1);
            if(slope > MAX_SLOPE) slope = MAX_SLOPE;
            if(slope < MIN_SLOPE) slope = MIN_SLOPE;
            var length = BRANCH_LEN * Math.random();
            nodeTo = {
                x: nodeFrom.x + length * Math.cos(slope) * dir.x,
                y: nodeFrom.y + length * Math.sin(slope),
                z: nodeFrom.z + length * Math.cos(slope) * dir.z,
                dir: dir, slope: slope, isEnd: true
            }
            //if(Math.abs(nodeTo.x)/maxX + nodeTo.y/maxY > 1) return;
            nodes.push(nodeTo);
            buds.push(nodeTo);
            branch = {from: nodeFrom, to: nodeTo, view: BRANCH_VIEW};
            branches.push(branch);
            renderBranch(branch);
        }// end if-is-trunk
    }// end for-tick
}//end func-grow

function rotateInit(){
    branches.sort(function(a,b){
        return (a.view.zIndex-b.view.zIndex);
    });
    interval = setInterval(rotate, ROTATE_MSPF);
}

var time = 0;
var view = {x:1, z:0}
function rotate(){
    time++;
    view = {x: Math.cos(time * ROTATE_RPF),
            z: Math.sin(time * ROTATE_RPF)};
    c.fillStyle = "white"
    c.fillRect(-maxX, 0, 2*maxX, maxY);
    branches.forEach(renderBranch);
    c.stroke();
    c.beginPath();
}

var prevView = null;
function renderBranch(branch){
    if(branch.view !== prevView){
        c.stroke();
        for(k in branch.view) c[k] = branch.view[k];
        c.beginPath();
        prevView = branch.view;
    }
    c.moveTo(view.x * branch.from.x + view.z * branch.from.z,
             branch.from.y);
    c.lineTo(view.x * branch.to.x + view.z * branch.to.z,
             branch.to.y);
}

2
Tôi biết bởi vì câu trả lời này chỉ có một nhận xét: bởi vì nó khiến mọi người không nói nên lời.
Caridorc

49

Bash

Đầu ra mẫu:

Cây thông ASCII

Kích thước cây (tức là số dòng) được truyền trên dòng lệnh và được giới hạn ở các giá trị từ 5 trở lên. Hình ảnh trên được sản xuất từ ​​lệnh ./xmastree.sh 12. Đây là mã nguồn:

#!/bin/bash
declare -a a=('.' '~' "'" 'O' "'" '~' '.' '*')
[[ $# = 0 ]] && s=9 || s=$1
[[ $s -gt 5 ]] || s=5
for (( w=1, r=7, n=1; n<=$s; n++ )) ; do
  for (( i=$s-n; i>0; i-- )) ;  do
    echo -n " "
  done
  for (( i=1; i<=w; i++ )) ; do
    echo -n "${a[r]}"
    [[ $r -gt 5 ]] && r=0 || r=$r+1
  done
  w=$w+2
  echo " "
done;
echo " "

Điều đó rất đẹp.
Đại bàng

42

Tuyên bố miễn trừ trách nhiệm: điều này dựa trên cây Giáng sinh LaTeX của tôi, lần đầu tiên được đăng ở đây: https://tex.stackexchange.com/a/87921/8463

Đoạn mã sau sẽ tạo ra một cây chrismtas, với các trang trí ngẫu nhiên. Bạn có thể thay đổi cả kích thước của cây và hạt ngẫu nhiên để tạo ra một cây khác.

Để thay đổi hạt giống, hãy sửa đổi giá trị bên trong \pgfmathsetseed{\year * 6}thành bất kỳ giá trị số nào khác (giá trị mặc định sẽ tạo ra một cây mới mỗi năm)

Để thay đổi kích thước của cây, hãy sửa đổi thành order=10lớn hơn hoặc nhỏ hơn tùy thuộc vào kích thước của cây bạn muốn.

Ví dụ. order=11:

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

order=8

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

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc, lindenmayersystems,shapes,decorations,decorations.shapes}
\begin{document}

\def\pointlistleft{}
\def\pointlistright{}
\pgfmathsetseed{\year * 6}

\makeatletter
\pgfdeclarelindenmayersystem{Christmas tree}{
    \symbol{C}{\pgfgettransform{\t} \expandafter\g@addto@macro\expandafter\pointlistleft\expandafter{\expandafter{\t}}}
    \symbol{c}{\pgfgettransform{\t} \expandafter\g@addto@macro\expandafter\pointlistright\expandafter{\expandafter{\t}}}
    \rule{S -> [+++G][---g]TS}
    \rule{G -> +H[-G]CL}
    \rule{H -> -G[+H]CL}
    \rule{g -> +h[-g]cL}
    \rule{h -> -g[+h]cL}
    \rule{T -> TL}
    \rule{L -> [-FFF][+FFF]F}
}
\makeatother

\begin{tikzpicture}[rotate=90]
\draw [color=green!50!black,l-system={Christmas tree,step=4pt,angle=16,axiom=LLLLLLSLFFF,order=10,randomize angle percent=20}] lindenmayer system -- cycle;

\pgfmathdeclarerandomlist{pointsleft}{\pointlistleft}
\pgfmathdeclarerandomlist{pointsright}{\pointlistright}
\pgfmathdeclarerandomlist{colors}{{red}{blue}{yellow}}

\foreach \i in {0,1,...,5}
{
    \pgfmathrandomitem{\c}{pointsleft}
    \pgfsettransform{\c}
    \pgfgettransformentries{\a}{\b}{\c}{\d}{\xx}{\yy}
    \pgfmathrandomitem{\c}{pointsright}
    \pgfsettransform{\c}
    \pgfgettransformentries{\a}{\b}{\c}{\d}{\XX}{\YY}
    \pgftransformreset

    \pgfmathsetmacro\calcy{min(\yy,\YY)-max((abs(\yy-\YY))/3,25pt)}

    \draw[draw=orange!50!black, fill=orange!50, decorate, decoration={shape backgrounds, shape=star, shape sep=3pt, shape size=4pt}, star points=5] (\xx,\yy) .. controls (\xx,\calcy pt) and (\XX,\calcy pt) .. (\XX,\YY);
}

\foreach \i in {0,1,...,15}
{
    \pgfmathrandomitem{\c}{pointsleft}
    \pgfsettransform{\c}
    \pgftransformresetnontranslations
    \draw[color=black] (0,0) -- (0,-4pt);
    \pgfmathrandomitem{\c}{colors}
    \shadedraw[ball color=\c] (0,-8pt) circle [radius=4pt];
}

\foreach \i in {0,1,...,15}
{
    \pgfmathrandomitem{\c}{pointsright}
    \pgfsettransform{\c}
    \pgftransformresetnontranslations
    \draw[color=black] (0,0) -- (0,-4pt);
    \pgfmathrandomitem{\c}{colors}
    \shadedraw[ball color=\c] (0,-8pt) circle [radius=4pt];
}

\end{tikzpicture}
\end{document}

Tôi muốn nói rằng điều này dựa trên cây của Stefan Kottwitz, lần đầu tiên được đăng ở đây . Nói rằng nó dựa trên cây của bạn làm cho có vẻ như bạn đã viết tất cả mã cho nó, điều đó không đúng. Một số người khác đã viết hầu hết các mã cho cây thực tế.
Chàng trai với chiếc mũ

@RyanCarlson ý tưởng sử dụng hệ thống lindenmayer làm cơ sở để trang trí là ý tưởng của tôi và nếu bạn kiểm tra cẩn thận cả hai mã bạn có thể thấy, phần mã lindenmayer của mã được thiết kế lại cũng có các phần bổ sung (như một gốc cho cây, mà bản gốc thiếu). Bên cạnh đó, tôi không quên tham khảo bản gốc, nơi mọi người có thể kiểm tra các tài liệu tham khảo (bao gồm cả tài liệu tham khảo Peitgen và Saupe, người có thể là người đầu tiên phác thảo phương trình của cây)
SztupY

34

Befunge 93

Đây là một cây chưa được trang trí:

&::00p20pv
vp010    <
v              p00<
>:0`!#v_" ",1-
v,"/"$<
>10g:2+v
vp01   <
>:0`!#v_" ",1-
v,"\"$<
>91+,00g1-::0`!#v_^
v        *2+1g02<
>:0`!#v_"-",1-
v g02$<
>91+,v
v    <
>:0`!#v_" ",1-
"||"$ <@,,

Đầu ra mẫu, đầu vào là 10:

          /\
         /  \
        /    \
       /      \
      /        \
     /          \
    /            \
   /              \
  /                \
 /                  \
----------------------
          ||

Hãy thêm một số trang trí:

&::00p20pv
vp010    <
v              p00<
>:0`!#v_" ",1-
v,"/"$<
>10g:2+v             >"O" v
vp01   <            >?v
>:0`!#v_           >?>>" ">,1-
v,"\"$<             >?<
>91+,00g1-::0`!#v_^  >"*" ^
v        *2+1g02<
>:0`!#v_"-",1-
v g02$<
>91+,v
v    <
>:0`!#v_" ",1-
"||"$ <@,,

Đầu ra mẫu:

          /\
         /O \
        /    \
       /   ** \
      /     *  \
     /    **   O\
    /* O* *  *   \
   / O      O     \
  / *  **   O*     \
 /   *OO   *  OOO * \
----------------------
          ||

32

HTML và CSS

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Scalable christmas tree</title>
<style>
body {
  background-color: skyblue;
  background-size: 11px 11px, 21px 21px, 31px 31px;
  background-image: radial-gradient(circle at 5px 5px,white,rgba(255,255,255,0) 1px), radial-gradient(circle at 5px 5px,white,rgba(255,255,255,0) 2px), radial-gradient(circle at 5px 5px,white 1px,skyblue 1px);
}
div {
  float: left;
  border-style: solid;
  border-color: transparent;
  border-bottom-color: green;
  border-width: 20px;
  border-top-width: 0;
  border-bottom-width: 30px;
  border-bottom-left-radius: 35%;
  border-bottom-right-radius: 35%;
  box-shadow: red 0 15px 5px -13px;
  animation-name: light;
  animation-duration: 1s;
  animation-direction: alternate;
  animation-iteration-count: infinite;
  -webkit-animation-name: light;
  -webkit-animation-duration: 1s;
  -webkit-animation-direction: alternate;
  -webkit-animation-iteration-count: infinite;
}
section {
  float: left;
}
header {
  color: yellow;
  font-size: 30px;
  text-align: center;
  text-shadow: red 0 0 10px;
  line-height: .5;
  margin-top: 10px;
  animation-name: star;
  animation-duration: 1.5s;
  animation-direction: alternate;
  animation-iteration-count: infinite;
  -webkit-animation-name: star;
  -webkit-animation-duration: 1.5s;
  -webkit-animation-direction: alternate;
  -webkit-animation-iteration-count: infinite;
}
footer {
  float: left;
  width: 100%;
  height: 20px;
  background-image: linear-gradient(to right, transparent 45%, brown 45%, #600 48%, #600 52%, brown 55%, transparent 55%);
}
:target {
  display: none;
}
@keyframes star {
  from { text-shadow: red 0 0 3px; }
  to { text-shadow: red 0 0 30px; }
}
@-webkit-keyframes star {
  from { text-shadow: red 0 0 3px; }
  to { text-shadow: red 0 0 30px; }
}
@keyframes light {
  from { box-shadow: red 0 15px 5px -13px; }
  to { box-shadow: blue 0 15px 5px -13px; }
}
@-webkit-keyframes light {
  from { box-shadow: red 0 15px 5px -13px; }
  to { box-shadow: blue 0 15px 5px -13px; }
}
</style>
</head>
<body>
<section>
<header>&#x2605;</header>
<div id="0"><div id="1"><div id="2"><div id="3"><div id="4"><div id="5"><div id="6"><div id="7"><div id="8"><div id="9"><div id="10"><div id="11"><div id="12"><div id="13"><div id="14"><div id="15"><div id="16"><div id="17"><div id="18"><div id="19"><div id="20"><div id="21"><div id="22"><div id="23"><div id="24">
</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
<footer></footer>
</section>
</body>
</html>

Kích thước từ 1 đến 25 được hỗ trợ - chỉ cần thêm kích thước vào URL dưới dạng định danh phân đoạn.

Hoạt động trong Chrome, Explorer và Firefox. Trong Opera là xấu, nhưng phần mở rộng hoạt động.

Truy cập mẫu:

http://localhost/xmas.html#5

cây thông giáng sinh cỡ 5

Truy cập mẫu:

http://localhost/xmas.html#15

cây thông giáng sinh cỡ 15

Xem trực tiếp:

http://dabblet.com/gist/8026898

(Chế độ xem trực tiếp không chứa CSS tiền tố của nhà cung cấp và bao gồm các liên kết để thay đổi kích thước.)


1
+1 Tôi thích ý tưởng sử dụng :targetđể mở rộng quy mô đầu ra :-)
squossish ossifrage 14/12/13

32

Java

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 *
 * @author Quincunx
 */
public class ChristmasTree {
    public static double scale = 1.2;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ChristmasTree();
            }
        });
    }

    public ChristmasTree() {
        try {
            URL url = new URL("http://imgs.xkcd.com/comics/tree.png");
            BufferedImage img = ImageIO.read(url);

            JFrame frame = new JFrame();
            frame.setUndecorated(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

            BufferedImage result = 
                    new BufferedImage((int)(img.getWidth() * scale), 
                            (int) (img.getHeight() * scale), 
                            BufferedImage.TYPE_INT_RGB);
            Graphics2D g = (Graphics2D) result.getGraphics();
            g.drawRenderedImage(img, AffineTransform.getScaleInstance(scale, scale));

            JImage image = new JImage(result);
            image.setToolTipText("Not only is that terrible in general, but you "
                    + "just KNOW Billy's going to open the root present first, "
                    + "and then everyone will have to wait while the heap is "
                    + "rebuilt.");
            frame.add(image);
            frame.pack();
            frame.setVisible(true);

        } catch (IOException ex) {

        }
    }

    class JImage extends JPanel implements MouseListener {

        BufferedImage img;

        public JImage(){
            this(null);
        }
        public JImage(BufferedImage image){
            img = image;
            setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
            addMouseListener(this);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, WIDTH, WIDTH, this);
        }

        public void setImage(BufferedImage image) {
            img = image;
            repaint();
        }

        @Override
        public void mouseClicked(MouseEvent me) {
            System.exit(0);
        }

        @Override
        public void mousePressed(MouseEvent me) {

        }

        @Override
        public void mouseReleased(MouseEvent me) {

        }

        @Override
        public void mouseEntered(MouseEvent me) {

        }

        @Override
        public void mouseExited(MouseEvent me) {

        }
    }
}

Để thay đổi kích thước, thay đổi scale thành một số giá trị kép khác (giữ nguyên khoảng 1 nếu bạn muốn xem bất cứ điều gì).

Đầu ra mẫu (cho 1.0 theo tỷ lệ, quá lười để chụp ảnh màn hình, vì vậy chỉ cần đăng những gì nó làm):

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

Chương trình lấy hình ảnh này từ internet, thay đổi kích thước theo scale, sau đó đặt nó vào một cửa sổ không được trang trí nơi nó được hiển thị. Nhấp vào cửa sổ sẽ đóng chương trình. Ngoài ra, văn bản mẹo công cụ là có, nhưng liên kết thì không.


3
Đây không phải là "vẽ" bất cứ điều gì.
Ông trùm

@Mrchief Thử thách không phải là vẽ một cái gì đó; đó là làm một cái cây Đây là tạo một cái cây, bằng cách chụp ảnh
Justin

2
Bạn đã tự tạo ra hình ảnh? Không. Bạn chỉ cần tải nó từ đâu đó. Câu hỏi không phải là tải xuống một hình ảnh và thay đổi kích thước nó. Kiểm tra các câu trả lời khác và bạn sẽ hiểu những gì OP thực sự yêu cầu.
Ông trùm

10
@Mrchief Bạn có để ý ai đã viết OP không? Đây là một trong nhiều giải pháp khả thi tôi đang tìm kiếm khi tôi hỏi câu hỏi này.
Justin

3
Hà! Đập vào đầu! Vì bài đăng của riêng bạn, tôi không thấy nhiều lý do để tranh luận, ngoài việc bày tỏ ý kiến ​​của tôi rằng điều này không giống với mã của bạn "làm" một cái gì đó (giống như các câu trả lời còn lại làm). Cũng giống như tải xuống một bộ phim không giống như làm một bộ phim.
Ông trùm

28

TI-89 cơ bản

Chỉ vì tôi muốn nhìn thấy Cây Giáng sinh trên máy tính của mình. Tôi sẽ gõ nó ở đây vì nó xuất hiện trên máy tính của tôi.

:tree()
:Prgm
:
:Local size
:Prompt size
:
:Local d,x,y,str,orn
:size→x
:0→y
:{" "," "," "," "," "," "," "," ","°","∫","θ","O","©"}→orn
:size→d
:
:While d≥0
: d-1→d
: ""→str
: 
: While x≥0
:  str&" "→str
:  x-1→x
: EndWhile
: 
: str&"/"→str
: 2*y→x
:
: While x>0
:  str&elementAt(orn,rand(colDim(list▶mat(orn))))→str
:  x-1→x
: EndWhile
: 
: str&"\"→str
: Disp str
: y+1→y
: d→x
:EndWhile
:
:""→str
:
:For x,1,2*(size+2)
: str&"-"→str
:EndFor
:Disp str
:
:""→str
:For x,1,size+1
: str&" "→str
:EndFor
:str&"||"→str
:Disp str
:
:EndPrgm


:elementAt(l,i)
:Func
:Local m
:list▶mat(l)→m
:
:Local cd
:colDim(m)→cd
:
:If i>cd or i≤0 Then
: 1/0
:Else
: If i=cd Then
:  Return sum(mat▶list(subMat(m,1,i))) - sum(mat▶list(subMat(m,1,i+1)))
: Else
:  Return sum(mat▶list(subMat(m,1,i))) - sum(mat▶list(subMat(m,1,i+1)))
: EndIf
:EndIf
:EndFunc

Điều này hoạt động giống như câu trả lời Befunge của tôi, nhưng tôi sử dụng các đồ trang trí khác nhau. Có, elementAtchức năng lặp đi lặp lại của chức năng của tôi làm chậm chương trình vì có nhiều chuyển đổi giữa danh sách và ma trận, nhưng khi tôi viết nó trước đó, tôi đã quyết định không chỉnh sửa nó. Ngoài ra, tôi đã học được trong khi gõ câu trả lời này để ©đưa ra nhận xét (tôi nghĩ rằng nó trông giống như@ , nhưng đó là một nhân vật khác). Không bao giờ biết nó là gì trước đây.

Đầu ra mẫu:

size?
7
        /\
       / O\
      /∫   \
     / ©  ∫°\
    / θ ∫   ∫\
   /°  °  ©  ©\
  /O  ∫  O °   \
 / θ  °©  ∫ O  θ\
------------------
        ||

Tôi yêu những cái đó; chúng trông giống như những cây kẹo.


Phiên bản này là gì?
SuperJedi224

@ SuperJedi224 Tôi đã thêm nó vào câu trả lời
Justin

27

Ngôn ngữ Wolfram ( Mathicala )

Như đã thảo luận tại chủ đề Reddit nổi tiếng: t * sin (t) Cây Giáng sinh

PD = .5; s[t_, f_] := t^.6 - f;
 dt[cl_, ps_, sg_, hf_, dp_, f_] := 
    {PointSize[ps], Hue[cl, 1, .6 + sg .4 Sin[hf s[t, f]]], 
     Point[{-sg s[t, f] Sin[s[t, f]], -sg s[t, f] Cos[s[t, f]], dp + s[t, f]}]};

 frames = ParallelTable[

    Graphics3D[Table[{dt[1, .01, -1, 1, 0, f], dt[.45, .01, 1, 1, 0, f], 
                      dt[1, .005, -1, 4, .2, f], dt[.45, .005, 1, 4, .2, f]}, 
 {t, 0, 200, PD}],

     ViewPoint -> Left, BoxRatios -> {1, 1, 1.3}, ViewVertical -> {0, 0, -1}, 
    ViewCenter -> {{0.5, 0.5, 0.5}, {0.5, 0.55}}, Boxed -> False, Lighting -> "Neutral", 
    PlotRange -> {{-20, 20}, {-20, 20}, {0, 20}}, Background -> Black],

   {f, 0, 1, .01}];

Export["tree.gif", frames]

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


Nơi bạn đặt kích thước và nó ảnh hưởng đến cây được tạo ra như thế nào?
manatwork 28/12/13

2
@manatwork đây về cơ bản là đồ thị t*sin(t)như tôi đã nói trong bài. Vì vậy, âm mưu cho t lớn hơn sẽ chỉ tạo ra một cây lớn hơn:Table[..., {t, 0, 200, PD}]
Vitaliy Kaurov

24

Bash với Bc và ImageMagick

#!/bin/bash

size="${1:-10}"

width=$(( size*25 ))
height=$(( size*size+size*10 ))

cos=( $( bc -l <<< "for (i=0;i<3.14*2;i+=.05) c(i)*100" ) )
sin=( $( bc -l <<< "for (i=0;i<3.14*2;i+=.05) s(i)*100" ) )
cos=( "${cos[@]%.*}" )
sin=( "${sin[@]%.*}" )

cos=( "${cos[@]/%-/0}" )
sin=( "${sin[@]/%-/0}" )

snow=()
needle=()
decor=()
for ((i=2;i<size+2;i++)); do
  for ((j=3;j<=31;j++)); do
    (( x=width/2+i*10+cos[62-j]*i*10/100 ))
    (( y=i*i+sin[j]*i*5/100 ))

    for ((e=0;e<i;e++)); do
      needle+=(
        -draw "line $x,$y $(( x+RANDOM%i-i/2 )),$(( y+RANDOM%i-i/2 ))"
        -draw "line $(( width-x )),$y $(( width-x+RANDOM%i-i/2 )),$(( y+RANDOM%i-i/2 ))"
      )
    done

    (( RANDOM%2 )) && (( x=width-x ))
    snow+=(
      -draw "circle $x,$(( y-i/2 )) $(( x+i/3 )),$(( y-i/2+i/3 ))"
    )

    (( RANDOM%10 )) || decor+=(
      -fill "rgb($(( RANDOM%5*20+50 )),$(( RANDOM%5*20+50 )),$(( RANDOM%5*20+50 )))"
      -draw "circle $x,$(( y+i )) $(( x+i/2 )),$(( y+i+i/2 ))"
    )
  done
done

flake=()
for ((i=0;i<width*height/100;i++)); do
  flake+=(
    -draw "point $(( RANDOM%width )),$(( RANDOM%height ))"
  )
done

convert \
  -size "${width}x$height" \
  xc:skyblue \
  -stroke white \
  -fill white \
  "${snow[@]}" \
  -blur 5x5 \
  "${flake[@]}" \
  -stroke brown \
  -fill brown \
  -draw "polygon $(( width/2 )),0 $(( width/2-size )),$height, $(( width/2+size )),$height" \
  -stroke green \
  -fill none \
  "${needle[@]}" \
  -stroke none \
  -fill red \
  "${decor[@]}" \
  x:

Chạy mẫu:

bash-4.1$ ./xmas.sh 5

Đầu ra mẫu:

cây thông giáng sinh cỡ 5

Chạy mẫu:

bash-4.1$ ./xmas.sh 15

Đầu ra mẫu:

cây thông giáng sinh cỡ 15


23

C

Đầu ra mẫu cho độ sâu = 4, zoom = 2.0

Cây

Câu trả lời này sử dụng một cách tiếp cận khá khác với các câu trả lời khác. Nó tạo ra một cấu trúc cây bằng cách phân nhánh đệ quy. Mỗi nhánh được đại diện bởi một tập hợp các vòng tròn. Và cuối cùng, hàm chính lấy mẫu các vòng tròn và điền vào các ký tự khi các vòng tròn được đáp ứng. Vì nó được thực hiện bằng cách lấy mẫu một cảnh (như dò tia), nên về bản chất nó có thể mở rộng được. Nhược điểm là tốc độ, vì nó đi qua toàn bộ cấu trúc cây cho mỗi "pixel"!

Đối số dòng lệnh đầu tiên kiểm soát độ sâu của nhánh. Và thang đo kiểm soát thứ hai (2 có nghĩa là 200%).

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define PI 3.14159265359

float sx, sy;

float sdCircle(float px, float py, float r) {
    float dx = px - sx, dy = py - sy;
    return sqrtf(dx * dx + dy * dy) - r;
}

float opUnion(float d1, float d2) {
    return d1 < d2 ? d1 : d2;
}

#define T px + scale * r * cosf(theta), py + scale * r * sin(theta)

float f(float px, float py, float theta, float scale, int n) {
    float d = 0.0f;
    for (float r = 0.0f; r < 0.8f; r += 0.02f)
        d = opUnion(d, sdCircle(T, 0.05f * scale * (0.95f - r)));

    if (n > 0)
        for (int t = -1; t <= 1; t += 2) {
            float tt = theta + t * 1.8f;
            float ss = scale * 0.9f;
            for (float r = 0.2f; r < 0.8f; r += 0.1f) {
                d = opUnion(d, f(T, tt, ss * 0.5f, n - 1));
                ss *= 0.8f;
            }
        }

    return d;
}

int ribbon() {
    float x = (fmodf(sy, 0.1f) / 0.1f - 0.5f) * 0.5f;
    return sx >= x - 0.05f && sx <= x + 0.05f;
}

int main(int argc, char* argv[]) {
    int n = argc > 1 ? atoi(argv[1]) : 3;
    float zoom = argc > 2 ? atof(argv[2]) : 1.0f;
    for (sy = 0.8f; sy > 0.0f; sy -= 0.02f / zoom, putchar('\n'))
        for (sx = -0.35f; sx < 0.35f; sx += 0.01f / zoom) {
            if (f(0, 0, PI * 0.5f, 1.0f, n) < 0.0f) {
                if (sy < 0.1f)
                    putchar('.');
                else {
                    if (ribbon())
                        putchar('=');
                    else
                        putchar("............................#j&o"[rand() % 32]);
                }
            }
            else
                putchar(' ');
        }
}

2
Tôi nghĩ thật an toàn khi nói đây là câu trả lời ấn tượng nhất về mặt kỹ thuật cho câu hỏi này cho đến nay.
Diễn viên đóng thế

20

Toán học ASCII

Tôi thực sự thích nghệ thuật ASCII, vì vậy tôi thêm một câu trả lời rất khác - đặc biệt là nó quá ngắn trong Mathicala:

Column[Table[Row[RandomChoice[{"+", ".", "*", "~", "^", "o"}, k]], {k, 1, 35, 2}], 
Alignment -> Center]

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

Và bây giờ với sự tinh tế hơn một chút, cây ASCII động có thể mở rộng. Theo dõi sát sao - cây cũng đang thay đổi - tuyết dính vào cành cây rồi rơi xuống ;-)

DynamicModule[{atoms, tree, pos, snow, p = .8, sz = 15},

 atoms = {
   Style["+", White],
   Style["*", White],
   Style["o", White],
   Style[".", Green],
   Style["~", Green],
   Style["^", Green],
   Style["^", Green]
   };

 pos = Flatten[Table[{m, n}, {m, 18}, {n, 2 m - 1}], 1];

 tree = Table[RandomChoice[atoms, k], {k, 1, 35, 2}];

 snow = Table[
   RotateLeft[ArrayPad[{RandomChoice[atoms[[1 ;; 2]]]}, {0, sz}, " "],
     RandomInteger[sz]], {sz + 1}];

 Dynamic[Refresh[

   Overlay[{

     tree[[Sequence @@ RandomChoice[pos]]] = RandomChoice[atoms];
     Column[Row /@ tree, Alignment -> Center, Background -> Black],

     Grid[
      snow = 
       RotateRight[
        RotateLeft[#, 
           RandomChoice[{(1 - p)/2, p, (1 - p)/2} -> {-1, 0, 1}]] & /@
          snow
        , {1, 0}]]

     }, Alignment -> Center]

   , UpdateInterval -> 0, TrackedSymbols -> {}]
  ]
 ]

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


Đẹp một. Bạn điều chỉnh kích thước ở đâu? Đó có phải là 35 trong Tablecác tham số không?
thao tác

@manatwork có 35 trong Bảng. Cảm ơn;)
Vitaliy Kaurov

19

Tôi đã thực hiện điều này cho một thử thách trên / r / Dailyprogrammer , (không chắc việc sử dụng lại mã có trái với tinh thần / quy tắc của việc này không) nhưng:

Brainfuck. Lấy làm đầu vào một số (chiều dài của hàng lá dưới cùng) và hai ký tự. Một không gian giữa mỗi.

Ví dụ nhập: 13 = +

Ví dụ đầu ra:

      +
     +++
    +++++
   +++++++
  +++++++++
 +++++++++++
+++++++++++++
     ===

Mã số:

                   >
                  ,--
                 -----
                -------
               ---------
              ---------[+
             +++++++++++++
            +++++++++++++++
           +++<[>>++++++++++
          <<-]>--------------
         ---------------------
        -------------[<+>-]>[<<
       +>>-]<,------------------
      --------------],>,,>>++++[<
     ++++++++>-]++++++++++>+<<<<<-
    [>>>>>>+>+<<<<<<<--]>>>>>>>[<<<
   <<<<++>>>>>>>-]<<<<<<<[>>>>>>[<<<
  .>>>>+<-]>[<+>-]<<[<<<.>>>>>+<<-]>>
 [<<+>>-]<<<.>>><-<++<<<<<--]>>...>>>-
--[>+<<<<..>>>--]<.>>[<<<.>>>>+<-]<<<<<
                ...>>>.

1
Cuối cùng, một câu trả lời cân não!
Pharap

16

Chế biến

Cây Giáng sinh fractal ban đầu. Vị trí chuột Y xác định kích thước, sử dụng các phím mũi tên lên và xuống để thay đổi số lượng thế hệ.

int size = 500;

int depth = 10;

void setup() {
  frameRate(30);
  size(size, size, P2D);
}

void draw() {
  background(255);
  tree(size/2.0, size, 0.0, radians(0), radians(108), (size - mouseY)/3, depth);
  tree(size/2.0, size, 0.0, radians(108), radians(0), (size - mouseY)/3, depth);
}

void keyPressed() {
  if(keyCode == UP) depth++;
  if(keyCode == DOWN) depth--;
  depth = max(depth, 1);
}

void tree(float posX, float posY, float angle, float forkRight, float forkLeft, float length, int generation) {
  if (generation > 0) {
    float nextX = posX + length * sin(angle);
    float nextY = posY - length * cos(angle);

    line(posX, posY, nextX, nextY);

    tree(nextX, nextY, angle + forkRight, forkRight, forkLeft, length*0.6, generation - 1);
    tree(nextX, nextY, angle - forkLeft,  forkRight, forkLeft, length*0.6, generation - 1);
  }
}

Thật là một cây thông Noel đáng yêu, bạn không nghĩ sao, ma?

Or, if you prefer a fuller tree:

int size = 500;

int depth = 10;

void setup() {
  frameRate(30);
  size(size, size, P2D);
}

void draw() {
  background(255);
  tree(size/2.0 - 5, size, 0.0, 0.0, (size - mouseY)/3, depth);
}

void keyPressed() {
  if(keyCode == UP) depth++;
  if(keyCode == DOWN) depth--;
  depth = max(depth, 1);
}

void tree(float posX, float posY, float angle, float fork, float length, int generation) {
  if (generation > 0) {
    float nextX = posX + length * sin(angle);
    float nextY = posY - length * cos(angle);

    line(posX, posY, nextX, nextY);

    tree(nextX, nextY, angle + fork + radians(108), fork, length*0.6, generation - 1);
    tree(nextX, nextY, angle - fork,                fork, length*0.6, generation - 1);
    tree(nextX, nextY, angle + fork - radians(108), fork, length*0.6, generation - 1);
  }
}

Tôi cực kỳ thất vọng khi ai đó đánh bại tôi để đăng một cây fractal mặc dù tôi đã đi trước họ trong ý tưởng và thực sự bắt đầu làm việc với nó: /


14

Hồng ngọc

((1..20).to_a+[6]*4).map{|i|puts ('*'*i*2).center(80)}

Chúc mừng năm mới

Bạn có thể tùy chỉnh đầu ra bằng cách thay đổi *.
Đối với cây xanh:((1..20).to_a+[6]*4).map{|i|puts "\e[32m"+('*'*i*2).center(80)}

Cách tiếp cận 2 (Cây Xmas trông không giống mũi tên)

((1..6).to_a+(3..9).to_a+(6..12).to_a+[3]*4).map{|i|puts "\e[32m"+('*'*i*4).center(80)}

Chúc mừng năm mới

Cách tiếp cận 3

((1..20).to_a+[6]*4).map{|i|puts' '*(20-i)+'*'*(2*i-1)}

2
Đây là một mũi tên, sau đó là một cây Giáng sinh!
klingt.net

4
@ klingt.net * hơn.
NARKOZ

Thời gian để thắp sáng cây Giáng sinh.
NARKOZ

Và nơi bạn chỉ định kích thước?
manatwork

@manatwork trong phạm vi. 1..20, 1..6v.v.
NARKOZ

14

Đồ họa rùa

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

Dựa trên tính chất của xoắn ốc Euler .

Mã số:

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

Thang đo được xác định bởi kích thước bước ( move forward by: 6). Một phiên bản tương tác có sẵn ở đây .

PS Lấy cảm hứng từ câu hỏi này .


Đâu là "khả năng mở rộng"? Ngoài ra, điều này là tuyệt vời!
Justin

@Quincunx Bạn có thể thay đổi quy mô bằng cách thay đổi move forward by 6. Ví dụ, 10sẽ tạo ra một cây lớn hơn. Trên thực tế không có đầu vào trong "ngôn ngữ" này (hoặc toàn bộ mã có thể được coi là đầu vào;)).
ybeltukov

14

Chế biến

Tôi đã tạo ra máy tạo cây này bằng Hệ thống L và Rùa.

Một cái cây

mã:

//My code, made from scratch:
final int THE_ITERATIONS = 7;
final float SCALE = 1;
final int ANGLE = 130;
final int SIZE = 4;

final int ITERATIONS = THE_ITERATIONS - 1;

int lineLength;

String lSystem;
ArrayList<Turtle> turtles;

int turtleIndex;
int lSystemIndex;

void setup()
{
  size(320, 420);
  background(255);
  translate(width / 2, height - 70);

  lineLength = ITERATIONS * 2 + 2;

  lSystem = "[-F][+F]F";

  turtles = new ArrayList<Turtle>(ITERATIONS + 1);
  lSystemIndex = 0;

  calculateLSystem();
  println(lSystem);

  turtles.add(new Turtle(0, 0));

  doTurtles();
  save("Tree.png");
}

void doTurtles()
{
  while(lSystemIndex < lSystem.length())
  {
    print("\"" + lSystem.charAt(lSystemIndex) + "\": ");
    if(lSystem.charAt(lSystemIndex) == 'F')
    {
      turtleForward();
    }
    else if(lSystem.charAt(lSystemIndex) == '[')
    {
      lineLength -= 2;
      addTurtle();
      println(turtles.size());
    }
    else if(lSystem.charAt(lSystemIndex) == ']')
    {
      lineLength += 2;
      removeTurtle();
      println(turtles.size());
    }
    else if(lSystem.charAt(lSystemIndex) == '+')
    {
      turtleRight();
    }
    else if(lSystem.charAt(lSystemIndex) == '-')
    {
      turtleLeft();
    }
    lSystemIndex++;
  }
}

void addTurtle()
{
  turtles.add(new Turtle(turtles.get(turtles.size() - 1)));
}

void removeTurtle()
{
  turtles.remove(turtles.size() - 1);
}

void turtleLeft()
{
  turtles.get(turtles.size() - 1).left(ANGLE + random(-5, 5));
}

void turtleRight()
{
  turtles.get(turtles.size() - 1).right(ANGLE + random(-5, 5));
}

void turtleForward()
{
  print(turtles.get(turtles.size() - 1) + ": ");
  strokeWeight(min(lineLength / SIZE, 1));
  stroke(5 + random(16), 90 + random(16), 15 + random(16));
  if(turtles.size() == 1)
  {
    strokeWeight(lineLength / 2);
    stroke(100, 75, 25);
  }
  turtles.get(turtles.size() - 1).right(random(-3, 3));
  turtles.get(turtles.size() - 1).forward(lineLength);
}

void calculateLSystem()
{
  for(int i = 0; i < ITERATIONS; i++)
  {
    lSystem = lSystem.replaceAll("F", "F[-F][+F][F]");
  }
  lSystem = "FF" + lSystem;
}

void draw()
{

}

//——————————————————————————————————————————————————————
// Turtle code, heavily based on code by Jamie Matthews
// http://j4mie.org/blog/simple-turtle-for-processing/
//——————————————————————————————————————————————————————

class Turtle {
  float x, y; // Current position of the turtle
  float angle = -90; // Current heading of the turtle
  boolean penDown = true; // Is pen down?
  int lineLength;

  // Set up initial position
  Turtle (float xin, float yin) {
    x = xin;
    y = yin;
    //lineLength = lineLengthin;
  }

  Turtle (Turtle turtle) {
    x = turtle.x;
    y = turtle.y;
    angle = turtle.angle;
    //lineLength = turtle.lineLength - 1;
  }

  // Move forward by the specified distance
  void forward (float distance) {
    distance = distance * SIZE * random(0.9, 1.1);
    // Calculate the new position
    float xtarget = x+cos(radians(angle)) * distance;
    float ytarget = y+sin(radians(angle)) * distance;

    // If the pen is down, draw a line to the new position
    if (penDown) line(x, y, xtarget, ytarget);
    println(x + ", " + y + ", " + xtarget + ", " + ytarget);
    // Update position
    x = xtarget;
    y = ytarget;
  }

  // Turn left by given angle
  void left (float turnangle) {
    angle -= turnangle;
    println(angle);
  }

  // Turn right by given angle
  void right (float turnangle) {
    angle += turnangle;
    println(angle);
  }
}

2
Đúng! Một hệ thống L!
luser droog 18/12/13

1
Tôi đồng ý về việc nó thực tế nhất :)
Timtech

@Timtech Tôi không đồng ý. Tôi nghĩ rằng đây là thực tế thứ hai, sau câu trả lời Javascript của Jan Dvorak . Ý tôi là, hãy nhìn vào những cái kim đó (trên cái này)! Tất cả chúng được nhóm lại với nhau trong các mẫu mà tôi chưa từng thấy trên một cây thường xanh. Tuy nhiên, cây của Jan trông rất giống cây linh sam đối với tôi.
Justin

1
@Quincunx Tôi đã bỏ lỡ cái đó. Tuy nhiên, cái này có vẻ khá tốt.
Timtech

@Quincunx Cây của Jan và Howard, cũng rất tuyệt, nhưng không hẳn là hoàn toàn thực tế . Jan thậm chí thừa nhận rằng cây chỉ là "quasirealistic". - RyanCarlson 10 giây trước
The Guy with The Hat

12

JavaScript (chạy trên bất kỳ trang nào trong bảng điều khiển)

Tôi đã chơi golf nhưng sau đó quyết định không chơi, vì vậy bạn có thể thấy có TẤN số ma thuật: P

// size
s = 300

document.write('<canvas id=c width=' + s + ' height=' + s + '>')
c = document.getElementById('c').getContext('2d')
c.fillStyle = '#0D0'
for (var i = s / 3; i <= s / 3 * 2; i += s / 6) {
  c.moveTo(s / 2, s / 10)
  c.lineTo(s / 3, i)
  c.lineTo(s / 3 * 2, i)
  c.fill()
}
c.fillStyle = '#DA0'
c.fillRect(s / 2 - s / 20, s / 3 * 2, s / 10, s / 6)

Kết quả cho s = 300:

ảnh chụp màn hình

s = 600:

ảnh chụp màn hình


2
Bạn sẽ trang trí cây? :-)
Justin

1
@Quincunx Có thể, tôi có thể làm việc sau đó :)
Doorknob

2
GAH! Dấu chấm phẩy ở đâu?!
Andrew Larsson


10

Ngôn ngữ nhà sản xuất trò chơi

sp_tree

sp_tree

Tạo sự kiện của cây

image_speed=0
size=get_integer("How big do you want me to be?#Integer between 1 and 10, please!",10)
image_index=size-1

Phòng, số 402 x 599

Cây được đặt tại (0,0)

Thêm! Bạn có thể thay đổi kích thước cây Giáng sinh sau lần nhập đầu tiên bằng các phím 0-9.


8

AppleScript + SE Trả lời

Thực tế đã chọn điều này một cách tình cờ trong khi chỉnh sửa một câu trả lời trong câu hỏi này. Đi hình.

Sử dụng điều này bằng cách chạy mã, nhập số của bạn mà bạn muốn, vuốt qua bài SE và nhấp vào trường văn bản. Điều này khai thác thực tế là trích dẫn ngăn xếp.

tell application "System Events"
    set layers to (display dialog "" default answer "")'s text returned as number
    delay 5
    repeat layers times
        keystroke ">"
    end repeat
end tell

Đầu ra (đầu vào 50):

>


6

Cây FORTRAN trang trí

    character(len=36) :: f='/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\'
    character(len=18) :: g = '                  '
    character(len=14) :: p = ".x$.+oO+oO.#,~"
    character(len=10) :: q

    n = iargc()
    if (n /= 1) then 
        k = len(g)
    else
        call getarg(1,q) 
        read(q,*) k
    end if
    l = modulo(k,len(g))+1
    do i=1,l
        j = mod(i,len(p)-1)+1
        print *,g(1:l-i),p(j:j),f(1:2*i),p(j+1:J+1)
        end do
    print *,g(1:l-1),f(1:4)
    end

Cây có phạm vi kích thước hạn chế, nhưng nó tin rằng nó phản ánh chính xác cuộc sống của hầu hết các cây Giáng sinh.

Từ cây sơ sinh:

$./tree
 x/\$
 /\/\

Cây thanh thiếu niên:

$./tree 6
       x/\$
      $/\/\.
     ./\/\/\+
    +/\/\/\/\o
   o/\/\/\/\/\O
  O/\/\/\/\/\/\+
 +/\/\/\/\/\/\/\o
       /\/\

Dành cho người lớn:

$./tree 17
                  x/\$
                 $/\/\.
                ./\/\/\+
               +/\/\/\/\o
              o/\/\/\/\/\O
             O/\/\/\/\/\/\+
            +/\/\/\/\/\/\/\o
           o/\/\/\/\/\/\/\/\O
          O/\/\/\/\/\/\/\/\/\.
         ./\/\/\/\/\/\/\/\/\/\#
        #/\/\/\/\/\/\/\/\/\/\/\,
       ,/\/\/\/\/\/\/\/\/\/\/\/\~
      ./\/\/\/\/\/\/\/\/\/\/\/\/\x
     x/\/\/\/\/\/\/\/\/\/\/\/\/\/\$
    $/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\.
   ./\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\+
  +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\o
 o/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\O
                  /\/\    

5

Java

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;

import javax.imageio.ImageIO;


public class ChristmasTree {
    static class Point{
        Point(int a,int b){x=a;y=b;}
        int x,y;
        double distance(Point o){
            int dx=x-o.x;
            int dy=y-o.y;
            return Math.sqrt(dx*dx+dy*dy);
        }
    }
    static int siz;
    static BufferedImage b;
    static Random r=new Random();
    public static void main(String[]args) throws IOException{

        if(args.length==0){
            siz=(new Scanner(System.in)).nextInt();
        }else{
            siz=Integer.parseInt(args[0]);
        }
        b=new BufferedImage(20*siz,30*siz,BufferedImage.TYPE_INT_RGB);
        Graphics2D g=(Graphics2D)b.getGraphics();
        g.setColor(new Color(140,70,20));
        int h=b.getHeight();h*=0.4;
        for(int i=(int)(0.4*b.getWidth());i<(int)(0.6*b.getWidth());i++){
            if(r.nextDouble()<0.3){
                g.drawLine(i,b.getHeight(),i+r.nextInt(2)-1,h);
            }
        }
        for(int i=h;i<b.getHeight();i++){
            if(r.nextDouble()<0.3){
                g.drawLine((int)(0.4*b.getWidth()),i,(int)(0.6*b.getWidth()),i);
            }
        }
        for(int i=0;i<siz;i++){
            g.setColor(new Color(r.nextInt(4),150+r.nextInt(15),20+r.nextInt(7)));
            g.drawLine(b.getWidth()/2-(int)(b.getWidth()*0.42*i/siz),(int)(b.getHeight()*0.9)+r.nextInt(5)-2,b.getWidth()/2+(int)(b.getWidth()*0.42*i/siz),(int)(b.getHeight()*0.9)+r.nextInt(5)-2);
            g.setColor(new Color(r.nextInt(4),150+r.nextInt(15),20+r.nextInt(7)));
            g.drawLine(b.getWidth()/2-(int)(b.getWidth()*0.42*i/siz),(int)(b.getHeight()*0.9),b.getWidth()/2,(int)(b.getHeight()*(0.1+(.06*i)/siz)));
            g.setColor(new Color(r.nextInt(4),150+r.nextInt(15),20+r.nextInt(7)));
            g.drawLine(b.getWidth()/2+(int)(b.getWidth()*0.42*i/siz),(int)(b.getHeight()*0.9),b.getWidth()/2,(int)(b.getHeight()*(0.1+(.06*i)/siz)));
        }
        g.setColor(new Color(150,120,40));
        g.fillOval((b.getWidth()-siz-2)/2,b.getHeight()/10,siz+2,siz+2);
        g.setColor(new Color(250,240,80));
        g.fillOval((b.getWidth()-siz)/2,b.getHeight()/10,siz,siz);
        List<Color>c=Arrays.asList(new Color(0,255,0),new Color(255,0,0),new Color(130,0,100),new Color(0,0,200),new Color(110,0,200),new Color(200,205,210),new Color(0,240,255),new Color(255,100,0));
        List<Point>pts=new ArrayList<>();
        pts.add(new Point((b.getWidth()-siz)/2,b.getHeight()/10));
        loop:for(int i=0;i<8+siz/4;i++){
            int y=r.nextInt((8*b.getHeight())/11);
            int x=1+(int)(b.getWidth()*0.35*y/((8*b.getHeight())/11));
            x=r.nextInt(2*x)-x+b.getWidth()/2;
            y+=b.getHeight()/8;
            g.setColor(c.get(r.nextInt(c.size())));
            x-=siz/2;
            Point p=new Point(x,y);
            for(Point q:pts){
                if(q.distance(p)<1+2*siz)continue loop;
            }
            pts.add(p);
            g.fillOval(x,y,siz,siz);
        }
        ImageIO.write(b,"png",new File("tree.png"));
    }
}

Kết quả mẫu:

Kích thước = 3:

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

Kích thước = 4:

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

Kích thước = 5:

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

Kích thước = 12:

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

Kích thước = 20:

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


1
Tôi đã không nhận thấy điều này trước đây. Siêu mát +1
một spaghetto

4

Nổi loạn

Với một phương ngữ để hiển thị các biểu tượng. Để thay đổi kích thước cây, chỉ cần thay đổi tham số của make-tree.

make-tree: func [int /local tr] [
  tr: copy []
  length: (int * 2) + 3
  repeat i int [
      repeat j 3 [
            ast: to-integer ((i * 2) - 1 + (j * 2) - 2)
            sp: to-integer (length - ast) / 2
            append/dup tr space sp 
            append/dup tr "*" ast 
            append tr lf
      ]
  ]
  append/dup tr space (length - 1) / 2
  append tr "|"
  append tr lf
  tr
]

print make-tree 3

một cây có 3 lớp một cây có 5 lớp


3
Nơi bạn đặt kích thước và nó ảnh hưởng đến cây được tạo ra như thế nào?
manatwork 24/12/13

@manatwork Để thay đổi treekhối. Bạn có thể thay đổi kích thước nó hoặc thay đổi một số biểu tượng theo ý muốn của bạn.
Wayne Cui

@WayneTsui điều này không phù hợp với yêu cầu của OP, "kích thước phải được lựa chọn theo một số phương thức nhập""đầu vào lớn hơn sẽ tạo ra một cây lớn hơn."
ulidtko

1
một chức năng tạo cây mới từ @kealist
Wayne Cui

4

Con trăn

import sys
w = sys.stdout.write
def t(n,s):
    for i in range(n):
        for a in range(n-i):
            w(" ")
        w("[")
        for l in range(i<<1):
            if i==n-1:
                w("_")
            else:
                w("~")
        w("]")
        print("")
    for o in range(s):
        for i in range(n):
            w(" ")
        print("[]")

t(10, 2)

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


1

Ti-Basic 84

Yêu cầu kích thước:

              :
            Input 
           S:Lbl 1
            S-1→S
              :
             "||
            "+""→
           Str1:" 
             "→Str2
         :Disp Str2+
        "   **":Disp 
       Str2+"  "+"*"+
      Str1+"*":Disp " 
     "+Str1+"*-"+"||-*
    ":Disp Str1+"*--||-
   -*":Disp "   *---||--
  -*":Disp "  *----||----
 *":Disp Str1+"   "+Str2+"
":If S>0:Goto 2:Goto 1:Lbl 
              2

Đầu ra (cỡ 1):

       **
      *||*
     *-||-*
    *--||--*
   *---||---*
  *----||----*
       ||

1
Đâu là kích thước có thể lựa chọn? Đây là một cây có kích thước cố định
Justin

1
@Quincunx Đã sửa.
TimTech

4
-1; bạn không thể chèn khoảng trắng tùy ý vào chương trình TI-Basic.
lirtosiast
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.