horvathm

Untitled

Dec 17th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.46 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bufio"
  5.     "fmt"
  6.     "os"
  7. )
  8.  
  9. type Fxyzw = map[int]map[int]map[int]map[int]bool
  10. type Fyzw = map[int]map[int]map[int]bool
  11. type Fzw = map[int]map[int]bool
  12. type Fw = map[int]bool
  13.  
  14. func input(name string) Fxyzw {
  15.     fd, err := os.Open(name)
  16.     if err != nil {
  17.         panic(err)
  18.     }
  19.     s := bufio.NewScanner(fd)
  20.  
  21.     d := make(Fxyzw)
  22.  
  23.     y := 0
  24.     for s.Scan() {
  25.         for z, c := range s.Text() {
  26.             v := false
  27.             if (c == '#') {
  28.                 v = true
  29.             }
  30.             set(d, 0, 0, y, z, v)
  31.         }
  32.         y++
  33.     }
  34.  
  35.     return d
  36. }
  37.  
  38. func get(d Fxyzw, x, y, z, w int) bool {
  39.     return d[x] != nil && d[x][y] != nil && d[x][y][z] != nil && d[x][y][z][w]
  40. }
  41.  
  42. func set(d Fxyzw, x, y, z, w int, v bool) {
  43.     if d[x] == nil {
  44.         d[x] = make(Fyzw)
  45.     }
  46.     if d[x][y] == nil {
  47.         d[x][y] = make(Fzw)
  48.     }
  49.     if d[x][y][z] == nil {
  50.         d[x][y][z] = make(Fw)
  51.     }
  52.     d[x][y][z][w] = v
  53. }
  54.  
  55. func neig(d Fxyzw, x, y, z, w int) int {
  56.     o := 0
  57.     for _, dx := range []int{-1, 0, 1} {
  58.         for _, dy := range []int{-1, 0, 1} {
  59.             for _, dz := range []int{-1, 0, 1} {
  60.                 for _, dw := range []int{-1, 0, 1} {
  61.                     if (dx != 0 || dy != 0 || dz != 0 || dw != 0) && get(d, x + dx, y + dy, z + dz, w + dw) {
  62.                         o++
  63.                     }
  64.                 }
  65.             }
  66.         }
  67.     }
  68.     return o
  69. }
  70.  
  71. func copy_field(d Fxyzw) Fxyzw {
  72.     o := make(Fxyzw)
  73.     for x := range d {
  74.         o[x] = make(Fyzw)
  75.         for y := range d[x] {
  76.             o[x][y] = make(Fzw)
  77.             for z := range d[x][y] {
  78.                 o[x][y][z] = make(Fw)
  79.                 for w := range d[x][y][z] {
  80.                     o[x][y][z][w] = d[x][y][z][w]
  81.                 }
  82.             }
  83.         }
  84.     }
  85.     return o
  86. }
  87.  
  88. // func range_x(d Fxyz) (xmin, xmax int) {
  89. //  for x := range d {
  90. //      if x < xmin {
  91. //          xmin = x
  92. //      }
  93. //      if x > xmax {
  94. //          xmax = x
  95. //      }
  96. //  }
  97. //  return
  98. // }
  99.  
  100. // func range_y(d Fyz) (ymin, ymax int) {
  101. //  for y := range d {
  102. //      if y < ymin {
  103. //          ymin = y
  104. //      }
  105. //      if y > ymax {
  106. //          ymax = y
  107. //      }
  108. //  }
  109. //  return
  110. // }
  111.  
  112. // func range_z(d Fz) (zmin, zmax int) {
  113. //  for z := range d {
  114. //      if z < zmin {
  115. //          zmin = z
  116. //      }
  117. //      if z > zmax {
  118. //          zmax = z
  119. //      }
  120. //  }
  121. //  return
  122. // }
  123.  
  124. func range_field(d Fxyzw) (xmin, xmax, ymin, ymax, zmin, zmax, wmin, wmax int) {
  125.     for x := range d {
  126.         if x < xmin {
  127.             xmin = x
  128.         }
  129.         if x > xmax {
  130.             xmax = x
  131.         }
  132.  
  133.         for y := range d[x] {
  134.             if y < ymin {
  135.                 ymin = y
  136.             }
  137.             if y > ymax {
  138.                 ymax = y
  139.             }
  140.  
  141.             for z := range d[x][y] {
  142.                 if z < zmin {
  143.                     zmin = z
  144.                 }
  145.                 if z > zmax {
  146.                     zmax = z
  147.                 }
  148.  
  149.                 for w := range d[x][y][z] {
  150.                     if w < wmin {
  151.                         wmin = w
  152.                     }
  153.                     if w > wmax {
  154.                         wmax = w
  155.                     }
  156.                 }
  157.             }
  158.         }
  159.     }
  160.     return
  161. }
  162.  
  163. func print_field (d Fxyzw) {
  164.     xmin, xmax, ymin, ymax, zmin, zmax, wmin, wmax := range_field(d)
  165.  
  166.     fmt.Println("-----")
  167.     for x := xmin; x <= xmax; x++ {
  168.         for y := ymin; y <= ymax; y++ {
  169.             fmt.Printf("x=%d\n", x)
  170.             for z := zmin; z <= zmax; z++ {
  171.                 for w := wmin; w <= wmax; w++ {
  172.                     c := '.'
  173.                     if (get(d, x, y, z, w)) {
  174.                         c = '#'
  175.                     }
  176.                     fmt.Printf("%c ", c)
  177.                 }
  178.                 fmt.Println()
  179.             }
  180.             fmt.Println()
  181.         }
  182.     }
  183. }
  184.  
  185. func count_field(d Fxyzw) int {
  186.     o := 0
  187.     for x := range d {
  188.         for y := range d[x] {
  189.             for z := range d[x][y] {
  190.                 for w := range d[x][y][z] {
  191.                     if (get(d, x, y, z, w)) {
  192.                         o++
  193.                     }
  194.                 }
  195.             }
  196.         }
  197.     }
  198.     return o
  199. }
  200.  
  201. func simplify_field(d Fxyzw) {
  202.     for x := range d {
  203.         ya := 0
  204.         for y := range d[x] {
  205.             za := 0
  206.             for z := range d[x][y] {
  207.                 wa := 0
  208.                 for w := range d[x][y][z] {
  209.                     if (get(d, x, y, z, w)) {
  210.                         wa++
  211.                     }
  212.                 }
  213.                 if wa == 0 {
  214.                     delete(d[x][y], z)
  215.                 } else {
  216.                     za++
  217.                 }
  218.             }
  219.             if za == 0 {
  220.                 delete(d[x], y)
  221.             } else {
  222.                 ya++
  223.             }
  224.         }
  225.         if ya == 0 {
  226.             delete(d, x)
  227.         }
  228.     }
  229. }
  230.  
  231. func main() {
  232.     //d := input("../samplea")
  233.     d := input("../input")
  234.  
  235.     //print_field(d)
  236.  
  237.     for i := 0; i < 6; i++ {
  238.         old := copy_field(d)
  239.         xmin, xmax, ymin, ymax, zmin, zmax, wmin, wmax := range_field(d)
  240.  
  241.         for x := xmin - 1; x <= xmax + 1; x++ {
  242.             for y := ymin - 1; y <= ymax + 1; y++ {
  243.                 for z := zmin - 1; z <= zmax + 1; z++ {
  244.                     for w := wmin - 1; w <= wmax + 1; w++ {
  245.                         n := neig(old, x, y, z, w)
  246.        
  247.                         if (get(old, x, y, z, w) && (n < 2 || n > 3)) {
  248.                             set(d, x, y, z, w, false)
  249.                         } else if (!get(old, x, y, z, w) && n == 3) {
  250.                             set(d, x, y, z, w, true)
  251.                         }
  252.                     }
  253.                 }
  254.             }
  255.         }
  256.         simplify_field(d)
  257.  
  258.         // fmt.Printf("\n==========\ni = %d\n\n", i)
  259.         // print_field(d)
  260.         //fmt.Println(count_field(d))
  261.     }
  262.  
  263.     fmt.Println(count_field(d))
  264. }
  265.  
Advertisement
Add Comment
Please, Sign In to add comment