flags.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package solver
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "os"
  7. "runtime"
  8. )
  9. func (solver *Solver) parse_flags() {
  10. // Define variables
  11. var row1 string
  12. var row2 string
  13. var row3 string
  14. var row4 string
  15. var row5 string
  16. var row6 string
  17. var row7 string
  18. var row8 string
  19. var row9 string
  20. // Define parameters
  21. flag.StringVar(&row1, "row1", "000000000", "1st row of the sudoku puzzle.")
  22. flag.StringVar(&row2, "row2", "000000000", "2nd row of the sudoku puzzle.")
  23. flag.StringVar(&row3, "row3", "000000000", "4rd row of the sudoku puzzle.")
  24. flag.StringVar(&row4, "row4", "000000000", "4th row of the sudoku puzzle.")
  25. flag.StringVar(&row5, "row5", "000000000", "5th row of the sudoku puzzle.")
  26. flag.StringVar(&row6, "row6", "000000000", "6th row of the sudoku puzzle.")
  27. flag.StringVar(&row7, "row7", "000000000", "7th row of the sudoku puzzle.")
  28. flag.StringVar(&row8, "row8", "000000000", "8th row of the sudoku puzzle.")
  29. flag.StringVar(&row9, "row9", "000000000", "9th row of the sudoku puzzle.")
  30. flag.IntVar(&solver.numcpus, "numcpu", runtime.NumCPU(), "Number of CPU cores to assign to this task.")
  31. // Parse the flags
  32. flag.Parse()
  33. if solver.numcpus <= 0 {
  34. log.Printf("ERROR: Number of CPU cores must be 1 or higher.\n\n")
  35. solver.print_Usage()
  36. os.Exit(1)
  37. }
  38. if solver.numcpus != runtime.NumCPU() {
  39. runtime.GOMAXPROCS(solver.numcpus)
  40. }
  41. if row1 == "000000000" || row2 == "000000000" || row3 == "000000000" || row4 == "000000000" || row5 == "000000000" || row6 == "000000000" || row7 == "000000000" || row8 == "000000000" || row9 == "000000000" {
  42. log.Printf("ERROR: All parameters must be entered.\n\n")
  43. solver.print_Usage()
  44. os.Exit(1)
  45. }
  46. // Validate the row (never trust user input)
  47. solver.validate_row("row1", row1)
  48. solver.validate_row("row2", row2)
  49. solver.validate_row("row3", row3)
  50. solver.validate_row("row4", row4)
  51. solver.validate_row("row5", row5)
  52. solver.validate_row("row6", row6)
  53. solver.validate_row("row7", row7)
  54. solver.validate_row("row8", row8)
  55. solver.validate_row("row9", row9)
  56. // Put entries in into the struct
  57. solver.row1 = row1
  58. solver.row2 = row2
  59. solver.row3 = row3
  60. solver.row4 = row4
  61. solver.row5 = row5
  62. solver.row6 = row6
  63. solver.row7 = row7
  64. solver.row8 = row8
  65. solver.row9 = row9
  66. }
  67. func (solver *Solver) validate_row(name string, row string) {
  68. var found bool
  69. var double bool
  70. count := make(map[rune]int)
  71. // 1. Make sure the row is 9 in length
  72. if len(row) != 9 {
  73. log.Printf("ERROR: Invalid length of %s (%s), must be 9 numbers\n\n", name, row)
  74. solver.print_Usage()
  75. os.Exit(1)
  76. }
  77. // 2. Ensure all digits are numbers
  78. for _, value := range row {
  79. found = solver.valid_char(value)
  80. }
  81. if !found {
  82. log.Printf("ERROR: Invalid character of %s (%s), must be 9 numbers\n\n", name, row)
  83. solver.print_Usage()
  84. os.Exit(1)
  85. }
  86. // 3. Ensure all digits (except zero) are there only once
  87. for _, digits := range row {
  88. count[digits] = count[digits] + 1
  89. }
  90. for key, value := range count {
  91. if value > 1 && key != 48 {
  92. double = true
  93. }
  94. }
  95. if double {
  96. log.Printf("ERROR: Double character of %s (%s), numbers between 1 and 9 may only be entered once\n\n", name, row)
  97. solver.print_Usage()
  98. os.Exit(1)
  99. }
  100. }
  101. func (solver *Solver) valid_char(char rune) bool {
  102. var valid bool
  103. decvals := [10]int{48, 49, 50, 51, 52, 53, 54, 55, 56, 57}
  104. for _, value := range decvals {
  105. if char == rune(value) {
  106. valid = true
  107. }
  108. }
  109. return valid
  110. }
  111. func (solver *Solver) print_Usage() {
  112. fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n", os.Args[0])
  113. 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")
  114. fmt.Fprintf(flag.CommandLine.Output(), "Example: %s -row1 ... -row2 ... -row3 ... (etc)\n\n", os.Args[0])
  115. flag.PrintDefaults()
  116. }