Abelian sandpile model/Identity: Difference between revisions

Content added Content deleted
(Added Wren)
(Added Go)
Line 58: Line 58:
* https://en.wikipedia.org/wiki/Abelian_sandpile_model
* https://en.wikipedia.org/wiki/Abelian_sandpile_model



=={{header|Go}}==
{{trans|Wren}}
<lang go>package main

import (
"fmt"
"strconv"
"strings"
)

type sandpile struct{ a [9]int }

var neighbors = [][]int{
{1, 3}, {0, 2, 4}, {1, 5}, {0, 4, 6}, {1, 3, 5, 7}, {2, 4, 8}, {3, 7}, {4, 6, 8}, {5, 7},
}

// 'a' is in row order
func newSandpile(a [9]int) *sandpile { return &sandpile{a} }

func (s *sandpile) plus(other *sandpile) *sandpile {
b := [9]int{}
for i := 0; i < 9; i++ {
b[i] = s.a[i] + other.a[i]
}
return &sandpile{b}
}

func (s *sandpile) isStable() bool {
for _, e := range s.a {
if e > 3 {
return false
}
}
return true
}

// just topples once so we can observe intermediate results
func (s *sandpile) topple() {
for i := 0; i < 9; i++ {
if s.a[i] > 3 {
s.a[i] -= 4
for _, j := range neighbors[i] {
s.a[j]++
}
return
}
}
}

func (s *sandpile) String() string {
var sb strings.Builder
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
sb.WriteString(strconv.Itoa(s.a[3*i+j]) + " ")
}
sb.WriteString("\n")
}
return sb.String()
}

func main() {
fmt.Println("Avalanche of topplings:\n")
s4 := newSandpile([9]int{4, 3, 3, 3, 1, 2, 0, 2, 3})
fmt.Println(s4)
for !s4.isStable() {
s4.topple()
fmt.Println(s4)
}

fmt.Println("Commutative additions:\n")
s1 := newSandpile([9]int{1, 2, 0, 2, 1, 1, 0, 1, 3})
s2 := newSandpile([9]int{2, 1, 3, 1, 0, 1, 0, 1, 0})
s3_a := s1.plus(s2)
for !s3_a.isStable() {
s3_a.topple()
}
s3_b := s2.plus(s1)
for !s3_b.isStable() {
s3_b.topple()
}
fmt.Printf("%s\nplus\n\n%s\nequals\n\n%s\n", s1, s2, s3_a)
fmt.Printf("and\n\n%s\nplus\n\n%s\nalso equals\n\n%s\n", s2, s1, s3_b)

fmt.Println("Addition of identity sandpile:\n")
s3 := newSandpile([9]int{3, 3, 3, 3, 3, 3, 3, 3, 3})
s3_id := newSandpile([9]int{2, 1, 2, 1, 0, 1, 2, 1, 2})
s4 = s3.plus(s3_id)
for !s4.isStable() {
s4.topple()
}
fmt.Printf("%s\nplus\n\n%s\nequals\n\n%s\n", s3, s3_id, s4)

fmt.Println("Addition of identities:\n")
s5 := s3_id.plus(s3_id)
for !s5.isStable() {
s5.topple()
}
fmt.Printf("%s\nplus\n\n%s\nequals\n\n%s", s3_id, s3_id, s5)
}</lang>

{{out}}
<pre>
Avalanche of topplings:

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

Commutative additions:

1 2 0
2 1 1
0 1 3

plus

2 1 3
1 0 1
0 1 0

equals

3 3 3
3 1 2
0 2 3

and

2 1 3
1 0 1
0 1 0

plus

1 2 0
2 1 1
0 1 3

also equals

3 3 3
3 1 2
0 2 3

Addition of identity sandpile:

3 3 3
3 3 3
3 3 3

plus

2 1 2
1 0 1
2 1 2

equals

3 3 3
3 3 3
3 3 3

Addition of identities:

2 1 2
1 0 1
2 1 2

plus

2 1 2
1 0 1
2 1 2

equals

2 1 2
1 0 1
2 1 2
</pre>


=={{header|Julia}}==
=={{header|Julia}}==