Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

179 строки
4.5KB

  1. ## 1.
  2. size <- function(mat) {
  3. return(attr(mat, "size"))
  4. }
  5. `size<-` <- function(x, value) {
  6. attributes(x)$size <- value
  7. return(x)
  8. }
  9. ## 2.
  10. sudoku <- function(mat, n=NULL, m=NULL) {
  11. attributes(mat)$class <- "sudoku"
  12. if (!is.matrix(mat)) {
  13. stopifnot("If mat is not a matrix, at n and m have to be specified" = !is.null(n) && !is.null(m))
  14. mat <- matrix(mat, nrow=n*m)
  15. } else if (is.null(n)) {
  16. n <- nrow(mat) / m
  17. } else if (is.null(m)) {
  18. m <- nrow(mat) / n
  19. }
  20. size(mat) <- c(n, m)
  21. return(mat)
  22. }
  23. ## 3.
  24. is_sudoku <- function(s) {
  25. if (is.null(size(s))) {
  26. return(FALSE)
  27. }
  28. n <- size(s)[1]
  29. m <- size(s)[2]
  30. checks <- c(nrow(s) == ncol(s),
  31. nrow(s) == n*m,
  32. attr(s, "class") == "sudoku",
  33. s %in% c(NA, (1:(n*m))))
  34. return(all(checks))
  35. }
  36. ## 4.
  37. is_sub_valid <- function(x) {
  38. dups <- any(duplicated(x))
  39. in_range <- all(x %in% c(NA, (1:length(x))))
  40. return(in_range && !dups)
  41. }
  42. ## 5.
  43. partition_index <- function(n, m) {
  44. m1 <- matrix(rep(1:(n*m), each=n), nrow=n*m)
  45. m2 <- m1[, rep(1:n, each=m)]
  46. return(m2)
  47. }
  48. partition_index(3,2)
  49. ## 6.
  50. is_valid <- function(s) {
  51. stopifnot("s is not a sudoku!" = is_sudoku(s))
  52. n <- size(s)[1]
  53. m <- size(s)[2]
  54. rows_valid <- sapply(1:(n*m), function(r) is_sub_valid(s[r,]))
  55. cols_valid <- sapply(1:(n*m), function(c) is_sub_valid(s[,c]))
  56. part <- partition_index(n, m)
  57. fields_valid <- sapply(1:(n*m), function(i) is_sub_valid(s[part == i]))
  58. return(all(c(fields_valid, cols_valid, fields_valid)))
  59. }
  60. is_filled_in <- function(s) {
  61. return(!any(is.na(s)))
  62. }
  63. is_solved <-function(s) {
  64. return(is_valid(s) && is_filled_in(s))
  65. }
  66. ## 7.
  67. is_solution_of <- function(s, s_star) {
  68. return(is_solved(s_star) && all(s == s_star, na.rm=TRUE))
  69. }
  70. ## 8.
  71. print_non_valid <- function(s, print_missing=T) {
  72. stopifnot("s is not a sudoku!" = is_sudoku(s))
  73. s <- ""
  74. if (print_missing) {
  75. missing_fields <- which(is.na(s), arr.ind=T)
  76. if (nrow(missing_fields) > 0)
  77. sapply(1:nrow(missing_fields), function(r) cat("missing value at ",
  78. missing_fields[r,1],
  79. ",",
  80. missing_fields[r,2],
  81. "\n",
  82. sep=""))
  83. }
  84. n <- size(s)[1]
  85. m <- size(s)[2]
  86. rows_invalid <- which(sapply(1:(n*m), function(r) !is_sub_valid(s[r,])))
  87. sapply(rows_invalid, function(x) cat("row ",
  88. x,
  89. " is invalid\n",
  90. sep=""))
  91. cols_invalid <- which(sapply(1:(n*m), function(c) !is_sub_valid(s[,c])))
  92. sapply(cols_invalid, function(x) cat("column ",
  93. x,
  94. " is invalid\n",
  95. sep=""))
  96. part <- partition_index(n, m)
  97. fields <- matrix(1:(n*m), nrow=m)
  98. fields_invalid <- which(apply(fields, c(1,2), function(i) !is_sub_valid(s[part == i])), arr.ind=T)
  99. if (length(fields_invalid) > 0) {
  100. sapply(1:nrow(fields_invalid), function(r) cat("field ",
  101. fields_invalid[r,1],
  102. ",",
  103. fields_invalid[r,2],
  104. " is invalid\n",
  105. sep=""))
  106. }
  107. return(NULL)
  108. }
  109. ## TEST
  110. x <- matrix(
  111. c(5,2,6,4,3,1,6,1,3,2,5,4,3,4,1,5,2,6,2,6,4,3,1,5,1,3,5,6,4,2,4,5,2,1,6,3),
  112. ncol = 6)
  113. is_sudoku(x)
  114. s <- sudoku(x, 3, 2)
  115. s
  116. size(s)
  117. is_sudoku(s)
  118. is_filled_in(s)
  119. is_valid(s)
  120. is_solved(s)
  121. print_non_valid(s)
  122. size(s) <- c(2, 3)
  123. is_sudoku(s)
  124. is_filled_in(s)
  125. is_valid(s)
  126. is_solved(s)
  127. s_na <- s
  128. s_na[sample(36, 18)] <- NA
  129. s_na
  130. is_sudoku(s_na)
  131. is_filled_in(s_na)
  132. is_valid(s_na)
  133. is_solved(s_na)
  134. print_non_valid(s_na)
  135. s_not <- sudoku(sample(1:6, 36, replace=T), 2, 3)
  136. s_not[sample(36, 18)] <- NA
  137. s_not
  138. is_sudoku(s_not)
  139. is_filled_in(s_not)
  140. is_valid(s_not)
  141. is_solved(s_not)
  142. print_non_valid(s_not, print_missing=FALSE)