Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
4.1KB

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