calcyman wrote:By exploiting symmetry, Fredkin and Toffoli's BBM automaton requires only 6 tiles (!!!) instead of 16.
.aa.
bbbb
bbbb
.aa.
cccc
cccc
cccc
cccc
dddd
e..e
e..e
dddd
cc
bb
..
cc
cb
cb
.c
.c
.b
.b
..
bb
00 --> 11
10 01
simsim314 wrote:There are usually conservation laws in reversible automatons, and you can't lose information.
simsim314 wrote:Pieces that you make any computation of any kind using just lego bricks? Maybe we can start from simple adder, if there is none?
simsim314 wrote:Is there a good theory of computational transfer from one computation to another? For example could people playing some complex version of pac man actually search for P19 oscillator? I also don't want to force some sort of algorithm, in this way I can simply use lifesrc for example, I want human intuition to guide lifesrc in something which is computationally equivalent to running from creatures inside pac man/super mario, such that in the grand scale - the decisions done in the super mario game will be a complex search algorithm?
simsim314 wrote:As for the lego pieces - I'm amazed we can make it with regular lego and simplistic restriction like - place them next to each other and not on top. I would still prefer to enforce this part, as it feels to me the general point of lego to enforce some degrees and release some others, and the enforcement is valuable in my opinion. But to see the physical result we can start from lego indeed.
hkoenig wrote:If you are really serious about physical tiles, and since you want a small variety of small pieces, the one solution for bulk parts is a LEGO store.
a b -> e f
d c h g
0 0 --> 0 1
1 0 0 0
1 1 --> 0 1
1 0 1 1
pcallahan wrote: might be a simpler way to make Margolus CA pieces.
pcallahan wrote:I'm not sure I follow all your concerns.
simsim314 wrote:On other note. Don't you need to use 5x5 to stuck a cube in the center to enforce Margolus?
a??a
?bb?
?bb?
a??a
.**.
****
****
.**.
.00..11..00..11.
0000111100001111
.00221133002211.
..222233332222..
.00221133002211.
0000111100001111
.00..11..00..11.
pcallahan wrote:The basic 4x4 tile
simsim314 wrote:Anyway I think this is really time for jscad.
pcallahan wrote: would like to see the CGOL tiles implemented in solid form.
simsim314 wrote:I'm not sure the jscad project was clear. I'm not building CGOL tiles nor binary adder or any margolus rule. I'm building a lego set equivalent which will allow to implement any set of tiles which enforces any moore neighborhood CA.
//This is universal CA tile set axioms.
//Invention and design by Michael Simkin 2019.
//Constants
epsilon_material = 0.03;
depth_factor = 0.6;
symbolR_factor = 0.7;
sumbolH_factor = 0.4;
symbolW_factor = 0.25;
attach_w = 0.34;
attach_h = 2.2;
attach_dp = 1.7;
attach_c = 0.2;
attach_f = 2;
attach_m = 1.1;
c_factor = 0.7; //the slope of attachment mechanism. 1 = 45, 0 = 0.
v = 3; // The size of additional material
R = 10; //The length of internal core
d1 = 2.4;
d2 = 3;
h_extrusion = v * depth_factor;
sH = v * sumbolH_factor;
sR = (R + 2 * v) * symbolR_factor * 0.5;
sW = (1 - symbolW_factor) * sR;
sWcube = symbolW_factor * sR;
sideH = v - 2 * epsilon_material;
topH = v - epsilon_material;
function make3D_printable(part, ep)
{
return intersection(part, cylinder({r1:R*3, r2: 0,h:-R*3}).translate([0,0,R*3 + ep]));
}
function MainAttachMale()
{
w = attach_w;
h = attach_h;
c = attach_c;
f = attach_f;
ep = epsilon_material;
dp = attach_dp-ep;
tr = dp - f*c;
//return linear_extrude({ height: 10, );
var p = polygon({points:[ [0,-c*c_factor+ ep],[0,f*c-ep],[-c+ep,ep]]});
var main_part = make3D_printable(cube([w-2*ep, dp-ep, h]), ep);
var exp = make3D_printable(linear_extrude({ height: h - tr }, p), epsilon_material).translate([0,tr,tr])
return union(exp, main_part).translate([ep,0,0]);
}
function MainAttachFemale()
{
w = attach_w;
h = attach_h;
c = attach_c;
f = attach_f;
ep = 0;
dp = attach_dp-ep;
tr = dp - f*c;
//return linear_extrude({ height: 10, );
var p = polygon({points:[ [0,-c*c_factor+ep],[0,f*c-ep],[-c+ep,ep]]});
var main_part = cube([w, dp, h]);
var exp = make3D_printable(linear_extrude({ height: h - tr }, p), 0).translate([0,tr,tr])
return union(exp, main_part).translate([ep,0,0]);
}
function AttachEmale()
{
m = attach_m;
return union(MainAttachMale(), MainAttachMale().mirroredX().translate([m, 0, 0]));
}
function AttachEfemale()
{
m = attach_m;
h = attach_h;
dp = attach_dp;
w = attach_w;
return difference(union(cube([m, dp, h]), MainAttachFemale(), MainAttachFemale().mirroredX().translate([m, 0, 0])),cube([m, dp, 2*h]).rotateX(-45));
}
function AttachS()
{
var mr = union(AttachEmale().translate([0,0,-attach_h]),AttachEmale().translate([0,0,-attach_h]).mirroredZ());
return mr.rotateX(90).translate([-attach_m/2,0,0]);
}
function AttachF()
{
var mr = union(AttachEfemale().translate([0,0,-attach_h]),AttachEfemale().translate([0,0,-attach_h]).mirroredZ());
return mr.rotateX(90).translate([-attach_m/2,0,0]);
}
function Attach(ep)
{
if(ep === 0)
{
return union(AttachS().translate([d2, 0, 0]),
AttachS().translate([0, d1, 0]),
AttachS().translate([-d2, 0, 0]),
AttachS().translate([0, -d1, 0]));
}
else
{
return union(AttachF().translate([d2, 0, 0]),
AttachF().translate([0, d1, 0]),
AttachF().translate([-d2, 0, 0]),
AttachF().translate([0, -d1, 0]));
}
}
function Draw0(ep)
{
l = (sR - sW)/2 + ep;
u = (sR + sW)/2;
return union(rotate_extrude( polygon({points:[ [u-l,0],[u+l,0],[u,l]]}) ).translate([0,0,sH+ep]),
difference(cylinder({r:(sR + ep), h:(sH + ep)}), cylinder({r:(sW - ep), h:(sH + ep)})));
}
function DrawLine(ep)
{
sw2 = sWcube / 2;
var p = polygon({points:[ [-sw2-ep,0],[sw2+ep,0],[0,sw2+ep]]});
var exp = linear_extrude({ height: 2*sR }, p).translate([0,sH+ep,-sR-ep]);
return union(cube([2*sR+2*ep, sWcube + 2 * ep, sH+ep]).translate([-sR-ep, -(sWcube)/2-ep, 0]),
exp.rotateX(90).rotateZ(90));
}
function DrawPlus(ep)
{
return union(DrawLine(ep).rotateZ(90), DrawLine(ep));
}
function DrawPlus0(ep)
{
return union(DrawPlus(ep), Draw0(ep));
}
function AttachSide(ep)
{
return union(
AttachS().translate([-d1,-d1,0]),
AttachS().translate([-d1,d1,0]),
AttachF().mirroredZ().translate([d1,-d1,0]),
AttachF().mirroredZ().translate([d1,d1,0])
);
}
function Core()
{
R2 = R/2;
return union(cube(R),
Attach(0).rotateX(90).translate([R2,0,R2]),
Attach(0).rotateX(-90).translate([R2,R,R2]),
Attach(0).rotateX(90).rotateZ(-90).translate([0,R2,R2]),
Attach(0).rotateX(-90).rotateZ(-90).translate([R,R2,R2]),
Attach(0).translate([R2,R2,R]));
}
function Side()
{
return difference(cube([v+R,R,sideH]), Attach(epsilon_material).translate([R/2,R/2,0]));
}
function regular_side()
{
return difference(Side(),
cube([epsilon_material, 2*R,2*R]),
cube([2*R, epsilon_material,2*R]),
cube([2*R, epsilon_material,2*R]).translate([0,R - epsilon_material, 0])
);
}
function xor(a, b)
{
return union(difference(a, b), difference(b, a))
}
function attach_side()
{
return xor(regular_side(),AttachSide(epsilon_material).translate([R/2, R/2, sideH]));
}
function plain_top()
{
R2 = R/2
return difference(cube([R + 2 * v, R + 2 * v, topH]), Attach(epsilon_material).translate([R2 + v,R2 + v,0]));
}
function BottomVanil()
{
return union(cube([R + 2 * v, R + 2 * v, v]), Core().translate([v,v,v]));
}
function bottom_attach()
{
return difference(BottomVanil(), Attach(epsilon_material).translate([R2 + v,R2 + v,0]));
}
function top_attach()
{
return union(plain_top(),Attach(0).translate([R2 + v,R2 + v,topH]));
}
function top0()
{
R2= R/2;
return union(plain_top(), Draw0(0).translate([R2+v,R2+v,topH]));
}
function top_plus()
{
R2= R/2;
return union(plain_top(), DrawPlus(0).translate([R2+v,R2+v,topH]));
}
function bottom_plus()
{
R2= R/2;
return difference(BottomVanil(),DrawPlus(epsilon_material).translate([R2+v,R2+v,0]));
}
function bottom0()
{
R2= R/2;
return difference(BottomVanil(),Draw0(epsilon_material).translate([R2+v,R2+v,0]));
}
function bottom_plus0()
{
return intersection(bottom_plus(), bottom0());
}
function all()
{
return union(regular_side().setColor([0.2,0.9,0.5]),
attach_side().translate([0, 3*R, 0]).setColor([0.2,0.9,0.5]),
plain_top().translate([3*R, 9*R, 0]).setColor([1,1,0]),
top_attach().translate([3*R, 0, 0]).setColor([1,1,0]),
top0().translate([3*R, 3*R, 0]).setColor([1,1,0]),
top_plus().translate([3*R, 6*R, 0]).setColor([1,1,0]),
bottom_attach().translate([6 * R, 0, 0]).setColor([0.9,0.5,0.5]),
bottom_plus().translate([6 * R, 3*R, 0]).setColor([0.9,0.5,0.5]),
bottom0().translate([6 * R, 6*R, 0]).setColor([0.9,0.5,0.5]),
bottom_plus0().translate([6 * R, 9*R, 0]).setColor([0.9,0.5,0.5])
//top_plus(),
//bottom_plus(),
//bottom_plus0()
);
}
function main() {
//return AttachS();
//for(var i=0; i<attach_m; i+=attach_w) {
// v = union(v, MainAttachMale().translate([i,0,0]));
//}
// m = attach_m;
// h = attach_h;
// dp = attach_dp;
// w = attach_w;
//difference(union(cube([m, dp, h]), MainAttachFemale(), MainAttachFemale().mirroredX().translate([m, 0, 0])),cube([m, dp, h]).rotateX(-45));
//return difference(union(cube([m, dp, h]), MainAttachFemale()),cube([m, dp, 2*h]).rotateX(-45));
//return union(v, AttachEmale());
//return AttachEfemale();
return all().translate([-5*R, -5*R, 0]);
}
simsim314 wrote:Regarding the empty space I was thinking about something a bit different. We know that empty space remains empty, so we can simulate only local environment of the action. This will in the larger scale create some interesting CA sculptures, probably similar to aluminium ant colonies just done by hands and tiles.
simsim314 wrote:Another possible direction is actually a possible real implication to algorithmic self assembly.
pcallahan wrote:That's a good point, though it could affect physical stability.
pcallahan wrote:could you build macroscopic tiles that could be shaken into fitting together according to rules? I don't think it works very well
epsilon_material = 0.03;
depth_factor = 0.6;
symbolR_factor = 0.5;
sumbolH_factor = 0.12;
symbolW_factor = 0.3;
r_factor = 0.1;
R = 10; //The length of cube
v = 0;
d1 = 2.75;
d2 = 3;
h_extrusion = v * depth_factor;
sH = R * sumbolH_factor;
sR = R * symbolR_factor * 0.5;
sW = (1 - symbolW_factor) * sR;
sWcube = symbolW_factor * sR;
TileH = R * 0.35;
function Draw0(ep)
{
l = (sR - sW)/2 + ep;
u = (sR + sW)/2;
return union(rotate_extrude( polygon({points:[ [u-l,0],[u+l,0],[u,l]]}) ).translate([0,0,sH+ep]),
difference(cylinder({r:(sR + ep), h:(sH + ep)}), cylinder({r:(sW - ep), h:(sH + ep)})));
}
function DrawLine(ep)
{
sWc = sWcube * 2;
sw2 = sWc / 2;
s1R = sR;
s1H = sH / 2;
var p = polygon({points:[ [-sw2-ep,0],[sw2+ep,0],[0,sw2+ep]]});
var exp = linear_extrude({ height: 2*s1R + 2 * ep }, p).translate([0,s1H+ep,-s1R-ep]);
return union(cube([2*s1R+2*ep, sWc + 2 * ep, s1H+ep]).translate([-s1R-ep, -(sWc)/2-ep, 0]),
exp.rotateX(90).rotateZ(90));
}
function draw0_cube()
{
return difference(union(Draw0(0).translate([R/2,R/2,R]), cube(R), cylinder({r: R * r_factor, h:(R)}).translate([0, R/2, 0])), union(Draw0(epsilon_material).translate([R/2,R/2,0]), cylinder({r: R * r_factor + epsilon_material, h:(R)}).translate([R, R/2, 0])));
}
function draw1_cube()
{
return difference(union(DrawLine(0).translate([R/2,R/2,R]), cube(R), cylinder({r: R * r_factor, h:(R)}).translate([0, R/2, 0])), union(Draw0(epsilon_material).translate([R/2,R/2,0]), cylinder({r: R * r_factor + epsilon_material, h:(R)}).translate([R, R/2, 0])));
}
function draw_platform()
{
ep = epsilon_material;
realR = R + ep;
N = 8;
PlatH = R * 0.2;
H = PlatH + realR + TileH + 2 * ep;
PlatW = R / 3;
v = cube([2 * realR, N * realR, PlatH ]);
for(var i=0; i<N; i+=1) {
v = union(v, Draw0(0).translate([R/2 ,R/2 + i * realR, PlatH]));
v = union(v, Draw0(0).translate([R/2 + 2*ep + realR, R/2 + i * realR, PlatH]));
}
return union(v.translate([0,PlatW,0]), cube([2 * realR, PlatW,H]), cylinder({r: R * r_factor, h:(H)}).translate([R/2 + ep, PlatW, 0]), cylinder({r: R * r_factor, h:(H)}).translate([R/2 + ep + realR, PlatW, 0]));
}
function add_inputs(v, i1, i2)
{
ep = epsilon_material;
realR = R + ep;
if(i1 == 0)
v = difference(v, Draw0(ep).translate([R/2 ,R/2, 0]));
else
v = difference(v, DrawLine(ep).translate([R/2 ,R/2, 0]));
if(i2 == 0)
v = difference(v, Draw0(ep).translate([R/2 + 2*ep ,R/2+realR, 0]));
else
v = difference(v, DrawLine(ep).translate([R/2 + 2*ep ,R/2+realR, 0]));
return v;
}
function add_output(v, o)
{
if(o == 0)
return union(v, Draw0(ep).translate([R/2 ,R, TileH]))
else
return union(v, DrawLine(ep).translate([R/2 ,R, TileH]))
}
function add_input_c(v, c)
{
ep = epsilon_material;
if(c == 0)
return difference(v, union(cylinder({r: R * r_factor + ep, h:(R)}).translate([0, R/2, 0]), cylinder({r: R * r_factor + ep, h:(R)}).translate([0, R/2 + realR + ep, 0])));
else
return difference(v, cylinder({r: R * r_factor * 1.5 + ep, h:(R)}).translate([0, R, 0]));
}
function add_output_c(v, c)
{
ep = epsilon_material;
if(c === 0)
return union(v, union(cylinder({r: R * r_factor + ep, h:(TileH)}).translate([R, R/2, 0]), cylinder({r: R * r_factor + ep, h:(TileH)}).translate([R, R/2 + realR + ep, 0])));
else
return union(v, cylinder({r: R * r_factor * 1.5 + ep, h:(TileH)}).translate([R, R, 0]));
}
function add_tile(i1, i2, ci, co, o)
{
ep = epsilon_material;
realR = R + ep;
v = cube([R, 2 * realR, TileH]);
v = add_inputs(v, i1, i2);
v = add_output(v, o);
v = add_input_c(v, ci)
return add_output_c(v, co);
}
//Platform - 1 √
//0-1 blocks - 2 √
//8 tiles to add - 8
function main () {
//return union(draw1_cube(), draw0_cube().translate([2*R, 0,0]));
//platform
R3 = R * 3;
R6 = R * 6;
//return ;
return union(
add_tile(0,0,0,0,0),
add_tile(1,0,0,0,1).translate([R3, 0, 0]),
add_tile(0,1,0,0,1).translate([R6, 0, 0]),
add_tile(0,0,1,0,1).translate([0, R3, 0]),
add_tile(1,1,0,1,0).translate([R3, R3, 0]),
add_tile(1,0,1,1,0).translate([R6, R3, 0]),
add_tile(0,1,1,1,0).translate([R3, R6, 0]),
add_tile(1,1,1,1,1).translate([R6, R6, 0]),
draw_platform().translate([R*8, 0, 0]),
draw1_cube().translate([-R3, 0, 0]), draw0_cube().translate([-R3, R3, 0])
);
}
Users browsing this forum: No registered users and 1 guest