1package pdfexport23import (4 "encoding/json"5 "fmt"6 "strings"7)89type takuzuSave struct {10 Size int `json:"size"`11 State string `json:"state"`12 Provided string `json:"provided"`13}1415func ParseTakuzuPrintData(saveData []byte) (*TakuzuData, error) {16 if len(strings.TrimSpace(string(saveData))) == 0 {17 return nil, nil18 }1920 var save takuzuSave21 if err := json.Unmarshal(saveData, &save); err != nil {22 return nil, fmt.Errorf("decode takuzu save: %w", err)23 }2425 stateRows := splitNormalizedLines(save.State)26 providedRows := splitNormalizedLines(save.Provided)2728 size := save.Size29 if size <= 0 {30 size = max(len(stateRows), len(providedRows))31 }32 if size <= 0 {33 return nil, nil34 }3536 givens := make([][]string, size)37 for y := 0; y < size; y++ {38 givens[y] = make([]string, size)3940 var stateRunes []rune41 if y < len(stateRows) {42 stateRunes = []rune(stateRows[y])43 }4445 var providedRunes []rune46 if y < len(providedRows) {47 providedRunes = []rune(providedRows[y])48 }4950 for x := 0; x < size; x++ {51 if x >= len(providedRunes) || providedRunes[x] != '#' {52 continue53 }54 if x >= len(stateRunes) {55 continue56 }57 if stateRunes[x] != '0' && stateRunes[x] != '1' {58 continue59 }60 givens[y][x] = string(stateRunes[x])61 }62 }6364 return &TakuzuData{65 Size: size,66 Givens: givens,67 HorizontalRelations: make([][]string, size),68 VerticalRelations: make([][]string, max(size-1, 0)),69 GroupEveryTwo: true,70 }, nil71}