99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
package board
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"strconv"
|
|
)
|
|
|
|
type Parser interface {
|
|
Parse(data []byte) error
|
|
GetField(i int) *Field
|
|
GetAllFields() []Field
|
|
}
|
|
|
|
type parserHelper struct {
|
|
fields []Field
|
|
}
|
|
|
|
func (ph *parserHelper) GetField(i int) *Field {
|
|
if i < 0 || i >= len(ph.fields) {
|
|
return &Field{}
|
|
}
|
|
return &ph.fields[i]
|
|
}
|
|
|
|
func (ph *parserHelper) GetAllFields() []Field {
|
|
if len(ph.fields) == 0 {
|
|
return nil
|
|
}
|
|
return ph.fields
|
|
}
|
|
|
|
// https://github.com/grantm/sudoku-exchange-puzzle-bank/tree/master
|
|
type PuzzleBank struct {
|
|
parserHelper
|
|
}
|
|
|
|
func (pb *PuzzleBank) Parse(data []byte) error {
|
|
|
|
lines := bytes.Split(data, []byte("\n"))
|
|
for _, line := range lines {
|
|
if len(line) == 0 { // Überspringe leere Zeile
|
|
continue
|
|
}
|
|
|
|
if len(line) != 99 {
|
|
return fmt.Errorf("Zeile hat die falsche länge. soll: 100, ist: %d", len(line))
|
|
}
|
|
|
|
//siehe Readme in github repo
|
|
sha1Hash := bytes.TrimSpace(line[0:12])
|
|
sudokuStr := string(line[13:94])
|
|
ratingStr := string(line[96:99])
|
|
//fmt.Println(sudokuStr)
|
|
|
|
var rating float64
|
|
_, err := fmt.Sscanf(ratingStr, "%f", &rating)
|
|
if err != nil {
|
|
return errors.New("can nor parse raiting")
|
|
}
|
|
|
|
field := Field{
|
|
rows: 9,
|
|
columns: 9,
|
|
blockRows: 3,
|
|
blockColumns: 3,
|
|
blockSizeRow: 3,
|
|
blockSizeColumn: 3,
|
|
rating: rating,
|
|
sha1: sha1Hash,
|
|
}
|
|
|
|
field.cells = make([][]Cell, field.rows)
|
|
for i := range field.cells {
|
|
field.cells[i] = make([]Cell, field.columns)
|
|
for j := range field.cells[i] {
|
|
number, err := strconv.Atoi(string(sudokuStr[i*9+j]))
|
|
if err != nil {
|
|
return fmt.Errorf("Kann Zeichen nicht in Zahl konvertieren")
|
|
}
|
|
field.cells[i][j].number = number
|
|
field.cells[i][j].Notes = &Notes{}
|
|
field.cells[i][j].Pos = &Position{
|
|
row: i,
|
|
column: j,
|
|
blockRow: i / field.blockRows,
|
|
blockColumn: j / field.blockColumns,
|
|
inBlockRow: i % field.blockSizeRow,
|
|
inBlockColumn: j % field.blockSizeColumn,
|
|
}
|
|
}
|
|
}
|
|
//fmt.Println(field.String())
|
|
pb.fields = append(pb.fields, field)
|
|
}
|
|
return nil
|
|
}
|