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  }