# Fungsi Sequential Boolean
seq_boolean <- function(data, target) {
  if (any(is.na(data))) {
    stop("Data tidak boleh mengandung NA!")
  }

  ketemu <- FALSE
  posisi <- NA

  for (i in seq_along(data)) {
    if (data[i] == target) {
      ketemu <- TRUE
      posisi <- i
      break
    }
  }

  return(posisi)
}


# Fungsi Sequential Tanpa Boolean
seq_tanpa_boolean <- function(data, target) {
  if (any(is.na(data))) {
    stop("Data tidak boleh mengandung NA!")
  }

  for (i in seq_along(data)) {
    if (data[i] == target) {
      return(i)
    }
  }

  return(NA)
}


# Fungsi Sequential Terurut
seq_terurut <- function(data, target) {
  if (any(is.na(data))) {
    stop("Data tidak boleh mengandung NA!")
  }

  if (is.unsorted(data)) {
    stop("Data harus terurut!")
  }

  for (i in seq_along(data)) {
    if (data[i] == target) {
      return(i)
    } else if (data[i] > target) {
      break
    }
  }

  return(NA)
}


# Fungsi Sequential dengan Sentinel
seq_sentinel <- function(data, target) {
  if (any(is.na(data))) {
    stop("Data tidak boleh mengandung NA!")
  }

  data_baru <- c(data, target)
  posisi <- 1

  while (data_baru[posisi] != target) {
    posisi <- posisi + 1
  }

  if (posisi > length(data)) {
    return(NA)
  }

  return(posisi)
}
# 11A Sequential Boolean

lat_x <- c(12, 7, 19, 7, 25)

hasil_11A <- seq_boolean(lat_x, 7)

print(hasil_11A)
## [1] 2
cat("Target 7 ditemukan pada posisi", hasil_11A, "\n")
## Target 7 ditemukan pada posisi 2
cat("Status ketemu berubah menjadi TRUE setelah elemen kedua diperiksa.\n")
## Status ketemu berubah menjadi TRUE setelah elemen kedua diperiksa.
# 11B Sequential Tanpa Boolean

hasil_11B_data <- seq_tanpa_boolean(lat_x, 8)
hasil_11B_kosong <- seq_tanpa_boolean(numeric(), 8)

cat("Hasil pada data Latihan 11A:\n")
## Hasil pada data Latihan 11A:
print(hasil_11B_data)
## [1] NA
cat("Hasil pada larik kosong:\n")
## Hasil pada larik kosong:
print(hasil_11B_kosong)
## [1] NA
# 11C Sequential Terurut

data_11C <- c(5, 10, 15, 20, 25)

hasil_11C <- seq_terurut(data_11C, 12)

print(hasil_11C)
## [1] NA
cat("Pencarian berhenti ketika membaca nilai 15 karena 15 lebih besar dari target 12.\n")
## Pencarian berhenti ketika membaca nilai 15 karena 15 lebih besar dari target 12.
# 11D Sequential Sentinel

lat_awal <- lat_x

hasil_11D <- seq_sentinel(lat_x, 99)

data_tetap <- identical(lat_x, lat_awal)

cat("Hasil pencarian:\n")
## Hasil pencarian:
print(hasil_11D)
## [1] NA
cat("Apakah data awal tidak berubah?\n")
## Apakah data awal tidak berubah?
print(data_tetap)
## [1] TRUE
cat("Sentinel ditambahkan pada posisi", length(lat_x) + 1, "\n")
## Sentinel ditambahkan pada posisi 6
# 11E Match dan Which

hasil_match <- match(7, lat_x)
hasil_which <- which(lat_x == 7)

cat("Posisi pertama dengan match():\n")
## Posisi pertama dengan match():
print(hasil_match)
## [1] 2
cat("Seluruh posisi dengan which():\n")
## Seluruh posisi dengan which():
print(hasil_which)
## [1] 2 4
# 11F Penanganan NA

hasil_11F <- tryCatch(
  seq_boolean(c(12, NA, 19), 19),
  error = function(e) conditionMessage(e)
)

print(hasil_11F)
## [1] "Data tidak boleh mengandung NA!"