Abelian sandpile model/Identity: Difference between revisions

m
m (→‎{{header|FutureBasic}}: Another attempt at setting output height)
m (→‎{{header|Wren}}: Minor tidy)
 
(2 intermediate revisions by 2 users not shown)
Line 1,691:
avalanche
----------
4 3 3
3 1 2
0 2 3
 
⇣ ⇣ ⇣ ⇣ ⇣
 
0 4 3
4 1 2
0 2 3
 
⇣ ⇣ ⇣ ⇣ ⇣
 
1 0 4
4 2 2
0 2 3
 
⇣ ⇣ ⇣ ⇣ ⇣
 
1 1 0
4 2 3
0 2 3
 
⇣ ⇣ ⇣ ⇣ ⇣
 
2 1 0
0 3 3
1 2 3
 
s1 + s2
----------
3 3 3
3 1 2
0 2 3
 
s2 + s1
----------
3 3 3
3 1 2
0 2 3
 
s3
----------
3 3 3
3 3 3
3 3 3
 
s3_id
----------
2 1 2
1 0 1
2 1 2
 
s3+s3_id
----------
5 4 5
4 3 4
5 4 5
 
⇣ ⇣ ⇣ ⇣ ⇣
 
1 5 5
5 3 4
5 4 5
 
⇣ ⇣ ⇣ ⇣ ⇣
 
2 1 6
5 4 4
5 4 5
 
⇣ ⇣ ⇣ ⇣ ⇣
 
2 2 2
5 4 5
5 4 5
 
⇣ ⇣ ⇣ ⇣ ⇣
 
3 2 2
1 5 5
6 4 5
 
⇣ ⇣ ⇣ ⇣ ⇣
 
3 3 2
2 1 6
6 5 5
 
⇣ ⇣ ⇣ ⇣ ⇣
 
3 3 3
2 2 2
6 5 6
 
⇣ ⇣ ⇣ ⇣ ⇣
 
3 3 3
3 2 2
2 6 6
 
⇣ ⇣ ⇣ ⇣ ⇣
 
3 3 3
3 3 2
3 2 7
 
⇣ ⇣ ⇣ ⇣ ⇣
 
3 3 3
3 3 3
3 3 3
 
s3_id+s3_id
----------
4 2 4
2 0 2
4 2 4
 
⇣ ⇣ ⇣ ⇣ ⇣
 
0 3 4
3 0 2
4 2 4
 
⇣ ⇣ ⇣ ⇣ ⇣
 
0 4 0
3 0 3
4 2 4
 
⇣ ⇣ ⇣ ⇣ ⇣
 
1 0 1
3 1 3
4 2 4
 
⇣ ⇣ ⇣ ⇣ ⇣
 
1 0 1
4 1 3
0 3 4
 
⇣ ⇣ ⇣ ⇣ ⇣
 
2 0 1
0 2 3
1 3 4
 
⇣ ⇣ ⇣ ⇣ ⇣
 
2 0 1
0 2 4
1 4 0
 
⇣ ⇣ ⇣ ⇣ ⇣
 
2 0 2
0 3 0
1 4 1
 
⇣ ⇣ ⇣ ⇣ ⇣
 
2 0 2
0 4 0
2 0 2
 
⇣ ⇣ ⇣ ⇣ ⇣
 
2 1 2
1 0 1
2 1 2
</pre>
 
Line 4,041:
s3 + s3_id == s3: true
s3_id + s3_id == s3_id: true
</pre>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">#[derive(Clone)]
struct Box {
piles: [[u8; 3]; 3],
}
 
impl Box {
fn init(piles: [[u8; 3]; 3]) -> Box {
let a = Box { piles };
 
if a.piles.iter().any(|&row| row.iter().any(|&pile| pile >= 4)) {
return a.avalanche();
} else {
return a;
}
}
 
fn avalanche(&self) -> Box {
let mut a = self.clone();
for (i, row) in self.piles.iter().enumerate() {
for (j, pile) in row.iter().enumerate() {
if *pile >= 4u8 {
if i > 0 {
a.piles[i - 1][j] += 1u8
}
if i < 2 {
a.piles[i + 1][j] += 1u8
}
if j > 0 {
a.piles[i][j - 1] += 1u8
}
if j < 2 {
a.piles[i][j + 1] += 1u8
}
a.piles[i][j] -= 4;
}
}
}
Box::init(a.piles)
}
 
fn add(&self, a: &Box) -> Box {
let mut b = Box {
piles: [[0u8; 3]; 3],
};
for (row, columns) in b.piles.iter_mut().enumerate() {
for (col, pile) in columns.iter_mut().enumerate() {
*pile = self.piles[row][col] + a.piles[row][col]
}
}
Box::init(b.piles)
}
}
 
