flags.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package solver
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "os"
  7. )
  8. func (solver *Solver) parse_flags() {
  9. // Define variables
  10. var row1 string
  11. var row2 string
  12. var row3 string
  13. var row4 string
  14. var row5 string
  15. var row6 string
  16. var row7 string
  17. var row8 string
  18. var row9 string
  19. // Define parameters
  20. flag.StringVar(&row1, "row1", "000000000", "1st row of the sudoku puzzle.")
  21. flag.StringVar(&row2, "row2", "000000000", "2nd row of the sudoku puzzle.")
  22. flag.StringVar(&row3, "row3", "000000000", "4rd row of the sudoku puzzle.")
  23. flag.StringVar(&row4, "row4", "000000000", "4th row of the sudoku puzzle.")
  24. flag.StringVar(&row5, "row5", "000000000", "5th row of the sudoku puzzle.")
  25. flag.StringVar(&row6, "row6", "000000000", "6th row of the sudoku puzzle.")
  26. flag.StringVar(&row7, "row7", "000000000", "7th row of the sudoku puzzle.")
  27. flag.StringVar(&row8, "row8", "000000000", "8th row of the sudoku puzzle.")
  28. flag.StringVar(&row9, "row9", "000000000", "9th row of the sudoku puzzle.")
  29. // Print additional help data
  30. flag.Usage = func() {
  31. fmt.Fprintf(flag.CommandLine.Output(), "Usages of %s:\n", os.Args[0])
  32. fmt.Fprintf(flag.CommandLine.Output(), "\nPut every row of a Sudoku puzzle as paramters.\nUse '0' for what is currently blank in the puzzle you wish to solve.\n\n")
  33. fmt.Fprintf(flag.CommandLine.Output(), "Example: %s -row1 ... -row2 ... -row3 ... (etc)\n\n", os.Args[0])
  34. flag.PrintDefaults()
  35. }
  36. // Parse the flags
  37. flag.Parse()
  38. // Validate the row (never trust user input)
  39. solver.validate_row("row1", row1)
  40. solver.validate_row("row2", row2)
  41. solver.validate_row("row3", row3)
  42. solver.validate_row("row4", row4)
  43. solver.validate_row("row5", row5)
  44. solver.validate_row("row6", row6)
  45. solver.validate_row("row7", row7)
  46. solver.validate_row("row8", row8)
  47. solver.validate_row("row9", row9)
  48. // Put entries in into the struct
  49. solver.row1 = row1
  50. solver.row2 = row2
  51. solver.row3 = row3
  52. solver.row4 = row4
  53. solver.row5 = row5
  54. solver.row6 = row6
  55. solver.row7 = row7
  56. solver.row8 = row8
  57. solver.row9 = row9
  58. }
  59. func (solver *Solver) validate_row(name string, row string) {
  60. var found bool
  61. var double bool
  62. count := make(map[rune]int)
  63. // 1. Make sure the row is 9 in length
  64. if len(row) != 9 {
  65. log.Printf("ERROR: Invalid length of %s; %s must be 9 numbers", name, row)
  66. os.Exit(1)
  67. }
  68. // 2. Ensure all digits are numbers
  69. for _, value := range row {
  70. found = solver.valid_char(value)
  71. }
  72. if !found {
  73. log.Printf("ERROR: Invalid character of %s; %s must be 9 numbers", name, row)
  74. os.Exit(1)
  75. }
  76. // 3. Ensure all digits (except zero) are there only once
  77. for _, digits := range row {
  78. count[digits] = count[digits] + 1
  79. }
  80. for key, value := range count {
  81. if value > 1 && key != 48 {
  82. double = true
  83. }
  84. }
  85. if double {
  86. log.Printf("ERROR: Double character of %s; %s numbers between 1 and 9 may only be entered once", name, row)
  87. os.Exit(1)
  88. }
  89. }
  90. func (solver *Solver) valid_char(char rune) bool {
  91. var valid bool
  92. decvals := [10]int{48, 49, 50, 51, 52, 53, 54, 55, 56, 57}
  93. for _, value := range decvals {
  94. if char == rune(value) {
  95. valid = true
  96. }
  97. }
  98. return valid
  99. }