作者jurian0101 (Hysterisis)
看板puzzle
标题Re: [问题] 树干 树枝 果实
时间Tue Jul 17 07:55:43 2012
※ 引述《EIORU ()》之铭言:
: 有一棵 树 种进土里後 长出了树干 │
: ╲╱ <- 左/右 树枝 往前/後的树枝->∣ ╲╱
: 第一天早上 长出了树枝 │ <- 树干 ∣ ∣ <-树干 ∣ ∣
: ╲╱ ╲╱
: 第一天晚上 树枝上长出了树干 │ ∣
: 原本的树枝变成了树干
: 第二天 在左边的树干 往 前/後 长出了树枝 , 在右边的树干 往 左/右 长出了树枝
: 第二天晚上 树枝上长出了树干 原本的树枝变成了树干
: 第三天 在前方的树干 往 前/後 长出了树枝 , 在後方的树干 往 左/右 长出了树枝
: 在左边的树干 往 前/後 长出了树枝 , 在右边的树干 往 左/右 长出了树枝
: 第三天晚上 树枝上长出了树干 原本的树枝变成了树干
: 第四天之後 会重复有颜色的行为
: 如果早上两枝树枝 碰到了一起 在晚上就会结出了果实 而不会长出树干
: PS.
: 在顶端的树干才有生长能力
: 树枝长度 = √2 , 树干长度 = 1
: 树枝生长永远和地面呈45度
: 树干生长永远和地面呈90度
: Q1. 第10天早上 会长出几枝树枝?
: Q2. 从第一天开始到第几天晚上能采收到第100颗果实?
: 题外话 ... OEIS 没有树枝数量的数列 XD
: ... 画到一半感觉像 某 立体结构的 聚合物
O代表原枝干 WASD代表前左後右 (XD) 上一天的以小写wasd表示。
Q代表果子,一个位置结了果实就不会再往上长,第二天就忽视他。
以下是转变法则,用字代表就不会忘了是什麽朝向的枝干,也可以方便绘图(设定坐标)
W W
w AsD a AdD
S S
假设要算枝干总长度的话(原题没有但可以算) 就是一层层加上去,简单正是每一层中
__ __
W=A=S=D = 1+V 2 ,Q = 2V 2 ,初始枝干O=1 这样
= = = = = = =
第一天 (第0层)
O 长度1
第二天
W __
o 长度 2* (1+V 2 )
S
第三天
W
w 以下省略长度,一样意思就好
S
AsD
第四天 果子 +=1
W
w
S
QsD
aAdD
S
第五天 果子 +=2
W
w
S
AsD
QsD
aAdD
AsQ
第六天 果子 += 2
W
w
S
QsD
aAdD
S QdD
W aAdD
a S
S
........依此类推,是个二维cellular automata QQ
EIORU大商量一下~~您贴个精美3D图好不好
这个..近来有点怠惰 (忍!烟雾~噗)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.213.88
1F:→ jurian0101:oops,初始条件误植为前後,不过似乎右转90度是一样的 07/17 07:58
2F:推 EIORU:autocad: 复制 贴上 了N遍 才到第6,7天 最後用excel了 XD 07/17 12:07
3F:→ jurian0101:mathematica磨蹭+凑函数中 07/17 16:45
好,第十天是38根树枝。到第14天晚上总共长了100颗果实。
先形容一下画出来这颗神奇的树,
"分层画"的输出可以看到,每层中同一侧形成无间隙的枝干网格。果子也是交替排列。
这个构造姑且叫做基底膜好了@@
相对方向形成两种排列形式 1.cluster: 形状不一的离散团块,似乎彼此长像是一样的
或 2. escalator,连回基底膜的长短不一的纤维状构造
然後就是整体了,窝的天啊它长的超像 Sierpinski triangle (转到侧面) 相异点是
这个 EIORU XD triangle 是由多於而非原本1:2的挖空比例构成的
/\
/__\ <-- 很差的示意图
/\/\/\
以下一样是伤眼Mathematica函数,速度效率很差,但计较这点可能要重写过就...算了
Clear[枝干];枝干[直][0]={{0,0}->"W"};
枝干[直][n_]/;n>0:=
枝干[直][n]=
(枝干[斜][n]=Sort[枝干[直][n-1]/.rule1])//.
{p___,q_Rule,r___,s_Rule,t___}/;q[[1]]==s[[1]]:>{p,q[[1]]->"Q",t}
(*迭代规则。到下一层Q=果子须移除,是故有Q一行*)
rule1={
(*W*)({x_,y_}->"W"):>Sequence[{x,y+1}->"W",{x,y-1}->"S"],
(*A*)({x_,y_}->"A"):>Sequence[{x,y+1}->"W",{x,y-1}->"S"],
(*S*)({x_,y_}->"S"):>Sequence[{x-1,y}->"A",{x+1,y}->"D"],
(*D*)({x_,y_}->"D"):>Sequence[{x-1,y}->"A",{x+1,y}->"D"],
(*Q*)({_,_}->"Q")->Sequence[]
};
(*把第i层枝干data转换成绘图物件。枝干[直][i]里包含Q=果子,是往上画。枝干[斜
][i]不包含Q,是往下画*)
Clear[转换];
转换[i_]:=Join[{Hue[Mod[i,10]/10]},
枝干[斜][i]/.x:{_Integer,_}:>Append[x,2i-1]/.rule2,
枝干[直][i]/.x:{_Integer,_}:>Append[x,2i-1]/.rule3
]
(*斜枝干变斜线*)
rule2={
(*W*)({x_,y_,z_}->"W"):>Line[{{x,y,z},{x,y-1,z-1}}],
(*A*)({x_,y_,z_}->"A"):>Line[{{x,y,z},{x+1,y,z-1}}],
(*S*)({x_,y_,z_}->"S"):>Line[{{x,y,z},{x,y+1,z-1}}],
(*D*)({x_,y_,z_}->"D"):>Line[{{x,y,z},{x-1,y,z-1}}]
};
(*直枝干或果子*)
rule3={
(*Q*)({x_,y_,z_}->"Q"):>{color=Black,PointSize[0.03],Point[{x,y,z}]},
(*else*) ({x_,y_,z_}->Except["Q"]):>Line[{{x,y,z},{x,y,z+1}}]
};
= = = = = = =
(*起始!,50层在我电脑跑很慢,约5分钟*)(*不知道这麽慢的原因是...*)
枝干[直][50];
= = = = = = =
(*输出测试*)
枝干[斜][5]
枝干[直][10]
= = = = = = =
(*单层graphics测试*)
Graphics3D[转换[10]]
= = = = = = =
(*多层graphics,视角是正上方,以看清分布*)
Table[Graphics3D[转换[i], ViewPoint -> Top, BoxStyle -> Dashed], {i, 1,
50(*层数*)}]
= = = = = = =
(*重头戏!! 大融合绘图。果子大小为手动调整,0是看不见*)
Graphics3D[
Flatten@Table[转换[i], {i, 1, 50(*层数*)}] /.
PointSize[_] -> PointSize[0(*大小*)], ViewPoint -> Top,
BoxStyle -> Dashed]
= = = = = = = = =
(*第i层的果实计数*)
c=Table[Count[枝干[直][i],"Q",Infinity],{i,1,50}]
(*到第n天总共果实计数*)
Accumulate[c]
(*斜枝干计数*)
Table[Length@枝干[斜][i],{i,1,50}]
(*直枝干计数,含果子,自行扣除*)
Table[Length@枝干[直][i],{i,1,50}]
※ 编辑: jurian0101 来自: 140.112.213.88 (07/18 18:31)
4F:→ jurian0101:本文修改後转Mathematica板@@ 07/18 18:41