fn main() {
println!(
"The piles demonstration avalanche starts as:\n{:?}\n{:?}\n{:?}",
[4, 3, 3],
[3, 1, 2],
[0, 2, 3]
);
let s0 = Box::init([[4u8, 3u8, 3u8], [3u8, 1u8, 2u8], [0u8, 2u8, 3u8]]);
println!(
"And ends as:\n{:?}\n{:?}\n{:?}",
s0.piles[0], s0.piles[1], s0.piles[2]
);
let s1 = Box::init([[1u8, 2u8, 0u8], [2u8, 1u8, 1u8], [0u8, 1u8, 3u8]]);
let s2 = Box::init([[2u8, 1u8, 3u8], [1u8, 0u8, 1u8], [0u8, 1u8, 0u8]]);
let s1_2 = s1.add(&s2);
let s2_1 = s2.add(&s1);
println!(
"The piles in s1 + s2 are:\n{:?}\n{:?}\n{:?}",
s1_2.piles[0], s1_2.piles[1], s1_2.piles[2]
);
println!(
"The piles in s2 + s1 are:\n{:?}\n{:?}\n{:?}",
s2_1.piles[0], s2_1.piles[1], s2_1.piles[2]
);
let s3 = Box::init([[3u8; 3]; 3]);
let s3_id = Box::init([[2u8, 1u8, 2u8], [1u8, 0u8, 1u8], [2u8, 1u8, 2u8]]);
let s4 = s3.add(&s3_id);
println!(
"The piles in s3 + s3_id are:\n{:?}\n{:?}\n{:?}",
s4.piles[0], s4.piles[1], s4.piles[2]
);
let s5 = s3_id.add(&s3_id);
println!(
"The piles in s3_id + s3_id are:\n{:?}\n{:?}\n{:?}",
s5.piles[0], s5.piles[1], s5.piles[2]
);
}
</syntaxhighlight>
{{out}}
<pre>
The piles demonstration avalanche starts as:
[4, 3, 3]
[3, 1, 2]
[0, 2, 3]
And ends as:
[2, 1, 0]
[0, 3, 3]
[1, 2, 3]
The piles in s1 + s2 are:
[3, 3, 3]
[3, 1, 2]
[0, 2, 3]
The piles in s2 + s1 are:
[3, 3, 3]
[3, 1, 2]
[0, 2, 3]
The piles in s3 + s3_id are:
[3, 3, 3]
[3, 3, 3]
[3, 3, 3]
The piles in s3_id + s3_id are:
[2, 1, 2]
[1, 0, 1]
[2, 1, 2]
</pre>
 
Line 4,149 ⟶ 4,269:
=={{header|Wren}}==
{{libheader|Wren-fmt}}
<syntaxhighlight lang="ecmascriptwren">import "./fmt" for Fmt
 
class Sandpile {
Line 4,320 ⟶ 4,440:
1 0 1
2 1 2
</pre>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">#[derive(Clone)]
struct Box {
piles: [[u8; 3]; 3],
}
 
impl Box {
fn init(piles: [[u8; 3]; 3]) -> Box {
let a = Box { piles };
 
if a.piles.iter().any(|&row| row.iter().any(|&pile| pile >= 4)) {
return a.avalanche();
} else {
return a;
}
}
 
fn avalanche(&self) -> Box {
let mut a = self.clone();
for (i, row) in self.piles.iter().enumerate() {
for (j, pile) in row.iter().enumerate() {
if *pile >= 4u8 {
if i > 0 {
a.piles[i - 1][j] += 1u8
}
if i < 2 {
a.piles[i + 1][j] += 1u8
}
if j > 0 {
a.piles[i][j - 1] += 1u8
}
if j < 2 {
a.piles[i][j + 1] += 1u8
}
a.piles[i][j] -= 4;
}
}
}
Box::init(a.piles)
}
 
fn add(&self, a: &Box) -> Box {
let mut b = Box {
piles: [[0u8; 3]; 3],
};
for (row, columns) in b.piles.iter_mut().enumerate() {
for (col, pile) in columns.iter_mut().enumerate() {
*pile = self.piles[row][col] + a.piles[row][col]
}
}
Box::init(b.piles)
}
}
 
fn main() {
println!(
"The piles demonstration avalanche starts as:\n{:?}\n{:?}\n{:?}",
[4, 3, 3],
[3, 1, 2],
[0, 2, 3]
);
let s0 = Box::init([[4u8, 3u8, 3u8], [3u8, 1u8, 2u8], [0u8, 2u8, 3u8]]);
println!(
"And ends as:\n{:?}\n{:?}\n{:?}",
s0.piles[0], s0.piles[1], s0.piles[2]
);
let s1 = Box::init([[1u8, 2u8, 0u8], [2u8, 1u8, 1u8], [0u8, 1u8, 3u8]]);
let s2 = Box::init([[2u8, 1u8, 3u8], [1u8, 0u8, 1u8], [0u8, 1u8, 0u8]]);
let s1_2 = s1.add(&s2);
let s2_1 = s2.add(&s1);
println!(
"The piles in s1 + s2 are:\n{:?}\n{:?}\n{:?}",
s1_2.piles[0], s1_2.piles[1], s1_2.piles[2]
);
println!(
"The piles in s2 + s1 are:\n{:?}\n{:?}\n{:?}",
s2_1.piles[0], s2_1.piles[1], s2_1.piles[2]
);
let s3 = Box::init([[3u8; 3]; 3]);
let s3_id = Box::init([[2u8, 1u8, 2u8], [1u8, 0u8, 1u8], [2u8, 1u8, 2u8]]);
let s4 = s3.add(&s3_id);
println!(
"The piles in s3 + s3_id are:\n{:?}\n{:?}\n{:?}",
s4.piles[0], s4.piles[1], s4.piles[2]
);
let s5 = s3_id.add(&s3_id);
println!(
"The piles in s3_id + s3_id are:\n{:?}\n{:?}\n{:?}",
s5.piles[0], s5.piles[1], s5.piles[2]
);
}
</syntaxhighlight>
{{out}}
<pre>
The piles demonstration avalanche starts as:
[4, 3, 3]
[3, 1, 2]
[0, 2, 3]
And ends as:
[2, 1, 0]
[0, 3, 3]
[1, 2, 3]
The piles in s1 + s2 are:
[3, 3, 3]
[3, 1, 2]
[0, 2, 3]
The piles in s2 + s1 are:
[3, 3, 3]
[3, 1, 2]
[0, 2, 3]
The piles in s3 + s3_id are:
[3, 3, 3]
[3, 3, 3]
[3, 3, 3]
The piles in s3_id + s3_id are:
[2, 1, 2]
[1, 0, 1]
[2, 1, 2]
</pre>
9,476

edits