github.com/joshprzybyszewski/masyu@v0.0.0-20230508015604-f31a025f6e7e/model/solution.go (about) 1 package model 2 3 import "strings" 4 5 type Solution struct { 6 Size Size 7 8 Horizontals [MaxPinsPerLine]DimensionBit 9 Verticals [MaxPinsPerLine]DimensionBit 10 } 11 12 func (s *Solution) String() string { 13 var sb strings.Builder 14 15 for r := Dimension(0); r < Dimension(s.Size); r++ { 16 for c := Dimension(0); c < Dimension(s.Size); c++ { 17 sb.WriteByte('*') 18 sb.WriteByte(' ') 19 if s.Horizontals[r]&c.Bit() != 0 { 20 sb.WriteByte('-') 21 } else { 22 sb.WriteByte(' ') 23 } 24 sb.WriteByte(' ') 25 } 26 sb.WriteByte('\n') 27 28 for c := Dimension(0); c < Dimension(s.Size); c++ { 29 if s.Verticals[c]&r.Bit() != 0 { 30 sb.WriteByte('|') 31 } else { 32 sb.WriteByte(' ') 33 } 34 sb.WriteByte(' ') 35 sb.WriteByte(' ') 36 sb.WriteByte(' ') 37 } 38 sb.WriteByte('\n') 39 } 40 41 return sb.String() 42 } 43 44 func (s *Solution) Pretty( 45 nodes []Node, 46 ) string { 47 var sb strings.Builder 48 49 for r := Dimension(0); r < Dimension(s.Size); r++ { 50 for c := Dimension(0); c < Dimension(s.Size); c++ { 51 sb.WriteByte(getNodeChar(nodes, r, c)) 52 sb.WriteByte(' ') 53 if s.Horizontals[r]&c.Bit() != 0 { 54 sb.WriteByte('-') 55 } else { 56 sb.WriteByte(' ') 57 } 58 sb.WriteByte(' ') 59 } 60 sb.WriteByte('\n') 61 62 for c := Dimension(0); c < Dimension(s.Size); c++ { 63 if s.Verticals[c]&r.Bit() != 0 { 64 sb.WriteByte('|') 65 } else { 66 sb.WriteByte(' ') 67 } 68 sb.WriteByte(' ') 69 sb.WriteByte(' ') 70 sb.WriteByte(' ') 71 } 72 sb.WriteByte('\n') 73 } 74 75 return sb.String() 76 } 77 78 func getNodeChar( 79 nodes []Node, 80 r, c Dimension, 81 ) byte { 82 for _, n := range nodes { 83 if n.Row != r || n.Col != c { 84 continue 85 } 86 if n.IsBlack { 87 return 'B' 88 } 89 return 'W' 90 } 91 return '*' 92 } 93 94 func (s *Solution) ToAnswer() string { 95 if s == nil || s.Size == 0 { 96 return `` 97 } 98 99 numEdges := int(s.Size) - 1 100 var rows, cols strings.Builder 101 rows.Grow(numEdges * (numEdges - 1)) 102 cols.Grow(numEdges * (numEdges - 1)) 103 104 for row := Dimension(0); row <= Dimension(numEdges); row++ { 105 for col := Dimension(0); col < Dimension(numEdges); col++ { 106 if s.Horizontals[row]&col.Bit() != 0 { 107 _ = rows.WriteByte('y') 108 } else { 109 _ = rows.WriteByte('n') 110 } 111 } 112 } 113 114 for row := Dimension(0); row < Dimension(numEdges); row++ { 115 for col := Dimension(0); col <= Dimension(numEdges); col++ { 116 if s.Verticals[col]&row.Bit() != 0 { 117 _ = cols.WriteByte('y') 118 } else { 119 _ = cols.WriteByte('n') 120 } 121 } 122 } 123 124 return rows.String() + cols.String() 125 }